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

この広告は前回の更新から一定期間経過したブログに表示されています。更新すると自動で解除されます。