發表文章

目前顯示的是 2019的文章

曾解過的bug

圖片
只是做個紀念,那已經是三年前的事了, 國外廠商推的方案也是會有bug的! 這是個藍牙方案,主要是提供晶片,但相關的firmware開發工具,還有手機App都有提供。這只是個小問題,而且當時這個App還不是公開提供,算是特別去要才給的工程師版。有問題也是應該的啦!我猜想另一個原因是做OTA的話,大家都是使用SPI界面的Flash,沒有人用I2C EEPROM. 而正好當時我手上沒有Flash, 但EEPROM特別多。 所以就在大家前面先走了一步,一直卡關,才想到是不是那個iOS App是有問題的,也正好當時有在寫iOS App, 而且廠商是有提供原始程式的,這才找到了問題! 現在這個方案應該千錘百練沒什麼問題了!

test youtube video

圖片
SASS Node.js

MicroPython on Nucleo-F401RE, 6. I2C Sensor AM2320

圖片
一樣先來一張圖! 可以看到OLED顯示了温度和溼度, 而且是大字體! 硬體接線和前一篇貼文一樣, 只是多了一顆AM2320和4條短線。因為AM2320和OLED接線腳位排列順序不同, 只好多用4條短線來連接! 這個OLED接線腳位由左至右如下排列順序: Vcc, GND, SCL, SDA AM2320接腳順序則為: VCC, SDA, GND, SCL 程式部份, 其實都已經有人寫好了。 首先先去取得AM2320的驅動程式,  https://github.com/mcauser/micropython-am2320 用之前貼文教的方法, 將取得的am2320.py程式複製到開發板的/flash檔案目錄去。 接著為了顯示大字體, 可以到前面貼文提到的趙英傑先生寫的那本書的網站去取得大字體的程式bigSymbol.py。但因為MicroPython新的firmware有一些小修改, 所以我們也要自己修改一下bigSymbol.py, 不用擔心, 已經改好, 如下: https://github.com/poushen/iot_hand_on/blob/master/lesson_06/am2320.py 同樣, 取得後, 請複製到開發板/flash檔案系統去! 最後就可以寫程式了: import bigSymbol from machine import Pin, I2C from time import sleep import ssd1306, am2320 i2c = I2C(1) oled = ssd1306.SSD1306_I2C(128, 64, i2c) sensor = am2320.AM2320(i2c) dsp = bigSymbol.Symbol(oled) dsp.clear() dsp.temp(0, 18) dsp.humid(0, 38) while True: sensor.measure() # dsp.text('18.50c', 34, 18) # dsp.text('25.00%', 34, 38) dsp.text('{:.2f}c'.format(sensor.temper

MicroPython on Nucleo-F401RE, 5. I2C and OLED

圖片
先來一張圖吧! 圖中可以看到Nucleo-F401RE連接I2C界面的OLED, 只要4條線(Vcc, GND, SCL, SDA), 直接由F401RE板子上Arduino接腳(位置和Arduino Uno板子一模一樣), 左邊兩個腳位為Vcc和GND, 右上方兩個腳位為SCL, SDA(板子上都有標註)連接到OLED螢幕。 線接好, 再來就是寫程式了: 程式也放在GitHub  i2c.txt from machine import Pin, I2C import ssd1306 i2c = I2C(1) oled = ssd1306.SSD1306_I2C(128, 64, i2c) oled.text('No Hack,', 0, 0) oled.text('No Life!', 50, 30) oled.show() 是的, 就是這麼簡單! 這是趙英傑先生那本談 ESP8266 MicroPython書 上的範例, 我拿來修改成給F401RE的板子使用, 以下談談要做的兩個修改: 第1個差異 :在第3行的i2c = I2C(1)。 圖中的接線方式, 是硬體I2C的腳位, 在目前這個firmware來說, 就是編號1的I2C, 這樣寫這樣接線就可以了。另一個軟體I2C的用法也可以試試: i2c = I2C(scl='A5', sda='A4', freq=400000) 依文件說法, 好像任何一個腳位都可以用, 以這個例子來說, 我是用左下角的A4, A5腳位。 這表示只要稍為修改, 在ESP8266上執行的MicroPython程式就可以在F401RE開發板上執行! 第2個差異 :程式第2行import ssd1306, 這個ssd1306模組在ESP8266版本並不用特別處理, 應該是已經包在firmware裡面; 但是F401RE的版本並沒有包含ssd1306模組! 請自行下載: drivers/display/ssd1306.py 下載後請自已複製到板子上的/flash檔案系統去, 複製方法請參考之前貼文。 最後再來看一個例子: import ssd1306 import framebuf from machine impo

nRF52840 Dongle 的SDK example修改

圖片
最近買了nRF52840 Dongle (PCA10059) , 如下圖, 官方說法是體積小, 便宜的類隨身碟裝置, 可支援藍牙5等多種協定  (a small, low-cost USB dongle that supports Bluetooth 5, Bluetooth mesh, Thread, ZigBee, 802.15.4, ANT and 2.4 GHz proprietary protocols.) 我主要是用來開發BLE協定的應用使用, 特別是 Nordic nRF Connect for Desktop 這套由Nordic官方開發的程式, 以前常常在手機上使用, 可以查看附近BLE裝置的Advertising封包, 也可以連入BLE裝置, 查看GATT的服務和特徵值並且可以進行讀取或寫入等動作。 這樣功能的應用程式, 想要在桌上型電腦上使用, 想來就非其桌上電腦版莫属, 不過在電腦上使用必須搭配Nordic的開發板, 而nRF52840 Dongle就是一個最合適的選擇! 因為便宜又不佔空間, 找個USB插座, 插下就可以使用了。 但除了拿來當工具使用, 它其實也是一張迷你的開發板, 只是沒有附J-Link的功能而已, 沒有J-Link的壞處就是不能做即時的除錯, 沒有逐步執行的功能。程式寫完不知道對不對, 只能直接燒到板子上的Flash去執行, 再看看行為對不對。這其實和Arduino Uno的開發模式一樣, 其實也是用得很開心。 要開發程式, 官方給了nRF5 SDK, 下載回來解壓縮後, 得到一個目錄, 其下有許多子目錄: components, config, documentation, examples, external, ... 。其中examples目錄下有802_15_4, ant, ble_central, ble_peripheral, connectivity, crypto, dfu, dtm, iot, peripheral, ...等目錄, 可以說大約是以協定來區分, 例如要BLE的範例程式, 那就找ble開頭的那幾個子目錄就對了, 如果只要看週邊IO動作的範例程式, 打開peripheral目錄就是了。 從最簡單的閃爍LED的程式來看, peripheral/blinky目錄打開後,

MicroPython on Nucleo-F401RE, 4. my.py

之前說要分享的小程式my.py 也放在GitHub: my.py import os def cat(f): with open(f) as file: str = file.read() print(str) def rm(f): os.remove(f) def cd(directory): os.chdir(directory) def run(f): with open(f) as file: str = file.read() exec(str, globals()) def ls(prex=None): s = os.statvfs(os.getcwd()) print("current directory: {}, available size: {}KB".format(os.getcwd(), s[0] * s[4] / 1024)) print() for (name, type, inode, size) in sorted(os.ilistdir()): if prex == None or name.startswith(prex): if type == 0x8000: print(" - {:8d} \t {}".format(size, name)) else: print(" D {:8d} \t {}".format(size, name)) def ip(): import network wlan = network.WLAN(network.STA_IF) print('ip: {}'.format(wlan.ifconfig()[0])) def fileExists(path): file_size = 0 try: s = os.stat(path) if s[0] != 0x400

MicroPython on Nucleo-F401RE, 3. Hello World (write first python code)

圖片
上個貼文看過後, 我們應該已經可以用 C:\> rshell No MicroPython boards connected - use the connect command to add one C:\> connect serial COMxx 在Windows電腦上連到F401RE開發板上的MicroPython 然後下repl指令, 就進入REPL界面了, 在這裡就可以用python語言寫程式了. C:\> repl Entering REPL. Use Control-X to exit. > MicroPython v1.11-274-g06661890d on 2019-09-05; NUCLEO-F401RE with STM32F401xE Type "help()" for more information. >>> 因為pyboard和F401RE算是兄弟, 所以我們直接參考其使用指南 http://docs.micropython.org/en/latest/pyboard/quickref.html 首先試一下點亮LED, 這算是firmware開發的Hello World程式了. from pyb import LED led = LED ( 1 ) # 1=ld2 led . toggle () led . on () led . off () 就是這麼簡單, MicroPython在pyboard上弄了一個pyb模組, 板子上的一些硬體都很體貼的幫大家先整理好, 以LED來說, 就有這個相對應的LED類別(class), 因為這個板子上只有一個LED, 所以也就只能如上寫法建立一個LED(1)的物件出來, 然後就可以使用該物件的toggle, on, off等成員函數來工作了。 但其實我們知道LED一定是連接在MCU的某個GPIO腳位, 查一下電路圖, 發現是在D13, PA5(若SB42有連通)。 這樣, 就可以以直接操作GPIO腳位的方式來操作LED. from pyb import Pin p_out = Pin ( 'D13' , Pin . OU

MicroPython on Nucleo-F401RE, 2. How to transfer .py file from PC to the board

前一篇貼文提到pyboard接到PC的USB後, 在電腦上會出現一個硬碟, 傳送.py檔案到pyboard就是很容易的事情, 用拖的或下指令的, 只要把檔案放到這佪硬碟就好了。但對Nucleo-F401RE開發板來說, 就不是這樣的! HardyTek也有一篇貼文在討論這件事:  http://hardytek.com/writing-files-to-nucleo-pyb-flash/ , 他的建議是使用ampy這個由Adafruit提供的工具。我之前玩ESP8266 MicroPython時也是常用ampy的。這個工具簡單可用, 但有一些小問題, 在某些平台或USB-Serial轉卡晶片, 使用時會出現一些狀況, 例如一些時間差, 需要加入 -d 0.5的參數來解決。另外這個工具沒有shell或REPL的功能, 所以會是常常在兩個不同工具之間切換的工作情況, 又因為Serial port是獨佔的, 要使用ampy就必須先將REPL那邊的Serial port關掉! 也是很令人困擾! 這次我嘗試使用Windows平台上的ampy, 來傳送.py檔案給Nucleo-F401RE上的MicroPython: ampy -p COM10 ls /flash 可以看到板子上的檔案有那些 ampy -p COM10 get xx.py 可以看到板子上某個檔案的內容 ampy -p COM10 put xx.py 用來將檔案傳送至板子上檔案系統, 結果出現: Traceback (most recent call last):   File "c:\python27\lib\runpy.py", line 174, in _run_module_as_main     "__main__", fname, loader, pkg_name)   File "c:\python27\lib\runpy.py", line 72, in _run_code     exec code in run_globals   File "C:\Python27\Scripts\ampy.exe\__main__.py", line 9, in   File "c:

MicroPython on Nucleo-F401RE, 1. flash uPython image

圖片
前一陣子花了不少時間玩ESP8266(D1 Mini)上的MicroPython, 趙英傑先生的那本談ESP8266 MicroPython的書, 已經幫大家整理了很多觀念和用法, 省了不少時間! 用了就知道, 論開發速度, 入門容易度, MicroPython比起傳統的C開發環境, 都好上很多. 所以許多情境下, 這個方式真的可以做到"快快寫完, 快快去玩"的美妙境界! 使用ESP8266的好處是它本身的WiFi功能, 有連網能力, 用處多很多! 但其實Damien George最先推出的開發板是pyboard, 使用的是ST STM32F405RGT6這顆MCU。想當然, MicroPython對pyboard的支持度是最高的, 就讓我想去玩一下, 但查了一下, 官方賣價換算一張也要1000元台幣. https://store.micropython.org/pyb-features 還要加運費, 就更貴了! 副廠的有便宜一些, 也要台幣700. 剛好手上有一張ST Nucleo F401RE的開發板, 前幾年買來玩, 至少也是官方的板子, 作工和用料有一定水準. 想想pyboard用的MCU和這個板子的MCU根本就是兄弟, 想容性應該是差不到那去吧! 那就在這個開發板上安裝MicroPython看看吧! Hardytek這個網站針對如何燒錄MicroPython firmware到ST Nucleo-F401RE開發板, 提供很詳細的說明: http://hardytek.com/flashing-micropython-to-stm32-nucleo/ 簡單摘要一下: 1. MicroPython官方firmware下載網站, 是有提供Nucleo-F401RE開發板的firmware, 但是等一下, 為什麼檔案的副檔名是dfu? 有朋友在論壇 https://forum.micropython.org/viewtopic.php?t=3709 請教了這個問題, 好心的dhylands回覆說那是給pyboard用的, 因為pyboard的usb接到電腦後, 會出現一個硬碟, 只要把檔案拖進去就可以更新firmware了! 但Nucleo-F401RE不是這樣, 雖然也會出現一個硬碟, 但那是給st-link(mbe