2009.7.21-

HTAで利用するHIDmon(Windows専用)

小山智史(弘前大学)

○ 概要

 Irukaさん[1]やsehshuさん[2]が開発されたHIDmonをJAさん[3]が中学校技術科の制御教材に活用されているのを大変興味深く思い、HTAで利用できないものかと試してみました。試行錯誤中ですが、とりあえずご紹介まで。

 プログラムはWindowsに実装されているmshtaで解釈されるので、特別なソフトをインストールする必要がなく、すぐに実行できます。ただしhidmon2.js(tiny2313用)とhidmon88.js(mega328用)はSFC miniをインストールする必要があります。一方、hidmon1.js(tiny2313用)の場合、プログラム中のExecで黒い画面が表示されてしまいます。

 回路図は下記。tiny2313では、ファームウェアは[5]のmain-12.hex、パソコン側の制御プログラムは[6]のhidmon.dllを使用しました。mega328では、ファームウェアは[8]をベースに作成し、パソコン側の制御プログラムhidmon88.dllは[6][7]をベースに作成しました。(hidmon88.zip)

 dude-wrap[9]でbootloadHIDを利用できるようにしたところ、Arduinoからアップロードできるようになりました。

 写真右のブレッドボードは、[10]の実装を参考にしました。

↓ tiny2313使用↓ mega328使用↓ mega328(ブレッドボード)
概観 概観 概観 回路図 回路図 回路図

○ ライブラリ(tiny2313ではhidmon1.js, hidmon2.jsのいずれかを使用、mega328ではhidmon88.jsを使用)

 hidmon1.jsは、hidmon.exeを呼び出して入出力を行っています。また、hidmon2.jsは、SFC miniを使ってhidmon.dllを直接利用しています。(SFC miniについてはirukaさんから教えていただきました。)

ポートの変数定義... DDRB, PORTB, PINB, DDRD, PORTD, PIND, TCCR0A, TCCR0B, OCR0A, TCCR1A, TCCR1B, OCR1AH, OCR1AL
(hidmon88.jsのみ)→  ADMUX, ADCSRA, ADCL, ADCH, ADCSRB, DIDR0
poke(a,d)... アドレスaにデータdをセット
peek(PIND)... PINDの入力
sleep(t)... t(ms)スリープ

※ 以下のプログラムhidtest1.hta〜hidtest3.htaで、hidmon1.jsまたはhidmon88.jsを使う場合には次の箇所を変更してください。

<script src=hidmon2.js></script> → <script src=hidmon1.js></script> <script src=hidmon2.js></script> → <script src=hidmon88.js></script>

○ 出力(hidtest1.hta)

 「点灯」「消灯」「点滅」「カウントアップ」をクリックすると、7セグメントLEDの表示がそれぞれ変化します。

表示画面1
HIDtest1.hta:

○ 入力(hidtest2.hta)

 基板上のスイッチ操作(「カウントアップ」と「カウントダウン」)に応じて、基板上のLEDと画面にカウントを表示します。

表示画面2
HIDtest2.hta:

○ 演奏(hidtest3.hta)

 「ドレミー」をクリックすると「ドレミー」が、「下の楽譜を演奏」をクリックするとテキスト欄の任意の楽譜を演奏します。

表示画面3
HIDtest3.hta:

○ アナログ入力(mega328のみ hidtest4.hta, pong.hta)

 hidtest4.htaは基板上のボリュームを回すと、基板上のLEDと画面の数字が変化します。
 pong.htaはPONGゲームです。ボリュームを回してラケットを上端に移動するとゲーム開始です。

表示画面4 PONG表示画面
HIDtest4.hta:

私が頭に描くシナリオ

(1) パソコンプログラミング

(2) パソコン制御(パソコンプログラムの拡張)


パソコン制御 blink.hta: <html><head> <meta http-equiv="content-type" content="text/html; charset=_shift_jis"> <script src=hidmon88.js></script> <title>BLINK</title></head><body onload=setup()> <h3 align=center>BLINK</h3> <script> function setup(){ poke(DDRB,0xff); for(;;){ poke(PORTB,0xff); sleep(500); poke(PORTB,0x00); sleep(500); } } function loop(){ } </script> </body></html>

(3) 独立動作プログラム(開発と書き込み)


パソコン制御
リセットSWを押してbootmonを動かし、Arduinoのアップロード操作。
プログラムが書き込まれ、実行。

(4) 独立動作


独立動作 blink.c: #define F_CPU 12800000UL #include <avr/io.h> #include <util/delay.h> int main(){ DDRB=0xff; for(;;){ PORTB=0x00; _delay_ms(500); PORTB=0xff; _delay_ms(500); } }
bootloadHIDのコマンドライン操作でblink.hexを書き込み。
USBアダプタをはずし、PC2をグランドに接続して電池に接続。

(参考サイト)
[1] AVR_Monit, http://hp.vector.co.jp/authors/VA000177/html/AVR_Monit.html
[2] HIDmon掲示板, http://www-ice.yamagata-cit.ac.jp/ken/senshu/sitedev/index.php?AVR%2FHIDmon00
[3] JA制御 ヒダピオシステム, http://www.ne.jp/asahi/ja/asd/gijutu/HIDapio/
[4] SFC mini, http://kandk.cafe.coocan.jp/sfcmini/
[5] hidspx-2010-0413, http://hp.vector.co.jp/authors/VA000177/html/A3C4A3EFA3F7A3EEA3CCA3EFA3E1A3E4.html
[6] hidmon-2010-0214, http://hp.vector.co.jp/authors/VA000177/html/A3C4A3EFA3F7A3EEA3CCA3EFA3E1A3E4.html
[7] hidmon-Mega88-1002, http://hp.vector.co.jp/authors/VA000177/html/A3C4A3EFA3F7A3EEA3CCA3EFA3E1A3E4.html
[8] bootmon-ws172-bcc55, http://hp.vector.co.jp/authors/VA000177/html/A3C4A3EFA3F7A3EEA3CCA3EFA3E1A3E4.html
[9] dude-wrap-2010-0517, http://hp.vector.co.jp/authors/VA000177/html/A3C4A3EFA3F7A3EEA3CCA3EFA3E1A3E4.html
[10] USB直結Arduino互換ボード, http://www.geocities.jp/arduino_diecimila/make/usbasp/


koyama@cc.hirosaki-u.ac.jp