1797497_10204896138064526_9096364330600019088_n
(伊勢ギークフェア2014出展時の写真)

ブロック型学習リモコン「Remote Blocks」です。

テレビやエアコンのリモコンの信号を「コピー」して使うことができる「学習リモコン」というものがありますが、
それをブロック型にしたものです。

好きなボタンの種類(十字キー、上下キーなど)のブロックを選び、つなぎあわせ、各ボタンに好きなリモコン信号を覚えさせることで、自分の好きなリモコンをつくることができます。

上記の写真の、ボタンがなにもついていないブロックに赤外線受光モジュールと赤外線LEDがついており、そのブロックにボタンのついたブロックをつなぎあわせていきます。
ボタンがなにもついていないブロックには赤外線受光モジュールと赤外線LED、ボタン電池(LR44 3つ)、主電源、信号の送受信中に光るLEDが含まれています。
ボタンがついているブロックには、それぞれマイコン(ATmega328P)が含まれており、それぞれのボタンの信号を覚えておくようになっています。

ブロックとブロックは、銅箔テープを貼った磁石でくっつけます。
磁石が4つありますが、それぞれ
・GND
・4.5V
・赤外線LED用出力ピン
・赤外線受光モジュール用入力ピン
となっています。
このとき、上の写真でいうと、ワンボタンブロックのボタンを押して、このボタンに割り当てられていた信号を出力したとき、銅箔テープを通って、十字キーブロックの出力ピンに電圧がかかることになってしまいます。
これを防ぐために、出力ピン用の銅箔とマイコンのあいだにはダイオードをはさんでいます。

マイコンのプログラミングはArduino IDE 1.0.5
基板の設計はEagle
基板の切削はRoland MODELA MDX-20 + fabmodules
筐体の設計はRhinoceros
筐体の制作はレーザーカッター(@TAKE-SPACE(FabLab浜松)
で行っています。


今後の課題

・電池がすぐ切れるので省電力化したい。
・小型化したい。
・ATmega328Pではなくてもっと小さくて安いマイコンを使いたい。
・秋月で買った赤外線LED、指向性が強くテレビやエアコンの受光部にまっすぐ向けないと反応しない。もっとラフにリモコンを持っても反応するようにしたい。
・浜松市北区新都田にあるローランドディージーという会社のMDX-540という3次元切削機でもっとかっこいい筐体をつくりたい。
・ブロックとブロックの連結部分は磁石だと心もとないので、イヤホンプラグ・ジャックなどを用いて、物理的にもっとしっかりとつながるようにしたい。複数のブロックをつなげても、一本のリモコンとして持てるようにしたい。


ソースコード(Arduino IDE 1.0.5)

#define IR_DATA_SIZE 768
byte ir_data[IR_DATA_SIZE];
unsigned int ir_index;
#define PIN_LED 13
#define PIN_IR_IN 9
#define PIN_IR_OUT 10
#define PIN_SWITCH 8 /* 5/6/7/8 */

unsigned long duration;
boolean flagShort, flagLong = false;

void setup(){
pinMode(PIN_IR_IN, INPUT);
pinMode(PIN_IR_OUT, OUTPUT);
pinMode(PIN_LED, OUTPUT);
pinMode(PIN_SWITCH, INPUT);
}

unsigned int analog_count = 0;
void loop(){

duration = pulseIn(PIN_SWITCH, HIGH, 10000000);

if (0 < duration && duration < 1000000){ // under 1 second flagShort = true; }else if(duration >= 3000000){ // of and over 3 seconds
flagLong = true;
}

if(flagLong == true){
digitalWrite(PIN_LED, true);
ir_read(PIN_IR_IN);
digitalWrite(PIN_LED, false);

flagLong = false;
}
if(flagShort == true){
digitalWrite(PIN_LED, true);
ir_write(PIN_IR_OUT);
digitalWrite(PIN_LED, false);

flagShort = false;
}
}

void ir_read(byte ir_pin){
unsigned int i, j;
for(i = 0; i < IR_DATA_SIZE; i++){ ir_data[i] = 0; } unsigned long now, last, start_at; boolean stat; start_at = micros(); while(stat = digitalRead(ir_pin)){ if(micros() – start_at > 2500000) return;
}
start_at = last = micros();
for(i = 0; i < IR_DATA_SIZE; i++){ for(j = 0; ; j++){ if(stat != digitalRead(ir_pin)) break; if(j > 65534) return;
}
now = micros();
ir_data[i] = (now – last)/100;
last = now;
stat = !stat;
}
}

void ir_print(){
unsigned int i;
for(i = 0; i < IR_DATA_SIZE; i++){
Serial.print(ir_data[i]);
if(ir_data[i] < 1) break;
Serial.print(“,”);
}
Serial.println();
}

void ir_write(byte ir_pin){
unsigned int i;
unsigned long interval_sum, start_at;
interval_sum = 0;
start_at = micros();
for(i = 0; i < IR_DATA_SIZE; i++){
if(ir_data[i] < 1) break;
interval_sum += ir_data[i] * 100;
if(i % 2 == 0){
while(micros() – start_at < interval_sum){
digitalWrite(ir_pin, true);
delayMicroseconds(6);
digitalWrite(ir_pin, false);
delayMicroseconds(8);
}
}
else{
while(micros() – start_at < interval_sum);
}
}
}


参考

橋本商会 http://shokai.org/blog/archives/8012
(こちらのソースコードをほぼそのまま使わせていただきました!ありがとうございます。)

@eiKatou Blog http://eikatou.net/blog/2012/07/1796/

赤外線リモコンの通信フォーマット http://elm-chan.org/docs/ir_format.html

広告