Home About Me Assignments Final Project

Week 12: Input Devices

Group project:
Measure the analog levels and digital signals in an input device

Individual project:
Measure something: add a sensor to a microcontroller board that you have designed and read it.


Made up four boards with eagle. ATtiny45 and ATtiny44 boards with extra pin connectors, and two sensor boards, temperature and light. Idea was to make it a little bit modular, so I can use the boards in upcoming weeks.

Rebuilding Neil's ATtiny45 board without any sensors, but with an extra pin header.

ATtiny45 schematics.

Building the ATtiny44 board was basicly just ripping off button and led from week 7 hello-board and adding pin collections.

ATtiny44 schematics.

Designing sensor boards were quite easy.

Sensor schematics.

After a brief eternity, all boards were routed. Manually.

All boards.

Export images from eagle, mill the boards with Roland-SRM 20, solder in the components, and check shorts with multimeter. Here are the the results;

All boards.

Setting up the terminal

To actually see what is measured, I needed to set up terminal. First I tried with node.js, but after 3 hours of installing, I decided to try python instead. As it seems, it was much less of a hassle.

So, I downloaded and installed Python 2.7.14. Changed one default setting to add PATH to python:

Python setup.

Next I downloaded and installed pySerial. Unzipped the downloaded file, twice(zip within a zip), located setup.py and run following from cmd;

python setup.py install

I Still needed one more thing, as Neil's python code cried about missing numpy module. Made search from fabacademy site and this guy had found the solution.

Downloaded the NumPy package from here. Then took a look at my python/scripts folder and oh, I had pip installed, probably due to previous steps. Proceeded with the install with following command and package;

pip2.7 install numpy-1.13.3+mkl-cp27-cp27m-win32.whl

Now trying out Neil's hello.temp.45.py with following:(com3 is my FTDI-USB cable)

hello.temp.45.py com3

Gives nice visual representation of the sensor input.

Python working

The Code

I used Atmel Studio for the coding. For making Neil's hello.temp.45.c to work, I only needed to add F_CPU clock definition of 8Mhz and to change avrdude -t44 to -t45. Same goes with Light sensor code. For Attiny44, it was a bit more complex process.

Checking the serial communication, what port, pins and what direction.

#define serial_port PORTA
#define serial_direction DDRA
#define serial_pins PINA
#define serial_pin_in (1 << PA0)
#define serial_pin_out (1 << PA1)

Temperature sensor for ATtiny44

I was handling analog signal, so I needed analog input. Taking a look at ATtiny44A datasheet, at page 3 it says "Port A has alternate functions as analog inputs for the ADC" and port A consisting of pins PA7 to PA0. Checking my design(good to do at this point) I saw that I had PA2 and PA3 were going to a pin header for the sensor input. Only thing to do now, was to make the code to match.

As I was using Neil's hello.temp.45.c as a template, needed to check and change the A/D. To understand what was going on, I needed to check Attiny45 datasheet.

ADMUX was a bit different, as for starters ATtiny44 only has two bits for voltage reference. Leaving the third one out, and setting both REF bits to zero now has VCC used as analog reference. This can be seen from datasheet table 16-3.

VCC reference bits

ATtiny44 has six analog channel and gain selection bits, instead of ATtiny45's four, so needed to change that. Checking out code for ATtiny45 from datasheet table 17-4, it had 0111 bits for MUX with pins PB3 andPB4, and with 20x gain.

45 differentials

To match that with ATtiny44, I needed to check datasheet table 16-5 for my pins PA3 and PA2 and then the 20x gain. Resulting the use of 110001 bits for MUX.

44 differentials

So the code for ADMUX is following:

ADMUX = (0 << REFS1) | (0 << REFS0)
| (1 << MUX5) | (1 << MUX4) | (0 << MUX3) | (0 << MUX2) | (0 << MUX1) | (1 << MUX0);

When everything was set, click build and send the code with avrdude. Last thing to do was to take pictures of working sensors.

44 temp sensor.

Light sensor for ATtiny44

Mainly the code is the same, but need to change MUX again. So took a look at ATtiny44 datasheet and table 16-4. Single-Ended Input channel Selections.

Single ended inputs

Plenty of choises, but picked up PA3, with 000011 bits MUX, resulting following code:

ADMUX = (0 << REFS1) | (0 << REFS0)
| (0 << MUX5) | (0 << MUX4) | (0 << MUX3) | (0 << MUX2) | (1 << MUX1) | (1 << MUX0);

Also got rid of bipolarity, it was not needed on this:

ADCSRB = (1 << BIN); // bipolar mode

44 Light sensor.

Group project

Group efforts can be found here.


Eagle schematics Eagle board
Trace image 44_trace.rml
Outline image 44_outline.rml
Code for temperature sensor: 44_temp.c
Code for light sensor: 44_light.c

Eagle schematics Eagle board
Trace image 45_trace.rml
Outline image 45_outline.rml
Code for temperature sensor: 45_temp.c
Code for light sensor: 45_light.c

Light sensor
Eagle schematics Eagle board
Trace image Light_trace.rml
Outline image Light_outline.rml

Temperature sensor
Eagle schematics Eagle board
Trace image Temp_trace.rml
Outline image Temp_outline.rml