質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

88.92%

赤外線の受信に関しての質問です。

受付中

回答 0

投稿

  • 評価
  • クリップ 0
  • VIEW 1,035

tontonnn

score 6

前提・実現したいこと

赤外線リモコンをArduinoで作製しようとしてネットでコードを調べてそのまま実行して作りました。せっかくなので、このコードを理解したいのですが、わからない箇所があります。

発生している問題・エラーメッセージ

  1. まずコード何のIRbit[64]は何のためにあるのでしょうか。

  2. 以下のコードの仕組みがよくわかりません。
    赤外線は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/ツール等のバージョンなど)

より詳細な情報

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

まだ回答がついていません

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 88.92%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る