Raspberry Pi Picoでラジコン制作(Rev#4-3)

2026-06-25 電子工作 raspi-pico ruby /posts/2026/2026-06-25-raspi-pico-with-ruby-car.jpg

迷走を続けているPicoバージョンのライントレースカーですが、Wi-Fi経由のコントロールを一度諦めて、基本のセンサーから読み取るタイプに戻しました(結局どの方法を使っても接続が安定しなかったです)。

ということで一度初心に帰って、IchigoJamで完成していたライントレースのプログラムをRubyに移植してみました。

# line-trace.rb
# ライントレースカー for Raspberry Pi Pico W

# Pico W 組み込みLED
# Pico (無印) の場合: led = GPIO.new(25, GPIO::OUT)
CYW43.init
led = CYW43::GPIO.new(CYW43::GPIO::LED_PIN)
led.write(1)
sleep 1
led.write 0

# センサー (IchgoJam: ANA(0)=右センサーR, ANA(2)=左センサーL)
adc_r = ADC.new(26)  # GPIO26 = ADC0
adc_l = ADC.new(27)  # GPIO27 = ADC1
puts "ADC initialized"

# モーター制御ピン (Hブリッジ)
# 前進: a1=1,a2=0 / 後退: a1=0,a2=1 / 停止: a1=0,a2=0
motor_a1 = GPIO.new(14, GPIO::OUT)  # IchgoJam OUT2 相当 (モーターA 前進)
motor_a2 = GPIO.new(15, GPIO::OUT)  # IchgoJam OUT1 相当 (モーターA 後退)
motor_b1 = GPIO.new(17, GPIO::OUT)  # IchgoJam OUT5 相当 (モーターB 前進)
motor_b2 = GPIO.new(16, GPIO::OUT)  # IchgoJam OUT6 相当 (モーターB 後退)
motor_a1.write(0); motor_a2.write(0)
motor_b1.write(0); motor_b2.write(0)
puts "GPIO initialized"

puts "Start"

# センサー閾値: IchgoJam は0-1023で閾値500、Pico ADC#read は0-65535
THRESHOLD = 50000

loop do
  # センサー読み取り (IchgoJam 50行: R=ANA(0):L=ANA(2))
  r = adc_r.read
  l = adc_l.read
  # puts "R=#{r} L=#{l}"

  # 両端が白いエリア → Uターンシーケンス (IchgoJam 60行: IF R<500 AND L<500 GOTO110)
  if false && r < THRESHOLD && l < THRESHOLD
    puts "U-turn start"

    # 直進 (IchgoJam 110-120行: OUT2,1:OUT5,1 / WAIT120)
    motor_a1.write(1); motor_a2.write(0)
    motor_b1.write(1); motor_b2.write(0)
    puts "forward"
    sleep 2.0

    # 停止 (IchgoJam 130-140行: OUT2,0:OUT5,0 / WAIT120)
    motor_a1.write(0); motor_a2.write(0)
    motor_b1.write(0); motor_b2.write(0)
    puts "stop"
    sleep 2.0

    # 旋回: モーターA前進 + モーターB後退 (IchgoJam 150-160行: OUT2,1:OUT5,0:OUT6,1 / WAIT110)
    motor_a1.write(1); motor_a2.write(0)
    motor_b1.write(0); motor_b2.write(1)
    puts "turn"
    sleep 1.83

    # 直進再開 (IchgoJam 170-180行: OUT2,1:OUT5,1 / WAIT120)
    motor_a1.write(1); motor_a2.write(0)
    motor_b1.write(1); motor_b2.write(0)
    puts "forward"
    sleep 2.0

    next
  end

  # ライントレース (IchgoJam 70-80行)
  # IF L>500 OUT2,1 ELSE OUT2,0
  if l < THRESHOLD
    motor_a1.write(1); motor_a2.write(0)
  else
    motor_a1.write(0); motor_a2.write(0)
  end
  # IF R>500 OUT5,1 ELSE OUT5,0
  if r < THRESHOLD
    motor_b1.write(1); motor_b2.write(0)
  else
    motor_b1.write(0); motor_b2.write(0)
  end

  # puts "A=#{l > THRESHOLD ? 1 : 0} B=#{r > THRESHOLD ? 1 : 0}"
  sleep 0.20  # IchgoJam WAIT10 = 10/60秒
end

prremoteという自家製のランタイムを利用しています。Rubyが入っているMac/LinuxにRaspberry Pi Pico W をUSB接続して、以下の3ステップでプログラムの配備が可能です(Windowsは未対応)。

gem install prremote
prremote install --board=picow  # BOOTSELを押しながら再接続が必要です
prremote deploy line-trace.rb

以下が実際の走行の様子。Uターンのところはまだ調整しきれておりません(^^;

やっぱり流行りのAIと連携みたいなこともやってみたいなと思うと、通信機能が欲しくなります。という訳で、次はESP32(XIAO-ESP32-C6)で制御を試してみようかと考えています(まだはっきり分かりませんが、Pico Wより安定してWi-Fiに繋がる印象があります)。

6月後半の日記(半月記?)
かなたのひと 第8号