ArduinoにはAtmel(アトメル)社のAVRシリーズのマイコンチップが搭載されています。
普段Arduinoを使っていて特に意識することはあまりありませんが、Arduino UnoやNanoにはAtmel ATmega328PというAVRマイコンが、またArduino MegaにはATmega2560が搭載されています。
これがArduinoとして動作させるためのマイクロコントローラーチップとなり、ブートローダーを書き込むことによりArduinoのスケッチを動かすことが出来るようになっています。
Arduinoボードにはこのマイコンチップ以外にも電源供給を行う回路やPCからスケッチの書き込みが出来るようにUSB-シリアル変換を行うチップなどAVRマイコンを制御するために必要な諸々の回路やチップが搭載され1枚のArduinoボードとして作られています。
これらマイコンを動かすために必要な部分を自分で構成する事が出来れば、AVRマイコンにブートローダーやスケッチを書き込んであげれば単独でArduinoとして動かすことも出来ます。
以前、Arduino Unoに搭載されているATmega328Pにブートローダーを書き込みこれ単体でArduinoとして動かしてみました。
マイコンを駆動するための電源やスケッチを書き込むためのUSB-シリアル変換モジュールなどを用意すれば、非常にシンプルな構成ですがちゃんとArduinoとして動かすことが出来ます。
今回はArduinoでも使われているAVRシリーズのマイコンチップの中で超小型なATtiny85にArduinoブートローダーを書き込みArduinoとして動かしてみたいと思います。
ATtiny85はピンの数が8本しかない非常に小型なAVRマイコンですが、こんな小さなマイコンチップでもArduinoのスケッチを書き込むことによりArduinoとして動かすことが出来ます。
各種Arduinoボードはかなり優秀なマイコンボードなので、ATtiny85のようなミニサイズのAVRマイコン(I/O端子は5本しかありません)を使うメリットや恩恵はあまりないのかな?と思いこれまで使うことはあまりなかったのですが・・・
最近ESP8266で動かす『ESPboy』というオープンソースの携帯ゲーム機を作ったのですが、これが非常に楽しく!
その流れでATtiny85で構成された『Tiny Joypad』を作ってみました。
なるほど!AVRマイコンを単体で動かすことが出来れば、このような小型なゲーム機を構成することもできArduinoを使った電子工作の幅も広がりそうですね!
この投稿をInstagramで見る
今回はATtiny85にブートローダーを書き込みArduinoのスケッチを動作させる基本的な方法をご紹介したいと思います。
目次
ATtiny85にブートローダーを書き込みArduinoとして使えるようにする!
各種ArduinoボードにはAtmel(アトメル)社のAVRマイコンとなるATmegaシリーズのマイコンチップが使われています。
そしてAtmelのAVRマイコンには小型なATtinyシリーズというものがあります。
その中の『ATtiny85』を今回使ってみたいと思います。
Atmel ATtiny85-20PU
こちらが『Atmel ATtiny85-20PU』です。
Arduinoボードでも使われているAtmel(アトメル)社のAVRシリーズのマイコンチップとなります。
ピンの数が8本しかない非常に小型なマイコンチップですが、スケッチを書き込むことによりArduinoとしてちゃんと動作させることが出来ます。
200円ほどの安価なマイコンチップとなり、海外サイトや秋月電子さんなどで購入する事が出来ます。
Amazonではチップ単体での販売はあまりないようですが、USB端子が付けられた開発ボードとしての形状になったものは多数販売されているようです。
今回はATtiny85チップ単体で行っていきます。
Arduino Unoで使われているATmega328Pと比べるとサイズは非常に小さいですね!
簡単にATmega328Pとスペックを比較しておきます。
ATtiny85には省電力タイプの「ATtiny85V-10PU」と動作速度が速い「ATtiny85-20PU」があります。
今回は後者のATtiny85-20PUチップを使っています。
Clock(動作速度)は、ATtiny85-20PUでは最大20MHzとなっています。(外部クロック使用)
ATtiny85-20PU | ATmega328P | |
FLASH(プログラム領域) | 8KB | 32KB |
SRAM | 512B | 2KB |
EEPROM | 512B | 1KB |
Clock | 最大20MHz | 16MHz |
動作電圧 | 2.7~5.5V | 5.5V |
動作電圧は1.8Vからの駆動が可能となっています。(1.8~5.5V)
ATtiny85 ピンアウト
まずATtiny85のピン配列を見ておきます。
8本のピンがありますが、電源(VCC/GND)とRESETピンを除くと使えるI/O端子は5本のみとなります。(厳密には1番ピンもアナログ入力端子として使えます)
デジタル端子(I/O)やアナログ端子(ADC)、アナログ出力(PWM)にも対応しています。
またI2CやSPIインターフェイスでの接続も出来ます。
まとめると以下表のようになります。
ピン番号 | I/O | SPI | I2C |
1 | RESET | ||
2 | D3/A3 | SS | |
3 | D4/A2 | ||
4 | GND | ||
5 | D0(PWM) | MOSI | SDA |
6 | D1(PWM) | MISO | |
7 | D2/A1 | SCK | SCL |
8 | VCC |
デジタル入出力
D0/D1/D2/D3/D4をデジタル入出力端子として使うことが出来ます。
Arduinoではデジタル端子の指定は数字を記述します。
【例】D3端子を出力で使いたいならpinMode(3, OUTPUT);といった感じですね。
アナログ出力(PWM出力)
D0/D1端子はアナログ出力(PWM出力)に対応しています。
【例】analogWrite(1, [0~255]);
アナログ入力
A1/A2/A3の3つの端子がアナログ入力(ADC)に対応してます。
analogRead(ピン番号);で入力電圧0~5V(3.3V)を0~1023(10ビットの分解能)の数値として読み取ります。
ATtiny85のどのピンがどの信号線なのかが分かればスケッチはArduinoと同じです。
ATtiny85のピン配列をまとめるとこのようになります。
I/O端子は5本しかありませんがPWMにも対応しており、I2CやSPIインターフェイスでの接続も可能です。
またUARTシリアルはハードウェアシリアル端子はありませんが、TX/RXを任意のI/O端子に割り振ることによりソフトウェアシリアルで使うことは出来るようです。
使えるI/O端子の数は少ないですが、ブートローダーを書き込むことによりArduinoと同じようにスケッチを動かすことができます。
ボードパッケージのインストール
ATtiny85のピンアウトの確認ができました。
完全にミニArduinoって感じですね!
それではArduino IDEを使ってスケッチを書き込んで動かしてみたいと思いますが、その前にArduino IDEで使う場合ATtinyに対応したボードパッケージをインストールしておく必要があります。
またArduinoとして機能させるためにはブートローダーの書き込みも必要となってきます。
順を追ってやっていきます。
まずArduino IDEにATtinyボードパッケージのインストールを行います。
Arduino IDEの[環境設定(Preferences…)]から[追加のボードマネージャのURL]に以下URLを追加します。
http://drazzy.com/package_drazzy.com_index.json
他のボードマネージャのURLが記載されている場合は新たな行に追加して下さい!
このボードパッケージの詳細はGitHubにあります。
詳細を知りたい方はこちらも参考にして下さい。
次に[ツール]→[ボード]→[ボードマネージャ]に進みます。
[ATtiny]で検索するといくつかボードパッケージが出てきます。ATtiny85に対応したものは[ATTinyCore by Spence Konde]になります。
これをインストールして完了です!
ボードパッケージのインストールが出来たのか一応確認しておきます。
[ツール]→[ボード]へと進むと先程はなかった[ATtinyCore]という項目が追加されています。
これでATtinyシリーズのチップにコンパイル&スケッチの書き込みが行えるようになりました。
①USBaspを使ったブートローダー&スケッチの書き込み
次にブートローダーの書き込みです。
Arduinoとして動かすには、ボード(チップ)に対応したブートローダーの書き込みが必要となります。
ATtiny85にブートローダーを書き込むことによりArduinoとして機能させることが出来るようになります。
Arduino IDEからATtiny85にブートローダーを書き込むには、ライタやプログラマと呼ばれる書き込み装置が必要となってきます。
これはArduinoを1台用意してこのArduinoボードを書き込み装置として使うことも出来ますが、最も簡単な方法はUSBaspといったプログラマを使ったやり方です。
まずUSBaspを使った方法でブートローダーとスケッチの書き込みを行ってみます。(次項目でArduino Unoを使った方法も試してみます)
USBaspは各種Arduinoボードのブートローダー書き込みにも使えるため1台持っていると便利です!
詳しくはこちらの記事も参考にして下さい!
USBaspとの接続
USBaspとATtiny85との接続はこのようになります。
SPIでの接続となるので対応した端子同士を接続するだけです。
USBasp | ATtiny85(ピン番号) |
VCC | VCC(8) |
GND | GND(4) |
SCK | SCK(7) |
MOSI | MOSI(5) |
MISO | MISO(6) |
RESET | RESET(1) |
ブートローダーの書き込み
USBaspとの接続が出来たら、まずブートローダーの書き込みです。
ブートローダーとはマイコンチップにあらかじめ書き込んでおく小さなプログラムですが、これを書き込んでおくことによりArduinoで使われるスケッチを動かせるようになります。
購入したばかりのATtiny85は生チップとなりArduinoブートローダーが書き込まれていないため(書き込まれた状態で販売されているものもあるようです)、はじめにブートローダーの書き込み作業が必要となります。
書き込むのは最初の一度だけで大丈夫です!
動作クロックは外部発振器を付けていないので、内部発振器となる8MHz(internal)を選択します。
デフォルトでこのような設定になっていると思うので特に変更する必要はないと思います。
次にUSBasp経由で書き込むので、[書込装置]は[USBasp]を選択しておきます。
ボード設定はこのようになります。(オレンジで囲んだ部分)
あとは[ブートローダーを書き込む]をクリックしてブートローダーを書き込みます。
書き込みに成功すると[ブートローダの書き込みが完了しました]と表示されます。
これでATtiny85にArduinoスケッチを書き込み動かすことが出来るようになりました。
スケッチの書き込み
ブートローダーの書き込みが完了したらATtiny85をArduinoとして動かすことが出来ます。
試しに[ファイル]→[スケッチ例]→[01.Basics]にあるLチカスケッチ(Blink)を書き込んで動かしてみます。
ATtiny85の3番ピン(D4)に接続したLEDを点滅させてみます。
Blinkスケッチの[LED_BUILTIN]の部分を[4]に変更します。
こんな感じですね!
1 2 3 4 5 6 7 8 9 10 | void setup() { pinMode(4, OUTPUT); } void loop() { digitalWrite(4, HIGH); delay(1000); digitalWrite(4, LOW); delay(1000); } |
ボード設定&書込装置の設定は先程と同じです!
スケッチの書き込みは通常の[マイコンボードに書き込む]からではなく、[スケッチ]→[書込装置を使って書き込む]で行います。
これで書込装置として設定しているUSBasp経由でスケッチの書き込みが行われます。
スケッチの書き込みが完了したらATtiny85は電源供給を行えば単体で動きます。
電源電圧は2.7~5.5Vの範囲で動作出来るので、リポバッテリーやリチウムイオン電池、ボタン電池などから駆動する事が出来ます。
3番ピンに繋いだLEDが1秒間隔で点滅すれば成功です!
たったこれだけの構成でちゃんとArduinoとして動いてくれます。
②Arduinoを使ったブートローダーの書き込み
USBaspのようなライタ(書込装置)があれば接続が簡単でブートローダーやスケッチの書き込みも簡単に行うことが出来ます。
もしお持ちでないならArduinoを1台使い、これを書込装置として機能させることも出来ます。
Arduinoを経由してATtiny85にブートローダーやスケッチの書き込みを行うというものです。
Arduinoを経由したブートローダー書き込み方法に関しては以下の記事で詳しく解説しているのでこちらも参考にして下さい!
書き込む対象がATtiny85に変わっているだけです。
ライタとして機能するArduinoを準備する
先程は書き込み装置としてUSBaspを使いましたが、Arduinoに同様の機能を持たせることが出来ます。
Arduinoをライタとして使う場合、[ArduinoISP]を使います。
Arduinoを専用AVRライタ(Arduino as ISP)にするためのスケッチをArduinoに書き込むことにより可能となります。
対応しているArduinoは、UnoやNano、Megaなどが使えます。
こちらではArduino Unoを使って行っていきます。
Arduino IDEの[ファイル]→[スケッチ例]→[11.ArduinoISP]→[ArduinoISP]を開きます。
このスケッチを通常作業でArduino Unoに書き込みます。
書き込まれたArduino Unoはライタとして機能するようになります。
そしてライタとして機能するこのArduino Unoを経由してATtiny85にブートローダーやスケッチの書き込みを行うということです。
ArduinoとATtiny85の接続
次に接続です。
SPIでの接続となるのは先程と同じです。
ArduinoはボードによってSPI端子が決まっています。
Arduino Unoでは、D11がMOSI、D12がMISO、D13がSCKとなっています。
先程と同様にATtiny85の対応した端子を接続するだけですが、[D10→RESET]の部分が異なります。
Arduino Uno | ATtiny85(ピン番号) |
5V | VCC(8) |
GND | GND(4) |
D11(MOSI) | MOSI(5) |
D12(MISO) | MISO(6) |
D13(SCK) | SCK(7) |
D10(SS) | RESET(1) |
上記回路ではArduinoのRESET端子とGND間に10μFのコンデンサを入れています。
特にこのコンデンサは無くても書き込みは行なえますが、書き込みが上手くいかない場合や安定しないようであれば入れて下さい!
スケッチアップロード中に自動リセット機能としてシリアルポートを開く時にUnoがリセットされるのを防ぐために入れています。
ブートローダーの書き込み
接続が完了したらブートローダーの書き込みです。
書込装置の設定は[Arduino as ISP]を選択します。
[シリアルポート]はArduino Unoを経由するので[Arduino UNO]を選択。
これでArduino Unoを経由してATtiny85にブートローダーやスケッチの書き込みが行えます。
あとは[ブートローダーを書き込む]を選択してブートローダーの書き込みを行います。
無事書き込みが成功すると[ブートローダの書き込みが完了しました]と表示されます。
スケッチの書き込み
次にスケッチの書き込みです。
接続はそのままで先程のLチカスケッチを書き込んでみます。
ATtiny85のD4端子(3番ピン)に接続したLEDを点滅させるスケッチです。
1 2 3 4 5 6 7 8 9 10 | void setup() { pinMode(4, OUTPUT); } void loop() { digitalWrite(4, HIGH); delay(1000); digitalWrite(4, LOW); delay(1000); } |
スケッチの書き込みは、[スケッチ]→[書込装置を使って書き込む]から行います。
通常の[マイコンボードに書き込む]からではないので注意して下さい!
スケッチの書き込みが完了したら、ATtiny85は駆動電源に繋げればこれ単体で動作してくれます。
D4(3番ピン)に接続したLEDが1秒間隔で点滅すれば成功です。
簡単なLチカスケッチですが動作確認が出来ました。
I/O端子は5本使えるのでこのように複数のLEDを点滅させることも出来ます。
この投稿をInstagramで見る
使えるI/O端子は5本と少ないですが、SPIやI2C・PWM出力やアナログ入力とミニArduinoのように動かすことが出来るのでいろいろと試してみると面白いと思います。
【メモ】ブートローダーのオプション
ATtiny85をArduino IDEでプログラムする際には、[No bootloader][Optiboot][Micronucleus/Digiskpark]という3つのオプションが用意されています。
Optibootブートローダー
今回[Optiboot]を選択しOptibootブートローダーを書き込みました。
OptibootブートローダーとはArduinoが用意しているブートローダーとなります。
通常Arduino IDEを使用して各種Arduinoボードを使う場合、Optibootブートローダーが使われています。
Arduino IDEはOptibootブートローダーと通信する事によりシリアルポートを介してスケッチの書き込みが行われています。
Optibootブートローダーが書き込まれているATtinyチップではArduinoのようにシリアルを介した書き込みを行うことも出来ます。
USB-シリアルコンバーターからのスケッチ書き込みも試してみました!
No bootloader
ATtiny85では、書き込む際の[ボード]設定に[ATtiny85(No bootloader)]を選択すればブートローダーなしでスケッチの書き込みが行われます。
上記のようにUSB-シリアルコンバーターからの書き込みなどあまり使うことがないと思うので、こちらを選択するのが一般的な使い方になるのかな?
USBaspなどのAVRプログラマや今回のようにISPを書き込んだArduinoを経由してスケッチを書き込む場合、[Optiboot]および[No bootloader]のどちらを選択しても書き込み& 動作させることが出来ますが、[No bootloader]を選択する場合も初めてチップを使う時に一度だけブートローダーの書き込み作業は必要となります。
この操作ではブートローダーを書き込むというより、ヒューズビットの設定(クロック周波数などの各種設定)が行われます。
書き込み用基板やシールドを自作すれば便利です!
スケッチ書き込みのたびに毎回ブレッドボードに配線するのが面倒となるので書き込み用基板を作りました。
こちらはUSBasp用の基板ですが、ピンヘッダーに接続するだけで完了するので便利です。
この投稿をInstagramで見る
またArduinoに接続して書き込む場合は、シールド用ユニバーサル基板などを使えば簡単に作ることが出来ます。
このような基板を1つ作っておけばATtiny85のスケッチ書き込みの際の手間が省け大変便利ですね!
【追記】I/O端子の数が増えたATtiny44/84も試してみました!
8ピンタイプのATtiny85では使えるI/O端子の数が6本ですが、14ピンチップのATtiny24/44/84では最大12本のI/O端子を使うことが出来ます。
SPIやI2Cデバイスなどと接続しても使えるI/O端子はまだ多く残ることから、このようなミニ無線コントローラーの製作を考えています。
ATtiny44やATtiny84を使えば実現できそうです。
この投稿をInstagramで見る
【追記】各種ATtinyチップの書き込みで使えるArduinoシールドを作ってみました!
各種ATtinyチップ(8pin/14pin/20pin)のブートローダーやスケッチ書き込みの際に使えるArduinoシールド基板を作ってみました。
スケッチ書き込みの際にArduinoとの接続が毎回面倒となるので、このようなシールドタイプの書き込みボードを自作しておくと非常に便利です!
【追記】USB-シリアル変換モジュールを使いシリアル通信を行う!
多くのATtinyチップにはハードウェアシリアルが搭載されていませんが、USB-シリアル変換モジュールと接続しArduinoのようにSoftwareSerial(ソフトウェアシリアル)によるシリアル通信を行うことは可能です。
デバッグ等でArduino IDEのシリアルモニタを使うなど役立ちます!
最後に!
Arduinoは開発ボードなのでマイコンチップに付加機能やその他回路が多数接続されているので使いやすくなっていますが、一度スケッチを書き込むとそれらはほぼ必要なくなります。
ATtiny85にはArduinoボードのようにスケッチを書き込むための装置が付いていないのでUSBaspのようなAVRライタや同様の機能を持たせたArduinoを用意する必要がありますが、一度スケッチの書き込みまでしてしまうとあとは電源さえあればチップ単体でArduinoと同じように動作させることが出来ます。
ポートの数が少なく制限を受けることもありますが、小型なマイコンチップとなりこれ単体でArduinoスケッチが動いてくれ、アナログ/デジタル端子・SPI・I2C・UART(ソフトウェアシリアル)も使えるので製作するものによっては便利に使えると思います。
AVRマイコンの学習用としても最適ですね!
その一例として、冒頭でご紹介したATtiny85を使ったミニゲームがあります。
こんな小さなマイコンチップですが、スイッチ判定やI2C接続によるOLEDディスプレイの駆動など単体でミニArduinoのように動かすことが出来るのは面白いですね!
この投稿をInstagramで見る
なかなか面白い携帯ゲーム機なので、こんな感じの基板で作ってみようと考えていますが・・・
また機会があればこちらもブログで紹介できればと思います。
コメントを残す