冬營營招生中

2019年7月27日 星期六

[python] microit控制RGB LED -七彩霓虹燈


原理說明:


RGB LED 和一般單色LED控制原理相同, 只不過現在有RGB三根腳。為了做出七彩霓虹燈的感覺, 我們可以利用PWM作為輸入, 透過duty cycle的設定,使得R、G、B分別有不同的的程度, 例如,紅可以有256 階紅的程度。



======================

PWM
PWM (Pulse Width Modulation) , 此硬體micro:bit 己內建, 它可以重覆產生週期性的波形, 在每一個週期中可以有著不冋的pulse長度, 而pulse長度和週期的比例就是duty cycle, 例如25% duty cycle, 就是pulse 長度佔了週期25%的時間. 或者說pulse佔了25%而spaces佔了75%。




1.) PWM頻率?
使用PWM會須要設定頻率, 而頻率為週期的倒數,表示數一下(clock tick)的時間.若PWM為10HZ,表示數一個tick要花0.1秒.

2.) 10 bit bit 或12bit PWM ?  
PWM 10bit表示會數1024下作為一個pulse/space週期, 12bitbit表示會數4096下為一個週期(0~4095). 一個10Hz的PWM pulse/space週期時間,就是看你數完一輪的時間, 若是12bit, 就是4096*0.1=409.6秒

3.) duty cycle ?
就是pulse要數幾下,以12bit為例, 若數1024下, 就是佔了4096的四分之一, 也就是duty cycle 25%. 至於duty cycle實際有多久, 就是數一次(clock ticks)的時間乘上pulse數幾下(pulse count)


總結, 同樣都是duty cycle 25%,但pulse時間長度可能是不同的, 因為PWM頻率是不同的.
duty cycle只是描述比例關係, 仍必須對不同硬體給定其所需要的頻率. 因為pulse和space切換時間若太短,有些硬體可能無法工作,因為來不及到High就又被切到Low....

那RGB LED該給的PWM頻率是多少呢? 100HZ~200HZ, 這可以讓RGB LED在不同duty cycle 下可以產生不同的顏色



開發工具:



實驗材料:

  1. micro:bit 
  2. Thunder:bit
  3. microUSB線

成果展示:




https://www.youtube.com/watch?v=oaWK9EmfhPo

範例程式:

2019年7月21日 星期日

Python for micro:bit




https://github.com/beyond-coding-tw/nexusbot.git

[micro:bit x Nexus:bit] 電吉他(開文章前請先關喇叭)







在這篇中,我們要用Nexus:bit擴充板做一個簡易電吉他:按下A鍵時蜂鳴器會響,並根據micro:bit的轉動角度(旋轉感測值-roll)來調整音高。

當然,轉動角度要視我們面對micro:bit的方向而定。在這個範例中,我們將以右手拿著Nexus:bit,所以當micro:bit往手肘方向轉時,roll角度值會變小,反之往外轉會變大。而我們希望往手肘轉時音高會提高,往外轉則是降低。

因此,首先我們得限制讀到的旋轉值角度在-60到30度之間;接著,我們把這個值對應到高音C(-60度時)至中音C(30度時)。如此一來,當你按住A並在這個區間轉動micro:bit時,聲音頻率就會改變了。

「中音C」與「高音C」的積木得從「音樂」區拖出來用。或者你可以直接輸入你想要的聲音範圍的頻率

為了增添點變化,我們也在「重複無限次」迴圈內加入讓RGB LED亮起隨機顏色的積木。另外這兒加了25秒延遲,好讓蜂鳴器的聲音能稍微穩定點、但又不至於拖太久。





[micro:bit 社團教材] 光點抓抓樂




這和接水果一樣,是個只使用兩個角色變數的簡單小遊戲。名為「光點」的角色會隨機出現在LED螢幕的某個位置,主角只要能移動到那裡就能「吃掉」或「抓到」它。

由於主角得上下左右移動,所以我們借用「旋轉感測值-pitch」(前後轉)和「旋轉感測值-roll」(左右轉)來判斷該走的方向:



  • pitch < -20(往前轉20度):往上走(角色方向設為0)
  • pitch > 20(往後轉20度):往下走(角色方向設為180)
  • roll < -20(往左轉20度):往左走(角色方向設為-90或270)
  • roll > 20(往右轉20度):往右走(角色方向設為90)


如果主角和光點重疊,代表抓到光點,於是我們把光點挪到新的隨機位置,並且加1分。由於在「當啟動時」有倒數30秒的設定,所以30秒後遊戲自動結束、並會顯示總分。

「重複無限次」也有加入200毫秒的延遲,以免主角移動得太快、難以吃到光點。此外若想調整主角前後左右移動的靈敏度,也就是micro:bit要轉動的幅度,調整各個判斷式中的角度值就好(比如-15/15度或-30/30度)。



點圖可放大









[micro:bit Maker] 用ESP-01模組(ESP8266)打造micro:bit網頁伺服器




ESP-01/ESP-01S是市面上最小最便宜的ESP8266 Wifi模組之一,也是許多人學習物聯網(IoT)應用的入門管道。ESP8266本身其實也是個開發板,不過出廠時預載的韌體允許使用者以外部開發板和它溝通──透過所謂的「AT指令」。



筆者購買的ESP-01S,不過較舊的ESP-01也適用




接線方式如下:

  • Pin 8/Pin 4 → 3.3V
  • Pin 1 → GND
  • Pin 2(Tx)→ micro:bit的Rx(在本例是P16)
  • Pin 7(Rx)→ micro:bit的Tx(在本例是P15)



為了示範方便,這張圖的Tx和Rx接在P0和P1。
當然,由於使用Nexus:bit擴充板的關係,我們實際上改用P15/P16。
當然,你也能在下面的程式中修改Tx_pin和Rx_pin常數。






要注意ESP8266需要至少400mA的供電量才能正常運作。有時ESP-01可能在通電後未能正確啟動,這時就得手動重新接電。

此外,為了讀取ESP-01丟出的序列回應,我們也接上一個USB轉TTL模組,好在電腦上監看ESP-01的運作狀況。

下面是完整程式碼。我們之所以使用MakeCode編輯器的JavaScript模式,主要是為了能輸入AT指令結尾要求的CR+LF,也就是\u000D\u000A。此外,這兒需要處理不少字串,用MakeCode的積木做起來不太方便。

程式開頭的常數WIFI_MODE可用來設定採用STA(站點)或AP(熱點)模式,前者會連上你所在環境的Wifi分享器,後者則會讓自己變成Wifi分享器。下面的常數SSID_x和PASSWORD_x是兩個模式要使用的連線名稱與密碼。

注意:若使用STA模式,不要把含有連線名稱及密碼的程式碼隨意分享在網路上。

完整的AT指令與用法可參考這裡



const WIFI_MODE: number = 2 // 1=STA模式; 2=AP模式 const Tx_pin: SerialPin = SerialPin.P15 // 接ESP-01的Rx pin const Rx_pin: SerialPin = SerialPin.P16 // 接ESP-01的Tx pin const LED_pin: DigitalPin = DigitalPin.P2 // LED控制腳位 const SSID_1: string = "your_wifi_ssid" // STA模式要連的wifi名稱 const PASSWORD_1: string = "your_wifi_password" // STA模式要連的wifi密碼 const SSID_2: string = "ESP8266" // AP模式熱點名稱 const PASSWORD_2: string = "microbit" // AP模式熱點密碼 let LED_status: number = 0 let serial_str: string = "" pins.digitalWritePin(LED_pin, 0) serial.redirect(Tx_pin, Rx_pin, 115200) // 設定ESP-01 sendAT("AT+RESTORE", 1000) sendAT("AT+RST", 1000) sendAT("AT+CWMODE=" + WIFI_MODE) if (WIFI_MODE == 1) { // STA模式, 等待連上再繼續 sendAT("AT+CWJAP=\"" + SSID_1 + "\",\"" + PASSWORD_1 + "\"") let result: boolean = wait_for_response("OK") if (!result) control.reset() } else if (WIFI_MODE == 2) { // AP模式 // 開放1個連線頻道, 驗證模式=4 (WPA_WPA2_PSK) sendAT("AT+CWSAP=\"" + SSID_2 + "\",\"" + PASSWORD_2 + "\",1,4", 1000) } // 設定伺服器 sendAT("AT+CIPMUX=1") sendAT("AT+CIPSERVER=1,80") // 顯示IP (在AP模式預設為192.168.4.1) sendAT("AT+CIFSR") // 顯示打勾圖案, 伺服器完成開啟 basic.showIcon(IconNames.Yes) // 處理HTTP請求 while (true) { // 儲存最長200字的序列資料, 以免loss掉 serial_str += serial.readString() if (serial_str.length > 200) { serial_str = serial_str.substr(serial_str.length - 200) } if (serial_str.includes("+IPD") && serial_str.includes("HTTP")) { // 有連線請求 let client_ID: string = serial_str.substr(serial_str.indexOf("IPD") + 4, 1) let GET_pos: number = serial_str.indexOf("GET") let HTTP_pos: number = serial_str.indexOf("HTTP") let GET_command: string = serial_str.substr(GET_pos + 5, (HTTP_pos - 1) - (GET_pos + 5)) let GET_success: boolean = false // 判斷GET指令 switch (GET_command) { case "": // request 192.168.x.x/ GET_success = true break case "LED": // request 192.168.x.x/LED GET_success = true LED_status = 1 - LED_status pins.digitalWritePin(LED_pin, LED_status) break } // 產生HTML並傳給使用者 let HTML_str: string = getHTML(GET_success) sendAT("AT+CIPSEND=" + client_ID + "," + (HTML_str.length + 2)) sendAT(HTML_str, 1000) // 關閉連線 sendAT("AT+CIPCLOSE=" + client_ID) serial_str = "" } } // 寫入AT指令並加上CR+LF function sendAT(command: string, waitTime: number = 100) { serial.writeString(command + "\u000D\u000A") basic.pause(waitTime) } // 產生客戶端HTML function getHTML(normal: boolean): string { let LED_statusString: string = "" let LED_buttonString: string = "" let web_title: string = "ESP8266 (ESP-01) Wifi on BBC micro:bit" let html: string = "" html += "HTTP/1.1 200 OK\r\n" html += "Content-Type: text/html\r\n" html += "Connection: close\r\n\r\n" html += "<!DOCTYPE html>" html += "<html>" html += "<head>" html += "<link rel=\"icon\" href=\"data:,\">" html += "<title>" + web_title + "</title>" html += "<meta name=\"viewport\" content=\"width=device-width, initial-scale=1\">" // mobile view html += "</head>" html += "<body>" html += "<div style=\"text-align:center\">" html += "<h1>" + web_title + "</h1>" html += "<br>" if (normal) { if (LED_status) { LED_statusString = "ON" LED_buttonString = "TURN IT OFF" } else { LED_statusString = "OFF" LED_buttonString = "TURN IT ON" } html += "<h3>LED STATUS: " + LED_statusString + "</h3>" html += "<br>" html += "<input type=\"button\" onClick=\"window.location.href=\'LED\'\" value=\"" + LED_buttonString + "\">" html += "<br>" } else { html += "<h3>ERROR: REQUEST NOT FOUND</h3>" } html += "<br>" html += "<input type=\"button\" onClick=\"window.location.href=\'/'\" value=\"Home\">" html += "</div>" html += "</body>" html += "</html>" return html } // 等待wifi連線用 function wait_for_response(str: string): boolean { let result: boolean = false let time: number = input.runningTime() while (true) { serial_str += serial.readString() if (serial_str.length > 200) { serial_str = serial_str.substr(serial_str.length - 200) } if (serial_str.includes(str)) { result = true break } if (input.runningTime() - time > 300000) break } return result }






網頁伺服器開啟後,使用者只要用手機連上名為ESP8266的熱點,然後在瀏覽器打開192.168.4.1就行了。micro:bit收到請求後,會把一個動態產生的HTML傳給使用者,顯示在手機上。

在這個簡單範例中,我們可以透過Wifi來遙控接在micro:bit上的一個LED燈。

若使用者想要增加其他功能或按鈕,只要修改判斷GET指令以及產生HTML的程式碼即可。



[micro:bit x Nexus:bit] 行人號誌燈




這篇的目的在用Nexus:bit製作一個簡單的行人號誌燈:


  1. 平時RGB LED亮著紅燈,並在螢幕顯示行人號誌燈標誌。
  2. 按下A鍵時,開始倒數15秒,RGB LED轉為綠燈,螢幕上顯示跑步的小人。
  3. 剩下7秒時,RGB LED變成黃燈,並轉而顯示剩餘秒數。
  4. 倒數完畢,回到紅燈和行人號誌燈標誌。
  5. 此外蜂鳴器也會響起類似真實世界行人號誌燈的聲音。





綠燈(剩15-8秒時)

黃燈(剩7-1秒時)

紅燈(倒數尚未開始或結束後)


在這裡的重點是如何控制好倒數的時間。顯示圖案、數字積木會有約400毫秒延遲,而在倒數剩15~8秒時會有輪替的圖案,因此這階段迴圈每跑一次要2秒,號誌燈聲響只響一次,但秒數要減兩次。我們也得用某種方式填補顯示圖案後尚需的600毫秒時間,可以用蜂鳴器的聲音延遲或單純的暫停積木來達成。

到了第二次迴圈,變成每1秒輪迴一次。我們同樣用蜂鳴器播放和暫停積木來湊到差不多1秒。最後就是確定RGB LED在每個階段會亮起正確的顏色,並在號誌整個倒數完畢後把螢幕畫面恢復到一開始的圖案。

程式如下:



點圖可放大










[micro:bit 社團教材] 瘋狂搖搖樂




瘋狂搖搖樂是一個借用micro:bit加速計功能來玩的挑戰小遊戲:玩家必須快速搖晃micro:bit,讓畫面的光點填滿。遊戲一共有五關,越後面的關越難(要搖得更大力、更快才能用一樣的速度填滿光點)。


* * *


基本上,我們要用一個變數「搖晃分數」來記錄使用者搖到幾分(滿分150)。要增加分數的方式,便取決於加速計衡量到的值(加速度感測值-強度)。

我們在「當啟動時」把加速度計的上限設為8G重力,但實際上在這個設定下,加速度計最多可測到13000mg(13G)左右。最低差不多是1000mg(1G),因為有地球重力嘛。因此我們把讀取到的值限制在1000~12000,並把它轉換為介於0到「加分上限」(一開始是27)之間的值。也就是說,如果搖到12G,搖晃分數一次可增加最多27。

但在下一行,搖晃分數也會不斷減5。因為如果沒有減分,使用者幾乎不用做什麼就能輕鬆搖到滿分。有了減分機制,玩家只要一停止搖晃micro:bit,分數就會慢慢減回0了!(再下面會避免分數真的減到低於0。)

如果分數加到超過150,代表成功過關,分數會被重設,加分上限也會減少3,好提高下次加分的難度。若第5關過了,就會進入無窮迴圈,代表遊戲結束,並顯示玩家過5關所費的總秒數。



點圖可放大






由於模擬器無法模擬這麼大的搖晃效果,因此就不放了。



[micro:bit Maker] 使用PixyCam模組打造色彩辨識自走車




PixyCam是2013年集資推出的一款色彩辨識相機模組,又稱CMUcam5。簡單來說,這個模組能夠辨識使用者指定的特定顏色,並能將鏡頭前出現的該顏色物體的位置、大小資料傳給它連接的開發板。







PixyCam支援多種通訊方式能和開發板溝通,如SPI、I2C、UART(序列埠)甚至最單純的類比信號。我們將透過I2C方式讓micro:bit接收PixyCam的物體辨識結果。

首先,你必須下載PixyCam的專用軟體PixyMon。(如果您使用的是第二代PixyCam,那麼得使用這個版本。)用mini USB線連接PixyCam背面左側的接頭並連到電腦,然後打開PixyMon。若程式有正確抓到攝影機,就會看到即時畫面。

按主畫面上方大按鈕最右邊的設定鈕,接著在設定畫面下面找Interface(介面),並選擇資料輸出方式為I2C。







你也能看到預設I2C位址是0x54(= 84)。

這時你可以回到主畫面,把要辨識的物體舉在攝影機前,然後選Action → Set signature x... 接著畫面會靜止,讓你用滑鼠把要辨識的顏色圈選起來。圈選好後,就能看到攝影機開始能辨識到該顏色的物體了。






另一個方式是壓住PixyCam上的白色按鈕不放,直到亮起白燈、然後依序亮起紅、橘、黃...燈。這些燈的顏色與辨識物體無關,而是代表第幾個辨識代碼:

  • 紅 = 1
  • 橘 = 2
  • 黃 = 3
  • 綠 = 4
  • 青 = 5
  • 藍 = 6
  • 紫 = 7

在你要的號碼放開手,這時相機會進入辨識學習模式。把你要辨識的物體舉到相機前,相機底下的RGB LED會亮起差不多的顏色,畫面上也會出現如下的格網。物體舉好位置後,再按一下白鈕,這顏色就會記錄在該號碼底下(如紅燈 = 辨識代碼1)。






這個按白鈕設定辨識顏色的方式,不需要接PixyMon也可以進行。等我們把相機接在小車上後,就可以用這個方式快速設定辨識顏色。

現在,我們要把PixyCam連到micro:bit與Nexus:bit擴充板。模組背面有兩排針腳(一代和二代相同):






故我們以杜邦線連接以下腳位:


  • 5V(pin 2)→ Nexus:bit後方的5V針腳
  • GND(pin 6)→ Nexus:bit後方的GND針腳
  • I2C SCL(pin 5)→ Nexus:bit前方側面的SCL針腳
  • I2C SDA(pin 9)→ Nexus:bit前方側面的SCL針腳


這裡我們把NexusBot小車上的超音波模組抽掉,好讓電線能穿過外殼。PixyCam則以橡皮擦和泡棉膠黏貼於車子正面。







PixyCam的資料輸出格式如下



Bytes    16-bit word    Description
----------------------------------------------------------------
0, 1     y              sync: 0xaa55=normal object, 0xaa56=color code object
2, 3     y              checksum (sum of all 16-bit words 2-6, that is, bytes 4-13)
4, 5     y              signature number
6, 7     y              x center of object
8, 9     y              y center of object
10, 11   y              width of object
12, 13   y              height of object


每次會傳一個16-bit的資料。首先是sync(同步碼),作用是分隔每一筆資料並代表資料從何處開始。在顏色辨識模式中,這個值是0xaa55(在micro:bit會讀到-21931)。不過,每筆資料之間也會多插入一筆0xaa55,所以只要連續讀到兩次-21931,就代表有資料可接收了。

程式撰寫如下:



點圖可放大






這樣只要能辨識的物體出現在相機前時,就能讀到該物體的中心點座標與長寬。PixyCam的解析度是320x200,故座標值會落在這個區間。

checksum可用來核對資料是否無誤。不過,不檢查也是無妨啦。





既然能知道物體的中間點及大小,我們就能判斷它是否偏移、以及是否靠近或拉遠。我們給NexusBot小車撰寫程式如下:



點圖可放大






由於車子只能在平面上移動,所以我們只需判斷物體的X座標及寬度。車子會依據物體的位置前進或後退、直走或轉彎。當然,根據你實際使用的物體大小,有可能要修改程式內的數據,才能讓車子在合理的距離靠近或避開物體。

另一個要注意的是,如果操作的環境改變(光源改變),有可能導致物體顏色產生變化、進而令PixyCam無法辨識。因此,最好確定你有在同一個環境下給PixyCam設定好要辨識的顏色(而且是與環境差異夠大、夠鮮明的顏色)。



[micro:bit 社團教材] 指北針




micro:bit本身擁有一個電子羅盤晶片,可以用來指出方位。我們在本篇就來利用這點製作一個簡單的指北針。






北方是0度,東方90度,南方180度,西方270度。角度最大到359度,然後再順時鐘就回到0度。

我們希望micro:bit的LED螢幕能顯是一個箭頭,大致指出目前北方的方向。而micro:bit能顯示的箭頭只有8個方向,也就是每45度一個方向。因此,我們判斷角度減去特定方位時的絕對值是否小於等於22(特定方位左右各22度,加起來就是將近45度範圍),是的話就認定目前指向該方位。

要注意的是,顯示的箭頭東/西方向必須跟偵測到的東/西方向相反,這樣它才能正確「回頭」指著北方。

由於micro:bit的電子羅盤用久了會因環境磁場影響而失去精準度,因此我們在「當啟動時」強迫使用者校正羅盤。校正羅盤時,螢幕上會顯示「TILT TO FILL SCREEN」(傾斜micro:bit來讓光點填滿螢幕);前後左右轉動micro:bit,直到每一個點都亮起為止。

校正羅盤時也請盡量遠離磁場,例如喇叭或磁鐵。



點圖可放大









在模擬器中,你可以轉動micro:bit上的機器人小頭來模擬羅盤方位。



[micro:bit 社團教材] 計算費氏數列




簡單來說,費氏數列(Successione di Fibonacci)是一個以下列方式延伸的數列:

第0項 = 0
第1項 = 1
第2項 = 第0項 + 第1項 = 1
第3項 = 第1項 + 第2項 = 2
第4項 = 第2項 + 第3項 = 3
第5項 = 第3項 + 第4項 = 5
第6項 = 第4項 + 第5項 = 8
第7項 = 第5項 + 第6項 = 11
......


而這個數列又稱為「黃金分割數列」,因為如果以數列每一項的值當邊長畫成正方形,就能拼湊出如下的圖案:







我們可以利用程式來幫我們計算費式數列的每一項:


  1. 首先,一開始指定變數「數字1」為0,「數字2」為1。(費式數列的頭兩項)
  2. 用變數「暫存」儲存「數字1」+「數字2」,也就是下一項的值。
  3. 接著我們要更新數字1與2,數字1的值會被數字2取代,接著數字2的值則被「暫存」取代。
  4. 重複以上流程。











如果你只希望程式替你算出某一項的值,而不是逐一列舉,可以把程式改成如下:






這會算出並顯示第21項(畢竟前面有第0和第1項)的值,也就是10946。



[micro:bit 社團教材] 尋寶遊戲(開文章前請關喇叭)




在micro:bit的廣播功能中,有一個功能能讀取收到的廣播信號的強度。也就是說,我們可以根據廣播強度來大致判斷發信號的其他micro:bit是遠是近。

積木「收的封包-訊號強度」會傳回介於-128到-42的值,-42為最大。這個積木只能在廣播事件積木(如「當收到廣播數字」)內使用,所以要用個變數儲存它。為了計算和理解方便起見,我們把-128到-42換算成0到100。

程式內有兩個「重複無限次」迴圈:其中一個會不斷送出數字0。其實送出幾都沒差別,反正我們只需要判斷信號強度,而不是信號內容。

於是我們可以用廣播強度來控制micro:bit的聲光效果;首先,程式會根據廣播強度顯示長條圖,信號越強螢幕上的燈光就越滿。其次是連續發出嗶聲,而嗶聲的間隔來自下面的暫停積木。

暫停間隔會計算 (120 - 廣播強度) x 10。我們已經將廣播強度換算成0~100,因此這會使暫停時間最短在20毫秒、最長1200毫秒。也就是說,當兩片micro:bit靠近彼此時,你不僅會看到燈光長條圖變高,嗶聲也會越來越急。






廣播尋寶是個適合拿來當團康遊戲的應用,但使用之前要設好廣播群組以及廣播強度(發射訊號的強度),才不會相互干擾或難以偵測訊號變化。一般來說,室內可能設定強度2~3就夠了。不過話說回來,強度設得比較強時,訊號的變化也會更為明顯。

雖然廣播尋寶的兩片micro:bit使用的程式是同一個,但當作寶物的那片不能有聲音。另一片可以裝在有蜂鳴器的擴充板上,然後讓小朋友拿著去找寶物。




[micro:bit 社團教材] 廣播剪刀石頭布







本篇是稍微進階的社團題材,也能當成活動遊戲。

剪刀石頭布是個雙人遊戲,我們可以用micro:bit的廣播功能來實現。問題就在於,要怎麼知道雙方都有出拳呢?

我們用數字0、1、2代表剪刀、石頭、布。在一開始時會建立兩個變數:「我的數字」(我出的拳)和「收到的數字」(對方出的拳)。這兩個數字剛開始被設為-1,表示雙方都還沒有出拳。

當某方使用者搖晃micro:bit時,我的數字會被隨機指定一個0到2的數字(自己出拳),並把這數字傳給對方。如果對方也有出拳,那麼收到的數字就會存入「收到的數字」。

「重複無限次」迴圈會判斷雙方是否都出了拳;因此如果只有一方搖晃micro:bit,雙方的micro:bit都不會有動靜。確定都出了拳後,就能判斷誰贏了,並在螢幕上顯示你出的拳。贏的人會顯示笑臉,輸了是哭臉,平手就是無聊的臉。

由於雙方都出拳後,程式就會卡在一個無限迴圈裡並顯示結果,所以想重玩的話就要按重設鈕了。



點圖可放大






[micro:bit 社團教材] 接水果




接水果是個簡單的micro:bit小遊戲,運用了MakeCode編輯器內建的「遊戲」功能,也就是藉由控制「角色」光點的方式來進行。

遊戲裡只有兩個角色:「主角」和「水果」。遊戲目的是主角要試著接住水果,按A或B鍵可左右移動。當「水果」碰到「主角」時會得1分,反之若水果在沒接住的狀況下落地,就會回到螢幕頂端重新落下。

這裡要先解釋一下角色的方向:


  • 朝上 → 0度
  • 朝右 → 90度
  • 朝下 → 180度
  • 朝左 → 270度或-90度


其實也可以設像是45度、135度。當我們要角色前進1格時,它就會朝它目前設定的方向走。

程式流程如下:



  1. 在「當啟動時」設定主角和水果的角色變數,設定水果的方向為朝下,並設定遊戲倒數30秒(30000毫秒)後結束。
  2. 按下A或B鈕時,會先調整主角的方向為往左或往右,並往該方向走一格。(別擔心,主角走到牆邊就沒辦法再走了。)
  3. 在「重複無限次」迴圈中,如果水果已經落地,表示主角漏接。這時就把水果角色挪到螢幕頂端。
  4. 如果水果還沒落到地面,就繼續前進1格。但若前進1格後跟主角重疊,代表主角接到了。這時也是重設水果位置,但會加1分。
  5. 遊戲進行30秒後會自動結束,並顯示玩家的分數(接到幾次水果)。











由於模擬器沒有重設鍵,因此若遊戲結束,請重新載入網頁。



[micro:bit x Nexus:bit] 雷射打靶機





本篇使用Nexus:bit、迷你伺服馬達及光敏電阻模組來製作簡易的雷射打靶機(或者用強力手電筒也可以)。

我們使用的光敏電阻模組如下圖;類似型號也可以用,但接線腳位與讀數有可能略有不同。




伺服馬達以橡皮筋綁在擴充板側面。
馬達線連接擴充板的P12腳位:
橘線(信號)→ S
紅線(電源)→ +
褐線(接地)→ -
Nexus:bit詳細規格與使用請參閱協會的使用手冊
請先確定伺服馬達轉到90度時,支架的安裝位置會使吸管與地面垂直。

光敏電阻模組綁或黏在吸管末端,光敏電阻要指著前方。

光敏電阻的三條線連接到Nexus:bit擴充板:
S(類比信號)→ P1腳位
+(電源)→ 3V
-(接地)→G





這個光敏電阻模組在受到更亮的光線照射時,傳回的類比數字會變小,反之越暗數字越大。就我們的實驗,強光會使模組的類比讀數降到70左右以下,因此我們選擇70為觸發門檻。

接下來,我們只要判定光敏電阻模組讀到的值是否小於等於70,是的話代表使用者用強光照到光敏電阻,於是靶會「倒下」一秒鐘再起來,並且讓得分加1。程式開頭也設下30秒遊戲時間限制,看看你能在這段時間擊中靶多少次。

程式如下:









如果你所在環境或使用的照射裝置有不同的亮度,你也許得自行調整門檻值。你可以用以下程式直接讀取腳位P1的類比值: