WiPy に関する一般的なこと
浮動小数点のサポートなし
容量の都合により、浮動小数点のサポートはなく、math モジュールもありません。つまり、コード中のどこでも浮動小数点数は使えず、すべての除算は '/' ではなく '//' を使って行う必要があります。例:
>>> r = 4 // 2 # これは動作します
>>> r = 4 / 2 # これは動作しません
電源を入れる前に
警告
WiPy の GPIO ピンは 5V トレラントではありません。3.6V を超える電圧に接続すると、ボードに修復不能な損傷を与えます。ADC ピンをアナログモードに設定した場合、1.8V を超える電圧には耐えられません。電子回路を配線するときは、この点に注意してください。
WLAN のデフォルトの動作
WiPy を工場出荷時の設定で起動すると、アクセスポイントモードで起動し、 ssid は wipy-wlan で始まり、 key: www.wipy.io になります。このネットワークに接続すると、WiPy に 192.168.1.1 でアクセスできます。対話プロンプトを使うには、この IP アドレスのデフォルトポート (23) に telnet で接続します。認証情報を尋ねられるので、 login: micro と password: python を入力してください
Telnet REPL
Linux 標準の telnet が問題なく使えます(OSX でも同様)。putty などの他のツールでも十分に動作します。デフォルトの認証情報は user: micro 、 password: python です。デフォルト値の変更方法は network.Server を参照してください。たとえば linux のシェルでは(WiPy に AP モードで接続した状態で)次のようにします:
$ telnet 192.168.1.1
ローカルファイルシステムと FTP アクセス
WiPy には /flash という小さな内部ファイルシステム(ドライブ)があり、外部のシリアルフラッシュメモリ内に保存されています。micro SD カードを接続してマウントしていれば、それも利用できます。
WiPy を起動すると、常に /flash ファイルシステムにある boot.py から起動します。起動時のカレントディレクトリは /flash です。
このファイルシステムには、WiPy で動作しているネイティブの FTP サーバー経由でアクセスできます。お好みの FTP クライアントを開いて、次に接続してください:
url: ftp://192.168.1.1 、 user: micro 、 password: python
デフォルト値の変更方法は network.Server を参照してください。推奨するクライアントは、Linux 標準の FTP (OSX も同様)、Filezilla、FireFTP です。たとえば linux のシェルでは次のようにします:
$ ftp 192.168.1.1
WiPy の FTP サーバーはアクティブモードをサポートしておらず、パッシブモードのみ対応しています。そのため、unix 標準の ftp クライアントを使う場合は、ログインした直後に次を実行してください:
ftp> passive
さらに、FTP サーバーは同時に1つのデータ接続しかサポートしていません。詳しくは下記の Filezilla の設定に関する節を参照してください。
FileZilla の設定
クイック接続ボタンは使わず、サイトマネージャを開いて新しい設定を作成してください。 全般 タブで、暗号化が 平文の FTP のみを使用 (安全ではありません) に設定されていることを確認します。転送設定タブでは、最大接続数を1に制限してください。そうしないと FileZilla は、ファイルの取得や保存の際に2つ目のコマンド接続を開こうとします。単純化とコードサイズ削減のため、コマンド接続とデータ接続はそれぞれ1つだけしか使えません。他の FTP クライアントも同じような動作をするかもしれません。
ファームウェアの無線経由でのアップグレード
OTA によるソフトウェア更新は FTP サーバー経由で実行できます。 mcuimg.bin ファイルを /flash/sys/mcuimg.bin にアップロードしてください。6秒ほどかかります。 /flash/sys/ の中にファイルが保存された様子は見えません。実際にはユーザーファイルシステムを迂回して保存され、内部の 隠し ファイルシステムに置かれるためです。ただし転送は確実に行われており、整合性を検証するために MD5 チェックサムで署名されています。あとはボード上のスイッチを押すか、次のように入力して WiPy をリセットしてください:
>>> import machine
>>> machine.reset()
ソフトウェアの更新は https://github.com/wipy/wipy/releases (Binaries.zip) にあります。常に最新のソフトウェアに更新することをお勧めしますが、その前に必ず リリースノート を読んでください。
注釈
Binaries.zip に入っている bootloader.bin は参考用のもので、無線経由の更新には必要ありません。
ソフトウェアのバージョンを確認するには、次のようにします:
>>> import os
>>> os.uname().release
バージョン番号が リリース にある最新のものより古い場合は、WiPy を更新しましょう!
ブートモードとセーフブート
通常どおり電源を入れるか、リセットボタンを押すと、WiPy は標準モードで起動します。まず boot.py ファイルが実行され、次に main.py が実行されます。
リセット中に GP28 を プルアップ する(3v3 出力ピンに接続する)ことで、このブートシーケンスを上書きできます。この手順を使えば、以前のファームウェアバージョンに戻すこともできます。WiPy は最大3つの異なるファームウェアバージョンを保持できます。工場出荷時のファームウェアと、2つのユーザー更新分です。
リセット後に GP28 が high に保たれていると、ハートビート LED がゆっくり点滅し始めます。3秒後もピンが high のままなら、LED は少し速く点滅し始め、WiPy は1つ前のユーザー更新を選択して起動します。1つ前のユーザー更新が目的のファームウェアイメージであれば、さらに3秒が経過する前に GP28 を離す必要があります。3秒後もピンが high のままなら、工場出荷時のファームウェアが選択され、LED が 1.5 秒間速く点滅した後、WiPy は起動を続けます。ファームウェアの選択機構は次のとおりです:
セーフブートピン GP28 を離したタイミング:
最初の3秒の区間 |
2番目の3秒の区間 |
最後の 1.5 秒の区間 |
|---|---|---|
セーフブート、 最新の
ファームウェアが選択されます
|
セーフブート、 1つ前の
ユーザー更新が選択されます
|
セーフブート、 工場出荷時の
ファームウェアが選択されます
|
上記3つのいずれの場合でもセーフブートモードに入ります。つまり boot.py と main.py の両方の実行がスキップされます。これはユーザースクリプトが原因のクラッシュから復旧するのに便利です。セーフブート中に行った選択は永続的ではないので、次に通常のリセットを行えば再び最新のファームウェアが動作します。
ハートビート LED
デフォルトでは、ハートビート LED はシステムが動作していることを示すために 4 秒ごとに1回点滅します。これは wipy モジュールで変更できます:
>>> import wipy
>>> wipy.heartbeat(False)
現在、目にする可能性のあるエラーは2種類あります:
ハートビート LED が速く点滅する場合は、Python スクリプト(たとえば
main.py)にエラーがあります。REPL を使ってデバッグしてください。ハートビート LED が点灯したままの場合は、ハードフォールトが発生しています。この状態からは復旧できないので、リセットスイッチを押すしかありません。
スリープモードの詳細
machine.idle(): 消費電力: 約 12mA (WLAN STA モード時)。復帰要因: あらゆるハードウェア割り込み(周期 1ms の systick を含む)。特別な設定は不要です。machine.lightsleep(): 950uA (WLAN STA モード時)。復帰要因はPin、RTC、WLANですmachine.deepsleep(): 約 350uA。復帰要因はPinとRTCです。
machine.Pin に関する追加の詳細
WiPy ボードでは、ピンは文字列の id で識別します:
from machine import Pin
g = machine.Pin('GP9', mode=Pin.OUT, pull=None, drive=Pin.MED_POWER, alt=-1)
ピンが割り込みを発生するように設定することもできます。たとえば:
from machine import Pin
def pincb(pin):
print(pin.id())
pin_int = Pin('GP10', mode=Pin.IN, pull=Pin.PULL_DOWN)
pin_int.irq(trigger=Pin.IRQ_RISING, handler=pincb)
# コールバックは手動で起動することもできます
pin_int.irq()()
# コールバックを無効にするには
pin_int.irq().disable()
これで、gpio ピンで立ち下がりエッジが検出されるたびにコールバックが実行されます。注意: 機械式のプッシュボタンには「バウンス」があり、スイッチを押したり離したりすると複数のエッジが発生することがよくあります。詳しい説明とさまざまなデバウンス手法については http://www.eng.utah.edu/~cs5780/debouncing.pdf を参照してください。
すべての pin オブジェクトは、ピンマッパーを通して gpio ピンのいずれかに対応付けられます。
drive パラメータの駆動能力は次のとおりです:
Pin.LOW_POWER- 2mA の駆動能力。
Pin.MED_POWER- 4mA の駆動能力。
Pin.HIGH_POWER- 6mA の駆動能力。
alt パラメータについては、各ピンがサポートする具体的な代替機能を <https://raw.githubusercontent.com/wipy/wipy/master/docs/PinOUT.png>`_ にあるピン配置と代替機能の表で確認してください。
割り込みについては、 priority は 1〜7 の範囲の値を取ります。また wake パラメータには次の性質があります:
wake_from=machine.Sleep.ACTIVEの場合、どのピンでもボードを復帰させられます。
wake_from=machine.Sleep.SUSPENDEDの場合、GP2、GP4、GP10、GP11、GP17`` 、GP24のピンがボードを復帰させられます。ただし、これらのピンのうち同時に復帰要因として有効にできるのは1つだけなので、machine.Sleep.SUSPENDEDの復帰要因として最後に有効にしたピンだけが効果を持ちます。
wake_from=machine.Sleep.SUSPENDEDの場合、GP2、GP4、GP10、GP11、GP17、GP24のピンがボードを復帰させられます。この場合、6つのピンすべてを同時にmachine.Sleep.HIBERNATEの復帰要因として有効にできます。
追加の Pin メソッド:
- machine.Pin.alt_list()
そのピンがサポートする代替機能のリストを返します。リストの要素は
('ALT_FUN_NAME', ALT_FUN_INDEX)という形式のタプルです。
machine.I2C に関する追加の詳細
WiPy にはハードウェアの I2C ペリフェラルが1つだけあり、"0" で識別されます。デフォルトでは、I2C のインスタンスを構築するとこのペリフェラルが使われます。デフォルトのピンは SCL が GP23、SDA が GP13 で、デフォルトの I2C ペリフェラルは単に次のようにして作成できます:
i2c = machine.I2C()
ピンと周波数は次のように指定できます:
i2c = machine.I2C(freq=400000, scl='GP23', sda='GP13')
SCL/SDA として使えるピンは限られています。詳しくはピン配置を参照してください。
既知の問題
SSL ソケットの作成方法の非互換性
SSL ソケットは、 ssl.wrap_socket でラップする前に、次のように作成する必要があります:
import socket
import ssl
s = socket(socket.AF_INET, socket.SOCK_STREAM, socket.IPPROTO_SEC)
ss = ssl.wrap_socket(s)
接続の相手側を検証するため、また自分自身を相手側に対して認証するために、証明書を使う必要があります。これらの証明書は FTP サーバーを使ってファイルとして保存しなければならず、決められたパスに決められた名前で置く必要があります。
相手側を検証するための証明書は '/flash/cert/ca.pem' に置きます
自分自身を認証するための証明書は '/flash/cert/cert.pem' に置きます
自分自身の証明書用の鍵は '/flash/cert/private.key' に置きます
注釈
これらのファイルを保存すると、(ファームウェアの更新と同様に)内部の 隠し ファイルシステムの中に置かれるため、決して見えることはありません。
たとえば証明書を使って Blynk のサーバーに接続するには、 blynk のサンプルフォルダ にある ca.pem ファイルを '/flash/cert/' に置きます。そして次のようにします:
import socket
import ssl
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM, socket.IPPROTO_SEC)
ss = ssl.wrap_socket(s, cert_reqs=ssl.CERT_REQUIRED, ca_certs='/flash/cert/ca.pem')
ss.connect(socket.getaddrinfo('cloud.blynk.cc', 8441)[0][-1])
hashlib モジュールの非互換性
WiPy のハードウェア実装上の都合により、データはダイジェスト化する前にバッファリングする必要があります。そのため、RAM に収まらない大きなデータブロックのハッシュを計算することはできません。この場合、たいていはデータの総サイズが事前に分かっているので、そのサイズをコンストラクタに渡すことで、バッファリングなしに WiPy の HASH ハードウェアエンジンを適切に初期化できます。 block_size を指定する場合は、 data の最初のチャンクも一緒に渡す必要があります。 この拡張を使うときは、途中のすべてのチャンク(最初のチャンクを含む)の長さが 4 バイトの倍数になるよう注意してください。 最後のチャンクは任意の長さで構いません。
例:
hash = hashlib.sha1('abcd1234', 1001) # 最初のチャンクの長さは 4 バイトの倍数
hash.update('1234') # これも 4 バイトの倍数
...
hash.update('12345') # 最後のチャンクは任意の長さで構いません
hash.digest()
network モジュールによる telnet/FTP サーバーのアドホックな制御
Server クラスは、WiPy で動作している FTP と telnet サービスの動作と設定を制御します。このクラスのメソッドで行った変更は、その両方に影響します。
例:
import network
server = network.Server()
server.deinit() # サーバーを無効化
# 新しい設定でサーバーを再び有効化
server.init(login=('user', 'password'), timeout=600)
- class network.Server(id, ...)
サーバーのインスタンスを作成します。初期化のパラメータについては
initを参照してください。
- server.init(*, login=('micro', 'python'), timeout=300)
初期化します(実質的にサーバーを開始します)。オプションで新しい
user、password、timeout(秒単位)を渡せます。
- server.deinit()
サーバーを停止します
- server.timeout([timeout_in_seconds])
サーバーのタイムアウトを取得または設定します。
- server.isrunning()
サーバーが動作していれば
Trueを、そうでなければFalseを返します。
アドホックな VFS 風のサポート
WiPy は MicroPython の VFS を完全にはサポートしていません。代わりに os モジュールに次の関数が定義されています:
- mount(block_device, mount_point, *, readonly=False)
指定したマウントポイントに(
SDオブジェクトのような)ブロックデバイスをマウントします。例:vfs.mount(sd, '/sd')
- unmount(path)
指定したパスから、以前にマウントしたブロックデバイスをアンマウントします。
- mkfs(block_device or path)
指定したパスをフォーマットします。パスは
/flashか/sdのいずれかでなければなりません。マウント前のSDオブジェクトのようなブロックデバイスを渡すこともできます。