Pi Pico よりサイズの小さなマイコンボードRP2040-ZeroをラズパイZeroから制御してサーボモータを動かしてみます。
前回はPico とI2Cの組み合わせでしたが、ここではサーボ1個を駆動させるだけなのでUARTを使います。
これはRP2040チップを使ったPico互換デバイスです。
RP2040-Zero用のMicroPythonのファームウェア(uf2)はPi Picoのものを使います。
ラズパイZeroのOSはBullseye Lite を使ってみます。
以下のようにラズパイZeroからRP2040-ZeroにUART経由でコマンドを送ってサーボモータ(SG-90)を制御します。
結線
UART1(Rx,Tx)で結線します。RP2040-ZeroにはGNDは2つありますが、内1つは非常にはんだ付けしづらい場所にあるので実質1つと思ったほうがいいです、その1つにまとめてグラウンドします。
ラズパイZeroに環境構築
OSにはBullseye Liteを使ってみます。
OSインストールに関しては以下をご参照ください。
UARTを使うのでSerial Port の設定は正しく行っておいてください。
次にシリアル接続用のライブラリをインストールします。
pyserialを使いますがBullseyeには入っていないのでインストールします。
インストールにはpipを使いますがBullseyeにはこれも入っていないのでこれからインストールします。
aptリポジトリにはなく少し古いapt-getリポジトリを使ってpipをインストール。
|
1 |
sudo apt-get install pip |
で、/dev/serial0 へのアクセス権を得るためsudoでpyserialをインストールします。
|
1 |
sudo pip install pyserial |
RP2040-Zero に環境構築
ファームウェア(uf2)は以下からダウンロードできます。
最初にあるPicoのファームウェアをダウンロードして使います。
この環境構築にはラズパイZeroは使えません、他のラズパイ4や5、Windowsなどを使います。
例:ラズパイを使用
BOOTボタンを押しながらUSBケーブルで接続します。
RP2040-Zeroはストレージデバイスとして認識され、デバイスをオープンするウィンドウが開きます。
ここに先にダウンロードしたuf2ファイルをドラッグ・ドロップします。コピーが始まり終了するとウィンドウが閉じます。
これでインストール完了です。
以降開発ツールはThonny IDE を使います。
RP2040-Zero側のコード
Pi Zeroから送られてきた角度変数を受けてサーボモータを駆動します。
Thonnyを開いて右下の三本線のバーガーアイコンをクリックして、接続したRP2040-Zeroを開きます(デバイスは/dev/ttyACM0)。
もしここに選択できるメニュが現れなければ、RP2040-Zeroにまだファームウェアがインストールされていない…ということです。
コード
起動時にサーボを3回回転させて位置決めし、パラメータが送られてくるのを待機しています。
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 |
from machine import PWM, Pin from machine import UART import time uart1 = UART(1, 115200, tx=Pin(4), rx=Pin(5)) servo1 = PWM(Pin(28)) servo1.freq(50) def servo_rotate(v): if v >= 10 and v <= 75: w = v * 100 servo1.duty_u16(w) else: pass servo1.duty_u16(1400) time.sleep(0.5) servo1.duty_u16(7500) time.sleep(0.5) servo1.duty_u16(4400) time.sleep(0.5) try: while True: rxData = bytes() while uart1.any() > 0: rxData += uart1.read(1) if len(rxData) > 0: v = int(rxData.decode('utf-8')) servo_rotate(v) time.sleep(1) except KeyboardInterrupt: pass |
これをmain.py という名前でRP2040-Zeroに保存します。
main.pyという名前にすることでRP2040-Zeroに通電されると単独で起動します。
コードをコピーペーストして保存ボタンをクリックします。
どこに保存するか聞いてくるので、「Raspberry Pi Pico」と書かれた方に保存します。
これでOKです。
あとはケーブルを一度外して、再度接続すればRP2040-Zeroは単体で給電されて起動します。
Pi Zero 側のコード
ZeroからUART経由でRP2040-Zeroに角度パラメータを送ります。
送る文字変数はバイト列にする必要があります。
こんな感じ。
【UART_send_angle.py】
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
import serial import sys args = sys.argv if 2 <= len(args): angle = args[1] else: angle = "0" ser = serial.Serial('/dev/serial0', 115200) ser.write(angle.encode()) ser.close() |
UART_send_angle.pyはsudo権限で実行する必要があります。
こんな感じ。
sudo python3 UART_send_angle.py <角度>
いちいちsudo をつけるのは面倒なのでUART_send_angle.pyをsubprocessで実行してみます。
【UART_send_angle_sub.py】
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
import subprocess import sys args = sys.argv if 2 <= len(args): angle = args[1] else: angle = "0" command = ['sudo', 'python3', 'UART_send_angle.py',angle] result = subprocess.run(command, capture_output=True, text=True) stdout = result.stdout stderr = result.stderr print("Standard Output:", stdout) print("Standard Error:", stderr) |
例:55度の角度を送る場合
python3 UART_send_angle_sub.py 55








Leave a Reply