RaspberryPi Pico(W)の開発をThonny+MicroPythonで頑張ってましたが、やはり(Copilotを入れてて使い慣れた)MacBookからも扱えるようにしようと思って、ちょっと路線変更(寄り道)をしてみました。昔みたいにドライバを追加で入れたりせずにUSBケーブルを繋ぎさえすれば見えるようなので、せっかくだからRubyでしょ!とPicoRubyのuf2を探してきて入れてみましたが、うまくいかず(下記URLと全く同じ状況、picoはいけるが、pico wはダメ)。
対して、MicroPythonの方はuf2からすんなり入って動いたので、やっぱりこっちに戻ることに…。homebrew上に便利なツールが見当たりました。CopilotはPicoRubyにも同等のコマンドがあるよ、と案内してくれるんですが、どうもハルシネーションぽい(笑)。
brew install mpremote
mpremote # Pythonのプロンプトに接続(Ctrl-dでリセット、Ctrl-xで終了)
mpremote cp foobar.py :main.py # ファイルをコピー
Wifi経由でTCPのコネクションを貼って、サーバ側からの指令でモーターを動かすプログラムを開発中です。macからでもpicoの開発ができるようになってホクホクです(年末に時間を作らねば)。
import socket
import time
import network
from machine import Pin, ADC
# WiFi設定
WIFI_SSID = ""
WIFI_PASSWORD = ""
HOST = 'raspberrypi.local'
PORT = 2000
# ピン設定
ANALOG_PIN_1 = 26 # ADC0 (アナログ入力1)
ANALOG_PIN_2 = 27 # ADC1 (アナログ入力2)
OUTPUT_PIN_1 = 16 # モーター1制御用
OUTPUT_PIN_2 = 17 # モーター2制御用
# ピンの初期化
led = Pin("LED", Pin.OUT)
print("Connecting to WiFi...")
# WiFiに接続
wlan = network.WLAN(network.STA_IF)
wlan.active(True)
wlan.connect(WIFI_SSID, WIFI_PASSWORD)
while wlan.isconnected() == False:
print("connecting to %s.." % (WIFI_SSID))
# LED点滅
for _ in range(2):
led.value(1)
time.sleep(0.25)
led.value(0)
time.sleep(0.25)
wlan_status = wlan.ifconfig()
print("connected! as %s" % (wlan_status[0]))
# センサーとモーター用ピンの初期化
adc1 = ADC(Pin(ANALOG_PIN_1))
adc2 = ADC(Pin(ANALOG_PIN_2))
motor1 = Pin(OUTPUT_PIN_1, Pin.OUT)
motor2 = Pin(OUTPUT_PIN_2, Pin.OUT)
# 初期状態
motor1.value(0)
motor2.value(0)
print("Connecting to %s:%d..." % (HOST, PORT))
try:
# サーバに接続
sock = socket.socket()
sock.connect(socket.getaddrinfo(HOST, PORT)[0][-1])
# 接続成功: LEDを点灯
led.value(1)
print("Connected!")
# メインループ
while True:
# アナログ入力を読み取り (0-65535の16bit値)
sensor1 = adc1.read_u16()
sensor2 = adc2.read_u16()
# サーバに送信
message = f"{sensor1},{sensor2}\n"
sock.send(message.encode())
# 応答を受信
response = sock.recv(128).decode().strip()
if response:
motor1_val, motor2_val = map(int, response.split(','))
# モーター制御ピンを設定
motor1.value(motor1_val)
motor2.value(motor2_val)
# デバッグ出力
print(f"Sensors: {sensor1}, {sensor2} -> Motors: {motor1_val}, {motor2_val}")
else:
# 接続が切れた
print("Connection lost")
break
# 短い待機(必要に応じて調整)
time.sleep(0.01)
except Exception as e:
# エラー時: LEDを点滅
print(f"Error: {e}")
for _ in range(10):
led.value(1)
time.sleep(0.2)
led.value(0)
time.sleep(0.2)
finally:
sock.close()
led.value(0)
motor1.value(0)
motor2.value(0)
print("Disconnected")