ESP-WROOM-02でMicroPythonを使い開発(ファイル編)

〔ESP32-WROOM-32E〕 〔マイコンのトップに戻る〕
[準備編] [module編] [GPIO編] [通信編]   [OLED編] [WiFi編] [メール編] [並行処理編] [色々編]


このページでは、ESP8266のフラッシュメモリにて読み書きするファイル操作を行ってみようと
思います。(って事はぁわざわざSDカード準備しなくても良いって事ですね、素晴らしい!)
PS.
やっぱりぃSDカード準備を行ってみようと思います、読み書きチョットだけします。

《ampy》

ampyはシリアル接続を介してMicroPythonボードと対話(フラッシュメモリのファイル操作)する為の
ユーティリティです。
ampyのインストールやファイル操作の方法はこちらの"e-DIYで行こう!のけん"さんのページを参照下さい

インストールとフラッシュメモリのファイル一覧を行ってみました。

PowerShellでpip操作1
"boot.py"と"main.py"しか入っていないですね。
このファイルは起動時にESP8266が特別に扱うファイルで、
"boot.py"スクリプトが存在する場合は最初に実行され、次に"main.py"スクリプトが実行されます。
注意は、"ampy"を操作する時に、他に"COM4"ポートへアクセスしていない事です

PS C:\Users\user> ampy --help
と入力すればampyのへプルが表示されるのでみてみてぇ。

PowerShellでpip操作2
"get"コマンドはファイルをダウンロードするのではなく、ファイルの内容を表示する事に注意です。
他にディレクトリ作成、ファイル書き込みもできる様です。

コマンドプロンプトでファイル作成操作
ファイルに書き込むにはパイプライン操作を行えばOKです。
PowerShellで操作したら出来たファイルがえらい改行だらけでぇ....
"コマンドプロンプト"にした次第です、古い人間はPowerShellなんてぇ出来るかぃ!


runコマンドを試してみる

下記スクリプトを書き込み起動させればどうなるか検証してみる。
--------------------------------------------------------------------------------
import time
from machine import Pin

led = Pin(16, Pin.OUT) # ボードに内蔵のLED

printf("Hello world!") # ここをワザと間違ってみる
led.value(0)           # LED点灯
time.sleep(1)
led.value(1)           # LED消灯
--------------------------------------------------------------------------------

PowerShellでpip操作3
チョットぉトレースがうざいがぁエラー行と"printf"のネームエラーが出ているようですね。
次は正常スクリプトでやってみる。

PowerShellでpip操作4
では次はループする下記スクリプトを書き込んでみる。

--------------------------------------------------------------------------------
import time
from machine import Pin

led = Pin(16, Pin.OUT) # ボードに内蔵のLED

i = 0
led.value(0)             # LED点灯
while True:
    if i > 30 : break    # 30カウントで終了
    print(i)
    i=i+1
    time.sleep(1)        # 1000msで繰り返す
led.value(1)             # LED消灯
--------------------------------------------------------------------------------

PowerShellでpip操作5
スクリプトが終了するまではプロンプトが返ってこない
終了後に"print"メッセージが一気に表示される様です。
Myボードのリセットボタンを押せばプロンプトが返ってきます。

《REPLで操作する》

REPLからファイル操作を行ってみます。
ESP8266版?”REPL”操作の基本話はここを参照しましょう。
シリアル端末(TeraTerm)でREPLを起動させる方法はここです。

”help”表示
REPL操作(help)

”os”のモジュール一覧
TeraTermでREPL操作1
"os.listdir()"でフラッシュメモリのファイル一覧が表示できますね。
ファイル作成以外は大体ファイル操作は出来そうですね。
uosの詳しい説明は、ここを参照しましょう。

マイクロパイシェル(upysh)
TeraTermでREPL操作2
上の操作よりはこちらの方がいいなぁ。
"clear"は、画面の消去です、"cls"の方が良かったな。
"mv()"は、ファイル移動だが、"mv('test.txt','lib/test.txt')"とするとディレクトリへ移動できる様です。
"head()"は、頭から10行だけ表示します、"head('test.txt', n=10)"なので10を変えれます。

TeraTermでREPL操作3
ファイル作成もできる様ですね。


ファイルの読み書き

ファイルシステムの詳しい説明は、ここを参照しましょう。
ファイルの関数関連は、ESP8266用ではないけれどこちらこちらを参考にしましょう。

[ファイルopenモード"w"・"r"]
[open()][f.close()][f.write()][f.read()]
REPL操作ファイル(mode=w,r)
こんな操作でファイル書き込みと読み込みができます。
ファイルのオープンモードは"r"で読み込む場合に使用します。
"w"は書き込みモード、ファイルが存在しない場合は作成され、有れば常に上書きされます。
なのでぇ、前に書き込んであったデータは消えます。
尚、"f.write()"から返されるのは書き込んだバイト数です。

[ファイルopenモード"a"・"x"]
REPL操作ファイル(mode=a,x)
"a"はアペンドモードでファイルの最後に追加書き込みされます。
ファイルが存在しない場合は作成されます。
"x"はファイルが存在しない場合は作成され書き込まれますが、有ればエラーです。
ファイルopenモードを指定しない場合は読み込みモードとなります。

[f.seek()]
REPL操作ファイル(seekメソッド)
"f.seek()"メソッドは読み書きする位置までシークします。
第1引数でシークする位置を指定し、
第2引数は"0"ならファイル先頭からシークしなさい指示です、
"2"ならファイルの最後を基準にしてシークし、
"1"なら現在のファイル位置を基準にしてシークします。
"f.seek(7,0)"は先頭0から数えて7バイト目に位置付けし、
"f.seek(-4,2)"は最後1から数えて先頭方向へ4バイト目に位置付けします。
"f.seek(0,2)"がファイルの最後の次位置ですよ。
又、"f.tell()"は、ファイル中における現在の位置を示す整数を返します。

[ファイルopenモード"+"]
REPL操作ファイル(modo=+)
"+"はファイルへの読み書きが同時に行えるモードです。
前に書き込んであったデータは残るので"ESP"が"esp"になった次第です。
又、"w+"・"r+"・"a+"モードもOKです。

[f.flush()]
REPL操作ファイル(flushメソッド)
"f.flush()"メソッドは実際にファイルへ書き込みます。
通常は"f.close()"でファイルに書き込まれます、それまではバッファに読み書きを行っています。
たまに"close"前に書き込んで置きたいと思う事が有るのですがぁ、そんな時に使いましょう。


[os.remove()]
REPL操作ファイル(ファイル削除)
次の操作の為に一旦ファイルを削除します。
(因みに、ディレクトリの削除は"os.rmdir()"を使います)
REPL操作ファイル(ファイル再作成)
そして新たなファイルを作成します、内容は1行単位の改行付きデータを3行ほど作成。

[f.readlines()][f.readline()]
REPL操作ファイル(ファイル内容を読む)
"f.read()"は読み込みのサイズを指定していないので全部読み込まれています。
"f.readlines()"は3行全部読み込まれています。
"f.readline()"は1行のみ読み込まれています。
ならばぁ。

チョット待ってぇ、ここでREPLの貼り付けモードの説明を"TeraTerm"版となります。
TeraTermのMicroPython >>>プロンプトの所で[Ctrl]+[E] を押して貼り付けモードに入ります。
貼り付けモードのプロンプトは"==="になります。
  ------------------------------------------------------------------------------
  >>>
  paste mode; Ctrl-C to cancel, Ctrl-D to finish
  ===
  ------------------------------------------------------------------------------
MicroPython端末ウィンドウを右クリックして「クリップボードの確認ウインドウ」で
[OK]をクリックします。
後は、[CTRL]+[D]で実行します、[CTRL]+[C]で中断です。

短いスクリプトを書いてみます、(正確は書いたスクリプトを貼り付けますです)
REPL操作ファイル(readlineメソッド)
上のは、各データに改行(\n)が入っていて、"print()"も改行してくれるので各データ間が空きました。
なので、下で"print()"が改行しない様にしたら各データ間が詰まります。
尚、読み込んだデータの方の改行を削除するには、
print(i.replace('\n',''))
と書き換えればOKです。
REPL操作ファイル(readlinesメソッド)
"f.readlines()"を使った場合はこんなんなりましたぁ。
あ、それとぉ、オープン時のファイルモードを指定しなかった場合は読み込みモードです。
withブロックは、ブロックの終了時に自動的にファイルクローズされます。

※ 上記の説明は全てテキスト文字列での内容で、オープン時のファイルモード"t"ですが省略した時は   文字列扱いです、"w"or"wt"見たいなぁ感じぃ。
  でぇ、バイナリデータには"b"が付きます、"wb"と言ったふうにです。

[f.tell()]
REPL操作ファイル(tellメソッド)
"f.tell()"は、ファイルオブジェクトのファイル中における現在の位置を示す整数を返します。

ステートメントの最後が":"行で終わる場合は、プロンプトは"..."に変わります、
カーソルが自動的に正しい量だけインデントされ、次の行をすぐに入力し始める事ができます。
入力完了なら[ENTER]キーを4回押しましょう、実行されます。

ファイルの詳細を表示してみる。
[os.ilistdir()][os.mkdir]
REPL操作ファイル(ilistdirメソッド)
先ずは"os.mkdir()"でディレクトリ"lib"を作成します。
でぇ、"os.ilistdir()"でファイルの詳細が分かる様です。
但し、このメソッドはファイル情報が入ったイテレータ(データ構造)を返す様です。
32768(0x8000)は普通のファイルで16384(0x4000)はディレクトリの様です。
最後の数値がファイルサイズの様です。

《SDカード》

私のESP8266は4MB程のフラッシュメモリがあり、3MB程のFat領域がある様ですがぁ、
やっぱりぃLOGファイルや大量のデータを扱うにはSDカードが不可欠な様な気がしますので読み書きを
行ってみます。

SDソケットの配線図
電源はUSB接続で、
回路電源はボード出力3.3Vです。
SPIはGPIO14(SCK)/GPIO13(MOSI)/
GPIO12(MISO)と、SS(CS)はGPIO4を
使ってSDソケットに配線います。
SPIの信号線(SDI/SDO)は10KΩで
プルアップしています。


SDカードの端子について

FlashAir裏の外観
SDカード ボード1ピンNo
ボード2ピンNo
SPI名称
ESP接続先
@ D3(DATA3) CS
SS(CS)
GPIO4
A CMD DI
SDI
GPIO13(MO)
B (VSS) (VSS)

C (VDD) (VDD)

D CLK
CLK SCK
GPIO14
E (VSS) (VSS)

F D0(DATA0) DO
SDO
GPIO12(MI)
G D1(DATA1)


H D2(DATA2)


SDカードソケットボードによりピン番号が異なったりします、上図の回路図で使った物は
"ボード2ピンNo"のタイプです、
又、SSで使っているGPIO4ピンは他のピン(GPIO5辺り)へ変える事が出来ます。

@ "sdcard.py"をダウンロードします。
  " GitHub"のここから"micropython-master"をダウンロードし解凍後、
  [drivers]->[sdcard]のディレクトリにある"sdcard.py"を使いました。

A "sdcard.py"を"PyCharm"のプロジェクトディレクトリ(ここでは"espTest"を作成している)へ
  移動させます。

B エディター等でテキストファイル"test.txt"を数行ほど作成し、SDカードに書き込みましょう。
  後は、SDソケットにSDカードを差し込んで置きましょう。

C ESP-WROOM-02ボードをUSBでPCに繋ぎます。

D "PyCharm"を起動させ、こちらのCを操作する必要が有ります。(起動時最初のみ設定)

E "main.py"を新規登録して下記スクリプトを"main.py"に貼り付けましょう。
  (登録済みなら上書き貼り付けでも行いましょう)

F ESP8266に書き込みます。

Pycharmの書き込み操作図
"sdcard.py"を右クリックして、[実行(U)'Flash sdcard.py']をクリックします。
"main.py"も同様に操作します。

--------------------------------------------------------------------------------
import uos
import sdcard
from machine import SPI, Pin

# SDカードの初期化とマウントを行う(SPIの初期化、ピン4番(GPIO4)をSSで割り付)
sd = sdcard.SDCard(SPI(1), Pin(4, Pin.OUT))
uos.mount(sd, "/sd")

# "test.txt"を読み込む
with open('/sd/test.txt', 'r') as f:
    for i in f:
        print(i, end='')
# "test1.txt"に書き込みテスト
with open('/sd/test1.txt', 'w') as f:
    f.write('Hello ESP8266')

print(uos.listdir('/sd'))   # SDカードのファイル一覧を表示
# SDカードをアンマウントする
uos.umount('/sd')
print(uos.listdir())        # フラッシュメモリのファイル一覧を表示
--------------------------------------------------------------------------------
G "MicroPython REPL"を動作させましょう。
  メニューバーから[ツール]->[MicroPython]->[MicroPython REPL]を順番にクリックします。

MicroPython REPL 操作
REPLが表示され、">>>"のプロンプトが表示されるのを待ちます。
表示されたら[CTRL]+[D]キーを押しましょう。
ソフトリセットが実行されスクリプトが動作し、こんな感じになるでしょう。


sdcard
SPIバスを使用するSDカード用のMicroPythonドライバーです。
SPIバスとCSピンが必要です。 読み取りブロックと書き込みブロックを提供します、だってさ。
最初 TDK2GBMicoSDカードで行っていたのだがぁ、
"os.mount()"でエラー(OSError: [Errno 19] ENODEV)が出てハマってしまいました。
でぇ、こちらや chakoku(rev5)さんのサイトこちらでどうも良く解らないがぁSDカードにより
使えない物が存在するらしい。
なのでぇ、標準サイズのSD2GB(SD)に変えたら動作した、FlashAir32GB(SDHC)も動作した、 256MB(SD)は初期化時にタイムアウトでダメだった。(待ち時間を長くすれば良いのかも?)

 ・sd.init_spi(baudrate)
  spiの通信速度を設定します。
  baudrate = 通信速度をHzで指定します
 例)sd = sdcard.SDCard(SPI(1), Pin(4, Pin.OUT))
   sd.init_spi(16000000)

 ※ "sdcard.py"は、初期化時に 100KHzで行い、1320KHzで通信を行っている、
   通信速度を上げて動作する様なら上げた方が良いかもね。
 ※ それとぉ、ファイル書き込み時のタイムスタンプは"2000/01/01 0:0"の様です。




[通信編へ] [ページ上へ] [OLED編へ]


【きむ茶工房ガレージハウス】
Copyright (C) 2006-2021 Shigehiro Kimura All Rights Reserved.