A C A D E M Y 2016
ASSIGNMENT

 

GENERAL OBJETIVE:

11

 

Input Devices

 

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

 

    For the assignment of this week will be held hello.RGB.45 card as proof of an output device. For this file (PNG)

Downloaded from here

 

Once downloaded using FabModules the PCB was machined on a copper plate

 

Once you finished machining the following result is achieved:

 

Assignment11_1
Assignment11_2

 

After some sanding to remove burrs from the plate and facilitate the welding process is obtained:

Assignment13_2

 

Once the plate is free from burrs, it is easier to solder the components and once all have been welded components results in:

Assignment11_3b

 

Once you have the plate welded components and connectors list programming can be done, for this we will use the following code in C language

 

//

//

// hello.temp.45.c

//

// thermistor hello-world

//    9600 baud FTDI interface

//

// Neil Gershenfeld

// 10/27/10

//

// (c) Massachusetts Institute of Technology 2010

// This work may be reproduced, modified, distributed,

// performed, and displayed for any purpose. Copyright is

// retained and must be preserved. The work is provided

// as is; no warranty is provided, and users accept all

// liability.

//

 

#include <avr/io.h>

#include <util/delay.h>

 

#define output(directions,pin) (directions |= pin) // set port direction for output

#define set(port,pin) (port |= pin) // set port pin

#define clear(port,pin) (port &= (~pin)) // clear port pin

#define pin_test(pins,pin) (pins & pin) // test for port pin

#define bit_test(byte,bit) (byte & (1 << bit)) // test for bit set

#define bit_delay_time 102 // bit delay for 9600 with overhead

#define bit_delay() _delay_us(bit_delay_time) // RS232 bit delay

#define half_bit_delay() _delay_us(bit_delay_time/2) // RS232 half bit delay

#define char_delay() _delay_ms(10) // char delay

 

#define serial_port PORTB

#define serial_direction DDRB

#define serial_pin_out (1 << PB2)

 

void put_char(volatile unsigned char *port, unsigned char pin, char txchar) {

 //

 // send character in txchar on port pin

 //    assumes line driver (inverts bits)

 //

 // start bit

 //

 clear(*port,pin);

 bit_delay();

 //

 // unrolled loop to write data bits

 //

 if bit_test(txchar,0)

 set(*port,pin);

 else

 clear(*port,pin);

 bit_delay();

 if bit_test(txchar,1)

 set(*port,pin);

 else

 clear(*port,pin);

 bit_delay();

 if bit_test(txchar,2)

 set(*port,pin);

 else

 clear(*port,pin);

 bit_delay();

 if bit_test(txchar,3)

 set(*port,pin);

 else

 clear(*port,pin);

 bit_delay();

 if bit_test(txchar,4)

 set(*port,pin);

 else

 clear(*port,pin);

 bit_delay();

 if bit_test(txchar,5)

 set(*port,pin);

 else

 clear(*port,pin);

 bit_delay();

 if bit_test(txchar,6)

 set(*port,pin);

 else

 clear(*port,pin);

 bit_delay();

 if bit_test(txchar,7)

 set(*port,pin);

 else

 clear(*port,pin);

 bit_delay();

 //

 // stop bit

 //

 set(*port,pin);

 bit_delay();

 //

 // char delay

 //

 bit_delay();

}

 

int main(void) {

 //

 // main

 //

 static char chr;

 //

 // set clock divider to /1

 //

 CLKPR = (1 << CLKPCE);

 CLKPR = (0 << CLKPS3) | (0 << CLKPS2) | (0 << CLKPS1) | (0 << CLKPS0);

 //

 // initialize output pins

 //

 set(serial_port, serial_pin_out);

 output(serial_direction, serial_pin_out);

 //

 // init A/D

 //

 ADMUX = (0 << REFS2) | (0 << REFS1) | (0 << REFS0) // VCC ref

 | (0 << ADLAR) // right adjust

 | (0 << MUX3) | (1 << MUX2) | (1 << MUX1) | (1 << MUX0); // 20(PB4-PB3)

 ADCSRA = (1 << ADEN) // enable

 | (1 << ADPS2) | (1 << ADPS1) | (1 << ADPS0); // prescaler /128

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

 //

 // main loop

 //

 while (1) {

  //

  // send framing

  //

  put_char(&serial_port, serial_pin_out, 1);

  char_delay();

  put_char(&serial_port, serial_pin_out, 2);

  char_delay();

  put_char(&serial_port, serial_pin_out, 3);

  char_delay();

  put_char(&serial_port, serial_pin_out, 4);

  char_delay();

  //

  // initiate conversion

  //

  ADCSRA |= (1 << ADSC);

  //

  // wait for completion

  //

  while (ADCSRA & (1 << ADSC))

  ;

  //

  // send result

  //

  chr = ADCL;

  put_char(&serial_port, serial_pin_out, chr);

  char_delay();

  chr = ADCH;

  put_char(&serial_port, serial_pin_out, chr);

  char_delay();

 }

}

 

And Python code:

 

#

# hello.temp.45.py

#

# receive and display temperature

# hello.temp.45.py serial_port

#

# Neil Gershenfeld

# CBA MIT 3/27/12

#

# (c) Massachusetts Institute of Technology 2012

# Permission granted for experimental and personal use;

# license for commercial sale available from MIT

#

 

from Tkinter import *

from numpy import log

import serial

 

WINDOW = 600 # window size

eps = 0.5 # filter time constant

filter = 0.0 # filtered value

 

def idle(parent,canvas):

   global filter, eps

   #

   # idle routine

   #

   byte2 = 0

   byte3 = 0

   byte4 = 0

   ser.flush()

   while 1:

      #

      # find framing

      #

      byte1 = byte2

      byte2 = byte3

      byte3 = byte4

      byte4 = ord(ser.read())

      if ((byte1 == 1) & (byte2 == 2) & (byte3 == 3) & (byte4 == 4)):

         break

   low = ord(ser.read())

   high = ord(ser.read())

   value = 256*high + low

   if (value > 511):

      value -= 1024

   V = 2.5 - value*5.0/(20.0*512.0)

   R = 10000.0/(5.0/V-1.0)

   # NHQ103B375R5

   # R25 10000 (O)

   # B (25/85) 3750 (K)

   # R(T(C)) = R(25)*exp(B*(1/(T(C)+273.15)-(1/(25+273.15))))

   B = 3750.0

   R25 =  10000.0

   T = 1.0/(log(R/R25)/B+(1/(25.0+273.15))) - 273.15

   filter = (1-eps)*filter + eps*T

   x = int(.2*WINDOW + (.9-.2)*WINDOW*(filter-20.0)/10.0)

   canvas.itemconfigure("text",text="%.2f"%filter)

   canvas.coords('rect1',.2*WINDOW,.05*WINDOW,x,.2*WINDOW)

   canvas.coords('rect2',x,.05*WINDOW,.9*WINDOW,.2*WINDOW)

   canvas.update()

   parent.after_idle(idle,parent,canvas)

 

#

#  check command line arguments

#

if (len(sys.argv) != 2):

   print "command line: hello.temp.45.py serial_port"

   sys.exit()

port = sys.argv[1]

#

# open serial port

#

ser = serial.Serial(port,9600)

ser.setDTR()

#

# start plotting

#

root = Tk()

root.title('hello.temp.45.py (q to exit)')

root.bind('q','exit')

canvas = Canvas(root, width=WINDOW, height=.25*WINDOW, background='white')

canvas.create_text(.1*WINDOW,.125*WINDOW,text=".33",font=("Helvetica", 24),tags="text",fill="#0000b0")

canvas.create_rectangle(.2*WINDOW,.05*WINDOW,.3*WINDOW,.2*WINDOW, tags='rect1', fill='#b00000')

canvas.create_rectangle(.3*WINDOW,.05*WINDOW,.9*WINDOW,.2*WINDOW, tags='rect2', fill='#0000b0')

canvas.pack()

root.after(100,idle,root,canvas)

root.mainloop()

 

 

Download Files

 

Python

C-Code

Project AVR Studio

 

Assignment11_5