先日の赤外線リモコンの解析から、入力されたビットデータから、キーコマンドの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