TAB シールドを使ったテレビ学習リモコン

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);
}
以
上