どんなうごき
雨センサーは銅のパターンの間に水などが付着すると抵抗値が下がることを利用して、雨がふってきたことを検出するセンサー。手汗があれば指なんかでも反応します。
つくりかた
用意するもの
- Raspberry Pi pico
- microUSBケーブル
- PC(WindowsかMac)
- ブレッドボード
- ブレッドボード用ケーブル
- 雨センサー
せつぞく
プログラム
#import RPi.GPIO as GPIO
from machine import Pin, PWM, ADC
import time
#RaspberryPiの動作確認:LED点灯(LED3回点滅)
led = Pin(25, Pin.OUT) #RaspberryPiにのっているLEDはGP25、出力設定にする。
led.value(0) #GP25をL出力
print('Program Start')
for i in range (6):
led.toggle() #toggleは H -> L ,L -> H
time.sleep(0.3) #0.3secのWait
#Pinの初期設定
Pin_Rain=Pin(27 , Pin.IN , Pin.PULL_UP) # GP27を入力端子(プルアップ)に設定
Pin_ADC=ADC(0) # ADC(0)(=GP26兼用ピン)をアナログデジタル変換入力
def loop():
while True:
led.value(Pin_Rain.value()) #GP27の出力と反対の動きで、RaspberryPiのLEDが点灯/消灯する
if Pin_Rain.value() == 0: #GP27がLowになったら
adti=Pin_ADC.read_u16()*3.3/65535 #ADC0の出力計算
print('{:.2f} V'.format(adti)) #ADC0をThonnyにのシェルに表示
time.sleep(0.2) #0.2secの待ち
#緊急停止のときの処理、使用したポートを入力にしておけば壊れにくい。
def destroy():
Pin_Rain=Pin(27, Pin.IN) # GP27を入力端子に変更
Pin_ADC=Pin(26, Pin.IN) # GP26を入力端子に変更
#プログラムスタート
if __name__ == '__main__': #プログラムスタート
try:
loop()
except KeyboardInterrupt: # Ctrl+C で中断処理
destroy()
できたもの
詳細説明
センサー部分
よく見ると2本の導線でできています。この導線の間に雨粒などが入ると、雨粒によって導線間の電気抵抗が下がります。この下がった抵抗をセンサー用の回路で読み取り電圧に変換しています。
センサー用回路部分
センサーの抵抗値を電圧に変換しています。回路図と基板では使っている文字が違うので、要注意です。回路図のk1にセンサーを接続しています。センサーの抵抗値をRとすると、AC1(P1の1pin)の電圧はR1とRとVCCの抵抗分割で決まります。
ACの電圧をデジタルに変更する必要があります。これを行なっているのがLM393というコンパレーターです。コンパレーターは、でアナログ電圧をデジタル電圧に変換するものです。どの電圧以上ならHigh出力、どの電圧以下ならLow出力となるように設計されています。この電圧を閾値電圧といい、回路図ではR2の可変抵抗で抵抗分割しINの電圧を閾値電圧にしています。R2の矢印より上の抵抗値をR2”,矢印より下の抵抗値をR2’とすると、下のような式になります。R2=R2’’+R2’=10kです。
式にしても、雨粒の抵抗値を測らないと設計はできませんが、基板上では青い四角で+ドライバーで調整できるような部品がR2に当たります。現物あわせで水滴を垂らした時に反応するように+ドライバーで調整しましょう。
RaspberriPi部分
31pin ADC0に設定
ADC0はアナログ電圧をデジタルに変換するポートです。
プログラム中だと以下の3つの行で扱っています。
Pin_ADC=ADC(0) # ADC(0)(=GP26兼用ピン)をアナログデジタル変換入力にピンを設定
adti=Pin_ADC.read_u16()*3.3/65535 #ADC0の出力計算。16ビット(0~65535)で出てくるので、3.3V/65535を掛けることで電圧に単位変換
print('{:.2f} V'.format(adti)) #ADC0をThonnyのシェルに表示
32pin GP27に設定
さらに入力ポート、プルアップで設定。GPはGeneralPort で1か0を入出力で設定できます。プログラムでは以下の部分で使用しています。入力ポートなのでDOの電圧を読み取ります。プルアップというのはラズパイ内部で抵抗を3V3と繋ぐ状態です。ちなみにプルダウンは内部抵抗をGNDと接続することを言います。今回、プルダウンでなければOKですが、センサー用回路と未接続時に電圧を固定するためにこのような設定にしています。念のためですね。
Pin_Rain=Pin(27 , Pin.IN , Pin.PULL_UP) # GP27を入力端子(プルアップ)に設定
led.value(Pin_Rain.value()) #GP27の出力と反対の動きで、RaspberryPiのLEDが点灯/消灯する
if Pin_Rain.value() == 0: #GP27がLowになったら
#if文の中身実行
プルダウンがダメな理由は、センサー用回路のLEDが光らなくなるためです。ラズパイとセンサー用回路全体で見るとR4,R5の下にプルダウン抵抗50~80kΩが付いているようなイメージとなります。すると、LEDの両端(アノードとカソード)の電圧差が小さくなり、LEDが光らなくなります。LEDの計算はLED点灯回路にありますので見てみてください。
38pin GND
回路のグランドになります。33pinでも28pinでも23pinでもラズパイのGNDとなっているところであればOKです。
36pin VCC
センサー用回路に供給するための3.3Vの電源になります。
コメント