Nucleo F401REにMicroPythonをインストールしてみた

f401re-ssd1306.jpg

最近、MicroPythonにだいぶ興味が高まっているのですが、先日動作だけ確認したNucleo-F401REにもMicroPythonが移植されていますので、試しにインストールしてみました。(2018/12/13追記こちらもご参照ください)

ファームウェアはMicroPythonのダウンロードページからもダウンロードできますが、ファイル形式がdfuという形式で書き込み方がわかりませんでしたので、今回はソースからビルドしました。
ビルド手順はmicropython Wikiにも記載はありますが、あまり詳しく書かれていないので、フォーラムのこちらの記事を参考にしました。

How to build and run MicroPython on STM32F7-Disco board – MicroPython Forum

上記で解説されている手順では、ファームウェアの書き込みにWindows用のツール(STM32 ST-Link Utility)を使いますが、Linuxで書き込む場合には以下の記事が参考になりそうでした。

Running micropyton on STM32Nucleo-F4

ちなみにビルドに使った環境はESP32のときと同様、Ubuntu-16.04です。
手順を簡単にメモしておくとこんな感じです。

wget https://launchpad.net/gcc-arm-embedded/5.0/5-2016-q3-update/+download/gcc-arm-none-eabi-5_4-2016q3-20160926-linux.tar.bz2
tar xvfj gcc-arm-none-eabi-5_4-2016q3-20160926-linux.tar.bz2
sudo apt-get -y install lib32z1 lib32ncurses5
cd micropython/ports/stm32/
make BOARD=NUCLEO_F401RE CROSS_COMPILE=~/gcc-arm-none-eabi-5_4-2016q3/bin/arm-none-eabi-
cd build-NUCLEO_F401RE/
cp firmware.hex /mnt/hgfs/share/

最後のcpで指定している/mnt/hgfs/shareは私の環境でのWindows側との共有フォルダです。
適宜変更してWindows側へfirmware.hexを持ってきてください。

Windows側へ持ってきたファイルをST-LINKユーティリティでNucleoへ書き込みます。
ST-LINKユーティリティは以下からダウンロードできます。(メールアドレスと氏名の入力が必要です。)

STSW-LINK004 – STM32 ST-LINK utility – STMicroelectronics

MicroPythonが起動した後の操作は、uPyCraftが使えます。
ただ、残念ながらファイルのダウンロード機能が通信エラーでうまく働きませんでした。
ボード側のバッファのサイズ等、条件が違うのかもしれません。
C-eでコードを直接ペーストするぶんには問題ありません。

先日試したOLEDのSSD1306を接続してみました。
結線は以下の通りです。

OLED Nucleo-F401RE
GND  GND
VCC  3V3
D0   PB13(CLK)
D1   PB15(MOSI)
RES  PC5
DC   PC6
CS   PB12(NSS)
f401re-ssd1306.png

信号線はArduinoコネクタ(ピンソケット)ではなくMorphoコネクタ(ピンヘッダ)のほうに出ています。
ピン配置は以下のようになっています。

f401re-pins.png

Nucleo-F401REにはSPIが3つあり、SPI1はArduinoコネクタから接続できます。
しかし、SPI1はSCKを接続した時点でuPyCraftとの通信がうまくいかなくなってしまったので、SPI2を使っています。
SPI1のSCKはPA5ですが、ここにはLED2もつながっています。SPIで使うには何か設定が必要なのかもしれません。

SPI1~SPI3に使う信号線はハードウェアで決まっており、ピンの指定はできません。
信号とピンの関係はports/stm32/boards/NUCLEO_F401RE/mpconfigboard.hを見ると分かります。
今回はSPI2なので、以下の部分が必要な情報です。
なお、NSSはCSの別名らしいです。

#define MICROPY_HW_SPI2_NSS     (pin_B12)   //              pin 16 on CN10
#define MICROPY_HW_SPI2_SCK     (pin_B13)   //              pin 30 on CN10
#define MICROPY_HW_SPI2_MISO    (pin_B14)   //              pin 28 on CN10
#define MICROPY_HW_SPI2_MOSI    (pin_B15)   //              pin 26 on CN10

以下が使い方の例です。
SPI2を使用するので、SPIのIDには2を指定します。

from machine import SPI,Pin
spi = SPI(2, baudrate=20000000, polarity=0, phase=0)
oled = SSD1306_SPI(128, 64, spi, res=Pin('PC5'), dc=Pin('PC6'), cs=Pin('PB12'))
oled.text('hello',0,0,1);oled.show()

実行結果が本記事の最初の写真です。
最初のMicroPythonはSTM32F405をターゲットとしていた(Micro Python: Python for microcontrollers by Damien George — Kickstarter)だけあって、動作としては何の問題もありません。
ただ、ホビイストにとっては、NucleoボードはESP32と比較すると大きいのと、WiFiが無いのが欠点ではあります。

コメント