SSブログ

リモコン信号機 (プロトタイプ) [Arduino]

リモートコントロールでプラレールを操作するというアイデアはすでに製品化されています。

リモレール
http://www.kuwatec.co.jp/remorail/index.html
リモポイント
http://www.kuwatec.co.jp/remopoint/index.html
ミスターモーターマン商品紹介
http://www.b-brave.co.jp/m_shoukai.html

いずれも、そこそこ高価。できれば自作したいということで考えてみました。
自分でもできそうなことは、サーボモータで、ストップレールを操作すること。
今回は東芝テレビのリモコンの青ボタンでGO、赤ボタンでSTOPをしてみたいと思います。

singo_bb.jpg

<使ったパーツ>
ATTINY45V-DIP8
http://www.microfan.jp/shop/8_20.html
GWSサーボ PICO/STD/F(フタバ)
http://akizukidenshi.com/catalog/g/gM-01905/
赤外線リモコン受信モジュール PL-IRM2161-C438 (2個入)
http://akizukidenshi.com/catalog/g/gI-03292/
超高輝度5mm赤色LED[7cd60度]OSHR5161A-QR(10個入)
http://akizukidenshi.com/catalog/g/gI-01318/
超高輝度5mm青色LED[5cd60度]OSUB5161A-PQ(10個入)
http://akizukidenshi.com/catalog/g/gI-01322/

スケッチが ATtiny 13A には収まらなかったので、ATtiny 45V (8MHz駆動) を使いました。
リモコン受信モジュールは2.4Vから使えるものです。

// プラレール リモコン操作計画

#define LED_B   0          // LED (Blue)
#define LED_R   1          // LED (Red)
#define SERVO   2          // サーボモーター
#define IR_IN   4          // IR Receiver

void setup()  { 
  pinMode( IR_IN , INPUT );
  pinMode( LED_B, OUTPUT );
  pinMode( LED_R, OUTPUT );
  pinMode( SERVO, OUTPUT );
  setSignal(true);
}

void loop() {
  unsigned long irData;
  while( digitalRead( IR_IN ) == HIGH );    // 赤外線を感知するまで待つ(信号としてはLOWになるまで待つ)
  irData = getIrNec();
  if( irData == 0x8C73BF40 ) setSignal(true);    // 青信号でGO
  if( irData == 0x8B74BF40 ) setSignal(false);   // 赤信号でSTOP
}

void setSignal(boolean s) {
  digitalWrite( LED_B,  s );
  digitalWrite( LED_R, !s );
  for( unsigned int i=0; i<50; i++ ) {
    digitalWrite( SERVO, HIGH );
    delayMicroseconds( s ? 1000 : 2000 );
    digitalWrite( SERVO, LOW );
    delayMicroseconds( s ? 19000 : 18000 );
  }
}

unsigned long getIrNec() {
  unsigned long irData = 0x00000000, irOff;
  while( digitalRead( IR_IN ) == HIGH );    // 赤外線を感知するまで待つ(信号としてはLOWになるまで待つ)
  while( digitalRead( IR_IN ) == LOW );     // リーダ部をやりすごす
  for( unsigned int dig = 0; dig < 32; dig++ ) {  // データを32桁読み込む  
    irOff = pulseIn( IR_IN, HIGH );               // 赤外線消灯時間(信号としてはHIGHの時間)
    if( irOff > 10000 ) return 0UL;               // 信号途絶なら終了
    if( irOff >  1000 ) irData |= 1UL << dig;     // Data=1 とき
  }
    // ストップビットを確認しないかわりに、データビットの確認
  if( (byte)((irData>>16)^(irData>>24)) != 0xff ) return 0UL;
  return irData;
}

<動作の様子>

これを、ストップレールと組み合わせれば、リモート信号機にできるかな?


プラレール ストップレール(2本入・車止め2個付) R-08

プラレール ストップレール(2本入・車止め2個付) R-08

  • 出版社/メーカー: タカラトミー
  • メディア: おもちゃ&ホビー


nice!(0)  コメント(2)  トラックバック(0) 

nice! 0

コメント 2

ハギワラ

リモコン信号機 (プロトタイプ) [Arduino]
のスケッチに出てくる
delayMicroseconds( s ? 1000 : 2000 );
の「?」と「:」は
なにを意味しているのですか。
by ハギワラ (2022-08-08 23:16) 

お名前(必須)

条件演算子の三項演算子です。
s が true なら 1000、そうでなければ2000という感じです。
if文で書けばいいのですが、三項演算子だと行数が少なくなるので気に入ってます。
by お名前(必須) (2022-08-15 12:13) 

コメントを書く

お名前:
URL:
コメント:
画像認証:
下の画像に表示されている文字を入力してください。

トラックバック 0