2024年4月
  1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30        
無料ブログはココログ

ESP32 Builtin Basic を期待して衝動買い

何気にAmazonでマイコンボードを検索していたら、以下のお買い得品を見つけました。
ESP32開発ボードに、IO拡張ボードもついて、何と1180円。
Amazonの取り扱い開始が2018/1/8だし、古くて売れず、安売りみたいな感じかな。

Amazon | waves NodeMCU-32 デュアルコア 開発ボード ESP32 WiFi Bluetooth Type-C ワイドバージョン I/O拡張ボード 付き | waves | マザーボード 通販

Photo_20240423194601

レビューを見ていると、古いチップのため、EN端子とGND間に1uFを付けると書き込みが安定するとか、書き込み時はBOOTを押しながらとか記載があります。ESP32を調べ始めた頃にはそんな記事を幾つか見ていたので、古いチップならもしかしてBuiltinBasicが走るかもしれないとの期待が高まりました。2018年度頃のレビューが見当たらないのが少し気になりますけど、まあいいや。
もしダメでも、拡張ボード(後で良く見たら30ピン、少し後悔。本体単体だと1080円だから、おまけだと思う事にします)が手に入るだけでも、まあお買い得だろうと自分を納得させ、衝動買い。

帰宅してから、モジュールの写真をチェック、BuiltinBasicが走っていた古いものと、刻印がほぼ同じ。これは期待できるかも。
アマゾンプライム対象商品なので、明日到着予定。
なんか、ワクワクしてます。


ちなみに、上記のアマゾンの商品紹介のモジュール部分の拡大写真が以下。
Photo_20240423195201

BuiltinBasicの記事の載っているESP32-WROOM-32 (ht-deko.com)の、esp32_rev.jpg (1200×900) (ht-deko.com)と見比べると、ESP-WROOM-32 Rev.1(以下) とそっくりです。文字・記号の配置が若干小さいようですが、文字・記号そのものは全く同じ。
Photo_20240423195501


もし、BuiltinBasicが走ったら、幾つかの方法でGPIOのトグルをさせ、波形を見て速度の比較でもしてみようと思います。
Easter Egg of ESP32 | macsbug (wordpress.com) を参考に、レジスタ書き込みの場合、IOSETの場合と、豊四季TinyBasicの場合で、どの程度違うのかとか。

 

続報あったらまた。

 

2024年4月19日 (金)

ESP32開発ボード用に830穴ブレッドボードをカット

前回、400穴ブレッドボードを半分に切り、ESP32開発ボードを使い易くしましたが、小さいので多くの部品が載る余裕がありません。

今回は、以前買ったブレッドボードセットの830穴ブレッドボードが2枚まだ余っているので、新たにカットしてみました。
製作では、金鋸も紙やすりも使わず、プラスチックカッターを使ったので、細かい切りカスや削りカスもなく、綺麗に仕上がりました。
また、裏面の両面テープはカットする部分だけ切り取るだけにしたので、全体の製作作業効率も上がりました。

今回製作の830穴幅広化ブレッドボード(右)と、前回製作の400穴幅広化ブレッドボード(左)。
Img_0261


以下、詳細手順です。

1、カットに使った830穴ブレッドボード2枚です。
  Img_0251

2、カットする中央溝部分の裏面の両面テープをカッターで切り取ります。
  土台に張り付ける前に、両面テープを剥がすと、ベタベタくっ付くし、すごく伸びて簡単に変形するので、作業効率激減、きっと後悔します。
  Img_0252

3、表の穴をセロハンテープで覆って塞ぎます。右がセロハンテープを貼った様子。左は貼る前。
  Img_0253

4、プラスチックカッターで、表の溝の中をカットしていきます。プラスチックを掘る感じの糸状の切りカスが出ます。
  最初の数回は定規を当てました。
  Img_0254_20240419175201
  Img_0257

5、力加減にもよりますが、5回程度カットするだけで、部分的には切れ目が裏に達し、既に折れ気味。
  向こう側も見えます。裏面の数か所にある厚いプラ材部分は、裏からカッターでカット。
  Img_0255_20240419175201

6、更にカッターで切り込んでいき、最後は指でパキット折ります。

7、切断面の凸部をカッターで切り取り平坦にします。プラスチックが柔らめで、割れる感じもなく、簡単にカッター薄く切り取れます。
  Img_0256
  紙やすりだと割と時間がかかりるし、細かい削りカスが飛び散り片付けが少し大変。
  カッターなら切り口は平坦ですし、手加減だけでスムーズに切り取れ、面状の切りカスは掃除も楽です。

8、カット後切断面を平坦に整え、穴の保護のセロハンテープを剥がした、2枚分のブレッドボードです。
  Img_0258

9、現物合わせのためブレッドボードにはESP32ボードを刺し、適当なプラ板を土台にして貼り付けます。
  Img_0259

10、裏面の両面テープの保護シートを剥がし、土台のプラ板に張り付け、完成です。
  真ん中の溝は、穴に刺したESP32ボードの取り外しの際の、指を入れるスペースにできます。
  Img_0260

 

まとめ
830穴ブレッドボードをカットし、幅広ブレッドボードが出来ました。
今回は作業効率良く、切り口も綺麗に製作できました。
1000ミルのESP32ボードを載せても、7割程度の穴が自由に使えますし、多少部品が多くなっても大丈夫でしょう。
アマゾンなら1枚200円程度で830ブレッドボードが買えますし、カットすれば使い易くなるので、私はこれで十分です。
もし、幅の狭いマイコンボード(例えばArduino NANOは600ミルらしい)を使いたい場合は、土台板から剥がして付け直せば良いので、幅の可変性・穴利用効率・コスパが向上しました。


気になって、J-PlatPatで「ブレッドボード」で四法全てで簡易検索、計54件ヒット。「ブレッド・ボード」だと0件。
しかも、いろいろありますが、拒絶や却下が多いですし、中身見ると可変幅ブレッドボード等見当たりません。
30年位前にも、今と同じブレッドボードを買っていたので、今回の様な活用事例や加工例は、昔からある工夫の一つなのでしょう。

今頃思いつくのは、普通に売っているブレッドボード2枚を使い、電源部分を外して、適当な間隔で並べれば、ほぼ同じものが出来る事。
これなら、裏面の両面テープを切って、電源部分と分離して、並べるだけで面倒な加工は不要。
部品がもっと増えても、余裕のボードに出来ますね。中央の空間が広く開くので、追加で電源部分も置けそう(下図)。
Photo_20240419203301

部品をたくさん使うケースが出てきたら、考えようかな。
買ったアルティメットスターターキットには部品が沢山あるので、今後実験で試してみたい部品を適当に並べておいて、後から配線だけ変え、いろいろ出来る、「いろいろ実験トレーニングボード」でも良いかな。


 

続報あったらまた。

 

2024年4月16日 (火)

Arduino ESP32 ライブラリの不用意なバージョンアップは危ないかも

TinyBasicの拡張をやっている際に、最新APIライブラリの説明と、実際にArduino IDEでコンパイルに使っているバージョンに差がある事が分かったため、少し調べてみました。

Arduino ESP32 の最新APIライブラリの説明を参照すると、ledcAttachや、ledcAttachChannelがあります。
 でも私のArduino IDEの環境では、エラーが出てしまい実際には使えませんでした。
 ledcSetupやledcAttachPinの記載はないものの、こちらの方は問題なく使えたため、コード記述・コンパイルに使いました。

Arduino ESP32 APIの更新情報には、2.Xから3.0への更新の際の差分として、LEDCだけでも以下の記載があります。
 破壊的な更新( breaking changes )として、大々的に変わってしまう様で、詳細なマイグレーションガイドも書かれています。
 Photo_20240415154901
 
正直、こんなに変わってしまって、いいの? って感じです。困ってしまう人が続出しそう。危ない危ない!

・自分のArduino IDEで使っているライブラリは最新のはずだと思っていますが、アップデートの仕組みや仕方が良く分かっていません。
一応、Arduino IDEのボードマネージャーでは、esp32 by Espressif Systemsが2.0.15(プルダウンメニューの最上位)をインストール済み。ボードじゃなくて、ライブラリマネージャーを開いても、それらしき項目を見つけきれません。
 Photo_20240415161601_20240417164601

・気になるのは、今後最新のものに勝手にアップデートがかかってしまうと、コンパイルでエラーが出てしまう点です。
 その場合は3.0ではなく、2.Xに戻せばOKのはずなんだろうとは思います。
 まだライブラリを戻すとかやった事がないので、必要になった時に改めてやり方を調べる予定。
 複数のバージョンを共存させる方法もありそうです。
 └esp32-arduinoの複数バージョンを共存させる | Lang-ship

・もし、不用意にアップデートすると、下の記事の様に余計な手間がかかるみたいで、それはそれで危険そうですしね。
 └[ESP32]Arduino core for the ESP32のバージョンを上げると動作しなくなったことについて | farmsoft
 └Arduino IDE ESP32ボードのバージョンアップに伴うTimerCameraライブラリの変更内容 - MSR合同会社 (msr-r.net)

・どうもライブラリがリリースが公開されるのは、GitHubの様です。
 GitHub - espressif/arduino-esp32: Arduino core for the ESP32 を開くと、画面右下の方に、Releases (53)と言うところがあり、
 そこに Arduino Release v2.0.15 based o... (Latest)とあり、ボードマネージャーで見た、
 esp32 by Espressif Systemsの2.0.15 と一致しています。
 Photo_20240416195601
 上記赤丸部分を拡大したのが以下。
 Photo_20240416193801
 上記の(Latest)をクリックすると、Arduino Release v2.0.15の説明画面に飛び、こちらにも右端には(Latest)とあります。
  Photo_20240416194001

 + 52 releases をクリックしたら、v3.0.0が出てきました。但し(Latest)ではなく、右端は(Pre-release)になっています。
 Photo_20240416194201
 開発環境ESP-IDFのv5.1に合わせた、ライブラリアップデートの様ですが、まだ先行リリースの段階の様です。
 なので、ライブラリが勝手にアップデートされる事はないのでしょうね。


いろいろと調べると、Espressif社の公式な開発環境は、ESP IDFの方であり、Arduino IDEは有志により開発されているらしい事も分かってきました。どうりでコントリビューターのアイコンが沢山並んでいます。

まだ、v3.0.0は(Pre-release)なので、Arduino IDEで自動ではアップデートされないとしても、今後(Latest)になると、自動アップデートされて、エラーに見舞われアタフタしそうな予感がします。

今後、GitHubのArduino ESP32 ライブラリの情報は、今後もウォッチしておく必要がありそうです。特に下記の右下赤丸部分。
Photo_20240416195601


続報あればまた。

 

2024年4月14日 (日)

ESP32開発ボード用にブレッドボードをカット

先日秋月から、ESP32開発ボードを2枚買ったので、Freenoveの2枚と合わせて、合計4枚あります。

FreenoveのはGPIOエクステンションボード(40pinの開発ボード用)が付属しているので、Freenoveの2枚は余裕でブレッドボードの穴が有効に使え楽で良いです。が、
秋月の38ピンの開発ボード2枚は、予備で買っていた400穴の安いブレッドボードが、5穴タイプのため、ESP32開発ボードの片側1列だけしかピンを刺せる穴がなく、有効に使えません。

ネットで調べると、いろいろ付いたエクステンションボードスリムなエクステンションボードブレークアウトボード等もいろいろありますが、どんどん買い足していくのも考え物だなーとの思いもあり、しっくりこない感じでいました。
ブレッドボードも、サンハヤトのSAD-101なら、6穴タイプなので、少しはましですが、電源/GNDが片側だけ、使いにくそうです。

汎用性とコストを考えて、安いブレッドボードの真ん中をカットして広げて、ESP32開発ボードを載せる程度が、自分に合っていそうかなーと考えながら、先例を探してみたらラジオペンチさんの記事があったので、じゃー俺もって感じでやってみました。

最初に、ブレッドボードの穴と裏面の金属片全体をセロハンテープを貼り、ごみが入らない様に準備。
削りカスが沢山出るのを避けたかったので、全部を金鋸で切ってしまわず、最初にゆっくり慎重に金鋸で1mm深さ程度に削り込み、
その後はカッターで何度も強めに切り込みを入れ、指で曲げながら更にカッターで切り込んでいき、最後は手でパキット折りました。
切り口は紙やすりで平坦にし、最初に貼ったセロハンテープをはがしました。
両面テープで適当なプラ板に張り付けて、完成です。

以下、秋月の開発ボードを載せた様子で、左側がESP32-DevKitC-32E、右側がESP32-DevKitC-VEです。Img_0243

土台を白いプラ板にしたためか、間が空いていても、違和感はそんなにないです。
上下に電源/GNDがありますし、穴も4~5列片側にあるので、小さめのブレッドボードですが、少ない部品点数なら今のところOK。
既にTinyBasicの拡張の検証で使ってます。

まあ、部品点数が多くなる場合は、もっと大きい830穴のブレッドボードの真ん中を切れば、良いかな。
金はかけずに、手間と工夫で頑張るってね。

尚、今回はカットの前にブレッドボードの裏面の両面テープを最初に全部剥がしてしまったので、カット後に貼り付け直す際に、だいぶ手こずりました。剥がした後に金属部分に粘着が残るし、それを剥がすのに手でベタベタ触るし、両面テープは伸縮性があって、ベタベタひっつき、剥がす時も貼る時も、長方形の形が簡単に崩れてしまうんです。次にやるなら、ブレッドボードのカット部分から、両側に1mm程度広めでカッターで切って剥がしておいて、他は貼ったままにして、カットするのが、楽で綺麗に加工出来そうな気がしています。


2024-4-19追記 830穴ブレッドボードのカットもしてみました。

 

続報あればまた。

 

2024年4月12日 (金)

★★★タイニーBASIC GPIO+AnalogIO簡易拡張のプチ改良

E S P 3 2
豊四季タイニーBASIC WiFi Telnet版
GPIO・PWM・ADC・DAC
操作 拡張関数
プチ改良:
PWM高速化・高精度ADC

先日拡張が成功したGPIO+AnalogIO版ですが、以下の点で気になっていました。
・TinyBasicは扱う数値の最大値が32767のため、単純にはPWM出力周波数を32,768Hz以上に出来ない
・ESP32で用意されているキャリブレーションされた、精度の高いanalogReadMilliVolts()関数を取り込んでいなかった
GPIO16,17はWROOMでは使えるものの、非対応としていた。

今回、時間があったので、以下の通りプチ改良してみました。
・PWM出力最大周波数をESP32限界の40MHzまで出せるようにした。
 参考 PWM制御とは?Arduino(ESP32)コマンドで使い方を詳しく紹介 | ロジカラブログ (logikara.blog)
 TinyBasicでは40MHzは直接指定できないので、数値FRQと係数FMLTの2つの引数を記述し、
 その積を出力周波数としuint32_t型に変換して、ledcSetup()関数へ渡すようにした。
・上記に合わせて、分解能RESをESP32の最大値20bitsまでにし、
 最大40MHz Duty50%まで出せ、分解能も最大限細かく設定できるようにした。
・analogReadMilliVolts()に相当する、高精度ADC関数を用意した。
 参考 ESP32のADCでキャリブレーションされた精度の良い電圧値を取得する方法 | kohacraftのblog
・GPIO・PWM操作の対象GPIOに、WROOMで利用可能な、GPIO16,17を加えた

一応、PWMの指定可能範囲を拡大したので、いろいろと設定値を変えて、動作確認をしました。
その中では、設定変更が効かないケースもあり、その場合シリアルインターフェイスでエラーメッセージと共に、ヒントが送信されてくるので、デバッグに役立つ事も分かりました。これに関しての関連記事等は今現在見つけきれていませんが。
analogReadとanalogReadMilliVoltsの変換結果を比較では、ちょっと予想外の結果も判明しました。
arduino ESP32のライブラリのバージョンで、使用可能なAPI関数名や書式が変わってしまう事にも気づいたので、補足しました。

豊四季TinyBasicの文法は、豊四季タイニーBASICの文法 | 電脳伝説 (wordpress.com) を参照ください。
また、SAVE [BOOT]、LOAD が使えます。 

-------------------------------------------
本記事の目次です。
・改訂した拡張関数の仕様とGPIO選択表
・主に工夫した点
・デモ結果
 ・PWM出力の最高周波数40MHzの例
 ・PWMでの76Hz出力の例
 ・TinyBasicで扱える最小値1HzのPWM出力例
 ・不適切なPWM設定はシリアルからのメッセージでデバッグ
 ・AD変換のデモと結果のグラフ
 ・AD変換のオフセットの考察と追加実験
・ソースコードの公開と注意・使用方法
・Arduino IDE ESP32 APIライブラリの補足
・雑感

以下詳細です。

 


改訂した、拡張関数の仕様と、GPIO選択表は、以下です。

Ttbfunc
 尚、ライブラリのバージョンは Arduino ESP32 version 2.0.15 (現時点のLatest版)を使っています。

Gpio_selection_2

今回、主に工夫した点は以下です。

・PWM出力の周波数を指定するledcSetup()への周波数の引数はuint32_t型で与える必要があり、
 FRQとFMLTの積を取りstatic_castでuint32_t型に変換しました。
 ledcSetup(chn, static_cast<uint32_t>(frq * fmlt), res);
 TinyBasicでは数値や変数・配列は全てshort int型なので、static_castで十分なはず。

・キーワードテーブルとenumではANALOG_READ_MILLIVOLTSをANALOG_READよりも先に記述した。
 最初は逆に記述してしまい、ANALOG_READ_MILLIVOLTSを実行したいのに、内部処理的にANALOG_READが実行されてしまい、
 残りの文字列"_MILLIVOLTS"でpin番号を得ようとしエラー、この原因究明に数時間悩んでしまいました。
 先頭からの文字列が同じキーワードは、長い方を先に記述する必要がある点、「タイニーBASICをCで書く」に注意書きありました。
 Photo_20240414085901

・ADCの減衰量設定は、前回確認できたので、以下の1行で済ませました。
 analogSetPinAttenuation(pin, static_cast<adc_attenuation_t>(attn));

 



以下、デモ結果です。


■ PWM出力の最高周波数40MHzの例です。
40MHzだと、GPIO出力の遷移時間・出力インピーダンス、オシロスコープ・プローブの帯域、測定系の配線状態等、種々の影響を受け綺麗な方形波になりませんが、こんなもんでしょう。

100 REM GPIO32 PWM simple test
110 P=32; REM GPIO 32
120 C=0 ; REM PWM channel = 0
130 R=1 ; REM resolution
200 F=4000
210 M=10000
220 D=1
300 LEDC_SETUP C,F,M,R
310 LEDC_ATTACH_PIN P,C
320 LEDC_WRITE C,D

Img_0238

 

■ PWMでの76Hz出力の例です。
RESが20bitsに対し、Dutyが32767なので、オシロ波形のデューティは3%(32767/(2^20=1048567))になっています。
RESを荒くすれば、76Hz出力でもデューティをもっと大きく出来ます。

100 REM GPIO32 PWM simple test
110 P=32; REM GPIO 32
120 C=0 ; REM PWM channel = 0
130 R=20 ; REM resolution
200 F=76
210 M=1
220 D=32767
300 LEDC_SETUP C,F,M,R
310 LEDC_ATTACH_PIN P,C
320 LEDC_WRITE C,D

Img_0239

 

■TinyBasicで扱える最小値1Hzでの出力例です。
PWM 1Hz デューティ50%の波形例です。

100 REM GPIO32 PWM simple test
110 P=32; REM GPIO 32
120 C=0; REM PWM channel = 0
130 R=12
200 F=1
210 M=1
220 D=2048
300 LEDC_SETUP C,F,M,R
310 LEDC_ATTACH_PIN P,C
320 LEDC_WRITE C,D

Img_0241

 

■ 不適切なPWM設定はシリアルからのメッセージでデバッグ
PWM回路に対し不適切な設定を行った場合は、シリアルインターフェイスでメッセージが送信されますので、ヒントになります。
上記に対し、130 R=6に変えてrunしてみると、以下のメッセージが返ってきました。

E (1069533) ledc: requested frequency and duty resolution can not be achieved, try reducing freq_hz or duty_resolution. div_param=320000000

この例では、RES=6bitsのため、Duty指定範囲は1~63ですが、2048を指定したままなので、設定変更されず、周波数かデューティを下げろと言ってきています。

100 REM GPIO32 PWM simple test
110 P=32; REM GPIO 32
120 C=0; REM PWM channel = 0
130 R=6
200 F=1
210 M=1
220 D=2048
300 LEDC_SETUP C,F,M,R
310 LEDC_ATTACH_PIN P,C
320 LEDC_WRITE C,D
シリアルインターフェイスに出力されるエラーメッセージ例Photo_20240413145701

WiFiでのTinyBasicとの接続だけでなく、PCのUSBでSerial (上記では TeraTerm シリアル COM6 115200bps 8bits パリティ無し)に接続しておけば、簡易的ですがデバッグに役立ちそうです。

2024-4-21追記
ESP-IDFのAPIの説明に、以下の記述がありました。注意Arduino ESP32 APIの説明では記述は見当たりません。
Photo_20240421223501
LEDC APIはハードウェアの対応範囲を超えた周波数とデューティ分解能をセットしようとすると、シリアルモニターにエラーをレポートするように設計されているとの事です。
親切なライブラリと言う事か? ユーザーでの設定トラブルが多く、問い合わせやフォーラムでの質問が多いと言う事かな?

2024-4-22追記
Arduino ESP32 APIのライブラリにも、メッセージを出すと思われる記述がありました。以下自分のPC環境での例です。
C:\Users\username\AppData\Local\Arduino15\packages\esp32\hardware\esp32\2.0.15\cores\esp32\esp32-hal-ledc.c 
を見ると、ledcSetup()関数では、LEDCチャンネルかビット幅が最大値を超えた際にメッセージを出し、実行無しでリターンですね。

uint32_t ledcSetup(uint8_t chan, uint32_t freq, uint8_t bit_num)
{
   if(chan >= LEDC_CHANNELS || bit_num > LEDC_MAX_BIT_WIDTH){
       log_e("No more LEDC channels available! (maximum %u) or bit width too big (maximum %u)", LEDC_CHANNELS, LEDC_MAX_BIT_WIDTH);
       return 0;
   }

単純な引数の数値範囲チェックだけは、本簡易拡張でもしていますけどね。

 


 

■AD変換のデモと結果のグラフです。
analogReadMilliVoltsの方は、縦軸をmVとして電圧値が読み取れますし、特に11dbで直線性が改善しているのが分かります。
ただ、全ての減衰量でも低電圧側オフセットが100mV程度ある様です。

100 REM ------ DAC OUTPUT and ADC INPUT Test ------
110 P=25; PIN_MODE P,192; A=36; PIN_MODE A,192
120 ANALOG_SET_PIN_ATTENUATION A,3
130 GOSUB 300
140 ANALOG_SET_PIN_ATTENUATION A,2
150 GOSUB 300
160 ANALOG_SET_PIN_ATTENUATION A,1
170 GOSUB 300
180 ANALOG_SET_PIN_ATTENUATION A,0
190 GOSUB 300
200 STOP
300 REM ----------- DAC & ADC Subroutine
310 FOR D=0 TO 255 STEP 1
320 DAC_WRITE P,D
330 DELAY_MS 10
340 PRINT #5,ANALOG_READ A,",",#5,ANALOG_READ_MILLIVOLTS A
350 NEXT D
360 PRINT;PRINT
400 FOR D=255 TO 0 STEP -1
410 DAC_WRITE P,D
420 DELAY_MS 10
430 PRINT #5,ANALOG_READ A,",",#5,ANALOG_READ_MILLIVOLTS A
440 NEXT D
450 PRINT;PRINT
460 RETURN
Analodread

Photo_20240415140001


・AD変換結果のオフセットの考察と追加実験
analogReadMilliVoltsの下限側100mV程度のオフセットが気になります。
たぶんDAC出力がオフセットを持っていると考えられますが、測定での確認まではしていません。
データシート類には情報が見当たりませんが、以下のフォーラム記事を見つけました。

Digital To Analogue Converter Characteristics - ESP32 Forum

記事を読むと、上限は電源電圧より少し(120mV?)程度下がり、下限はGND(0V)より少し(50mV?)程度上がっている模様。

--------------------------------------------------

ならば、単純に、AD入力にGND(0V)を繋いで、AD変換結果がどうなるか調べれば済むので、やってみました。
アッテネーションを変えながら、10ms毎に2回づつ、analogReadとanalogReadMilliVoltsを実行させた結果です。

100 REM ------ DAC OUTPUT and ADC INPUT Test ------
110 P=25; PIN_MODE P,192; A=36; PIN_MODE A,192

120 ANALOG_SET_PIN_ATTENUATION A,3
130 GOSUB 300
140 ANALOG_SET_PIN_ATTENUATION A,2

150 GOSUB 300
160 ANALOG_SET_PIN_ATTENUATION A,1
170 GOSUB 300
180 ANALOG_SET_PIN_ATTENUATION A,0
190 GOSUB 300
200 STOP
300 REM ----------- DAC & ADC Subroutine
330 DELAY_MS 10
340 PRINT #5,ANALOG_READ A,",",#5,ANALOG_READ_MILLIVOLTS A
360 PRINT
420 DELAY_MS 10
430 PRINT #5,ANALOG_READ A,",",#5,ANALOG_READ_MILLIVOLTS A
450 PRINT
460 RETURN

 

GPIO36(ADC入力)をGNDに接続した場合
減衰量に応じて0ではない、特定の値が得られています。

減衰量 analogRead analogReadMilliVolts
-------+--------------+----------------------
 11db           0                   142
 11db           0                   142
   6db           0                   107
   6db           0                   107
 2.5db          0                     78
 2.5db          0                     78
   0db           0                     75
   0db           0                     75

参考で、GPIO36(ADC入力)に何も繋がない場合です。

ノイズできちんと暴れています。

減衰量 analogRead analogReadMilliVolts
-------+--------------+----------------------
 11db         453                  142
 11db       1488                 1100
   6db       1297                 1368
   6db             0                  252
 2.5db            0                    78
 2.5db            0                    78
   0db        4095                    75
   0db        4095                 1112

何と、予想に反し

analogReadの方は全て0が返ってきたものの、
analogReadMilliVolts側は、キャリブレーション(補正)で付与されたと思われる値が返ってきました

しかも[mV]単位で電圧値を返すはずなのに、減衰量設定によって電圧値が変わっています
減衰量11dbだと142mV、6dbで107mV、2.5dbで78mV、0dbで75mVのオフセットがある様です。

どう解釈するのかは良く分かりませんが、
analogReadMilliVoltsでは、AD変換結果に一定のオフセットが付与されているのが判明しました。

まあ、esp32_datasheet_en.pdf (espressif.com)にある下の表では、実効的な測定範囲が明記されていて、GND(0V)入力はこの範囲未満となり、そもそも精度保証範囲外、気にしてはいけないって事なのでしょう。



ESP32の電気的特性に関する情報はかなり乏しいので、これ以上の調査は厳しそうな予感。

まあ、ESP32では、ADC・DACに精度を求めるべきではなく、心配なら実験で性能をある程度把握し、使えそうな範囲内で使う。
そんな扱いが必要そうです。

 


・ソースコードの公開と注意・使用方法
今回作成の
basic.cpp はここで公開しますが、前回同様参考で、拡張の仕方としての事例紹介だけになります。
如何なる誤動作・破損・損害の責任は当方は負いません
ESP32で豊四季TinyBasicを走らせたり、独自の拡張に取り組んでみたい方の、
情報源の一つとして少しでも役に立てば幸いです。

利用条件に関しては、以下、豊四季タイニーBASICの作者鈴木氏に従うものとします。
Photo_20240422093701

Arduino IDEでは、 変更していない ttbasic_ESP32_WiFiTelnet.ino と合わせてのコンパイルとESP32への書き込みが必要です。
また、WiFiのssidとpwはご自身のWiFi環境にあわせての変更が必要です。

 


・Arduino IDE ESP32 APIライブラリの補足

尚、Arduino ESP32 の最新APIを参照すると、ledcAttachや、ledcAttachChannelがありますが、実際には使えませんでした。
調べると、ESP-IDF 5.1に対応したArduino ESP32 v3.0.0の説明で、v3.0.0自体はまだ、Pre-Release段階の様です。
私のArduino IDEでは、v2.0.15なので、ledcSetupやledcAttachPinはまだ、使えました。

もし、Arduino ESP32 v3.0.0 がLatestリリースになり、Arduino IDEで自動アップデートがかかってしまうと、コンパイルでエラーが多発する可能性が高く、その場合は、2.0.15に戻せばOKのはずと思います。

別記事で、もう少し詳しく書きました。

GitHubのArduino ESP32 ライブラリの最新情報(以下のURL、赤丸部分)を今後もウォッチしておく必要がありそうです。

GitHub - espressif/arduino-esp32: Arduino core for the ESP32
Photo_20240416195601

 


・まとめと雑感
今回、PWMの高速化、高精度ADC関数の、TinyBasicへの取り込みが実施できました。
拡張には慣れてきましたが、未知の対処方法を考えないといけないケースも出てきました。
例えばstatic_castが必要だったり、short int型2つの積をuint32_t型に型変換してからライブラリ関数の引数として渡すとかです。
TinyBasicの数値範囲を超える必要性が出てきて、どうしようかと少し考え、スマートではないにしても対応できました。
それはそれで良い勉強になりました。

一応、デモ等でも動作確認・設定値の有効範囲の確認など実施したつもりですが、誤りが含まれている可能性があります。
特に、PWMの設定では、不適切な設定の場合シリアルインターフェイスでエラーメッセージが送信されてくるので、いろいろと気付けたし、デバッグに役立つ事も知りました。

Arduno ESP32のAPIをどんどん取り込むのも一つの方向性かも知れませんが、TinyBasicで扱える範囲の簡単で低速で済むアプリ開発を考え、そこそこ頻繁に使いそうなAPIに絞り、便利そうなら拡張する程度が、本来のTinyBasicの守備範囲として適切なんだろうとの思いもあります。
今後ESP32をもっと使ってみて、どうするかは未知数ですけどね。


-------
本ブログは、過還暦脳活を第一の目的としております。なので、ここに記載のTinyBasic改良の実用性やコード記述のスマートさ等は、少し置いといて、「脳活題材でTinyBasicの拡張にチャレンジしているやつもいるんだなー」程度の目で見て頂けると助かります。
しかし、TinyBasicの拡張はなかなか面白く、楽しみながらやっています。

 


続報あればまた。

 

«ESP32 WROOM/WROVER GPIO16,17使用可否実機検証