# メカニックパーツ - ブルドーザー (マイクロマックイーン用) (micro:Maqueen Mechanic-Push) 利用マニュアル



本ドキュメントは、メカニックパーツ - ブルドーザー (Mechanic-Push) の概要、特徴、利用方法について説明します。







# 1. 本ドキュメントの目的


  • メカニックパーツ - ブルドーザー (Mechanic-Push) の概要説明
  • メカニックパーツ - ブルドーザー (Mechanic-Push) の仕様説明
  • メカニックパーツ - ブルドーザー (Mechanic-Push) に関する利用方法の説明






# 2. 概要


メカニックパーツ - ブルドーザー (Mechanic-Push)は、DFRobot社が提供しているマイクロビット用ロボットカー「マイクロマックイーン (micro:Maqueen)」の追加パーツです。
このキットには、メタルサーボ、メカパーツ、ネジなどが含まれており、簡単にロボットカーに装着できます。
お手持ちのマイクロマックイーン ライト (micro:Maqueen Lite)やマイクロマックイーン プラス (micro:Maqueen Plus)に、メカニックパーツ - ブルドーザー (Mechanic-Push)を装着し、プレートで物を押したり、超音波センサーで障害物との距離を計測することができます。
遊びながら、実践的なプログラミング学習を経験することで、学びを深めていくことが期待できます。







# 3. ご購入の方法


参考:メカニックパーツ - ブルドーザー (Mechanic-Push)は、当社ウェブストアにてご購入いただけます。



当社はmicro:bitの公認正規販売店です。国内のmicro:bit利用推進を行っております。

micro:bit専門ストア「イフティニー ストア(iftiny store)」 (opens new window)にて、各種micro:bit関連製品の販売をしております。

micro:bit専門ストア (opens new window)







# 4. 特徴


  • マイクロマックイーン ライト (micro:Maqueen Lite)4.0以降に対応
  • マイクロマックイーン プラス V2 (micro:Maqueen Plus V2)に対応
  • 高品質メタルギアサーボ
  • 金属製のサーボ接続プレートで簡単に取り付けることが可能
  • サーボ制御角度0~180度
  • 高品質アルミ合金素材






# 5. 仕様


項目 詳細
型番 PPDF-ROB0156-P
サーボ重量 12g±1g
サーボの種類 メタルギアサーボ
サーボ制御角度 0 ~ 180 度
サーボ接続プレート メタルサーボ接続プレート
コントロールポート (micro:Maqueen Lite) S1、S2
コントロールポート (micro:Maqueen Plus V2) P0、P1、P2
スタンバイ電流 <45mA
重量 62g(袋を含む)
製品パッケージ パッケージなし、袋のみ。260 x 160 x 25mm(目安)






# 6. 付属品


画像 項目 個数
付属品 9gメタルギア・サーボ
(9g Metal Gear Servo)
1
付属品 メタル・トローリー・プレート
(Metal Trolley Plate)
1
付属品 メタル・パン-チルト-ズーム・マウント・プレート
(Metal Pan-tilt-zoom Mount Plate)
1
付属品 ジェネラル・エクスパンション・マウント・ボード
(General Expantion Mount Board)
1
付属品 M3 * 25mm ピラー(銅)
(M3 * 25mm Copper Pilla)
2
付属品 M2.5 * 5mm ネジ
(M2.5 * 5mm Screws)
5
付属品 M3 * 5mm ネジ
(M3 * 5mm Screws)
10
付属品 4P 超音波接続ケーブル
(4P Ultrasonic connecting wire)
1

※ マイクロビット (micro:bit)、マイクロマックイーン ライト (micro:Maqueen Lite)、マイクロマックイーン プラス (micro:Maqueen Plus)は付属しておりません。 ご利用するには、別途ご購入する必要がございます。











# 7. 利用方法(マイクロマックイーン ライト (micro:Maqueen Lite)用)


# 7.1. 必要な機材


# PC利用時に必要な機材

No. 名称 個数 HW/SW 用途
01 マイクロビット セレクト ベースキット (opens new window) 1 HW micro:bit本体、micro:bit用ケース、マルチUSBケーブル
02 メカニックパーツ - ブルドーザー (Mechanic-Push) (opens new window) 1 HW 本製品
03 マイクロマックイーン ライト (micro:Maqueen Lite) (opens new window) 1 HW メカニックパーツ - ブルドーザー (Mechanic-Push)装着用
04 単4型乾電池 3 HW マイクロマックイーン ライト (micro:Maqueen Lite)とmicro:bitへの電源供給
05 Chromebook、MacOS、WindowsのPC 1 HW MakeCode操作用
06 Google Chrome 1 SW MakeCodeアクセス用


# タブレット・スマートフォン利用時に必要な機材

No. 名称 個数 HW/SW 用途
01 マイクロビット セレクト ベースキット (opens new window) 1 HW micro:bit本体、micro:bit用ケース、マルチUSBケーブル
02 メカニックパーツ - ブルドーザー (Mechanic-Push) (opens new window) 1 HW 本製品
03 マイクロマックイーン ライト (micro:Maqueen Lite) (opens new window) 1 HW メカニックパーツ - ブルドーザー (Mechanic-Push) 装着用
04 単4型乾電池 3 HW マイクロマックイーン ライト (micro:Maqueen Lite) とmicro:bitへの電源供給
05 タブレット・スマートフォン 1 HW micro:bitアプリ操作用
06 micro:bit アプリ 1 SW micro:bitプログラミング用

※ HW:ハードウェア、SW:ソフトウェア
※ Google Chromeは、Google社が提供しているブラウザ。ダウンロードは[Google Chromeの公式ウェブページ](https://www.google.com/intl/ja_jp/chrome/)で可能です。Chromebookでは、標準でインストールされています。



# 7.2. 組立方法


# 7.2.1. サーボの原点合わせ


各パーツを取り付ける前にサーボの原点合わせを行います。原点とはサーボが動作する際に基準となる位置です。
本マニュアルでは、原点合わせとして、サーボのシャフトを90度の位置に合わせます。




# 7.2.1.1. プログラムを作成する

サーボをコントロールして90度の位置に合わせるプログラムを作成します。


※ 本マニュアルでは、MakeCodeを利用したプログラミング例を使用します。 MakeCodeを使ってのmicro:bitプログラミングを経験していない方は、当社ドキュメント 「1.2. micro:bitの利用方法」 (opens new window)の各ドキュメントをご確認ください。

※MakeCodeプログラミング例(ブロック)にはマイクロマックイーン ライト (micro:Maqueen Lite)のMakecode用パッケージが予めインポートされています。

MakeCode画面で初めからプログラミングを作成する場合やMakeCodeプログラミング例(JavaScript)、MakeCodeプログラミング例(python)を使用する場合には、「マイクロマクイーン (micro:Maqueen)MakeCode用パッケージのインポート」 (opens new window) をご参照ください。

※作成したプログラムはマイクロマックイーン ライト (micro:Maqueen Lite)に装着するマイクロビット (micro:bit v2.2)に書き込み(ダウンロード)します。


# MakeCodeプログラミング例(ブロック)



# MakeCodeプログラミング例(JavaScript)


※ MakeCodeで自動変換されたコードです。
maqueen.servoRun(maqueen.Servos.S1, 90)


# MakeCodeプログラミング例(python)


※ MakeCodeで自動変換されたコードです。
maqueen.servo_run(maqueen.Servos.S1, 90)



# 7.2.1.2.作成したプログラムを実行する

No. 画像 手順
01 マイクロマックイーン ライト (micro:Maqueen Lite)コネクター 9gメタルギア・サーボの3pinコネクターをマイクロマックイーン ライト (micro:Maqueen Lite)のサーボ端子S1に接続。

※3pinコネクターの向きに注意する(茶色ワイヤーを黒ピン、赤色ワイヤーをピンクピン、オレンジ色ワイヤーを緑ピンに接続)。
02 マイクロマックイーン ライト(micro:Maqueen Lite)電源ON マイクロ マックイーンライト (micro:Maqueen Lite)の電源を入れる。
03 プログラムの実行で9gメタルギア・サーボのシャフトが回転したことを確認する。

※原点合わせ後は、手でシャフトを回さないように注意する。
04 マイクロ マックイーンライト (micro:Maqueen Lite)の電源を切る。
05 3pinコネクターをマイクロ マックイーンライト (micro:Maqueen Lite)のサーボモーター端子から抜く。



# 7.2.2.ブルドーザーの組み立て


No. 画像 手順
01 ブルドーザーの組み立て01 メタル・トローリー・プレートにメタル・パン-チルト-ズーム・マウント・プレートを装着。
02 ブルドーザーの組み立て02 メタル・パン-チルト-ズーム・マウント・プレートにメタルギア・サーボを装着。

※丸形サーボホーンのネジ穴がマイクロマックイーン ライト (micro:Maqueen Lite)の前後左右を指すような向きで装着する。
03 ブルドーザーの組み立て03 メタル・パン-チルト-ズーム・マウント・プレートをマイクロマックイーン ライト (micro:Maqueen Lite)に装着。
04 ブルドーザーの組み立て04 ジェネラル・エクスパンション・マウント・ボードを丸形サーボホーンに装着する。超音波距離センサーをジェネラル・エクスパンション・マウント・ボードに装着し、4P超音波接続ケーブルで超音波距離センサーとマイクロマックイーン ライト (micro:Maqueen Lite)のSR04P超音波拡張ポートを接続する。



# サーボの回転性能を重視したカスタマイズ

通常、上記の組み立て方法では、サーボが干渉等で最大限に回転できないため、ここでは、組み立て方法のカスタマイズを行います。
付属品のみで組み立てが可能であるため、方法は下記写真をご参照ください。



No. 画像 説明
01 ブルドーザーの組み立て01 「ジェネラル・エクスパンション・マウント・ボード」の表・裏を逆で装着。

注意事項:「ジェネラル・エクスパンション・マウント・ボード」を固定するねじを一度外してから、「ジェネラル・エクスパンション・マウント・ボード」を逆に回転し、ネジ止めを再度行ってください。

手でサーボを回さないでください。回した場合、再度「7.2.1.2.作成したプログラムを実行する」を行ってください。
02 ブルドーザーの組み立て02 超音波距離センサーを上・下逆で装着。
03 ブルドーザーの組み立て03 -(参考画像)

以上でプログラミングの事前準備は完了です。




# 7.3.プログラミング方法



本マニュアルでは、MakeCodeを使用して、ブルドーザーを動かす方法を説明します。

あらかじめ用意されたパッケージを利用することで、プログラミンがより簡単に行えます
本マニュアルでは、専用パッケージを利用する前提でイクロマックイーン ライト (micro:Maqueen Lite)のプログラミング例を記載しています。


※ パッケージのインポート方法については、「マイクロマクイーン (micro:Maqueen)MakeCode用パッケージのインポート」 (opens new window) をご参照ください。


※ 下記のプログラミング例では、上記「サーボの回転性能を重視したカスタマイズ」を前提としています。カスタマイズを行っていない場合、サーボ等の故障等につながる可能性があります。ご注意ください。


# 7.3.1.超音波距離センサーで障害物を確認する


サーボを回転することで、超音波距離センサーを装着したジェネラル・エクスパンション・マウント・ボードをランダムに動かし、前方20㎝以内に障害物がある場合にはLEDランプを点滅します。



# MakeCodeプログラミング例(ブロック)



# MakeCodeプログラミング例(JavaScript)


※ MakeCodeで自動変換されたコードです。
let distance_to_obstarcle_cm = 0
maqueen.servoRun(maqueen.Servos.S1, 90)
basic.forever(function () {
    maqueen.servoRun(maqueen.Servos.S1, randint(30, 150))
    basic.pause(1000)
    distance_to_obstarcle_cm = maqueen.Ultrasonic(PingUnit.Centimeters)
    if (distance_to_obstarcle_cm <= 20) {
        maqueen.writeLED(maqueen.LED.LEDLeft, maqueen.LEDswitch.turnOn)
        maqueen.writeLED(maqueen.LED.LEDRight, maqueen.LEDswitch.turnOn)
        music.play(music.tonePlayable(262, music.beat(BeatFraction.Whole)), music.PlaybackMode.UntilDone)
        maqueen.writeLED(maqueen.LED.LEDLeft, maqueen.LEDswitch.turnOff)
        maqueen.writeLED(maqueen.LED.LEDRight, maqueen.LEDswitch.turnOff)
        basic.pause(500)
        maqueen.writeLED(maqueen.LED.LEDLeft, maqueen.LEDswitch.turnOn)
        maqueen.writeLED(maqueen.LED.LEDRight, maqueen.LEDswitch.turnOn)
        music.play(music.tonePlayable(262, music.beat(BeatFraction.Whole)), music.PlaybackMode.UntilDone)
        maqueen.writeLED(maqueen.LED.LEDLeft, maqueen.LEDswitch.turnOff)
        maqueen.writeLED(maqueen.LED.LEDRight, maqueen.LEDswitch.turnOff)
        basic.pause(500)
        maqueen.writeLED(maqueen.LED.LEDLeft, maqueen.LEDswitch.turnOn)
        maqueen.writeLED(maqueen.LED.LEDRight, maqueen.LEDswitch.turnOn)
        music.play(music.tonePlayable(262, music.beat(BeatFraction.Whole)), music.PlaybackMode.UntilDone)
        maqueen.writeLED(maqueen.LED.LEDLeft, maqueen.LEDswitch.turnOff)
        maqueen.writeLED(maqueen.LED.LEDRight, maqueen.LEDswitch.turnOff)
    } else {
        basic.pause(3000)
    }
})



# MakeCodeプログラミング例(python)


※ MakeCodeで自動変換されたコードです。
distance_to_obstarcle_cm = 0
maqueen.servo_run(maqueen.Servos.S1, 90)

def on_forever():
    global distance_to_obstarcle_cm
    maqueen.servo_run(maqueen.Servos.S1, randint(30, 150))
    basic.pause(1000)
    distance_to_obstarcle_cm = maqueen.ultrasonic(PingUnit.CENTIMETERS)
    if distance_to_obstarcle_cm <= 20:
        maqueen.write_led(maqueen.LED.LED_LEFT, maqueen.LEDswitch.TURN_ON)
        maqueen.write_led(maqueen.LED.LED_RIGHT, maqueen.LEDswitch.TURN_ON)
        music.play(music.tone_playable(262, music.beat(BeatFraction.WHOLE)),
            music.PlaybackMode.UNTIL_DONE)
        maqueen.write_led(maqueen.LED.LED_LEFT, maqueen.LEDswitch.TURN_OFF)
        maqueen.write_led(maqueen.LED.LED_RIGHT, maqueen.LEDswitch.TURN_OFF)
        basic.pause(500)
        maqueen.write_led(maqueen.LED.LED_LEFT, maqueen.LEDswitch.TURN_ON)
        maqueen.write_led(maqueen.LED.LED_RIGHT, maqueen.LEDswitch.TURN_ON)
        music.play(music.tone_playable(262, music.beat(BeatFraction.WHOLE)),
            music.PlaybackMode.UNTIL_DONE)
        maqueen.write_led(maqueen.LED.LED_LEFT, maqueen.LEDswitch.TURN_OFF)
        maqueen.write_led(maqueen.LED.LED_RIGHT, maqueen.LEDswitch.TURN_OFF)
        basic.pause(500)
        maqueen.write_led(maqueen.LED.LED_LEFT, maqueen.LEDswitch.TURN_ON)
        maqueen.write_led(maqueen.LED.LED_RIGHT, maqueen.LEDswitch.TURN_ON)
        music.play(music.tone_playable(262, music.beat(BeatFraction.WHOLE)),
            music.PlaybackMode.UNTIL_DONE)
        maqueen.write_led(maqueen.LED.LED_LEFT, maqueen.LEDswitch.TURN_OFF)
        maqueen.write_led(maqueen.LED.LED_RIGHT, maqueen.LEDswitch.TURN_OFF)
    else:
        basic.pause(3000)
basic.forever(on_forever)




# 7.3.2.障害物の無い方向へ自動走行する

進行方向の障害物を検知しながら進みます。前方に障害物がある場合には左右を確認し可能な方向に進路を変更します。



参考:マイクロゲームパッド (micro:Game Pad)は、当社ウェブストアにてご購入いただけます。



当社はmicro:bitの公認正規販売店です。国内のmicro:bit利用推進を行っております。

micro:bit専門ストア「イフティニー ストア(iftiny store)」 (opens new window)にて、各種micro:bit関連製品の販売をしております。

micro:bit専門ストア (opens new window)



# MakeCodeプログラミング例(ブロック)



# MakeCodeプログラミング例(JavaScript)


※ MakeCodeで自動変換されたコードです。
function determine_direction () {
    detect_obstacle()
    distance_detect_limit_cm = 200
    if (distance_to_obstacle_front_cm == 0 || distance_to_obstacle_front_cm > distance_detect_limit_cm) {
        distance_to_obstacle_front_cm = distance_detect_limit_cm
    }
    if (distance_to_obstacle_left_cm == 0 || distance_to_obstacle_left_cm > distance_detect_limit_cm) {
        distance_to_obstacle_left_cm = distance_detect_limit_cm
    }
    if (distance_to_obstacle_right_cm == 0 || distance_to_obstacle_right_cm > distance_detect_limit_cm) {
        distance_to_obstacle_right_cm = distance_detect_limit_cm
    }
    maximum_distance_cm = 0
    maximum_distance_cm = Math.max(distance_to_obstacle_left_cm, distance_to_obstacle_right_cm)
    maximum_distance_cm = Math.max(maximum_distance_cm, distance_to_obstacle_front_cm)
    if (distance_to_obstacle_front_cm < 15) {
        move_back()
    } else if (maximum_distance_cm < 15) {
        move_back()
    } else if (maximum_distance_cm == distance_to_obstacle_front_cm) {
        move_forward()
    } else if (maximum_distance_cm == distance_to_obstacle_left_cm) {
        turn_left()
    } else if (maximum_distance_cm == distance_to_obstacle_right_cm) {
        turn_right()
    } else {
        move_forward()
    }
}
function move_back () {
    basic.showLeds(`
        . . # . .
        . . # . .
        # . # . #
        . # # # .
        . . # . .
        `)
    maqueen.motorRun(maqueen.Motors.All, maqueen.Dir.CCW, 60)
    basic.pause(2000)
    maqueen.motorStop(maqueen.Motors.All)
}
function turn_left () {
    basic.showLeds(`
        . . # . .
        . . . # .
        # # # # #
        . . . # .
        . . # . .
        `)
    maqueen.motorRun(maqueen.Motors.M2, maqueen.Dir.CW, 60)
    basic.pause(1500)
    maqueen.motorStop(maqueen.Motors.All)
}
function detect_obstacle () {
    maqueen.servoRun(maqueen.Servos.S1, 180)
    basic.pause(2000)
    distance_to_obstacle_left_cm = 0
    distance_to_obstacle_left_cm = maqueen.Ultrasonic(PingUnit.Centimeters)
    maqueen.servoRun(maqueen.Servos.S1, 90)
    basic.pause(2000)
    distance_to_obstacle_front_cm = 0
    distance_to_obstacle_front_cm = maqueen.Ultrasonic(PingUnit.Centimeters)
    maqueen.servoRun(maqueen.Servos.S1, 0)
    basic.pause(2000)
    distance_to_obstacle_right_cm = 0
    distance_to_obstacle_right_cm = maqueen.Ultrasonic(PingUnit.Centimeters)
    maqueen.servoRun(maqueen.Servos.S1, 90)
}
function move_forward () {
    basic.showLeds(`
        . . # . .
        . # # # .
        # . # . #
        . . # . .
        . . # . .
        `)
    maqueen.motorRun(maqueen.Motors.All, maqueen.Dir.CW, 60)
    basic.pause(2000)
    maqueen.motorStop(maqueen.Motors.All)
}
function turn_right () {
    basic.showLeds(`
        . . # . .
        . # . . .
        # # # # #
        . # . . .
        . . # . .
        `)
    maqueen.motorRun(maqueen.Motors.M1, maqueen.Dir.CW, 60)
    basic.pause(1500)
    maqueen.motorStop(maqueen.Motors.All)
}
let maximum_distance_cm = 0
let distance_detect_limit_cm = 0
let distance_to_obstacle_right_cm = 0
let distance_to_obstacle_front_cm = 0
let distance_to_obstacle_left_cm = 0
distance_to_obstacle_left_cm = 0
distance_to_obstacle_front_cm = 0
distance_to_obstacle_right_cm = 0
basic.forever(function () {
    determine_direction()
})




# MakeCodeプログラミング例(python)


※ MakeCodeで自動変換されたコードです。
def determine_direction():
    global distance_detect_limit_cm, distance_to_obstacle_front_cm, distance_to_obstacle_left_cm, distance_to_obstacle_right_cm, maximum_distance_cm
    detect_obstacle()
    distance_detect_limit_cm = 200
    if distance_to_obstacle_front_cm == 0 or distance_to_obstacle_front_cm > distance_detect_limit_cm:
        distance_to_obstacle_front_cm = distance_detect_limit_cm
    if distance_to_obstacle_left_cm == 0 or distance_to_obstacle_left_cm > distance_detect_limit_cm:
        distance_to_obstacle_left_cm = distance_detect_limit_cm
    if distance_to_obstacle_right_cm == 0 or distance_to_obstacle_right_cm > distance_detect_limit_cm:
        distance_to_obstacle_right_cm = distance_detect_limit_cm
    maximum_distance_cm = 0
    maximum_distance_cm = max(distance_to_obstacle_left_cm, distance_to_obstacle_right_cm)
    maximum_distance_cm = max(maximum_distance_cm, distance_to_obstacle_front_cm)
    if distance_to_obstacle_front_cm < 15:
        move_back()
    elif maximum_distance_cm < 15:
        move_back()
    elif maximum_distance_cm == distance_to_obstacle_front_cm:
        move_forward()
    elif maximum_distance_cm == distance_to_obstacle_left_cm:
        turn_left()
    elif maximum_distance_cm == distance_to_obstacle_right_cm:
        turn_right()
    else:
        move_forward()
def move_back():
    basic.show_leds("""
        . . # . .
        . . # . .
        # . # . #
        . # # # .
        . . # . .
        """)
    maqueen.motor_run(maqueen.Motors.ALL, maqueen.Dir.CCW, 60)
    basic.pause(2000)
    maqueen.motor_stop(maqueen.Motors.ALL)
def turn_left():
    basic.show_leds("""
        . . # . .
        . . . # .
        # # # # #
        . . . # .
        . . # . .
        """)
    maqueen.motor_run(maqueen.Motors.M2, maqueen.Dir.CW, 60)
    basic.pause(1500)
    maqueen.motor_stop(maqueen.Motors.ALL)
def detect_obstacle():
    global distance_to_obstacle_left_cm, distance_to_obstacle_front_cm, distance_to_obstacle_right_cm
    maqueen.servo_run(maqueen.Servos.S1, 180)
    basic.pause(2000)
    distance_to_obstacle_left_cm = 0
    distance_to_obstacle_left_cm = maqueen.ultrasonic(PingUnit.CENTIMETERS)
    maqueen.servo_run(maqueen.Servos.S1, 90)
    basic.pause(2000)
    distance_to_obstacle_front_cm = 0
    distance_to_obstacle_front_cm = maqueen.ultrasonic(PingUnit.CENTIMETERS)
    maqueen.servo_run(maqueen.Servos.S1, 0)
    basic.pause(2000)
    distance_to_obstacle_right_cm = 0
    distance_to_obstacle_right_cm = maqueen.ultrasonic(PingUnit.CENTIMETERS)
    maqueen.servo_run(maqueen.Servos.S1, 90)
def move_forward():
    basic.show_leds("""
        . . # . .
        . # # # .
        # . # . #
        . . # . .
        . . # . .
        """)
    maqueen.motor_run(maqueen.Motors.ALL, maqueen.Dir.CW, 60)
    basic.pause(2000)
    maqueen.motor_stop(maqueen.Motors.ALL)
def turn_right():
    basic.show_leds("""
        . . # . .
        . # . . .
        # # # # #
        . # . . .
        . . # . .
        """)
    maqueen.motor_run(maqueen.Motors.M1, maqueen.Dir.CW, 60)
    basic.pause(1500)
    maqueen.motor_stop(maqueen.Motors.ALL)
maximum_distance_cm = 0
distance_detect_limit_cm = 0
distance_to_obstacle_right_cm = 0
distance_to_obstacle_front_cm = 0
distance_to_obstacle_left_cm = 0
distance_to_obstacle_left_cm = 0
distance_to_obstacle_front_cm = 0
distance_to_obstacle_right_cm = 0

def on_forever():
    determine_direction()
basic.forever(on_forever)











# 8. 利用方法(マイクロマックイーン プラス (micro:Maqueen Plus)用)


# 8.1.必要な機材


# PC利用時に必要な機材

No. 名称 個数 HW/SW 用途
01 マイクロビット セレクト ベースキット (opens new window) 1 HW micro:bit本体、micro:bit用ケース、マルチUSBケーブル
02 メカニックパーツ - ブルドーザー (Mechanic-Push) (opens new window) 1 HW 本製品
03 マイクロマックイーン プラス (micro:Maqueen Plus) (opens new window) 1 HW メカニックパーツ - ブルドーザー (Mechanic-Push) 装着用
04 単3型乾電池 4 HW マイクロマックイーン プラス (micro:Maqueen Plus)とmicro:bitへの電源供給
05 Chromebook、MacOS、WindowsのPC 1 HW MakeCode操作用
06 Google Chrome 1 SW MakeCodeアクセス用


# タブレット・スマートフォン利用時に必要な機材

No. 名称 個数 HW/SW 用途
01 マイクロビット セレクト ベースキット (opens new window) 1 HW micro:bit本体、micro:bit用ケース、マルチUSBケーブル
02 メカニックパーツ - ブルドーザー (Mechanic-Push) (opens new window) 1 HW 本製品
03 マイクロマックイーン プラス (micro:Maqueen Plus) (opens new window) 1 HW メカニックパーツ - ブルドーザー (Mechanic-Push) 装着用
04 単3型乾電池 4 HW マイクロマックイーン プラス (micro:Maqueen Plus)とmicro:bitへの電源供給
05 タブレット・スマートフォン 1 HW micro:bitアプリ操作用
06 micro:bit アプリ 1 SW micro:bitプログラミング用


※ HW:ハードウェア、SW:ソフトウェア
※ Google Chromeは、Google社が提供しているブラウザ。ダウンロードは[Google Chromeの公式ウェブページ](https://www.google.com/intl/ja_jp/chrome/)で可能です。Chromebookでは、標準でインストールされています。



# 8.2.組立方法


# 8.2.1.サーボの原点合わせ


各パーツを取り付ける前にサーボの原点合わせを行います。原点とは、サーボが動作する際の基準位置です。
本マニュアルでは、原点合わせとしてシャフトを90度の位置に合わせます。




# 8.2.1.1.プログラムを作成する

サーボをコントロールして90度の位置に合わせるプログラムを作成します。

※ 本マニュアルでは、MakeCodeを利用したプログラミング例を使用します。 MakeCodeを使ってのmicro:bitプログラミングを経験していない方は、当社ドキュメント 「1.2. micro:bitの利用方法」 (opens new window)の各ドキュメントをご確認ください。

※MakeCodeプログラミング例(ブロック)にはマイクロマックイーン プラス (micro:Maqueen Pluss)のMakecode用パッケージが予めインポートされています。
MakeCode画面で初めからプログラミングを作成する場合やMakeCodeプログラミング例(JavaScript)、MakeCodeプログラミング例(python)を使用する場合には、「マイクロマックイーン プラス (micro:Maqueen Plus) MakeCode用パッケージのインポート」 (opens new window) をご参照ください。

※作成したプログラムはマイクロマックイーン プラス (micro:Maqueen Plus)に装着するマイクロビット (micro:bit v2.2)に書き込み(ダウンロード)します。


# MakeCodeプログラミング例(ブロック)



# MakeCodeプログラミング例(JavaScript)


※ MakeCodeで自動変換されたコードです。
pins.servoWritePin(AnalogPin.P1, 90)



# MakeCodeプログラミング例(python)


※ MakeCodeで自動変換されたコードです。
pins.servo_write_pin(AnalogPin.P1, 90)



# 8.2.1.2.作成したプログラムを実行する


No. 画像 手順
01 マイクロマックイーン プラス(micro:Maqueen Plus)コネクター 9gメタルギア・サーボの3pinコネクターをマイクロマックイーン プラス (micro:Maqueen Plus)の5V端子P1に接続。

※3pinコネクターの向きに注意する(茶色の線を黒色のピン(GND)に接続)。
02 マイクロマックイーン プラス(micro:Maqueen Plus)電源ON マイクロ マックイーンプラス (micro:Maqueen Plus)の電源を入れる。
03 プログラムの実行で9gメタルギア・サーボのシャフトが回転したことを確認する。

※原点合わせ後は、手でシャフトを回さないように注意する。
04 マイクロ マックイーンプラス (micro:Maqueen Plus)の電源を切る。
05 3pinコネクターをマイクロマックイーン プラス (micro:Maqueen Plus)の5V端子から抜く。



# 8.2.2.ブルドーザーの組み立て


No. 画像 手順
01 ブルドーザーの組み立て01 メタル・トローリー・プレートにメタル・パン-チルト-ズーム・マウント・プレートを装着。
02 ブルドーザーの組み立て02 メタル・パン-チルト-ズーム・マウント・プレートにメタルギア・サーボを装着。

※丸形サーボホーンのネジ穴がマイクロマックイーン プラス (micro:Maqueen Plus)の前後左右を指すような向きで装着する。
03 ブルドーザーの組み立て03 メタル・パン-チルト-ズーム・マウント・プレートをマイクロマックイーン プラス (micro:Maqueen Plus)に装着。
04 ブルドーザーの組み立て04 ジェネラル・エクスパンション・マウント・ボードを丸形サーボホーンに装着する。超音波距離センサーをジェネラル・エクスパンション・マウント・ボードに装着し、4P超音波接続ケーブルで超音波距離センサーとマイクロマックイーン プラス (micro:Maqueen Plus)のSR04P超音波拡張ポートを接続する。



# サーボの回転性能を重視したカスタマイズ

通常、上記の組み立て方法では、サーボが干渉等で最大限に回転できないため、ここでは、組み立て方法のカスタマイズを行います。
付属品のみで組み立てが可能であるため、方法は下記写真をご参照ください。

※ このカスタマイズでは、「メタル・トローリー・プレート」の装着ができないため、ご注意ください。

No. 画像 説明
01 ブルドーザーの組み立て01 組みだて済みのキットからメタル・トローリー・プレートを外して、電池台の上に装着。
02 ブルドーザーの組み立て02 長短両方のピラー(長いピラーは「メカニックパーツ - ブルドーザー」の付属品、短いピラーは「マイクロマックイーン プラス」の付属品)を接続し、メタル・パン-チルト-ズーム・マウント・プレートをより高く設置することで、周りとの干渉を防ぐ。

以上でプログラミングの事前準備は完了です。




# 8.3.プログラミング方法


本マニュアルでは、MakeCodeを使用して、ブルドーザーを動かす方法を説明します。

あらかじめ用意されたパッケージを利用することで、プログラミンがより簡単に行えます
本マニュアルでは、専用パッケージを利用する前提でマイクロマックイーン プラス (micro:Maqueen Plus)のプログラミング例を記載しています。


※ パッケージのインポート方法については、「マイクロマックイーン プラス (micro:Maqueen Plus) MakeCode用パッケージのインポート」 (opens new window) をご参照ください。


※ 下記のプログラミング例では、上記「サーボの回転性能を重視したカスタマイズ」を前提としています。カスタマイズを行っていない場合、サーボ等の故障等につながる可能性があります。ご注意ください。


# 8.3.1.超音波距離センサーを左右に動かし障害物の有無を確認する


サーボを回転し、超音波距離センサーを付けたジェネラル・エクスパンション・マウント・ボードをランダム動かしながら、障害物の有無を確認ます。前方20㎝以内に障害物がある場合には警報を鳴らしながらLEDランプを点滅します。



# MakeCodeプログラミング例(ブロック)


# MakeCodeプログラミング例(JavaScript)


※ MakeCodeで自動変換されたコードです。
let distance_to_obstacle_cm = 0
maqueenPlusV2.I2CInit()
pins.servoWritePin(AnalogPin.P1, 90)
basic.forever(function on_forever() {
    
    pins.servoWritePin(AnalogPin.P1, randint(30, 150))
    basic.pause(1000)
    distance_to_obstacle_cm = maqueenPlusV2.readUltrasonic(DigitalPin.P13, DigitalPin.P14)
    if (distance_to_obstacle_cm <= 20) {
        maqueenPlusV2.controlLED(maqueenPlusV2.MyEnumLed.AllLed, maqueenPlusV2.MyEnumSwitch.Open)
        music.play(music.tonePlayable(494, music.beat(BeatFraction.Whole)), music.PlaybackMode.UntilDone)
        maqueenPlusV2.controlLED(maqueenPlusV2.MyEnumLed.AllLed, maqueenPlusV2.MyEnumSwitch.Close)
        basic.pause(500)
        maqueenPlusV2.controlLED(maqueenPlusV2.MyEnumLed.AllLed, maqueenPlusV2.MyEnumSwitch.Open)
        music.play(music.tonePlayable(494, music.beat(BeatFraction.Whole)), music.PlaybackMode.UntilDone)
        maqueenPlusV2.controlLED(maqueenPlusV2.MyEnumLed.AllLed, maqueenPlusV2.MyEnumSwitch.Close)
        basic.pause(500)
        maqueenPlusV2.controlLED(maqueenPlusV2.MyEnumLed.AllLed, maqueenPlusV2.MyEnumSwitch.Open)
        music.play(music.tonePlayable(494, music.beat(BeatFraction.Whole)), music.PlaybackMode.UntilDone)
        maqueenPlusV2.controlLED(maqueenPlusV2.MyEnumLed.AllLed, maqueenPlusV2.MyEnumSwitch.Close)
    } else {
        maqueenPlusV2.controlLED(maqueenPlusV2.MyEnumLed.AllLed, maqueenPlusV2.MyEnumSwitch.Close)
    }
    
    basic.pause(3000)
})



# MakeCodeプログラミング例(python)


※ MakeCodeで自動変換されたコードです。
distance_to_obstacle_cm = 0
maqueenPlusV2.i2c_init()
pins.servo_write_pin(AnalogPin.P1, 90)

def on_forever():
    global distance_to_obstacle_cm
    pins.servo_write_pin(AnalogPin.P1, randint(30, 150))
    basic.pause(1000)
    distance_to_obstacle_cm = maqueenPlusV2.read_ultrasonic(DigitalPin.P13, DigitalPin.P14)
    if distance_to_obstacle_cm <= 20:
        maqueenPlusV2.control_led(maqueenPlusV2.MyEnumLed.ALL_LED,
            maqueenPlusV2.MyEnumSwitch.OPEN)
        music.play(music.tone_playable(494, music.beat(BeatFraction.WHOLE)),
            music.PlaybackMode.UNTIL_DONE)
        maqueenPlusV2.control_led(maqueenPlusV2.MyEnumLed.ALL_LED,
            maqueenPlusV2.MyEnumSwitch.CLOSE)
        basic.pause(500)
        maqueenPlusV2.control_led(maqueenPlusV2.MyEnumLed.ALL_LED,
            maqueenPlusV2.MyEnumSwitch.OPEN)
        music.play(music.tone_playable(494, music.beat(BeatFraction.WHOLE)),
            music.PlaybackMode.UNTIL_DONE)
        maqueenPlusV2.control_led(maqueenPlusV2.MyEnumLed.ALL_LED,
            maqueenPlusV2.MyEnumSwitch.CLOSE)
        basic.pause(500)
        maqueenPlusV2.control_led(maqueenPlusV2.MyEnumLed.ALL_LED,
            maqueenPlusV2.MyEnumSwitch.OPEN)
        music.play(music.tone_playable(494, music.beat(BeatFraction.WHOLE)),
            music.PlaybackMode.UNTIL_DONE)
        maqueenPlusV2.control_led(maqueenPlusV2.MyEnumLed.ALL_LED,
            maqueenPlusV2.MyEnumSwitch.CLOSE)
    else:
        maqueenPlusV2.control_led(maqueenPlusV2.MyEnumLed.ALL_LED,
            maqueenPlusV2.MyEnumSwitch.CLOSE)
    basic.pause(3000)
basic.forever(on_forever)







# 8.3.2.障害物の無い方向へ自動走行する

進行方向の障害物を検知しながら走行します。前方に障害物がある場合には左右を確認し可能な方向に進路を変更します。



参考:マイクロゲームパッド (micro:Game Pad)は、当社ウェブストアにてご購入いただけます。



当社はmicro:bitの公認正規販売店です。国内のmicro:bit利用推進を行っております。

micro:bit専門ストア「イフティニー ストア(iftiny store)」 (opens new window)にて、各種micro:bit関連製品の販売をしております。

micro:bit専門ストア (opens new window)




# MakeCodeプログラミング例(ブロック)


# MakeCodeプログラミング例(JavaScript)


※ MakeCodeで自動変換されたコードです。
function determine_direction () {
    detect_obstacle()
    distance_detect_limit_cm = 200
    if (distance_to_obstacle_front_cm == 0 || distance_to_obstacle_front_cm > distance_detect_limit_cm) {
        distance_to_obstacle_front_cm = distance_detect_limit_cm
    }
    if (distance_to_obstacle_left_cm == 0 || distance_to_obstacle_left_cm > distance_detect_limit_cm) {
        distance_to_obstacle_left_cm = distance_detect_limit_cm
    }
    if (distance_to_obstacle_right_cm == 0 || distance_to_obstacle_right_cm > distance_detect_limit_cm) {
        distance_to_obstacle_right_cm = distance_detect_limit_cm
    }
    maximum_distance_cm = 0
    maximum_distance_cm = Math.max(distance_to_obstacle_left_cm, distance_to_obstacle_right_cm)
    maximum_distance_cm = Math.max(maximum_distance_cm, distance_to_obstacle_front_cm)
    if (distance_to_obstacle_front_cm < 15) {
        move_back()
    } else if (maximum_distance_cm < 15) {
        move_back()
    } else if (maximum_distance_cm == distance_to_obstacle_front_cm) {
        move_forward()
    } else if (maximum_distance_cm == distance_to_obstacle_left_cm) {
        turn_left()
    } else if (maximum_distance_cm == distance_to_obstacle_right_cm) {
        turn_right()
    } else {
        move_forward()
    }
}
function move_back () {
    basic.showLeds(`
        . . . . .
        . . # . .
        # . # . #
        . # # # .
        . . # . .
        `)
    maqueenPlusV2.controlMotor(maqueenPlusV2.MyEnumMotor.AllMotor, maqueenPlusV2.MyEnumDir.Backward, 40)
    basic.pause(2000)
    maqueenPlusV2.controlMotorStop(maqueenPlusV2.MyEnumMotor.AllMotor)
}
function turn_left () {
    basic.showLeds(`
        . . # . .
        . . . # .
        # # # # #
        . . . # .
        . . # . .
        `)
    maqueenPlusV2.controlMotor(maqueenPlusV2.MyEnumMotor.LeftMotor, maqueenPlusV2.MyEnumDir.Forward, 0)
    maqueenPlusV2.controlMotor(maqueenPlusV2.MyEnumMotor.RightMotor, maqueenPlusV2.MyEnumDir.Forward, 30)
    basic.pause(2300)
    maqueenPlusV2.controlMotorStop(maqueenPlusV2.MyEnumMotor.AllMotor)
}
function detect_obstacle () {
    pins.servoWritePin(AnalogPin.P1, 180)
    basic.pause(2000)
    distance_to_obstacle_left_cm = 0
    distance_to_obstacle_left_cm = maqueenPlusV2.readUltrasonic(DigitalPin.P13, DigitalPin.P14)
    pins.servoWritePin(AnalogPin.P1, 90)
    basic.pause(2000)
    distance_to_obstacle_front_cm = 0
    distance_to_obstacle_front_cm = maqueenPlusV2.readUltrasonic(DigitalPin.P13, DigitalPin.P14)
    pins.servoWritePin(AnalogPin.P1, 0)
    basic.pause(2000)
    distance_to_obstacle_right_cm = 0
    distance_to_obstacle_right_cm = maqueenPlusV2.readUltrasonic(DigitalPin.P13, DigitalPin.P14)
    pins.servoWritePin(AnalogPin.P1, 90)
}
function move_forward () {
    basic.showLeds(`
        . . # . .
        . # # # .
        # . # . #
        . . # . .
        . . # . .
        `)
    maqueenPlusV2.controlMotor(maqueenPlusV2.MyEnumMotor.AllMotor, maqueenPlusV2.MyEnumDir.Forward, 60)
    basic.pause(2000)
    maqueenPlusV2.controlMotorStop(maqueenPlusV2.MyEnumMotor.AllMotor)
}
function turn_right () {
    basic.showLeds(`
        . . # . .
        . # . . .
        # # # # #
        . # . . .
        . . # . .
        `)
    maqueenPlusV2.controlMotor(maqueenPlusV2.MyEnumMotor.LeftMotor, maqueenPlusV2.MyEnumDir.Forward, 30)
    maqueenPlusV2.controlMotor(maqueenPlusV2.MyEnumMotor.RightMotor, maqueenPlusV2.MyEnumDir.Forward, 0)
    basic.pause(2300)
    maqueenPlusV2.controlMotorStop(maqueenPlusV2.MyEnumMotor.AllMotor)
}
let maximum_distance_cm = 0
let distance_detect_limit_cm = 0
let distance_to_obstacle_right_cm = 0
let distance_to_obstacle_front_cm = 0
let distance_to_obstacle_left_cm = 0
maqueenPlusV2.I2CInit()
distance_to_obstacle_left_cm = 0
distance_to_obstacle_front_cm = 0
distance_to_obstacle_right_cm = 0
basic.forever(function () {
    determine_direction()
})





# MakeCodeプログラミング例(python)


※ MakeCodeで自動変換されたコードです。
def determine_direction():
    global distance_detect_limit_cm, distance_to_obstacle_front_cm, distance_to_obstacle_left_cm, distance_to_obstacle_right_cm, maximum_distance_cm
    detect_obstacle()
    distance_detect_limit_cm = 200
    if distance_to_obstacle_front_cm == 0 or distance_to_obstacle_front_cm > distance_detect_limit_cm:
        distance_to_obstacle_front_cm = distance_detect_limit_cm
    if distance_to_obstacle_left_cm == 0 or distance_to_obstacle_left_cm > distance_detect_limit_cm:
        distance_to_obstacle_left_cm = distance_detect_limit_cm
    if distance_to_obstacle_right_cm == 0 or distance_to_obstacle_right_cm > distance_detect_limit_cm:
        distance_to_obstacle_right_cm = distance_detect_limit_cm
    maximum_distance_cm = 0
    maximum_distance_cm = max(distance_to_obstacle_left_cm, distance_to_obstacle_right_cm)
    maximum_distance_cm = max(maximum_distance_cm, distance_to_obstacle_front_cm)
    if distance_to_obstacle_front_cm < 15:
        move_back()
    elif maximum_distance_cm < 15:
        move_back()
    elif maximum_distance_cm == distance_to_obstacle_front_cm:
        move_forward()
    elif maximum_distance_cm == distance_to_obstacle_left_cm:
        turn_left()
    elif maximum_distance_cm == distance_to_obstacle_right_cm:
        turn_right()
    else:
        move_forward()
def move_back():
    basic.show_leds("""
        . . . . .
        . . # . .
        # . # . #
        . # # # .
        . . # . .
        """)
    maqueenPlusV2.control_motor(maqueenPlusV2.MyEnumMotor.ALL_MOTOR,
        maqueenPlusV2.MyEnumDir.BACKWARD,
        40)
    basic.pause(2000)
    maqueenPlusV2.control_motor_stop(maqueenPlusV2.MyEnumMotor.ALL_MOTOR)
def turn_left():
    basic.show_leds("""
        . . # . .
        . . . # .
        # # # # #
        . . . # .
        . . # . .
        """)
    maqueenPlusV2.control_motor(maqueenPlusV2.MyEnumMotor.LEFT_MOTOR,
        maqueenPlusV2.MyEnumDir.FORWARD,
        0)
    maqueenPlusV2.control_motor(maqueenPlusV2.MyEnumMotor.RIGHT_MOTOR,
        maqueenPlusV2.MyEnumDir.FORWARD,
        30)
    basic.pause(2300)
    maqueenPlusV2.control_motor_stop(maqueenPlusV2.MyEnumMotor.ALL_MOTOR)
def detect_obstacle():
    global distance_to_obstacle_left_cm, distance_to_obstacle_front_cm, distance_to_obstacle_right_cm
    pins.servo_write_pin(AnalogPin.P1, 180)
    basic.pause(2000)
    distance_to_obstacle_left_cm = 0
    distance_to_obstacle_left_cm = maqueenPlusV2.read_ultrasonic(DigitalPin.P13, DigitalPin.P14)
    pins.servo_write_pin(AnalogPin.P1, 90)
    basic.pause(2000)
    distance_to_obstacle_front_cm = 0
    distance_to_obstacle_front_cm = maqueenPlusV2.read_ultrasonic(DigitalPin.P13, DigitalPin.P14)
    pins.servo_write_pin(AnalogPin.P1, 0)
    basic.pause(2000)
    distance_to_obstacle_right_cm = 0
    distance_to_obstacle_right_cm = maqueenPlusV2.read_ultrasonic(DigitalPin.P13, DigitalPin.P14)
    pins.servo_write_pin(AnalogPin.P1, 90)
def move_forward():
    basic.show_leds("""
        . . # . .
        . # # # .
        # . # . #
        . . # . .
        . . # . .
        """)
    maqueenPlusV2.control_motor(maqueenPlusV2.MyEnumMotor.ALL_MOTOR,
        maqueenPlusV2.MyEnumDir.FORWARD,
        60)
    basic.pause(2000)
    maqueenPlusV2.control_motor_stop(maqueenPlusV2.MyEnumMotor.ALL_MOTOR)
def turn_right():
    basic.show_leds("""
        . . # . .
        . # . . .
        # # # # #
        . # . . .
        . . # . .
        """)
    maqueenPlusV2.control_motor(maqueenPlusV2.MyEnumMotor.LEFT_MOTOR,
        maqueenPlusV2.MyEnumDir.FORWARD,
        30)
    maqueenPlusV2.control_motor(maqueenPlusV2.MyEnumMotor.RIGHT_MOTOR,
        maqueenPlusV2.MyEnumDir.FORWARD,
        0)
    basic.pause(2300)
    maqueenPlusV2.control_motor_stop(maqueenPlusV2.MyEnumMotor.ALL_MOTOR)
maximum_distance_cm = 0
distance_detect_limit_cm = 0
distance_to_obstacle_right_cm = 0
distance_to_obstacle_front_cm = 0
distance_to_obstacle_left_cm = 0
maqueenPlusV2.i2c_init()
distance_to_obstacle_left_cm = 0
distance_to_obstacle_front_cm = 0
distance_to_obstacle_right_cm = 0

def on_forever():
    determine_direction()
basic.forever(on_forever)



Last Updated: 9/25/2023, 1:42:06 PM