ラズベリーパイPico Wを介してブルートゥースでDCモータを制御してみよう

ラズベリーパイPico WとモータドライバでDCモータを動かしてみようでラズベリーパイPicoでDCモータを動かせるようになりました。

モータを使えるようになったことで、ラジコンカー等の電子工作を行えるようになりました。

次にやりたいこととして、ラジコンカーのリモコンのようなものが挙がるかもしれませんので、今回はブルートゥースでモータを制御できるようにしてみます。


冒頭のリンク先の記事で作成したmain.pyを下記のように改修します。


main.py

import bluetooth
import PicoMotorDriver
from ble_simple_peripheral import BLESimplePeripheral
import time

speed = 80

board = PicoMotorDriver.KitronikPicoMotor()
board.motorOff(1)

# 動作確認用のコード 必要であればコメントアウトを外す
#board.motorOn(1, "f", speed)
#time.sleep(2)
#board.motorOn(1, "r", speed)
#time.sleep(2)
#board.motorOff(1)

ble = bluetooth.BLE()
p = BLESimplePeripheral(ble)

def on_rx(v):
    print("received:", v)
    if v == b'f\r\n':
        board.motorOn(1, "f", speed)
    elif v == b'r\r\n':
        board.motorOn(1, "r", speed)
    else:
        board.motorOff(1)
       
while True:
    if p.is_connected():
        p.on_write(on_rx)

from ble_simple_peripheral import BLESimplePeripheral

に関しては、ラズベリーパイPico WでBluetoothを使ってみるを参考にしてください。


今回作成したコードはブルートゥースの子機(ペリフェラル)の役割を持つようになるものです。




続いて親機(セントラル)の方を作成します。

パソコンでPythonを用いてコードを書くパターンとラズベリーパイPico WでMicroPythonで書くパターンがありますが、今回は前者で話を進めます。


以下の内容はPythonでSerial Bluetooth Terminalの動作を再現してみるでscan.pyの処理を見た後、ラズベリーパイPico WでBluetooth接続を介してLチカをしてみるで子機に対して何らかの値を送信したことを前提にして話を進めます。


パソコンに保存されているmain.pyを下記のように改修します。


~/workspace/ble/main.py

from bluepy import btle
import time

PERIPHERAL_MAC_ADDRESS = "XX:XX:XX:XX:XX:XX"

p = btle.Peripheral()
p.connect(PERIPHERAL_MAC_ADDRESS, btle.ADDR_TYPE_PUBLIC)
print("connected")

TIMEOUT = 3.0
while True:
    if p.waitForNotifications(TIMEOUT):
        continue

    # 子機に対して、f と r の値を送信した後に停止信号を送りループを抜ける
    p.writeCharacteristic(0x000c, b'f\r\n')
    time.sleep(2)
    p.writeCharacteristic(0x000c, b'r\r\n')
    time.sleep(2)
    p.writeCharacteristic(0x000c, b's\r\n')
    break

p.disconnect()
print("disconnected")

※0x000c や b'f\r\n' 等の値の説明は省略します。


このコードを実行してみると、子機(ペリフェラル)のラズベリーパイPico Wの方で



のように動作になります。