更新

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

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

 ここで、「パソコン制御」は、スイッチやセンサや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-5Arduinoの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プログラムの両方を書かなければいけませんが、この方法ではひとつのプログラムで済ますことができます。

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

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

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

  1. bootloadHIDは、USBを経由して、bootmon[2](ATmega328Pのブートローダー領域で動作しているブートローダー兼モニタプログラム)と通信し、ATmega328Pの0番地以降にコンパイルされたHEXプログラムを書き込みます。
  2. 書き込みが終了すると、自動的に0番地からプログラムを実行します。(同時に、USBの通信は行われなくなります)
  3. パソコンと切り離して動作させたい場合は、USBアダプタをはずして電池(4.5V)を接続し、0番地から動作させるためのジャンパ線(25番ピンとGND)を接続します。

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

  1. パソコンとUSB接続して用いる場合、一旦0番地からのプログラムが動作すると、モニタに戻ることができません。そのため、モニタプログラムに戻したい場合は、リセットスイッチを追加するか、USBケーブルを接続しなおす必要があります。
  2. パソコンと接続した状態では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.husbconfig.hmain.cを差し替え、WinAVR20100110[3]でコンパイルしました(main88rc.bat)。
** hidmon88.dllは、hidmon-2010-0214[2]のdllフォルダで、hidmon-Mega88-1002[2]からportlist_mega88.hとportlist_2313.hをコピーし、portlist.hportlist.cを差し替え、hidmon88.defを追加し、MinGWでコンパイルしたものです(dll88.bat)。dllファイルは、予めパスを設定したフォルダ(例えばC:\bin)に入れておきます。
*** bootloadHID.exeはオリジナル[4]ではなくbootmon[2]同梱のbootloadHID.exeを使います。


(1) 準備

表2. 使用する部品(作る物に応じて部品を選択します)
部品名・型番備考(参考価格 他)
ブレッドボード EIC-8011秋月 @250
ジャンパワイヤ EIC-J-L1秋月 @300
ジャンパワイヤ 15cm(白)1秋月 @300
電池ボックス(単4×3) BH-431-1A1501秋月 @60
電池(単4)3ダイソー @10×3
AVRマイコン ATmega328P1秋月 @250
タクトスイッチ1秋月 @10
LED 5mmφ 赤2@10×2
LED 5mmφ 緑2@10×2
LED 5mmφ 黄1@10
数字表示LED C551SR1秋月 @100
圧電ブザー SPT081秋月 @50(ただし2個単位)
積層セラミックコンデンサ 1μF1秋月 @10(ただし10個単位)
カーボン抵抗 1kΩ(茶黒赤)2秋月 @1×2(ただし100個単位)
カーボン抵抗 10kΩ(茶黒橙)1秋月 @1×1(ただし100個単位)
ボリューム 10kΩB1秋月 @50
ボリューム用ツマミ ABS-281秋月 @20
CDSセル 5mmφ1秋月 @40
サーボモータ GWS PICO/STD/F1秋月 @800
USB接続モジュール1 


パソコン制御マイコン制御
USBアダプタの準備

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

AVRマイコンATmega328Pの準備
  1. AVRマイコンATmega328Pにブートローダー兼モニタプログラムmain88rc.hex*を書き込みます。 (書き込み操作の例) C>hidspx -fl11110010 -fh11011000 -fx11111101 main88rc.hex
  2. ATmega328Pに、Arduino風にするためのシールを貼ります(テプラ用ファイル)。
ブレッドボードの準備
  1. ブレッドボードにAVRマイコンを差し込みます。
  2. ATmega328のVCC(7番ピン)をVCC(ブレッドボードの赤のライン)に接続します。
  3. ATmega328のGND(8番ピン)をGND(ブレッドボードの青のライン)に接続します。
  4. USBアダプタの VCC, GND, D+, D- の4つのピンを、ブレッドボードのVCC(赤のライン)、GND(青のライン)、D+(4番ピン)、D-(5番ピン)にそれぞれ差し込みます。接続ピンを間違えないよう十分注意してください。
パソコンの準備
  1. hidmon88.dll**をパスの設定したフォルダ(例えばC:\bin)に入れておきます。
  2. SFCmini[5]を解凍し、例えばC:\libに置き、パソコンのCPUに応じてinstall-INTELまたはinstall-AMDでインストールします。
  3. hidmon88.jsを、作成するHTAプログラムと同じ場所に置きます。
これで、JavascriptのプログラムからATmega328PのIOレジスタを読み書きすることができるようになります。ここでは、HTAプログラムを作成し、実行します。
パソコンの準備(2010.8.18 dude-wrapからdude-wrapngに変更しました)
  1. Arduino[6]をインストールします。
  2. dude-wrapng-2010-0531を解凍し、説明書に従い、Arduinoフォルダを所定の場所(マイドキュメントなど)にコピーします。また、bin/windowsフォルダのjarファイルをarduino-0018/libフォルダにコピーします。
  3. コピーしたArduino/hardware/MyArduino/boards.txt の末尾に以下を追加します。 ################################################### bootloadhid.name=bootloadHID/ATmega328P(12.8MHz RC) bootloadhid.upload.protocol=hidspx bootloadhid.upload.hidspx=c:\bin\bootloadhid.exe bootloadhid.upload.delay=-r bootloadhid.upload.maximum_size=28672 bootloadhid.upload.speed=19200 bootloadhid.build.mcu=atmega328p bootloadhid.build.f_cpu=12800000L bootloadhid.build.core=arduino bootloadhid.upload.disable_flushing=true ###################################################
  4. bootloadHID.exe***を所定の場所(上の記載ではC:\bin)にコピーします。別の場所に置く場合は、上の「bootloadhid.upload.hidspx=...」の記載をそれに合わせます。
  5. ArduinoIDEを利用する場合は、Arduinoを起動し、[ファイル][環境設定]で「スケッチブックの保存場所」を所定の場所(例えばマイドキュメント下のArduinoフォルダ)にします。また、[ツール][マイコンボード]で「bootloadHID/ATmega328P(12.8MHz RC)」を選択します。Arduinoを起動し、プログラムを作成し、書き込み操作を行うと、プログラムが動作します。
  6. ArduinoIDEを利用しない場合は、a328.batおよびarduino.batをパスの設定したフォルダ(例えばC:\bin)に入れ、a328.batのショートカットをデスクトップなどに置いておきます。メモ帳でpdeファイルを作成し、そのファイルアイコンを作成したショートカットにドラッグ&ドロップ操作すると、書き込み操作が行われ、プログラムが動作します。なお、pdeファイルは例えば「c:\home\Arduino」など日本語やスペースを含まないフォルダに入れてください。
 パソコンから切り離して動作させる場合は、USBアダプタをはずし、下図のように、電池(4.5V)を接続し、0番地から動作させるためのジャンパ線を接続します。

(2) LEDの点滅

 LEDを点滅させます。

パソコン制御マイコン制御
[blink.hta]
<html><head><title>LEDの点滅</title> <script src=hidmon88.js></script> <script> var ledPin=9; 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>
[blink.pde]
 パソコンから切り離して動作させる場合は、USBアダプタをはずし、下図のように、電池(4.5V)を接続し、0番地から動作させるためのジャンパ線を接続します。

(3) LEDの明滅

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

パソコン制御マイコン制御
[fade.hta]
<html><head><title>LEDの明滅</title> <script src=hidmon88.js></script> <script> var ledPin=9; 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>
[fade.pde]
 パソコンから切り離して動作させる場合は、USBアダプタをはずし、下図のように、電池(4.5V)を接続し、0番地から動作させるためのジャンパ線を接続します。

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

 スイッチを押すと、LEDを点灯させます。パソコン制御では、マウスボタンを押してもLEDが点灯し、また、LEDの点灯と同時にパソコン画面も変化させます。
パソコン制御マイコン制御
[sw.hta]
<html><head><title>Switch</title> <script src=hidmon88.js></script> <script> var swPin=0, ledPin=9; 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>
[sw.pde]
 パソコンから切り離して動作させる場合は、USBアダプタをはずし、下図のように、電池(4.5V)を接続し、0番地から動作させるためのジャンパ線を接続します。

(5) アナログ入出力

 ボリュームを回すと、それに応じてLEDの明るさを変化させます。パソコン制御では、同時に値(0〜1023)をパソコン画面に表示させます。

パソコン制御マイコン制御
[analogio.hta]
<html><head><title>アナログ入出力</title> <script src=hidmon88.js></script> <script> var ledPin=9, analogPin=0; function setup(){ window.resizeTo(310,200); pinMode(ledPin, OUTPUT); } function loop(){ var val=analogRead(analogPin); $("BAR").style.width=val/4; $("_BAR").style.width=(1023-val)/4; $("VAL").innerText=val; analogWrite(ledPin, val/4); delay(10); } </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>
[analogio.pde]
 パソコンから切り離して動作させる場合は、USBアダプタをはずし、下図のように、電池(4.5V)を接続し、0番地から動作させるためのジャンパ線を接続します。

(6) 楽譜の演奏

 楽譜データを参照しながら演奏させます。
パソコン制御マイコン制御
[playnote.hta]
<html><head><title>楽譜の演奏</title> <script src=hidmon88.js></script> <script> var Tempo=300, bzzPin=9, 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>
playnote.pde
 パソコンから切り離して動作させる場合は、USBアダプタをはずし、下図のように、電池(4.5V)を接続し、0番地から動作させるためのジャンパ線を接続します。

(7) 楽器

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

パソコン制御マイコン制御
[instrument.hta]
<html><head><title>楽器</title> <script src=hidmon88.js></script> <script> var bzzPin=9, swPin=0, analogPin=0; 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>
instrument.pde
 パソコンから切り離して動作させる場合は、USBアダプタをはずし、下図のように、電池(4.5V)を接続し、0番地から動作させるためのジャンパ線を接続します。

(8) カウントアップ

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

パソコン制御マイコン制御
[countup.hta]
<html><head><title>カウントアップ</title> <script src=hidmon88.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>
countup.pde
 パソコンから切り離して動作させる場合は、USBアダプタをはずし、下図のように、電池(4.5V)を接続し、0番地から動作させるためのジャンパ線を接続します。

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

 スイッチ操作でLEDの数字表示をカウントアップさせます。パソコン制御では、マウスのクリック操作でもカウントアップし、パソコン画面にも数字を表示させます。LEDの数字表示プログラムはPORTBを直接操作するようになっていて、Arduino風ではありません。
パソコン制御マイコン制御
[countupsw.hta]
<html><head><title>カウントアップ</title> <script src=hidmon88.js></script> <script> var swPin=0; 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>
countupsw.pde
 パソコンから切り離して動作させる場合は、USBアダプタをはずし、下図のように、電池(4.5V)を接続し、0番地から動作させるためのジャンパ線を接続します。

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

 ボリュームのアナログ値(0〜1023)に応じて、LEDに0〜9の数字を表示させます。パソコン制御では、パソコン画面にも数字を表示させます。LEDの数字表示プログラムはPORTBを直接操作するようになっていて、Arduino風ではありません。
パソコン制御マイコン制御
[adc.hta]
<html><head><title>アナログデジタル変換</title> <script src=hidmon88.js></script> <script> var analogPin=0; var LED=new Array(0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x27,0x7f,0x67); function setup(){ window.resizeTo(310,200); poke(DDRB,0xff); poke(PORTB,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]); } </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>
adc.pde
 パソコンから切り離して動作させる場合は、USBアダプタをはずし、下図のように、電池(4.5V)を接続し、0番地から動作させるためのジャンパ線を接続します。

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

 (10)のボリュームを明るさセンサCDSに置き換えたもので、明るさを0〜9の数字で表示させます。プログラムは(10)と同じです。
パソコン制御マイコン制御
[adc.hta]
<html><head><title>アナログデジタル変換</title> <script src=hidmon88.js></script> <script> var analogPin=0; var LED=new Array(0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x27,0x7f,0x67); function setup(){ window.resizeTo(310,200); poke(DDRB,0xff); poke(PORTB,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]); } </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>
adc.pde
 パソコンから切り離して動作させる場合は、USBアダプタをはずし、下図のように、電池(4.5V)を接続し、0番地から動作させるためのジャンパ線を接続します。

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

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

パソコン制御マイコン制御
[sweep.hta]
<html><head><title>サーボモータ</title> <script src=hidmon88.js></script> <script> var pos=0, d=1; function setup(pos){ window.resizeTo(310,200); servoAttach(9); } 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>
sweep.pde
 パソコンから切り離して動作させる場合は、USBアダプタをはずし、下図のように、電池(4.5V)を接続し、0番地から動作させるためのジャンパ線を接続します。

(13) 押しボタン信号機

 押しボタン信号機の制御をします。これを発展させた本格的な信号機(交通安全教室用)もあります。
パソコン制御マイコン制御
[signal.hta]
<html><head><title>信号機</title> <script src=hidmon88.js></script> <script> var swPin=0, RPin=8, YPin=7, GPin=6, RRPin=11, GGPin=10, 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>
signal.pde
 パソコンから切り離して動作させる場合は、USBアダプタをはずし、下図のように、電池(4.5V)を接続し、0番地から動作させるためのジャンパ線を接続します。

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

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

パソコン制御マイコン制御
[signalkakko.hta]
<html><head><title>信号機</title> <script src=hidmon88.js></script> <script> var swPin=0, RPin=8, YPin=7, GPin=6, RRPin=11, GGPin=10, 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>
signalkakko.pde
 パソコンから切り離して動作させる場合は、USBアダプタをはずし、下図のように、電池(4.5V)を接続し、0番地から動作させるためのジャンパ線を接続します。

koyama@cc.hirosaki-u.ac.jp