更新

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

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

 ここで、「パソコン制御」は、スイッチやセンサや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の読み取り
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, t)pin(12,13)に周波数freq(Hz), 長さt(ms)の矩形波出力
beep(freq, t)パソコンの内蔵ブザーに周波数freq(Hz), 長さt(ms)の矩形波出力
(ブザーが内蔵されていないノートPCなどで音が出ない)
delay(t)t(ms)スリープ
$(id)HTAオブジェクトのID参照(getElementByIdの短縮形)

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

 高速の入出力処理には適しません。また、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-2012-0326, http://www-ice.yamagata-cit.ac.jp/ken/senshu/sitedev/index.php?AVR%2FHIDaspx_news02
[5] SFCmini, http://kandk.cafe.coocan.jp/sfcmini/[1.0.5β]
[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マイコン ATtiny2313V/ATtiny43131秋月 @100 / DigiKey
タクトスイッチ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個単位)
音声合成LSI ATP3011F41秋月 @850
液晶モジュール1ストロベリーリナックス @1260
温度センサ STTS7511秋月 @100
GPSモジュール GT-723F1秋月 @2800
USB接続モジュール1 


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

ブレッドボードの準備
  1. ヒダピオボードをピンヘッダを介してブレッドボードに差し込みます。
  2. コネクタの「Gnd」をブレッドボードのGNDラインに接続します。
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-1.0.5[6]をインストールします。
  2. hardware.zipを解凍し、Arduino-1.0.5/hardwareに上書きします。これにより以下のことが行われます。
    • Arduino-1.0.5/hardware/arduinoフォルダにboards.txtを上書きコピー。
    • Arduino-1.0.5/hardware/tools/avr/binフォルダのavrdude.exeをavrdude_orig.exeに名前を変え、dude-wrap-2010-0517[7]のavrdude.exeをコピー。
    • hidspx-2012-0326[4]のhidspx.exeとhidspx.iniをarduino-1.0.5/hardware/tools/avr/binフォルダにコピー。
    • hardware/arduino/variantsフォルダにatmega328rcとattiny2313rcを追加。
    • hardware/arduino/cores/arduinoフォルダのHardwareSerial.cppの130行目の「PE」を「UPE」に修正。
    • 同フォルダにtone.cppを上書きコピー。
    • ***同フォルダにwiring_analog.cを上書きコピー(analogRead()とanalogWrite()に対応)。
    • ***同フォルダにservo.hを上書きコピー。
  3. ArduinoIDEを利用する場合は、Arduinoを起動し、[ファイル][環境設定]で「スケッチブックの保存場所」を所定の場所(例えばマイドキュメント下のArduinoフォルダ)にします。また、[ツール][マイコンボード]で「ATTINY2313(8MHz RC)」または「HIDapio - ATTINY2313(8MHz/RC)」(ヒダピオボードをライタとして使う場合)を選択します。Arduinoを起動し、プログラムを作成し、書き込み操作を行うと、プログラムが動作します。
  4. ArduinoIDEを利用しない場合は、a2313.batおよびarduino.batをパスの設定したフォルダ(例えばC:\bin)に入れ、a2313.batのショートカットをデスクトップなどに置いておきます。メモ帳でinoファイルを作成し、そのファイルアイコンを作成したショートカットにドラッグ&ドロップ操作すると、書き込み操作が行われ、プログラムが動作します。なお、inoファイルは例えば「c:\home\Arduino」など日本語やスペースを含まないフォルダに入れてください。

(2) LEDの点滅

 LEDを点滅させます。

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

参考: [blinkdx.hta]は、LEDの点滅と連動してパソコン画面の●も点滅する拡張版です。

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

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



(3) LEDの明滅

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

パソコン制御(ヒダピオ) マイコン制御
[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(240, 200); pinMode(ledPin, OUTPUT); } function loop(){ val+=d; analogWrite(ledPin, val); if(val==255) d=-1; else if(val==0) d=1; } </script> </head><body> <h3 align=center>LEDの明滅</h3> </body></html>

参考: [fadedx.hta]は、LEDの明滅と連動してパソコン画面のバー表示も変化する拡張版です。

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

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


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

 スイッチを押すと、LEDを点灯させます。
パソコン制御(ヒダピオ) マイコン制御
[sw.hta]
<html><head><title>スイッチ</title> <script src=hidmon.js></script> <script> var swPin=8, ledPin=12; function setup(){ window.resizeTo(240,200); pinMode(ledPin,OUTPUT); pinMode(swPin, INPUT); } function loop(){ if(digitalRead(swPin)==HIGH) digitalWrite(ledPin, HIGH); else digitalWrite(ledPin, LOW); } </script> </head><body> <h3 align=center>スイッチ</h3> </body></html>

参考: [swdx.hta]は、マウスボタンを押してもLEDが点灯し、また、LEDの点灯と同時にパソコン画面も変化させる拡張版です。

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

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


(6) 楽譜の演奏 1

 楽譜データを参照しながら演奏させます。パソコン制御で使用しているbeep関数はPC内蔵ブザーから指定した音を出しますが、ブザーを内蔵していないノートPCでは音が出ません。
パソコン制御(ヒダピオ) マイコン制御

プログラムサイズの関係でATtiny4313を使います。

[playnote.hta]
<html><head><title>楽譜の演奏</title> <script src=hidmon.js></script> <script> var Tempo=300; // テンポ(ms) var bzzPin=12, n=0, note; var Freq={ C4:262, C#4:277, D4:294, D#4:311, E4:330, F4:349, F#4:370, G4:392, G#4:415, A4:440, A#4:466, B4:494, C5:523, C#5:554, D5:587, D#5:622, E5:659, F5:698, F#5:740, G5:784, G#5:831}; // 楽譜...C〜BはC4〜B4, c〜gはC5〜g5 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(240, 180); pinMode(bzzPin, OUTPUT); } function loop(){ if(n<notes.length){ note=notes.charAt(n++); if(note=="R") delay(Tempo); else if(note!=" "){ if(note==note.toUpperCase()) note+="4"; // C〜BはC4〜B4 else note=note.toUpperCase()+"5"; // c〜gはc5〜g5 tone(bzzPin, Freq[note], Tempo); // 接続したブザー使用 } } } </script> </head><body> <h2 align=center>楽譜の演奏</h2> </body></html>

参考: [playnotedx.hta]は、画面に鍵盤が表示され、演奏中の鍵の色が変わる拡張版です。

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

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


(7) 楽器

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

パソコン制御(ヒダピオ) マイコン制御
[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を起動し、instrument2313.inoを作成し、書き込み操作を行います。

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


(8) カウントアップ

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

パソコン制御(ヒダピオ) マイコン制御
[countup.hta]
<html><head><title>カウントアップ</title> <script src=hidmon.js></script> <script> var count=0; // 0 1 2 3 4 5 6 7 8 9 var LED=new Array(0x3f, 0x06, 0x5b, 0x4f, 0x66, 0x6d, 0x7d, 0x27, 0x7f, 0x67); function setup(){ window.resizeTo(240, 200); poke(DDRB, 0xff); } function loop(){ poke(PORTB,LED[count]); delay(500); if(++count==10) count=0; } </script> </head><body> <h2 align=center>カウントアップ</h2> </body></html>

参考: [countupdx.hta]はLEDのカウントアップと連動してパソコン画面のカウントアップ値とバー表示が変化する拡張版です。

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

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


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

 スイッチ操作でLEDの数字表示をカウントアップさせます。パソコン制御では、マウスのクリック操作でもカウントアップし、パソコン画面にも数字を表示させます。LEDの数字表示プログラムはPORTBを直接操作するようになっていて、Arduino風ではありません。
パソコン制御(ヒダピオ) マイコン制御
[countupsw.hta]
<html><head><title>カウントアップ</title> <script src=hidmon2.js></script> <script> var swPin=0; var count=0, swMemo; var LED=new Array(0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x27,0x7f,0x67); function setup(){ window.resizeTo(240, 200); pinMode(swPin, INPUT); poke(DDRB,0xff); poke(PORTB,LED[0]); swMemo=digitalRead(swPin); } function loop(){ var sw=digitalRead(swPin); if(sw!=swMemo && sw==HIGH){ count++; poke(PORTB,LED[count]); } swMemo=sw; } </script> </head><body> <h2 align=center>カウントアップ</h2> </body></html>

参考: [countupswdx.hta]は、マウスボタンを押してもカウントアップし、またLEDのカウントアップと連動してパソコン画面のカウント値とバー表示が変化する拡張版です。

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

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


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

 ボリュームのアナログ値(0〜1023)に応じて、LEDに0〜9の数字を表示させます。パソコン制御では、パソコン画面にも数字を表示させます。LEDの数字表示プログラムはPORTBを直接操作するようになっていて、Arduino風ではありません。
パソコン制御(ヒダピオ) マイコン制御
[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(240, 200); poke(DDRB,0xfc); poke(PORTB,LED[0]<<2); poke(DDRD,0x40); poke(PORTD,LED[0]); } function loop(){ var val=analogRead(analogPin); val=Math.floor(val/103); poke(PORTB,LED[val]<<2); poke(PORTD,LED[val]); } </script> </head><body> <h2 align=center>アナログデジタル変換</h1> </body></html>

参考: [adcdx.hta]は、LED表示と連動してパソコン画面の数字表示とバー表示が変化する拡張版です。

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

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

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


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

 (10)のボリュームを明るさセンサCDSに置き換えたもので、明るさを0〜9の数字で表示させます。プログラムは(10)と同じです。
パソコン制御(ヒダピオ) マイコン制御
[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(240, 200); poke(DDRB,0xfc); poke(PORTB,LED[0]<<2); poke(DDRD,0x40); poke(PORTD,LED[0]); } function loop(){ var val=analogRead(analogPin); val=Math.floor(val/103); poke(PORTB,LED[val]<<2); poke(PORTD,LED[val]); } </script> </head><body> <h2 align=center>アナログデジタル変換</h2> </body></html>

参考: [adcdx.hta]は、LED表示と連動してパソコン画面の数字表示とバー表示が変化する拡張版です。

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

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

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


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

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

パソコン制御(ヒダピオ) マイコン制御
[sweep.hta]
<html><head><title>サーボモータ</title> <script src=hidmon.js></script> <script> var pos=0, d=1; function setup(pos){ window.resizeTo(240, 200); servoAttach(12); } function loop(){ servoWrite(pos); pos+=d; if(pos==179) d=-1; else if(pos==0) d=1; delay(15); } </script> </head><body> <h2 align=center>サーボモータ</h2> </body></html>

参考: [sweepdx.hta]は、サーボモータの動きと連動してパソコン画面のバー表示が変化する拡張版です。

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

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


(13) 押しボタン信号機

 押しボタン信号機の制御をします。これを発展させた本格的な信号機(交通安全教室用)もあります。
パソコン制御(ヒダピオ) マイコン制御
[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.inoを作成し、書き込み操作を行います。

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


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

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

パソコン制御(ヒダピオ) マイコン制御
[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.inoを作成し、書き込み操作を行います。

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


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

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

パソコン制御(ヒダピオ) マイコン制御
[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.inoを作成し、書き込み操作を行います。

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

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

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

パソコン制御(ヒダピオ) マイコン制御
 
 

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

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

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

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

パソコン制御(ヒダピオ) マイコン制御
 
 

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

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

(18) モータカーの制御

 モータを2個使ったモータカーを制御します。パソコン制御では、パソコン画面の自動車が連動して動きます。

パソコン制御(ヒダピオ) マイコン制御
[motorcar.hta]
<html><head><title>モータの制御</title> <script src=hidmon.js></script> <script> function setup(){ window.resizeTo(240,200); poke(DDRB,0xff); delay(1000); } function stop(){ poke(PORTB,0x00);delay(1000);} function fwd(){stop(); poke(PORTB,0xa0);} function bwd(){stop(); poke(PORTB,0x50);} function right(){ // 1秒間停止し、1秒間右回転し、1秒間停止 stop(); poke(PORTB,0x90); delay(1000); stop(); } function left(){ // 1秒間停止し、1秒間左回転し、1秒間停止 stop(); poke(PORTB,0x60); delay(1000); stop(); } function loop(){ fwd(); // 前進 while(digitalRead(8)==LOW && !ENDFLAG) delay(10); // 衝突スイッチがオン(HIGH)まで待つ bwd(); delay(1000); right(); // 1秒後退して右回転 } </script> </head><body><h3 align=center>モーターの制御</h3></body></html>

参考: [motorcardx.hta]は、画面に自動車が表示され、制御と連動して画面上を動く拡張版です。

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

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

(19) 音声合成

 音声合成LSI(ATP3011F4)を使ってスピーカから合成音声を出します。

パソコン制御(ヒダピオ) マイコン制御
[talk.hta]
<html><head> <title>音声合成</title> <script src=hidmon.js></script> <script> var si=0; function setup(){ window.resizeTo(320, 200); SerialBegin(9600); SerialWrite(0x3f); // '?'を送信 delay(1000); talk(); } function loop(){} function talk(){ SerialPrintln($("TEXT").value); while(1){ delay(100); if(SerialAvailable()&&SerialRead()==0x3e) break; // '>'を待つ } } </script> </head><body> <h2 align=center>音声合成</h2> <input size=38 id=TEXT value="ju'nbi/o'-kei"> <button id=TALK onclick=talk()>TALK !</button> </body></html>

参考: [talkdx.hta]は、17種の音声がランダムに再生される拡張版です。

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

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

(20) 音声合成(I2C版)

 I2C版で音声合成LSIを使ってスピーカから合成音声を出します。

パソコン制御(ヒダピオ) マイコン制御
 
 

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

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

 なお、同じフォルダにi2c2313.hを置いておきます。

(21) 温度計(I2C版)

 I2C接続の温度センサ(STTS751)を使った温度計です。

パソコン制御(ヒダピオ) マイコン制御
 
 

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

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

 なお、同じフォルダにi2c2313.hを置いておきます。

(22) GPS時計

 GPSモジュール(GT-723F)を使った時計です。ただし、3Vでの使用は定格外です。まだ、プログラムサイズが少し大きいのでATtiny4313を使っています。

パソコン制御(ヒダピオ) マイコン制御
 
 

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

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

 なお、同じフォルダにi2c2313.hを置いておきます。


koyama@cc.hirosaki-u.ac.jp