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

AVRISPmk2

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

記事を読む

vlc_media_player

Raspberry Piのサウンドを試したら音が出なかった話

(これはX-WindowのVLCメディアプレイヤーのスクショ) Raspberry Piでは、

記事を読む

no image

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

以前書いた、Androidで一眼レフカメラのシャッターを制御するでは、AndroidとArduino

記事を読む

no image

米粒AVRの動作周波数

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

記事を読む

no image

Wimeji Client for Arduino

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

記事を読む

Raspberry Pi 起動SDカード

Raspberry Piの起動SDカードを準備する

先日入手したRaspberry PiでLinuxを起動する為のSDカードを準備します。 Ras

記事を読む

raspi-colortest

Raspbianの起動

Raspbianの起動画面をキャプチャしてみた。 SDカードにイメージを書き込んだままのデフォ

記事を読む

sdcards

Raspberry Pi SDカードのクラスと起動速度

SDカードにOSをインストールするので、起動にはそれなりに時間がかかります。 では、どれくらい

記事を読む

no image

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

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

記事を読む

X-Window

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

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

記事を読む

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 ↑