RP2040 Zeroでラジコンを作った
先日とあるイベントにでるためにロボットを作ることになった。
ロボットの相撲のようなイベントでとりあえず相手のロボットを押せばいいのだ。
普段仕事でソフトウェア系の何かを作ることはあるけどハードなんて
アケコンぐらいしか作ったことがないのでとりあえずは動くことを目標に。
部品とか
足回り
タミヤの「トラック&ホイールセット」。組んでみたらいろいろ足りなくなって結局2セット買うことになりました
ユニバーサルプレートのLっていうのは結構デカくてもっと小さいのだったら
この後紹介するギアボックスも小さいやつ一個で済んだかな
ギヤボックス
またまたタミヤのギアボックス
いろいろあって迷った。そして旋回をするためには左右で別方向に動かす必要があるので2セット買いました
モータードライバ
これは作るまで知らなかったけど、結構重要な部品だった
もちろんモーターって逆に電流を流せば逆回転するんでスイッチとか組み合わせて複雑な回路を作ればできるんだろうけど
これはモータに流す電源を一旦このICに入れてあげて
ラズパイなんかで信号を入れてやるとその信号に応じて
順回転、逆回転とか左右モータをそれぞれ制御できるのでとても楽だった。
ラズパイとかが必要なるけどね
リモコンユニット
これは千石電商で見つけたんだけど送信側の足に信号流してあげると
受信側の対応してる足から信号が出るんだよね
今回は受信した信号をRP2040 Zeroで受けてその信号に応じて
モータドライバに信号を流しました
すんごい便利。引き剥がして他の工作でも使おう
https://www.sengoku.co.jp/mod/sgk_cart/detail.php?code=EEHD-0G8U
RP2040 Zero
あとはこれ。難しい回路を作るのは大変なのでとりあえず信号をこいつで受け取って複雑なことはpythonで
from machine import Pin, PWM
import time
# モータ1のピン(IN1とIN2)
motor1_in1 = Pin(14, Pin.OUT) # GPIO 5を使用(適宜変更)
motor1_in2 = Pin(15, Pin.OUT) # GPIO 6を使用(適宜変更)
motor2_in1 = Pin(26, Pin.OUT) # GPIO 5を使用(適宜変更)
motor2_in2 = Pin(27, Pin.OUT) # GPIO 6を使用(適宜変更)
control_signal = Pin(5, Pin.IN)
control_signal_2 = Pin(6, Pin.IN)
control_signal_3 = Pin(7, Pin.IN)
control_signal_4 = Pin(8, Pin.IN)
p_f = Pin(1, Pin.IN, Pin.PULL_UP)
p_b = Pin(2, Pin.IN, Pin.PULL_UP)
p_r = Pin(3, Pin.IN, Pin.PULL_UP)
p_l = Pin(4, Pin.IN, Pin.PULL_UP)
# PWMを使ってモータの速度を調整する場合(GPIOにPWMをアサイン)
pwm1 = PWM(motor1_in1)
pwm2 = PWM(motor1_in2)
pwm3 = PWM(motor2_in1)
pwm4 = PWM(motor2_in2)
# PWMの周波数を設定
pwm1.freq(1000) # 1kHz
pwm2.freq(1000)
pwm3.freq(1000)
pwm4.freq(1000)
def motor_forward(speed):
pwm1.duty_u16(int(speed * 65535)) # speedは0.0から1.0の範囲
pwm2.duty_u16(0)
pwm3.duty_u16(int(speed * 65535))
pwm4.duty_u16(0)
def motor_backward(speed):
pwm1.duty_u16(0)
pwm2.duty_u16(int(speed * 65535))
pwm3.duty_u16(0)
pwm4.duty_u16(int(speed * 65535))
def motor_right(speed):
pwm1.duty_u16(int(speed * 65535))
pwm2.duty_u16(0)
pwm3.duty_u16(0)
pwm4.duty_u16(int(speed * 65535))
def motor_left(speed):
pwm1.duty_u16(0)
pwm2.duty_u16(int(speed * 65535))
pwm3.duty_u16(int(speed * 65535))
pwm4.duty_u16(0)
def motor_stop():
pwm1.duty_u16(0)
pwm2.duty_u16(0)
pwm3.duty_u16(0)
pwm4.duty_u16(0)
# メインループ
while True:
if control_signal.value() == 1:
#if p_f.value() == 0:
motor_forward(1)
elif control_signal_2.value() == 1:
motor_backward(1)
elif control_signal_3.value() == 1:
motor_right(1)
elif control_signal_4.value() == 1:
motor_left(1)
else:
motor_stop()
#motor_forward(0.8) # 前進 80%の速度
#time.sleep(2)
#motor_stop() # 停止
#time.sleep(1)
#motor_backward(0.5) # 後進 50%の速度
#time.sleep(2)
#motor_stop()
#time.sleep(1)
このあとアケコンに組み込んでアケコンで操作できるようにした
プログラムとか