Raspberry Pi PicoをArduinoにしてモーションを検知してみる

投稿者:

モーションセンサを使う

Raspberry Pi Picoが発売されてもう少しで半年になり、周辺モジュールやその他いろいろな電子工作に応用されていることと思います。そんな中で公式ガイドブックで紹介されている焦電型モーションセンサを使ってモーションを検出してみました。なお今回使用するセンサはスイッチサイエンスウェブショップで取り扱っております。

PIRセンサとPicoを接続した。ちなみにセンサは当ショップで取り扱っている

実験として、簡単に扱えるMicroPythonを使用します。そのためにRaspberry Pi PicoにMicroPythonが動作するファームウェアをここの「Download UF2 file」からダウンロードして焼きこみます。焼くときは本体の「BOOT SEL」ボタンを押しながらPCに接続することでフォルダとして認識されるのでダウンロードしたUF2ファイルをD&Dで配置します。

"BOOT SEL"ボタンを押しながらUSBに接続することドライブとして認識される。ここにダウンロードしたUF2ファイルを配置する。

同じくMicroPythonを用いて実験を行うので便利な環境であるThonnyをインストールします。最初はPythonで実行されてしまうので、下のPythonと書かれているところをクリックしてRaspberry Pi Picoに切り替えます。

Thonnyの起動画面 Raspberry Pi PicoをプログラムするにはPicoを接続した状態で矢印部分をクリックして切り替える。

使う焦電センサはHC-SR501で公式のガイドでもp.81~で使用されています。ガイド通りにVCCをVBUSへ、GNDをGNDへ、VOとGP28をそれぞれ接続します。

モーションセンサとPicoを接続した。モーションセンサは真ん中がVO
※写真の配線接続が逆ではないかとの指摘を受け、正しい接続へと差し替えました。5/12
Picoのピンアサイン。 あると便利。

コードを書きます。

import machine as m
import utime

sensor = m.Pin(28, m.Pin.IN, m.Pin.PULL_DOWN) //センサの接続ポート
led = m.Pin(25, m.Pin.OUT) // 本体のLEDを使用する.

while True:
     led.value(sensor.value()) //取得した状態をそのままLEDに流す

このコードを用いて本体の可変抵抗を回して感度と時間を調整します。可変抵抗を正面に見て左側が感度、右側が時間です。時間は右回りで伸びる方向、感度も同じです。時間調整は回し切るとかなり長い時間High状態になるので適切値を設定しましょう(何事もなければデフォルト値で問題ありません)

左が感度、右が時間 それぞれ右回りで伸びる

Thonnyの「実行」ボタンを押して実行するとしたの写真のようにモーションを検知した時だけ光るようになっていると思います。

うまくいくとこのように本体のLEDが光る

このセンサに採用されている素子はBIS0001でその素子の動きは以下の図のようになっています。(デフォルトではLowに設定されていると思います。)

センサーの動き Voが二つあるのはショートするピンの設定によって違う

ここでコードを書き換えます。今のままだと無限ループで回しているので他の処理を挟んだ時に動きが不安定になる可能性があります。そこでトリガー割り込みでの動作にします。

import machine as m
import utime

sensor = m.Pin(28, m.Pin.IN, m.Pin.PULL_DOWN) 
led = m.Pin(25, m.Pin.OUT)

def sensor_callback(Pin):
  //させたい処理を書く
    led.value(1)
    utime.sleep_ms(250)
    led.value(0)
        
sensor.irq(trigger = m.Pin.IRQ_RISING, handler = sensor_callback)

これでセンサが反応した時に呼ばれる関数ができました。あとはモーションを検知した時に実行したい処理を関数内に追加すれば動きます。

Arduino でRaspberry Pi Picoを開発する

ここまではPIRセンサの使い方を紹介しました。ここからはPicoをArduinoとして開発するための準備と解説を行います。使うのはArduino IDEですのでインストールしておきます。

Arduino IDE

まず Arduino IDEの「ツール」>「ボード」>「ボードマネージャー」から検索で「Pico」と検索します

Picoと検索して公式から出ているものを選ぶ

そして一番目の「Arduino Mbed OS RP2040 Boards」をインストールします。

そして「ツール」>「ボード」>「Arduino MbedOS RP2040 Boards」>「Raspberry Pi Pico」を選択します。

これで一連の作業は終了です。試しにHello Worldしてみましょう

void setup() {
  // put your setup code here, to run once:
  Serial.begin(9600);
}

void loop() {
  // put your main code here, to run repeatedly:
  Serial.println("hello world");
}

とプログラムを作成して、本体の「BOOT SEL」ボタンを押しながらPCと接続します。

そしてArduino Unoと同じように画面上部の矢印ボタンを押してビルド、書き込みを行います。書きこみが終わったら「ツール」>「シリアルポート」をRaspberry Pi Picoのポートに設定してシリアルモニタを表示します。

どうでしょうか? ちゃんと表示されましたか?

あとはArduinoとして開発を行うことができます

PIRモーションセンサをArduinoで開発したRaspberry Pi Picoで開発をする

このややこしい文章が書きたかっただけです。

まずセンサの状態を取得してみましょう

void setup(){
     pinMode(25, OUTPUT);
     pinMode(28, INPUT_PULLDOWN);
     Serial.begin(9600);
}

void loop(){
     int value = digitalRead(28);
     Serial.println(value)
     digitalWrite(25, value);
}

と書いてセンサの状態をシリアルモニタと本体のLEDとで確認をします。

ではMicroPythonで記述した時と同じように割り込みを設定してみましょう。割り込みに使う関数は「attachInterrupt()」です。以下がその関数の説明です

///
/// pin = 割り込みを設定するピン番号
/// func = 呼び出すコールバック関数
/// mode = RISING, FALLING, CHANGE, LOWそれぞれ
///       立上がり,立下り,両方, LOW状態に反応する
attachInterrupt(int pin, void(*)() func, int mode);
void setup() {
  Serial.begin(9600);  //シリアル通信を有効化
  pinMode(28, INPUT_PULLDOWN);  //28番(PIRセンサ出力)を入力に設定
  attachInterrupt(28, Sensor_Callback, CHANGE); 
     //割り込みを28番にしてエッジ認識設定
  pinMode(25, OUTPUT); //25番(本体LED)を出力に設定
}

void Sensor_Callback(){
  digitalWrite(25, digitalRead(28)); //センサ出力をLEDで表示する
}

void loop() {
  
}

これでセンサーが反応している間本体のLEDが光るコードが完成しました。

まとめ

最初は公式ドキュメント通りにPIRセンサを取り扱ってみました。この記事を書いている途中で、このニュースを見て急遽ややこしい題名に書き直しました。Picoをarduinoで開発するのはその性質上かなり望まれていた部分があるのでようやくといった感覚があります。皆様もPicoをArduinoで開発してみてはいかがでしょうか?