ダミーパルスボール
ロボカップジュニアのサッカーチャレンジで使う公式赤外線発光ボールと同等のパルス発光をArduinoで真似る。
これまで使っていなかったが勉強のため、割り込みを使う。TimerOneライブラリで引数指定できる割り込みタイミングは long なので、12.5usecが指定できるように、引数をlongからdoubleに変えてTimerOne::initialize()をコピーしている。
digitalWrite()は遅いというのをどこかで見た覚えがあり、digitalWrite()を使わない記法をググって実装してみると、うまいこと動くようになった。digitalWrite()を使っているときは、パルスボールセンサーとしてつかっているリモコン受光モジュールが意図する反応をしてくれないときがあった。
/** * ダミーパルスボール * 2013-01 * * 電源 3V, 赤外線LED順電圧の実測 1.1V * FULL 51Ω 37.3mA D5 PD5 * 1/4 200Ω 9.5mA D6 PD6 * 1/16 820Ω 2.3mA D7 PD7 * 1/64 3.3KΩ 0.6mA D8 PB0 * * @link http://www.elekit.co.jp/pdf/RCJ-05%20waveform_j.pdf */ #include <TimerOne.h> #define LED_IR0 5 #define LED_IR1 6 #define LED_IR2 7 #define LED_IR3 8 int pulse = 0; void setup() { pinMode(LED_IR0, OUTPUT); pinMode(LED_IR1, OUTPUT); pinMode(LED_IR2, OUTPUT); pinMode(LED_IR3, OUTPUT); //digitalWrite(LED_IR0, HIGH); //digitalWrite(LED_IR1, HIGH); //digitalWrite(LED_IR2, HIGH); //digitalWrite(LED_IR3, HIGH); PORTD = 0xe0; PORTB = 0x01; Timer1.initialize(12.5); Timer1.attachInterrupt( timerIsr ); } void loop() { } void timerIsr() { if (pulse & 1) { PORTD = 0xe0; PORTB = 0x01; } else if (pulse < 16) { // FULL //digitalWrite(LED_IR0, (pulse & 1)); PORTD = 0xc0; } else if (pulse < 24) { // 1/4 //digitalWrite(LED_IR1, (pulse & 1)); PORTD = 0xa0; } else if (pulse < 32) { // 1/16 //digitalWrite(LED_IR2, (pulse & 1)); PORTD = 0x60; } else if (pulse < 40) { // 1/64 //digitalWrite(LED_IR3, (pulse & 1)); PORTB = 0x00; } else { // OFF } pulse++; if (pulse > 66) pulse = 0; } //割り込み未使用版 void loop2() { int i; //FULL for (i = 0; i < 8; i++) { digitalWrite(LED_IR0, LOW); delayMicroseconds(12); digitalWrite(LED_IR0, HIGH); delayMicroseconds(12); } delayMicroseconds(100); // 1/4 delayMicroseconds(100); // 1/16 delayMicroseconds(100); // 1/64 delayMicroseconds(346); // OFF }
ブレッドボード上でとりあえず動くようになったので、ユニバーサル基板に実装する。持ち運びしやすいよう在庫の電池ケースに仕込む。上部LEDは電源確認用、赤外線LEDはケース裏側に出す。電池ケースを立てて使えるようにした。
Arduino Duemilanoveの基板を使い、ATMEGA328PにArduinoのブートローダーとスケッチを仕込む。
スケッチ修正時は、Duemilanoveのチップを外し、ICクリップでユニバーサル基板上のATMEGA328Pの1,2,3pinと電源を繋いで対応するので、修正用のピンヘッダとかは設けない。