ラベル esp-idf の投稿を表示しています。 すべての投稿を表示
ラベル esp-idf の投稿を表示しています。 すべての投稿を表示

2018年10月25日木曜日

ESP-IDF+Arduinoで書いたプログラムをバイナリ配布する


LGPLなライブラリを使用している場合、当該ライブラリが静的リンクなら製品のソースを配布しなければならない等いろいろありますが、少なくともArduino coreを使用している場合には、ユーザ自身の環境でビルドしてライブラリのバージョンアップなどに対応できるようになっていればソース公開の必要はないとされています(※下記FAQの記載ですが実際に利用する際には弁護士などに確認してください)。

個人の開発であれば、面倒なのでgithubでソース公開しちゃえば良いのですが、企業での製品開発だとソース公開ができない場合も多いです。

そこでESP-IDFを利用している場合に製品のバイナリだけ配布する方法を調べてみました。試行錯誤でずいぶん手間取ってしまったのですが…結果としてはとても簡単です。コンポーネントはlib〜.aとしてまとめられるので、これをcomponent.mkで指定してmakeするだけです。通常はlibmain.aですが、componentsに自身で書いたコードが置いているときには、lib+コンポーネント名のlibができます。

  1. esp-idfでmake
  2. build/main下にあるlibmain.aをプロジェクトディレクトリに移動
  3. その他の自作コンポーネントがあれば同様にlib〜.aを移動
  4. main下のcomponent.mkに
    COMPONENT_ADD_LDFLAGS := libmain.a
    を追加する。他の自作コンポーネントがあればスペース区切りで列挙
  5. main下および自作コンポーネントのソース(.c, .cpp, .h)を消す
  6. buildディレクトリなど不要な要素を消す

これだけです。makeでビルドできるはずです。ビルドが確認できたら、component.mkへの追加事項などビルドに必要な情報を記載したreadmeとlib〜aを配布すれば、ライセンス要件をカバーできます(くれぐれも弁護士さんに確認してから実施することをおすすめします)。

ライブラリを追加すれば良いのはわかっていたのですが、COMPONENT_ADD_LDFLAGSで追加するという方法を見つけるまでさんざん苦労しました…お役に立てば幸いです。

2018年8月22日水曜日

ESP-IDF 3.2で一度WiFi接続に失敗すると二度と接続できない

という現象が出てしまい、頭を抱えてました。
  • v3.2で一度WiFi接続に失敗するとそのボードは二度と WiFiに接続できない。ただし、一度3.0で接続した直後は正しいStationには接続できる。
  • v3.0ではこの現象はでない
  • v3.2でもごく単純なアプリでは出ないが、複数threadにまたがって処理するような規模のアプリで出る。
というWiFiマイコンESP32にとっては致命的な現象。そのSSIDが確かに存在しているのにエラーとして「WL_NO_SSID_AVAIL」が返ってくる、というのが特徴です。

ArdunoをESP-IDFのコンポーネントとして使っていて、WiFi接続にはArduinoのWiFiクラスを使っている、というのが影響しているのでしょうか。

結果として、以下のコードで解決しました。失敗したらesp_wifi_restore()を実行する、だけです。

ググって、同様のエラーにハマっている人がいましたが、どうも解決できていないようでしたので、記事にまとめました。I'm sorry this message is in Japanese, but I hope my sample code below may help you!

2017年9月1日金曜日

ESP32でI2Sから音を出す

Kickstarterプロジェクトで使ったI2Sに関するメモ

■内蔵DAC, PDM, 外付けI2S■

esp-idfのexample/peripheral/i2sにサンプル入ってますけど、これ動きました?

DAC, PDM, I2S、いずれも苦労しました。DACとI2Sは符号付き整数、PDMだけ符号なし整数でデータの塊を作ってi2s_write_bytesに渡しますが、i2s_driver_installへのパラメータが試行錯誤の山でした。

PDMはやたら音が歪んでしまい、パラメータをいじりまくったのですが改善しないのでギブアップしました。正弦波を出して第二高周波が-10dBも出ているのは辛いです。DACは素直に入れた通りの波形が出てきます(あたりまえですが)。

で、I2Sに関しては、MAX98357Aを接続し、最終的に以下のコードで動きました。なお、MAX98357Aはモノラルなので、データは符号付き16ビット整数をみっちり詰め込んで渡します。




■(追記)続編です■

再生の途中で中断したい場合の処理を追加しました。

2017年3月18日土曜日

ESP32開発ボードをMacで


シリコンラボのUSBシリアルドライバが必要です。ああこのUSBシリアルのドライバがまともに作られていますように(祈

ESP32開発ボードを繋いでからターミナルで ls /dev/tty.SLAB* とタイプして /dev/tty.SLAB_USBtoUART と出てくればOKです。出なかったら再起動してみましょう。macOS Sierraは出来が悪くて困ったもんです。

■まずBASICで遊ぶ■

IO12をプルアップしてリセットするとBASICモードになります。ESP32開発ボードのようにブレッドボードに差しにくくかつ最初からピンヘッダーがついているボードでちょっとプルアップする場合、「抵抗入りジャンパーワイヤー」を作っておくと便利です。

ともかくIO12と3v3を数KΩの抵抗でつないでから、USBを接続します。ターミナル.appで screen /dev/tty.SLAB_USBtoUART 115200 とターミナルコマンドを起動します。滝のようにbootメッセージが出てビビりますが、ここでenterキーを押します。すると
Falling back to built-in command interpreter.
OK
>
>

となります。 print 10+10<enter>で

OK
>
>print 10+10
20

こうです。おお懐かしい。

昔、TRS-80だったかPC-8001ではfor nextループ1000回で1-2秒だったと思います。今時の240Mhz CPUはどんなもんかと思ったら

>list
10 FOR I=1 TO 100000
20 NEXT I
OK
>run
OK
>

100,000まで2秒でした。クロック比通りですね。deleteキー効かないし、細かい関数とかがどういう実装になっているか知らないし、まぁ、あとでまたゆっくり遊ぶことにします。うーむ、BASICは私が調べ物なしに書ける唯一の言語かもしれないorz

screenから抜けるにはctrl+Aを押してからKyです。プルアップ抵抗の回路は外しておきましょう。

■ESP-IDF■

せっかくのdual core、ArduinoじゃもったいないのでここはESP-IDFでいきます。ターミナルでの作業です。もうここにある通り。

なお、Step 0のInstall pyserialのところ sudo pip install pyserial で黄色い字でエラーメッセージっぽいのが出た場合には sudo -H pip install pyserialでどぞ。

Step 1でパスを追加していますが、ついでにStep 4に出てくる export IDF_PATH=~/esp/esp-idf も追加しておきます。

Step 1のあとに書いてあるAlternative Step 1は飛ばして、Step 2まで。Step 3ではテンプレートをmyappって名前のディレクトリ作ってダウンロードしていますが、ここで作られるテンプレートはwifi接続するやつなのでwifiの設定などがめんどくさいので、既成のLチカで試します。cd ~/esp/esp-idf/examples/get-started/blinkでディレクトリを移動します。ここのmain/blink.cがソースです。

Step 4のmakeconfigではSerial flasher config > Default serial portにさっきのシリアルポート名 /dev/tty.SLAB_USBtoUART を設定し、ついでDefault baud rateを912600にします。blink.cを読むと、make manuconfigでGPIOポートを指定できる、と書いてあるので、Example Configuration > Blink GPIO numberを見てみると5になっています。

ので、GPIO5 ▶ LEDのアノード(長い方)、LEDのカソード(短い方)▶ 抵抗(200-2kΩぐらい) ▶ GNDと接続します。

お待たせしました。make flashでbuild & flash & runです。

ゆっくりLEDが点灯すれば出来上がりです。コマンド一発でbuild & flashできるのはいいですね。

さて、何を作ろうか。