Raspberry Pi Pico(d_29)RCWL-0516 レーダー方式動体センサー
RCWL-0516
RCWL-0516はドップラーレーダー方式マイクロ波動体センサーです。Raspberry Pi PicoでRCWL-0516の動作を確認しました。
※micro:bitの記事e_16からRaspberry Pi Picoで使えるように追記、修正等をしました。
外観
RCWL-0516モジュールHW-315の外観写真です。制御ICにRCWL-9196が実装されています。
検出範囲はテーパー角度120度未満、7メートル以内だそうです。
検知するとOUTが3.3V(HIGH)になり2sec間保持します。
3V3は3.3Vを出力しますが他の電源としては使用できないそうです。
CDS(写真左の右下)はCdSを外付けして日中に検出をオフにすることができるらしいです。(使ってません)
接続例
RCWL-0516の電源電圧は動作電圧は4.0-28Vなので別途電源が必要です。5V電源を使いました。
供給電源が5VでもRCWL-0516のOUT出力は3.3VなのでRaspberry Pi Picoと接続できます。
RCWL-0516のOUTをGP22に接続、OUT出力が目視できるようにGP21にLEDを接続しています。
また、制御ICのRCWL-9196の12pin(2OUT)をGP26(ADC0)に接続しました。
スクリプト
RCWL-0516のスクリプトは以下のようにしました。
※開発環境はThonnyです。ThonnyでMicroPythonをRaspberry Pi Pico with RP2040にインストールして使っています。
※Raspberry Pi Pico単独で動作させるには’main.py’としてRaspberry Pi Picoにuploadして使います。
#pico_rcwl_test_01.py
from machine import Pin, ADC
import time
dpin=Pin(22, Pin.IN, Pin.PULL_DOWN) #RCWL-OUT
apin=ADC(Pin(26)) #ADC(0)RCWL-RAW 2OUT
led2=Pin(21, Pin.OUT, value=0) #LED
while True:
d_out=dpin.value() #RCWL OUT '0','1'
r=apin.read_u16() #ADC.read_u16()
v_adc=r*3300/(2**16) #mv
if d_out==1:
led2(1)
else:
led2(0)
print('%4d' %v_adc,'%4d' %(d_out*1000), 0,1500,2500)
time.sleep_ms(20) # 検知確認数周期
部分説明
制御ICのRCWL-9196の2OUT(12pin)のアナログ値とRCWL-0516のOUTのデータをとってています。
d_out:RCWL-0516のOUT ’0′(led2-off),’1′(led2-on)
v_adc:RCWL-9196の2OUT AD変換した電圧値
実行結果
結果は以下のようになりました。Thonnyのメニュー>ViewにあるPlotterを有効にしています。※Thonnyのshellに表示されます。
RCWL-0516のOUTのデータが’H'(d_out=1000)になった部分を抜粋しています。
大雑把にv_adcの基準が2000mVで差分が500mVを超えるとRCWL-0516のOUTが’H’なるようです。
図には示されていませんがOUTの保持は約2secでした。
2OUT値で制御
使ってみると差分500mVでは反応が鈍いような気がしました。そのためRCWL-0516のOUTは使わずv_adcの値(RCWL-9196の2OUT)だけで処理してみました。差分は250mV、保持時間は1secで応答するようにして見ました。
保持にclass ‘Timer’を使っているので保持期間中もv_adcは測定しています。
#pico_rcwl_test_02.py
from machine import Pin, ADC, Timer
import time
dpin=Pin(22, Pin.IN, Pin.PULL_DOWN) #RCWL-OUT
apin=ADC(Pin(26)) #ADC(0)RCWL-RAW 2OUT
led2=Pin(21, Pin.OUT, value=0) #LED
#callback hold-off hold(d_out)
def h_off(t):
global hold
hold=0
led2.low() #led2(0)
ut=time.ticks_ms()
print('hold off ticks=', ut-st) # hold時間確認
tim=Timer() # machine.Timer class
hold=0 # 保持フラグ
sens=250 # 感度(2000mV±sens)
while True:
#d_out=dpin.value()
r=apin.read_u16() #ADC.read_u16()
v_adc=r*3300/(2**16) #mv
diff=abs(v_adc-2000)
if diff >= sens:
hold=1
led2(1)
#保持時間1秒 period(msec)、h_offをcallback
tim.init(period=1000, mode=Timer.ONE_SHOT, callback=h_off)
st=time.ticks_ms() # hold時間確認用
print('%4d' %v_adc,'%4d' %(hold*1000))
time.sleep_ms(20) # 検知確認数周期
実行結果
大雑把にv_adcの基準が約1750mV、差分250mVでhold’1’を返しています。また1sec保持を確認しました。
>> %Run -c $EDITOR_CONTENT
省略
1890 0
1802 0
1777 0
1756 0
1706 1000
1708 1000
1690 1000
1718 1000
省略
1966 1000
1979 1000
1967 1000
hold off ticks= 1000 #保持1sec
1955 0
1946 0
1950 0
省略
まとめ
Raspberry Pi PicoでRCWL-0516を使って動体検知ができました。