米粒AVRでリモコン送信機

公開日: 電子工作 | ,

米粒AVR リモコン

米粒AVR(tiny10)を使った赤外線リモコン送信機を作ってみました。
これで送信できるのは、NECフォーマットのみで、SONY製リモコンやSHARP製のリモコン等を使う場合には工夫が必要です。

部品リスト

部品 数量 記号 備考
ATTiny10 1 IC1 米粒AVR
抵抗 – 100 1 R1  
IR-LED 1 LED1 赤外線LED
タクトスイッチ 3 SW1~3  
コンデンサ – 0.1u 1 C1 積層セラミックコンデンサ
       

 

米粒AVR(Tiny10)

tiny10
超小型AVRマイコン ATtiny10 米粒AVR (10個入り)

 

赤外線LED

何でも良いです。
秋月電子でも多種の赤外線LEDが扱われているので、好きなのを選びましょう。

赤外線LED OSI5LA5113A
ちなみに今回使ったのは、昔に袋買いしたOSI5LA5113A

 

回路図

Tiny10 リモコン送信機 回路図

 

Tiny10用ソース

#define F_CPU 1000000UL<br />
<br />
#include <avr/io.h><br />
#include <avr/interrupt.h><br />
#include <avr/sleep.h><br />
#include <util/delay.h><br />
<br />
#define LED    PB1<br />
#define _LED_HIGH        (TCCR0A |= _BV(COM0B1))<br />
#define _LED_LOW        (TCCR0A &= ~_BV(COM0B1))<br />
<br />
#define SW1    PB0<br />
#define SW2    PB2<br />
#define SW3    PB3<br />
#define SW_ALL    (_BV(SW1) | _BV(SW2) | _BV(SW3))<br />
<br />
#define DATA_BYTE_COUNT        4<br />
#define DATA_BIT_COUNT        (DATA_BYTE_COUNT*8)<br />
<br />
#define HEADER_H    9000<br />
#define HEADER_L    4500<br />
#define STOP_H        600<br />
#define STOP_L        40000<br />
<br />
#define PULSE0_H    600<br />
#define PULSE0_L    600<br />
#define PULSE1_H    600<br />
#define PULSE1_L    1800<br />
<br />
#define REP_HEADER_H    9000<br />
#define REP_HEADER_L    2250<br />
#define REP_STOP_H        600<br />
#define REP_STOP_L        95000<br />
<br />
uint8_t ch_data[][DATA_BYTE_COUNT]=<br />
{<br />
    {0x01,0x00,0x00,0x01},    // ch0<br />
    {0x01,0x00,0x00,0x02},    // ch1<br />
    {0x01,0x00,0x00,0x03},    // ch2<br />
};<br />
<br />
ISR(PCINT0_vect)<br />
{<br />
}<br />
<br />
void send(uint8_t *data)<br />
{<br />
    PRR &= ~_BV(PRTIM0);    // timer0クロック許可<br />
<br />
    _LED_HIGH;<br />
    _delay_us(HEADER_H);<br />
    _LED_LOW;<br />
    _delay_us(HEADER_L);<br />
    <br />
    uint8_t bitCount,byteCount=0;<br />
    uint8_t fBit=0x80;<br />
    for(bitCount=0; bitCount<DATA_BIT_COUNT; bitCount++)<br />
    {<br />
        if(data[byteCount]&fBit)<br />
        {<br />
            _LED_HIGH;<br />
            _delay_us(PULSE1_H);<br />
            _LED_LOW;<br />
            _delay_us(PULSE1_L);<br />
        }<br />
        else<br />
        {<br />
            _LED_HIGH;<br />
            _delay_us(PULSE0_H);<br />
            _LED_LOW;<br />
            _delay_us(PULSE0_L);<br />
        }<br />
        fBit>>=1;<br />
        if(!fBit)<br />
        {<br />
            byteCount++;<br />
            fBit=0x80;<br />
        }<br />
    }<br />
    <br />
    _LED_HIGH;<br />
    _delay_us(STOP_H);<br />
    _LED_LOW;<br />
    _delay_us(STOP_L);<br />
    <br />
    /*<br />
    // リピートコード送信<br />
    while( (PINB&SW_ALL)!=SW_ALL )<br />
    {<br />
        _LED_HIGH;<br />
        _delay_us(REP_HEADER_H);<br />
        _LED_LOW;<br />
        _delay_us(REP_HEADER_L);<br />
        _LED_HIGH;<br />
        _delay_us(REP_STOP_H);<br />
        _LED_LOW;<br />
        _delay_us(REP_STOP_L);<br />
    }<br />
    */<br />
    <br />
    PRR |= _BV(PRTIM0);        // timer0クロック停止<br />
}<br />
<br />
int main(void)<br />
{<br />
    CCP = 0xD8;<br />
    CLKMSR = 0x00;<br />
    CCP = 0xD8;<br />
    #if F_CPU == 8000000UL<br />
    CLKPSR = 0x00;<br />
    #elif F_CPU == 4000000UL<br />
    CLKPSR = 0x01;<br />
    #elif F_CPU == 2000000UL<br />
    CLKPSR = 0x02;<br />
    #elif F_CPU == 1000000UL<br />
    CLKPSR = 0x03;<br />
    #endif<br />
    <br />
    DDRB |= _BV(LED);<br />
<br />
    TCCR0A = _BV(WGM01) | _BV(WGM00);<br />
    TCCR0B = _BV(WGM03) | _BV(CS00);<br />
<br />
    OCR0A = (F_CPU / 2 / 38300)-1;<br />
    OCR0B = OCR0A / 3;<br />
<br />
    PRR = _BV(PRADC) | _BV(PRTIM0);        // AD変換停止+timer0停止<br />
<br />
    PCMSK = 0b00001101;                    // PCINT ピン変化割り込み<br />
    PUEB |= SW_ALL;<br />
    <br />
    set_sleep_mode(SLEEP_MODE_IDLE);    // アイドルモードに設定<br />
    sei();                                // 全体の割り込み許可<br />
<br />
    while(1)<br />
    {<br />
        PCICR = _BV(PCIE0);<br />
        sleep_mode();<br />
        PCICR &= ~_BV(PCIE0);<br />
        <br />
        if(!(PINB&_BV(SW1)))<br />
        {<br />
            send(ch_data[0]);<br />
        }<br />
        else if(!(PINB&_BV(SW2)))<br />
        {<br />
            send(ch_data[1]);<br />
        }<br />
        else if(!(PINB&_BV(SW3)))<br />
        {<br />
            send(ch_data[2]);<br />
        }<br />
        <br />
        while( (PINB&SW_ALL)!=SW_ALL )<br />
        {<br />
            _delay_ms(10);<br />
        }<br />
    }<br />
}<br />

リモコンのコードの指定

リモコンのコードの指定は、35行目のch_dataへ、1chにつき4バイトのコードを指定します。
ここでは、先のリモコン受信機に合わせたコードを指定しています。

uint8_t ch_data[][DATA_BYTE_COUNT]=<br />
{<br />
    {0x01,0x00,0x00,0x01},    // ch0<br />
    {0x01,0x00,0x00,0x02},    // ch1<br />
    {0x01,0x00,0x00,0x03},    // ch2<br />
};<br />

タクトスイッチ SW1=ch0、SW2=ch1、SW3=ch2 に対応しています。

 

 

米粒AVR リモコン
ユニバーサル基板で、適当に作ってみたリモコン送信機
裏面のショート防止に、ダンボールをゴムで巻きつけていますw

 

 

 

関連記事

no image

USBホストケーブルとUSBケーブルの違い

USBホストケーブル(OTGケーブル)と普通のUSBケーブルの違いは、USBホストケーブルとして振る

記事を読む

米粒AVT(tiny10) リモコンレシーバー

米粒AVRでリモコン受信処理

  米粒AVR(Tiny10)で赤外線リモコンを受信して処理をするサンプルを作ってみまし

記事を読む

no image

米粒AVRでLチカ

  米粒AVR(ATtiny10)でLチカしてみました。 LチカとはLEDをチカチカと

記事を読む

Arduinoで温湿度計 #2

今回は、前回作った温湿度計にRTCモジュールとSDカードアダプタを取り付けて温湿度データロガーを

記事を読む

no image

オシロスコープを手に入れた

ついにオシロスコープを買っちゃいました。 と言っても、DSO QUADと言うポータブルタイプの

記事を読む

Hello Tiny10

米粒AVRでI2C通信を使ってLCD表示

前の記事で紹介したI2Cライブラリを使った、LCDの表示のライブラリ的なもの  

記事を読む

Raspberry Piのスクリーンショット

  ブログで使う用に、Raspberry Piのスクリーンショットを撮りたいと思った時、

記事を読む

no image

Wimeji Client for Arduino

前回紹介したWimeji Client for WindowsXPをArduinoでやってみました。

記事を読む

秋月のリアルタイムクロック(RTC)モジュール

今回は秋月電子のI2C接続のリアルタイムクロック(RTC)モジュールを買ったので、ちょっと試してみま

記事を読む

no image

Arduino + USBホストシールド で ADK を試す(その2)

前回「Arduino + USBホストシールド で ADK を試す(その1)」では、Androidで

記事を読む

Comment (9件)

  1. γ氏

    こんにちは!はじめましてです。
    今回ありがたく上記のプログラムを使わせてもらっているのですが、どうもコンパイルの時点でエラーがでてしまうのです。
    エラー文は”unable to generate reloads for:”なのですが、調べてみると_delay_us()で262145us未満はエラー(262.14ms)とのことでした。いろいろ解決方法を探してみたのですが力不足か、全く解決には進まず…
    しまいにはこのように質問させていただいている次第です。お暇なときにでも、お教えいただけると喜びます。
    長文失礼しました。

    1. Futaba

      こんにちは、はじめまして。
      コンパイラは何をお使いでしょうか?

      1. γ氏

        早速の返信ありがとうございます!
        メインPCがMacなのでCrossPack for AVRを使ってます… 開発環境はXcodeです。
        やはりそこが問題ですかね。

        1. Futaba

          僕はAtmelStudio6.0を使って作ってるので、その辺りが怪しいように思います。
          一度、AtmelStudio6.0で試していただきたいのですが、何とかAtmelStudio6.0を使える環境は作れませんか?

          1. γ氏

            なんとか頑張ってみます!
            忙しい中解凍ありがとうございます!助かりました!

            1. Futaba

              解決策では無くてごめんなさい。
              もし必要であれば、コンパイルしたHEXファイルお渡ししますので、またご連絡下さい。

  2. kawauchi

    はじめまして。
    貴方さまから、頂きました、米粒リモコンのC言語のリストを、Winavr で、コンパイルしましたら、
    次のような、エラーが、表示されました。
    PRR, PRTIM0, CCP, CLKPSR, WGM03, PRR PRADC, PRTIM0, PUEB, PCICR,, PICE0, [ , ch_data です。
    もし、お時間がありましたら、解決方法を、教えてください。
    kawauchi

  3. gonzoo

    はじめまして。
    貴方様のプログラムをAtmelStudio7.0でコンパイルして
    回路図通りブレッドボードで組んだのですが、うまく機能しませんでした。
    SW3を押した後にSW1かSW2を押すと一瞬光ります。
    原因として何が考えられますか?

Arduinoで温湿度計 #2

今回は、前回作った温湿度計にRTCモジュールとSDカードアダプタを

Arduinoで温湿度計

秋月電子の温湿度モジュールを使って、温湿度計を作ってみました。 以前

ArduinoでSDカード

電子工作で大量のデータを保存する方法を調べていると、 Arduin

秋月のリアルタイムクロック(RTC)モジュール

今回は秋月電子のI2C接続のリアルタイムクロック(RTC)モジュールを

秋月の小型キャラクタLCD

今回秋月電子で売られている小型のキャラクター液晶2種を買ったので、

PAGE TOP ↑