稼働中

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 外観

接続例

RCWL-0516の電源電圧は動作電圧は4.0-28Vなので別途電源が必要です。5V電源を使いました。
供給電源が5VでもRCWL-0516のOUT出力は3.3VなのでRaspberry Pi Picoと接続できます。
RCWL-0516のOUTをGP22に接続、OUT出力が目視できるようにGP21にLEDを接続しています。
RCWL-0516 接続図
また、制御ICのRCWL-9196の12pin(2OUT)をGP26(ADC0)に接続しました。
RCWL-9196 2OUT

スクリプト

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)になった部分を抜粋しています。
RCWL-0516 結果1
RCWL-0516 結果2

大雑把に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保持を確認しました。
RCWL-0516 結果3


>> %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を使って動体検知ができました。