# 13. マイクロマックイーン プラス (micro:Maqueen Plus) 自動運転(超音波による障害物の回避)
# 13.1. 目標
超音波距離センサーを使って、前の障害物を検知し、マイクロマックイーン プラス (micro:Maqueen Plus)を自律的に運転させるためのプログラミング方法を把握します。
# 13.2. 必要な機材
# PC利用時に必要な機材
No. | 名称 | 個数 | HW/SW | 用途 |
---|---|---|---|---|
01 | マイクロビット セレクト ベースキット (opens new window) | 1 | HW | マイクロマックイーンのコントロール用とプログラミング |
02 | マイクロマックイーン プラス V2(micro:Maqueen Plus V2) (opens new window) | 1 | HW | 車体本体 |
03 | 単3型乾電池 | 4 | HW | マイクロマックイーン プラスとmicro:bitへの電源供給 |
04 | Chromebook、MacOS、WindowsのPC | 1 | HW | MakeCode操作用 |
05 | Google Chrome | 1 | SW | MakeCodeアクセス用 |
06 | 赤外線リモコン (opens new window) | 1 | HW | 赤外線信号発信用 |
# タブレット・スマートフォン利用時に必要な機材
No. | 名称 | 個数 | HW/SW | 用途 |
---|---|---|---|---|
01 | マイクロビット セレクト ベースキット (opens new window) | 1 | HW | マイクロマックイーンのコントロール用とプログラミング |
02 | マイクロマックイーン プラス V2(micro:Maqueen Plus V2) (opens new window) | 1 | HW | 車体本体 |
03 | 単3型乾電池 | 4 | HW | マイクロマックイーン プラスとmicro:bitへの電源供給 |
04 | タブレット・スマートフォン | 1 | HW | micro:bitアプリ操作用 |
05 | micro:bit アプリ | 1 | SW | micro:bitプログラミング用 |
06 | 赤外線リモコン (opens new window) | 1 | HW | 赤外線信号発信用 |
# 13.3. 動作イメージ
超音波センサーを使って、マイクロマックイーン プラス (micro:Maqueen Plus)と前方の障害物との距離を常に検出し、30cm以下になるとマイクロマックイーン プラス (micro:Maqueen Plus)は障害物を避けるためにランダムに左または右に曲がり、6cm以下になるとバックすることで、自動運転をさせます。
参考情報
- 付属の超音波距離センサーを装着する必要があります。
# 13.4. プログラミング例
# MakeCodeプログラミング例(サンプルプログラムの画像)
# MakeCodeプログラミング例(サンプルプログラムのリンク)
https://makecode.microbit.org/_gqdVbUaFJEet (opens new window)
# MakeCodeプログラミング例(JavaScript)
let direction_random = 0
let distance_to_obstacle_cm = 0
maqueenPlusV2.I2CInit()
basic.forever(function () {
distance_to_obstacle_cm = maqueenPlusV2.readUltrasonic(DigitalPin.P13, DigitalPin.P14)
if (distance_to_obstacle_cm <= 30 && distance_to_obstacle_cm >= 6) {
direction_random = randint(0, 1)
if (direction_random == 0) {
basic.showLeds(`
. . # . .
. # . . .
# # # # #
. # . . .
. . # . .
`)
maqueenPlusV2.controlMotor(maqueenPlusV2.MyEnumMotor.LeftMotor, maqueenPlusV2.MyEnumDir.Forward, 100)
maqueenPlusV2.controlMotor(maqueenPlusV2.MyEnumMotor.RightMotor, maqueenPlusV2.MyEnumDir.Forward, 0)
basic.pause(800)
} else {
basic.showLeds(`
. . # . .
. . . # .
# # # # #
. . . # .
. . # . .
`)
maqueenPlusV2.controlMotor(maqueenPlusV2.MyEnumMotor.LeftMotor, maqueenPlusV2.MyEnumDir.Forward, 0)
maqueenPlusV2.controlMotor(maqueenPlusV2.MyEnumMotor.RightMotor, maqueenPlusV2.MyEnumDir.Forward, 100)
basic.pause(800)
}
} else if (distance_to_obstacle_cm < 6) {
basic.showLeds(`
. . # . .
. . # . .
# . # . #
. # # # .
. . # . .
`)
maqueenPlusV2.controlMotor(maqueenPlusV2.MyEnumMotor.AllMotor, maqueenPlusV2.MyEnumDir.Backward, 100)
basic.pause(800)
} else {
basic.showLeds(`
. . # . .
. # # # .
# . # . #
. . # . .
. . # . .
`)
maqueenPlusV2.controlMotor(maqueenPlusV2.MyEnumMotor.AllMotor, maqueenPlusV2.MyEnumDir.Forward, 100)
}
})
# MakeCodeプログラミング例(python)
direction_random = 0
distance_to_obstacle_cm = 0
maqueenPlusV2.i2c_init()
def on_forever():
global distance_to_obstacle_cm, direction_random
distance_to_obstacle_cm = maqueenPlusV2.read_ultrasonic(DigitalPin.P13, DigitalPin.P14)
if distance_to_obstacle_cm <= 30 and distance_to_obstacle_cm >= 6:
direction_random = randint(0, 1)
if direction_random == 0:
basic.show_leds("""
. . # . .
. # . . .
# # # # #
. # . . .
. . # . .
""")
maqueenPlusV2.control_motor(maqueenPlusV2.MyEnumMotor.LEFT_MOTOR,
maqueenPlusV2.MyEnumDir.FORWARD,
100)
maqueenPlusV2.control_motor(maqueenPlusV2.MyEnumMotor.RIGHT_MOTOR,
maqueenPlusV2.MyEnumDir.FORWARD,
0)
basic.pause(800)
else:
basic.show_leds("""
. . # . .
. . . # .
# # # # #
. . . # .
. . # . .
""")
maqueenPlusV2.control_motor(maqueenPlusV2.MyEnumMotor.LEFT_MOTOR,
maqueenPlusV2.MyEnumDir.FORWARD,
0)
maqueenPlusV2.control_motor(maqueenPlusV2.MyEnumMotor.RIGHT_MOTOR,
maqueenPlusV2.MyEnumDir.FORWARD,
100)
basic.pause(800)
elif distance_to_obstacle_cm < 6:
basic.show_leds("""
. . # . .
. . # . .
# . # . #
. # # # .
. . # . .
""")
maqueenPlusV2.control_motor(maqueenPlusV2.MyEnumMotor.ALL_MOTOR,
maqueenPlusV2.MyEnumDir.BACKWARD,
100)
basic.pause(800)
else:
basic.show_leds("""
. . # . .
. # # # .
# . # . #
. . # . .
. . # . .
""")
maqueenPlusV2.control_motor(maqueenPlusV2.MyEnumMotor.ALL_MOTOR,
maqueenPlusV2.MyEnumDir.FORWARD,
100)
basic.forever(on_forever)
# MakeCodeプログラミング例のQRコード