米粒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

米粒AVRのEAGLEライブラリ

EAGLEを使って米粒AVR(ATtiny10)の回路図を書こうと思ったら何か様子がおかしい。

記事を読む

Raspberry Piを買った

先日、Raspberry Pi(ラズベリーパイ)を買いました。 Raspberry Piは噂で

記事を読む

soundIR 送信機

赤外線リモコン送信機(イヤホンジャック接続)の回路

前回は受信機で、今回は送信機を作ってみました。 受信機と違って、送信機の作成は少し面倒です。

記事を読む

no image

Bimeji Client for Arduino

前回紹介したWimeji Client for Arduinoの最後で予告していた、Wimeji c

記事を読む

no image

Android + Bluetooth + Arduino

 以前書いた『気になる物』で紹介したBluetoothモジュールですが、本当に気になって実

記事を読む

米粒AVRで温度計

米粒AVRで温度計(STTS751使用)

前回までに紹介したI2CライブラリとLCDライブラリを使って作る、温度計のサンプルです。 温度

記事を読む

no image

AVRISPmk2

米粒AVR(ATtiny10)のプログラム書き込み用にAVRISPmk2を購入しました。 先人

記事を読む

Raspbianの最初の設定

  Raspbianのインストール後にraspi-configを使って行う最初の設定

記事を読む

no image

Android + Bluetoothドングル + PIC24F

@hrdakinori さんと言う方が、PIC24FとBluetoothドングルを使って、Andro

記事を読む

no image

Android + Arduino でリモコン

今こんなのを作ってますと言う動画です。   DoCoMoのFOMA携帯

記事を読む

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 ↑