[電子工作]ESP32の使い方ーーーー目次ーーーー ーーーーーーーーーー ESP32-S3は従来のESP32と互換性がありません。詳細はこちら。1.ESP32とは?中国のEspressif Systems Pte.(ESP)社が開発したマイコンで、240MHzのXtensa 32bit LX6プロセッサを 2個搭載し、520KBのRAMを持ち、何と802.11b/g/n(Max.150Mbps)のWiFiとBluetooth v4.2に対応し、1000円 未満で買えてしまうという、とんでもなくコストパフォーマンスの高いマイコンです。 WiFiやBluetoothに対応し、PCやスマートフォン等から無線で制御できるため、まさにIoTのためのマイコンです。 上記写真のように、ピンアサインは一緒ですが、外形サイズが異なったり、ピン数やピンアサインが異なる ものも売られているので、注意。(2.54mmだけ幅が異なるので、私は、下の写真のように、1列と2列の ピンヘッダ(メス)の組み合わせにして、両方装着できるようにしています。 IoT Express Mk IIやESPDuino-32と呼ばれるArduino互換のコネクタを持つボードもありますが、ピン配置に 互換性はありませんので購入時には、ご注意ください。一般には、上の写真のようなDIPタイプのボードに搭載 されたものが、様々なメーカーから販売されています。それを自分で半田付けすれば、ピン配置を変更できます。 私が作ったものはこれ。LCD、OLED、SDカードなどを使ったArduino用シールドが動作しました。
Arduino IDEで開発可能で、多くの方がESP32の性能を出せるようにライブラリを作っているので、多くの プログラムが、無茶苦茶高速に動作します。 また、ESP32、32D、32Eは互換性がありますが、ESP32Sシリーズは高速になってメモリも増えていますが 全く互換性はありませんし、シングルコアのものや、クロックを160MHzに落としたものもあるのでご注意下さい。 なお、私が設計したGS-0001:2.8型LCDタッチパネルボードもありますので、よろしければESP32の評価に 購入をご検討下さい。(アナログジョイスティック、液晶パネル、SDカード、タッチパネル、圧電スピーカなど搭載)
2.Arduino IDEのESP32環境の使い方(1)Arduino IDEのインストール まず、Arduino IDEをインストールしてください。 その後、ファイルー環境設定の追加のボードマネージャのURLに https://raw.githubusercontent.com/espressif/arduino-esp32/gh-pages/package_esp32_index.json を追加し、ツールーボードのボードマネージャで「esp32」等で検索し、インストールします。 (注意.私のサンプルを実行する場合、バージョン1.0.6を選んで下さい。) 詳細は、Arduino IDEのESP32開発環境を参考にして下さい。
(2)いきなり注意点 最初に注意点を記載します。特に、Arduinoを使った経験のある方が引っ掛かり易いので、必ず読んで下さい。 1.動作が不安定、WiFiがつながらない(シリアルモニタで「Brownout detector was triggered」のメッセージが出続ける) 電源供給が不足しています。太いUSBケーブルを使用し、PCコネクタ直結か、電源を持つHUBに接続して下さい。
2.ピンアサインが、他のArduino互換機と違う ピン番号は、基板に書かれているIOxxのxxになります。詳細はこちらを参照。 ハードウェアSPIはディフォルトで次の端子に割り振られています。(SDカードの使い方はこちらを参照) SCK:IO18 MOSI:IO23 MISO:IO19 SS:IO5(pull-up付き) I2Cはディフォルトで次の端子に割り振られています。 SDA:IO21 SCL:IO22
3.ボードに書き込む時、IO0/Bootと書かれているボタンを押す →(スケッチ−マイコンボードに書き込む)を実行すると、 ......______......___ と表示されます。その時、一部ボードではIO0/Bootと書かれているボタンを押し続け、書き込みが 開始されたら離して下さい。なお、ESP32-DevKitC-32Dではボタンを押さなくても書き込めました。
(2)サンプルの実行 ・LEDを点滅するサンプルを実行 ボードとPCをUSBケーブルで接続します。(PCのコネクタに直接接続することを推奨) ツール−ボード で接続しているボードを選び、ツール−シリアルポート でボードのCOMポート番号を選ぶ。 ファイル−スケッチ例−01.Basic−Blink を選ぶ。 →(スケッチ−マイコンボードに書き込む)を押すと プログラムをコンパイルし、ボードに転送し(必要ならIO0/Bootボタンを押してから離す)、ボード上のLEDが 点滅します。 delay(時間(ms)); の時間を変更すると、点滅の時間が変化します。 LED_BUILTINが定義されていないというエラーが出る場合は、LEDの繋がっている端子番号(IOxx)に変更。
・デバッグ方法 サンプルコードに、「Serial.print」のコマンドが書かれています。ツール−シリアルモニタ を起動して マイコンボードに書き込んで実行するとメッセージが表示されます。これを使用することで、 表示デバイスが無くても、プログラムの実行状況が確認できます。 なお、Serial.begin(115200); のレートとシリアルモニタのレートは一致させて下さい。
・ネットからライブラリをダウンロード スケッチ−ライブラリをインクルード−ライブラリを管理 を選び、検索ウインドに使いたいデバイス名 やシールドの名前を入れると、各ライブラリが見つかります。ESP32に最適化されたライブラリを 探したい時はキーワードに「ESP32」を入れておくことをお勧めします。 そこで、インストールを選べば、ライブラリがダウンロードされ、スケッチ例に追加されます。 なお、ダウンロードされたライブラリは、次のフォルダーに格納されます。 Windows:「Users\ユーザー名\Documents\Arduino\」又は「PC\ドキュメント\Arduino\」 Linux:「~/Arduino/」
・手でライブラリを追加 標準ライブラリにはなくても、ネットにArduino IDEのライブラリやサンプルが置かれている場合が あります。その場合、手で次のフォルダーにコピーすれば、Arduino IDEのスケッチブックに追加できます。 Windows:「Users\ユーザー名\Documents\Arduino\」又は「PC\ドキュメント\Arduino\」 Linux:「~/Arduino/」 また、「Arduino\libraries」の下にコピーすれば、スケッチ例に追加できます。
(3)アプリケーション例 ESP32に、2.8型240x320のLCDパネル、SDカードソケット、リチウムイオン電池及び充電/昇圧回路、 圧電スピーカ、アナログジョイスティック、ボタンを接続したもので、ESP32を使って様々なソフトを 動かせるプラットフォームを開発しました。下の写真は試作機で、量産版はこちら。
U-blox社製NEO-6Mとアンテナのモジュールを1000円台で購入し、1.8型128x160のLCDパネル、 microSDカードソケット、リチウムイオン電池及び充電/昇圧回路、ボタンを接続し、GPSロガー を作成しました。9600bpsのUARTで出力されるテキストを読み出し、LCDパネルに表示、SDカード に書き込みを行うだけなので、AVRマイコンでも十分です。今回は、ESP32を40MHz(!)動作させ、 840mAhバッテリで約4時間動作しました。 なお、NEO-6Mを使ったGSPモジュールは1000円台で売られていますが、古い製品なので バックアップ用のボタン型リチウム2次電池が過放電で劣化していてうまく充電できなかったり、 ちょっとしたアンテナの向きで衛星を捕捉できなかったりするので、本格的に使いたい場合は、 もっと新しいモジュール(2000円台で購入可能!)を選んだ方が良いかもしれません。 なお、ちゃんとロックさえすれば、7,8個の衛星を捕捉し、1m以内の精度で座標がとれます。 (標高は10mを超える誤差があります。)ランニングの走行距離や速度も良い精度で採れました。
3.ESP32でWiFiを使おう(1)WiFiでESP32にアクセスしよう スケッチ例−WiFi−SimpleWiFiServer を選びます。この中の、 const char* ssid = "yourssid"; const char* password = "yourpasswd"; をご自分のネット環境の、SSID及びパスワードに変更します。2.4GHz(802.11b/g/n)のみの対応で、 チップの消費電力が増えるので電源に注意。 また、このサンプルはIO5でLEDをON/OFFするように作られています。IO5にLEDを接続するか、 サンプルの「5」を他の端子番号(NodeMCU-32Sの場合は「2」)に変更して下さい。(3カ所あり) →(スケッチ−マイコンボードに書き込む)が終了したら、シリアルモニタを開いて、ENボタンを押して 再起動します。シリアルモニタに、次のような表示が出れば接続OKです。 Connecting to aterm-xxx-g .. WiFi connected. IP address: 192.xxx.xxx.xxx 次にPC/タブレット/スマホ等のブラウザから、「http://192.xxx.xxx.xxx」にアクセスすると、 Click here to turn the LED on pin 5 on. Click here to turn the LED on pin 5 off. と表示されます。ここで、それぞれのhereを押すことで、LEDをON/OFFすることができます。
このサンプルを参考にすれば、PC/タブレット/スマホからESP32を簡単に制御することができます。 次の写真は、私が作成したWiFiオセロ。左がESP32側の画面で、右がPCのブラウザの画面。 PCやスマホからESP32上でオセロができます。(ESP32の液晶パネルが無くても使えます) これはGS-0001:2.8型LCDタッチパネルボードでも動作し、ソースコードはこちら。
(2)SDカードを使ったWebサーバーを立ち上げよう Raspberry Pi等で家庭内Webサーバーを立ち上げたことがありますが、何とESP32でも簡単に実現できます。 まず、SDカードコネクタをSPIモードで次の端子に接続します。(プルアップ抵抗無しでOKでした) CLK:IO18 CMD/DI:IO23 DAT0/DO:IO19 DAT3/CS:IO5 次に、index.htmをはじめHTMLファイルや各種画像ファイルなどHPのデータをSDカードにコピーしセットします。 次に スケッチ例−WebServer−SDWebServer を選びます。この中の、 const char* ssid = "**********"; const char* password = "**********"; を上記と同様に、ご自分のネット環境の、SSID及びパスワードに変更します。 →(スケッチ−マイコンボードに書き込む)が終了したら、シリアルモニタを開いて、ENボタンを押して 再起動します。シリアルモニタに、次のような表示が出れば接続OKです。 Connecting to aterm-xxx-g .. WiFi connected. IP address: 192.xxx.xxx.xxx 次にPC/タブレット/スマホ等のブラウザから、「http://192.xxx.xxx.xxx」にアクセスすると、 index.htmが起動し、HPを開くことができます。但し、画像データが複数あると、タイムアウト するためか、一部データが読み込めないようです。でもまあ、OS無しでSDカードのWebサーバー を立ち上げることができるとは、思いませんでした。
(3)ネットから時間を取得しよう スケッチ例−ESP32−Time−SimpleTime を選びます。この中の、ssidとpasswordを上記と 同様に書き換えます。更に、日本の標準時間に変換するため、 const long gmtOffset_sec = 3600*9; // JST const int daylightOffset_sec = 0; に書き換えるとシリアルモニタに現在の時刻が表示されます。LCDパネルを繋げば時計のできあがり。
(4)WiFi Webカメラを作ろう ESP32にカメラを接続すると、なんと、WiFi対応のWebカメラも出来てしまいます。 秋月電子通商で、OV2640使用200万画素カメラ(B0011)を1,180円で買いました。このカメラは 解像度1600x1200で、RAWやJPEGで出力可能なもので、ESP32との接続例が多くあります。 下の写真のようにブレッドボードで接続します。電源は、2.5V〜3.0Vとなっていますが、絶対最大定格は 4.0Vなので、一先ず+3.3Vを接続しました。(保証は致しません。)使用する端子が多いので、RSTにはEN、 PWDNにはGNDを接続しました。(これらを接続しなくても、コマンド制御可能です。) スケッチ例−ESP32−Camera−CameraWebServer を選びます。この中の、ssidとpasswordを上記と 同様に書き換えます。そして、同時に読み込まれている、「camera_pin.h」のピンアサインを自分の 接続した端子に合わせます。その後、必ず、 ファイル−名前を付けて保存 を行いましょう。(終了時に 消えてしまいます。) →(スケッチ−マイコンボードに書き込む)を行うと、 「スケッチが大きすぎます。」 というエラーが出ることがあります。この場合は、 ツール−ボード で「ESP32 Wrover Module」を選択し、 Partition scheme : "Huge APP (3MB No OTA)" に設定して下さい。これで書き込めるはずです。 シリアルモニタに、 WiFi connected Starting web server on port: '80' Starting stream server on port: '81' Camera Ready! Use 'http://192.xxx.xxx.xxx' to connect と表示されれば接続OKです。 次にPC/タブレット/スマホ等のブラウザから、「http://192.xxx.xxx.xxx」にアクセスすると、写真の右の ような映像が現れ、「StartStream」ボタンを押すと、動画が開始されます。 なお、電源、接続がシビアなようで、横筋ノイズがのることが多いです。 その場合、 config.xclk_freq_hz = 20000000; → config.xclk_freq_hz = 10000000; のようにXCLKの周波数を落とすと、少し安定しました。でも、長時間使用すると高温になり、カメラが 停止することがあります。これは、下の実装版でも同じです。 Resolutionですが、PSRAMを搭載しないESP32-WROOMではSVGA(800x600)までしか撮影できません。 ESP32-WROVER等のPSRAMを搭載するボードでは、XGA〜UXGAも欠けずに出力可能です。 (PSRAMについては、こちら) なお、カメラ(B0011)は、ゆするとカタカタ音が鳴るし、ピントは右端しか合っておらず、中央〜左は どの距離でもボケボケ。でも、レンズ横のボンドを取り除き、指でまわせばピントが合いました。 なお、これと同等の機能を持ち、PSRAMを搭載したESP32-CAMと呼ばれるものも売られています。 ブレッドモード版 実装版
4.ESP32でBluetoothを使おう(1)Bluetoothでシリアル(COMポート)として接続しよう スケッチ例−BluetoothSerial−SerialToSerialBT を選びます。 →(スケッチ−マイコンボードに書き込む)が終了したら、PCやタブレット等からBluetooth機器を検索し、 「ESP32test」という機器が見つかりますので、接続します。そしてCOMポートが2つ現れたら、接続成功です。 実際には、2つのCOMポートの内、一方だけが有効で、PC側でTeraterm等のターミナルソフトを起動 (通信速度は設定不要と思われます)すると、ESP32のシリアルモニタとの間で文字がやり取りできます。 1つのCOMポートで双方向通信可能です。電力が増えるので、電源に注意!
(2)シリアル以外(HID等)で接続する方法はややこしいので、ネットで検索して、その記事を参考にして下さい。 下記の写真は、ESP32とタッチパネル付き液晶を使ったBluetoothキーボードです。初期の接続が不安定 である点とキーが小さすぎてスタイラスペンが無いと押しにくい点が課題ですが、キーボードとして使えます。 写真の左は通常状態で、右はShiftを押した状態です。Ctrl+Alt+Delも入力できます。 これはGS-0001:2.8型LCDタッチパネルボードでも動作し、ソースコードはこちら。
5.MicroPythonを使ってみようファームウェアを書き換えることで、ESP32でMicroPythonを動かすことができます。 ESP32は、ネットワークに接続できるので、MicroPythonを実行するプラットフォームとして優れています。
(1)インストール方法 公式サイトはこちらです。手順だけまとめると次の通り。COM番号は、各自の環境に合わせて下さい。 なお、Pythonが実行できる環境が整ったPCやLinuxマシンで行う必要があると思います。 1.esptoolをインストール >>pip install esptool 2.COM番号を次の方法で調べる Windowsの場合(デバイスマネージャで調べてもOK) >>powercfg /devicequery all_devices 3.ファームウェアのバックアップ >>esptool --chip esp32 --port COM3 read_flash 0 0x400000 esp32_firmware.bin 参考.ファームウェアを元に戻したい場合は、次のコマンドで戻せます。 >>esptool --chip esp32 --port COM3 write_flash 0 esp32_firmware.bin 4.MicroPythonのファームウェアの書き込み こちらからファームウェアをダウンロード。長い名前のファイルは最新版ですが、安定動作を求めるなら バージョン名だけの短い名前のものをダウンロード下さい。 次のコマンドでフラッシュメモリをイレーズします。 >>esptool --port COM3 erase_flash その後、次のコマンドで書き込み。 >>esptool --chip esp32 --port COM3 write_flash -z 0x1000 esp32_idf3-????????-v?.??.bin 5.コマンドの実行、ファイル転送 Windowsの場合: uPyCraftを、ここからダウンロード。実行して、「DLLが無い」のようなメッセージが出たら、 MicrosoftのHPからVisualC++2010のラインタイムをダウンロードして、インストール下さい。 ToolsーSerial でCOM番号を選択し、>>>にPythonのコマンドを打てば、実行できます。 ファイルを作成し、転送して実行することも可能です。 なお、「main.py」という名前でファイルを作成し、転送すれば、次回、ESP32を起動すると実行。 詳しくは、ネットで検索下さい。 Linuxの場合: 私の環境ではuPyCraftが正しく動作しなかったため、screenやgtktermやampyを使用。 インストールは次の通り。 >>sudo apt install screen >>sudo apt install gtkterm >>sudo pip install adafruit-ampy 主なコマンドは次の通り。「/dev/ttyUSB0」は各自の環境に合わせて変更下さい。 >>screen /dev/ttyUSB0 115200 :REPLプロンプトに入る。 何も表示されない時は、Ctrl+Cで実行停止。 screenを終了する時は、Ctrl+Aの後にKを押し、Yを押す。 >>gtkterm ConfigurationのPortで、Portに/dev/ttyUSB0、BaudRateに115200を設定 >>ampy --port=/dev/ttyUSB0 ls :ESP32内部のファイル一覧 >>ampy --port=/dev/ttyUSB0 put ファイル名.py :ESP32にファイルを転送 >>ampy --port=/dev/ttyUSB0 run ファイル名.py :ESP32でファイルを実行
(2)MicroPythonでLCDパネル表示 ネットを検索しても、正しくLCDパネルを制御できるライブラリが見つかりませんでしたので、 自分で作ってみました。でも、所詮、Pythonはインタプリタなので、実行速度はメチャ遅です! ILI9163又はST7735を搭載したLCDパネルに対応します。端子番号は、機器に合わせて 書き換えて下さい。また、パネル毎に青と赤が入れ替わったり、左右反転しますが、 「ili.rotation(i)」の引数を(i+4)、(i+8)、(i+12)のどれかで正しく表示されるはずですので、お試しください。 ILI9163_demo.py 7,749 2020/02/06
(3)SDカードのアクセス こちらの方法で、アクセス可能。但し、1つのSPIを、SDカードとLCDパネルなど複数の機器で共有 できません。私が作った基板は全部、共有しているので、残念。 import machine, uos from machine import SPI, Pin sd = machine.SDCard(slot=2, sck=Pin(18), miso=Pin(19), mosi=Pin(23), cs=Pin(5)) 又は machine.SDCard(slot=3, sck=Pin(14), miso=Pin(12), mosi=Pin(13), cs=Pin(15)) uos.mount(sd, '/sd') uos.listdir() uos.chdir('/sd') with open('test.txt', 'w') as file: file.write("Test") with open('test.txt', 'r') as file: print(file.read())
(4)その他の注意点 標準で動作周波数が160MHzになっています。240MHzにする場合は次の通り。 import machine machine.freq() #現状の周波数の読み出し machine.freq(240000000) その他、こちらを参照下さい。 6.ESP32の活用こちらのHPにESP32の注意点がまとめられていて、非常に助かります。その中でも注意すべき点や、 私が動作確認して、動きが異なる点を記載しておきます。 一部端子は使用上の制約がありますので、次の表を参考に、ピンアサインを決めて下さい。
ESP32は3つのSPIコントローラを搭載していますが、ユーザーが使えるのはVSPIとHSPIです。この内、 VSPIは多くのLCDパネルや"SD.h"のライブラリで使用でき、HSPIは"SD_MMC.h"のライブラリで使用 可能です。ここでは、SDカードをそれぞれのポートに接続して使用する方法について説明します。 ・SD(VSPI接続):信号数少ない。LCDパネル等と端子を共有可能。 ピンアサイン
プログラム例
・SD_MMC(HSPI接続):信号数多い。原理上は高速。(実効速度は不明) ピンアサイン 多くの記事に、DAT0〜DAT3にプルアップ抵抗が必要と書かれていますが、私のテストでは、 全くダメで、逆にCLKにプルアップ抵抗を付けるだけで動くようになりました。
プログラム例
PSRAMは一般には疑似SRAMの事ですが、ESP32の記事でよく出てくるPSRAMは、SPIインタフェースを 持つ8pinのシリアルSRAMの事のようです。ESP32-WROVERや、ESP32の一部のボードに4MB(32Mbit)の PSRAMが実装されていますが、ESP32-WROOMベースの開発ボードには載っていませんのでご注意下さい。 ESP32-CAMには4MBのPSRAMが搭載されています。 PSRAMを使う時に使用するコマンドは次の通り。 ・psramFound() : trueならPSRAMが実装されています。falseなら、実装されていません。 ・ps_malloc(サイズ) : PSRAM上にメモリを確保
7.トラブルシューティング最近、Arduino IDEを新たにインストールして、色々とトラブルが発生したので、Ubuntuを中心に、ESP32を 使う場合の注意点をまとめておきます。 (1)再起動を繰り返す。WiFiがつながらない。(シリアルモニタで「Brownout detector was triggered」) 原因は、電源が不安定なため。USBのバスパワーで使っているなら短くて太いUSBケーブルにする。 レギュレータの出力電流が不足している場合もある。
(2)「A fatal error occurred: Could not open /dev/ttyUSB0」のエラーが発生する。 原因は、Ubuntuをインストールした直後はユーザーがシリアルポートにアクセスする権限がないから。 色々と対策方法はあるが、抜き差しで元に戻ったりするので、次の方法が確実。 >>sudo usermod -a -G dialout ユーザー名
(3)「ImportError: No module named serial」のエラーが出る。 原因は、Pythonのシリアルポート関係の関数がインストールされていないから。 一先ず、関係ありそうな関数をインストール。 >>pip install pyserial esptool python3-serial
(4)「exec: "python": executable file not found in $PATH」のエラーが発生する。 pythonがインストールされているか確認ください。それでもダメならpythonとpython3が関連付けされて いない事が原因なので、python=python3になりますが、次のコマンドをインストール。 >>sudo apt install python-is-python3
(5)私のESP32のサンプルプログラムをコンパイルすると、「tone」関数のエラーが発生する。 最新のESP32をインストールすると既に「tone」は定義されているので、私のサンプルのtoneをコメントアウト 又は削除して下さい。
(6)私のESP32のサンプルプログラムを実行すると一部のソフトで再起動を繰り返したり、タッチパネルが使えない。 最新のESP32をインストールすると、どうもRAMが不足しmallocでメモリを確保できないようです。 また、タッチパネルのライブラリも動作しないようです。 申し訳ありませんが、ツール−ボードのボードマネージャでESP32を検索し、バージョン1.0.6をインストール下さい。 (ESP32-S3では、バージョン2.0.xをお使い下さい。)
(7)ArduinoIDEでESP32-S3のソフトを作成する上での注意点 まず、ツール−ボードのボードマネージャでESP32を検索し、バージョン2.0.xをインストール下さい。 その他、詳細はこちらを参照下さい。
(8)PSRAMが使えない。 ツールで、PSRAMを有効にして下さい。ESP32-S3はチップによって設定が異なります。ps_malloc()でメモリ確保できます。
(9)シリアルモニタで「Task watchdog got triggered.」をメッセージを出して、リセットがかかる。 Arduinoの通常のloop()の中ではWDTが無効になっているようですが、マルチタスクで実行するソフトを 作った場合、1秒以上ループするとWDT割り込みが発生し、リセットがかかる場合があります。 ループの中に、「vTaskDelay(1);」を挿入して下さい。
ESP32-S3についてはこちら。
Arduinoの紹介はこちら。
Arduino IDEで液晶パネル、タッチパネル、SDカードを使う方法は、こちら。
「STM32の性能を発揮するには?」はこちら。
「ESP32-CAMの使い方」はこちら。
「GS-0001:ESP32 2.8型LCDタッチパネルボード」はこちら。 |