こんにちは!くのへ@MasazaneKunoheです!
今日はATtiny85を使ったテレビリモコンの作り方を紹介します!
作るもの
ATtiny85を使ってテレビリモコンを作りました!この作り方を紹介します!
作り方(概要)
ATtiny85ではArduinoの赤外線LEDリモコン用のライブラリ「IRremote」が使えるので、これを活用します。
①まずArduinoでテレビリモコンの受信機を作ります
②テレビリモコン(現物)の赤外線信号を解析します
③次に、ATtiny85にテレビリモコン発信機のプログラムを書きます
④最後に赤外線LEDを組み込んだ自作テレビリモコンを作ります
なお、こちらのサイト様がArduino用のLEDリモコンについて詳しく紹介されており、私が作ったリモコンはこのサイト様を参考に作成させて頂きました。
ちなみに赤外線テレビリモコンの原理は、こちらの記事で紹介していますので興味ある方は覗いてみて下さい。
①Arduinoでテレビリモコンの受信機を作る
まずは、Arduinoでリモコン受信機を作ります。
参考にさせて頂いたサイト様は赤外線受光モジュール VS1838Bを使っていましたが、私は赤外線リモコン受信モジュールOSRB38C9AAという赤外線受信モジュールを使いました。秋月電子のリンクはこちら。
赤外線受信モジュールは好きなものを使えばいいと思います。
赤外線受信モジュールのデータシートを読むと、こんな感じで小さくピンの意味が書いてあります。
これをもうちょっと分かりやすく書くと、こんな感じです。
これを、次のような回路を組みます。
ポイントは、赤外線受信モジュールのOutputを11番ピンにセットすることです。
この赤外線受信モジュールに、テレビリモコンの赤外線を受信させ、その赤外線信号がどんな信号なのかをIRremote.hライブラリを使って解析します。
②テレビリモコン(現物)の赤外線信号を解析します
テレビリモコンの赤外線信号は、NECフォーマットやらAEHAフォーマットやら、かなり色んな規格があります。このサイト様がかなり詳しく解説されていますので詳しく知りたい方はご参照ください。
このような赤外線信号をIRremote.hライブラリを使うことで解析できます。
ちなみに、この②項の内容は、参考にさせて頂いたサイト様の作業のとおり作業した私の作業を記事化しているので、参考にさせて頂いたサイト様の内容とほぼ類似の内容です。
まず、Arduinoのツール⇒ライブラリを管理、でライブラリマネージャを開きます。
ライブラリマネージャの検索欄に「irremote」と書くと、IRremoteライブラリが出てきます。
マウスをIRremoteに合わせると、「バージョンを選択」のプルダウンメニューが出てきますので、参考にさせて頂いたサイト様のように旧バージョンの2.8.0を選択します。
別なバージョンだと、後述のサンプルスケッチが出てきません。
バージョン2.8.0をインストールしたら、サンプルスケッチの中から、IRremoteのIRreceiveDumpV2を開いてください。
そうすると、次のようなサンプルコードが現れます。
この赤枠の通り、受信信号を受け取るピン番号がコーディングされているので、Arduinoならば11番ピンに赤外線受信モジュールのOutputをセットすればOKです。
11番ピン以外を使いたかったら、この値を変えればいいわけです。
このスケッチをArduinoに書き込んで、Arduinoのシリアルモニタを開きましょう。
シリアルモニタを開いたら、この右下の数値を115200にします。
これは、先ほどのコードをよくよく読むと、シリアル通信速度(ボーレートと言う)を115200にしているため、それに合わせる必要があるためです。
これでスタンバイOKです。この状態でリモコン受信機に向かってテレビリモコン(実物)の何かボタンを押してみましょう。
何か出てきましたね。
これがこのテレビリモコンの信号です。
そして、この図の赤枠の部分が重要で、以下のような意味になります。(この情報を後で使うからメモっておこう)
- Protocol : 信号の規格
- Data : 信号情報
- カッコ内 : ビット数
我が家のテレビは東芝のREGZAなのですが、テレビリモコンを分析すると、次のようになります。
- 赤外線信号の規格:NECフォーマット
- 電源ボタン:0x2FD48B7, 32ビット
- 入力切替:0x2FDF00F, 32ビット
ここまで分析出来たら、今度は発信機を作ります!!
③次に、ATtiny85にテレビリモコン発信機のプログラムを書きます
ATtiny85で赤外線リモコンの発信機を作る場合、IRremoteライブラリを一部改造する必要があります。
まずライブラリのフォルダを開きます。
ライブラリフォルダの場所が分からない場合は、まずファイル⇒環境設定をクリックしてください。
そしてスケッチブックの保存場所、と書いてあるフォルダを開いてください。
そのフォルダの中に、「libraries」というフォルダがありますので、これがArduinoのライブラリが保存される場所になります。
これの中に、IRremoteがあるので、これを開きます。
この中の、「src」フォルダを開きます。
ちなみにsrcはsource(ソース)の略で、プログラムコードなどを置いておく場所として別なライブラリでも割と見かけるフォルダ命名方法です。
そしてこの中のirSend.cppをメモ帳などで開きます。(ちなみに私はいつもVScodeというソフトを使っています。これは好みの話なのでメモ帳でOKです)
irSend.cppを開くとこんな感じになります。
うわっ、、、無理っ、、、って思うかもしれませんが、大丈夫です!!書き換える所はちょっとだけです。このコードの一番下に行ってください。
一番下に来ると、赤枠で囲ったコードが見えます。(custom_delay_usecと言う関数です)
ここを次のように書き換えます。複数行のコードをたった1行に直すだけです。簡単簡単。
はい。これを保存して、下準備はオッケーです!!
では、ArduinoIDEでATtiny85でテレビリモコンのプログラムを作りましょう。
こちらがサンプルコードはこちらです。
なお、②項でIRremoteライブラリの2.8.0版を使いましたが、そのままこのバージョンを使います。
#include <IRremote.h> // ライブラリのインクルード
IRsend irsend; // IR送信オブジェクトの生成
void setup(){
}
void loop(){
noInterrupts();
irsend.sendNEC(0x2FD48B7, 32);
interrupts();
delay(500);
}
まずは、#include<IRremote.h>と書いて、IRremote.hライブラリを読み込みます。
そして、IRsend irsend; と書きます。
これでIRremoteライブラリの「IRsend」という機能をirsendという変数が引き出すことができます
(いわゆるインスタンスを作ったんだね!!)
このirsend(の元となったIRsend)を使えば、赤外線信号を作れます。NECフォーマットの赤外線信号ならこう書きます。
irsend.sendNEC ( 信号情報 , ビット数 )
これで、NECフォーマットの赤外線信号の形のHigh/Low信号が所定のピンに送られます。
但し、ATtiny85でIRsendを使う時には、ATtiny85の割り込み機能を一旦停止すべし!と書いてある記事があったので、irsend.sendNECはnoInterrupts();とinterrupts();で挟んでおきます。
さて、上記の所定のピンですがATtiny85の場合、3番ピン(PB4ピン)だと決まっています!!
(ちなみにArduinoだと、D3ピンだと決まってます)
コードをかなり解析しないと分からないから、マジこれ分からないw
ということで、先のサンプルコードのスケッチをATTiny85に書き込んで、次項の回路を組んだらリモコンの出来上がり!!
NECフォーマット以外の記載も参考にさせて頂いたサイト様が詳細解説されていて、本当にこのサイト様は素晴らしいと思います。
④最後に赤外線LEDを組み込んだ自作テレビリモコンを作ります
こうやって回路を組みます!
3ピンに100Ω抵抗を挟んだLEDをセットしてます。
ちなみに実際に組んだ写真はこちら。全く一緒の回路です。
これをテレビに向けると、次のツイートの動画のように、電源がONになります!!!
(このブレッドボードは色々余計なものもついてますが、基本回路は↑これと同じです)
実際に動くと、かなり感動しますよ!!
応用について
あとは、スイッチを押したら所定の信号が出るようにすればいい感じです。
最初にお見せした動画の回路とコードはこちらです!
回路
6ピン(PB1)と7ピン(PB2)を1kΩの抵抗でプルダウンしておいて、ボタンA,Bを押したらHIGHにする感じです。
これで、6ピンがHIGHになったら電源をON/OFF、7ピンを押したら入力切替の赤外線信号を3ピンから発信する回路です。
コード
コードはこちらです。
#include <IRremote.h> // ライブラリのインクルード
IRsend irsend; // IR送信オブジェクトの生成
void setup(){
pinMode(1,INPUT); // 6ピン。テレビON/OFF用
pinMode(2,INPUT); // 7ピン。入力切替用
}
void loop(){
if(digitalRead(1)==HIGH){
delay(10);
if(digitalRead(1)==HIGH){
noInterrupts();
irsend.sendNEC(0x2FD48B7, 32);
interrupts();
delay(50);
}
}
if(digitalRead(2)==HIGH){
delay(10);
if(digitalRead(2)==HIGH){
noInterrupts();
irsend.sendNEC(0x2FDF00F, 32);
interrupts();
delay(200); //入力切替のディレイは50usだと動きが早い。200usにする
}
}
}
これで超シンプルな「ゲーム終わったらテレビを消すべしリモコン」の出来上がりです!!
以上!
自分でリモコンを作って動いたときは、それは本当に感動しますので是非やってみてほしいと思います。
そして基盤を自作してちゃんとした形にすると、電子工作の楽しさをすごく感じれますよ!!
それではまた今度~
🦅ばさばさ~
参考資料
赤外線リモコン受信モジュールOSRB38C9AAの仕様
赤外線リモコン受信モジュールOSRB38C9AAのデータシートを読むと、こんな感じに書いています。この赤外線受信モジュールは、赤外線を受信していない時のOUTPUTはHIGH(:電圧ON)、受信しているとLOW(:電圧OFF)になるという仕様であることが分かります。
更に読むと、電気的な特性について書いてあります。Vccに供給する電圧は2.7~5.5VまでOKと言うことになっているので、Arduinoの3.3Vでも5.0VでもどちらでもOKです。ただ「Typ.(典型的な値)」は3.0Vになっているので、Arduinoの3.3V電源からの給電の方が好ましいかなと思います。