更新

Arduino風 パソコン制御とマイコン制御(ATtiny2313版)[ATmega328版はこちら]

小山智史(弘前大学)
 ここに記載した内容は、千秋さんirukaさんkumanさんと共同で取り組んでいるnutshellプロジェクトにより実現したものです。また、V-USB[1]をはじめとする多くの無償のツールと、たくさんの先人の努力の積み重ねにより実現したものです。心より感謝申し上げます。

 ここで、「パソコン制御」は、スイッチやセンサやLEDなどの入出力素子をパソコンにUSB接続し、パソコン側のプログラムで制御する方法です。また、「マイコン制御」は、パソコンと切り離して、マイコン単独で入出力素子を制御する方法です。

パソコン制御

 パソコンとUSB接続したATtiny2313のIOレジスタを読み書きします。プログラムは、HTAファイルの中にJavascript言語で記述します。プログラミングが容易になるように、そしてArduino風のプログラミングができるように、ライブラリhidmon.jsを作成しました(表1)。この方法により、外部入出力を伴うパソコンのアプリケーションソフトを、ホームページ作成の延長線上で、比較的容易に作成することができます。

表1. hidmon.jsで定義した定数と関数
定数
定数の名称内容
DDRB, PINB, PORTB,
DDRD, PIND, PORTD
外部入出力ポート
TCNT1H, TCNT1L,
TCCR1A, TCCR1B, TCCR1C,
OCR1AH, OCR1AL,
OCR1BH, OCR1BL,
ICR1H, ICR1L, TIMSK
タイマー関連レジスタ
UDR,
UCSRA, UCSRB,
UBRRH,UBRRL
シリアル通信関連レジスタ
HIGH, LOW, INPUT, OUTPUTピン入出力設定値
PB0-7, PD0-6Arduinoのpin番号
関数
関数の名称内容
poke(a,d)アドレスaにデータdをセット
peek(a)アドレスaの読み取り
sleep(t)t(ms)スリープ(プロセスが残る)
delay(ms)t(ms)スリープ(CPU負荷重い)
pinMode(pin, mode)pin(8-16)をmode(INPUT/OUTPUT)に
digitalWrite(pin,val)pin(8-16)をval(HIGH/LOW)に
digitalRead(pin)pin(8-16)の値(HIGH/LOW)を読み取り
analogWrite(pin,val)pin(12,13)をval(0〜255)に
pin(8-11,14-16)はvalが0〜127でLOW、128〜でHIGH
analogRead(pin)pin(10)の値(0〜1023)を読み取り
beginSerial(baud)シリアル送信の速度をbaudに
serialWrite(val)valをシリアル送信(ピンはD1(PD1))
servoAttach(pin)pin(12,13)をサーボモータに接続
servoWrite(deg)サーボモータの位置をdeg(0〜179)に
tone(pin, freq, ms)pin(12,13)に周波数freq, 長さmsの矩形波出力
$(id)HTAオブジェクトのID参照(getElementByIdの短縮形)

 下のプログラム例では、パソコン側の表示も連動させているために、その分マイコン制御(Arduino)と比べて少し長めのプログラムになっています。オリジナルのArduinoでは、計測値をパソコン画面に表示させようとすると、Arduinoのプログラムとパソコン側のProcessingプログラムの両方を書かなければいけませんが、この方法ではひとつのプログラムで済ますことができます。

 いくつかの問題があります。

  1. delay()関数を使うとCPUの負荷が重くなり、他の処理(例えば画面表示)が思うようにできません。代わりにsleep()を使うとタスクが終了せずに残ってしまいます。delay()を使わないプログラムにすれば良いわけですが、マイコン制御と対にするために、今はこのようにしています。
  2. 高速の入出力処理には適しません。Arduino風のプログラミングスタイルを可能にしていますが、loop()は10ms毎に呼び出される仕組みとなっていますのでご注意ください。
マイコン制御

 ArduinoIDEでプログラムを作り、書き込みます。

  1. マイコンは電池(3V)で動作します。
  2. HIDaspxライタ[4]でHEXプログラムを書き込みます。書き込みが終了すると、直ちにプログラムを実行します。

(参考サイト)
[1] V-USB, http://www.obdev.at/products/vusb/
[2] hidmon-2010-0214, http://hp.vector.co.jp/authors/VA000177/html/A3C4A3EFA3F7A3EEA3CCA3EFA3E1A3E4.html
[3] WinAVR, http://sourceforge.net/projects/winavr/
[4] hidspx-2011-0324, http://www-ice.yamagata-cit.ac.jp/ken/senshu/sitedev/index.php?AVR%2FHIDaspx_news02
[5] SFCmini, http://kandk.cafe.coocan.jp/sfcmini/
[6] Arduino, http://www.switch-science.com/trac/wiki/Arduino-ja-jp
[7] dude-wrap, 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/
[9] シンプルなA-Dコンパータ, http://elm-chan.org/docs/avr/avradc_j.html

(技術情報)
* main2313.batはATtiny2313(12MHz Xtal)のhexファイル作成用のバッチファイルです。
** hidmon.dllは予めパスを設定したフォルダ(例えばC:\bin)に入れておきます。
*** (10)(11)のAD変換は[9]を参考にしました。D9ピンにコンデンサを接続する必要があります。また、コンデンサの値はパソコン制御では0.1μF、マイコン制御では0.01μFと異なりますので注意してください。パソコン制御では値が多少不安定ですので目安程度に留まります。また、パソコン制御ではTimer1を使用しているため、PWMを使用するanalogWrite()と同時に利用することはできません。


(1) 準備

表2. 使用する部品(作る物に応じて部品を選択します)
部品名・型番備考(参考価格 他)
ヒダピオ学習回路 6530-7001TopMan @1785
ピンヘッダ(オスL型) 1×40(40P)1秋月 @50
ブレッドボード EIC-3011秋月 @150
ジャンパワイヤ EIC-J-L1秋月 @300
ジャンパワイヤ 15cm(白)1秋月 @300
電池ボックス(単3×2) BH-321-AS1秋月 @60
電池(単3)2ダイソー @10×2
AVRマイコン ATtiny2313V1秋月 @100
タクトスイッチ1秋月 @10
LED 5mmφ 赤2@10×2
LED 5mmφ 緑2@10×2
LED 5mmφ 黄1@10
数字表示LED C551SR1秋月 @100
圧電ブザー SPT081秋月 @50(ただし2個単位)
カーボン抵抗 1kΩ(茶黒赤)2秋月 @1×2(ただし100個単位)
カーボン抵抗 220Ω(赤赤茶)1秋月 @1×1(ただし100個単位)
ボリューム 10kΩB1秋月 @50
ボリューム用ツマミ ABS-281秋月 @20
CDSセル 5mmφ1秋月 @40
サーボモータ GWS PICO/STD/F1秋月 @800
クリスタル 12MHz1秋月 @50×1(ただし10個単位)
セラミックコンデンサ 22pF1秋月 @5×2(ただし20個単位)
USB接続モジュール1 


パソコン制御(ヒダピオ)パソコン制御(USBアダプタ)マイコン制御
ヒダピオボードの準備
  1. ヒダピオボード上の10本の1kΩの抵抗の足を切断します。これにより、8個のLEDは点灯しなくなります。これは無用な混乱を避けるために行うものです。
  2. コネクタにピン配置が分かるようにシールを貼ります。(テプラ用ファイル)。
  3. ピンヘッダ(オスL型)をコネクタに差し込みます。
  4. スライドスイッチを「IO」側にします。

ブレッドボードの準備
  1. ヒダピオボードをピンヘッダを介してブレッドボードに差し込みます。
  2. コネクタの「Gnd」をブレッドボードのGNDラインに接続します。
USBアダプタの準備

 下図は、USBアダプタの回路図と製作例です。この実装およびブレッドボードとの組み合わせについては[8]を参考にしました。

AVRマイコンATtiny2313の準備
  1. AVRマイコンATtiny2313にモニタプログラムsmall-12.hexを書き込みます。 (例) C>hidspx -fl11111111 -fh11011011 -fx11111111 small-12.hex
  2. ATtiny2313に、Arduino風にするためのシールを貼ります(テプラ用ファイル)。
ブレッドボードの準備
  1. ブレッドボードにAVRマイコンを差し込みます。
  2. ATtiny2313のGND(10番ピン)をブレッドボードのGNDラインに接続します。
  3. ATtiny2313のX2(4番ピン), X1(5番ピン)にクリスタル(12MHz)とコンデンサ(22pF×2個)を接続します。
  4. USBアダプタをブレッドボードに差し、GND, D+, D- の各ピンを、ブレッドボードのGNDライン、D+(7番ピン)、D-(8番ピン)にそれぞれ接続します。また、USBアダプタのVccをATtiny2313のVcc(20番ピン)に接続します。接続ピンを間違えないよう十分注意してください。

AVRマイコンATtiny2313の準備
  1. ATtiny2313に、Arduino風にするためのシールを貼ります(テプラ用ファイル)。
ブレッドボードの準備

ライタの準備
□ 専用ライタ

 HIDaspxライタを準備します。写真のライタは、配線を簡略化するためにICクリップを使っています。

□ ヒダピオライタ
 ヒダピオボードをライタとして利用する場合は、以下のように接続します。また、ボード上のスライドスイッチを「IO」と逆側にします。

(1) ジャンパワイヤで接続(最安)
(2) ICクリップ(サンハヤト STC-20A)で接続(オススメ)
(3) 20P ゼロプレッシャーICソケット(サトー電気)で接続(たくさんのAVRマイコンに書き込む場合にオススメ)
※ ライタソフトについては、下記の[パソコンの準備]参照
パソコンの準備
  1. hidmon.dll**をパスの設定したフォルダ(例えばC:\bin)に入れておきます。
  2. SFCmini[5]を解凍し、例えばC:\libに置き、パソコンのCPUに応じてinstall-INTELまたはinstall-AMDでインストールします。
  3. hidmon.jsを、作成するHTAプログラムと同じ場所に置きます。
これで、JavascriptのプログラムからATtiny2313のIOレジスタを読み書きすることができるようになります。ここでは、HTAプログラムを作成し、実行します。
パソコンの準備
  1. Arduino[6]をインストールします。
  2. dude-wrap-2010-0517[7]を解凍し、説明書に従い、arduino-0022/hardware/tools/avr/binフォルダの中にあるavrdude.exeをavrdude_orig.exeに名前を変えた後、解凍したavrdude.exeをこの場所にコピーします。また、Arduinoフォルダを所定の場所(マイドキュメントなど)にコピーします。
  3. ATtiny2313用にアレンジしたtone.cppをArduino/hardware/MyArduino/cores/attiny2313に置きます。関連して、WProgram.hをArduinoオリジナルのWProgram.hに置き換えます。
  4. Arduino/hardware/MyArduino/cores/attiny2313/wiring_analog.cをwiring_analog.cに置き換えます。analogRead()は現在ArduinoIDEからうまく呼び出せません(調査中)。メモ帳とドラッグ&ドロップによる方法ではうまくいきます。
  5. ATtiny2313用にアレンジしたservo.hをArduino/hardware/MyArduino/cores/attiny2313に置きます。
  6. hidspx-2011-0324[4]を解凍し、hidspx.exeとhidspx.iniをC:\binフォルダにコピーします。
  7. ヒダピオボードをライタとして利用する場合は、Arduino/hardware/MyArduino/boards.txtの末尾に以下を追加します。 ###################################################### hidapio.name=My Arduino(HIDapio - ATTINY2313(8MHz/RC)) hidapio.upload.protocol=hidspx hidapio.upload.delay=-php hidapio.upload.maximum_size=2048 hidapio.upload.speed=19200 hidapio.upload.disable_flushing=true hidapio.upload.hidspx=c:\bin\hidspx.exe hidapio.bootloader.low_fuses=0xe4 hidapio.bootloader.high_fuses=0x9d hidapio.bootloader.extended_fuses=0xff hidapio.bootloader.path=attiny2313 hidapio.bootloader.unlock_bits=0xFF hidapio.bootloader.lock_bits=0xCF hidapio.build.mcu=attiny2313 hidapio.build.f_cpu=8000000L hidapio.build.core=attiny2313 ######################################################
  8. ArduinoIDEを利用する場合は、Arduinoを起動し、[ファイル][環境設定]で「スケッチブックの保存場所」を所定の場所(例えばマイドキュメント下のArduinoフォルダ)にします。また、[ツール][マイコンボード]で「ATTINY2313(8MHz RC)」または「HIDapio - ATTINY2313(8MHz/RC)」(ヒダピオボードをライタとして使う場合)を選択します。Arduinoを起動し、プログラムを作成し、書き込み操作を行うと、プログラムが動作します。
  9. ArduinoIDEを利用しない場合は、a2313.batおよびarduino.batをパスの設定したフォルダ(例えばC:\bin)に入れ、a2313.batのショートカットをデスクトップなどに置いておきます。メモ帳でpdeファイルを作成し、そのファイルアイコンを作成したショートカットにドラッグ&ドロップ操作すると、書き込み操作が行われ、プログラムが動作します。なお、pdeファイルは例えば「c:\home\Arduino」など日本語やスペースを含まないフォルダに入れてください。

(2) LEDの点滅

 LEDを点滅させます。

パソコン制御(ヒダピオ)パソコン制御(USBアダプタ)マイコン制御
[blink.hta]
<html><head><title>LEDの点滅</title> <script src=hidmon.js></script> <script> var ledPin=12; function setup(){ window.resizeTo(310,200); pinMode(ledPin, OUTPUT); } function loop(){ digitalWrite(ledPin, HIGH); delay(500); digitalWrite(ledPin, LOW); delay(500); } </script> </head><body> <h3 align=center>LEDの点滅</h3> </body></html>

 ArduinoIDEを利用する場合は、Arduinoを起動し、blink.pdeを作成し、書き込み操作を行います。

 ArduinoIDEを利用しない場合は、メモ帳でblink.pdeを作成し、そのファイルアイコンを予め作成したa2313.batのショートカットにドラッグ&ドロップします。



(3) LEDの明滅

 LEDをだんだん明るくし、だんだん暗くし、これを繰り返します。

パソコン制御(ヒダピオ)パソコン制御(USBアダプタ)マイコン制御
[fade.hta]
<html><head><title>LEDの明滅</title> <script src=hidmon.js></script> <script> var ledPin=12; var val=0; d=1; function setup(){ window.resizeTo(310,200); pinMode(ledPin, OUTPUT); } function loop(){ val+=d; $("BAR").style.width=val; $("_BAR").style.width=255-val; analogWrite(ledPin, val); if(val==255) d=-1; else if(val==0) d=1; } </script> </head><body> <h3 align=center>LEDの明滅</h3> <span id=BAR style='height:50;background-color:brown'></span> <span id=_BAR style='height:50;background-color:lightgray'></span> </body></html>

 ArduinoIDEを利用する場合は、Arduinoを起動し、fade.pdeを作成し、書き込み操作を行います。

 ArduinoIDEを利用しない場合は、メモ帳でfade.pdeを作成し、そのファイルアイコンを予め作成したa2313.batのショートカットにドラッグ&ドロップします。


(4) スイッチでオンオフ制御

 スイッチを押すと、LEDを点灯させます。パソコン制御では、マウスボタンを押してもLEDが点灯し、また、LEDの点灯と同時にパソコン画面も変化させます。
パソコン制御(ヒダピオ)パソコン制御(USBアダプタ)マイコン制御
[sw.hta]
<html><head><title>Switch</title> <script src=hidmon.js></script> <script> var swPin=8, ledPin=12; var mouseMemo=0; function setup(){ window.resizeTo(310,200); document.body.onmousedown=function(){ mouseMemo=1; }; document.body.onmouseup=function(){ mouseMemo=0; }; document.oncontextmenu=function(){ return false; } pinMode(ledPin, OUTPUT); pinMode(swPin, INPUT); } function loop(){ if(mouseMemo || digitalRead(swPin)==HIGH){ $("SW").innerText="ON"; $("SW").style.color="BLACK"; document.bgColor="WHITE"; }else{ $("SW").innerText="OFF"; $("SW").style.color="WHITE"; document.bgColor="BLACK"; } if(mouseMemo||digitalRead(swPin)==HIGH) digitalWrite(ledPin,HIGH); else digitalWrite(ledPin,LOW); } </script> </head><body> <h3 align=center id=SW></h3> </body></html>

 ArduinoIDEを利用する場合は、Arduinoを起動し、sw.pdeを作成し、書き込み操作を行います。

 ArduinoIDEを利用しない場合は、メモ帳でsw.pdeを作成し、そのファイルアイコンを予め作成したa2313.batのショートカットにドラッグ&ドロップします。


(6) 楽譜の演奏 1

 楽譜データを参照しながら演奏させます。
パソコン制御(ヒダピオ)パソコン制御(USBアダプタ)マイコン制御
[playnote.hta]
<html><head><title>楽譜の演奏</title> <script src=hidmon.js></script> <script> var Tempo=300, bzzPin=12, n=0; var freqNote="CDEFGABcdefgR"; var freq=[262,294,330,349,392,440,494,523,587,659,698,784,1], Freq=new Array(); var notes="RDDBAGDR RDDBAGER REEcBAFR RdddcABR RDDBAGDR RDDBAGER REEcBAdd ddedcAGR dR BBBR BBBR BdGABRRR cccccBBB BAABAR dR BBBR BBBR BdGABRRR cccccBBB ddcAGR gR"; function setup(){ window.resizeTo(310,200); pinMode(bzzPin, OUTPUT); for(var i=0;i<freq.length;i++) Freq[freqNote.charAt(i)]=freq[i]; } function loop(){ var note=notes.charAt(n); $("NOTE").innerText=note; $("BAR").style.width=n*250/notes.length; if(note in Freq){ if(note!="R") tone(bzzPin, Freq[note], Tempo); else delay(Tempo); } if(++n==notes.length) n=0; } </script> </head><body> <h1 align=center>楽譜の演奏</h1> <span id=BAR></span><span id=NOTE></span> </body></html>

 ArduinoIDEを利用する場合は、Arduinoを起動し、playnote.pdeを作成し、書き込み操作を行います。

 ArduinoIDEを利用しない場合は、メモ帳でplaynote.pdeを作成し、そのファイルアイコンを予め作成したa2313.batのショートカットにドラッグ&ドロップします。


(7) 楽器

 スイッチを押すと音が出ます。ボリュームを回して音階を調整します。

パソコン制御(ヒダピオ)パソコン制御(USBアダプタ)マイコン制御
[instrument.hta]
<html><head><title>楽器</title> <script src=hidmon.js></script> <script> var bzzPin=12, swPin=8, analogPin=10; function setup(){ window.resizeTo(310,200); pinMode(bzzPin, OUTPUT); } function loop(){ var val=analogRead(analogPin); if(digitalRead(swPin)==HIGH) tone(bzzPin, val, 300); else noTone(bzzPin); } </script> </head><body> <h1 align=center>楽器</h1> </body></html>

 ArduinoIDEを利用する場合は、Arduinoを起動し、instrument.pdeを作成し、書き込み操作を行います。

 上記の方法ではanalogRead()をうまく呼び出せません(調査中)。以下の方法ではうまくいきます。

 ArduinoIDEを利用しない場合は、メモ帳でinstrument.pdeを作成し、そのファイルアイコンを予め作成したa2313.batのショートカットにドラッグ&ドロップします。


(8) カウントアップ

 LEDの数字表示をカウントアップさせます。パソコン制御では、パソコン画面にも数字を表示させます。LEDの数字表示プログラムはPORTBを直接操作するようになっていて、Arduino風ではありません。

パソコン制御(ヒダピオ)パソコン制御(USBアダプタ)マイコン制御
[countup.hta]
<html><head><title>カウントアップ</title> <script src=hidmon.js></script> <script> var count=0; var LED=new Array(0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x27,0x7f,0x67); function setup(){ window.resizeTo(310,200); poke(DDRB,0xff); } function loop(){ $("COUNT").innerText=count; $("BAR").style.width=count*25; $("_BAR").style.width=(10-count)*25; poke(PORTB,LED[count]); delay(500); if(++count==10) count=0; } </script> </head><body> <h1 align=center id=COUNT></h1> <span id=BAR style='height:50;background-color:brown'></span> <span id=_BAR style='height:50;background-color:lightgray'></span> </body></html>

 ArduinoIDEを利用する場合は、Arduinoを起動し、countup.pdeを作成し、書き込み操作を行います。

 ArduinoIDEを利用しない場合は、メモ帳でcountup.pdeを作成し、そのファイルアイコンを予め作成したa2313.batのショートカットにドラッグ&ドロップします。


(9) スイッチ操作でカウントアップ

 スイッチ操作でLEDの数字表示をカウントアップさせます。パソコン制御では、マウスのクリック操作でもカウントアップし、パソコン画面にも数字を表示させます。LEDの数字表示プログラムはPORTBを直接操作するようになっていて、Arduino風ではありません。
パソコン制御(ヒダピオ)パソコン制御(USBアダプタ)マイコン制御
[countupsw.hta]
<html><head><title>カウントアップ</title> <script src=hidmon.js></script> <script> var swPin=8; var count=0, swMemo, mouse=0, mouseMemo; var LED=new Array(0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x27,0x7f,0x67); function setup(){ window.resizeTo(310,200); document.body.onmousedown=function(){ mouse=1; }; document.body.onmouseup=function(){ mouse=0; }; document.oncontextmenu=function(){return false; }; pinMode(swPin, INPUT); poke(DDRB,0xff); poke(PORTB,LED[0]); swMemo=digitalRead(swPin); mouseMemo=mouse; $("_BAR").style.width=10*25; } function loop(){ var sw=digitalRead(swPin); if(sw!=swMemo && sw==HIGH || mouse!=mouseMemo && mouse==1){ count++; $("BAR").style.width=count*25; $("_BAR").style.width=(10-count)*25; $("COUNT").innerText=count; poke(PORTB,LED[count]); } swMemo=sw; mouseMemo=mouse; } </script> </head><body> <h1 align=center id=COUNT>0</h1> <span id=BAR style='height:50;background-color:brown'></span> <span id=_BAR style='height:50;background-color:lightgray'></span> </body></html>

 ArduinoIDEを利用する場合は、Arduinoを起動し、countupsw.pdeを作成し、書き込み操作を行います。

 ArduinoIDEを利用しない場合は、メモ帳でcountupsw.pdeを作成し、そのファイルアイコンを予め作成したa2313.batのショートカットにドラッグ&ドロップします。


(10) アナログデジタル変換

 ボリュームのアナログ値(0〜1023)に応じて、LEDに0〜9の数字を表示させます。パソコン制御では、パソコン画面にも数字を表示させます。LEDの数字表示プログラムはPORTBを直接操作するようになっていて、Arduino風ではありません。
パソコン制御(ヒダピオ)パソコン制御(USBアダプタ)マイコン制御
[adc.hta]
<html><head><title>アナログデジタル変換</title> <script src=hidmon.js></script> <script> var analogPin=10; var LED=new Array(0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x27,0x7f,0x67); function setup(){ window.resizeTo(310,200); poke(DDRB,0xfc); poke(PORTB,LED[0]<<2); poke(DDRD,0x40); poke(PORTD,LED[0]); } function loop(){ var val=analogRead(analogPin); $("BAR").style.width=val/4; $("_BAR").style.width=(1023-val)/4; val=Math.floor(val/103); VAL.innerText=val; poke(PORTB,LED[val]<<2); poke(PORTD,LED[val]); } </script> </head><body> <h1 align=center id=VAL></h1> <span id=BAR style='height:50;background-color:brown'></span> <span id=_BAR style='height:50;background-color:lightgray'></span> </body></html>

 変換値は多少不安定で、目安程度にとどまります。

 ArduinoIDEを利用する場合は、Arduinoを起動し、adc.pdeを作成し、書き込み操作を行います。

 上記の方法ではanalogRead()をうまく呼び出せません(調査中)。以下の方法ではうまくいきます。

 ArduinoIDEを利用しない場合は、メモ帳でadc.pdeを作成し、そのファイルアイコンを予め作成したa2313.batのショートカットにドラッグ&ドロップします。


(11) アナログデジタル変換(明るさセンサCDS)

 (10)のボリュームを明るさセンサCDSに置き換えたもので、明るさを0〜9の数字で表示させます。プログラムは(10)と同じです。
パソコン制御(ヒダピオ)パソコン制御(USBアダプタ)マイコン制御
[adc.hta]
<html><head><title>アナログデジタル変換</title> <script src=hidmon.js></script> <script> var analogPin=10; var LED=new Array(0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x27,0x7f,0x67); function setup(){ window.resizeTo(310,200); poke(DDRB,0xfc); poke(PORTB,LED[0]<<2); poke(DDRD,0x40); poke(PORTD,LED[0]); } function loop(){ var val=analogRead(analogPin); $("BAR").style.width=val/4; $("_BAR").style.width=(1023-val)/4; val=Math.floor(val/103); VAL.innerText=val; poke(PORTB,LED[val]<<2); poke(PORTD,LED[val]); } </script> </head><body> <h1 align=center id=VAL></h1> <span id=BAR style='height:50;background-color:brown'></span> <span id=_BAR style='height:50;background-color:lightgray'></span> </body></html>

 変換値は多少不安定で、目安程度にとどまります。

 ArduinoIDEを利用する場合は、Arduinoを起動し、adc.pdeを作成し、書き込み操作を行います。

 上記の方法ではanalogRead()をうまく呼び出せません(調査中)。以下の方法ではうまくいきます。

 ArduinoIDEを利用しない場合は、メモ帳でadc.pdeを作成し、そのファイルアイコンを予め作成したa2313.batのショートカットにドラッグ&ドロップします。


(12) サーボモータの制御

 サーボモータの位置を連続的に制御します。パソコン制御では、パソコン画面のバー表示も変化します。

パソコン制御(ヒダピオ)パソコン制御(USBアダプタ)マイコン制御
[sweep.hta]
<html><head><title>サーボモータ</title> <script src=hidmon.js></script> <script> var pos=0, d=1; function setup(pos){ window.resizeTo(310,200); servoAttach(12); } function loop(){ $("BAR").style.width=pos; $("_BAR").style.width=180-pos; servoWrite(pos); pos+=d; if(pos==179) d=-1; else if(pos==0) d=1; delay(15); } </script> </head><body> <h1 align=center>サーボモータ</h1> <span id=BAR style='height:50;background-color:brown'></span> <span id=_BAR style='height:50;background-color:lightgray'></span> </body></html>

 ArduinoIDEを利用する場合は、Arduinoを起動し、sweep.pdeを作成し、書き込み操作を行います。

 ArduinoIDEを利用しない場合は、メモ帳でsweep.pdeを作成し、そのファイルアイコンを予め作成したa2313.batのショートカットにドラッグ&ドロップします。


(13) 押しボタン信号機

 押しボタン信号機の制御をします。これを発展させた本格的な信号機(交通安全教室用)もあります。
パソコン制御(ヒダピオ)パソコン制御(USBアダプタ)マイコン制御
[signal.hta]
<html><head><title>信号機</title> <script src=hidmon.js></script> <script> var swPin=8, RPin=16, YPin=15, GPin=14, RRPin=10, GGPin=9, swMemo; function carsig(g,y,r){ digitalWrite(GPin,g); digitalWrite(YPin,y); digitalWrite(RPin,r); } function mansig(r,g){ digitalWrite(RRPin,r); digitalWrite(GGPin,g);} function setup(){ window.resizeTo(310,200); pinMode(RPin, OUTPUT);pinMode(YPin, OUTPUT);pinMode(GPin, OUTPUT); pinMode(RRPin,OUTPUT);pinMode(GGPin,OUTPUT);pinMode(swPin,INPUT); carsig(HIGH,LOW,LOW); mansig(HIGH,LOW); // 車青 歩赤 } function loop(){ var sw=digitalRead(swPin); if(sw!=swMemo && sw==HIGH){ delay(4000); carsig(LOW,HIGH,LOW); delay(4000); // 車黄4秒 carsig(LOW,LOW,HIGH); mansig(LOW,HIGH); // 車赤 歩青16秒 delay(16000); for(var i=0;i<8;i++){ // 歩青点滅8秒 mansig(LOW,HIGH); delay(500); mansig(LOW,LOW); delay(500); } mansig(HIGH,LOW); delay(4000); // 歩赤4秒 carsig(HIGH,LOW,LOW); // 車青 } swMemo=sw; } </script> </head><body> <h3 align=center>信号機</h3> </body></html>

 ArduinoIDEを利用する場合は、Arduinoを起動し、signal.pdeを作成し、書き込み操作を行います。

 ArduinoIDEを利用しない場合は、メモ帳でsignal.pdeを作成し、そのファイルアイコンを予め作成したa2313.batのショートカットにドラッグ&ドロップします。


(14) 押しボタン信号機(カッコー音付き)

 押しボタン信号機の制御をします。パソコン制御では、パソコン画面の信号機表示が変化し、歩行者信号が青の時にパソコンから「カッコー」の音が出ます。マイコン制御では、歩行者信号が青の時に「カッコー」のブザー音が鳴ります。

パソコン制御(ヒダピオ)パソコン制御(USBアダプタ)マイコン制御
[signalkakko.hta]
<html><head><title>信号機</title> <script src=hidmon.js></script> <script> var swPin=8, RPin=16, YPin=15, GPin=14, RRPin=10, GGPin=9, swMemo, t=0; function sndPlay(sndfile){ $("BGSND").src=sndfile;} function carsig(g, y, r){ digitalWrite(GPin,g); digitalWrite(YPin,y); digitalWrite(RPin,r); $("G").style.color=(g==HIGH?"lightgreen":"#003200"); $("Y").style.color=(y==HIGH?"yellow":"#a0a000"); $("R").style.color=(r==HIGH?"red":"darkred"); } function mansig(r, g){ digitalWrite(RRPin,r); digitalWrite(GGPin,g); $("RR").style.color=(r==HIGH?"red":"darkred"); $("GG").style.color=(g==HIGH?"lightgreen":"#003200"); } function setup(){ window.resizeTo(310,200); pinMode(RPin, OUTPUT); pinMode(YPin, OUTPUT); pinMode(GPin, OUTPUT); pinMode(RRPin,OUTPUT); pinMode(GGPin,OUTPUT); pinMode(swPin,INPUT); carsig(HIGH,LOW,LOW); mansig(HIGH,LOW); //車青 歩赤 } function loop(){ // 10ms毎に呼び出される var sw=digitalRead(swPin); if(t==0 && sw!=swMemo && sw==HIGH) t++; else if(t>0){ t++; if(t==400) carsig(LOW,HIGH,LOW); //車黄 else if(t==800){carsig(LOW,LOW,HIGH); mansig(LOW,HIGH);} //車赤 歩青 else if(t==801||t==1000||t==1200||t==1400||t==1600) sndPlay("kakko1.wav"); else if(t==1800||t==1900||t==2000||t==2100||t==2200) mansig(LOW,HIGH); else if(t==1850||t==1950||t==2050||t==2150||t==2250) mansig(LOW,LOW); else if(t==2300) mansig(HIGH,LOW); //歩赤 else if(t==2700){ carsig(HIGH,LOW,LOW); t=0;} //車青 } swMemo=sw; } </script> </head><body> <center> <table cellpadding=4><tr><td valign=top> <table border=1 cellspacing=0 cellpadding=1> <tr><td bgcolor=grey><big><big> <span id=RR>■</span><br><span id=GG>■</span> </big></big></td></tr></table> </td><td valign=top> <table border=1 cellspacing=0 cellpadding=6> <tr><td bgcolor=grey><big><big><big> <span id=R>●</span><br> <span id=Y>●</span><br> <span id=G>●</span> </big></big></big></td></tr></table> </td></tr></table> </center> <bgsound id=BGSND loop=1 src='about:blank'> </body></html>

 ArduinoIDEを利用する場合は、Arduinoを起動し、signalkakko.pdeを作成し、書き込み操作を行います。

 ArduinoIDEを利用しない場合は、メモ帳でsignalkakko.pdeを作成し、そのファイルアイコンを予め作成したa2313.batのショートカットにドラッグ&ドロップします。


(15) 楽譜の演奏 2 (Midi楽器の制御)

 Midi楽器を制御します。マイコン制御の内容は「ジングルベル」のページと同じです(鈴付き!!)。

パソコン制御(ヒダピオ)パソコン制御(USBアダプタ)マイコン制御
[midi.hta]
<html><head><title>Midi制御</title> <script src=hidmon.js></script> <script> var VOICE=["Vibraphone","Marimba","Xylophone","Tubular Bells","Dulcimer","Drawbar Organ"]; var freqNote="CDEFGABcdefgZzR"; var freq=[60,62,64,66,67,69,71,72,74,76,78,79,125,126,127], Freq=new Array(); var notes="RDDBAGDR RDDBAGER REEcBAFR RdddcABR RDDBAGDR RDDBAGER REEcBAdd ddedcAGR dR BBBR BBBR BdGABRRR cccccBBB BAABAR dR BBBR BBBR BdGABRRR cccccBBB ddcAGR gR"; var Tempo=300, voice=11, n=0; function noteOn(data1, data2){ serialWrite(0x90); serialWrite(Freq[data1]); serialWrite(data2); } function setup(){ window.resizeTo(310,200); beginSerial(31250); for(var i=0;i<freq.length;i++) Freq[freqNote.charAt(i)]=freq[i]; $("VOICE").innerText=VOICE[voice-11]; serialWrite(0xc0); serialWrite(voice); } function loop(){ var note=notes.charAt(n); if(note in Freq){ if(note!="R"){ noteOn(note,0x70); delay(Tempo); noteOn(note,0x00); }else delay(Tempo); } if(++n==notes.length){ n=0; if(++voice>16) voice=11; $("VOICE").innerText=VOICE[voice-11]; serialWrite(0xc0); serialWrite(voice); delay(Tempo*8); } } </script> </head><body> <h1 align=center id=VOICE></h1> <div></div> </body></html>

 ArduinoIDEを利用する場合は、Arduinoを起動し、midi.pdeを作成し、書き込み操作を行います。

 ArduinoIDEを利用しない場合は、メモ帳でmidi.pdeを作成し、そのファイルアイコンを予め作成したa2313.batのショートカットにドラッグ&ドロップします。

(16) 楽譜の演奏 3 (ドラム)

 (6)にドラムを追加してみました。現在、マイコン制御のみです。構想は野尻抱介氏のリズムボット(Make, vol.06, p37)を参考にしました。レパートリーは「大きなたいこ」「ジングルベル」「大きな古時計」「ハッピーバースデー」「クリスタルチルドレン」「附属特別支援学校校歌」...。詳しくはミニドラム・ミニ鉄琴のページを参照してください。

パソコン制御(ヒダピオ)パソコン制御(USBアダプタ)マイコン制御
   
 

 ArduinoIDEを利用する場合は、Arduinoを起動し、drum.pdeを作成し、書き込み操作を行います。

 ArduinoIDEを利用しない場合は、メモ帳でdrum.pdeを作成し、そのファイルアイコンを予め作成したa2313.batのショートカットにドラッグ&ドロップします。

(17) 楽譜の演奏 4 (鉄琴)

 おもちゃの鉄琴を演奏させてみました。現在、マイコン制御のみです。レパートリーは「ハッピーバースデー」...。詳しくはミニドラム・ミニ鉄琴のページを参照してください。

パソコン制御(ヒダピオ)パソコン制御(USBアダプタ)マイコン制御
   
 

 ArduinoIDEを利用する場合は、Arduinoを起動し、tekkin.pdeを作成し、書き込み操作を行います。

 ArduinoIDEを利用しない場合は、メモ帳でtekkin.pdeを作成し、そのファイルアイコンを予め作成したa2313.batのショートカットにドラッグ&ドロップします。


koyama@cc.hirosaki-u.ac.jp