RaspberryPi Pico Wを使ってみた(mac編)

2025-12-05 raspi-pico python 電子工作

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")