The jonki

呼ばれて飛び出てじょじょじょじょーんき

【Arduino】ATtiny85をSoftwareSerialを使ってUnityからシリアル通信制御をする

前回の記事でATtiny85をArduinoから開発できる環境が整いました。

ATtiny85はシリアルの口がないのでSerial.println()とか対応していないのだけど、SoftwareSerialを使うことでそれを補えます。つまりシリアル通信は可能です。今回は例としてUnityからシリアル通信でデータを送り、ATtiny85でそれを受け取った際にLEDが光るサンプルを紹介します。


準備

FTDI USBシリアル変換アダプターはデバッグ用途などにも大活躍のシロモノなので、持ってなければこれを機会に買うと良いと思います。

ATtinyにスケッチをアップロード

データを受け取ったら1回点灯するプログラムです。今回はデータの内容自体は読みこむだけで特に何もしません。ちなみに例として'345'という数字を受信した場合、'3'、'4'、'5'という感じで3回受信するため、ループにして全部をreadしています。ATinyにスケッチをアップロードする手順は前回の記事を参考にしてください。

#include <SoftwareSerial.h>

int led = 1;
int d = 100;

SoftwareSerial mySerial(3, 4); // RX, TX
void setup() {                
  // initialize the digital pin as an output.
  pinMode(led, OUTPUT); 
  mySerial.begin(9600);  
}

// the loop routine runs over and over again forever:
void loop() {
  if (mySerial.available()) {
      while(mySerial.available()){
        mySerial.read();
      }
    
    digitalWrite(led, HIGH);
    delay(100);
     digitalWrite(led, LOW);
    delay(50);
  }
}

シリアル送信側(Unity)

以前書いた記事のコードをそのまま使います。通信に使うシリアルポートはArduinoではなく、FTDIのアダプターが付いているポートなので注意。

配線する

こんな感じで簡単です。6ピン(Arduino側からは1番)にLEDを繋ぎ、2、3ピン(Arduino側からは3、4番)をFTDIアダプタ側のTX、RXに繋ぎます。SoftwareSerialでは3、4番はRX、TXとなっているので逆に思うかもしれませんが、FTDIアダプタのTXはATtinyのRXになります。送信側は受信側につなぐので当たり前といえば当たり前ですが、結構間違いやすいです。

動かす

Unityを実行し、データを送信したタイミングでLEDがチカっと光ったら成功です。送信する際はFTDIアダプタのTXのチップLEDが光るはずです。何も反応しない時は落ち着いて手順を再確認してみましょう。
いやー、これで簡単に外部から制御できるようになったので使い勝手がかなり良くなりましたね。

【Arduino】ATtinyをArduinoで開発する

Arduinoは便利だ、でも本当に簡単なことをやらせるにはオーバースペックだし、高コストです。数を増やしたい時や装置を小さくしたいときにも不便です。じゃあPICでもAVRでもちゃんと勉強しろよ、という話が聞こえてきそうですが、もうちょっとゆとりにもやさしい方法をやります。

こんなのです。ちっちゃなATtiny 85(えーてぃーたいにー、と呼ぶ)という小さいAVRでLEDをチカチカさせています。これをArduino UNOだけで実現できます。元ネタはこちらですが、ほぼ同じことを情報整理しつつ書いていきます。
How-To: Shrinkify Your Arduino Projects


ATtinyはスペックも可愛いです。

ATtiny 45  : Flash mem 4KB,  RAM 256  Byte
ATtiny 85  : Flash mem 8KB,  RAM 512  Byte
ATMega328P : Flash mem 32KB, RAM 2048 Byte  // UNOで使われてるもの

準備

用意するのはこれだけです。AVRライタとか特別なものはいらないよ。

  • Arduino UNO (duemilanoveでも多分大丈夫)
  • コンデンサ 10μF
  • ATtiny 85
    • 千石電商秋葉原店舗で見つけましたが、秋月でこの型番はありませんでした。
    • ATtiny45でも大丈夫だけど同じ8ピンでRAMなど多い85の方が良いかと。
  • ジャンプワイヤ
  • LED(動作確認用)1本
  • LED用の適当な抵抗1本

ATtiny用のライブラリを手に入れる。

1. 下記のサイトよりATtiny master.zipを落とす。

Programming an ATtiny w/ Arduino 1.0

2. .zip を展開してArduinoフォルダのhardwareフォルダの下に置く。

hardwareフォルダはなければ作成してください。
C:\Program Files (x86)\Arduino\hardware\attiny

3. Arduino IDEを再起動して[ツール]->[マイコンボード]->ATtiny...が読み込まれることを確認。

Arduino ISPをUNOに焼く

Arduino ISPというものを使い、UNOをブートローダの書き込み器として利用できます。かなり便利です。
前回の記事でも書きましたが、同じです。

0. ArduinoにはUSB以外に何も繋がないようにしておく。念のため。
1. [ツール]->[マイコンボード]->[Arduino UNO]にセット。(ISPだからATTinyじゃないよ)
1. [ファイル]->[スケッチの例]->[Arduino ISP]を読み込み、UNOにそのスケッチをアップ。

ATtiny85にプログラムを書き込む

まずはATtiny85の割り当てを動画から見てみます。かなり単純ですね。AVRのピン番号と使えるピン(Arduinoのスケッチ側から指定するピン番号)は違うので混乱しないようにする。ATtiny 85のマイコンボードは3種類ありましたが、[internal 8MHz clock]を選択しました。



サンプルとして、スケッチの例にあるBlinkをアップロードしたいと思います。配線はこんなかんじです。LEDと抵抗はBlinkスケッチのために利用します。この例ではBlinkで光らせるLEDは4番です。上の図と比較するとPIN 4のところに抵抗とLEDがたしかにつながっています。

焼き込み時のエラーがこんな感じで発生しましたが、1行目は通常出る警告のようですが、下のやつは見たことがないです。。ATtiny85をちゃんと認識していないのかな。とりあえずアップロードは成功していたようなので無視しました。(え)

コンパイル後のスケッチのサイズ:844バイト(最大容量8,192バイト)
avrdude: please define PAGEL and BS2 signals in the configuration file for part ATtiny85
avrdude: Yikes!  Invalid device signature.
         Double check connections and try again, or use -F to override
         this check.


うまくいけばLEDがBlinkするはずです。ただ内部クロックが短いようなのでdelay(100)など短い時間にしてアップしました。スケッチがアップロード済みになれば余計な配線を覗いてこんな感じで単独で動くようになります。

ATtin85を内部クロック8MHzにする

やはり内部クロックが違うのでdelayの時間が8倍かかっていたようです(1MHzで動作)。下記サイト様の「ATtiny2313を内部クロック8MHzにする」を参考にブートローダーを焼きましょう。[ツール]->[マイコンボード]で8MHzのATtinyを選んでおきます。
Arduino IDEで ATtiny/ATmega 開発環境を作る

使える命令

SoftwareSerialとかはシリアルがないので便利そうですね。8MHzに内部クロックをあげとく必要がありそうですが。

pinMode()
digitalWrite()
digitalRead()
analogRead()
analogWrite()
shiftOut()
pulseIn()
millis()
micros()
delay()
delayMicroseconds()
SoftwareSerial (has been updated in Arduino 1.0)