2017年10月09日

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

f401re-ssd1306.jpg
最近、MicroPythonにだいぶ興味が高まっているのですが、先日動作だけ確認したNucleo-F401REにもMicroPythonが移植されていますので、試しにインストールしてみました。

ファームウェアは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が無いのが欠点ではあります。
ラベル:MicroPython
posted by boochow at 20:45| Comment(0) | stm32 | このブログの読者になる | 更新情報をチェックする
この記事へのコメント
コメントを書く
お名前:

メールアドレス:

ホームページアドレス:

コメント:

認証コード: [必須入力]


※画像の中の文字を半角で入力してください。
※ブログオーナーが承認したコメントのみ表示されます。
人気記事