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

 

 

 

関連記事

thermometer overlay

パソコンで温度計 #4

前回までに作ったPC温度計のログデータを、計測と同時に撮影した映像にオーバーレイ表示(スーパーイ

記事を読む

no image

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

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

記事を読む

no image

Androidで一眼レフカメラのシャッターを制御する

またSoftModemネタです。 調子に乗って arms22さんの記事 iPhoneで一眼レフカメ

記事を読む

米粒AVRで温度計

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

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

記事を読む

Raspberry Pi - Ethernet

Raspberry Pi インターネット接続

Raspberry Piをインターネットに接続してみた。 有線で接続(Ethern

記事を読む

no image

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

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

記事を読む

no image

米粒AVRの動作周波数

  米粒AVR(ATtiny10)のデフォルトでは内臓発振器利用の1MHzが指定されてい

記事を読む

no image

AVRISPmk2

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

記事を読む

no image

PICでMicroBridgeをやってみた

今回は、@yishiiさんが公開されている、PIC24FJ64GB002用のMicroBridgeソ

記事を読む

S2 SoundIR analyzer

赤外線リモコン受信機(イヤホンジャック接続)のアプリ

 前回の赤外線リモコン受信機(イヤホンジャック接続)の回路 を使う為の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で温湿度データロガー
Arduinoで温湿度計 #2

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

Arduinoで温湿度計
Arduinoで温湿度計

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

SDカード・マイクロSDカード
ArduinoでSDカード

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

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

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

秋月電子 キャラクタLCD
秋月の小型キャラクタLCD

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

PAGE TOP ↑