今回はarduinoで赤外線LEDからデータを発信して受信してみる。
元はよみやさんの動画です。
まずはジャンク基盤から取り外した赤外線LEDに電源を繋いで発光を確認する。
100Ωだったか適当な抵抗をかましました。
OK
欠陥部品のおかげで手詰まりにならんためには、必須です。
前回の受信部品[ 秋月 CRVP1738 ] を右側に立ててオシロへ接続
左側に今回の赤外LEDを設置
更に左に(配線の影)に2SC1815トランジスタを付けてarduinoのピン信号を増幅
小汚い図ですな・・
抵抗値はよみやさん動画で計算されていた値に近いものを見つけて付けてます。
ここまで順調だったが、バカなところでケツまずいた。
発信ボタンの実装。
当初「INPUT_PULLUP」を使わなかったし、そもそも接続自体が大馬鹿配線で公開もできないような内容
ボタン押下を再勉強してやっと動きました。
orz
ここからは翌日の8月3日に行った追加試験です。
赤外LED発光の足にオシロプローブを取り付け直した。
[ 2ms信号+1ms無信号 ]を3回送信し、赤外受信モジュールがそれをデジタル信号化し出力した。
38kHz=1/38000=1周波数は0.000 026 32 秒
1サイクルが26μS 2.631578947368421e-5=26.31578947368421e-6
本来は2msの信号は、赤外LED発光時には、2000μS ÷ 26μS ≒ 77回
77回の信号が出ているはず。
1メモリ100μS、1周波数が26μSなので1枠に5回出現している。大体合ってる感じ。
搬送波の拡大 1コマ5μSなので26μS程度になってるね。
波形がなまってるんだが・・・
同じ5μSでもこちらは角が立ってる。なんでだろう・・おかしいよね。
27μSで1周波になってるぽい。
ほぼ計算通りで満足な追試結果でした。
------------
さて、昨日に戻って。
夕方もう目は霞むは頭はボーッとするは、最悪
ネズミ以下の学習脳であることに情けない思いもしたが、
やけ酒・・・ではなく多少勝利の美酒になれたのは幸い。
------------
下記のソースはほぼよみやさん動画で表示されていたパクリです。
PULLUPを入れたのでLEDの点灯が逆になってます。
#define TRIGGER_SW 11 // トリガー・スイッチ
#define IR_LED_PIN 12 // 赤外LED
#define INDICATOR 13 // 基盤上のLED
#define CARRIER_FREQUENCY 37900 // 基本周波数
uint8_t privious_sw; // 一回前のスイッチ状態保存用変数
void pulse_tone(int dly1, int dly2); // 関数宣言
void setup() {
pinMode(TRIGGER_SW, INPUT_PULLUP); // これで抵抗設置が1個減ります
pinMode(IR_LED_PIN, OUTPUT);
pinMode(INDICATOR, OUTPUT);
digitalWrite(IR_LED_PIN, LOW);
digitalWrite(INDICATOR, LOW); // LED Off
privious_sw = LOW;
Serial.begin(9600);
Serial.println(privious_sw);
Serial.println("begin");
}
void loop() {
uint8_t current_sw;
current_sw = digitalRead(TRIGGER_SW); // スイッチ押下を検知
if (current_sw != privious_sw){ // スイッチ状態が変化してたら以下の処理
Serial.print("pushed");
privious_sw = current_sw; // SW状態変数を更新
if(current_sw == LOW){ // プルアップしてるのでスイッチONでLOWがになる
digitalWrite(INDICATOR, HIGH); // LED点灯
pulse_tone(2,1); // LED 制御 [ 搬送波を2ms、無信号を1ms ] のパックを3回を送ってる
pulse_tone(2,1);
pulse_tone(2,1);
}
else{
digitalWrite(INDICATOR, LOW);
}
}
}
void pulse_tone(int dly1, int dly2){
tone(IR_LED_PIN, CARRIER_FREQUENCY); // 3.7kHzで搬送波を送る
delay(dly1); // 2msそのまま送信
noTone(IR_LED_PIN); // 搬送波を停止
delay(dly2); // 1ms停止
}