3Dプリントされたケース付きの電池式テレビリモコン
コンポーネントと消耗品
> |
| × | 1 | |||
| × | 1 | ||||
| × | 1 | ||||
| × | 1 | ||||
| × | 4 | ||||
| × | 3 | ||||
| × | 4 | ||||
| × | 3 | ||||
| × | 2 | ||||
| × | 1 | ||||
| × | 6 | ||||
| × | 1 |
必要なツールとマシン
> |
| |||
| ||||
| ||||
|
このプロジェクトについて
はじめに
私のガールフレンドのテレビのリモコンが機能しなくなりました。彼女は近くの店で安い交換品を買うことができたかもしれませんが、それから彼女は考えました:私たちは両方ともエンジニアです、一緒に自分のものを作りましょう!
私たちはスキルを完全に補完しているため、これは別の方法でしたが、封鎖中に時間を過ごす楽しい方法であり、この日常のテクノロジーがどのように機能するかについて少し学ぶ機会を与えてくれました。
ああ、そして家に小さな3Dプリンターを持っていることも役割を果たしました。
仕組み
まず、Arduino UNOを利用したシンプルなデザインを作りたかったので、テレビを操作するために必要なコマンドの最小数を評価しました。 ON / OFFトグル、ソース選択、Ch +、Ch-、Vol +、Vol-の6つのコマンドで十分だと考えました。
ボタンの読み取り
追加の抵抗の使用を避けるために、設計はArduinoの内部プルアップ抵抗に依存しています。リモコンがスリープモードでない場合(以下を参照)、各ボタンの状態は各ループサイクルでポーリングされます。複数のヒットのカウントを回避するために、 millis()
を利用して単純なデバウンスルーチンが実装されています。 機能。
赤外線信号の送信
赤外線通信は IRremote.h
によって処理されます ライブラリ(コーダーへの賛美!)。私たちがしなければならなかったのは、テレビのプロトコルを設定し(さまざまなメーカーが独自のプロトコルを開発しました)、Googleで使用したいさまざまなコマンドのHEXのコードを検索し、それらをボタンに関連付けることだけでした。回路設計に関係するため、ライブラリからのコマンドがIR LEDを効果的にパイロットするためには、これをArduinoUNOのピン3に接続する必要があります。
現在、コードは3種類のテレビ用に記述されており、 #define
にコメント/コメント解除することで選択できます。 コードの最初の部分のディレクティブ。
バッテリー 節約
消費電力を削減するために、 avr / sleep.h
からのコマンドを利用して、いくつかの戦略が実装されています。 および avr / power.h
ライブラリ。
未使用のすべてのペリフェラルとインターフェイス(ADC、SPI、TWI、timer1、usart)は、セットアップルーチンでオフになります。 PWMピン13の内蔵LEDも消灯します。また、Arduino UNOの電源LEDのはんだ除去を決定しました。これは、推奨される操作ではありませんが、それ以外の場合は常にオンになっています。
また、 millis()
を悪用する 、ボタンを5秒間押さないと、リモコンはスリープモードになり、オン/オフボタンをもう一度押すとスリープモードから復帰します。
構築方法
エレクトロニクス アセンブリ
回路全体がプロトタイピングボードに埋め込まれ、ArduinoUNOヘッダーに収まるように設計されています。はんだごてを使用して、リモコンの最終位置を考慮してボタンをはんだ付けしました。下部には、IR LEDを介して目的の電流を実現するために、2つの47オーム抵抗が並列にはんだ付けされています。
はんだワイヤーを使用して、プロトタイプボードにトレースを作成し、ボタンピンとIRLEDをオスのピンヘッダーに接続しました。
このように、ボードはピンヘッダーを使用してArduino UNOに取り付けられているシールドに似ており、すべての正しい接続を保証します。
エンクロージャー CAD および CAM
エンクロージャーは、バッテリー、Arduino UNO +プロトタイピングボードアセンブリを収容するように設計されており、上部のボタンと前面のIRLEDのみが露出しています。
エンクロージャーは、SolidWorks CADソフトウェアを使用して設計され、Ultimaker Curaスライシングソフトウェアで前処理され、最後にAnycubic Mega Zero3Dプリンターを使用してPLAで3D印刷された2つの部分で構成されています。
Arduino UNOは、ベースの内側から押し出された位置合わせ穴に適合する3本のM2.5ネジを使用してベースに固定されています。 Arduinoが固定されると、IR LEDがプロトタイピングボードの外側に突き出て、専用の穴に合わせ、エンクロージャーの2つの部分を組み立てるときに所定の位置に保持するために、3つのミニポストが追加されます。 LEDリードの横方向の動き。バッテリーは専用スペースに圧入されています。
カバーはボタンのみを露出させるように設計されており、各ボタンのほかに、各ボタンの機能を示す記号が表紙に刻印されています。
エンクロージャーのベースとカバーは、4本のM3ネジを使用して組み立てられます。
フォトギャラリー <図> <図> <図> <図>
コード
- TV_remote.ino
TV_remote.ino Arduino
#include#include #include //ピン定義// IR LEDをArduinoPWMピンに接続する必要があります3#define OnOff 1#ソースの定義0#define CH_plus 4#define CH_minus 5#define Vol_plus 6#define Vol_minus 7#define Interrupt_Pin 2 // ArduinoUnoのピン2または3のみ// TVモデル定義//#defineLG_TV //#define SAMSUNG_TV#define SONY_TV //コード定義#ifdef LG_TV unsigned long on_off_code =551489775; // HEX 20DF10EF unsigned long vol_plus_code =551502015; // HEX 20DF40BF unsigned long vol_minus_code =551534655; // HEX 20DFC03F unsigned long ch_plus_code =551485695; // HEX 20DF00FF unsigned long ch_minus_code =551518335; // HEX 20DF807F unsigned long source_code =551538735; // HEX 20DFD02F#endif#ifdef SAMSUNG_TV unsigned long on_off_code =3772793023; // HEX E0E040BF unsigned long vol_plus_code =3772833823; // HEX E0E0E01F unsigned long vol_minus_code =3772829743; // HEX E0E0D02F unsigned long ch_plus_code =3772795063; // HEX E0E048B7 unsigned long ch_minus_code =3772778743; // HEX E0E008F7 unsigned long source_code =3772809343; // HEX E0E0807F#endif#ifdef SONY_TV unsigned long on_off_code =2704; // HEX A90 unsigned long vol_plus_code =1168; // HEX 490 unsigned long vol_minus_code =3216; // HEX C90 unsigned long ch_plus_code =144; // HEX 090 unsigned long ch_minus_code =2192; // HEX 890 unsigned long source_code =2640; // HEX A50#endif //デバッグを有効にする//#defineDEBUG // IRsend irsend; // IRオブジェクトを作成しますunsignedlong debounce_time; unsigned long last_time; void setup(){analogWrite(13,0); //組み込みLEDのターン// noInterrupts(); //割り込みを無効にします// CLKPR =_BV(CLKPCE); //クロックプリスケーラ設定を有効にします// CLKPR =_BV(CLKPS0); //クロックプリスケーラを設定=2-> 8 MHz // Interrupts(); pinMode(OnOff、INPUT_PULLUP); pinMode(Source、INPUT_PULLUP); pinMode(CH_plus、INPUT_PULLUP); pinMode(CH_minus、INPUT_PULLUP); pinMode(Vol_plus、INPUT_PULLUP); pinMode(Vol_minus、INPUT_PULLUP); pinMode(Interrupt_Pin、INPUT_PULLUP); //省電力power_adc_disable(); //すべてのADCを無効にしますpower_spi_disable(); // SPI power_timer1_disable();を無効にします//タイマー1を無効にします(0はmillis()、2はirremote.h)power_usart0_disable(); //シリアルを無効にするpower_twi_disable(); // TWIを無効にします#ifdefDEBUG Serial.begin(9600); #endif} void loop(){// OnOffをチェックif(!digitalRead(OnOff)){debounce_time =millis(); while(millis()-debounce_time <40){; } if(!digitalRead(OnOff)){#ifdef LG_TV irsend.sendNEC(on_off_code、32); #endif #ifdef SAMSUNG_TV irsend.sendSAMSUNG(on_off_code、32); #endif #ifdef SONY_TV irsend.sendSony(on_off_code、12); #endif last_time =millis(); //最後にボタンが押されたとき#ifdefDEBUG Serial.println( "OnOff"); #endif}} //ソースをチェックif(!digitalRead(Source)){debounce_time =millis(); while(millis()-debounce_time <40){; } if(!digitalRead(Source)){#ifdef LG_TV irsend.sendNEC(source_code、32); #endif #ifdef SAMSUNG_TV irsend.sendSAMSUNG(source_code、32); #endif #ifdef SONY_TV irsend.sendSony(source_code、12); #endif last_time =millis(); //最後にボタンが押されたとき#ifdefDEBUG Serial.println( "Source"); #endif}} // CH_plusをチェックif(!digitalRead(CH_plus)){debounce_time =millis(); while(millis()-debounce_time <40){; } if(!digitalRead(CH_plus)){#ifdef LG_TV irsend.sendNEC(ch_plus_code、32); #endif #ifdef SAMSUNG_TV irsend.sendSAMSUNG(ch_plus_code、32); #endif #ifdef SONY_TV irsend.sendSony(ch_plus_code、12); #endif last_time =millis(); //最後にボタンが押されたとき#ifdefDEBUG Serial.println( "CH +"); #endif}} // CH_minusをチェックif(!digitalRead(CH_minus)){debounce_time =millis(); while(millis()-debounce_time <40){; } if(!digitalRead(CH_minus)){#ifdef LG_TV irsend.sendNEC(ch_minus_code、32); #endif #ifdef SAMSUNG_TV irsend.sendSAMSUNG(ch_minus_code、32); #endif #ifdef SONY_TV irsend.sendSony(ch_minus_code、12); #endif last_time =millis(); //最後にボタンが押されたとき#ifdefDEBUG Serial.println( "CH-"); #endif}} // Vol_plusをチェックif(!digitalRead(Vol_plus)){debounce_time =millis(); while(millis()-debounce_time <40){; } if(!digitalRead(Vol_plus)){#ifdef LG_TV irsend.sendNEC(vol_plus_code、32); #endif #ifdef SAMSUNG_TV irsend.sendSAMSUNG(vol_plus_code、32); #endif #ifdef SONY_TV irsend.sendSony(vol_plus_code、12); #endif last_time =millis(); //最後にボタンが押されたとき#ifdefDEBUG Serial.println( "Vol +"); #endif}} // Vol_minusをチェックif(!digitalRead(Vol_minus)){debounce_time =millis(); while(millis()-debounce_time <40){; } if(!digitalRead(Vol_minus)){#ifdef LG_TV irsend.sendNEC(vol_minus_code、32); #endif #ifdef SAMSUNG_TV irsend.sendSAMSUNG(vol_minus_code、32); #endif #ifdef SONY_TV irsend.sendSony(vol_minus_code、12); #endif last_time =millis(); //最後にボタンが押されたとき#ifdefDEBUG Serial.println( "Vol-"); #endif}} if(millis()-last_time> 5000){//ボタンが10秒間押されていない#ifdef DEBUG Serial.println( "Going to sleep ..."); #endif going_to_sleep(); //スリープモードに入る#ifdefDEBUG Serial.println( "Wake up ..."); #endif}} //スリープモードfunctionvoidgoing_to_sleep(){sleep_enable(); //スリープモードを有効にしますattachInterrupt(digitalPinToInterrupt(Interrupt_Pin)、wake_up、LOW); //ウェイクアップのための割り込み->割り込みピンをワイヤードNORとして設定!!! set_sleep_mode(SLEEP_MODE_PWR_DOWN); //フルスリープモードsleep_cpu(); //スリープモードをアクティブにします} //ウェイクアップfunctionvoidwake_up(){sleep_disable(); //スリープモードを無効にしますdetachInterrupt(digitalPinToInterrupt(Interrupt_Pin)); //割り込みを削除します}
カスタムパーツとエンクロージャー
回路図
remote_sketch_r4f8a47oWX.fz 製造プロセス