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 | このブログの読者になる | 更新情報をチェックする

2017年10月08日

micro:bitのハードウェアのブロック図を描いてみた

microbit-block-diagram.png

micro:bitにはCPUが2つとセンサーとLEDが搭載されていますが、それぞれがどのようにつながっているのか一目で解る図が無かったので、作ってみました。(ちなみにこの図はdraw.ioで描いています。)

micro:bitの回路図はこちらに掲載されています。

bbcmicrobit/hardware: Hardware designs for the BBC micro:bit

ただ、これはちょっと見づらいので、以下に掲載されているリファレンスデザインの回路図を参考にしました。

microbit-foundation/microbit-reference-design: micro:bit Reference Design

メインのCPUはnRF51822のほうで、それに対してKL26Zはプログラマとして動作します。

nRF51822は5×5(内部的には3×9)のLED、I2C経由でセンサ2つに接続されており、KL26ZとUARTで通信できます。また、SPIが拡張コネクタに引き出されています。
拡張コネクタのピン配列は以下のページにあります。ただしP1, P2,...の番号はコネクタのピン番号で、nRF51822のポート番号ではありません。

Schematics

一方、KL26ZはUSBポートに対してmbedとして動作し、nRF51822をSWD(Serial Wire Debug)信号でプログラムします。KL26Zの信号線は拡張コネクタには接続されていません。
また、KL26ZはUARTでnRF51822と通信しますが、この通信はUSBポートのUSBシリアルインタフェースへそのまま受け渡されます。
詳細は以下のページに解説があります。

DAPLink and the USB Interface

micro:bitはターゲットCPUとプログラマCPUが同居しているという点ではArduino UNOに似ています。
また、プログラムの書き込み方法や、オンラインでプログラムをコンパイルできるという点はmbedの資産を活用しています。
Arduinoとmbedの良いとこ取りを狙った構成と言えそうです。
posted by boochow at 15:42| Comment(0) | micro:bit | このブログの読者になる | 更新情報をチェックする

micro:bitを動かしてみた

microbit.jpg

話題になっていたので買ってみたものの、放置して積ボードになる寸前だったmicro:bitです。
ESP32+MicroPythonが思ったより面白かったので、すっかり後回しになってしまっていました。

ですが、試食してみた結果、教育用としてはかなりよくできていると思っています。
日本語サイトもよくできています。
センスが良いですよね。
microbitorg.png


あと、開発ツールをちゃんと用意しているのがすごいです。
このサイトでプログラミングの勉強をするつもりは無いのですが、どのような教材なのかは興味があります。
子供向けのプログラミングですから、ハードル高いです。
分かりやすくて、楽しく、安定して動作することが必要です。

makecodemicrobitorg.png


ハードウェアは2000円ですが、価格の割には凝ったボードだなあというのが第一印象です。
以下の概要図(公式ページより。日本語訳は私がつけました)を見ても、教材として、柔軟性やコスト、使いやすさなど考え抜いたものだということが伝わってきます。
microbit-hardware.png


図にはありませんが、micro:bitはCPUを2つ積んでいます。

ひとつはNordic nRF51822で、Bluetoothにつながっています。もう一つはKinetis KL26Zで、USBにつながっています。
このKL26Zはmbed式のインタフェースになっており、USBに接続すると8MBのUSBストレージが現れます。
ここへプログラムをドラッグ&ドロップしてmicro:bitへ転送できるようになっています。
microbit-mbed.png

一方、nRF51822のほうはスマホとBluetoothで通信してプログラムを書き込むことができます。
そのためには専用のアプリおよびBluetoothのペアリングが必要になります。
microbit-pairing1.png

micro:bitのAボタンとBボタンを押したまま、リセットする(再起動するまでABボタンは押したまま)と、ペアリングモードになります。
ペアリングモードでLEDに表示されたパターンを、スマホアプリ側に入力します。
このパターンはいつも同じなので、おそらくmicro:bit側のMACアドレスなのでしょう。
microbit-pairing2.png

入力が完了すると、ペアリングが始まります。これはmicro:bit側で表示された数字をスマホアプリ側に入力することで行います。

パターンを正しく入力した後、micro:bitのAボタンを押すと、7桁(たぶん)の数字が順に表示されます。
これをスマホ側のアプリに入力するとペアリング完了です。
この操作はモタモタしているとタイムアウトになってしまいますので、少しハードルが高いです。


なお、USB経由でWindows PCに接続するとプラグ&プレイでドライバがインストールされますが、シリアルポートはドライバが見つからずにエラーになります。
win-driver-install.png

このデバイスドライバは以下からダウンロードすることができます。

Windows serial configuration - Handbook | Mbed

というわけでとりあえず動くようになりました。

まだ実際にプログラムは書いていませんが、JavaScript + Blockの環境はエミュレータが動いていますし、Pythonの環境も完成度が高いです。

題名未設定 - makecode.microbit.org

Micro:bit - Python editor

どちらもWebの上で動作し、操作も軽快です。
使い勝手だけならArduinoやmbedより上でしょう。
大したものだと思います。
posted by boochow at 00:34| Comment(0) | micro:bit | このブログの読者になる | 更新情報をチェックする

2017年10月07日

TFT LCD(ST7735R)をMicroPythonで動かしてみた

st7735r-micropython.jpg

ESP32+MicroPythonで、SPIでOLED表示ができたので、同じくSPI接続のTFT LCDも動かしてみました。
使用したLCDはこちらの記事で使用したもので、128×160ピクセル、コントローラはST7735系です。
MicroPythonでのドライバは、おなじみのAdafruitのものがありました。

adafruit/micropython-adafruit-rgb-display: MicroPython library for RGB pixel displays.

結線は基本的には前回使用したOLEDと同様に
LCD  ESP32
VLED 3V3
RST IO17
A0 IO16(DC)
SDA IO13(MOSI)
SCK IO14(CLK)
VCC 3V3
CS IO5
GND GND
と接続してみました。

esp32-st7735r.png


ソフトウェアですが、上記のAdafruitで公開されているファイルのうち、
rgb.py
st7735.py
の2つが必要です。

まずrgb.py、次にst7735.pyを転送もしくはREPLでコピペします。
やり方は以前と同じです。

使い方の例です。冒頭の写真の表示を出力します。
from machine import Pin, SPI
spi = SPI(1, baudrate=30000000, polarity=0, phase=0, sck=Pin(14), mosi=Pin(13), miso=Pin(12))
lcd = ST7735R(spi, dc=Pin(16), cs=Pin(18), rst=Pin(17))
lcd.fill(0)
for x in range(128):
for y in range(160):
lcd.pixel(x,y,color565(x*2, y*3//2, 255-x-y*3//4))

st7735.pyではST7735とST7735Rの二つのクラスが定義されていますが、私のLCDモジュールはST7735Rのほうで動作しました。
SPIのビットレートを早くしすぎるとディスプレイのほうが追いつかない(ドットが1つ飛ばしになる)ので、もしうまく動作しない場合はbaudrateの値を小さくしてみてください。

全部Micropythonで書かれているので、さすがに実行速度はあまり早くありません。
しかし、インタープリタで実行できる有難味は捨てがたいですね。
ラベル:MicroPython
posted by boochow at 19:36| Comment(0) | ESP8266/ESP32 | このブログの読者になる | 更新情報をチェックする

2017年10月05日

Micropython + SH1106 OLEDでの表示

sh1106-spi-esp32.jpg

前回表示させたOLEDは0.96インチの製品でしたが、実は1.3インチのOLEDモジュールも買ったまま放置していました。
AmazonマーケットプレイスでHiLetGoが販売していたものです。
こちらもSPIインタフェースなので、差し替えて動くかどうか試してみたところ、以下のように正常な表示はできませんでした。
sh1106-spi-esp32b.jpg

上記の製品ページの説明をよく見ると、
ドライバIC:SSH1106 or SSD1306

と記載されています。
製品には手がかりは書かれていないのですが、おそらくSSD1306のドライバで動かないからにはSSH1106(これも記載ミスで、正確には「SH1106」です)なのだろうと推測しました。

ネット上の情報をいろいろ見てみると、SSD1306とSH1106はかなり似ているものの、SH1106は内部的には132×64ピクセルの構成になっているようです。
さらに、データシートもダウンロードして眺めてみると、内部のメモリは下図のようになっており、データを転送するには「Page」「Column」の両方を指定する必要があることが分かりました。
sh1106.png

開始位置としてPageとColumnを指定し、データをどんどん転送していくとColumn値が勝手に増えていきますが、上限である0x83を超えてもPageは繰り上がりません。
従って、Column 0x83に到達したらPageを1増やし、Columnをリセットしてやる必要があります。
実際のディスプレイは横128ピクセルしかなく、メモリのColumn 2〜Column130が表示されますので、この範囲にフレームバッファを転送すれば良いことになります。

以上を踏まえて、Micropython用のSH1106ドライバをSSD1306のサブクラスとして実装したのが以下のコードです。
SSD1306との違いはフレームバッファを転送するところだけです。

使い方の例は以下のようになります。
ESP32-DevKitCとの結線は前回と同じです。
SSD1306-ESP32.png

>>> from machine import Pin, SPI
>>> spi = SPI(1, baudrate=8000000, polarity=0, phase=0, sck=Pin(14), mosi=Pin(13), miso=Pin(12))
>>> oled = SH1106_SPI(128, 64, spi, dc=Pin(16), res=Pin(17), cs=Pin(18))
>>> oled.line(0,0,128,64,1);oled.show()
>>> oled.line(128,0,0,64,1);oled.show()
>>> oled.text('SH1106',36,0);oled.show()
>>> oled.text('Micropython',24,56);oled.show()
>>>
ラベル:MicroPython
posted by boochow at 00:52| Comment(0) | ESP8266/ESP32 | このブログの読者になる | 更新情報をチェックする
人気記事