這幾天隨便在網路上逛逛,看到了Philipp Henkel的一篇文章,內容寫到了他編寫了一個makecode的套件,可用它來控制樂高的Power Functions系統的馬達動力系統(不是EV3或是NXT,Power Function純粹只是馬達動力系統,不能編寫程式),看到這篇文章非常高興,因為以前讓家裡的小朋友學樂高,買了許多這個系列的零件及裝置,於是把樂高搬出來,並參照日本的樂高機構大師五十川芳仁的書籍(樂高創意寶典:車輛與酷玩意篇),馬上先做了一台履帶車試試Philipp Henkel寫的套件,是否真能控制樂高的PF馬達,結果真的成功了,讓我免去抓取紅外線頻率的麻煩事,拖拉幾個積木便能簡單控制樂高PF馬達,於是原本不能編程的樂高動力系統,現在也可以像EV3或是NXT具有編寫程式控制的能力了。
樂高的Power Function系列(以下簡稱PF),有一個專屬的電池盒,幾個不同種類的PF馬達,要控制這些馬達,可以利用樂高的紅外線遙控器傳送給紅外線接收器,紅外線接收器有四個channel,在不同的channel一次可以控制二個馬達(以紅色和藍色記號區分,如果把馬達堆疊,可以控制更多)。
所以,micro:bit若要取代樂高的紅外線遙控器的話,就必須要為micro:bit裝上紅外線LED。紅外線LED就如同一般的LED有二個接腳,接腳一長一短,長的要接在micro:bit的P0或P1、P2腳位,短的則要接上micro:bit的GND上。如果有micro:bit的擴展板,就可以用二頭都是母的杜邦線來接,如果沒有擴展板,那就用鱷魚夾也是OK的。
接好線路的micro:bit便可以取代樂高遙控器了
接好線路的micro:bit便可以取代樂高遙控器了
為了向樂高機構大師五十川芳仁致敬,用micro:bit來控制他書裡的所設計的履帶車。
該有的硬體都組裝完畢,接下來就是程式控制了,makecode先添加Philipp Henkel先生所寫的套件,套件網址:https://github.com/philipphenkel/pxt-powerfunctions,安裝完後,makecode就會多出一個Power Functions的積木選單,在使用Power Functions控制馬達前,記得要用「use IR LED on pin ?」設定好紅外線LED的腳位。
程式功能如下:
按A+B可開始遙控車子,利用前傾、後傾、左傾、右傾控制車子的方向,再按一次A+B則會停止遙控;按下A會減速,按下B會加速。
詳細的程式截圖:
如果上面的圖懶得自己拉積木,那就請把以下的Javascript程式直接貼上makecode的Javascript頁面內:
let myDirection = ""
let value = 0
let on = 0
let rollValue = 0
let pitchValue = 0
let speed = 0
input.onButtonPressed(Button.AB, () => {
if (on == 1) {
basic.showIcon(IconNames.No)
on = 0
myDirection = "stop"
powerfunctions.setSpeed(PowerFunctionsMotor.Red1, 0)
powerfunctions.setSpeed(PowerFunctionsMotor.Blue1, 0)
} else {
basic.clearScreen()
on = 1
}
})
input.onButtonPressed(Button.A, () => {
speed += -1
if (speed <= 1) {
speed = 1
}
basic.showNumber(speed)
})
input.onButtonPressed(Button.B, () => {
speed += 1
if (speed >= 7) {
speed = 7
}
basic.showNumber(speed)
})
powerfunctions.useIrLedPin(AnalogPin.P1)
pitchValue = 0
rollValue = 0
value = 20
speed = 3
myDirection = "stop"
on = 0
basic.forever(() => {
if (on == 1) {
pitchValue = input.rotation(Rotation.Pitch)
rollValue = input.rotation(Rotation.Roll)
if (pitchValue >= value && myDirection != "backward") {
basic.showArrow(ArrowNames.South)
powerfunctions.setMotorDirection(PowerFunctionsMotor.Red1, PowerFunctionsDirection.Backward)
powerfunctions.setMotorDirection(PowerFunctionsMotor.Blue1, PowerFunctionsDirection.Forward)
powerfunctions.setSpeed(PowerFunctionsMotor.Red1, speed)
basic.pause(10)
powerfunctions.setSpeed(PowerFunctionsMotor.Blue1, speed)
myDirection = "backward"
} else if (pitchValue <= value * -1 && myDirection != "forward") {
basic.showArrow(ArrowNames.North)
powerfunctions.setMotorDirection(PowerFunctionsMotor.Red1, PowerFunctionsDirection.Forward)
powerfunctions.setMotorDirection(PowerFunctionsMotor.Blue1, PowerFunctionsDirection.Backward)
powerfunctions.setSpeed(PowerFunctionsMotor.Red1, speed)
basic.pause(10)
powerfunctions.setSpeed(PowerFunctionsMotor.Blue1, speed)
myDirection = "forward"
}
if (rollValue >= value && myDirection != "rightward") {
basic.showArrow(ArrowNames.East)
powerfunctions.setMotorDirection(PowerFunctionsMotor.Red1, PowerFunctionsDirection.Forward)
powerfunctions.setMotorDirection(PowerFunctionsMotor.Blue1, PowerFunctionsDirection.Forward)
powerfunctions.setSpeed(PowerFunctionsMotor.Red1, speed)
basic.pause(10)
powerfunctions.setSpeed(PowerFunctionsMotor.Blue1, speed)
myDirection = "rightward"
} else if (rollValue <= value * -1 && myDirection != "leftward") {
basic.showArrow(ArrowNames.West)
powerfunctions.setMotorDirection(PowerFunctionsMotor.Red1, PowerFunctionsDirection.Backward)
powerfunctions.setMotorDirection(PowerFunctionsMotor.Blue1, PowerFunctionsDirection.Backward)
powerfunctions.setSpeed(PowerFunctionsMotor.Red1, speed)
basic.pause(10)
powerfunctions.setSpeed(PowerFunctionsMotor.Blue1, speed)
myDirection = "leftward"
}
}
})
相關連結:
日本樂高機構大師,五十川芳仁的網站:http://www.isogawastudio.co.jp/legostudio/
Philipp Henkel的文章:https://www.hackster.io/philipp-henkel/lego-power-functions-ir-sender-for-micro-bit-aecc10
樂高Power Functions套件網址:https://github.com/philipphenkel/pxt-powerfunctions