« 足の痺れや痛みの原因と対策ー続き | トップページ | ワンショットリモコンシステムをTinyBasicでIoT化 »

2024年3月25日 (月)

タイニーBASICの簡易拡張準備-3 各GPIO割り当て表作成

前回成功した、GPIOの簡易拡張の続編で、今度はアナログIOの拡張の検討を始めました。

前回記事にも書きましたが、各GPIOへの各種周辺機能の割り当て状況の調査が先決と考えました。
今回ドキュメント類・ネット情報を参照しながら、表にまとめてみました。

斜め読みレベルですが、参考にした情報源(補足:英文ページはブラウザで翻訳すればそこそこ読めます。)
Libraries — Arduino-ESP32 2.0.14 documentation (readthedocs-hosted.com) Arduino-ESP32 IO系ライブラリ一覧
Technical Documents | Espressif Systems
ESP32 ADC1 <-> WIFI Issue - ESP32 Forum WiFiに関連するものはADC結果を不安定にする

Can ADC work while wifi is on? - ESP32 Forum WiFiオンだとADC2が機能しない
ADC2 and Wifi together - any hope? - ESP32 Forum ESP32-S2以降のチップではWiFiとADC2は併用できるらしい

DAC and ADC of ESP32S2 can't be used together in continuous mode. (IDFGH-10977) · Issue #12166 · espressif/esp-idf · GitHub ESP32S2での話ですが、DACとADCの同時使用は不可

Arduino core for the ESP32 リファレンス (fc2.com)
esp32_tips – スイッチサイエンス (switch-science.com)
ESP32のGPIO研究 | Lang-ship
ESP32のGPIO入力について | Lang-ship
【ESP32】analogReadする方法 - ソースに絡まるエスカルゴ (hatenablog.com)
ESP32でledcWrite()を使ってPWM出力をする | Wak-tech
ESP32 DACのテスト - JH7UBCブログ (goo.ne.jp)

ーーーーー

注意ですが、今回作成する表は、豊四季タイニーBASIC WiFi Telnet版をベースに、GPIO・アナログIO操作を拡張する目的の独自のまとめです。
ベースのタイニーBASICインタプリタの動作環境を乱さないため、安全第一視点のまとめなので、かなり限定したものとなっています。

割り当て表の基本的な考えは、「危ないものは操作できないようにしておくのが安全」です。表の赤✖部分。

もし操作してしまうと、誤動作・ハングアップ・破損など危ないだろう個所が、以下の通り割とたくさんあります。
・タイニーBASICでは、WiFiベースの開発環境ですし、Serial.printではUARTを使用するので、共に使えません。
・WiFiを使うとADC2が利用できないとの情報もありますし、同じポートにあるDACも利用できないと考えるべきかな。
・ユーザープログラムの格納にはFLASHメモリも使うので、ここも使えません。
・BOOTストラップで使われる端子も使わない方が安全。BOOT後に使えかは要調査。
今更ですが、前回のデモではGPIO26やGPIO27を操作してしまいLED点滅とスイッチ入力をしていましたが、WiFi動作に支障はなかったとは言え、危険だったんですね。

Photo_20240331084301
あくまでTinyBasicにIOの操作関数を拡張する目的で、最初に設定しておきたい利用制約を明確にするのを目的とする表となります。青〇は、周辺機能で使わない場合、排他的に利用できるポート。赤✖は、タイニーBASICシステム他で使うため、ユーザープログラムで使うと危険なポート。灰色ハッチングは、そもそも使えないポート。LEDC.SETUPは、PWMチャネル・PWM周波数・ビット数の設定で、ポート選択と直接の関係がないので、灰色ハッチングにしています。DAC.WRITEは、自分のESP32でWiFi使用時に支障がなければ、有効にするかもしれません。せっかくあるのにノータッチではもったいない。やっぱり使えなければI2Cの外付DAC(数100円だし)を使うとかの判断にもなる。ESP32-WROVER-Eを中心に調べたもので、検証もできていませんので、誤りが含まれる可能性があります。使うESP32の種類によっては異なる割り当ての可能性があります。 

上半分が周辺機能を使う際に使われるGPIOなので、例えばカメラを使う場合で、ADC入力も使いたくても、ADC1のGPIO32と33しか使えないとか、排他的な利用のための制約が分かり易くなりました。

ーーーーー

表の下半分は、アナログIO拡張で考えている拡張関数で、前回GPIO操作で追加したものも含め、ArduinoIDE環境下のESP32のライブラリ関数に合わせた名前で命名しようと考えています。
digitalWriteなら DIGITAL_WRITE 、analogReadなら ANALOG_READ 。単純ではありますが、C言語ライブラリで使用する関数名とほぼ同じなので、分かり易いし悩まなくて済みそうですし、1バイトの中間コードに変換されるので、名前が長くても気になりません。
先ずはアナログIOで当面自分が必要だろうと考えているものを選びました。
PWM関係は関数も多く、多少煩雑な気もして、ポート・PWMチャンネル・周波数・デューティをいっぺんに設定する拡張関数を作っても良いかと考えましたが、それはそれでライブラリ関数にないので混乱の元になる気もして止めました。
まあ、拡張する関数とその名前で、将来何らかの支障が出たり、同じような使い方を何度もしているのに気づくとかあれば、その時改めて考え直すとして、先ずは開発を進めたいかな。

ーーーーー

上記表で青〇以外のポートが指定されたら、エラーとして処理を中断するチェック機能も、「タイニーBASICをCで書く」を読んでやり方が分かりました。
以下のテストで、うまくいったので、追加する予定です。

//利用可能なポート番号を登録した配列を用意
const short giomodes[]={18,19,21,22,23,32,33,34,35,36,39,-1};

//エラーメッセージ配列errmsg[]に"Invalid port",を、そのenumに、ERR_INVALIDを登録しておく。

// igiomode extent
void giomode(){
    short value1, value2;
    short i, invalid;
    value1 = iexp();
    if(err) return;
    invalid =1; //エラーフラグの初期値を1にしておく
    for (i=0; giomodes[i] != -1; i++)  // 配列を逐次参照し
       if(giomodes[i]==value1){ // 登録されていたら、エラーフラグを0にして、for文を抜ける
          invalid = 0;
          break;
      }
    if(invalid){ // エラーフラグが1のままだったら、ERR_INVALIDを出し処理を中断
       err=ERR_INVALID;
       return;
    }
    省略

以下、参考 GIOMODE 11,3 を実行し、エラーフラグに1が立ったままなので、”Invalid port"エラーを出し処理を中断できた例。ここではまだ関数名が古いままです。
Photo_20240325145301



今回の準備で、関数名、拡張の構想、排他利用のためのチェック機能等が、固まってきました。
時間がある時に、開発してみるとしますかね。

 


2024-3-31追記 拡張関数の仕様を策定しました。

2024-4-7追記 PSRAM有WROVERではGPIO16,17使用不可の続報あり。

続報あればまた。


 

 

« 足の痺れや痛みの原因と対策ー続き | トップページ | ワンショットリモコンシステムをTinyBasicでIoT化 »

電子工作:ESP32 TinyBasic」カテゴリの記事

コメント

コメントを書く

コメントは記事投稿者が公開するまで表示されません。

(ウェブ上には掲載しません)

« 足の痺れや痛みの原因と対策ー続き | トップページ | ワンショットリモコンシステムをTinyBasicでIoT化 »