###前提・実現したいこと
赤外線リモコンをArduinoで作製しようとしてネットでコードを調べてそのまま実行して作りました。せっかくなので、このコードを理解したいのですが、わからない箇所があります。
###発生している問題・エラーメッセージ
-
まずコード何のIRbit[64]は何のためにあるのでしょうか。
-
以下のコードの仕組みがよくわかりません。
赤外線はHIGHとLOWの繰り返しで構成されているのは知っていますが、これでその繰り返しを読めているのでしょうか。while(1)なのでよくわからなかったです。また、if (t >= 1000) IRbit[i] = (char)0x31 ; の部分や
if (i != 0) {
i = (DATA_POINT-1) * 8 ;
for (j=0 ; j < 8 ; j++) {
if (IRbit[i+j] == 0x31) bitSet(ans,j) ;
に関しては全く分かりません。
if (t >= 3400) {
i = 0 ;
while(digitalRead(IR_PIN) == HIGH) ; // ここまでがリーダ部(ON部分)読み飛ばす
// データ部の読み込み
while (1) {
while(digitalRead(IR_PIN) == LOW) ;// OFF部分は読み飛ばす
t = micros() ;
cnt = 0 ;
while(digitalRead(IR_PIN) == HIGH) {// LOW(OFF)になるまで待つ
delayMicroseconds(10) ;
cnt++ ;
if (cnt >= 1200) break ; // 12ms以上HIGHのままなら中断
}
t = micros() - t ;
if (t >= 10000) break ; // ストップデータ
if (t >= 1000) IRbit[i] = (char)0x31 ; // ON部分が長い
else IRbit[i] = (char)0x30 ; // ON部分が短い
i++ ;
}
// データ有りなら指定位置のデータを取り出す
if (i != 0) {
i = (DATA_POINT-1) * 8 ;
for (j=0 ; j < 8 ; j++) {
if (IRbit[i+j] == 0x31) bitSet(ans,j) ;
###該当のソースコード
ここにご自身が実行したソースコードを書いてください
#define IR_PIN 2 // 赤外線受信モジュール接続ピン番号
#define DATA_POINT 5 // 受信したデータから読取る内容のデータ位置
// 初期化処理
void setup()
{
Serial.begin(9600) ; // パソコン(ArduinoIDE)とシリアル通信の準備を行う
pinMode(IR_PIN,INPUT) ; // 赤外線受信モジュールに接続ピンをデジタル入力に設定
}
// メインの処理
void loop()
{
int ans ;
ans = IRrecive() ; // 赤外線リモコンのデータを受信する if (ans != 0) Serial.println(ans,HEX) ; // リモコンからデータを受信したら表示する
}
// 赤外線リモコンのデータを受信する処理関数
int IRrecive()
{
unsigned long t ;
int i , j ;
int cnt , ans ;
char IRbit[64] ;
ans = 0 ; t = 0 ; if (digitalRead(IR_PIN) == LOW) { // リーダ部のチェックを行う t = micros() ; // 現在の時刻(us)を得る while (digitalRead(IR_PIN) == LOW) ; // HIGH(ON)になるまで待つ t = micros() - t ; // LOW(OFF)の部分をはかる } // リーダ部有りなら処理する(3.4ms以上のLOWにて判断する) if (t >= 3400) { i = 0 ; while(digitalRead(IR_PIN) == HIGH) ; // ここまでがリーダ部(ON部分)読み飛ばす // データ部の読み込み while (1) { while(digitalRead(IR_PIN) == LOW) ;// OFF部分は読み飛ばす t = micros() ; cnt = 0 ; while(digitalRead(IR_PIN) == HIGH) {// LOW(OFF)になるまで待つ delayMicroseconds(10) ; cnt++ ; if (cnt >= 1200) break ; // 12ms以上HIGHのままなら中断 } t = micros() - t ; if (t >= 10000) break ; // ストップデータ if (t >= 1000) IRbit[i] = (char)0x31 ; // ON部分が長い else IRbit[i] = (char)0x30 ; // ON部分が短い i++ ; } // データ有りなら指定位置のデータを取り出す if (i != 0) { i = (DATA_POINT-1) * 8 ; for (j=0 ; j < 8 ; j++) { if (IRbit[i+j] == 0x31) bitSet(ans,j) ; } } } return( ans ) ;
}
###試したこと
課題に対してアプローチしたことを記載してください
実際に組んで、ハードレベルでは実行できています。
ただ、ソフトの面がわからなかったため、質問させていただきました。
###補足情報(言語/FW/ツール等のバージョンなど)
より詳細な情報
あなたの回答
tips
プレビュー