概要
ATTiny85にてスレーブからI2Cで取得(readのみwriteしてない)したデータをPCにUARTで連携してみたメモ。
流れとしては「Masterとして使うATTinyの準備/設定」「Slaveとして使うArduinoNanoの設定」「動作確認」。
環境
開発環境
Windows11(64bit)
ArduinoIDE 1.8.19 (多分Microsoft Storeからインストール)
Arduino UNO ( 後で出てくるArduino as ISPとして使う。使えればほかでもOK)
試験用ハード
PC
開発環境と同じWindows
ATTiny85-20PU
秋月で買った純正品 これ
USBシリアル変換モジュール
CH340が搭載されているやつを使用。(リンクこれから準備)
最近のWindowsだったら元からドライバーは入っているはず。
Arduino Nano 互換機
I2Cのスレーブとして。手持ちのI2Cなセンサーとかでもよいけど動かない時の切り分けが大変。
その他
- ジャンパー必要数
- コンデンサー 計100uFほど(書き込み時のリセット操作用なのでなければジャンパー手操作でも)
- LEDと1Kほどの抵抗(動作しているかチェック用。なければないで)
Masterとして使うATTinyの準備/設定
ATTinyのブートローダー書き込み及びプログラム書き込み方法
このままこちら参照
書き込むプログラム
UART周り
ATTiny85にはハードウェアシリアルがないのでソフトウェアシリアルを使う必要がある。
pinout(参照)のPBnのnで使うピンを指定するけれど(PB)0,(PB)2はI2Cで使うので利用できるのは残り。とりあえずRXを(PB)3,TXを(PB)4に指定する。
なお、(PB)5はプログラム書き込みの時に使うので他用途で使うと試験中は面倒。
ざっくり雰囲気は以下。
#include <SoftwareSerial.h>
#define RX_PIN 3 // PB3はUSBシリアル変換モジュールのTXにつなぐ
#define TX_PIN 4 // PB4はUSBシリアル変換モジュールのRXにつなぐ
SoftwareSerial softSerial = SoftwareSerial(RX_PIN, TX_PIN);
void setup() {
softSerial.begin(9600);
softSerial.println("Master start");
}
注意事項
- TX,RXを入れ子でつなぐの間違えがち。
- softSerialなので通信速度はあんまり頑張れない(まだまだいけるだろうけど必要なければ無理はしない)
- 間違えてSerial.print~としてもエラーは出ない。(softSerial.println)
I2C周り
よく使うWireは使えないらしい。マイコンごとに実装分かれていて実装されていないとかどっかで見た。(ソース1分斜め読みで見つからなかったけどまぁ信じる)
かわりにArduinoIDEのライブラリ管理から入れられるTinyWireMが使える。
先ほど見たpinoutにあるようにPB0がSDA,PB2がSCL。
ざっくりプログラムは以下
#include <TinyWireM.h>
#define SLAVE_ADDR 0x08 // Slaveのアドレス。
void setup() {
TinyWireM.begin(); // 開始
}
void loop() {
int code = TinyWireM.requestFrom(SLAVE_ADDR, 1); // スレーブのアドレスから1バイト(第二引数)読み込み。
if ( code == 0){
softSerial.println(TinyWireM.read()); // 読み込んだものを一括取得(そして書き出し)
} else {
// エラーコードはここにしかなさそうhttps://github.com/adafruit/TinyWireM/blob/master/USI_TWI_Master.h
softSerial.printf("error with code[%d]\n",code);
}
delay(500);
}
注意事項としてTinyWireM.requestFromの戻り値は要確認。エラーがあった場合チェックしないでreadを呼ぶと初期値の0がそのまま取得される。(ライブラリのExampleはチェックしていないけど大事)
Slaveとして使うArduinoNanoの設定
呼ばれたら返すだけ。アドレスは0x08に設定している。(予約アドレス以外任意可のはず)
#include <Wire.h>
byte b=0;
void setup() {
Serial.begin(9600);
Serial.println("slave START");
Wire.begin(0x08);// Slave ID #8
Wire.onRequest(requestEvent);
}
void loop() {
}
void requestEvent() {
Serial.print("event call current data[");
Serial.print(b);
Serial.println("]");
Wire.write(b++);
}
動作確認
結線
ATTinyの番号はピン番号(PBnのnじゃない)
役割 | USBシリアル変換 | ATTiny | Nano |
5v | 5Vのピン | 8 | 5v |
GND | GNDのピン | 4 | GND |
(Attinyからみて)TX | RXのピン | 3 | – |
(Attinyからみて)RX | TXのピン | 2 | – |
SCL | – | 7 | A5 |
SDA | – | 5 | A4 |
(全体ソースでは動作確認用のLEDがありATTinyの6番から1K抵抗経由でグランドにつながっている。)
動作ログ
同時につなげるとNanoの準備ができるまで見つからない旨のエラーが返るけど準備できたら取得できるようになる。
Loop [1]
by available
error with code[3]
Loop [2]
by available
error with code[3]
Loop [3]
by available
0
Loop [4]
by available
1
Loop [5]
by available
2
Loop [6]
by available
3