ダミーパルスボール

ロボカップジュニアのサッカーチャレンジで使う公式赤外線発光ボールと同等のパルス発光を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の基板を使い、ATMEGA328PArduinoブートローダーとスケッチを仕込む。
スケッチ修正時は、Duemilanoveのチップを外し、ICクリップでユニバーサル基板上のATMEGA328Pの1,2,3pinと電源を繋いで対応するので、修正用のピンヘッダとかは設けない。

適当に配線して、後で動作ったか忘れることが多いので、KiCadで回路図も残しておく。なかなか使い慣れない。