這幾天隨便在網路上逛逛,看到了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 = 0let on = 0let rollValue = 0let pitchValue = 0let speed = 0input.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 = 0rollValue = 0value = 20speed = 3myDirection = "stop"on = 0basic.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