« 小ネタ~AVRでの赤外線リモコン送信機 | トップページ | 今更の、Android2.1 »

2010年11月 3日 (水)

小ネタ~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の規格表を見て下さい) ただし、パルス変調が止まったら死にますけれど。

 

 またいつものごとく色々が「そのままじゃ動かない」様になっているので、そこは解読・理解しながら参考にしてください。(参考にする人がいるのか?って気もするけど)

 

|

« 小ネタ~AVRでの赤外線リモコン送信機 | トップページ | 今更の、Android2.1 »

パソコン・インターネット」カテゴリの記事

趣味」カテゴリの記事

電子回路」カテゴリの記事

コメント

コメントを書く



(ウェブ上には掲載しません)


コメントは記事投稿者が公開するまで表示されません。



トラックバック

この記事のトラックバックURL:
http://app.f.cocolog-nifty.com/t/trackback/437678/37518527

この記事へのトラックバック一覧です: 小ネタ~AVRでの赤外線リモコン送信機 2:

« 小ネタ~AVRでの赤外線リモコン送信機 | トップページ | 今更の、Android2.1 »