M5Stackで自動ブレーキ
備忘録としてやったことをメモ。大したことはやってません。
概要
壁に近づくと自動でブレーキをかけて停止するラジコン。
ハードウェア
車両:タミヤ スターユニット エアロアバンテ
マイコン:M5GO IoTスターターキット
センサ:M5Stack用ToF測距センサユニット
モータードライバ:M5Stack用12チャンネル サーボドライバモジュール
ESC:GoolRC RC ESC 20A ブラシモーター スピードコントローラー
ソフトウェア
こどもと一緒にM5Flowで実装した。わかりやすいブロックプログラミングは偉大。
M5FlowのブロックプログラムはMicroPythonがベースになってるので、
以下のようにPythonコードとして表示することも可能。
from m5stack import *
from m5ui import *
from uiflow import *
import module
import unit
setScreenColor(0x222222)
angle0 = unit.get(unit.ANGLE, unit.PORTB)
tof0 = unit.get(unit.TOF, unit.PORTA)
accel = None
steer = None
acc_vis = None
servo = module.get(module.SERVO)
label0 = M5TextBox(106, 10, "100", lcd.FONT_DejaVu56, 0xFFFFFF, rotate=0)
label1 = M5TextBox(283, 0, "000", lcd.FONT_Default, 0xFFFFFF, rotate=0)
label2 = M5TextBox(11, 10, "steer :", lcd.FONT_DejaVu24, 0xFFFFFF, rotate=0)
label3 = M5TextBox(10, 92, "accel :", lcd.FONT_DejaVu24, 0xFFFFFF, rotate=0)
label4 = M5TextBox(106, 92, "100", lcd.FONT_DejaVu56, 0xFFFFFF, rotate=0)
label6 = M5TextBox(10, 166, "dist.:", lcd.FONT_DejaVu24, 0xFFFFFF, rotate=0)
label7 = M5TextBox(106, 166, "1000", lcd.FONT_DejaVu56, 0xFFFFFF, rotate=0)
label8 = M5TextBox(261, 190, "mm", lcd.FONT_DejaVu24, 0xFFFFFF, rotate=0)
label9 = M5TextBox(235, 116, "%", lcd.FONT_DejaVu24, 0xFFFFFF, rotate=0)
label5 = M5TextBox(224, 34, "deg", lcd.FONT_DejaVu24, 0xFFFFFF, rotate=0)
def buttonA_wasPressed():
global accel, steer, acc_vis
accel = accel - 10
acc_vis = acc_vis - 20
pass
btnA.wasPressed(buttonA_wasPressed)
def buttonB_wasPressed():
global accel, steer, acc_vis
accel = 90
acc_vis = 0
pass
btnB.wasPressed(buttonB_wasPressed)
def buttonC_wasPressed():
global accel, steer, acc_vis
accel = accel + 10
acc_vis = acc_vis + 20
pass
btnC.wasPressed(buttonC_wasPressed)
steer = 97
accel = 90
acc_vis = 0
servo.write_angle(0, steer)
while True:
label1.setText(str(power.getBatteryLevel()))
steer = int((((angle0.read()) * 70) / 1024 + 62))
servo.write_angle(0, steer)
servo.write_angle(2, accel)
label0.setText(str(steer))
label4.setText(str(acc_vis))
label7.setText(str(tof0.distance))
if (tof0.distance) < 200:
rgb.setColorAll(0xcc0000)
elif (tof0.distance) < 400:
rgb.setColorAll(0xffcc00)
accel = 90
acc_vis = 0
elif (tof0.distance) < 800:
rgb.setColorAll(0x009900)
else:
rgb.setColorAll(0x000099)
wait_ms(2)
結果
とりあえず壁を検知して自動停止するラジコンができた。
この記事が気に入ったらサポートをしてみませんか?