最新消息:

Micro:bit创意课程系列:一对多控制

Micro Bit 少儿编程 2075浏览 0评论

上次课做了一个micro:bit报数的小程序,每个micro:bit可以利用其出厂时的DeviceSerialNumber来寻址。今天以这个寻址程序为基础,实作以一个micro:bit控制多个micro:bit的小程序。这个小程序可选择要控制哪些micro:bit,并且选择这些micro:bitLED要出现什么图案。

 

Micro:bit创意课程系列:一对多控制

选一个micro:bit当做控制器,其他的micro:bit开机后会向控制器取得一个流水号当做自己的编号,主控端的micro:bit可利用A键或B键选择要控制哪个号码,也可以在号码出现时摇一下,将该号码储存进一个数组,被选择到的号码便可以被主控端一起控制,决定好号码后同时按A+B键。接下来再按A键或B键可选择受控的micro:bit要出现什么LED图案,选择好后一样按A+B键,便可以将图案送到受控端的micro:bit

详细的操作方式请参考以下影片:

A键及B键,可选择要控制的micro:bit编号及图案

 

Micro:bit创意课程系列:一对多控制

可控制所有的micro:bit同时出现某个图案

 

Micro:bit创意课程系列:一对多控制

可控制所有的micro:bit同时出现某个图案

 

Micro:bit创意课程系列:一对多控制

也可以控制个别的micro:bit出现不同的图案

 

Micro:bit创意课程系列:一对多控制

控制方法:

1.先将主控端的micro:bit先开启,被控端的micro:bit依序开起,被控端会向主控端取得流水编号,并显示在自己的LED上。

2.主控端按AB键,会显示号码,出现该号码表示该号码的micro:bit可被控制,若想控制多个,则在显示该号码时用力摇动,则该号码会被记录下来,以便可以被控制。选好后,同时按A+B键,则表示选号确定,这时LED上会显示打勾,表示选号选好了。

3.接着主控端按AB键则会显示要传送的图案,选好后同时按A+B键,则表示选好图案确定,这时LED上会显示打勾,受控端的micro:bit便会出现图案。

 

Micro:bit创意课程系列:一对多控制

Micro:bit创意课程系列:一对多控制

程序代码

以下为主控端及被控端的程序,可将程序代码贴上makecodejavascript页面上,可以直接转成积木式的语法结构

主控端参考程序:

let bitSTEMp: number[] = []

let countBits = 0

let myBits: string[] = []

let myStep = 0

let selectedBit = 0

let selectedIcon = 0

input.onButtonPressed(Button.B, () => {

if (myStep == 1) {

selectedBit += 1

if (selectedBit > countBits – 1) {

selectedBit = countBits – 1

}

if (selectedBit == -1) {

basic.showString(“A”)

} else {

basic.showNumber(selectedBit)

}

}

if (myStep == 2) {

selectedIcon += 1

if (selectedIcon > 39) {

selectedIcon = 39

}

basic.showIcon(selectedIcon)

}

})

radio.onDataPacketReceived(({receivedString: receivedName, receivedNumber: receivedValue }) => {

if (receivedValue == -1) {

myBits.push(receivedName)

radio.sendValue(receivedName, countBits)

countBits += 1

basic.showNumber(countBits)

}

})

input.onButtonPressed(Button.A, () => {

if (myStep == 1) {

selectedBit += -1

if (selectedBit < -1) {

selectedBit = -1

}

if (selectedBit == -1) {

basic.showString(“A”)

} else {

basic.showNumber(selectedBit)

}

}

if (myStep == 2) {

selectedIcon += -1

if (selectedIcon < -1) {

selectedIcon = -1

}

if (selectedIcon == -1) {

basic.showString(“C”)

} else {

basic.showIcon(selectedIcon)

}

}

})

input.onButtonPressed(Button.AB, () => {

if (myStep == 1) {

basic.showIcon(IconNames.Yes)

basic.clearScreen()

}

if (myStep == 2) {

basic.clearScreen()

if (bitSTEMp.length > 0) {

for (let index = 0; index < bitsTemp.length; index++) {

radio.sendValue(“” +bitsTemp[index], selectedIcon)

}

} else if (selectedBit == -1) {

radio.sendValue(“all”, selectedIcon)

} else {

radio.sendValue(“” + selectedBit, selectedIcon)

}

basic.showString(“send”)

}

myStep += 1

if (myStep == 3) {

myStep = 1

bitsTemp = []

}

})

input.onGesture(Gesture.Shake, () => {

if (myStep == 1 && selectedBit != -1) {

bitsTemp.push(selectedBit)

basic.showIcon(IconNames.Happy)

}

})

radio.setGroup(1)

myBits = []

bitsTemp = []

countBits = 0

myStep = 1

selectedBit = -1

selectedIcon = -1

 

被控端参考程序:

let myIndex = 0

radio.onDataPacketReceived( ({receivedString: receivedName, receivedNumber: receivedValue }) =>  {

if (receivedName == “” + control.deviceSerialNumber()) {

myIndex = receivedValue

basic.showNumber(myIndex)

}

if (receivedName == “” + myIndex) {

if (receivedValue == -1) {

basic.clearScreen()

} else {

basic.showIcon(receivedValue)

}

}

if (receivedName == “all”) {

if (receivedValue == -1) {

basic.clearScreen()

} else {

basic.showIcon(receivedValue)

}

}

})

basic.showString(“?”)

radio.setGroup(1)

myIndex = -1

radio.sendValue(“” +control.deviceSerialNumber(), myIndex)

这个范例只是展示一对多控制micro:bitLED,当然,若要控制其他的动作也是可以的,例如伺服马达或是一整群的机器人大军。

原文参考

https://www.facebook.com/permalink.php?story_fbid=1470367746332117&id=100000767174283&pnref=story

转自公众号:
易心Microbit编程

您必须 登录 才能发表评论!