※なにか気になる点がありましたらコメント欄からお伝えください。また、回路を製作する場合には電源を切るなど、注意を払って行うようお願いいたします。
(2021/10/11)
目次
出典:
ラズベリーパイpico(AD変換含む)
www.raspberrypi.org
秋月電子通商のHP
・人感センサは下記リンク先の検索欄に「SB412A」と入力して、調べてください。(秋月電子通商の意向により)
(2023/10/02 訂正)
akizukidenshi.com
1. はじめに
1月の中ごろ、人感センサを用いた温風ファンがトイレにあると、暖かいし便利だと思い作ることとした。何年か前に、植木を寒さで痛めないようにと温風ファンを購入しており、それに制御装置を取り付けて製作した。
2. 回路構成
制御部と温風ファン動作部の2部構成となった。(図1:全体図、図2:内部の写真、図3:外装、図4:回路図)
2.1 温風ファン駆動部
温風ファン駆動部はAC100Vコンセント、リレー、温風ファン接続用コンセント、温風ファン(300w)、ヒューズ(3A)から構成される。リレーなどもっと小型化できるかと思うが、手持ちの部品を使ったので少し大きめになってしまった。特に難しい部分はないので、詳しい説明は省略する。
2.2 制御部
2.2.1構成
ラズベリーパイpico(以下pico)を利用して制御部を構成した。人感センサ(モジュール)から信号が入力され、picoのAD変換を通して信号を取り込み、pico内部で信号を処理し、pin22(GP17)からリレーのコイルをオン・オフしている。
2.2.2 人感センサモジュール
今回用いた人感センサのモジュール(秋月:SB412A 図5)では、モジュール内のセンサの信号がやや遅れて、出力がオン状態となる(実はAD変換を使わずに、デジタル信号としてオンかオフかでも検出可能)。
ホールド回路が内蔵されており、モジュールに付いているVRを用いて、ホールドの時間を約5秒から1時間程度まで設定可能である。したがって、実際は今回用いた人感センサのモジュールと増幅回路を使えば、温風ファンは制御可能と思われる。しかし、picoを使った回路を作ってみたいという願望もあったので、あえてpicoを利用することとした。(pico内のAD変換器も使ってみたかった)
2.2.3 ラズベリーパイpico内部の処理
picoはマイコンという位置づけからか、AD変換器が内蔵されている。(今までのラズベリーパイでは外付けでAD変換用ICを用意しなければならなかった)使い方は後ほど述べる。
内部の処理は、AD変換の値から、一定時間GP17の出力をFalseにしている。増幅回路への出力がオフのとき、リレーのコイルがONになるようにしてしまったので、picoからの出力とリレー回路のオン・オフが逆になってしまった。改善の余地はあると思う。
最後にpicoからの信号を増幅する部分であるが、トランジスタを使っている。素子や抵抗の値は、あまり深く考えなかった。(とりあえず動けばいいだろう、というスタンス)
3. AD変換について
AD変換用のpicoのピンは#31,#32,#34(それぞれGP26,GP27,GP28)が用意されている。対応するAD変換はADC0~2の3つである(図5)。また、#33はアナログGND、#35はADC_VREFであり、#35と#33の電位差がAD変換時の基準電圧となる。(ADC0~2の電圧値が基準電圧と同じになるとき、フルレンジとなる)デフォルトでは特に接続する必要はない。(pico内の3.3Vが基準電圧となる)
AD変換を使用するためのコードをリスト1に示す。ADC用のインスタンスを作り(4行)、メソッドを用いることにより(7行)ADCによる変換値を取り込んでいる。今回の場合、3.3Vで65535の値が出力されるようになっている。
import machine import utime analog_value = machine.ADC(28) # ADCのインスタンスを取得 while True: reading = analog_value.read_u16() # メソッドを用いてデータを取得 print("ADC: ",reading) # プリントアウト utime.sleep(2) # 2秒待機
リスト1 AD変換器を利用する
4. pico内のコード(microPythonによる)
picoのコードをリスト2に載せる。動作は制御部の説明で述べたとおりである。詳細はコード内のコメントを参照していただきたい。
# jinkan sencer -> RaspberryPi pico -> WarmFan # controller # made on 2021/Feb./26(Fri) by okejirou(first time) # import machine # 必要なライブラリをインポートする import utime from machine import Pin # GP17から、リレーに出力 RelayOn = Pin(17, Pin.OUT) # PinNo 22(GP17) # ADC2のインスタンスを作成しています analog_value = machine.ADC(28) # PinNo 34(GP28, ADC2) read_old = 0 # read_old とread_new により、センサからの read_new = 0 # 立ち上がりを検出 sw_on_timer = 0 # リレーがONになってからの秒数を計測 sw_on_flag = False # フラグがONのとき、リレーもON INTERVAL_TIME = 20 # スイッチOFFまでの時間(秒) while True: read_old = read_new utime.sleep_ms(10) # wait 10[ms] read_new = analog_value.read_u16() #print("ADC(new, old): ", read_new, read_old) # デバッグ用 # センサからの信号の立ち上がりとセンサがONのときのどちらかで # リレーをONにする if (read_new - read_old >= 1000) or (read_new > 40000): sw_on_flag = True sw_on_timer = 0 # 指定時間が経ったとき、リレーをオフにする sw_on_timer += 1 if sw_on_timer >= INTERVAL_TIME: sw_on_flag = False sw_on_timer = 0 # フラグの値により、オン/オフを切り替えている if sw_on_flag == True: RelayOn.low() # リレーON(出力は'0') else: RelayOn.high() # リレーOFF(出力は'1') utime.sleep(1) # 制御周期は1秒 # フラグは省略しても制御可能と思われる。(2021/6/14)
リスト2 人感センサ付き温風ファンのpico内のコード
映像(字幕をオンにしてお楽しみ下さい)
youtu.be
5. 反省点
- 映像で分かるかと思うが、トイレを出てからオフになるまでの時間が長いと思う。距離センサも付け加えることにより改善できないか考案中である。
- はじめは電池駆動としたが、うまくいかなかった。リレーのコイルに流れる電流が大きいせいか、1日で電池を消費してしまった。picoにはスリープモードがあるらしいので、利用できないか勉強してみたいと思う。
- picoの電源をUSBから供給するようにしたため、電源コードばかりになり、美しくなくなってしまった。できれば、温風ファン用のコード1本のみで制御用の電源と温風ファン駆動回路を構成したい。
- ケースを可愛くしたかったが、センスがないためかうまくいかなかった(笑)。
6. まとめ
ラズベリーパイpicoを用いて人感センサ付き温風ファンの制御を行った。
- 秋月の人感センサを用いた。出力をホールドする回路はない方が今回はいいように思った。(人感センサからの信号を増幅して出力してくれるほうが、都合がいいと思った)
- ラズベリーパイpicoを利用した。(picoの電池による駆動は負荷が大きかったため今回はできなかった)pico内部のAD変換器も利用してみた。
- トイレを出た後も、しばらく動作が続いてしまっている。改善したい。
記事を投稿したのが夏なので、扇風機を温風ファンに替えて駆動してみたい。(人感センサの付いた扇風機はすでに市場に出回っている。近づくだけで動作するのは場合によっては不便なことがあるかも知れない)
※至らない点等ありましたら、ご指摘いただければと思います