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 import I2C, Pin

i2c = I2C(1)
oled = ssd1306.SSD1306_I2C(128, 64, i2c)

img = [ 0x20, 0x10, 0xFF, 0x55, 0x55, 0x55, 0xF7, 0x00, 
0x52, 0x56, 0x5A, 0xF3, 0x5A, 0x56, 0x12, 0x00, 
0x00, 0x20, 0x28, 0x2A, 0x2A, 0x2A, 0xAA, 0xFE, 
0x2A, 0x2A, 0x29, 0x28, 0x28, 0x20, 0x00, 0x00 ]

buffer = bytearray(img)

fb = framebuf.FrameBuffer(buffer, 16, 16, framebuf.MONO_VLSB)

oled.fill(0)
oled.blit(fb, 30, 20)
oled.show()

img = [ ...一直到 ] 那4行其實是一行, 請自行修改一下!
這個程式會印出一個中文字,
中文字其實也是一個圖型, 所以如果img list裡的資料是描述一張圖, 那麼就會顯示出一個圖型。

好了, 先談到這裡, 是不是很簡單呢?
下次來談談I2C界面的一些感測器吧!
畢竟有太多的感測器都是I2C界面的, 學起來吧! 會很常用到的。

留言

這個網誌中的熱門文章

D-BUS學習筆記

關於藍牙裝置找尋(inquiry, scan)兩三事

Cisco Switch學習筆記: EtherChannel