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

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

新規登録して質問してみよう
ただいま回答率
85.48%
Arduino

Arduinoは、AVRマイコン、単純なI/O(入出力)ポートを備えた基板、C言語を元としたArduinoのプログラム言語と、それを実装した統合開発環境から構成されたシステムです。

Q&A

0回答

1606閲覧

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

tontonnn

総合スコア6

Arduino

Arduinoは、AVRマイコン、単純なI/O(入出力)ポートを備えた基板、C言語を元としたArduinoのプログラム言語と、それを実装した統合開発環境から構成されたシステムです。

0グッド

0クリップ

投稿2017/04/25 17:00

###前提・実現したいこと

赤外線リモコンを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/ツール等のバージョンなど)
より詳細な情報

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問