CircuitPythonのAPI

サンプルは動きましたが、いじって遊ぶにはAPIがわらかないことにはどうにもなりません。Circuit Playground Express上のCircuitPythonのAPIを調べてみました。

どうやってたどり着いたかよくわからない(汗)のですが、メモしておきます。

CircutPythonを試してみました

最近始めたTwitterで見かけたCircutPythonというキーワードを調べていくと、その正体はどうやら USBマスストレージ+MicroPython であることがわかりました。PythonのスクリプトをUSBマスストレージに見えているハードウェアデバイスに放り込んでやると、そのまま実行できるというお手軽この上ない環境のようです。エディタとしてGeanyを使えば、更にお手軽になる予感がします。

今回は、ハードウェアとしてはadafruitのCircuit Playgound Expressを購入してみました。

早速購入したCircuit Playgound ExpressをUSBでPCに接続すると、デモ動作をします。

ブザー音を出しながら10個のフルカラーLEDが順に点灯、LinuxMint上で

とすると、シリアルコンソールにCapsenseセンサ、スライドスイッチ、明るさセンサ、加速度センサ、温度センサの各状態を出力しているのが見えます。プッシュスイッチを押すとその状態も出力されます。スライドスイッチを左にスライドすると出力が変わるとともにブザー音がなくなります。

この状態ではCircuit Pythonは使えないので、CircuitPythonをインストールします。

まず、Circuit Playgound Express用のCircuitPythonをguthubからダウンロードします。現時点では CircuitPython 3.1.2が最新のようです。ディレクトリの中からCircuit Playground Express用のadafruit-circuitpython-circuitplayground_express-3.1.2.uf2をダウンロードします。ダウンロードできたら、これをインストールします。

Circuit Playgound Expressの中央のリセットスイッチを押すと、すべてのフルカラーLEDが一瞬赤になった後、緑になり、USBマスストレージ(ボリューム名CPLAYBOOT)として認識されます。このモードがブートローダモードと呼ぶようです。(なお、Circuit Playgound Expressの場合は、購入直後はリセットスイッチ1回でブートローダモードに入れますが、通常はリセットスイッチ2回連打する必要があるようで、そのタイミングが結構難しいようです。公式サイトでは何度が繰り返してやってみろ、と書いてあります。)

マスストレージとして認識されているCPLAYBOOTに先ほどダウンロードしたadafruit-circuitpython-circuitplayground_express-3.1.2.uf2をドラッグ&ドロップで書き込むと、USBコネクタ脇の小さな赤いLEDが高速で点滅した後、フルカラーLEDが一つだけ一瞬白色で点灯、その後、一旦CPLAYBOOTというボリューム名のマスストレージは閉じて、今度はCIRCUITPYというボリューム名のマスストレージが開きます。これがCircuitPythonとして扱われるドライブのようです。

公式サイトでは、Windows/MacOS/Linux用にMu Editorというのをインストールするよう勧めていますので、試してみます。

公式サイトのままだと、Setuptoolsがないというエラーが出てしまいますので、先に python3-setuptools をインストールしておきます。また、上記手順のあと、コマンドラインから

でmu-editorを起動できるような記述がありますが、一旦再起動(たぶん、ログアウトして再ログインでOK)しないと起動しませんでした。

起動すると、モードの選択が出てきます。

ここでは、一番上の「Adafruit CircuitPython」を選択して、OKをクリックします。
クリックするとコード編集画面に変わります。

公式ページからサンプルコードをコピペします。

これをCIRCUITPYの下にcode.pyという名前で保存すると、LEDが点滅するはずです・・・・・が、点滅しません。別のエディタで見てみると、ファイル自体は存在しているようです。試しに、リセットしてみると・・・・現れたドライブにはファイル名は存在するものの、ファイル自体は空っぽになっていました。何度やっても同じです。
試しに、USBケーブルを抜いて電源を再投入してみると、以降は期待した動作をするようになりました。sleepのパラメータを変えて保存すると直ちに、点滅周期が変わります。

参考:
adafruitのCircuitPythonのページ

Python2.7のプログラムをexe化する

次に、Python2.7で作ったプログラムを配布用にexe化してみます。
まず、仮想環境を作ります。

次に、py2exeをインストールします。試しにpipでやってみると、

ということで、pipでインストールできるpy2exeはpython3.3以降が必要、ということでエラーになります。ですので、sourceforgeから2.7用のインストーラをダウンロードしてきて実行します。インストーラはexe形式のGUIになっていて、デフォルトでは大元のsite-packagesの下にインストールされるようです。

exeに変換するにはセットアップスクリプトが必要なようですので、まずは以下の内容で作成しました。

今回は、メインのスクリプト(処理が始まるところ)は main.py なので、main.py を指定。bundle_filesに1を指定すると、生成したexeファイルにランタイムdllを含めてくれるので、配布が楽になります。(代わりにサイズが大きくなります)

自作のログ解析ツールをLOGというサブディレクトリにソースコードを一式置いてexe化してみました。

それほど時間がかからずに処理が終わり、buildとdistというサブディレクトリができて、distの下にmain.exe という実行ファイルが作成されていました。今回の場合はサイズは6MBほど、できた実行ファイルを実行してみると、特に問題なく動作しました。

ということで、意外にあっさりexe化に成功しました。

Windows10にPython環境を構築

訳あって、Windows10(たまたま32bit版)上でPythonの環境を構築しています。
で、Python2.7系とPython3系を同時に使いたいのと、Pythonの仮想環境を利用したい(作ったスクリプトを他人に使わせるには必要なパッケージが明確になってないといけない)ので、いろいろ調べながらやってます。

1.Pythonのインストール

まず、Python3系をインストーラを使ってインストールします。インストール時には「Add Python to environment variables」のチェックは外しておきます。py.exeに起動するPythonを選ばせるためみたいです。

次に、Python2系をやはりインストーラを使ってインストールします。インストール時には「Register Extensions」を外します。

インストールできたかどうかは

としてそれぞれPython2系、Python3系が起動できているか確認します。

2.virtualenvのインストール

Python2系用の仮想環境を作成するvirtualenvをインストールします。

デフォルトの文字コードがasciiだと失敗するようなので、デフォルトの文字コードを変更します。C:\Python27\Lib\site-packages の下に、sitecustomize.py という名前で以下のファイルを作成します。

作成したら、反映されていることを確認します。

次に、pipをバージョンアップします。

次に、virtualenvをインストールします

3.virtualenvを使ってみる

早速Python2.7の仮想環境を作ってみます。

ということで、エラーになってしまいます。で、エラーの原因はまた「UnicodeDecodeError」です。
原因は、どっかにあるvirtualenv.pyの中で文字コードがascii決め打ちになっているsite.pyを仮想環境の中に展開して、それを使ってしまうために起きているように見えます。
いろいろやってみると、virtualenvを再実行しても一旦ディレクトリを消したりはしないようですので、これを逆手にとって、一度実行してエラーになってから、sitecustomize.py をコピーしてやるととりあえず最後まで処理が進むようです。
具体的には、上記の例の場合、エラーになってから、sitecustomize.py をコピーしてきてから再度 virtualenv を起動します。(注:そんなことをしなくてもいい方法がありました・・・後のほうに書いてあります

ということで、旨くいきました。仮想環境への移行も

でうまくいくようです。
この上で、scriptsフォルダの下にあるactivate.batを動かして仮想環境に移行後、python2用に作成したスクリプトを動かしてみましたが、無事に動作しました。

直後に追記)
こんな回りくどいことをしなくても、–system-site-packages と付ければOKのようです。
(下記1行目がその例です)

4.venvを使ってみる

Python3系用の仮想環境のvenvを使ってみます。こちらはpython3系には標準で入っているので簡単です。使い方はvirtualenvとほぼ同じ。

でPython3系が動くことが確認できました。

esp8266用の環境を構築する(続き)

ESP8266用の環境構築の続きです。

7.MicroPythonをビルドしてみる

ExampleはMakefileが複雑すぎる、ということでESP8266用のMicroPythonをビルドしてみました。

1)ソースコードのダウンロード

gitでダウンロードしてきます。

2)ビルドしてみる

makeしてみます。

ということで、ヘッダファイルが見つからないようで、エラーになってしまいました。

3)原因調査とMakefileの修正

このファイルはSDKの中に含まれているようです。

~/esp-open-sdk ディレクトリの下では、SDKのインストール時に sdk から esp_iot_sdk_v0.9.5 へのシンボリックリンクが張られているので、Makefileの冒頭にあるESP_SDKの定義を以下のとおり修正します。(コメントアウトしたのが修正前の内容)

4)ビルドの続き

ビルドの続きを行います。

無事にビルドができました。

8.esptoolの準備

ESP8266のROM書き換えのためのツールである esptool も ~/esp-open-sdk/esptool の下に準備されます。

ESP8266との接続の方法はこのディレクトリ内の README.md に記述されています。

ということで、ESP8266とUSB-UARTモジュールの間を以下の結線をします。

  • CH-PDをRTSに接続
  • GPIO0をDTRに接続
  • GPIO15をGNDへプルダウン
  • GPIO2を3.3Vへプルアップ

この接続をしておけばesptoolが勝手にESP8266をブートローダモードに移行させてくれるようです。
<esptoolsの参考情報>
https://testpypi.python.org/pypi/esptool/0.1.0

 9.Hack a Dayで発見した記事

Hack a DayでESP8266に書き込む方法が載ってました。

How to Directly Program an Inexpensive ESP8266 WiFi Module

MicroPythonをビルドしてみた

MicroPythonをUbuntu上でビルドしてみました。

まあ、特に難しいところはなくビルドできちゃいました。

1.ソースを持ってきます

なんのことはなく、gitコマンドで持ってきます。

2.ビルドします

unixディレクトリに移動して、makeするだけです。

一部ヘッダがないと怒られてしまいました。調べてみると、libff-devパッケージに含まれるヘッダファイルのようです。

パッケージを追加して続けます。

気を取り直してmakeするとあっさり完了しました。

3.試しに動かしてみる

ドキュメント通りに動かしてみます。

quit()では終了できず、Ctrl-Dで終了させます。

4.テストにかけてみる

これもドキュメント通りに。

あっさり動きました。

USB LCDモジュールの製作

PIC18F14K50を使ってUSBで接続・制御するグラフィックLCDモジュールを作ってみました。

OLYMPUS DIGITAL CAMERA

LCDモジュールは手持ちの秋月の128×64のグラフィック液晶です。

OLYMPUS DIGITAL CAMERA

PIC18F14K50では端子が不足するので、74HC273(Dラッチ)を使って制御信号をラッチしてからLCDモジュールのデータ線に信号を与えています。

OLYMPUS DIGITAL CAMERA

この74HC273はパーツ箱に眠っていたもので、デートコードは8820でした。つまり1988年の第20週ですから25年以上前の1988年5月下旬頃に製造されたものということになります。無事に動くか少し不安ではありましたが・・・。

OLYMPUS DIGITAL CAMERA

裏側はこんな感じでぐちゃぐちゃになってしまいました。本当はLCDは180度回した形で取り付けたかったのですが、このLCD、図面の右側から端子が振ってあって、思いっきり間違えてしまいました。それで急遽LCDの方を回して、コネクタをもう一つつける形にしてしまいました。

ファームウェアは例によって /dev/ttyACM0 としてUSBシリアルとして認識されるようになっていて、液晶モジュールへの制御信号とデータの繰り返しで垂れ流すとそのままLCDモジュールをPICが制御するようになっています。PC側はPythonで記述してあって、一旦GDライブラリを使ってビットマップ上にTrueType(のビットマップフォント)を展開した後、LCD用のコマンド列を生成するようになっています。LCDにはnaga10フォントで半角24文字×6行の表示ができるようになっています。

TwitterのストリーミングAPIを試してみた

Twitterからリアルタイムに情報を得るStreaming APIを試してみました。

として、パッケージ管理ツール pip をインストールした後、tweepy をアップグレードしました。その後、キーワードを含む tweet を入手するスクリプトをいろんなところを参考にしながらなんとか作りました。

15~27行目がデータ受信時の処理で、データを分析してユーザー名やscreeen_name、tweetの内容などを表示します。29行目からが認証で、34行目でstreaming apiを呼び出しています。
39行目でフィルタの内容を設定していて、ここでは日本語のTweetで、「AKB,HKT,NMB」を含むものをキーワードとしています。キーワードは日本語のようなスペース区切りではない言語では正常に動作しないようです。

同じ処理は、on_data ではなく、 on_statusを使うとJSONの解析もTweepy側でやってくれるようで、on_status版も上げておきます。

取得できるデータは、あるtweetを参考に分析してみたところ、

というような感じで、ユーザー名などは入れ子になったデータ構造になっていますので、on_data版ではソースの20行目のように一旦’user’データを取り出しています。

 

環境情報をRaspberry PiでTweetしてみる

いろいろネタが揃ってきたので、 Raspberry Piで環境情報をつぶやかせてみることにしました。

まず、環境を取得するハードウェアは、以前作った気圧計・温湿度計を使います。LCDの表示がついていますが、とりあえずはそのままにしておきます。Arduinoベースのこの気圧計・温湿度計は、5秒ごとに気圧、温度、湿度を測定し、9600bpsでUSBシリアルに送信してきます。

“環境情報をRaspberry PiでTweetしてみる” の続きを読む