小ネタ~AVRでの赤外線リモコン送信機 2
MEDIO write:
今日も出勤、楽しいなぁ。(涙
やること多すぎ。睡眠不足がさらに足を引っ張り仕事が捗らない。困ったねぇ...
さて気を取り直して。先日の続きでAVRでの赤外線リモコンの送信機です。
前回最後に「センスが~」とか言ってて、Cの正式な教育を受けてませんから、私。(w 独学ですからセンス云々言える訳ないんですけど、まぁアルゴリズムの考察って事で勘弁して下さい。
あれ?そういえばアルゴリズムも独学だっけ...(w
前回はタイマーの設定をしたので、実は割り込みのハンドラを書けば終わりです。
まずはグローバル変数とメイン関数での処理の「例」を。
volatile uint32_t send_data; // 送信データ(32bit長)
volatile uint8_t count_bit; // 送信データのbit位置カウンタ
volatile uint8_t count_zero; // 送信中データの「0」状態カウンタ
volatile uint8_t count_one; // 送信中データの「1」状態カウンタ
volatile uint8_t proc; // 送信中フレームの計時カウンタ(リピートコードのタイミング作成用)
int main(void)
{
~中略
if((何かスイッチが押されたら) && (proc ==0))
{
count_one = 16; // リーダ部作成 H=9000uS
count_zero = 8; // L=4500uS
proc = 1; // フレームタイマー・リセット
count_bit = 33; // 送信データbit長(1bit多いのはstop bit分
send_data = 【送りたいデータ32bit】;
}
次に本命、割り込みハンドラはこんな感じ。
ISR(TIMER1_COMPA_vect)
{
uint8_t flag = 0; // 何もすることが無くなったフラグ
/* データ準備 */
if((count_one == 0) && (count_zero == 0)) // 今、出力予定が無いなら
{
if(count_bit != 0) // 出力予定のデータは残っている?
{
if(send_data & 0x80000000) // 出力予定のbit = 1?
count_zero = 3; // 0出力は3割り込み分=1687.5uS
else // 出力予定のbit = 0?
count_zero = 1; // 0出力は1割り込み分=562.5uS
count_one = 1; // 1出力は1割り込み分=562.5uS
count_bit --; // データのbitカウンタを1減らす
send_data <<= 1; // データを1bitシフト(次のデータ
}
else
flag = 1; // 何もやることが無いフラグOn
}
/* データ出力 */
if(count_one != 0) // '1' データ 処理中?
{
proc++; // フレーム長カウンタ増やす
PD4 = 1; // LED Port = '1'
count_one --; // '1' データ処理中カウンタを1減らす
}
else
{
if(count_zero != 0) // '0' データ 処理中?
{
proc++; // フレーム長カウンタ増やす
PD4 = 0; // LED Port = '0' (消灯
count_zero --; // '1' データ処理中カウンタを1減らす
}
}
/* データ出力後、リピートコード処理 */
if((proc != 0) && (flag != 0)) // 割り込みで何もしてない時
{
if(出力を続けたい条件なら)
{
proc ++; // フレーム長カウンタ増やす
if(proc >= 191) // フレーム長 > 108mS ?
{ // ※※ ここからのデータは、次の割り込みで処理されます
count_one = 16; // リピートコード作成H=9000uS
count_zero = 4; // L=2250uS
proc = 1; // フレームタイマー・リセット
count_bit = 1; // 送信データbit長(1bitはstop bit分
}
}
else
proc = 0; // 処理終了(フレーム計時の終了
}
}
こんなプログラムでリモコンの送信が出来ます。赤外線LEDは上記プログラムなら(適当な電流値になる抵抗を介して)アノードをPD4、カソードをOC0Bに接続します。OC0Bは(先日のプログラムで)38kHz-Duty1/3でOn-Offを続けていますので、これだけでリモコンの変調も出来ます。
※本当は出力条件によりLEDに逆電圧がかかるのですが...LED自体の耐電圧が5V程度あるのを期待して。プロじゃないし。(w どうしても気になる方はトランジスタ1個入れて下さい。
※この程度のパルス幅であれば、赤外線LEDは5Vかけても大丈夫です。「飛びが良い」のを作りたい人は直結で。(詳細はLEDの規格表を見て下さい) ただし、パルス変調が止まったら死にますけれど。
またいつものごとく色々が「そのままじゃ動かない」様になっているので、そこは解読・理解しながら参考にしてください。(参考にする人がいるのか?って気もするけど)
| 固定リンク | 0
「パソコン・インターネット」カテゴリの記事
- ラズベリーのパイが無ければ…バナナのパイを食べてみる(2023.01.29)
- ラズベリーのパイが無ければパインを食べればいいじゃない(2022.12.19)
- Beagle Bone Black(Green)のOSをビルドしてみる(Debian Bullseye)(2022.11.17)
- Huawei P10 のアップデート(2022.05.31)
- 中華なArduinoっぽいマイコンで遊んでみる(定番のLチカ編(2022.01.16)
「趣味」カテゴリの記事
- ラズベリーのパイが無ければ…バナナのパイを食べてみる(2023.01.29)
- ラズベリーのパイが無いのでパインを食してみた(2023.01.28)
- ラズベリーのパイが無ければパインを食べればいいじゃない(2022.12.19)
- Beagle Bone Black(Green)のOSをビルドしてみる(Debian Bullseye)(2022.11.17)
- 現時点でのRaspberry PiのBluetooth Audio状況(2022.10.22)
「電子回路」カテゴリの記事
- ラズベリーのパイが無ければ…バナナのパイを食べてみる(2023.01.29)
- ラズベリーのパイが無いのでパインを食してみた(2023.01.28)
- ラズベリーのパイが無ければパインを食べればいいじゃない(2022.12.19)
- Beagle Bone Black(Green)のOSをビルドしてみる(Debian Bullseye)(2022.11.17)
- 現時点でのRaspberry PiのBluetooth Audio状況(2022.10.22)
この記事へのコメントは終了しました。

コメント