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

Android Open Accessory開発時のWiFiデバッグ

Android Open Accessory開発時のデバッグは、ADBをWiFiで接続しろと、USB

記事を読む

no image

PIC24FJ64GB002でADKを試す(その2)

 前回「PIC24FJ64GB002でADKを試す(その1)」では回路の説明までしたので、

記事を読む

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

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

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

記事を読む

no image

Bimeji Client for Arduino

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

記事を読む

no image

米粒AVRでアナログ入力を試してみた

米粒AVR(ATtiny10)に搭載されている8ビット4チャンネルのアナログ入力を試してみました

記事を読む

no image

米粒AVRで小型8連ナイトライダーを作ってみた

米粒AVR(ATtiny10)を2つ使って、8つのLEDを順番に点灯しています。 &nbs

記事を読む

raspi-config

Raspbianの最初の設定

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

記事を読む

no image

Android+Arduinoでリモコン3 その1(AndroidAccessory接続)

何度か、Android+リモコンのネタを書いたことがあるのですが、今回はAndroid Access

記事を読む

no image

気になる物

HT-03Aで使えるのかどうかは知らないけど、Bluetooth-シリアルモジュール(BT-MOD1

記事を読む

no image

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

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

記事を読む

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 ↑