2017年11月04日

MicroPython + ST7735でのグラフィックス速度テスト

以前、以下の記事でMicroPythonからTFT LCDへの表示を行っています。

TFT LCD(ST7735R)をMicroPythonで動かしてみた: 楽しくやろう。

しかし、この記事で使っていたAdafruitのライブラリは矩形と水平線・垂直線しか描画できませんでしたので、他のライブラリを探してみたところ以下のライブラリが見つかりました。
(他にhosaka/micropython-st7735というのも見つかりましたが、こちらは描画プリミティブはAdafruit版とあまり変わらないようです)

MicroPython/ST7735.py at master ・ GuyCarver/MicroPython

このライブラリは円やテキスト表示も実装されています。
テキスト表示のフォントデータは、同じリポジトリにsysfont.py、seriffont.py、terminalfont.pyが置かれています。

ただ、このライブラリは作られた時期が2014/11/25と古く、ハードウェアもPyBoardを想定しているようです。そのため、現バージョンのmicropython-esp32で動作するように修正しました。
修正版は以下にアップロードしてあります。

boochow/MicroPython-ST7735

テストプログラムとして、Arduino用ST7735ライブラリに付属していたgraphicstestスケッチを移植してみました。
ただし三角形や角丸矩形は無いので、それぞれ線分の描画や矩形描画で代用しています。また、三角形の塗りつぶしはできないので、省略しました。

このテストプログラムも上記のリポジトリにアップロードしてあります。
動作の様子を載せておきます。

Arduinoよりも遅いですが、MicroPythonで描かれていることを考慮すればこんなものかもしれません。
ただ、少なくとも塗りつぶしはもっと高速にできるはずで、改善の余地がありそうです。
ST7735へのデータ送信は、矩形領域を設定した後、その領域に書き込むデータをSPIで連続して書き込む部分だけがネイティブコードで実行されています。
この連続書き込みの部分を高速化できればかなりの速度向上が見込めるのではないかと思います。

追記:
とりあえず、塗りつぶしの際にループで1ピクセルずつ送っていた処理を32ピクセルずつ処理するようにしてみました。
これだけでもfillrectとhline、vlineはかなりスピードアップしました。
文字表示とlineは、いずれも1ピクセルずつ描画するような実装になっており、現時点では高速化できていません。
ラベル:MicroPython
posted by boochow at 15:17| Comment(0) | ESP8266/ESP32 | このブログの読者になる | 更新情報をチェックする

2017年10月28日

fritzingのW5500 Ethernet Module用データを作ってみた

w5500module-fritzing.png

ブレッドボードでのパーツ接続図を描くツールにFritzingを使っていますが、このツールは新しいパーツを自分で追加することができます。
先日使ったW5500イーサネットモジュールのパーツデータを作ってみました。

作成方法の解説は、下記のページが分かりやすかったのでお勧めです。

Fritzing カスタムパーツの作り方 – jumbleat

Make Your Own Fritzing Parts - learn.sparkfun.com

基本的には、(1)ブレッドボード用の図(2)回路図(3)プリント基板用パターン の3つの図をSVG形式で作成し、かつ配線のポイントとなるピンやランドなどのオブジェクトの名前を決まったルールで付与します。
そして、これらのファイルをFritzingのパーツエディタに読み込み、各図のオブジェクトを相互に関連付けるXMLファイルを生成します。
ゼロからやると面倒そうですが、上記の解説はIC用の既存データを修正して作成する方法が紹介されており、その方法ならそれほど面倒ではありません。

これを使って先日の記事の接続図を作り直したものがこちらです。

Before:
stm32-w5500.png

After:
stm32-w5500-2.png


NUCLEOボードのグラフィックスの凝り様に比べると、非常にショボいグラフィックですが、データは一応以下に置いてあります。

boochow/W5500_fritzing_data
posted by boochow at 11:56| Comment(0) | 日記 | このブログの読者になる | 更新情報をチェックする

2017年10月27日

Amazon Web Servicesを(今更)試してみた

aws-ec2.png

AWS IoTなるものに興味を持ったので、AWSのアカウントを取ってみました。
AWS IoTの前にまずはIaaSであるEC2のお勉強です。
教科書は、こちらを使いました。執筆陣には先頃KDDIに買収されたソラコムの玉川さんも入っています。

Amazon Web Services 基礎からのネットワーク&サーバー構築 改訂版|日経BPブックナビ【公式サイト】
awsbook.jpg


この本はEC2のインスタンス2つ(WebサーバとDBサーバ)を立て、WordPressのサイトを作るチュートリアルになっています。
Webサーバはインターネットに公開し、DBサーバはプライベートネットワークにおきます。
ただしDBサーバはソフトウェア更新等のため、NATゲートウェイを介してインターネットへ接続できるようにします。
aws-book2.jpg

この本のおかげで細かいことに躓くことなく、使い方を学ぶことができました。
デフォルトのユーザが「ec2-user」であることとか、ssh接続のためのキーペアをつくるところとか、本書のようなガイドがあればどうということは無いですが、アカウントを作っていきなり試行錯誤していたら余計な時間がかかっていたかもしれません。

また、HTTPプロトコルをtelnetで目視したり、WireSharkでパケットを観測したりというトピックも扱っており、AWSに限らずネットワーク技術の入門書としても、とても良いと思いました。

WordPressはこんな感じで無事立てることができましたが、実際に使うかというと、個人では料金面が課題になりそうです。
aws-wordpress.png

12ヶ月間は無料利用枠が利用できますが、内容はEC2が750h/月なので24時間×31日分で、本書のようにインスタンスを2つ使ったら超過するのではないかと思います。
また、本書で使われているNAT Gatewayは時間課金+転送量課金で無料枠はありません(ので、試し終わったら削除しないと課金されます)。
個人でサーバを立てるだけなら定額のVPSサーバを借りるほうが良さそうです。
posted by boochow at 23:48| Comment(0) | 日記 | このブログの読者になる | 更新情報をチェックする

2017年10月23日

Nucleo-F401RE + W5500モジュール + MicroPythonでインターネット接続

w5500-nucleo.jpg

先日、Arduino用のイーサネットシールドを無理やりNucleo-F401REボードに接続しましたが、この状態だとやはり危なっかしいので、より小型のモジュールを入手しました。
前回使用したW5100の兄弟チップのW5500を使用したモジュールです。
W5100はSPI以外に8bitバスでも制御可能でしたが、W5500はSPI専用です。
購入したモジュールはフリスクケース程度の大きさでした。
価格はAmazonマーケットプレイスで1000円程度でしたが、Aliexpressからだと$6〜$8くらいで買えるようです。
w5500.jpg


使い方はほぼW5100と同じですが、MicroPythonにはW5500用のドライバを組み込む必要があります。
W5100と違って、W5500はMicroPythonでサポートされていますので、コードを書き換える必要はありません。
現時点のバージョンのMicroPythonでは、makeのオプションで「MICROPY_PY_WIZNET5K=5500」というようにWIZnet5Kのチップ種別を指定できるようになっていますので、gitでcloneするところからmakeのやり方を以下に載せておきます。

git clone https://github.com/micropython/micropython.git
cd micropython/
git submodule update --init
cd ports/unix
make deplibs
make
cd ../stm32/
make BOARD=NUCLEO_F401RE CROSS_COMPILE=~/gcc-arm-none-eabi-5_4-2016q3/bin/arm-none-eabi- MICROPY_PY_WIZNET5K=5500
cp build-NUCLEO_F401RE/firmware.hex /mnt/hgfs/share/
#このあとST-Link Utilityでボードに書き込む


接続する端子も、SPIですので基本的には同じです。
購入したモジュールのピン配列(裏面)は下図のようになっていました。

w5500-pins.jpg


ちなみにですが、私の購入したモジュールはピンヘッダが下のように斜めになっていました・・・
実用上は問題ないですが、ちょっと気にはなりますね。

w5500module.jpg


Nucleo-F401REとの接続は以下のようになります(SPI2を使用する場合)。
リセットは自由に決められますが、あとは使用するSPIバスによって自動的に決まってしまいます。

W5500 Nucleo-F401RE
3.3V 3V3
MISO PB14(MISO)
MOSI PB15(MOSI)
SCS PB12(NSS)
SCLK PB13(CLK)
5V -
GND GND
RST PC8
INT -
NC -
表面から見た接続図
stm32-w5500-2.png

(W5500モジュールのfritzingデータはこちら

MicroPythonからの使い方は、W5100のときと全く同じです。
コードは完全に互換性があります。
例によってSTARWARSサイトに接続してみました。
w5500-starwars.png

STM32 + W5500の組み合わせは、Arduino + Ethernetシールドよりもパワフルで、サイズもコンパクトに納まり、有線で使用するにはなかなか良いのではないかと思います。
ラベル:MicroPython
posted by boochow at 23:18| Comment(0) | stm32 | このブログの読者になる | 更新情報をチェックする

2017年10月21日

MicroPythonでurequestsを使う

ESP32版のMicroPythonでは、urequestsモジュールが標準で組み込まれています(現時点では)。
これはWebサーバにリクエストを投げて、応答を得るためのライブラリで、PythonのrequestsモジュールのMicroPython版(機能はだいぶ削られていますが)です。

現時点では、GET、HEAD、PUT、POST、PATCH、DELETEの各HTTPリクエストが実装されています。
PATCHというHTTPメソッドがあるんですね。初めて知りました。
ただ、このモジュールのソースを見るとHTTPバージョン1.0でリクエストを投げるようになっているので、HTTP 1.1のメソッドであるPATCHを要求するとエラーになる可能性もあるように思います。

サーバから返された結果はResponseオブジェクトに格納されます。

このオブジェクトは、

 status_code HTTPステータスコード(正常なら200)
 reason HTTPステータスコードのReason(正常なら'OK')
 encoding 文字コード(ただし現状では'utf-8'固定の実装となっている)
 content 生の応答データ
 text contentをencodingに従ってテキストに変換したもの
 json() contentをjsonとして解釈したもの(ujsonモジュールを使用)
 
を得ることができます。

内部的には、HTTPヘッダを読み終えた時点でソケットオブジェクトがResponseオブジェクトに渡されます。
ソケットオブジェクトはrawプロパティにセットされ、contentが初めて参照されたときにそのソケットからデータを読んでオブジェクト内にキャッシュするようになっています。
ソケットをcloseするには、close()を呼びます。

何度か例題に取り上げた、現在の為替レートを得るWebサービスにアクセスするには、以下のようになります。



WiFiに接続する部分は上記には入っていませんが、それでも短いですね。

ただし、現時点ではこのコードはESP32/ESP8266のMicroPythonでないと動かないと思います。
urequestsは内部でsocket.readline()を使用していますが、CC3100やWIZnet5Kなど、上記以外のNICではreadline()が実装されていないからです。

そのため、WIZnet5Kに関してはTCP/IP実装はlwIPを使用し、WIZnet5Kは単なるイーサネットインタフェースとして使用するようなMicroPython側のドライバ実装が現在テスト中のようです。

stm32: Incorporate lwip stack and use Wiznet in MACRAW mode by dpgeorge ・ Pull Request #3379 ・ micropython/micropython

ただ、TCP/IPをメインCPUで処理するため、WIZnet5Kのソケット機能を使う場合よりも速度は低下するようです。
ラベル:MicroPython
posted by boochow at 18:28| Comment(0) | ESP8266/ESP32 | このブログの読者になる | 更新情報をチェックする
人気記事