更新
Arduino風 パソコン制御とマイコン制御(ATmega328版)[ATtiny2313版はこちら]
小山智史(弘前大学)
ここで、「パソコン制御」は、スイッチやセンサやLEDなどの入出力素子をパソコンにUSB接続し、パソコン側のプログラムで制御する方法です。また、「マイコン制御」は、パソコンと切り離して、マイコン単独で入出力素子を制御する方法です。
- パソコン制御
-
パソコンとUSB接続したATmega328PのIOレジスタを読み書きします。プログラムは、HTAファイルの中にJavascript言語で記述します。プログラミングが容易になるように、そしてArduino風のプログラミングができるように、ライブラリhidmon88.jsを作成しました(表1)。この方法により、外部入出力を伴うパソコンのアプリケーションソフトを、ホームページ作成の延長線上で、比較的容易に作成することができます。
表1. hidmon88.jsで定義した定数と関数
| 定数 |
| 定数の名称 | 内容 |
DDRB, PINB, PORTB, DDRD, PIND, PORTD | 外部入出力ポート |
TCNT1H, TCNT1L, TCCR1A, TCCR1B, TCCR1C, OCR1AH, OCR1AL, OCR1BH, OCR1BL | タイマー1関連レジスタ |
TCNT2, TCCR2A, TCCR2B, OCR2A, OCR2B | タイマー2関連レジスタ |
ADMUX, ADCSRA, ADCL, ADCH, ADCSRB, DIDR0 | AD変換レジスタ |
| HIGH, LOW, INPUT, OUTPUT | ピン入出力設定値 |
| PB0-5, PD0,1,4, PC0,1,3-5 | Arduinoのpin番号 |
| 関数 |
| 関数の名称 | 内容 |
| poke(a,d) | アドレスaにデータdをセット |
| peek(a) | アドレスaの読み取り |
| sleep(t) | t(ms)スリープ(プロセスが残る) |
| delay(ms) | t(ms)スリープ(CPU負荷重い) |
| pinMode(pin, mode) | pin(0,1,4-13)をmode(INPUT/OUTPUT)に |
| digitalWrite(pin,val) | pin(0,1,4-13)をval(HIGH/LOW)に |
| digitalRead(pin) | pin(0,1,4-13)の値(HIGH/LOW)を読み取り |
| analogWrite(pin,val) | pin(9,10,11)をval(0〜255)に pin(0,1,4-8,12,13)はvalが0〜127でLOW、128〜でHIGH |
| analogRead(pin) | Analog pin(0-5)の値(0〜1023)を読み取り |
| servoAttach(pin) | pin(9,10)をサーボモータに接続 |
| servoWrite(deg) | サーボモータの位置をdeg(0〜179)に |
| tone(pin, freq, ms) | pin(9,11)に周波数freq, 長さmsの矩形波出力 |
| $(id) | HTAオブジェクトのID参照(getElementByIdの短縮形) |
下のプログラム例では、パソコン側の表示も連動させているために、その分マイコン制御(Arduino)と比べて少し長めのプログラムになっています。オリジナルのArduinoでは、計測値をパソコン画面に表示させようとすると、Arduinoのプログラムとパソコン側のProcessingプログラムの両方を書かなければいけませんが、この方法ではひとつのプログラムで済ますことができます。
いくつかの問題があります。
- delay()関数を使うとCPUの負荷が重くなり、他の処理(例えば画面表示)が思うようにできません。代わりにsleep()を使うとタスクが終了せずに残ってしまいます。delay()を使わないプログラムにすれば良いわけですが、マイコン制御と対にするために、今はこのようにしています。
- 高速の入出力処理には適しません。Arduino風のプログラミングスタイルを可能にしていますが、loop()は10ms毎に呼び出される仕組みとなっていますのでご注意ください。
- マイコン制御
-
ArduinoIDEでプログラムを作り、書き込みます。
- bootloadHIDは、USBを経由して、bootmon[2](ATmega328Pのブートローダー領域で動作しているブートローダー兼モニタプログラム)と通信し、ATmega328Pの0番地以降にコンパイルされたHEXプログラムを書き込みます。
- 書き込みが終了すると、自動的に0番地からプログラムを実行します。(同時に、USBの通信は行われなくなります)
- パソコンと切り離して動作させたい場合は、USBアダプタをはずして電池(4.5V)を接続し、0番地から動作させるためのジャンパ線(25番ピンとGND)を接続します。
いくつかの問題があります。
- パソコンとUSB接続して用いる場合、一旦0番地からのプログラムが動作すると、モニタに戻ることができません。そのため、モニタプログラムに戻したい場合は、リセットスイッチを追加するか、USBケーブルを接続しなおす必要があります。
- パソコンと接続した状態ではUSB信号を基準にクロック周波数が自動調整されますが、パソコンから切り離して電池で動作させると、クロック周波数が変わります。これが問題となることがあるかもしれません。
(参考サイト)
[1] V-USB, http://www.obdev.at/products/vusb/
[2] hidmon-2010-0214, hidmon-Mega88-1002, bootmon-1127, http://hp.vector.co.jp/authors/VA000177/html/A3C4A3EFA3F7A3EEA3CCA3EFA3E1A3E4.html
[3] WinAVR, http://sourceforge.net/projects/winavr/
[4] bootloadHID, http://www.obdev.at/products/vusb/bootloadhid.html
[5] SFCmini, http://kandk.cafe.coocan.jp/sfcmini/
[6] Arduino, http://www.switch-science.com/trac/wiki/Arduino-ja-jp
[7] dude-wrapng-2010-0531, http://www-ice.yamagata-cit.ac.jp/ken/senshu/sitedev/index.php?AVR%2FHIDaspx_news02
[8] USB直結Arduino互換ボード, http://www.geocities.jp/arduino_diecimila/make/usbasp/
(技術情報)
* main88rc.hexは、bootmon[2]のUSB接続ピンを変更したものです。モニタ機能はパソコン制御で用いられ、ブートローダー機能はマイコン制御プログラムの書き込みに用いられます。bootmon1127[2]のfirmwareフォルダで、bootloaderconfig.hとusbconfig.hとmain.cを差し替え、WinAVR20100110[3]でコンパイルしました(main88rc.bat)。
** hidmon88.dllは、hidmon-2010-0214[2]のdllフォルダで、hidmon-Mega88-1002[2]からportlist_mega88.hとportlist_2313.hをコピーし、portlist.hとportlist.cを差し替え、hidmon88.defを追加し、MinGWでコンパイルしたものです(dll88.bat)。dllファイルは、予めパスを設定したフォルダ(例えばC:\bin)に入れておきます。
*** bootloadHID.exeはオリジナル[4]ではなくbootmon[2]同梱のbootloadHID.exeを使います。
(1) 準備
表2. 使用する部品(作る物に応じて部品を選択します)
| 部品名・型番 | 数 | 備考(参考価格 他) |
| ブレッドボード EIC-801 | 1 | 秋月 @250 |
| ジャンパワイヤ EIC-J-L | 1 | 秋月 @300 |
| ジャンパワイヤ 15cm(白) | 1 | 秋月 @300 |
| 電池ボックス(単4×3) BH-431-1A150 | 1 | 秋月 @60 |
| 電池(単4) | 3 | ダイソー @10×3 |
| AVRマイコン ATmega328P | 1 | 秋月 @250 |
| タクトスイッチ | 1 | 秋月 @10 |
| LED 5mmφ 赤 | 2 | @10×2 |
| LED 5mmφ 緑 | 2 | @10×2 |
| LED 5mmφ 黄 | 1 | @10 |
| 数字表示LED C551SR | 1 | 秋月 @100 |
| 圧電ブザー SPT08 | 1 | 秋月 @50(ただし2個単位) |
| 積層セラミックコンデンサ 1μF | 1 | 秋月 @10(ただし10個単位) |
| カーボン抵抗 1kΩ(茶黒赤) | 2 | 秋月 @1×2(ただし100個単位) |
| カーボン抵抗 10kΩ(茶黒橙) | 1 | 秋月 @1×1(ただし100個単位) |
| ボリューム 10kΩB | 1 | 秋月 @50 |
| ボリューム用ツマミ ABS-28 | 1 | 秋月 @20 |
| CDSセル 5mmφ | 1 | 秋月 @40 |
| サーボモータ GWS PICO/STD/F | 1 | 秋月 @800 |
| USB接続モジュール | 1 | |
(2) LEDの点滅
LEDを点滅させます。
| パソコン制御 | マイコン制御 |
|
[blink.hta]
|
[blink.pde]
|
パソコンから切り離して動作させる場合は、USBアダプタをはずし、下図のように、電池(4.5V)を接続し、0番地から動作させるためのジャンパ線を接続します。
|
(3) LEDの明滅
LEDをだんだん明るくし、だんだん暗くし、これを繰り返します。
| パソコン制御 | マイコン制御 |
|
[fade.hta]
|
[fade.pde]
|
パソコンから切り離して動作させる場合は、USBアダプタをはずし、下図のように、電池(4.5V)を接続し、0番地から動作させるためのジャンパ線を接続します。
|
(4) スイッチでオンオフ制御
スイッチを押すと、LEDを点灯させます。パソコン制御では、マウスボタンを押してもLEDが点灯し、また、LEDの点灯と同時にパソコン画面も変化させます。
| パソコン制御 | マイコン制御 |
|
[sw.hta]
|
[sw.pde]
|
パソコンから切り離して動作させる場合は、USBアダプタをはずし、下図のように、電池(4.5V)を接続し、0番地から動作させるためのジャンパ線を接続します。
|
(5) アナログ入出力
ボリュームを回すと、それに応じてLEDの明るさを変化させます。パソコン制御では、同時に値(0〜1023)をパソコン画面に表示させます。
| パソコン制御 | マイコン制御 |
|
[analogio.hta]
|
[analogio.pde]
 |
パソコンから切り離して動作させる場合は、USBアダプタをはずし、下図のように、電池(4.5V)を接続し、0番地から動作させるためのジャンパ線を接続します。
|
(6) 楽譜の演奏
楽譜データを参照しながら演奏させます。
(7) 楽器
スイッチを押すと音が出ます。ボリュームを回して音階を調整します。
(8) カウントアップ
LEDの数字表示をカウントアップさせます。パソコン制御では、パソコン画面にも数字を表示させます。LEDの数字表示プログラムはPORTBを直接操作するようになっていて、Arduino風ではありません。
| パソコン制御 | マイコン制御 |
|
[countup.hta]
|
countup.pde
|
パソコンから切り離して動作させる場合は、USBアダプタをはずし、下図のように、電池(4.5V)を接続し、0番地から動作させるためのジャンパ線を接続します。
|
(9) スイッチ操作でカウントアップ
スイッチ操作でLEDの数字表示をカウントアップさせます。パソコン制御では、マウスのクリック操作でもカウントアップし、パソコン画面にも数字を表示させます。LEDの数字表示プログラムはPORTBを直接操作するようになっていて、Arduino風ではありません。
(10) アナログデジタル変換
ボリュームのアナログ値(0〜1023)に応じて、LEDに0〜9の数字を表示させます。パソコン制御では、パソコン画面にも数字を表示させます。LEDの数字表示プログラムはPORTBを直接操作するようになっていて、Arduino風ではありません。
| パソコン制御 | マイコン制御 |
|
[adc.hta]
|
adc.pde
|
パソコンから切り離して動作させる場合は、USBアダプタをはずし、下図のように、電池(4.5V)を接続し、0番地から動作させるためのジャンパ線を接続します。
|
(11) アナログデジタル変換(明るさセンサCDS)
(10)のボリュームを明るさセンサCDSに置き換えたもので、明るさを0〜9の数字で表示させます。プログラムは(10)と同じです。
| パソコン制御 | マイコン制御 |
|
[adc.hta]
|
adc.pde
|
パソコンから切り離して動作させる場合は、USBアダプタをはずし、下図のように、電池(4.5V)を接続し、0番地から動作させるためのジャンパ線を接続します。
|
(12) サーボモータの制御
サーボモータの位置を連続的に制御します。パソコン制御では、パソコン画面のバー表示も変化します。
| パソコン制御 | マイコン制御 |
|
[sweep.hta]
|
sweep.pde
|
パソコンから切り離して動作させる場合は、USBアダプタをはずし、下図のように、電池(4.5V)を接続し、0番地から動作させるためのジャンパ線を接続します。
|
(13) 押しボタン信号機
押しボタン信号機の制御をします。これを発展させた本格的な信号機(交通安全教室用)もあります。
| パソコン制御 | マイコン制御 |
|
|
[signal.hta]
|
signal.pde
|
パソコンから切り離して動作させる場合は、USBアダプタをはずし、下図のように、電池(4.5V)を接続し、0番地から動作させるためのジャンパ線を接続します。
|
(14) 押しボタン信号機(カッコー音付き)
押しボタン信号機の制御をします。パソコン制御では、パソコン画面の信号機表示が変化し、歩行者信号が青の時にパソコンから「カッコー」の音が出ます。マイコン制御では、歩行者信号が青の時に「カッコー」のブザー音が鳴ります。
koyama@cc.hirosaki-u.ac.jp