Raspberry Pi Arduino開発ベースボードの作成

ESP32,8266の開発ボード環境も一段落したので以前作成したpiのArduinoベースボードの再作成に着手してみました。

今回は別体だったKit Scopeをオンボードに、またESP32,8266もArduinoつながりということでアダプタ(シールド)を作成して利用できるようにしてみたいと思います。

回路図(PDF)


ベースのデバイスはAVR328P
ESP-WROOM-02はアダプタ(シールド)として実装します。
ESPの周辺回路はアダプタ側に実装、ベースボードには新たにDTR,RTS信号用としてピンソケットを設けています。
BUILTIN LEDはGPIO5,GPIO16にしています。

Kit Scope

Kit Scopeは以前作成した回路ですがusbシリアル変換モジュールはcp2102に変更しています。
GND共通以外は独立した5V仕様となっています。

Kit Scopeの電源を自由に入り切りしようと思ったのですが以前作成したcp2102の回路に誤りがありました。
0Ωの抵抗が5V出力側に入っていますね。
したがってモジュールを含めて電源を切ることは難しくなります。
やむを得ないのでスイッチ付きUSBケーブルを作成することにしました。


基板用スライドスイッチをユニバーサル基板を切って取り付け中華コネクタに押し込んでいます。
少しはみ出していますがまあOKでしょう。VCC(5V)をON-OFFしています。
ケーブルは細めで接着しておきます。カバーは割れやすいので注意(無理に入れないでカバーの外に接着してもいいかな?)
これで任意にデバイスナンバーを合わせ込むことができます。

ベースボード


以前のベースボード(70x50mm)+Kit Scopeと今回のベースボード
基板は80x60mm Piより一回り小さい
usbシリアル変換モジュールはやはりcp2102を採用しています。
メインのモジュール(電源)もスライドスイッチでON-OFF可
Piは通電したままアダプタ(シールド)類の交換は可能です。
Piのパワースイッチもオンボードに組み入れたのですっきりしました。

ESPアダプタ

ピッチ変換したESP-WROOM-02はこの基板に取り付けます。
AVRのピンから必要な電源、信号を貰います。
自動プログラムなど必要な回路はこの基板に組みます。
切り込み部にKit Scope端子の照明用LEDを入れてみたのですがあまり効果がありませんでした。!

ESP32アダプタ

これでESP-WROOM-02が正常に認識できればESP-WROOM-32も動きます。Pi用として新たに作成しました。
ただ動かすだけなら電源(3V3,GND) 信号線(TXD,RXD) 自動プログラム(DTR,RTS)の6本をつなぎ込むだけでいいのですがピンアサイン通りに並べ替えるとなると少々骨が折れます。

完成


これまで作成したAVRモジュールは今までどおり装着可能です。


ESPアダプタとそれにESP-WROOM-02そしてESP-WROOM-32を取り付けたところ


linuxgpioもOKです
高さはギリギリディスプレイの邪魔にならないところに収まっています。
簡単な実験はこのまま実行可能と思います。


作り直すきっかけとなったのはやはりPi+Kit Scopeですね。
仕様上限度があるとはいえ簡易な波形確認や電圧チェックなどは思い立ったらブレッドボードのワイヤー1本でいつでも可能という簡易さがたまりません。
まだ十分に使いこなしてはいませんがかなり実用になると思っています。(Kyutechさんありがとう)

おまけ

usbシリアル変換モジュールも余ってきたしちょうど半分に切ったユニバーサル基板があったのでESP-WROOM-02用ボードを作ってみました。
回路は以前作成したものと基本同じですがレギュレーターにNJU7223DL1-33(0.5A)を使っています。
抵抗、コンデンサ、スイッチ、チップTRなどすべてジャンク基板から流用しています。
モジュールは別ですが新品部品は基板半分とピンソケットのみでコストとしては50円もかかっていません。モジュールが1個しかないのにという声もありますが手配はしているのできっと役にたつと思います。

Raspberry Pi ESP32,ESP8266開発環境(PlatformIO)

PlatformIOは組み込み系によく使われるクロスコンパイル環境です。特にESPシリーズに限った訳では無いのですが前回からの流れとした内容になっています。

Raspberry Pi + Arduino IDEは非力なpiにとっては起動に時間がかかったり動作も重く感じてしまいます。その点PlatformIOはCLIで開発が可能でArduino IDEと使い分けることによりかなり快適な環境を構築することが可能になるものと思います。

PlatformIOの特長としてライブラリやコンパイラは必要に応じて自動でダウンロードしてくれます。
当サイトで試してみるとESP32も問題なくコンパイル、書き込みも実行してくれます。
そこでコンパイラは?ということで調べると~/.platformio/以下に必要なものがダウンロードされています。コンパイラは~/.platformio/packages/toolchain-xtensa32にあります。
やはりxtensa-esp32-elfが使われています。
Arduino IDEからこのディレクトリにリンクを張り直してみます。

$ cd ~/Applications/arduino-1.8.5/hardware/espressif/esp32/tools
$ rm xtensa-esp32-elf
$ ln -s ~/.platformio/packages/toolchain-xtensa32 xtensa-esp32-elf

Arduino IDEからも問題無いですね〜。前回は時間を掛けてソースからビルドしましたがpi+Arduino IDEでESP32環境を導入するにはPlatformIOを利用するのが早そうです。

PlatformIOを使ってみる

インストール

$ pip install platformio

実行コマンドは~/.local/binに保存されます。パスが通って無い場合は.bash_profileを作成して登録します。

今回はPlatformIO Coreのみ使用するのでターミナルやエディタは自分の使いやすいものを使用します。

端末にはgnome-terminal
# apt install gnome-terminal
gnome-terminalはシェアNo1とあって今回の目的にはやはり使いやすいと思います。
エディタはGeany raspbianデフォルトでインストール済

作業ディレクトリの作成

$ mkdir -p ~/platformio/project && cd ~/platformio/project

ESP32(ESP-WROOM-32)で試してみる

$ pio boards | grep -i esp32


ボードを選択
この中からモジュールesp32devを選択

arduinoのスケッチ例からSimpleWiFiServerを試してみます。

$ mkdir SimpleWiFiServer && cd SimpleWiFiServer
$ pio init -b esp32dev

platformioコマンドはpioで置き換えできます。実行すると以下のディレクトリ、ファイルが作成されています。

-rw-r--r-- 1 pi pi   21  6月 26 13:52 .gitignore
drwxr-xr-x 3 pi pi 4096  6月 26 15:28 .pioenvs/
-rw-r--r-- 1 pi pi 1553  6月 26 13:52 .travis.yml
drwxr-xr-x 2 pi pi 4096  6月 26 13:52 lib/
-rw-r--r-- 1 pi pi  485  6月 26 14:00 platformio.ini
drwxr-xr-x 2 pi pi 4096  6月 26 15:28 src/

platformio.iniの編集

[env:esp32dev]
platform = espressif32
board = esp32dev
framework = arduino
upload_speed = 1500000
upload_port = /dev/ttyUSB2

upload_speedを追記しています。
usbシリアル接続がttyUSB0以外の時はupload_portの指定が必要です。

arduino IDEからスケッチ開いてファイルを保存、SimpleWiFiServer.inoをsrc以下にコピー

以上で準備が整いました。
ESP-WROOM-32にuploadしてみます。

$ pio run -t upload


Arduino IDEと比べると小気味よくかなり早い印象を受けます。

やはりpiにはコマンドラインが似合います。


ブラウザからも正常にLチカOKですね。


シリアル接続はターミナルから
$ pio device monitor -p /dev/ttyUSB2 -b 115200

ESP8266(ESP-WROOM-02)で試してみる

ESP8266では以前作成したwebサーバーのスケッチを使用します。

$ pio boards | grep -i esp8266


モジュールESP-WROOM-02があります。

$ cd ~/platformio/project && cd ~/platformio/project
$ mkdir esp8266 && cd esp8266
$ pio init -b esp_wroom_02

作成したesp8266.inoをsrc/にライブラリNTP,Timeをlib/にコピー
まずはシリアル接続でuploadします。
platformio.ini (シリアル接続)

[env:esp_wroom_02]
platform = espressif8266
board = esp_wroom_02
framework = arduino
upload_speed = 961200
upload_port = /dev/ttyUSB2
$ pio run -t upload


シリアル upload OK
作成したesp8266.inoにはOTA,SPIFFSが含まれています。
以降はOTAでアップロードが可能になります。

OTA upload
platformio.ini (OTA)

[env:esp_wroom_02]
platform = espressif8266
board = esp_wroom_02
framework = arduino
upload_speed = 961200
;upload_port = /dev/ttyUSB2
upload_port = 192.168.0.225
$ pio run -t upload


OTA upload OK
upload_port = /dev/ttyUSB2はコメントアウト

data upload
platformio.ini (OTA data)
index.html,画像ファイルはsrc/dataにコピー

[env:esp_wroom_02]
platform = espressif8266
board = esp_wroom_02
framework = arduino
upload_speed = 961200
;upload_port = /dev/ttyUSB2
upload_port = 192.168.0.225

[platformio]
data_dir = src/data
$ pio run -t uploadfs


ファイルシステムのアップロードはuploadfsです。dataファイルのみアップロードします

再度シリアル接続でアップロードするには追記した(OTA data)設定をコメントアウトする必要があります。

当面、基本はarduinoのスケッチを利用することになると思いますがうまく使い分けることでRaspberry Pi + PlatformIOはかなり快適な開発環境になると思います。

Raspberry Pi ESP32開発環境(ESP-IDF - Arduino IDE)

Raspberry PiにArduino core for the ESP32を導入してもコンパイル時にxtensa-esp32-elf-xxxが無いよと怒られて失敗してしまいます。
Arduino core for the ESP32導入時get.py(windowsではget.exe)を実行してもxtensa-esp32-elfがダウンロードされません。これはARM用のバイナリが配布されていないことに起因します。
最新のxtensa-esp32-elfを導入するためにはcrosstool-NG,toolchainをコンパイル、インストールする必要があるようです。
xtensa-esp32-elfはESP-IDFでも使われており折角なのでまずはESP-IDF環境を構築してみました。

Raspberry PiのESP-IDF導入については下記の記事があるのでそのまま実行させてもらいました。
RaspberryPiでESP-WROOM-32開発環境の構築

作業マシンはraspberry pi3

ESP-IDF環境

必要なパッケージ

git wget make libncurses5-dev flex bison gperf python python-serial
gawk gperf grep gettext python python-dev automake bison flex texinfo help2man libtool libtool-bin

以上から当サイトのPiに未インストールの以下のパッケージをインストールしました。
インストール済のパッケージはdpkg -l | grep パッケージ名で調べます。インストール済でもパスされるだけですが。

# apt install gperf libncurses5-dev libtool-bin texinfo help2man

crosstool-NG
作業ディレクトリ ~/esp

$ mkdir ~/esp
$ cd ~/esp
$ git clone -b xtensa-1.22.x https://github.com/espressif/crosstool-NG.git
$ cd crosstool-NG
$ ./bootstrap && ./configure --enable-local && make install

toolchain

$ ./ct-ng xtensa-esp32-elf
$ ./ct-ng build
$ chmod -R u+w builds/xtensa-esp32-elf

# ディスク領域は約4GB専有します。充分な空き領域が必要です。
# ビルドには約3時間
# pi3は作業前に再起動して不要なアプリケーションは起動しない

esp-idf

$ cd ~/esp
$ git clone --recursive https://github.com/espressif/esp-idf.git

# esp-idf本体はダウンロードするだけ(約300MB)

.basrcに追記

export IDF_PATH=$HOME/esp/esp-idf

$ source ~/.bashrc

確認、実行
参考記事ではHello Worldを実行しているので当サイトではblinkを実行してみたいと思います。

$ cd ~/esp
$ mkdir esp-idf_sample && cd esp-idf_sample
$ cp -r ~/esp/esp-idf/examples/get-started/blink ./
$ cd blink

デフォルトのビルトインLEDはGPIO5になっているようです。当サイトではGPIO2に接続しているので./main/blink.cを編集します。

// #define BLINK_GPIO CONFIG_BLINK_GPIO
#define BLINK_GPIO 2


$ make menuconfig
デフォルトのシリアルポートは/dev/ttyUSB0になっているはずです。変更したい場合はこの画面から変更します。
変更したら Save -> Exit -> Exit
ほかにもいろいろ設定項目が有りますが取り敢えずデフォルトのままでもOK

それでは実行してみます。初回のコンパイルは少し時間がかかります。(下記は最後の書き込み部分だけ)書き込みはesptool.pyが使われています。

$ make flash
Flashing binaries to serial port /dev/ttyUSB0 (app at offset 0x10000)...
esptool.py v2.3.1
Connecting....
Chip is ESP32D0WDQ6 (revision 1)
Features: WiFi, BT, Dual Core
Uploading stub...
Running stub...
Stub running...
Changing baud rate to 921600
Changed.
Configuring flash size...
Auto-detected Flash size: 4MB
Flash params set to 0x0220
Compressed 20768 bytes to 12244...
Wrote 20768 bytes (12244 compressed) at 0x00001000 in 0.2 seconds (effective 904.0 kbit/s)...
Hash of data verified.
Compressed 144480 bytes to 70284...
Wrote 144480 bytes (70284 compressed) at 0x00010000 in 1.4 seconds (effective 807.8 kbit/s)...
Hash of data verified.
Compressed 3072 bytes to 103...
Wrote 3072 bytes (103 compressed) at 0x00008000 in 0.0 seconds (effective 4677.6 kbit/s)...
Hash of data verified.
Leaving...
Hard resetting via RTS pin...

LチカOKですね。xtensa-esp32-elfも正常にインストールされています。

Arduino IDE環境

ESP-IDFと比べると一般的にはarduino環境が使いやすいと思います。
xtensa-esp32-elfが正常にインストール、実行できればディレクトリの階層が少々違うだけでwindowsなどとほぼ同様の方法で導入できます。

現時点ではボードマネージャからはインストールできないのでArduino IDE本体に直接組み込むことになります。
Arduino IDEは~/Applications/arduino-1.8.5にあるものとします。
まずは適当なディレクトリで

$ git clone https://github.com/espressif/arduino-esp32
$ unzip arduino-esp32-master.zip
$ mkdir -p ~/Applications/arduino-1.8.5/hardware/espressif/esp32
$ cd arduino-esp32-master
$ cp -rp * ~/Applications/arduino-1.8.5/hardware/espressif/esp32
$ cd ~/Applications/arduino-1.8.5/hardware/espressif/esp32/tools
$ python get.py

get.py(get.exe)した時点でlinux(win)はxtensa-esp32-elfを導入してくれるのですがpiには無いので先にビルドしたxtensa-esp32-elfにリンクを貼ってやります。

$ ln -s ~/esp/crosstool-NG/builds/xtensa-esp32-elf

ディスクの無駄ですがxtensa-esp32-elfディレクトリをコピーしてもOK(約140M)

ここでArduino IDEを起動

esp32関連のボードがずら〜と並びます。

ESP32 BLE for Arduinoの導入

Arduino core for ESP32にはBLE関連のライブラリが入っていません。
ESP32 BLE for ArduinoのページからDownload ZIPしておきます。

$ unzip ESP32_BLE_Arduino-af865a916795289c8e7e09b091ff2140c33fc3fe.zip
$ cd ESP32_BLE_Arduino-af865a916795289c8e7e09b091ff2140c33fc3fe/
$ cp * ~/Applications/arduino-1.8.5/hardware/espressif/esp32/libraries/BLE

実行してみる
スケッチ例から01.Basics – Blinkを書き込んでみます

LED_BUILTIN関数は使えないので2(GPIO2)を指定しています。

下側のウインドウを見てわかる通りコンパイルにはxtensa-esp32-elfが使われています。

ライブラリに関しては8266と比べるとまだこれからといったところでしょうか。

cp2102のUpload Speedも1.5M OKです。

ESP32(ESP-WROOM-32)開発シールドの作成

市販の開発ボードは安価なものもあり通常は既製品を購入することになると思います。
ボードを自作する理由はいくつか有りますが敢えて挙げると市販のボードはハード的な面ではほとんど手を入れることができない、入れる必要もないといったところでしょうか。工作好きの人ならわかってくれるでしょうか!?

そんな訳で今回はこれまでのESP8266ベースボードを利用してESP32の開発シールドを作成してみたいと思います。

参考サイト ESP-WROOM-32

回路図 esp32(pdf)


回路図はベースボードを利用する上でのesp-wroom-02とesp-wroom-32の関係です。
esp-wroom-32の動作に最低限必要なものは電源と3(EN)のプルアップ。
シリアルモジュールからTXD,RXD信号、DTR,RTS(自動プログラム)
ビルトインLEDとしてIO2.IO16を繋いでいます。
コンデンサは適当に変換基板で。


ESP-WROOM-32とピッチ変換基板はAliで入手しました。安いところ(セール中)で380円位(送料無料)、変換基板は2枚購入して1枚あたり100円位(送料込)
この変換基板コンパクトなところはいいのですがピンレイアウトがわかりにくいのでモジュールのピンアサインに合わせてピンソケットに繋ぎ込んでやります。
使用不可のピン(17〜22)は無視、個人的にはモジュール通りのレイアウトが一番使いやすいと思っています。

変換基板へのはんだ付けは0.8mmのはんだを使ったせいかうまく熱が通る感覚を掴めませんでしたがなんとか付いたようです。次は0.6mmのはんだを用意してチャレンジしようと思います。

ESP-WROOM-32用ミニブレッドボードシールドを作成してみました。ロングのピンヘッダを干渉しない程度にカットしています。

火を入れる前に入念に配線チェックをします。電源ライン、各ピンの接続、隣接ピン同士のショートの有無、OKだったら電源のみ接続して変換基板の電源ピンで電圧チェック。モジュールを差し込んで再度電源を投入します。

確認、バックアップ

$ esptool.py -p /dev/ttyUSB0 -b 921600 chip_id
esptool.py v2.3.1
Connecting....
Detecting chip type... ESP32
Chip is ESP32D0WDQ6 (revision 1)
Features: WiFi, BT, Dual Core
Uploading stub...
Running stub...
Stub running...
Changing baud rate to 921600
Changed.
Chip ID: 0x8930aea44167
Hard resetting via RTS pin...
$ esptool.py -p /dev/ttyUSB0 -b 921600 flash_id
esptool.py v2.3.1
Connecting.....
Detecting chip type... ESP32
Chip is ESP32D0WDQ6 (revision 1)
Features: WiFi, BT, Dual Core
Uploading stub...
Running stub...
Stub running...
Changing baud rate to 921600
Changed.
Manufacturer: c8
Device: 4016
Detected flash size: 4MB
Hard resetting via RTS pin...
$ esptool.py -p /dev/ttyUSB0 -b 921600 read_mac
esptool.py v2.3.1
Connecting....
Detecting chip type... ESP32
Chip is ESP32D0WDQ6 (revision 1)
Features: WiFi, BT, Dual Core
Uploading stub...
Running stub...
Stub running...
Changing baud rate to 921600
Changed.
MAC: 30:ae:a4:41:67:14
Hard resetting via RTS pin...

ここで”はい、ちょっと待って!”を実行(ファームウェアのバックアップ)
baud 921600では反応が無いですね。(Pi直ポート、ショートケーブルでもダメ)
成功時は即%表示が帰ってきます。baud 460800ではOKでした。

$ esptool.py -p /dev/ttyUSB0 -b 460800 read_flash 0 0x400000 esp32_firmware.bin
esptool.py v2.3.1
Connecting....
Detecting chip type... ESP32
Chip is ESP32D0WDQ6 (revision 1)
Features: WiFi, BT, Dual Core
Uploading stub...
Running stub...
Stub running...
Changing baud rate to 460800
Changed.
4194304 (100 %)
4194304 (100 %)
Read 4194304 bytes at 0x0 in 100.7 seconds (333.1 kbit/s)...
Hard resetting via RTS pin...

$ ls -l esp32_firmware.bin
-rw-r--r-- 1 pi pi 4194304  6月 21 19:44 esp32_firmware.bin

書き戻しは以下の通りでできると思いますが実行確認はしていません。

$ esptool.py -p /dev/ttyUSB0 -b 460800 write_flash 0 esp32_firmware.bin

次回はRaspberry PiへESP32開発環境をインストールしていきたいと思います。

cp2102 usb-シリアル変換モジュール (RTS有り)

今回新たにcp2102 usb-シリアル変換モジュールを入手しました。やはりAliから$1.08(送料無料)と100均感覚で手に入ります。
以前のmicro usb版はRTS端子が引き出されていませんでしたがこのタイプはcp2102の全信号が取り出せます。
やはり自動プログラムが動かないと不便なのでRTS端子のあるこのモジュールを使ってみたいと思います。


こちらもICの型番等が一切ないですね。敢えて消しているというよりはコストの関係からプリント工程を省いているようにも思えます?

回路は大体こんな感じになっていると思います。

回路や定数はmicro usb版と比べるとまともに見えます。


このままでは使いにくいので余計なものは取り外します。
USBコネクタは簡単に取れないので裏面にはんだを盛って無理やり(壊さない程度に)引き起こす方向に押すなり引くなりして隙間を作ります。隙間ができたら半田ごてを当てながらドライバーなどでこじって少しづつ抜いていきます。
ホールに残ったはんだは吸い取り線で取るか吸い取り線でも取れない時は少し新しいハンダを盛って充分に熱を当て手に持ったまま素早く机の上でパン!と叩いて反動ではんだを飛ばします。(技ありです)


USBコネクタのD-D+のピッチは変則的ですがピンヘッダを少し曲げてやると付きます。
標準の信号線以外は必要なRST端子側のみピンヘッダを取り付け、ベース基板に合わせて信号線を繋ぎ込みます。
当初のCH340基板を少し広めにとっていたこともあってピッタリ収まりました。

結果は自動プログラムOK、UploadSpeed 921600もOKでした。

さてcp2102ですがこちらのページESP-WROOM-32には1.5M (1500000) baud で転送できるとあります。

esptoolで確認してみましょう。

1.2M(1200000) OK
1.5M(1500000) OK
この他にいくつかの値で試してみましたが1.56M(1560000)がたまたま通っただけでこれ以外の数値ではエラーになってしまいました。またOSによっても通る値に違いがありそうです。
どんな計算か理解できていないのですが1.2Mと1.5Mではいけそうです。

boards.txtの編集

~/.arduino15/packages/esp8266/hardware/esp8266/2.4.1/boards.txt

generic.menu.UploadSpeed.1500000=1500000
generic.menu.UploadSpeed.1500000.upload.speed=1500000
generic.menu.UploadSpeed.1200000=1200000
generic.menu.UploadSpeed.1200000.upload.speed=1200000

以上をUploadSpeed欄に追記IDEを再起動

1.5Mで問題なく書き込みできますね。
但しUSBポートはPIに直挿しケーブルは短いケーブルじゃ無いとエラーが出そうです。

このcp2102モジュールなかなかいいのでまた1個ポチってしまいました。

ESP8266の環境も大体できたので次は遅ればせながらESP32の環境構築に一気に突入してみたいと思います。

Top