I2CマトリックスLEDで遊ぶ【ATtiny13+ArduinoIDE編】
何回かに分けて、I2Cの勉強を兼ねて、konashi.jsを使ってI2CマトリックスLEDで遊んでいました。
konashi.jsでSBBLEからI2CでマトリックスLEDを制御する - hine's blog
konashi.jsでSBBLEからI2CでマトリックスLEDを制御する【その2】 - hine's blog
konashi.jsでSBBLEからI2CでマトリックスLEDを制御する【その3】 - hine's blog
ということで、電池とかをうまく使えば自分でお絵書きできるバッヂとかを作れるんじゃないかと思います。
ってなことを書いたので、どれだけ小さいバッジ作れるかしら、という実験を少しばかりしてみました。パーツ箱見たら今まで全く灯を入れてないマイコンを幾つか見つけたので遊んでみました。
今回見つけたのは、ATtiny85、ATtiny13A、ATtiny2313の3つ。Arduinoなどで使われているATmega328pなどと兄弟にあたる、ATMEL社のマイコン中でもDIP8ピンパッケージの小さなマイコンです。
ATtinyでI2Cできるのか
で、これらのマイコンのデータシートを見てみると、ピン数が少ないだけでなく、I2CやSPIを処理するTWIがなくて、簡単にI2Cできないようです。
しかしそこは非常にシンプルな通信方式のI2Cなので、誰かすでに色々試してるだろう、と思って調べてみると、かなり情報を集めることが出来ました。中でも、つい最近にアップされていた以下のエントリはまさにそのまんまのものでした。
しかも、一番プログラムメモリが小さい(1KBしかない)ATtinyで実装できてる!これはすごい。ということで、I2Cは多分何とかなるんじゃないかということで、開発を進めることにします。
ArduinoIDEでATtinyの開発をするための環境構築
ATMELのマイコンの開発をするのなら、やはりArduinoIDEが使えると慣れていて楽なので、ArduinoIDEでATtinyシリーズなどを使う設定をします。参考にしたのはこちら。
今回はライターとして、aitendoのAVR-USBaspを使います。多分ATtinyマイコンと同じタイミングで買って、Arduinoファームウェアの書き込みなどに使っていたもの。
なお、昔買ったばかりの時に使おうとしたら「Firmwareが古い」などと起こられたので、Arduino-ISPを使ってこれのFirmwareの書き換えを行いました。現在は提供されている最新のFirmwareになっています。
また、このUSBaspからマイコンに給電するので、J4にジャンパピンを刺してあります。
とりあえず、本当は左のI2CマトリックスLEDボードはあとから追加したものですが、USBaspとATtinyの接続はこんな感じです。USBaspから線を6本つなぐだけで、他に抵抗やらコンデンサやらなくても書き込み、実行ができるのはすごいお手軽だと思います。
USBaspから書き込みできない!
先ほどのページを参考に、まずはATtiny13Aで開発環境を構築してみようとしましたが、いざ書き込もうとすると、Device Signatureが違うとのエラーが。コマンドラインからavrdudeコマンドを叩いてみると、何やら毎回全く異なるDevice Signatureが返ってきてるっぽい。
avrdude: Device signature = 0x000307
avrdude: Expected signature for ATtiny13 is 1E 90 07
Double check chip, or use -F to override this check.
そこで、ATtiny85やATtiny2313などにつないでみると、こっちはもっとひどくて、返事が返ってきていないっぽい。
avrdude: error: programm enable: target doesn't answer. 1
avrdude: initialization failed, rc=-1
Double check connections and try again, or use -F to override
this check.
ん〜。しばし原因探しをしていましたが、結果から言うと、aitendoの商品ページと、USBaspの本家ページにヒントが書いてありました。
JP5:ONにして、ターゲットのクロックが低速の場合
J3 SCK option
If the target clock is lower than 1,5 MHz, you have to set this jumper.
Then SCK is scaled down from 375 kHz to about 8 kHz.
(※本家のJ3ジャンパはaitendoの商品のJ5に当たります。)
買ったばかりのATtinyマイコンは、CKDIV8のヒューズビットが0になっていて、内部クロックが1/8になっています。そのため、1MHzとかで動いているので、上記の「クロックが低速の場合」に該当しています。あ〜、それでか〜!
ということで、J5にもジャンパピンを挿して再度接続しなおしたところ、なんの問題もなく無事接続、書き込みが出来ました。
I2CマトリックスLEDを動かす
ということで、ここからはたま吉さんのI2CのコードtinyI2C.inoを利用させていただき、この前konashi.js用に書いたマトリックスLED用のコマンドをArduino用に移植。
当然、スマホで絵を自由に描いたりする機能なんかはありませんが、プログラムから好きな形を送る事が出来ます。
ってことで、とりあえずまだライブラリとしてちゃんとしてるわけでもなく(というか、Arduinoのライブラリの作り方知らないな)、図形描画のところとかはもうハードコーディングになっちゃってますけど、コードを公開しておきます。
I2Cのプログラムで詰まったポイント
今回移植するにあたってちょっと詰まったところで言うと、I2Cのslaveアドレスが7bitだということでした。普通に1byteでアドレスの情報を保持していて、そのまま投げてしまい、うまく動きませんでした。
konashi.jsなんかだとslaveアドレス投げるところはSDKが 処理してくれていたので気がついていなかったのですが、今回はslaveアドレスも自分で投げる必要がありましたのでこの間違いに悩みました。
1ビット左にシフトさせて7bitに縮めてアドレスを渡してあげればOKでした。
この後の方向性
I2Cまでのプログラムで1KBほぼ埋まってしまっていますし、また使えるピンもないので、絵の書き換えを何とかしようと思うとATtiny13Aでは厳しいかも。ということで、ピン数の多いATtiny2313も試してみましたが、すぐに同じプログラムが動きました。ATtiny2313はV-USBの実装例もあるから、そのあたりとも組み合わせると面白いかも、とか思いつつ今日の遊び終了。
【追記】
tinyI2C.inoのたま吉さんより、blogへの掲載ならびにgithubでのコードの公開を快諾いただきました。ありがとうございます。