Week 14 Networking and communication¶
For this week we had a individual assignment and a group assignment.
Group assignment¶
For the group assignment we had to send a message between two projects. For more information about this assignment click here
Individual assignment¶
For the individual assignment we had to design, build, and connect wired or wireless node(s) with network or bus addresses. For this week I used this bridge board and this node.
The components I used for the Node and the Bridge are:
Bridge | Node |
---|---|
AVRISP | AVRISP |
Resistor 1K | Resistor 1K |
Resistor 10K | Resistor 10K |
Attiny 45 | Attiny 45 |
Capacitators 1UF | Capacitators 1UF |
Connector pin 2⤫2 | Connector pin 2⤫2 |
FTDI pinheader | LED |
Just like week 11 and week 12. I used the same design method and making the nc.files in Flatcam.
Node¶
Bridge¶
Milling¶
I milled the boards using the Stepcraft. Using WinPC-NC I set the coordinates for the machine. I then soldered the components unto the boards. For one of the traces for the node, I used a jumper cable because I couldn’t connect the trace in KiCad.
My node was not working so I had to remill it.
Programming¶
Before starting I changed the board to ATtiny 45, the processor to ATtiny 45 & Clock to internal to 8 MHz (via Tools). I then burned the bootloader for the node and the bridge. I loaded this code from Neil :
#define serial_pin_out (1 << PB4) #define node_id '0' void get_char(volatile unsigned char *pins, unsigned char pin, char *rxbyte) { // // read character into rxbyte on pins pin // assumes line driver (inverts bits) // *rxbyte = 0; while (pin_test(*pins,pin)) // // wait for start bit // ; // // delay to middle of first data bit // half_bit_delay(); bit_delay(); // // unrolled loop to read data bits // if pin_test(*pins,pin) *rxbyte |= (1 << 0); else *rxbyte |= (0 << 0); bit_delay(); if pin_test(*pins,pin) *rxbyte |= (1 << 1); else *rxbyte |= (0 << 1); bit_delay(); if pin_test(*pins,pin) *rxbyte |= (1 << 2); else *rxbyte |= (0 << 2); bit_delay(); if pin_test(*pins,pin) *rxbyte |= (1 << 3); else *rxbyte |= (0 << 3); bit_delay(); if pin_test(*pins,pin) *rxbyte |= (1 << 4); else *rxbyte |= (0 << 4); bit_delay(); if pin_test(*pins,pin) *rxbyte |= (1 << 5); else *rxbyte |= (0 << 5); bit_delay(); if pin_test(*pins,pin) *rxbyte |= (1 << 6); else *rxbyte |= (0 << 6); bit_delay(); if pin_test(*pins,pin) *rxbyte |= (1 << 7); else *rxbyte |= (0 << 7); // // wait for stop bit // bit_delay(); half_bit_delay(); } 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(); } void put_string(volatile unsigned char *port, unsigned char pin, PGM_P str) { // // send character in txchar on port pin // assumes line driver (inverts bits) // static char chr; static int index; index = 0; do { chr = pgm_read_byte(&(str[index])); put_char(&serial_port, serial_pin_out, chr); ++index; } while (chr != 0); } void flash() { // // LED flash delay // clear(led_port, led_pin); led_delay(); set(led_port, led_pin); } 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); input(serial_direction, serial_pin_out); set(led_port, led_pin); output(led_direction, led_pin); // // main loop // while (1) { get_char(&serial_pins, serial_pin_in, &chr); flash(); if (chr == node_id) { output(serial_direction, serial_pin_out); static const char message[] PROGMEM = "node "; put_string(&serial_port, serial_pin_out, (PGM_P) message); put_char(&serial_port, serial_pin_out, chr); put_char(&serial_port, serial_pin_out, 10); // new line led_delay(); flash(); input(serial_direction, serial_pin_out); } } }
For the bridge the piece of code stayed #define node_id ‘0’.
For the node this changed to #define node_id ‘1’.
Open the arduino IDE and go to serial monitor. Press 0 and enter and 1 and enter
Probems¶
- So I had to resolder the bridge because of a few errors. These errors made it impossible to burn the bootloader. But in the end it worked.
- I also had to redo the node board because of faulty connections