TAB シールドを使ったテレビ学習リモコン TAB シールドは、センサや LED、LCD、スピーカなどの電子部品 14 種類を持つ教材キットで、オープン ソースハードウェア Arduino の上に搭載し、さまざまなアイデアを具体化することができるものです。 ここでは、TAB シールド V2.0 を使ったテレビ学習リモコンのプログラミング を紹介します。 このプログラム(スケッチ)は、メインプログラムのほかに、外部 EEPOM 関 連スケッチ、I2C-LCD 関連スケッチ、それに3つの IR(赤外線リモコンと赤外 線 LED)関連スケッチの計6つのスケッチによって構成されています。 ここでは、メインスケッチのみの具体的な TV 学習リモコンの操作について紹 介していきます。 先に、右図のアナログセンサ切替スイッチを中央にしておいてください。 ■操作手順 ▼1)リモコン読込(TV リモコンの学習を TAB シールドで実施) TAB シールド上の赤外線受信リモコンと EEPROM によって、TV リモコンの学習(記憶)を行います。先に、タクトスイッチを押 したまま、電源を入れるか、リセットボタンを押したままのとき に、リモコン読込モードとなります。 (右写真の状態) 赤外線受信リモコン 赤外線 LED この状態で、TV のリモコンの赤外線 LED を、TAB シールドの赤 外線受信リモコンに向けて、 「電源 On/Off」、 「音量 Up」 、 「音量 Down」、 「選局 Up」 、 「選局 Down」の順で、読込んでいきます。 右の写真は、 「電源 On/Off」の読み込み状態です。TV リモコン の電源 On/Off を発信すると、つぎの読み込み状態に移動してい きます。順番は以下のとおりです。 LCD 画面表示の 1 行目は、 「IR Read」で、2 行目が以下のとおり と移っていきます。 ① ② ③ ④ ⑤ 「SW OnOff」 「VOL Up」 「VOL Down」 「CHN Up」 「CHN Down」 : 電源 On/Off :音量 UP :音量 DOWN :選局 UP :選局 DOWN ▼2)水平状態の設定 上記1)の終了か、電源を入れた状態やリセットボタンを押した 状態だけだと、右写真のような水平状態を設定するモードとなり ます。 水平状態と思ったところで、タクトスイッチを押してください。 これによって、水平状態の設定が終わります。 タクトスイッチ リセットボタン ▼3)コマンド設定(TV リモコン操作) コマンド設定状態は、三軸加速度センサの傾きによって、 「電源 On/Off」、 「音量 Up」 、 「音量 Down」 、 「選局 Up」 、 「選局 Down」 の何れかのコマンドを LCD に表示させ、タクトスイッチのボタ ンで赤外線 LED からコマンドを発光します。 水平状態だと、電源の On/Off、右に傾けると音量の Up/Down、 左に傾けると選局の Up/Down のモードとなります。 ① 「SW OnOff」 :水平状態 ② 「VOL Up」 :右傾き ③ 「VOL Down」 :右急傾き ④ 「CHN Up」 :左傾き ⑤ 「CHN Down」 :左急傾き LCD に表示されたコマンドを見ながら、タクトスイッチを押す ことで、コマンドが赤外線 LED から発光されます。 ■スケッチについて つぎに、プログラミングのスケッチ内容について簡単にご紹介します。 ここでは、setup 関数と loop 関数の2つについて、ご紹介します。 ▼1)setup 関数 「setup」関数では、初期設定、TV リモコンの 読み込み、それに水平状態の設定の3つを処理 しています。 上述した、TV リモコンの読み込みと、水平状態 の設定が、使うときに気にすべき処理となりま す。 この「setup」関数のフローチャートを右図に示 します。 ▼2) 「loop」関数 この「loop」関数では、3 軸加速度センサの値によって、コマンドがどのモードであるかを検出し、LCD にそのモードを表示させます。表示されたコマンドを確認し、タクトスイッチを押すことで、コマンド が実行されます。このコマンド実行とは、赤外線 LED から、具体的な TV リモコンと同じ信号が発信 致します。 下図に、 「loop」関数のフローチャートを掲載します。 上記の step 関数および loop 関数では、他にサブモジュールファイル(EEPROM 関連、LCD 関連、 赤外線リモコン関連)を利用しています。 平成 26 年 4 月吉日 タブレイン T.Takamoto ■TV の学習リモコンのメイン部分のスケッチ // TAB シールド V2.0 TV 学習リモコン // TABRAIN INC. 204.04.06 #include <Wire.h> #include <EEPROM.h> //#include <I2C_LCD.h> #define #define #define #define #define #define メインプログラム AccX_Pin A1//3軸加速度センサ(X 方向) AccY_Pin A2//3軸加速度センサ(Y 方向) AccZ_Pin A3//3軸加速度センサ(Z 方向) InfRim_Pin 11// Spk_Pin 9 But_Pin 2 #define Led2Pin 3 #define Led3Pin 4 #define Led4Pin 5 #define Led5Pin 6 #define Led6Pin 7 // #no.5 I2C_LCD set #define MAX_SIGNALS 16 const int IRInputPin = 11; const int IROutputPin = 7; // グローバル変数設定 volatile uint8_t *ir_out, *ir_in; uint8_t irout_bit, irout_port; // IROutputPin's PORT and Bit uint8_t irin_bit, irin_port; // IRInputPin's PORT and Bit uint16_t t_ldr_high, t_ldr_low; // Leader time [100uS] uint16_t t, t_min, t_max; // Basic time [10uS] uint16_t t_high, t_high_min, t_high_max; // High time [10uS] uint16_t t_low, t_low_min, t_low_max; // Low time [10uS] uint8_t count_signals; uint8_t signals[MAX_SIGNALS]; char pr[8]; char cmd[5][9] = { "SW OnOff","VOL Up ", "VOL Down","CHN Up ","CHN Down"}; long xc; int xxc; void setup() { pinMode(Spk_Pin,OUTPUT); pinMode(Led2Pin,OUTPUT); pinMode(Led3Pin,OUTPUT); pinMode(Led4Pin,OUTPUT); pinMode(Led5Pin,OUTPUT); pinMode(Led6Pin,OUTPUT); pinMode(But_Pin,INPUT_PULLUP); irout_bit = digitalPinToBitMask(IROutputPin); irout_port = digitalPinToPort(IROutputPin); irin_bit = digitalPinToBitMask(IRInputPin); irin_port = digitalPinToPort(IRInputPin); lcd_init();// I2C LCD 初期化 while(digitalRead(But_Pin)==LOW) { for(int i=0; i<5; i++) { lcd_setCursor(0,0); lcd_printStr("IR Read "); while(digitalRead(But_Pin)==LOW); // ボタン OFF まで待機 delay(300); lcd_setCursor(0,1); lcd_printStr(cmd[0,i]); while (! analyzeIR()) { lcd_setCursor(0,1); lcd_printStr("Read Err"); }; lcd_setCursor(0,0); lcd_printStr("IR GET "); delay(1000); } } } saveIR(i); lcd_setCursor(0,0); lcd_printStr("LevelSet");// 水平状態の設定 do{ xc=(long)analogRead(A1)*25/10.23-855; lcd_setCursor(0,1); xxc=xc; sprintf(pr,"Lv= %4d",xc);// 水平値表示 lcd_printStr(pr); delay(100); } while(digitalRead(But_Pin)==HIGH); delay(1000); xc=xxc; lcd_setCursor(0,0); lcd_printStr("set xc "); lcd_setCursor(0,1); sprintf(pr,"xc= %4d",xc); lcd_printStr(pr); delay(1000); void loop() { lcd_setCursor(0,0); lcd_printStr("COM"); lcd_setCursor(0,1); sprintf(pr,"xc= %4d",xc); lcd_printStr(pr); byte com=0; pinMode(But_Pin,OUTPUT); digitalWrite(But_Pin,HIGH); do{ long x=(long)analogRead(A1)*25/10.23-855 - xxc ; lcd_setCursor(4,0); sprintf(pr,"%4d",x); lcd_printStr(pr); digitalWrite(com+3,LOW); if(x>-21 && x<21) { com = 0; } else if( x>60 ) { com = 4; } else if( x>20 ) { com = 3; } else if( x<-60 ) { com = 2; } else if( x<-20 ) { com= 1; } else com=5; digitalWrite(com+3,HIGH); lcd_setCursor(0,1); lcd_printStr(cmd[0,com]); pinMode(But_Pin,INPUT_PULLUP); }while( digitalRead( But_Pin )==HIGH ); if( com<5 ) { loadIR(com); lcd_printStr(cmd[0,com]); // tone(Spk_Pin,200+com*100,100); loadIR(com); dumpIR(); controlIR(); controlIR(); } digitalWrite(com+3,LOW); } 以 上
© Copyright 2024 ExpyDoc