月別アーカイブ: 2022年6月

ATTiny85でI2CしたデータをUARTシリアル通信

概要

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(参照)のPBnnで使うピンを指定するけれど(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シリアル変換ATTinyNano
5v5Vのピン85v
GNDGNDのピン4GND
(Attinyからみて)TXRXのピン3
(Attinyからみて)RXTXのピン2
SCL7A5
SDA5A4

(全体ソースでは動作確認用の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

インドにガンダムという地名が多い理由

ツイッターに疑問が出ていたのでちらっと調べてみた。

昔の言葉で湧き水かな? https://en.wikipedia.org/wiki/Ramagundam

多分、印欧祖語の *wed- (今残っている単語で似たものだとwet)

ラテン語のunda(湧き水、水から派生して波)が同じ雰囲気残っているかな。

ちなみに、サンスクリット語のudaが水で、井戸の昔の音wi(ウィスキーのイ)や、袖ケ浦の浦(ura)につながったという説もあるらしい。(参考

関連して、earthやteraの語源は印欧祖語の *ters- らしい。

インドラとundoちょっと似ていない?と思ったけど最初の「イ」の部分が語源かもぐらいの温度感かな?(参考:5.2. ヤースカの解釈)

ヒドラとかは同じところからきているらしい。(参考

おばけくるましーんのメモ

寝ない幼児を脅すために、リモコン操作で扉とかをガタガタさせたい。

通信はそこそこ距離が届きそうなESPNow使う。(ESPNow調べた時の記事)

揺らす道具は130モーターに何かつけて自作した振動モーター+ESP32-DevKit。DevKit高いけどとりあえず。

リモコンはM5StickC。こいつも高いけどどんな機能必要になるかわからないので手軽にいじれるやつで。

電池と手持ちの部品で動かすには突入電流が大きい(参考)のでコンデンサが足りなかった。コンデンサ100uFぐらいだとパチモンのDCDCでは2.7vぐらいまで、パチモン及び正規品レギュレーターでも2.8vぐらいまでおちる。レギュレーターだと半々の確率でESP起動まではいけることが多いけどモーターを回すとまあだめ。とりあえずコンデンサ大き目ぽちって待機。

今のプログラムはこれ

ハードは

電源の3.3VからESPの3.3vピン、電源グランドからGND

GPIO2-抵抗 – 動作確認用のLED -GND

GPIO15-抵抗 – 2SK4017のBase -GND

電源ライン – モーター – 2SK4017

あとはコンデンサやら帰還ダイオードやらざっくり

USBコンセント電源から5vでとったら動作するので追加コンデンサでも厳しかったら揺れるとこ(モーター)だけ扉につけるように半分離するとよいかも。(電池動作の動作確認機を兼ねているので極力電池で頑張る)