haru5ya が 2024年10月14日16時30分32秒 に編集
初版
タイトルの変更
紐スイッチで簡単操作!赤外線を使ったLED電灯のオンオフ制御
タグの変更
RaspberryPiPICO
赤外線リモコン
micropython
Python
メイン画像の変更
記事種類の変更
製作品
ライセンスの変更
(MIT) The MIT License
本文の変更
# はじめに リモートワークで自宅作業が増えて、作業部屋での作業が増えたところが発端となっています。 1. 作業部屋の電気が暗いなあ(蛍光灯の電灯) 2. そうだ!LEDの電灯にすれば明るくなるだろう! 3. 明るくなったけど赤外線リモコンが時々居なくなる(掃除しようね。だが断る。) 4. ええい!紐スイッチ付き赤外線リモコンを作ってやろう(考え方昭和です。) それでできたのがこれ。  これならリモコンを探す心配はないし、暗いところでも少々手を振ればひもに当たってわかりやすい。 それに昭和生まれのおじさんには、ひもで電源のオン、オフに慣れています。 電灯は「YAMADA電気 YLLS06L」です。 # 仕様 プルスイッチを引っ張るごとに順番に全面点灯→常夜灯点灯→電源(消灯)を繰り返すでOKとしました。 # 部品 | 部品名 | 個数 | | ---------------------------------------- | ---- | | Raspberry Pi pico | 1 | | トランジスタ S8050 | 1 | | 赤外線LED(LD271) | 1 | | 抵抗 20 | 1 | | 抵抗 1K | 1 | | 小型キャノピスイッチ(panasonic WS52011)※ | 1 | ※商品によって名称が異なりますが、ここではプルスイッチと呼びます。 # 回路図 すごくシンプル。  取り敢えず、ブレッドボードで組んでみて赤外線LEDをオン、オフをしてみたら動いていることを確認しました。 普通のLチカだったら光って見えるけど赤外線は見えないので、動いているのかどうかを確認するのが大変です。 赤外線をブザー音に変換するキットが売っていたので、これで確認しました。キットの赤外線センサーに向けて赤外線を点灯するとキットのブザー音がします。とりあえず赤外線LEDが点灯していることはわかります。 だけどこのキットどこで買ったんでしょうか。忘れてしまいました。  # 赤外線送信ライブラリ MicroPythonで書けばちょちょいのちょいだと思っていたら、赤外線送信のライブラリがありませんでした。 よく考えれば、赤外線の信号をPythonで作成するのは難しいですね。 ググってみたらRaspberry Pi picoで動く赤外線リモコンのライブラリを発見! こちらにありました。ありがとうございます。 [MicroPythonで赤外線リモコンの簡単制御 ](https://qiita.com/iotberrypi/items/a2c739049bee4bb615c8) これでもうバッチリだと思ったら、このライブラリはビット単位でデータを渡してやらないと送信してくれない。 Arduinoのライブラリなんかでしたら、NEC形式の16進で渡してやると送信してくれるものなんかがあります。 そこで、元の記事を参考にして、赤外線受信回路をブレッドボードで組み立てて、受信ライブラリを使ってリモコンの信号を受信して、ビットデータを取得しました。 この部分はメインではないので、記事としては省いています。 # ソフトウェア プログラムはこれです。あまりPythonは得意でないのでこんなもんで、許してください。 しかし、Pythonで書きますと楽で便利です。 ThonnyでRaspberry Pi picoに書き込んでいます。 1. プルスイッチのオン、オフを読み込み用にGP3をプルアップで入力モードにします。 2. 赤外線LEDをオン、オフするためにGP2を出力モードにします。 3. プルスイッチを引っ張った時にRaspberry Pi picoのLEDを点滅するようしています。(GP25) 4. 赤外線のデータを定義します。全面点灯(all_list)、常夜灯点灯(small_list)、電源(power_list) 5. 起動時にRaspberry Pi picoのLEDを点滅して、起動したことを表します。 6. Loop 1. プルスイッチを引くごとに全面点灯→常夜灯点灯→電源を赤外線LEDで送信するようにしています。 2. プルスイッチのチャタリング対応ということで100mSecのsleepを入れています。 ```python from machine import Pin,PWM import time from UpyIrTx import UpyIrTx print("start python") pull_sw = Pin(3, machine.Pin.IN, machine.Pin.PULL_UP) tx_pin = Pin(2, Pin.OUT) tx = UpyIrTx(0, tx_pin) led_pin = Pin(25, Pin.OUT) power_list = [9120, 4560, 570, 570, 570, 1710, 570, 570, 570, 1710, 570, 1710, 570, 570, 570, 570, 570, 1710, 570, 1710, 570, 570, 570, 1710, 570, 570, 570, 570, 570, 570, 570, 1710, 570, 570, 570, 570, 570, 570, 570, 1710, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 1710, 570, 1710, 570, 570, 570, 1710, 570, 1710, 570, 1710, 570, 1710, 570, 1710, 570, 41040, 9120, 4560, 570, 570, 570, 1710, 570, 570, 570, 1710, 570, 1710, 570, 570, 570, 570, 570, 1710, 570, 1710, 570, 570, 570, 1710, 570, 570, 570, 570, 570, 570, 570, 1710, 570, 570, 570, 570, 570, 570, 570, 1710, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 570, 1710, 570, 1710, 570, 570, 570, 1710, 570, 1710, 570, 1710, 570, 1710, 570, 1710, 570] small_list = [9152, 4576, 572, 572, 572, 1716, 572, 572, 572, 1716, 572, 1716, 572, 572, 572, 572, 572, 1716, 572, 1716, 572, 572, 572, 1716, 572, 572, 572, 572, 572, 572, 572, 1716, 572, 572, 572, 572, 572, 572, 572, 572, 572, 1716, 572, 572, 572, 572, 572, 572, 572, 1716, 572, 1716, 572, 1716, 572, 1716, 572, 572, 572, 1716, 572, 1716, 572, 1716, 572, 572, 572, 41184, 9152, 4576, 572, 572, 572, 1716, 572, 572, 572, 1716, 572, 1716, 572, 572, 572, 572, 572, 1716, 572, 1716, 572, 572, 572, 1716, 572, 572, 572, 572, 572, 572, 572, 1716, 572, 572, 572, 572, 572, 572, 572, 572, 572, 1716, 572, 572, 572, 572, 572, 572, 572, 1716, 572, 1716, 572, 1716, 572, 1716, 572, 572, 572, 1716, 572, 1716, 572, 1716, 572, 572, 572] all_list = [9136, 4568, 571, 571, 571, 1713, 571, 571, 571, 1713, 571, 1713, 571, 571, 571, 571, 571, 1713, 571, 1713, 571, 571, 571, 1713, 571, 571, 571, 571, 571, 571, 571, 1713, 571, 571, 571, 571, 571, 571, 571, 571, 571, 1713, 571, 571, 571, 571, 571, 1713, 571, 571, 571, 1713, 571, 1713, 571, 1713, 571, 571, 571, 1713, 571, 1713, 571, 571, 571, 1713, 571, 41112, 9136, 4568, 571, 571, 571, 1713, 571, 571, 571, 1713, 571, 1713, 571, 571, 571, 571, 571, 1713, 571, 1713, 571, 571, 571, 1713, 571, 571, 571, 571, 571, 571, 571, 1713, 571, 571, 571, 571, 571, 571, 571, 571, 571, 1713, 571, 571, 571, 571, 571, 1713, 571, 571, 571, 1713, 571, 1713, 571, 1713, 571, 571, 571, 1713, 571, 1713, 571, 571, 571, 1713, 571] for i in range(3): led_pin.on() time.sleep(0.5) led_pin.off() time.sleep(0.5) prev_sw_value = pull_sw.value() sw_index = 0 led_blink = 0 while True: if prev_sw_value != pull_sw.value(): led_pin.on() # LEDをONにする led_blink = 5 if sw_index == 0: tx.send(all_list) sw_index += 1 elif sw_index == 1: tx.send(small_list) sw_index += 1 elif sw_index == 2: tx.send(power_list) sw_index = 0 prev_sw_value = pull_sw.value() time.sleep(0.1) # 0.1秒待つ if led_blink == 0: led_pin.off() # LEDをOFFにする led_blink -= 1 ``` # 最後に ソフトウェア、ハードウェアによる省電力化をしたかったのですが、これをしだすと切った貼ったで動かなくなりそうなので、次回のお楽しみとさせていただきます。 赤外線をメインにモノづくりをしていますので、また何かありましたらアップさせていただきます。 回路とソースはご自身の責任の元自由に使ってください。あくまで自己責任という事でお願いします。