I2C Bridge and Node with Arduino sketch¶
- class page Networking and Communications
-
hello.I2C.45.bridge board
-
hello.I2C.45.node board
Install ATTinyCore¶
ref.Arduino IDE に ATtiny45/85/2313 他の開発環境を組み込む
Arduino IDE > preference > board manager URL > http://drazzy.com/package_drazzy.com_index.json
Tool > Board > Board Maganer > Serch: attiny > Select:ATTInyCore by Spence Konde > Install
Tool > Board:> ATtiny Universal > ATiny24/44/84
Note
ATTinyCore can use
TEST 1: SoftwareSerialExample¶
Arduino > File > Sketch Example > ATTiny25/45/85 Sketch Example > SoftwareSerial > SoftwareSerialExample This sketch can be used in Arduino Uno and Attiny45 I2C Bridge board.
#include <SoftwareSerial.h> SoftwareSerial mySerial(3, 4); // RX, TX void setup() { // Open serial communications and wait for port to open: Serial.begin(57600); while (!Serial) { ; // wait for serial port to connect. Needed for Leonardo only } Serial.println("Goodnight moon!"); // set the data rate for the SoftwareSerial port mySerial.begin(4800); mySerial.println("Hello, world?"); } void loop() // run over and over { if (mySerial.available()) Serial.write(mySerial.read()); if (Serial.available()) mySerial.write(Serial.read()); }
TEST 2: Simplify SoftwareSerial for ATtiny45¶
#include <SoftwareSerial.h> SoftwareSerial mySerial(3, 4); // RX, TX void setup() { mySerial.begin(4800); mySerial.println("SoftwareSerial_Hello"); } void loop() { if(mySerial.available()){ mySerial.write(mySerial.read()); // 1 -> 1 // mySerial.println(mySerial.read()); // 1 -> 49 //文字列の最後に改行コードであるCR(\r)とLF(\n)を付与して送信 char c = mySerial.read(); // mySerial.write(c); // 1 -> 1 // mySerial.println(c); // 1 -> 1 // mySerial.print(c); // 1 -> 1 } }
TEST 3: I2C Master¶
For Arduino Uno
ATtiny45 has 4kB(4096B) Flash. This sketch is 4516B(110%).
ATtiny85 has 8kB Flash. It can be used.
#include <Wire.h> #include <SoftwareSerial.h> SoftwareSerial mySerial(3, 4); // RX, TX void setup() { while (!Serial) { ; // wait for serial port to connect. Needed for native USB port only } mySerial.begin(4800); mySerial.println("SoftwareSerial_Hello"); Wire.begin(); // join i2c bus (address optional for master) } void loop() { Wire.requestFrom(8, 6); // request 6 bytes from slave device #8 //while (Wire.available()) { // slave may send less than requested char c = Wire.read(); // receive a byte as character mySerial.print(c); // print the character //} delay(500); }
I2C Slave¶
#include <Wire.h> void setup() { Wire.begin(8); // join i2c bus with address #8 Wire.onRequest(requestEvent); // register event pinMode(PB4, OUTPUT); } void loop() { delay(100); } // function that executes whenever data is requested by master // this function is registered as an event, see setup() void requestEvent() { digitalWrite(PB4, HIGH); delay(8000); Wire.write("hello "); // respond with message of 6 bytes // as expected by master digitalWrite(PB4, LOW); delay(8000); }
Burn fuses from Terminal without makefile¶
ref.AVR Fuse Calculator
ref.fuse bits - FabISP
CKDIV8 programmed(0)
$ avrdude -p t45 -P usb -c atmelice_isp -U lfuse:w:0x62:m
CKDIV8 unprogrammed(1) -> don’t divide
$ avrdude -p t45 -P usb -c atmelice_isp -U lfuse:w:0xE2:m