概要
小さな赤外線リモコンを作ろうと思ったのだけど、今まで使ってきたArduino PRO MINIでは場所をとりすぎるし電池も2本いるので、小さいAVRマイコンのATtiny85あるいは45を使ってみることにした。8ピンDIPパッケージで周辺素子もほとんど要らないから、ずいぶんと場所が節約できるしコイン電池で動かせるかもしれない。だんだんと工作で使うプロセッサが小さくなってきたような気もする。
Arduino PRO MINIも小さいのだけど、8ピンDIPの方が当然小さい。
前回、機能の少ない赤外線リモコン(エアコン用など)を作ったときにはArduino PRO MINI(3.3V、8MHz版)を使ったが、実現できたモノに対してマイコンや電源がオーバースペックに感じた。より小さいなAVRと小容量の電池を使うことで、コンパクトな赤外線リモコンを作ってみたい。
今回入手できたのがATtiny85とATtiny45Vの2種類だったので、開発や実験は85で、実機は45Vを使ってみたいと思っている。
なお、25/45のあとの”V”は低動作電圧版を表してみり、3行目にある”20PU”と”10PU”は、最高動作周波数(20MHzと10MHz)、パッケージング(P : プラスチックDIP)、および、端子の仕上げ(U : スズメッキ)を表しているようだ。
まずは、ATtinyのスペックを調べたりフラッシュへの書込みのために必要なISP (In-System Programmer) を用意したり、Arduino IDEでビルドできるようにするといった準備から始めた。ATtiny85/45のスペックについては、秋月電子の商品ページにリンクされているデータシート(ATtiny25/45/85 [DATASHEET]) を参考にした。
ATtiny85/45/25の特徴
ATtiny85/45/25はATtinyシリーズの第三段として2005年に発表されたものらしい ( Atmel AVR ATtiny comparison chart を参照 ) 。Arduinoで使われているATmega8シリーズとほぼ同じアーキテクチャをもつAVRマイコンで同じビルドシステムで開発可能。大きさや本数は異なるが、フラッシュメモリやSRAM、クロックオシレータ、タイマー、PWM機能、A/Dコンバータ、汎用I/O(GPIO)などの周辺が載っているのも同様。SPIを使ったISPにも対応しているから特別な装置がなくても(Arduinoなどを利用することで)フラッシュメモリにプログラムを書き込める。ATmegaと比べるとピン数が少ない分だけ利用できる周辺は小規模になるし、フラッシュメモリやSRAMの容量も小さい。しかしながら、その分消費電流が少ない。周辺の駆動を考えなければ、動作時で300μA、スリープ時はなんと0.1μAとのこと(@1.8V, 1MHz)。
ATtiny5シリーズの共通点
-
- 8ピンDIPパッケージありで工作に使いやすい。
- GPIOは6本(PB0-PB5)。ただし、Arduino ISPを使うときにはPB5はRESETとして使うことになる。
- 4チャネル(シングルエンド)の10ビットA/Dコンバータ内蔵。
- 8ビットタイマ(2チャネルのPWM出力付)。
- 8MHz発振のRCオシレータ内蔵。
- 水晶発振器を外付けすれば最大20MHz(V付は10MHz)。ただし水晶を使うとGPIOは更に2本減る。
- 動作電圧は、無印が2.7-5.5V、V付が1.8-5.5V。
相違点
データシートを読むかぎり、相違点は内蔵しているメモリ容量だけのようだった。
フラッシュメモリ | EEPROM | SRAM | |
ATtiny85 | 8192Bytes | 512Bytes | 512Bytes |
ATtiny45 | 4096Bytes | 256Bytes | 256Bytes |
ATtiny25 | 2048Bytes | 128Bytes | 128Bytes |
ピンの構成
ATtinyは少ないピン数の中に数多くの機能が詰め込まれていてややこしい。たびたびデータシートを見直すことになるので使いそうな機能にしぼって以下にまとめた(ピン番号は8ピンDIPの場合)。
- PB0(#5) = MOSI, AIN0, OC0A, /OC1A, AREF, PCINT0
- PB1(#6) = MISO, AIN1, OC0B, OC1A, PCINT1
- PB2(#7) = SCK, ADC1, INT0, PCINT2
- PB3(#2) = ADC3, /OC1B, PCINT3,CLKI,XTAL1
- PB4(#3) = ADC2, OC1B, PCINT4,CLKO,XTAL2
- PB5(#1) = ADC0, /RESET, PCINT5
機能別に見ると以下のようになる。
- SPI関係
MOSI, MISO, SCK - A/D入力チャネル
ADC0, ADC1,ADC2, ADC3, (AREF : 外部リファレンス電圧) - アナログコンパレータ入力
AIN0, AIN1 - PWM出力
OC0A, OC0B, OC1A, /OC1A, OC1B, /OC1B - ピンチェンジ割込み源
PCINT0, PCINT1, PCINT2, PCINT3, PCINT4 - 外部クロック入力/内部クロック出力
CLKI, CLKO - 外付け水晶発振器接続
XTAL1, XTAL2
Arduino ISP
ATtiny85/45には、ふつうのArduinoのマイコン(ATmega328P)に書き込まれているようなブートローダが入っていないし、ハードウェアによるシリアル入出力機能(UART)もない。スケッチをATtiny内のフラッシュメモリに書き込むためには、ISP (In-System Programmer)を使う必要がある。また、動作周波数その他を設定するためのFUSEを書き換える際にもISPが必要になる。以前ATMega328PのBODLEVEL FUSEを書き換えたときと同じように、Arduino PRO MINIを使ったISPを構成するところから始めた。
Arduinoのサンプルに入っているArduinoISPスケッチを動かすため、上記のような回路をブレッドボード上に組んだ。Arduino PRO MINI (5V、16MHz動作)のSPI端子(D13=SCK,D12=MISO, D11=MOSI)をATtinyに接続し、リセット用にD10をピン#1のRESET(PB5)に接続する。PCとArduino PRO MINIの接続は、USB-シリアル変換用のAE-FT231Xを介して行うことにした。
手前の8ピンDIPのICがATtiny85で奥がArduino PRO MINI。スケッチを書き込むごとにISP用のブレッドボードから実験回路用のブレッドボードにATtinyを移動する必要があるのだけど、ブレッドボードとの抜き挿しは丸ピンソケットごと行っている。おのおののボードにソケットをセットしておいてATtinyだけを挿し替えようとすると、すぐにICの足を曲げてしまうので。
ISPの詳細や使い方については、Using an Arduino as an AVR ISP (In-System Programmer) を参照。このリファレンス記事はArduino IDEからArduinoにブートローダを書き込む方法として書かれているが、ATtinyのFUSEの変更やスケッチの書き込みにもそのまま使える。
ArduinoISPスケッチにはシリアル転送速度として19200bpsと書いてあるので、avrdudeコマンドを使った操作時にもこの通信速度を指定する必要がある。
avrdudeによるFUSE内容の確認
ArduinoISPがちゃんと動くことを確認するためにavrdudeコマンドを使った。ISPとしてのArduino PRO MINIでArduinoISPスケッチが動作している状態で、Windowsのコマンドプロンプトから以下のように入力すると、ATtinyのFUSE内容を読み出すことができる。このとき、オプション -p t85 により、ターゲットのプロセッサとしてATtiny85を指定している。
1 2 3 4 5 6 7 8 9 |
c:\...\hardware\tools\avr\bin>avrdude -C ..\etc\avrdude.conf -p t85 -P COM4 -b 19200 -c avrisp avrdude: AVR device initialized and ready to accept instructions Reading | ################################################## | 100% 0.08s avrdude: Device signature = 0x1e930b (probably t85) avrdude: safemode: Fuses OK (E:FF, H:DF, L:62) avrdude done. Thank you. (行間の空行を削除) |
avrdudeコマンドの使い方については、http://download.savannah.gnu.org/releases/avrdude/avrdude-doc-6.3.pdf を参照。ここでは、
avrdude: safemode: Fuses OK (E:FF, H:DF, L:62)
という行がFUSEの内容を示している。
出荷時のFUSE内容
avrdudeで読み出したFUSEの内容がどういう意味をもつのか調べてみた。買ったばかりだから、おそらくメーカー出荷時と同じだろう。詳しくはデータシートの 20.2 Fuse Bytes の項を参照。FUSEの場合、プログラムされているビットは”0″となり、そうでないビットは”1″となる。
拡張FUSEバイト = E:FF
拡張FUSEバイト (Fuse Extended Byte = E:FF)は、LSBのみに機能が割り当てられており、”1″のときフラッシュのセルフプログラミングは禁止という意味をもつ。ここは触る必要がない。
FUSEハイバイト = H:DF
1 2 3 4 5 6 7 |
(MSB)1 1 0 1 1 1 1 1 (LSB) | | | | | + + +- BOD LEVEL = B111 = BOD動作禁止。 | | | | +------- チップイレース時にEEPROM内容も消去 | | | +--------- ウォッチドッグタイマーは常時オンではない。 | | +----------- SPI経由のプログラミングは許可。 | +------------- DebugWIRE機能は禁止。 +--------------- PB5は/RESETとして機能する。 |
最上位ビットが”1″ならば、PB5(ピン#1)は/RESETとして機能し、”0″ならばGPIOとして機能する。”0″にしてしまうと、外部からリセットすることができなくなるので、Arduino ISPによるフラッシュやFUSEのプログラミングができなくなってしまう。高電圧プログラミングモードならばフラッシュの書き込みやFUSEの変更も可能とのことだが持っていないのでここは触れない。
FUSEローバイト = L:62
1 2 3 4 5 |
(MSB)0 1 1 0 0 0 1 0 (LSB) | | | | + + + +- クロックソースはB0010 = 内部RCオシレータ(8MHz)。 | | +-+--------- SUTは2(B10) | +------------- クロック出力は禁止。 +--------------- CLKDIV8は有効。 システムクロックはオシレータ周波数の1/8。 |
ローバイトはクロック関係の設定に使われている。外部からクロックを与える場合や外付けの水晶発振器を接続するようなときにはここを変更することになる。ただ、利用できるGPIOが減ってしまうので内部オシレータをそのまま使うことが多いだろう。
クロックソースとして内部RCオシレータを使う場合、システムクロックは発振周波数8MHzをCLKPR(クロックプリスケーラレジスタ)内の4ビット(CLKPS3-CLKPS0)で表現される分周比で割った値になる。
FUSEローバイトのMSB(CLKDIV8ビット)が有効(“0”)な場合、リスタート時にCLKPR内の分周比は8(CLKPS = B0011)となり、CLKDIV8が無効(“1”)ならば1(CLKPS = B0000)になる。つまりCLKDIV8が”0″ならばシステムクロックは1MHz、”1″ならば8MHzということになる。CLKPRの内容はスケッチによって動作中に変更することも可能。
FUSEローバイトを書き換えてクロックソースを外部クロックや外付けの水晶発振器にした場合、それらを接続しなければATtinyは動作しないしSPIによるFUSEの書き換えもできないように思える。試してみる気はしないが。
SUTの2ビットは、パワーダウンからの復帰時のシステムクロックの開始遅延時間(Start-Up Time)を設定するためビットで、初期値は6クロックとなっている。外部リセットの場合は、更に長い遅延時間(14クロック + 64msec)が設定されている。電源電圧の立ち上がりとクロックの安定を考慮したものと考えられるが、内部オシレータを使う際にはこれほど長い必要はないように思える。
とりあえず書き換えない
あえてFUSEを書き換えることがあるとすれば、CLKDIV8ビットだろう。しかし、1MHz動作の方が消費電流が小さいことは間違いないので、とりたてて変更が必要な項目はないようだ。
Arduino IDEへのATtinyサポートの追加
ISPは使えるようになったので、次はスケッチを書いてビルドするためのArdiuno IDEに、githubの ATtiny microcontroller support for the Arduino IDE を導入してATtinyの開発ができるようにした。具体的な導入方法は、http://highlowtech.org/?p=1695 を参照した。このページにはArduino IDE 1.6および1.0への導入方法が書いてあるが、うちで使っている1.8.3にも同じように導入することができた。方法を簡単にまとめると以下のようになる。
- Arduino IDEのファイル/環境設定/追加のボードマネージャURL に、以下のURLを入力しOKをクリック。
https://raw.githubusercontent.com/damellis/attiny/ide-1.6.x-boards-manager/package_damellis_attiny_index.json - ツール/ボード: … を選択して対応ボードリストを開き、一番上のボードマネージャ…を選択する。リストの下の方にattiny by David A.mellis が表示されているので、この項目を選択して最新バージョン(1.0.2)を選んで install し、ボードマネージャを閉じる。
- Arduino IDEを立ち上げ直してツール/ボード: … を開くと、ATtiny Microcontrollers としてATtiny25/45/85およびATtiny 24/44/84 が追加されている。
上の導入作業により、うちのWindows PCでは、C:\users\..\AppData\Local\Arduino15\packages 内に、esp8266と並んでattiny というフォルダが追加された(esp8266用の追加もボードマネージャで行った)。さらにフォルダを下りていくと、選択可能なプロセッサ、プロセッサごとのクロック(スピードと種類)、クロックに対応するFUSEの値が書かれたboards.txt が格納されていた。
ツール/ボード: でATtiny25/45/85を選ぶと、ターゲットのクロックの種類(内部、外部)と周波数が選択できるようにする。外部クロック(External) を選ぶと、スケッチの書き込み時にFUSEも書き換えられてしまうので、Arduino ISPでは手も足も出なくなることに注意が必要。いっそ、boards.txtから削除してしまったほうがいいのかもしれない。
ATtinyのリビジョンについて
データシートを見ていると、ソフトウェアからのBOD動作の禁止やパワーオンリセット動作について、あるいは、デバイス自体のバグにあたるエラッタについてリビジョンごとに記述されている。ではリビジョンを知るにはどうするのかというと、今回使っているプラスチックモールドの8ピンDIP版(8P3パッケージ)では裏面にマーキングされていると書いてあった。さっそく裏側もマクロレンズで撮影してみた。
リビジョンマーキングについての話題は、avrマイコンに関するフォーラム(AVRfreaks)でもたまに出てきていたのだけど、ATtinyのそれについての決定的な話は見つからなかった。上の写真を見て想像してみると以下のような感じか。
- A8N-GDAおよび2XN-572は製造ロットあるいはトレースコード?
- BおよびG4がリビジョン?
- 1Pはパッケージ?
- 1644および1303は製造週(YYWW形式)。2016年44週および2013年3週。表面にも表記。
まったくの想像に過ぎないが、ATtiny85がB、ATtiny45VがGとすると、今のところエラッタ無しと思われるので一安心(?)である。