玩 Excel + micro:bit (透過USB port讀取acceleration、light level、compass、temperature數據)

動機:可否在 Excel 動態圖表展示 micro:bit 的各項感測數據(acceleration、light level、compass、temperature)...

準備環境
1.Windows 10筆電
2.Microsoft Excel 2016
3.BBC micro:bit(需插USB數據線)

實作步驟
業經Google搜尋後找到 Yigal Edery ( https://techcommunity.microsoft.com/t5/Excel-Blog/Excel-and-Micro-Bit-Hacking-for-fun-and-creativity/ba-p/63603 )分享一則作法,並看了其 Data Flow,如下圖
圖摘自: https://techcommunity.microsoft.com/t5/Excel-Blog/Excel-and-Micro-Bit-Hacking-for-fun-and-creativity/ba-p/63603
發現這就是我要的效果!!
  • 先將 micro:bit 插上筆電,並查詢其COM port位置,如下圖

  • 並按下 [Download] 產生 .hex 檔案,再 傳送到 MICROBIT磁碟(N:)...micro:bit 會顯示 draw a circle 畫個圈圈會變成 smiley face...
basic.forever(() => {
serial.writeString("D:")
serial.writeNumber(input.acceleration(Dimension.Strength))
serial.writeString(",")
serial.writeNumber(input.lightLevel())
serial.writeString(",")
serial.writeNumber(input.compassHeading())
serial.writeString(",")
serial.writeNumber(input.temperature())
serial.writeLine("")
basic.pause(100)
})
view raw serial_write.py hosted with ❤ by GitHub





確認了接收數據正常...
再下載Yigal Edery提供的範例 Excel 檔案 ( https://techcommunity.microsoft.com/gxcuf89792/attachments/gxcuf89792/ExcelBlog/48.6/1/SensorVisualizer_BlogVersion.zip )
並改寫其 巨集VBA程式儲存格公式,如下:
  • 先開啟 Excel 中的 開發人員/巨集 修改 VBA 的程式碼,如下圖

  • 程式如下:
' Option Explicit
Dim StopReading As Boolean
Sub StartBtn_Click()
'
' StartBtn - Starts reading from the Micro:Bit into the grid
'
Dim COM_Byte As Byte
StopReading = False
Cells(1, 1) = "Reading..."
' Debug.Print "Reading..."
On Error GoTo ErrorHandler
Open "COM3:115200,N,8,1" For Random As #1 Len = 1 ' Open the com port(must be modified)
PrevRow = 0
Row = 0
While (StopReading = False)
EOL = False
Data$ = ""
While (Not EOL And Not StopReading)
Get #1, , COM_Byte
If COM_Byte = 13 Then
EOL = True
ElseIf (COM_Byte <> 10) And (COM_Byte <> 0) Then
Data$ = Data$ & Chr(COM_Byte)
End If
Wend
If Not StopReading And Left(Data$, 2) = "D:" Then
Row = (Row + 1) Mod 30
Cells(PrevRow + 2, 4) = "" ' Clear previous location indicator
Cells(Row + 2, 4) = "'==>>" ' Display new location indicator
Cells(Row + 2, 5) = "'" + Right(Data$, Len(Data$) - 2) ' Enter data into the grid as a string
PrevRow = Row
DoEvents
DoEvents ' Hack - Apparently, two DoEvents are required to get the charts to update live
End If
Wend
Cells(1, 1) = "Stopped!"
GoTo CloseFile
ErrorHandler:
Select Case Err.Number
Case 62 ' Nothing to read
Err.Clear
Resume Next
End Select
Cells(1, 1) = "Error :" + Err.Description
CloseFile:
Close #1
'
End Sub
Sub StopBtn_Click()
StopReading = True
End Sub


  • 有關 Excel 內容說明如下:
    • D欄:顯示目前讀取micro:bit數據的 raw data 在那一行
    • E欄:利用VBA讀取 USB COM port 的數據並去除前面的 "D:" 二個字元
    • F欄:利用公式 =FIND(",",En,1) 找出E欄字串的第一個comma(,逗號) 位置
    • G欄:利用公式 =FIND(",",En,Fn+1) 找出E欄字串的第二個comma(,逗號) 位置
    • H欄:利用公式 =FIND(",",En,Gn+1) 找出E欄字串的第三個comma(,逗號) 位置
    • I欄:流水編號
    • J欄:利用公式 =NUMBERVALUE(LEFT(En,Fn-1)) 取出E欄字串的 acceleration數據並轉換成 Number
    • K欄:利用公式 =NUMBERVALUE(MID(En,Fn+1,Gn-Fn)) 取出E欄字串的 light level數據並轉換成 Number
    • L欄:利用公式 =NUMBERVALUE(MID(En,Gn+1,Hn-Gn)) 取出E欄字串的 compass數據並轉換成 Number
    • M欄:利用公式 =NUMBERVALUE(RIGHT(En,LEN(En)-Hn)) 取出E欄字串的 temperature數據並轉換成 Number
    • 四個圖表類型:依數據表示方式,選擇折線圖、XY散佈圖、區域圖...等,並以顏色對應儲存格資料
    • 二個按鈕( Start、Stop )分別對應VBA的 StartBtn_Click()StopBtn_Click() 事件
  • 有關 VBA程式碼 編修環境,我習慣展開如下圖,並使用 偵錯工具(F8) 來逐行debug...

問題&解決
當我一切就序後,卻一直無法在 Excel 按下 [Start] 接收 micro:bit 的數據,且 Excel檔案會當掉,搜尋了Google很久也未獲解決方法,只好自己土法亂搞,因此,我刪除了所有的 COM port只剩下一個COM3,如下圖




就可以正常運作了...( 之前的 mbed Serial Port 是安裝micro:bit的官方驅動程式 https://os.mbed.com/media/downloads/drivers/mbedWinSerial_16466.exe 產生的,至於無法由VBA讀取的原因就有待查證了?!)

提供Excel分享連結:https://drive.google.com/file/d/0B_4eUrknq7N1RWpMUHB6d3hsYkk/view?usp=sharing

提供.hex分享連結:https://drive.google.com/file/d/0B_4eUrknq7N1M2NkR2VCSmxBaVE/view?usp=sharing

影片展示


後記:其實,也可以運用Google Apps Script 與 Spreadsheet 來做...蒐集了raw data數據後就可以做後續統計分析及應用了~~~


感謝
Yigal Edery, Principal Program Manager in the Excel Team, https://techcommunity.microsoft.com/t5/Excel-Blog/Excel-and-Micro-Bit-Hacking-for-fun-and-creativity/ba-p/63603

留言