Maker Pi RP2040で人感センサとサーボモータとOLEDディスプレイを動かしてみました。
まず、通常の方法でMicroPythonのファームウェアをセットアップします。
ファームウェアセットアップする際には、microUSB端子の横にある電源をONにしておきます。
設定方法は下記のURLに記載されています。
URL: https://www.raspberrypi.org/documentation/rp2040/getting-started/#getting-started-with-micropython
また、当ブログでは下記の記事に記載しています。
次に、開発環境の設定していない場合は設定します。
当ブログでは下記の記事に記載しています。
準備が整ったらUSBケーブルをコンピューターに接続します。
おそらく、BOOTSELボタンを押しながら起動するのは初期設定のときのみで、
普段は普通の接続で大丈夫そうです。
Thonnyを起動し、インタプリタとして「MicroPython(Raspberry Pi Pico)」を選択します。
これは、右下のボックスをクリックして行うことができます。
設定が終わったら各種部品を1つずつ動かしていきます。
まず、人感センサですが、人感センサはGROVEの下記の人感センサを用いています。
このセンサはデジタル入力で反応なしの場合は0、対象物に反応すると1になるセンサーです。
今回は人感センサはGROVE4に接続し、人感センサを単体を動かすプログラムは下記のように記述しました。
from machine import Pin
import utime
pir = Pin(17, Pin.IN,Pin.PULL_DOWN)
while True:
if pir.value()==1:
print("Hello")
else:
print("")
utime.sleep(1)
次は、OLEDディスプレイですが、OLEDディスプレイに関する記述は下記にも記載しています。
今回は、GROVE OLEDディスプレイではなく、秋月電子から購入した汎用のOLEDディスプレイを用いており、接続はGROVE-4ピンジャンパメスケーブルを用いて下記のように接続しております。
OLEDディスプレイ: https://akizukidenshi.com/catalog/g/gP-12031/
配線: GND:黒、VCC:赤、SCL:黄、SDA:白
プログラムを作成する前にメインプログラムで使用する下記のサブルーチンプログラムを「ssd1306.py」の名前でRaspberry Pi Picoに保存します。このとき、ファイル名は**.pyまでつけないと、ファイルの呼び出しができません。
ssd1306.py
今回はOLEDディスプレイはGROVE2に接続し、OLEDディスプレイを単体を動かすプログラムは下記のように記述しました。
from machine import Pin, I2C
from ssd1306 import SSD1306_I2C
import utime
WIDTH = 128
HEIGHT = 64
i2c = I2C(1, scl=Pin(3), sda=Pin(2), freq=200000)
oled = SSD1306_I2C(WIDTH, HEIGHT, i2c)
while True:
oled.fill(0)
oled.text("HELLO",0,10)
oled.show()
最後は、サーボモータですが、サーボモータに関する詳細の記述は下記に記載しています。
今回はこの後の諸事情がありSERVO用の場所ではなく、GROVE6に接続しています。
サーボモータを単体を動かすプログラムは記のように記述しました。
from machine import Pin, PWM
import time
MIN_DUTY = int (0.03*65536)
MAX_DUTY = int (0.12*65536)
pwm = PWM(Pin(27))
pwm.freq(50)
while True:
pwm.duty_u16(MIN_DUTY)
time.sleep_ms(1000)
pwm.duty_u16(MAX_DUTY)
time.sleep_ms(1000)
各部品が動くことが確認出来たら、人感センサとサーボモータとOLEDディスプレイを一度に動かします。
人感センサとサーボモータとOLEDディスプレイを一度に動かすプログラムは下記の通りに作成しました。
from machine import Pin, I2C,PWM
from ssd1306 import SSD1306_I2C
import utime
pir = Pin(17, Pin.IN,Pin.PULL_DOWN)
WIDTH = 128
HEIGHT = 64
i2c = I2C(1, scl=Pin(3), sda=Pin(2), freq=200000)
oled = SSD1306_I2C(WIDTH, HEIGHT, i2c)
MIN_DUTY = int (0.0672*65536)
MID_DUTY = int (0.0725*65536)
MAX_DUTY = int (0.0778*65536)
pwm = PWM(Pin(27))
pwm.freq(50)
while True:
if pir.value()==1:
oled.fill(0)
oled.text("HELLO",0,10)
oled.show()
pwm.duty_u16(MIN_DUTY)
utime.sleep(1)
pwm.duty_u16(MAX_DUTY)
utime.sleep(1)
else:
oled.fill(0)
oled.show()
pwm.duty_u16(MID_DUTY)
utime.sleep(1)
Comments