今回は以下の記事の続き。
thom.hateblo.jp
Arduino Unoから赤外線を操作するテストが完了したので、今回はこれをより小さなArduino Pro Microに移植し、ケースに収めて机の天板裏に固定する。
また、USBシリアル通信で送られたコマンドを元に赤外線信号を発信できるようにコードを改良する。
コード
今回は、普段使いのブルーグリーン・ステータス通知用の赤・LED_OFF・LED_ONの4種類をそれぞれ g・ r・ f・n という1文字コードで制御することにした。
これでPCからシリアルモニターで文字を送ることでLEDを制御できる。また、Raspberry PiにUSB接続すればPythonコードからLEDを制御できるようになる。
#include <IRremote.h> void setup() { IrSender.begin(3, false); Serial.begin(9600); } void loop() { uint16_t led_bluegreen[67] = {8930,4420, 580,570, 530,570, 580,570, 530,570, 580,570, 530,570, 530,620, 530,570, 530,1720, 530,1670, 530,1670, 530,1720, 530,570, 530,1720, 480,1720, 480,1720, 530,1720, 480,620, 480,620, 530,1720, 480,620, 530,620, 480,620, 530,620, 480,620, 480,1720, 530,1720, 480,620, 530,1720, 480,1720, 480,1720, 530,1670, 580}; uint16_t led_red[67] = {8880,4470, 580,570, 530,570, 530,570, 580,570, 530,570, 580,570, 530,570, 580,570, 530,1670, 530,1670, 580,1670, 530,1670, 530,570, 580,1670, 530,1670, 530,1670, 580,570, 530,570, 580,1670, 530,570, 530,620, 530,570, 530,570, 580,570, 530,1670, 580,1670, 530,570, 530,1720, 530,1670, 530,1670, 530,1720, 530,1670, 530}; uint16_t turn_off[67] = {8880,4470, 530,570, 580,570, 530,570, 580,520, 580,570, 530,570, 580,570, 530,570, 580,1670, 530,1670, 530,1670, 580,1670, 530,570, 530,1670, 580,1670, 530,1670, 580,520, 580,1670, 530,570, 580,570, 530,570, 580,570, 530,570, 530,570, 580,1670, 530,570, 580,1620, 580,1670, 530,1670, 580,1670, 530,1670, 530,1670, 580}; uint16_t turn_on[67] = {8880,4470, 530,570, 580,570, 530,570, 580,570, 530,570, 530,570, 580,570, 530,570, 580,1670, 530,1670, 530,1670, 580,1670, 530,570, 580,1620, 580,1670, 530,1670, 580,1620, 580,1670, 530,570, 580,570, 530,570, 580,570, 530,570, 530,570, 580,570, 530,570, 580,1670, 530,1670, 530,1670, 580,1670, 530,1670, 530,1670, 580}; // Protocol=NEC Address=0xEF00 Command=0x3 Raw-Data=0xFC03EF00 32 bits LSB first char key; if(Serial.available()){ key = Serial.read(); switch(key){ case 'g': IrSender.sendRaw(led_bluegreen, sizeof(led_bluegreen) / sizeof(led_bluegreen[0]), 38); break; case 'r': IrSender.sendRaw(led_red, sizeof(led_red) / sizeof(led_red[0]), 38); break; case 'f': IrSender.sendRaw(turn_off, sizeof(turn_off) / sizeof(turn_off[0]), 38); break; case 'n': IrSender.sendRaw(turn_on, sizeof(turn_on) / sizeof(turn_on[0]), 38); break; } } }
Pro Microへの移植
今回は以下の5V16MHzタイプを使用した。
私が購入したときは5つで3,300円だったけど今見たら5,300円。昨今の半導体不足の影響か、2,000円も値上がりしている。まぁそうはいっても1つで3,000円近くする純正品に比べると1個1,000円はお手頃価格と言っても良いだろう。
Pro Microの5V16MHzはArduino Leonardoとある程度互換性がある。ボードに書き込む時の選択もLeonardoで良い。
注意点は3つ。
- 一部のソフトと相性が悪いようで、私の場合はNZXTのCAMを落としてからでないと書き込みできない。
- リセットボタンが無いので、バグったときのタイミングがシビア。私の場合は固めのワイヤーの先を輪にしてRSTとGNDをショートさせる道具にしている。デフォルトのブランクスケッチを開いて、書き込み開始した瞬間にRSTとGNDを2回ショートさせると、コンパイル完了した頃にリセットが完了してちゃんと書き込みできるようになるけど、リセットが早すぎると書き込み開始前にプログラムが開始してうまくいかないし、遅いと書き込みが始まったタイミングでまだリセット処理中で書き込み失敗する。ブランクスケッチで正常化させる理由はコンパイル時間が短くてタイミングをはかりやすいから。正常化した後は目的のコードを書きこむ。
- 5Vきっちり出ない。4.6Vとかそれくらいだった。
テストワイヤ―を使用して動作確認。
ちなみにテストワイヤ―は下図のように基盤のスルーホールに引っ掛けることができるワイヤ。
はんだ付けする前に動作チェックできるので持っておくと超便利。
ケース設計
まずはどういう風に収めるか、並べてみる。
そしてFusion360で設計。
裏が平らな基盤でもはんだ付けでもっこりするので、その部分だけ溝を作って対策。
設計するときの計測はデジタルノギスがあると便利。Amazonで2~3,000円なのでなんでも良いから持っておくと重宝すると思う。
完全に寸法通りに作ると実際印刷したときにハマらないので、両側合わせて0.5ミリくらいのマージンを持たせると良いかと思う。1ミリだとグラつく。
さて、印刷してみたところ、綺麗に収まった。
一発で成功するはずがないと思っていたのもあって、とりあえずテスト印刷して再設計するときにフタのことを考えるつもりだったが、面倒くさくなったのでケースはこれで完成ということにしてしまおう。ショート対策としては先日買ったポリイミドテープでカバーしとけば十分だろう。
そしてはんだ付け作業を済ませる。
もともとLEDモジュールについてた足を外すのにかなり苦労して、さらにその跡に残った半田を一旦除去する作業で2時間くらいかかってしまった。。
はんだ吸い取り線でなかなか穴に残ったはんだが吸い取れず、かといって空気圧で吸い出すやつはもっと苦手なので電動のはんだ吸い取り器が欲しくなる。
配線はGND→GND、VCC→VCC、DAT→3となる。
完成品
配線まで終わったらケース底にホットボンドを塗って基盤を押し付けて固定し、最後にポリイミドテープでカバーしておしまい。
このテープは耐熱性があるので結構いろんなところの絶縁に使えて便利だし、この飴色がまた「専用の道具をつかった玄人の手抜き感」が出て満足度が高い。まあ素人なんだけど。
以上