circuitPython
microPythonをArduino Zero PROに導入してみる記事だったのですけれども、AdafruitからcircuitPythonとして新しくリリースがあっていろいろ変わっているので追っかけます。 最新はver 0.8.2
https://blog.adafruit.com/2017/01/09/welcome-to-the-adafruit-circuitpython-beta/
Adafruit CircuitPython 0.8.1 on 2017-01-12; Arduino Zero with samd21g18
>>>
正式リリースに先駆けて、ベータ公開するよ、APIとかがcircuitPythonで統一されていて、あとフルバージョン(パソコンのってことね)CPythonと互換があるよみたいな話。
いろいろ試してねみたいな感じかな?
クラスがいろいろ変わってる。
microPythonで使ってたmachineクラスとかはなくなってます。
かわりにnativeioとかboardとか増えています。
Shared Librariesから参照出来る。あと全体的なリファレンス
circuitPython blink
import nativeio as io import board as pin import time led = io.DigitalInOut(pin.D13) led.switch_to_output() while True: led.value=1 time.sleep(0.2) led.value=0 time.sleep(0.5)
ドライブにmain.pyという名前でファイルを書き込むか、screenでターミナル接続してPythonコンソールに入力して動かします。
ドライブにPythonスクリプトを書き込んでおいて、ターミナルからインポートして使うということも出来ます。Pythonのちょい使いなんかにも便利そうです。
ところで今みたらドキュメントが親切になっていろいろサンプルコードが掲載されていました。
I2Cスキャナーとかもあって、でも動かなかったから直したのだけど。
>>> with io.I2C(SCL, SDA) as i2c: ... i2c.try_lock() ... i2c.scan() ... <I2C> [40]
なにやらいる…。何も繋いでいないのに、君はだれだ。
https://github.com/adafruit/circuitpython
ESP-WROOM-02にcircuitPython
ArduinoZeroProと同じく使い道もなく死蔵していたESP-WROOM-02に書き込んでみます。
お馴染みのESP TOOLをインストール
sudo pip install esptool
利用するファームウェアはhuzzahのものです。
書き込み方法は、USBシリアルアダプタでESPと接続、書き込みモードでリセットした後に
esptool.py --port=/dev/ttyUSB0 --baud 115200 write_flash --flash_size=32m 0 huzzah-0.8.2.bin
これでscreen /ttyUSB0 115200 としてREPLが利用できますが、いろいろエラーが出るので初期設定します。
import network
wlan = network.WLAN(network.STA_IF)
wlan.active(True)
wlan.scan()
wlan.isconnected()
wlan.connect('SSID', 'SSPWD')
wlan.config('mac')
wlan.ifconfig()
SSID、SSPWDはお使いのものを。
CTRL+Dでソフトリセットします、が、何をしてもエラーが出るときはハードウェア側でリセットしてください。
ESP版のcircuitPythonではArduinoZeroの様にドライブが見えるわけではないので、ファイルの書き込みにwebreplを使います。
git clone https://github.com/micropython/webrepl
とりあえずmain.pyがないと毎回エラーが出ているのでまずmain.pyを書き込みます。
内容はなんでもいいのですが中身がないといろいろアレなので
print("hello")
なんていうのをmain.pyとして保存して使うことにします。
まずwebreplを設定します。
ESP側。REPLにて。
import webrepl_setup
WebREPL daemon auto-start status: disabled
Would you like to (E)nable or (D)isable it running on boot?
(Empty line to quit)
> E
New password: password
Confirm password: password
Changes will be activated after reboot
Would you like to reboot now? (y/n)
passwordはかけなくても良いと思いますが一応かけておきます。
ギークな人たちの集まりに参加する方などは絶対かけておいた方が良いとおもいますが。
最後にyでリセットします。が、ここで動かなくなるかもしれません。
もし動かなくなったらハードリセット。
import webrepl
webrepl.start()
設定でauto-startするか聞かれているので自動起動してもおかしくなさそうなものですが、どうも起動していないっぽくて、なのでwebreplのデーモンを起動します。
次はホスト側。
webrepl/webrepl_cli.py main.py 192.168.1.21:main.py
わたしのESPは192.168.1.21でつながっているのでこの様な感じ。
実行するとパスワードを聞かれますので打ち込みます。
すぐ転送は終わります。リセットするとREPLにhelloって表示されます。
webreplがスタートしてる状態で、webrepl.htmlを開くとリモートでコンソールが使えます。
ファイルの転送もリセットも出来ますので。
init.pyかmain.pyの内容を
import webrepl
webrepl.start()
exit()
などとしてやって常にwebreplがスタートするようにしてやればリモートで快適に利用することができるかもしれません。こうなってくるとかなり利用価値が高まってきますね。
また、コンソールの下にファイル転送用のフォームがあって送信や受信が出来ます。
いろいろと便利そうです。
以下、microPythonの導入の際のドキュメント。
インストール方法などは同じなので使えなくはない。
Arduino.orgのボードArduino Zero PROを持て余して居たので microPythonを入れて試してみよう。
わたしのコンテンツでのほぼ共通事項として、ホストコンピュータとしてはRaspberry Piを利用しています。
その他の環境での利用については元となるAdafruitのコンテンツをご覧になってください。
Adafruitのドキュメントを見るとブートローダの書き込みにbossaが必要となっています。
OpenOCDでも行けそうですがここは素直にbossaを使うことにしてみます。
aptにもbossaがあるのですけども上手く動きません。
ソースからビルドします。
sudo apt-get install libreadline-dev
sudo apt-get install libwxgtk3.0-dev
git clone --branch arduino https://github.com/shumatech/BOSSA.git ./bossa
cd bossa
make
make bin/bossac -j4
1)できあがった/bin/bossacを好きなように。よしなにする。どうせこのファームウェアの書き込みにしか使わないだろうからパス参照して実行すればいいと思う。
2)makeのあとにエラーが出るかもしれない。けど気にせず次のコマンドを実行して、出来上がったbin/bossacが動けばOK。というかもうむしろいろいろやってみてbossacさえ出来て動けばOK!(なんてでたらめな
Adafruitのgitで公開されているファームウェアパッケージを入手。
adafruit-micropython-arduino_zero-1.8.5-20161020.bin
というのを入手しました。長いので名前を変えます。
mv adafruit-micropython-arduino_zero-1.8.5-20161020.bin firmware.bin
firmwareを書き込みます。
利用するのはNative Portの方。Programming Portではありません。
状態をわかりやすくするため、あらかじめArduino Zeroにblinkスケッチを書き込んでおくといいです。
Arduino Zeroのリセットボタンをダブルクリックすると書き込み待機モードになります。
その状態で
bossac -e -w -v -R -p /dev/ttyACM0 firmware.bin
上手く行けば
Write 185840 bytes to flash (2904 pages)
[==============================] 100% (2904/2904 pages)
done in 1.278 seconds
Verify 185840 bytes of flash with checksum.
Verify successful
done in 0.187 seconds
CPU reset.
この様なメッセージが出て、そしてドライブが挿入されたとダイアログが出るはずです。
microPythonはmbedのようにドライブとして見えて、Pythonスクリプトを直接書き込めるみたいです?
miniterm.py
などと実行すると
--- Available ports:
--- 1: /dev/ttyACM0 Arduino Zero
--- 2: /dev/ttyAMA0 ttyAMA0
ポートが選べます。
この場合1を選択してエンターを叩いてやると。
>>> みなれた奴が出てきました。
>>> print("hello world")
hello world
>>>
やばいっすね。
では、ドライブに見えているmain.pyをいじってみます。
注意点があります。
ここに while True: とかで無限ループするコードを書いた場合、あと明確にexit()などの終了を書いていない場合。
一度コードが動き始めるともうドライブが見えなくなります。 シリアルターミナルで接続してCTRL-Cを送信しない限りドライブはみえないので注意してください。
↑すぐにマウントされなくなるだけで少しまつとマウントするような・・?
では、Adafruitで出ていたLチカサンプル。
import machine import time led = machine.Pin('D13', machine.Pin.OUT) while True: led.high() time.sleep(0.5) led.low() time.sleep(0.5)
ただ、このままだと、最初に書いた注意点にモロハマりしているので直します。
import machine import time led = machine.Pin('D13', machine.Pin.OUT) for i in range(10): led.high() time.sleep(0.5) led.low() time.sleep(0.5) exit()
いいでしょ、Lチカなんて10回も光れば満足でしょ(ぉ
これをmain.pyに書き込んで、Arduino Zero(PRO)をリセットすると、10回ほどLEDがチカチカして、ドライブがマウントされます。
DigitalInputしてみましょう。
import machine as m import time as t led = m.Pin("D13", m.Pin.OUT) btn = m.Pin("D6", m.Pin.IN, m.Pin.PULL_UP) do = True t.sleep(0.5) while do: if not btn.value(): led.high() t.sleep(0.5) led.low() t.sleep(0.2) exit()
Adafruitのドキュメントだと、value() が抜けていて判断できなかったのがちょっと悩みましたが。
D6のピンとGNDが接続されているときだけチカチカします。
他にもAnalogのIN/OUT(そう、SAMDにはDACがついている) PWM(バグがあるらしい) i2C、SPIなどが使えるようで。 特記事項としては現時点でシリアルの入出力には対応していないそうです。(えー)
シリアルターミナルに占有されているから使えないのでしょうかね。まだ未調査です。
でも、まあ、簡単につかえておもしろいのでちょい遊びにはもってこいだとおもいます。
さて、だいぶ後手になっちゃいましたがminiterm.pyだといろいろ不便なのでscreenを導入しましょう。
sudo apt-get install screen
使い方は
screen /dev/ttyACM0 115200
みたいな。
シリアルシェルから出きることといえばちょっとスクリプト動かしてみる、ドライブに保存されているPythonスクリプトをimportしてつかう。くらいですけれども、一応小数点計算なども出来るし良い使い方があるかもしれません。
ところでライブラリ、何があるのでしょうかね。
ということで最終的に役に立つのはオフィシャルのドキュメント。
主にマイコンでmicroPythonを使う際に重要になってくるのはmachineライブラリだと思います。
どんなファンクションがあるのか見ているとディープスリープなんてのも用意されていてなかなか本格的。追加のライブラリのことだとかいろいろ試しきれてないことが多いのでこれから少しづつ有効的な使い方も含めて探って行こうと思いました。
import machine
dir(machine)
['__name__', 'ADC', 'DAC', 'I2C', 'Pin', 'PWM', 'Flash', 'SPI']
どうもディープスリープだのリセットだのは実装されていないようです。
まあ、普通に使う分には何も問題ありませんけれどもね。
microPythonのドライブ(Arduino Zero Pro)の中に新しくファイルを作って、モジュールとして読み込んでみるテスト。 普通に動いてます。
画像のは時間軸と周波数を指定するとサンプリングレートに基づいた波形データを返してくれるというモジュールですが、mathモジュールをインポートしていたり。なかなかマイコンでやりたいと思えるような内容ではないのですがふつーに動いてしまってあらあら。といったところ。
ファイルの扱いとかが謎ですね。
あんまりファイル読み書きとかさせたくない気もしますが。
このあたりはマイコン上で動いてることを忘れないようにして、EEPROMとか使った方がいいのかもしれません(SDFatとかないからSDカードはちょっと期待薄。そのためのコード書いたら容量足りなくなりそうだし)
>>> import machine
>>> dir(machine)
['__name__', 'ADC', 'DAC', 'I2C', 'Pin', 'PWM', 'Flash', 'SPI']
>>> machine.Flash
<class 'Flash'>
>>> dir(machine.Flash)
['readblocks', 'writeblocks', 'ioctl']
こういうことになっているので内蔵ストレージ使うよってことみたいね。
ESP8266他いくつかのボード用のファームではFlash以外にSDっていうのがあるらしく、それ使ってSDカードの読み書きが出来るらしいよ。