米粒AVRでリモコン送信機
公開日:
電子工作 | リモコン, 米粒AVR(tiny10)
米粒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)
超小型AVRマイコン ATtiny10 米粒AVR (10個入り)
赤外線LED
何でも良いです。
秋月電子でも多種の赤外線LEDが扱われているので、好きなのを選びましょう。
ちなみに今回使ったのは、昔に袋買いしたOSI5LA5113A
回路図
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 に対応しています。
ユニバーサル基板で、適当に作ってみたリモコン送信機
裏面のショート防止に、ダンボールをゴムで巻きつけていますw
関連記事
-
-
Raspberry Piのリビジョン
リビジョンの種類 現在、Rapsberry Piにはリビジョン1とリビジョン2と呼ばれる2つの
-
-
米粒AVR(ATtiny10)
通称「米粒AVR」で知られるTiny10を使ってみたくて、秋月の通販で買ってみました。 超小型
-
-
米粒AVRでアナログ入力を試してみた
米粒AVR(ATtiny10)に搭載されている8ビット4チャンネルのアナログ入力を試してみました
-
-
Raspberry Piのスクリーンショット
ブログで使う用に、Raspberry Piのスクリーンショットを撮りたいと思った時、
-
-
Bimeji Client for Arduino
前回紹介したWimeji Client for Arduinoの最後で予告していた、Wimeji c
-
-
米粒AVRのEAGLEライブラリ
EAGLEを使って米粒AVR(ATtiny10)の回路図を書こうと思ったら何か様子がおかしい。
-
-
Raspberry PiをWindowsで操作する(SSH)
SSHを使って、Raspberry Piを外部PC(Windows)で操作する。
-
-
SoundIRModemライブラリのサンプル
SoundIRModemライブラリは、米粒AVR(Tiny10)とAndroid端末をイ
-
-
Arduino + USBホストシールド で ADK を試す(その1)
先日Google IOで発表された Android Open Accessory。みなさん知ってます
- PREV
- 米粒AVRでリモコン受信処理
- NEXT
- 米粒AVRでSoftModem的なこと
Comment (9件)
こんにちは!はじめましてです。
今回ありがたく上記のプログラムを使わせてもらっているのですが、どうもコンパイルの時点でエラーがでてしまうのです。
エラー文は”unable to generate reloads for:”なのですが、調べてみると_delay_us()で262145us未満はエラー(262.14ms)とのことでした。いろいろ解決方法を探してみたのですが力不足か、全く解決には進まず…
しまいにはこのように質問させていただいている次第です。お暇なときにでも、お教えいただけると喜びます。
長文失礼しました。
こんにちは、はじめまして。
コンパイラは何をお使いでしょうか?
早速の返信ありがとうございます!
メインPCがMacなのでCrossPack for AVRを使ってます… 開発環境はXcodeです。
やはりそこが問題ですかね。
僕はAtmelStudio6.0を使って作ってるので、その辺りが怪しいように思います。
一度、AtmelStudio6.0で試していただきたいのですが、何とかAtmelStudio6.0を使える環境は作れませんか?
なんとか頑張ってみます!
忙しい中解凍ありがとうございます!助かりました!
解決策では無くてごめんなさい。
もし必要であれば、コンパイルしたHEXファイルお渡ししますので、またご連絡下さい。
はじめまして。
貴方さまから、頂きました、米粒リモコンのC言語のリストを、Winavr で、コンパイルしましたら、
次のような、エラーが、表示されました。
PRR, PRTIM0, CCP, CLKPSR, WGM03, PRR PRADC, PRTIM0, PUEB, PCICR,, PICE0, [ , ch_data です。
もし、お時間がありましたら、解決方法を、教えてください。
kawauchi
>kawauchi様
コメントありがとうございます。
公開しているソースはAtmelStudio6.0を使って作成しています。
申し訳ございませんが、AtmelStudioをご利用下さい。
http://s2jp.com/2012/08/atmel-studio-6/
はじめまして。
貴方様のプログラムをAtmelStudio7.0でコンパイルして
回路図通りブレッドボードで組んだのですが、うまく機能しませんでした。
SW3を押した後にSW1かSW2を押すと一瞬光ります。
原因として何が考えられますか?