見出し画像

M5Stackで自動ブレーキ

備忘録としてやったことをメモ。大したことはやってません。

概要

壁に近づくと自動でブレーキをかけて停止するラジコン。

ハードウェア

車両:タミヤ スターユニット エアロアバンテ
マイコン:M5GO IoTスターターキット
センサ:M5Stack用ToF測距センサユニット
モータードライバ:M5Stack用12チャンネル サーボドライバモジュール
ESC:GoolRC RC ESC 20A ブラシモーター スピードコントローラー

システム構成図

ソフトウェア

こどもと一緒にM5Flowで実装した。わかりやすいブロックプログラミングは偉大。

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)

結果

とりあえず壁を検知して自動停止するラジコンができた。


この記事が気に入ったらサポートをしてみませんか?