• 車種別
  • パーツ
  • 整備手帳
  • ブログ
  • みんカラ+
イイね!
2016年01月30日

赤外線リモコンで遠隔操作

赤外線リモコンで遠隔操作 先日の赤外線リモコンの解析から、入力されたビットデータから、キーコマンドのLCD表示と、ステッピングモーターの駆動を実践してみました。
今までやってきた、LCD表示と、ステッピングモーター駆動と、赤外線リモコンのプログラムを全部混ぜてやってみた感じですw

参考にさせてもらったサイトはこちら

参考サイトのサンプルスケッチだと、シリアルモニターにキー入力の値を表示をさせるようになってますが、そこのcase構文を書き換えて、LCDの表示コマンド「lcd.print」に表示内容を渡してます。
で、NEXT,PREVボタンで正回転、逆回転(1回転)を
VOL+,VOL-ボタンでステッピング(32/2048ステップ)動作をするように出力関数を持たせています。



・・・スマホで録画だからブレブレですね・・・まぁDV売っちゃったしなぁ・・・
これでリモコンの入力から出力制御まで出来るようになりました。
赤外線のデータ解析が出来るようになったので、たとえば、内蔵するモニターのリモコンボタンで、ある程度コマンドを吐き出させることも出来るかと思います。
そうすれば、余計なリモコンを用意しなくてもいい感じになるしw

この次はDCモーターをつかっての駆動と、実機の設計ですかね。
メカニカルな部分は作ってみないとわからないので、資本的な問題で、もう少し先になりそうです・・・


====赤外線でモーターとLCD表示をさせるスケッチ=============

#include <Stepper.h>
#include <Wire.h>
#include <LiquidCrystal_I2C.h>

#define STEPS_PER_MOTOR_REVOLUTION 32
#define STEPS_PER_OUTPUT_REVOLUTION 32 * 64 //2048ステップ

#define IR_IN 2
#define IR_DATA_SIZE 100

byte ir_data[IR_DATA_SIZE];
byte ir_code[32];
byte ir_result;

char f[16] = "FORWARD!";
char r[16] = "REVERSE!";

LiquidCrystal_I2C lcd(0x3F, 2, 1, 0, 4, 5, 6, 7, 3, POSITIVE); // 液晶I2Cアドレス宣言
Stepper small_stepper(STEPS_PER_MOTOR_REVOLUTION, 8, 10, 9, 11);//ステッピングモーター出力端子宣言


int Steps2Take;

void setup()
{
Serial.begin(9600);
lcd.begin(16, 2); //LCD開始座標
lcd.backlight();//バックライトON
pinMode(IR_IN, INPUT_PULLUP); //赤外線入力端子
}
void loop()
{
ir_result = ir_read(IR_IN);
if (ir_result > 0) {
//Serial.println(ir_result,DEC);
print_comand(ir_result);
}
}

//データ受信
byte ir_read(byte ir_pin) {
unsigned long now, last, start_at;
boolean stat;
start_at = micros();

//2.5秒以上入力がなかったら終了
while (stat = digitalRead(ir_pin)) {
if (micros() - start_at > 2500000) return 0;
}

digitalWrite(13, HIGH);
for (int i = 0; i < IR_DATA_SIZE; i++) {
ir_data[i] = 0;
}

start_at = last = micros();
for (int i = 0; i < IR_DATA_SIZE; i++) {
//入力が反転するまで待ち(上限25ms)
while (1) {
if (stat != digitalRead(ir_pin)) break;
//信号終了
if (micros() - last > 25000) {
digitalWrite(13, LOW);
return ir_get_data();
}
}
now = micros();
ir_data[i] = (now - last) / 100; //byteに格納するため
last = now;
stat = !stat;
}

}

//データ解析
byte ir_get_data() {
int j = 0;
byte result = 0;

//1or0判定
for (int i = 3; i < 66; i += 2) {
if (ir_data[i] > 10) {
ir_code[j] = 1;
} else {
ir_code[j] = 0;
}
j++;
}

//データを数値化
for (int i = 0; i < 8; i++) {
if (ir_code[i + 16] == ir_code[i + 24]) { //反転データチェック
result = 0;
break;
} else {
bitWrite(result, i, ir_code[i + 16]);
}
}
return result;

}

//コマンド出力
void print_comand(byte ir) {
switch (ir) {
case 69:
lcd.setCursor(0, 0);
lcd.print("CH-");
delay(1000);
lcd.clear();
break;
case 70:
lcd.setCursor(0, 0);
lcd.print("CH");
delay(1000);
lcd.clear();
break;
case 71:
lcd.setCursor(0, 0);
lcd.print("CH+");
delay(1000);
lcd.clear();
break;
case 68:
stepRev();
break;
case 64:
stepFwd();
break;
case 67:
lcd.setCursor(0, 0);
lcd.print("PLAY&PAUSE");
delay(1000);
lcd.clear();
break;
case 7:
stepSRev();
break;
case 21:
stepSFwd();
break;
case 9:
lcd.setCursor(0, 0);
lcd.print("EQ");
delay(1000);
lcd.clear();
break;
case 22:
lcd.setCursor(0, 0);
lcd.print("0");
delay(1000);
lcd.clear();
break;
case 25:
lcd.setCursor(0, 0);
lcd.print("100+");
delay(1000);
lcd.clear();
break;
case 13:
lcd.setCursor(0, 0);
lcd.print("200+");
delay(1000);
lcd.clear();
break;
case 12:
lcd.setCursor(0, 0);
lcd.print("1");
delay(1000);
lcd.clear();
break;
case 24:
lcd.setCursor(0, 0);
lcd.print("2");
delay(1000);
lcd.clear();
break;
case 94:
lcd.setCursor(0, 0);
lcd.print("3");
delay(1000);
lcd.clear();
break;
case 8:
lcd.setCursor(0, 0);
lcd.print("4");
delay(1000);
lcd.clear();
break;
case 28:
lcd.setCursor(0, 0);
lcd.print("5");
delay(1000);
lcd.clear();
break;
case 90:
lcd.setCursor(0, 0);
lcd.print("6");
delay(1000);
lcd.clear();
break;
case 66:
lcd.setCursor(0, 0);
lcd.print("7");
delay(1000);
lcd.clear();
break;
case 82:
lcd.setCursor(0, 0);
lcd.print("8");
delay(1000);
lcd.clear();
break;
case 74:
lcd.setCursor(0, 0);
lcd.print("9");
delay(1000);
lcd.clear();
break;
default:
;
}

}


void stepFwd() //反時計回り(1回転)
{
lcd.setCursor(0, 0);
lcd.print(f);

Steps2Take = STEPS_PER_OUTPUT_REVOLUTION ;
small_stepper.setSpeed(700);
small_stepper.step(Steps2Take);
delay(1000);
lcd.clear();

}
void stepSFwd() //反時計回り(32ステップ)
{
lcd.setCursor(0, 0);
lcd.print(f);

Steps2Take = 32 ;
small_stepper.setSpeed(700);
small_stepper.step(Steps2Take);

}
void stepRev() //時計回り(1回転)
{
lcd.setCursor(0, 0);
lcd.print(r);

Steps2Take = - STEPS_PER_OUTPUT_REVOLUTION ;
small_stepper.setSpeed(700);
small_stepper.step(Steps2Take);
delay(1000);
lcd.clear();

}
void stepSRev() //時計回り(32ステップ)
{
lcd.setCursor(0, 0);
lcd.print(r);

Steps2Take = - 32 ;
small_stepper.setSpeed(700);
small_stepper.step(Steps2Take);

}

==============================================================

・・・ホップアップモニターへの道は長いな・・・

ブログ一覧 | Arduino | 日記
Posted at 2016/01/30 19:22:05

イイね!0件



タグ

今、あなたにおすすめ

ブログ人気記事

【シュアラスターラボ】5月のキャン ...
シュアラスターさん

今日の晩酌🏠️🍺
brown3さん

『定期便』『フォロワーさん 300 ...
ひでごん123さん

【お持ち帰りOK】パチンコ童貞なん ...
キャニオンゴールドさん

別所沼公園のツツジが満開です〰️♪
kuta55さん

29日⑦。
.ξさん

この記事へのコメント

ユーザーの設定によりコメントできません。


プロフィール

「禁断の果実(りんご)の誘惑 http://cvw.jp/b/2036390/44515607/
何シテル?   10/28 00:21
放置プレイ実施中 ぼちぼち復帰します。 改名しました。
みんカラ新規会員登録

ユーザー内検索

<< 2024/4 >>

 123456
78910111213
14151617181920
21222324252627
282930    

リンク・クリップ

プッシュスタートスイッチ 
カテゴリ:その他(カテゴリ未設定)
2021/02/06 22:50:27
オートパーラー上尾 コンビーフサンドはここだけ 
カテゴリ:その他(カテゴリ未設定)
2017/12/17 20:49:21
オートレストラン 鉄剣タロー レトロ自販機の牙城@サイタマー 
カテゴリ:その他(カテゴリ未設定)
2017/12/17 20:49:16

愛車一覧

スズキ スペーシアカスタムハイブリッド スズキ スペーシアカスタムハイブリッド
パレットがポンコツ過ぎて買い替える予定でしたが、事故って直すのも勿体ないと、前倒しで買い ...
スズキ パレット スズキ パレット
パレットに乗り換えました。 憧れだった軽です(ぇ ・乗り降りがしやすい ・頭がぶつから ...
日産 シルビア 苺たん (日産 シルビア)
S15シルビアを新車で乗って19年・・・ 当時周りが180SXやらS14やらに乗って ...
ヘルプ利用規約サイトマップ

あなたの愛車、今いくら?

複数社の査定額を比較して愛車の最高額を調べよう!

あなたの愛車、今いくら?
メーカー
モデル
年式
走行距離(km)
© LY Corporation