No.101, Sec.2, Kuang-Fu Rd., HsinChu City, Taiwan 新竹市光復路二段101號
+886-571-5131#35162
klou@mx.nthu.edu.tw

使用 PictoBlox

Lab of AR/VR/XR & Machine Learning

使用 PictoBlox

為了讓沒有 C 語言背景的同學快速入門 Arduino 程式設計,使用積木式開發環境是很好的選擇,目前常見的有 Makeblock, Blocklyduino, PictoBlox 等,我個人推薦的則是一款泰國的產品 KBIDE,日後有空再聊,今天先介紹我兒子「又愛又恨」的 PictoBlox,為什麼說對它是「又愛又恨」呢?PictoBlox最令人喜愛的它提供了控制程式燒錄到 Arduino或是 ESP32,等開發板中,這隻控制程式可以直接與電腦螢幕上的小熊互動,將各個 pin腳位的狀態以及變數值由小熊說出來,另外,所有積木翻譯成C語言的結果也可以直接在視窗中顯示出來,這對於初學者在程式開發時的除錯及學習C語言的結構是很有幫助的;但令人髮指的部分也是這個自動翻譯器,有時候翻出來的結果實在很沒腦,還是得自動動手修改才行執行。

關於 PictoBlox 的安裝請參見阿玉老師的文章,本文為使用 PictoBlox 實作Arduino Uno R3 呼吸燈及控制開關單元的介紹,目的在於學習C語言中的變數、迴圈以及條件分支,這三個程式語言最基礎的結構。

以下則為相對應的電路及電子元件及接線的結果:

  • Auduino Uno R3
  • LED X 2
  • 按鈕 X 1
  • 電阻 X 3 ( 220Ω 兩個,連接LED短腳及GND;10KΩ 接按鈕其中一端及GND)

接下來開始寫控制Arduino的程式,使用 PictoBlox的好處是可以用積木拖曳程式後,直接看到相對應的C語言代碼,甚至可以直接動手編輯。

左方為PictoBlox 拖曳出來的積木,右方則為相對應的C語言代碼

上圖中程式執行的結果就是讓內建的 pin13 每2秒為一週期的閃滅(1秒點亮+1秒息滅)

呼吸燈範例

圖2則為呼吸燈範例,由於pin11為PWM可用數位頻率模擬類比的接腳,強度可由 0 ~ 255 共256個強弱等級,故pin11所接上的 LED 會以每2.56 秒左右的週期點亮後,再以2.56秒的週期漸漸暗淡下來;配合 pin13 一明一滅的方式,可以看得出來兩者之間的差異:pin13 只有全亮及全滅;而 pin11 有不同等級的亮度,像是會呼吸的燈。

這個範例可以讓學生經由積木組合出迴圈的結構,再來對照C語言 for 迴圈的結構,其中第12行到第16行為第一個迴圈,共會執行256次,利用變數 pwm_level 作為第13行 analogWrite 函式的第二個參數使用,以控制輸出的頻率。如果會寫C的同學應該不難發現,其實這個變數是多餘的,我們同樣可以利用區域變數i的值作為 analogWite函式第二個參數使用,而且,pwn_level怎麼會宣告為 float ? 其實只要宣告為 int 就夠用了,但以積木程式能自動轉譯C語言而言,算是差強人意了,所以使用 PictoBlox 頂多只能針對不會C的同學作為導學使用,要對 Arduino 的運作達到精熟,千萬不可以依賴這類型的開發工具。改寫後的例字如下:

右方為改寫後的精簡版

若對於自動翻譯的C代碼看不順眼,可以利用編輯功能自己動手改寫,編輯功能在C程式碼上方,上傳代碼旁的鉛筆符號:

圖3的代碼與原始代碼的差異在於少了一個變數,以及for 迴圈在增加及減少的過程,請注意!修改右方C代碼後,左方的積木不會同時更動喲,也就是說PictoBlox只會將積木翻譯為C,不會反向將C翻譯為積木的。

接下來搭配按鈕開關實作啟動鈕,目的是介紹條件分支的使用方式,順便介紹自訂積木(自訂函式)的作法,我們的按鈕是利用 pin8 的狀態來觸發的,必須要先將 pin8 提升電位至HIGH,也就是C語言第4行的部分,但你也發現了第9行及第10行不合理的敍述,一個pin腳同時為INPUT及OUTPUT !?,但這就是自動翻譯的缺點。

修改過的程式如下:

請注意start() 以及第7行的改變,執行結果如下:

這裹附上未修改過的積木檔

請同們試著修改,設計第二次點下按鈕時,全部停止運作。(參考答案