内蔵を組み込んでみました。なんとか入りました。
ミーネン専用の赤外線受信ソフトを作成しました。受信部分はどこかで拾ってきたものです。コードを検出してポートを動かす部分は初心者が書いた羅列になっています、これでもちゃんと動くのでいいでしょ。 ポートはまだまだ余っているので、LEDチカチカとか、機銃の音だしとかできそうです・・・が、それはまた今度という事にして、とりあえずこれで完成とします。
// NEC専用受信器
#include
#define IR_IN 2 // IR Receiver
#define NEC 1
#define BUF_SIZE (512)
#define DATA 0
Servo servo; //サーボの名称を設定
void setup() {
pinMode( IR_IN , INPUT );
pinMode(3, OUTPUT);//RF
pinMode(4, OUTPUT);//RB
pinMode(5, OUTPUT);//RG
pinMode(6, OUTPUT);//LF
pinMode(7, OUTPUT);//LB
pinMode(8, OUTPUT);//LG
servo.attach(9);//サーボ割り当て
Serial.begin(115200);
}
void loop() {
unsigned long usec, nec_data = 0;
unsigned int i, n, irOffTime, minTime, aveCnt = 0, aveAdd = 0;
unsigned int irdata[ BUF_SIZE ], timeunit, leaderH, leaderL,
datalen;
unsigned int format = 0, hex = 0, sony_data = 0, sony_adrs =
0, sony_adrs_bit = 0;
boolean isvalid = true;
// ● 赤外線を感知するまで待つ
while( digitalRead( IR_IN ) == HIGH );
// ● 生データの取得
for( i=0; i < BUF_SIZE; ) {
usec = micros();
while( digitalRead( IR_IN ) == LOW ); // IR信号がONの時間を測定
irdata[ i] = micros() - usec;
irdata[++i] = 0;
usec = micros();
while( digitalRead( IR_IN ) == HIGH ) { // IR信号がOFFの時間を測定
irOffTime = micros() - usec;
if( irOffTime > 65000 ) goto ir_exit; // 信号途絶なら終了
}
irdata[i++] = irOffTime;
}
ir_exit:
// ● 時間単位を調べる
minTime = irdata[0]; // まず最小値を確認
for( i=0; irdata[i]; i++) minTime = min( minTime, irdata[i]);
for( i=0; irdata[i]; i++) { // 最小値の+50%までを時間単位とする
if( minTime * 3 / 2 > irdata[i] ) { aveAdd += irdata[i] - minTime; aveCnt++; }
}
timeunit = aveAdd / aveCnt + minTime;
if( timeunit < 300 ) return; // 時間単位が短すぎるときは異常と判断
// ● 時間単位でのデータに変換
for( i=0; irdata[i]; i++) irdata[i] = ( irdata[i] + timeunit/ 2 ) / timeunit;
// ● 解析しやすくするためにデータの整理
leaderH = irdata[0]; // リーダ部Highの長さ
leaderL = irdata[1]; // リーダ部Low の長さ
for( i=0;; i+=2) { // データ解析用にリーダ部とリピートを除去・整理
irdata[i] = irdata[i+2]; irdata[i+1] = irdata[i+3];
if( irdata[i+1] > 10 || irdata[i+1] == 0 ) { irdata[i+1] = 0; datalen = i / 2 + 1; break; }
}
if((leaderH > 14 || leaderH < 18) && leaderL == 8 ) { format = NEC; }
// ● フォーマット毎に結果を表示
switch( format ) {
case NEC: // ■ NECフォーマット
for( n=0; n < datalen - 1; n++) { // ストップビット手前まで繰り返し
nec_data |= ( (irdata[n*2+1]==1) ? 0UL : 1UL ) << n;
}
if( !isvalid ) break; // データに不具合があれば以降は表示しない
Serial.print( (nec_data >> 24) % 256 ); // コードを表示
//ここから
//停止 F3 243
if (( (nec_data >> 24) % 256 ) == 243) {
digitalWrite(3, LOW);
digitalWrite(4, LOW);
digitalWrite(5, LOW);
digitalWrite(6, LOW);
digitalWrite(7, LOW);
digitalWrite(8, LOW);
}
//前進 F5 245
if (( (nec_data >> 24) % 256 )== 245) {
servo.write(90);
digitalWrite(3, HIGH);
digitalWrite(4, LOW);
digitalWrite(5, HIGH);
digitalWrite(6, HIGH);
digitalWrite(7, LOW);
digitalWrite(8, HIGH);
}
//後進 F1 241
if (( (nec_data >> 24) % 256 ) == 241) {
servo.write(90);
digitalWrite(3, LOW);
digitalWrite(4, HIGH);
digitalWrite(5, HIGH);
digitalWrite(6, LOW);
digitalWrite(7, HIGH);
digitalWrite(8, HIGH);
}
//右前方旋回 F6 246
if (( (nec_data >> 24) % 256 ) == 246) {
servo.write(60);
digitalWrite(3, HIGH);
digitalWrite(4, LOW);
digitalWrite(5, LOW);
digitalWrite(6, HIGH);
digitalWrite(7, LOW);
digitalWrite(8, HIGH);
}
//右後方旋回 EF 239
if (( (nec_data >> 24) % 256 ) == 239) {
servo.write(60);
digitalWrite(3, LOW);
digitalWrite(4, HIGH);
digitalWrite(5, LOW);
digitalWrite(6, LOW);
digitalWrite(7, HIGH);
digitalWrite(8, HIGH);
}
//左前方旋回 F7 247
if (( (nec_data >> 24) % 256 ) == 247) {
servo.write(120);
digitalWrite(3, HIGH);
digitalWrite(4, LOW);
digitalWrite(5, HIGH);
digitalWrite(6, HIGH);
digitalWrite(7, LOW);
digitalWrite(8, LOW);
}
//左後方旋回 F0 240
if (( (nec_data >> 24) % 256 ) == 240) {
servo.write(120);
digitalWrite(3, LOW);
digitalWrite(4, HIGH);
digitalWrite(5, HIGH);
digitalWrite(6, LOW);
digitalWrite(7, HIGH);
digitalWrite(8, LOW);
}
//ここまで
break;
}
Serial.println("");
}
0 件のコメント:
コメントを投稿