ゆるく楽しむプログラミング

通信機能とサーボモーターで迷路を操作

前回のリモートコントロールの受信側にサーボモーターをつないで迷路を操作してみます。
元々、迷路操作がやりたかったのですがmakecodeからだと4番ピンのアナログ入力が上手く使えない(LEDをイネーブルに出来ない)っぽいので通信機能で2台を連携させることで入出量につかえるピン数を増やそう作成をねらってました。
ただ、意味もなくmicro:bitを追加購入するものアレなのでVer2.0の登場は渡りに船でした。
※Pythonでプログラムを書けば1台のmicro:bitでジョイスティクの読み取りとサーボモーターの制御ができると思う。

多くの作例でサーボモーターの電源をmicro:bitからとってますしmakecodeの接続図でもmicro:bitから電源をとっていますが、micro:bitの端子から取り出せる電流は大きくないのでサーボモーターの電源は別に用意した方が良いと思います。
私はセンサーシールド拡張ボードから電源をとりました。



サーボモーターを連結したアームは、最初は丁寧に作ろう思っていたのですが… (´・ω・`)
製作が遅々として進まないので面倒になってザックリ雑にホットボンド(グルーガン)でくっつけました。
迷路は厚紙(入浴剤の箱)で作ってあります。
迷路のサイズが大きくなると重量的に耐えられない気がしますが厚紙制ですしこのくらいのサイズなら十分間に合います

----- ▼ MP4動画 「ブロックされているコンテンツを許可」 しないと見えないかも -----

-----
makecodeのブロック図にするといい加減サイズが大きくなりすぎるのでJavascriptソースで示してます。
コピペして貼り付けてからブロックに切り替えればブロック図で見ることができます。

送信側

makecodeブロック図(PFD)
let y = 0
let xd = 0
let x = 0
let yd = 2
yd = 2
let スプライト = game.createSprite(2, 2)
radio.setGroup(1)
basic.forever(function () {
    x = pins.analogReadPin(AnalogPin.P0)
    xd = x / 200
    if (xd > 4) {
        xd = 4
    }
    y = pins.analogReadPin(AnalogPin.P1)
    yd = y / 200
    if (yd > 4) {
        yd = 4
    }
    スプライト.delete()
    スプライト = game.createSprite(xd, yd)
    radio.sendValue("x", x)
    radio.sendValue("y", y)
})

受信側

makecodeブロック図(PFD)
radio.onReceivedValue(function (name, value) {
    if (name.compare("x") == 0) {
        x = value
    }
    if (name.compare("y") == 0) {
        y = value
    }
    xd = x / 200
    xs = 15 * xd + 60
    if (xd > 4) {
        xd = 4
        xs = 120
    }
    yd = y / 200
    ys = 15 * yd + 54
    if (yd > 4) {
        yd = 4
    }
    スプライト.delete()
    スプライト = game.createSprite(xd, yd)
    servos.P0.setAngle(xs)
    servos.P1.setAngle(ys)
})
let ys = 0
let xs = 0
let y = 0
let x = 0
let スプライト: game.LedSprite = null
let yd = 0
let xd = 0
xd = 2
yd = 2
servos.P0.setRange(45, 135)
servos.P0.setAngle(90)
servos.P1.setRange(45, 135)
servos.P1.setAngle(84)
スプライト = game.createSprite(2, 2)
radio.setGroup(1)