« 2024年2月 | トップページ | 2024年4月 »

2024年3月の9件の投稿

2024年3月31日 (日)

タイニーBASICの簡易拡張準備-4 拡張関数の仕様を策定

前回検討した各GPIO割り当て表の作成に続き、今回は拡張する関数の仕様を策定してみました。

拡張関数名、書式、引数とその設定範囲など明確化したので、実際のコーディングのイメージもはっきりしてきました。
Table
 尚、ライブラリのバージョンは Arduino ESP32 version 2.0.15 (現時点のLatest版)を使っています。

時間がある時に、コーディングとデバッグ、各設定値の実機検証など進めたいと思います。

ADC入力は、アッテネーション設定毎の、アナログ入力値とAD変換値との関係など、実験が必要そうです。
LEDC(PWM)波形出力は設定項目が多く、各種周波数・Duty設定での波形観測など必要そうです。
PWMに関し、以下が分かり易く参考にしました。
 PWM制御とは?Arduino(ESP32)コマンドで使い方を詳しく紹介 | ロジカラブログ (logikara.blog)
また、DACはWiFi(ADC2)と同じGPIOを使うので、手持ちの環境で使えるか否かも。


続報あればまた。

2024-4-1追記 アナログ込み簡易拡張成功しました。

 

2024年3月29日 (金)

ワンショットリモコンシステムをTinyBasicでIoT化

全体の目次

別記事で、豊四季TinyBasic WiFiTelnet版へのGPIO操作の拡張をしました。
以前製作したESP32を使ったワンショットリモコンシステムのIoT環境は、そのまま残してあります。

せっかくなので、両方揃えば直ぐできる、TinyBasicでリモコンシステムのIoT化をしてみました。
なんとなく時代遅れな気もしますが、TinyBasicをマイコンボードに載せていれば、こんなことなら十分使えるし、何より簡単でカットアンドトライで操作できるのが実感でき、なかなか良い感じです。


全体構成図は ここ ですが、WiFiとGPIO26,27の同時使用は避けるべき事に気づいたので、GPIO32と33に変更しました。
ESP32にはGPIO操作を拡張したTinyBasicインタープリターを書き込みました。

使ったTinyBasicのプログラムは以下です。
C言語では、WiFi接続・リレー制御・HTML送信等やる事が多くて大変で敷居も高かったのですが、TinyBasicなら分かり易く簡潔ですね。
現在のリレーの状態を表示して、キー入力を待ち、エンターキーが押されたら、GPIO32でシステムにダイオードを100ms間接続し、その後GPIO33でダイオードの極性を切り替えています。

100 REM OneShotRemoconServer by TOYOSHIKI TinyBasic WiFi+GPIO
110 REM
120 GIOMODE 32,3; REM GPIO32 OUTPUT 100ms RELAY ON
130 GIOMODE 33,3; REM GPIO33 OUTPUT DIODE DIRECTION RELAY
140 A=0 ; REM DIODE DIRECTION SET TO 0
150 PRINT "\033[0m","\033[39m","\033[49m","\033[2J"; REM SCREEN CLEAR
160 PRINT "\033[9;27H","ESP32 Shot-Remocon-Server",
170 PRINT "\033[10;23H","by TOYOSHIKI TinyBasic WiFi+GPIO",
180 REM
200 PRINT "\033[12;29H",
210 IF A=0 PRINT "\033[42m"," Current State is OFF ",; GOTO 230
220 PRINT "\033[41m"," Current State is O N ",
230 INPUT ""B; GOSUB 300;
250 GOTO 200
260 REM
300 GIOOUT 32,1; WAITMS 100; GIOOUT 32,0; WAITMS 100
310 IF A=0 GIOOUT 33,1; A=1; GOTO 330
320 GIOOUT 33,0; A=0;
330 RETURN

PC上のメモ帳で編集して、コピペでTeraTerm画面に送れば、TinyBasicにはエディター機能なんて必要ない感じです。

PC上のTeraTermはエスケープシーケンスでの文字背景色の変更が効くのが分かったので、画面中央で色も付けそこそこIoT画面らしくなりました。以下TeraTermの画面で、左がリレーON時、右がリレーOFF時。エンターキーを押すたびにON/OFFを切り替える感じです。

On_20240329171401 Off_20240329171401

 

PC上で、WiFiで繋げたTeraTermで操作している動画です。TinyBasicの起動メッセージが出た後、メモ帳に書いたプログラムをTeraTermへコピペして、runで実行しています。

 

操作中のリモコンリレー側の動画です。リモコンリレーのON/OFF切り替え、リモコンスイッチ側赤緑LEDの連動も確認できます。

 

---------------------------------------
ArduinoIDEでのプログラム開発はなにかと面倒ですが、TinyBasicなら気楽な開発となるのが実感できます。
リレーのON/OFF程度なので、動作速度は気になりません。
見た目の恰好良さは期待できませんが、TinyBasicならやりたい事がサクッとできる点が良いですね。

豊四季TinyBasic WiFi Telnet版なら、WiFiで繋ぐのでIoT化しやすく、エスケープシーケンスも効くのが良いですね。
作者のrobo8080さんに感謝です。

---------------------------------------
スマホのMochaTelnetでは、文字色変更等のエスケープシーケンスが効かないようで、見た目がそっけない感じでした(下図)。
Img_0186 Img_0187

画面のタイトル文字は、ESP32 One-Shot-Remocon-Server にするはずが、One-が抜けちゃいました。
ばたばたコーディングして、動いちゃうと、ブログ作成の方に注力してしまうので、なかなか気づかないものです。 (笑)

 


続報あればまた。

 

本記事は、メーカーからの情報や公開された特許情報等を元に、動作理解とシミュレーションでの再現を目的に独自に調査したものです。従って、考察や実験結果はあくまで個人の範囲に留めるものであり、記事の内容には間違いがある可能性があります。参考にされる際は自己責任とし、メーカーや関連業者に迷惑を掛けるような事はしないでください。また、この記事を読まれて類似の事をされても、当方はいかなる責任も負いません。

 

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使用不可の続報あり。

続報あればまた。


 

 

2024年3月24日 (日)

足の痺れや痛みの原因と対策ー続き

前回のストレッチやもみほぐしの効果の他にも、やった方が良さそうな事がありそうなのに気づきました。
人生100年・健康長寿を目標に、高齢化に伴う血管年齢の改善や、毎回健康診断で指摘を受ける脂質異常症(悪玉LDLコレステロール)の低減などが、今後の事を思うと必要そうだと考えたのです。

Youtube等でいろいろと見ていると、血管の若返りに必要な栄養素を取る動画もたくさん見つかります。

詰まりかけた血管をツルツルにする食べ物8選 (youtube.com)

【医者が廃業する】「本物のはちみつを、毎日とり続けると 奇跡が起きました...」を世界一わかりやすく要約してみた【本要約】 (youtube.com)

純粋ハチミツや、セイロンシナモン、ナッツ類(くるみ他)、納豆、オメガ3脂肪酸(DHA・EPA)、カカオポリフェノール、納豆、緑茶、...なるほど、効果ありそうです。

納豆ぐらいしか意識して取っていなかったので、食事改善してみる価値ありそうです。

また、家にはかみさんが買った高電位治療器があり、血液さらさらで血流改善と言うもの。
肩こり他の改善効果が国の機関でも立証済との事で、病院・診療所・整体院などに設置してある所もあります。
確かにこれをやると、ひざ裏の痛みが結構和らぐので、効果を実感できます。

前回の絵に、黄色で追加しました。

数か月から半年程継続して、どうなるか様子見ですね。

Photo_20240324111001

ps.喫煙だけは未対策で、タールが低い電子タバコに変えようかと考え中。


続報あればまた。

 

2024年3月16日 (土)

★タイニーBASIC GPIO操作の簡易拡張成功

E S P 3 2
豊四季タイニーBASIC WiFi Telnet版
GPIO操作関数 拡張成功

2024-4-1追記 GPIO+AnalogIO対応拡張版の方が完成度が高いのでそちらも参照ください。
2024-4-13追記 高速PWM出力・高精度ADC対応のプチ改良版もあります。
2024-4-28追記 WiFiを使わないシリアル版も作成しました。


豊四季タイニーBASIC WiFi Telnet版へのGPIO操作関数の拡張が成功しました。

前回の調査で、pinModeで指定する各モードの設定値が分かり、実装の目途も立ち、拡張事例を参照して拡張の概要が分かってきたので、早速GPIO操作関数の拡張を実施してみました。
コンパイルエラーを無くすのにそこそこ大変でしたが、拡張関数そのものは事例を真似る事で、割とスムーズに追加する事ができました。
もともとGPIOを操作して、LEDの点灯とかスイッチからの入力とか、何もできませんでしたが、今回の拡張で出来るようになりました。

以下、GPIO出力によるLED点滅とGPIO入力表示のデモ動画で、スマホで操作している様子です。

 

以下詳細です。

 



 

拡張する関数の仕様

今回拡張する関数は以下の4つで、書式は単純に引数を羅列する形です。

拡張関数 関数名 引数の書式 戻り値 内部で実行する関数
GPIOのモード指定 GIOMODE ポート番号、モード設定値 なし pinMode()
GPIOへの出力 GIOOUT ポート番号、出力値 なし digitalWrite()
GPIOからの入力 GIOIN ポート番号 0か1 digitalRead()
時間待ち WAITMS 待ち時間(ms) なし delay()


●ポート番号は、0~35、範囲外はエラーとします。
 当然ですが、ESP32開発ボードシステムで使われ、勝手に利用できないポートがあります。
 もし使ってしまうとハングアップや最悪破損を招くので、あくまで自己責任、ポート選択は調べてから慎重に。

●GIOMODEのモード設定値は以下。負の値はエラーとします。
 Photo_20240316202101
 ポートにより利用できないモードもあるので、あくまで自己責任、設定値は調べてから慎重に。

●GIOOUTの出力値は、0 または 1 のみ。範囲外はエラーとします。

●GIOINの戻り値は、0 または 1 です。

●WAITMSの待ち時間(ms)は、short型なので、32,767(ms)までです。負の値はエラーとします。

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

拡張で参考となった記事
mbed版 豊四季タイニーBASICの機能を拡張してみた。(1) - robo8080のブログ (goo.ne.jp)
機能拡張のおおまかな話 | 電脳伝説 (wordpress.com)
Arduino 日本語リファレンス (musashinodenpa.com)

 

ソースコードの拡張

ベースのTinyBasicソースコード basic.cpp への追加は、以下4点を実施。赤太字部分が追加した部分です。WiFi接続のssid/pwは既に変更済として。

1、キーワードテーブルへの追加
 const char *kwtbl[]の最後に以下を追加

 ~
省略~
 "LOAD"//extend

 "GIOMODE", "GIOOUT", "GIOIN", "WAITMS" // extend
 };

2、中間コードのemum列挙への追加(キーワードテーブルへの追加の順番と同じにする。)
 // Keyword count
 #define SIZE_KWTBL (sizeof(kwtbl) / sizeof(const char*))
 // i-code(Intermediate code) assignment
 enum {
 の最後の方、I_NUMの前に以下を追加

 ~省略~
 I_LOAD,//extend
 I_GIOMODE, I_GIOOUT, I_GIOIN, I_WAITMS, // extend
 I_NUM, I_VAR, I_STR,
 ~
省略~


3、各拡張関数を内部処理で拾い上げるべき所へ追加
 戻り値がなく実行だけすれば良い GIOMODE、GIOOUT、WAITMS は、
 iexe()内の最後の方の、default:の前に、以下のcase振り分けを追加

 ~省略~
 case I_SEMI: //中間コードが「;」の場合
  cip++; //中間コードポインタを次へ進める
  break; //打ち切る

 case I_GIOMODE:
  cip++;
  giomode();

  break;

 case I_GIOOUT:
  cip++;
  gioout();
  break;

 case I_WAITMS:
  cip++;
  waitms();
  break;

 default: //以上のいずれにも該当しない場合
  err = ERR_SYNTAX; //エラー番号をセット
  break; //打ち切る
 ~省略~

 実行後に戻り値がある GIOIN は、
 ivalue()内の最後の方の、default:の前に、以下のcase振り分けを追加

 ~省略~
    value = getsize(); //プログラム保存領域の空きを取得
    break; //ここで打ち切る

  case I_GIOIN:

  cip++;
  value = gioin();
  break;

 default: //以上のいずれにも該当しなかった場合
  err = ERR_SYNTAX; //エラー番号をセット
  break; //ここで打ち切る
 ~省略~

4、各拡張関数の処理を追加
 (プロトタイプ宣言なしにしたいので、拡張関数を呼び出す iexe() や ivalue() より前に宣言が必要で、ここでは getparam() のすぐ下に追加しました。
 尚、拡張関数内でも使用する iexp() は、あちこちで使われるためか、元々最初の方でプロトタイプ宣言されているので、位置関係は不問でokです。)

 // Get argument in parenthesis
 short getparam() {
    ~省略~
    return value; //値を持ち帰る
 }

 // giomode extent

  void giomode(){
   short value1, value2;
   value1 = iexp();
   if(err) return;
   if((value1 < 0)||(value1 > 35)){
    err = ERR_SYNTAX;
    return;
   }
   if(*cip != I_COMMA){
    err = ERR_SYNTAX;
    return;
   }
   cip++;
   value2 = iexp();
   if(err) return;
   if(value2 < 0){
    err = ERR_SYNTAX;
    return;
   }
   pinMode(value1, value2);
   Serial.print("GIOMODE "); Serial.print(value1);Serial.print(",");Serial.println(value2); // for debug
  }

 // gioout extent
  void gioout(){
   short value1, value2;
   value1 = iexp();
   if(err) return;
   if((value1 < 0)||(value1 > 35)){
    err = ERR_SYNTAX;
    return;
   }
   if(*cip != I_COMMA){
    err = ERR_SYNTAX;
    return;
   }
   cip++;
   value2 = iexp();
   if(err) return;
   if((value2 < 0)||(value2 > 1)){
    err = ERR_SYNTAX;
    return;
   }
   digitalWrite(value1, value2 & 0x01);
   Serial.print("GIOOUT "); Serial.print(value1);Serial.print(",");Serial.println(value2); // for debug
  }

 // gioin extent
  short gioin(){
   short value, value1;
   value1 = iexp();
   if(err) return 0;
   if((value1 < 0)||(value1 > 35)){
    err = ERR_SYNTAX;
    return 0;
   }
   value = digitalRead(value1);
   Serial.print("GIOIN "); Serial.println(value); // for debug
   return value;
  }

 // waitms extent
  void waitms(){
   short value;
   value = iexp();
   if(err) return;
   if(value < 0) value = 0;
   delay(value);
   Serial.print("WAIT "); Serial.println(value); // for debug
   return;
  }

その他
 ・バージョン表記を変えました。
 // Depending on device functions
 // TO-DO Rewrite these functions to fit your machine
 #define STR_EDITION "ARDUINO(ESP32 WiFi+GPIO)"

Arduino IDEでは、 変更していない ttbasic_ESP32_WiFiTelnet.ino と合わせて、コンパイル・書き込みを行いました。
さらっと書いていますが、私はArduino IDEやC言語は不慣れのため、そりゃーもうコンパイルエラーを潰しながら、Serial.printで確認しながらの格闘で、拡張には約1日かかりました。
以下、コンパイル・書き込み成功でのメッセージ。WiFi処理が入るためか764,512バイトも使っている様です。
Photo_20240316122301
豊四季TinyBASIC WiFi Telnet版はTeraTermでTinyBasicと繋がり、USBでArduinoIDEのシリアルモニタと繋がっているので、実機動作確認とデバッグを平行して出来るので、やり易い感じです。

 

動作確認・実機デモ

ここでは簡単にTinyBasicでGPIO26に繋いだLEDを点滅させながら、GPIO27入力の表示をさせてみました。
豊四季TinyBasic自体の文法はこちら 豊四季タイニーBASICの文法 | 電脳伝説 (wordpress.com) を参照ください。

●ESP32ボードのGPIO26へ220Ωの抵抗を繋ぎ、抵抗に直列にLEDアノードを接続、LEDカソードをGNDに接続。
 GPIO27へ保護目的で220Ωの抵抗を繋ぎ、抵抗に直列にスイッチを接続、スイッチの他端をGNDに接続。

 ボード上の部品とGPIOとのワイヤー接続の様子です。
 買ったスターターキットに付属の、GPIOエクステンションボード経由なので、ブレッドボード上の部品配置や配線は楽です。
 Img_0133

●デモ用プログラムは以下です。
 GPIO26を出力に設定、GPIO27をプルアップ付入力に設定。
 GPIO26に1秒Highを出力し、1秒Lowを出力、GPIO27のスイッチの状態を表示させ、GOTOでループさせるものです。

 10 GIOMODE 26,3 REM GPIO26 OUTPUT
 20 GIOMODE 27,5 REM GPIO27 INPUT_PULLUP
 30 GIOOUT 26,1
 40 WAITMS 1000
 50 GIOOUT 26,0
 60 WAITMS 1000
 70 PRINT GIOIN 27
 80 GOTO 30

●PC上でTeraTerm接続設定画面で、TCP/IP Telnet TCPポート10001とし、ホストにIPアドレスを入力できる状態にしておく。
 Photo_20240316122701

●ArduinoIDEでコンパイルと書き込みをし、ESP32のRSTボタンを押す。

●ESP32が接続したWiFiアドレスをシリアルモニタで確認しておく。
 以下192.168.1.36 ポート10001で繋がったとのメッセージの例。
 Photo_20240316122601
●TeraTermのIPアドレス欄に上記IPアドレスを入力し、OKで立ち上げる。

●TeraTerm画面でTinyBasicの起動メッセージを確認し、プログラムを入力し、実行する。
 下の画面では、Telnetでの接続後にTinyBasicの起動メッセージが出たのを確認し、
 事前にプログラム入力とSAVE BOOTをしておいたので、直ぐにデモプログラムが走行し、
 少し経ってから[esc]で止め、LIST表示をさせたものです。
 走行中は、GPIO26のLEDはデモ動画にある通り点滅し、GPIO27のスイッチの状態の入力と表示ができています。
 Photo_20240316123501
 蛇足:いろいろとやっているとTeraTermの画面をクリアしたくなります。いっその事画面消去のためのCLS関数(CLSで\033[2Jを返す)を拡張しようかとも考えましたが、あとでAlt+E→Sのキー操作でクリアできるのが分かりました。実はそんな程度の知識でTeraTermを使っているんですよ、お恥ずかしい...
 補足:Serial.printからの受信文字は、TeraTermでも見る事ができました。
接続設定はシリアルを選択、ESP32が繋がる仮想COMポートを指定、ボーレート115200にします。
 TinyBasicの操作画面(WiFiでTelnet接続)用のTeraTermと別に、シリアル送受信用のTeraTermを立ち上げれば、Arduino IDEを使わなくてもOKになります。

●実行中は、各拡張関数が実行された際に、デバッグ用に書き出させているSerial.print()で、
 実行された関数名とその引数を確認をしています。
 以下、ArduinoIDEのシリアルモニタ画面例。どこかでコメントアウトする予定。
 Photo_20240316123901
 GIOOUTであるべき所が、GIOUTになっていますが...

●PC上のTeraTermとやることは同じですが、より利便性を上げてみたいため、スマホでの操作をしてみます。
 スマホに入れたMocha TelnetでTelnet接続し、TinyBasicの操作を行う感じです。
 Mocha TelnetのFast Text Inputで予めTinyBasicプログラムを入力(コピペ編集も可)しておいて、sendで一気に送るのが楽です。
 良く使うlistやrunを改行付きでマクロに登録しておけば、操作も簡単になり便利です。
 無償のLight版もありますが、5分毎に接続が切れてしまうので、使っているうちにフルバージョン(900円)にアップデートしました。

 Mocha TelnetのConfigure内の接続設定例。IP AddressとPortの入力だけで、TinyBasicと繋がります。
 Img_9711_20240317085901

 Mocha TelnetのFast Text Input内の編集画面例、SendボタンでTelnet送信ができます。
 Img_9704_20240317085901

●スマホで操作するデモの全体構成です。
 ESP32はモバイルバッテリーで動かし、WiFi経由でスマホと接続。スマホのMocha TelnetでTinyBasicを操作します。
 Img_e9715

●デモの動画です。


上記の通り、拡張した GIOMODE、GIOOUT、GIOIN、WAITMS の動作を実機で確認する事ができました。

 

さて、今後どうする

●関数名に関しても、どう決めようが1バイトの中間コードに変換してから処理されるので、もっと分かり易くすべきかと自分でも思います。GPIO.MODEやGPIO.OUTが自分でも分かり易いし、コンパイルも成功しますが、将来的に問題にならないかとか、気になります。どうせESP32専用になってしまうので、PIN.MODEとかDITGITAL.WRITEとかESP32内部関数と1:1的に対応させた方が、考えなくて済みよっぽど分かり易いかと思案中。他のマイコンボード用の豊四季タイニーBASICの拡張例とかいろいろと見てからかな。

●今回、詳細検討をすっ飛ばして、エイヤで拡張してしまいましたし、何よりTinyBasicそのものの理解も不十分なままです。今回のGPIO操作関数の拡張は、デバッグが不十分(ポートの最大値は39が正解かな)な気がしますし、無駄な処理もありそうです。例えば、igiooutの最後の digitalWriteの引数value2には、0か1しか来ないのに、value2 & 0x01しているとか。

●GPIOポートですが、ESP32の開発ボードで UART・FLASHメモリ・WiFi等のシステム動作で使用されているとか、BOOT動作に影響の出るポートとか、細かい制約・詳細仕様も把握しきれていません。ドキュメント類を良く見て、適切な選択を必要とするので要注意ですね。

●各種センサーの信号を扱えるように、アナログ入出力関係も拡張してみたいですが、デジタル入出力に比べれば複雑なはずです。PWMは設定項目が多く多少面倒そうです。analogReadなら同じノリで簡単に追加できそう。DAC出力はGPIO25とGPIO26に割り当てられていますが、そこはADC2と兼用なので両方は使えませんし、そもそもWiFiでADC2が使われるため、WiFiとDAC・ADC2は同時には使えません。

●上記2点の点では、いろいろ制約がありそうで、先ずは各機能のポートへの割り当て状況の調査が先決そう。その上で、各関数で利用可能なポートを定義しておいて、実行時に引数で与えるポート番号の有効性を調べ、使えないポートでは"Invalid port"とかエラーメッセージを出して、弾くとか追加した方が安全で良いかな。

●定数や変数の型の使い分けが徹底できていません。1バイトで足りるならchar型にすべきで、現状は数を扱うという意味でshort型で宣言してしまったりで、TinyBasicのポリシーからしてメモリの浪費は避けるべきなので、良くない気がします。Cの暗黙の型変換も効くので、どこかで無駄なshortをcharに変えないといけないかな。

タイニーBASICをCで書くをきちんと読み、デバッグや改良、更なる拡張などを検討してみようかと考えます。
キーワードの前の空白の有無をどうすべきかなんて、何も考えていないし...
本の中では、Basic言語として 命令・文・関数 の言い分けがあります。Cでは全て関数として扱うのは、Cの言語仕様的な話であって、作るのはBasicなので、Basic流儀に従うべきでなんでしょうね。って言うのが今頃分かる自分、へへっと照れ笑い。この本ではきちんと、"LED文に対応する関数iled"とか、"LOAD命令を追加した関数iexe"とか書いてありますねー。このブログも表現書き替えないと...誰かに怒られそう...。

SAVE BOOTで保存しておくと、WiFiでクライアントとの接続し、起動メッセージを表示した後に、ユーザープログラムが自動実行されます。スタンドアロンに電源オン即実行の方が結構なメリットになる気もしますが、それだとWiFiには繋がっていないため、[ESC]キー中断すらできません。回避策としては、例えばスイッチ入力を用意しておき、ユーザープログラムでスイッチ入力を定期的に調べ、停止条件でSTOPを実行、ユーザープログラムを止める工夫が必須になります。でも、それで止めたとしても、直ぐにWiFi接続の確立させないと、SAVE BOOTの解除(NEWしてSAVE)すら出来ず、どうどう巡りしてしまいそうです。
うーんたぶん、止める工夫が必須やら、WiFi接続リトライ化へのソースコードの修正が必須やら、それはそれで大変そうですし、自分でもそのうち忘れそう...まあ今のままが安全かな。
いっそのことWiFi接続を止めて、シリアルインターフェイス版に戻すのが確実かも。
豊四季タイニーBASICのArduino版を参照すれば、basic.cppの最初の方のWiFi接続処理を無効化して、c_putch(c),c_getch(),c_kbhit()の#defineを有効にし、最後のbasic()にあるWiFi接続メッセージ等編集してシリアル対応にし、途中にもあるWiFi接続状態を見ている数箇所を無効化すれば良いはず。これなら電源Onで即power on run、止める際はUSBに繋ぎ、シリアルでTeraTermを立ち上げ、[esc]を押せば止められるはず。時間があったらやってみるとしますかね。

2024-4-28追記 PWM・高精度ADC・DAC 対応版をベースに、WiFiを使わないシリアル版作成しました。

●今回作成した basic.cpp は、やったら出来たバージョンでして、コメントは何も書いてないし、あくまで拡張の仕方としての事例紹介だけになります。如何なる誤動作・破損・損害の責任は当方は負いません。ESP32を含めマイコンボードで豊四季TinyBasicを走らせたり、独自の拡張に取り組んでみたい方の、情報源の一つとして少しでも役に立つなら、それで良いとの思いでの公開です。

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

●ESP32は比較的高速なのでしょうが、TinyBasicでGPIO操作をした際の、実行速度も気になります。デバッグ用に残したSerial.printの実行速度への影響が、自分では気になるものの、今の私には理解が及びません。であれば、適当にTinyBasicでGPIO出力をHigh/Lowトグルさせて、デバッグ用のSerial.printの有効/無効での、トグル波形のオシロ観測ならできるので、先ずはやってみようかなと考えています。

 

動作速度調査

2024-3-17追記
差し当たり直ぐに実験できそうな、デモした環境での動作速度をオシロで観測してみました。
拡張関数の中で、デバッグ用のSerial.printが有効のままだと、WAITMS 1000 を無くしても、LEDの点滅は目で分かるくらい遅く、数10Hz程の速度なので、早々にコメントアウトしました。
なので、デモプログラムは大幅に簡素化し、以下の2つのケースで実験してみました。

ケース TinyBasicプログラム 観測波形(GPIO26の波形)
1⇒0⇒戻り 10 GIOMODE 26,3
20 GIOOUT 26,1
30 GIOOUT 26,0
40 GOTO 30
Img_0136
0⇒1⇒戻り 10 GIOMODE 26,3
20 GIOOUT 26,0
30 GIOOUT 26,1
40 GOTO 30
Img_0137

この結果から、
・ループ全体の動作周波数       約3.1KHz。
・ループ全体の繰り返しの時間  約320us、
・GIOOUTの処理時間            約120us
GOTOの処理時間                約80us
と、それぞれかかっている事が分かりました。

以前調べたdigitalWriteの実行時間の調査結果では、
・ループ全体の動作周波数        約1.5MHz、
・ループ全体の繰り返しの時間  約660ns、
・digitalWriteの実行時間         約320ns、
・戻りの処理時間                   30~120ns、
でした。

TinyBasicでは、諸々の内部処理の積み重ねの中で、GPIO出力処理がなされるため、実行速度はCプログラムと比較して、約1/300 〜 1/500 程度に遅くなる感じです。
細かい調査はしていませんし、TinyBasic上のユーザープログラムの組み方にもよるでしょうけど、ESP32のTinyBasicなら、えいや数KHz程度でのGPIO波形操作が出来る感じかなと思います。

まあ、初期のArduino1.0ではdigitalWriteの実行に4.28~5.47us程度かかっているとの情報もあるので、ESP32は13~17倍も速いですね。


Serial.printが有効な場合では、GPIO26をオシロで観測すると、一定期間バースト的なH/Lが出た後、一定期間波形の更新が止まり、その後バースト波形が再開する状態となりました。
USBケーブルを抜いてモバイルバッテリーで動かしても同様。買ったESP32-WROVERスターターキット
のボード(下左)に付いていたTXのLED(UART0のU0TXDの状態表示かな)が点滅していました(下右)ので、ESP32側からのシリアル送信(115200bps)は生きたままです。
Img_0154

下の表はGPIO26の波形例で、左側2つがGIOIN 27を実行しているとき、右側2つがGIOIN 27がない時の波形で、各々全体とその拡大。
拡大するとバースト部分のH/Lの幅は数100us程度と早いのに、Serial.printがある場合、UART送信バッファーフルで待ち時間が入るためと思われる、点灯(H)か消灯(L)のどちらかで、間延びが生じ、それを目で見ると数10Hz程度の遅い点滅として見えてしまうんでしょう。
オシロ波形では、GIOINがあるとGPIO 26のLow期間がその分長くなっているのも良く分かります。

GIOIN 27を実行する場合の波形例 GIOIN 27を実行しない場合の波形例
Img_0138 Img_0139 Img_0141 Img_0142

不要なSerial.printは無効にしないと速度低下の要因になってしまう事が分かりました。 

 

雑感・謝辞

今回の自由研究では、ESP32 TinyBasicの拡張にチャレンジし、何とか成功させる事ができました。

やってみたら、割と簡単にできましたと言うのが、正直な感想ではありますが、これは元の豊四季TinyBasicの内部構成が分かり易く、拡張もしやすくなっているからです。

拡張事例も多くはないものの、探せば見つかりましたし、解説本「タイニーBASICをCで書く」も手元で見れる様になりました。
特に拡張関数の追加に関しては、ソースコードで追加すべき場所もはっきりしているので、余り悩まずに追加できましたし、ポインタをインクリメントしていけば、後続の引数をそのまま評価できるなど、処理が分かり易くて良かったです。

また、PCとArduinoIDEでの開発・デバッグという環境から離れ、ESP32とスマホがあればTinyBasicでユーザープログラム開発・デバッグできるようになり、可搬性も上がり、使いやすくなった気もします。
元のソースコードが豊四季TinyBasic WiFi Telnet版で、WiFi接続やSAVE BOOTが出来るので、その恩恵を最大限活用させてもらった形です。

basic.cppの最初の方にある、//#define USE_WIFI_AP_MODE を有効にすれば、ESP32と携帯をローカルなWiFiで、1対1で繋げられるはずなので、自宅や出先のWiFi環境なんて気にしなくても良くなるでしょう。

いろんな意味で、vintagechipsさんrobo8080さん らの、開発と情報発信には、大変お世話になっています。
この場を借りてお礼申し上げます。ありがとうございます。


 

2024-3-25追記
 アナログIOの拡張準備として、周辺機能の割り当て表を作成しました。

2024-3-29追記
 ワンショットリモコンシステムをTinyBasicでIoT化してみました。

2024-4-1追記
 アナログIOの拡張でGPIO操作の関数名・チェック機能等盛り込んだアップデート版も作成済です。

 

タイニーBASICの簡易拡張準備-2 「タイニーBASICをCで書く」をゲット

前回のタイニーBASICの簡易拡張準備の段階で、最寄りの図書館に3/1に依頼していた、都立図書館蔵書の「タイニーBASICをCで書く」の貸し出しですが、3/13に最寄り図書館に到着したので、早速借りてきました。
まだパラパラめくって斜め読み程度しかできていませんが、期待通り今後すごく役に立ちそうな本、インタープリタの内部の動作の仕組みも詳しく書かれていますし、拡張例もあります。ですが、返却期限が3/27、2週間ではとても活用しきれません。

今後手放せない本となる予感がするので、6,279円とちょっと高いがアマゾンの中古品を注文し、3/14にゲットしました。
タイニーBASICの拡張がマイブームの私に取っては、手に取って読めるなら、定価の倍近い値段でしたが財布の紐が緩んでしまいました。

同じ本が手元に2冊もあるなんて、あまりない光景でしょうから、記念写真。
Img_0127_20240316102801
カバーがかかった左側が図書館からの借り物、帯の付いた右側がアマゾンの中古品。
アマゾンの中古品は、結構綺麗なままですし、売上カードまで付いていたので、書店で売れ残り返品されたものかもですね。


今回アマゾンからゲットできたので、ヤフオクの欲しいものリスト登録、メルカリの新着商品メール通知、ブックオフの入荷時メール連絡は、全て解除で、すっきり。

2024年3月14日 (木)

タイニーBASICの簡易拡張検討 -2 pinModeで指定する数値を確かめる

昨日の続きで、pinModeで使う各MODEの数値の事前確認です。
手元のESP32-WROVER-Eを使って、Serial.print()で実際に確認してみました。
期待した通り、自分のPCとGitHubにあった esp32-hal-gpio.h で定義された値がそのまま割り当てられていました。


実行したスケッチは以下です。
gpio_mode_value_test.ino

Arduino IDEでの実行結果は以下です。
 Ide_20240315123601
実機で確認した通り、自分のPCとGitHubにあった esp32-hal-gpio.h での定義値そのままです。
TinyBasicは十進法しか扱わないので、上記は全て十進法(DEC)で表記。
例えばTinyBasic上でpinModeをANALOGにする場合は、192と記載することになります。


これで、TinyBasicでGPIO操作関数を拡張する際は、各MODEを上記定数値で直接指定する事が出来そうです。

例えば、TinyBasicでGPIOモード設定関数を、例えば "GIOMODE ポート番号,モード値” と定義し、"GIOMODE 26,3" と記述すれば、GPIO26をOUTPUTに出来ると考えます。

GPIOの入出力操作の拡張関数の構想としては、
pinModeに代わり、"GIOMODE ポート番号,モード値"で定義して、関数内でpinModeを実行、
digitalWriteに代わり、”GIOOUT ポート番号,出力値”で定義して、関数内でdigitalWriteを実行、
digitalReadに代わり、”GIOIN ポート番号”で定義して、関数内でdigitalReadを実行。
これで、実現出来そうです。

注意としては、予約語や他のライブラリとの競合なく、分かり易い関数名にしておく必要があるので、少し考え中。


参考
 Arduino 日本語リファレンス (musashinodenpa.com)
 mbed版 豊四季タイニーBASICの機能を拡張してみた。(1) - robo8080のブログ (goo.ne.jp)
 機能拡張のおおまかな話 | 電脳伝説 (wordpress.com)

 



簡易拡張成功の続報あります。

2024年3月13日 (水)

タイニーBASICの簡易拡張検討 -1 拡張事例調査とpinModeのMODE指定値の検討

前回の拡張検討準備の続きです。
図書館からの本の貸し出しには時間がかかるので、前回見つけていた拡張例・関連情報を見て、拡張の検討を始めてみました。

今回主に参照した記事は、以下の robo8080さんの記事で、既に開発されたmbed版豊四季TinyBasicへのIO命令・WAIT命令の追加の説明があり、何をしているかの具体例として大変参考になりそうな感じです。

mbed版 豊四季タイニーBASICの機能を拡張してみた。(1) - robo8080のブログ (goo.ne.jp)

で、中身を少し追ってみました。

そもそもmbedはARM社のプロトタイピング用のワンボードマイコンボードで、独自のMbed SDKという開発環境を用い、プログラミングするものの様です。
いきなり記事に出てくるDigitalOutは、この開発環境下のC言語ライブラリに含まれるGPIO制御関数で、ボードに実装されたLED1~4の4個のLEDの操作も出来る様です。

記事の拡張例では、GPIOへ出力するout関数と、時間待ちするwait関数を追加する例で、
DigitalOut out[2] = {LED1, LED2}; では、out関数でLED1と2の操作だけ有効とするための登録をしておき、
Keywordテーブルへ命令名 OUTとWAIT を追加し、中間コード列挙部分へも同順でI_OUTとI_WAITを追加。
拡張関数iout()とiwait()の本体の記述は参照されるより前の行に追加しておく。
拡張関数は"out io番号, 出力データ"の書式、"wait 待ち時間"の書式で記述する事とし、それぞれ、
TinyBasic内部の処理で呼び出すために、iexe()関数内のcase分岐に、case I_OUT: とcase I_WAITへ追加し、
そのcase処理内で、iout()とiwait()を各々呼び出す形としている。

iout()ではio番号を引数Value1、間に","を入れ、出力データを引数Value2で指定する形なので、
iout()内で、iexp()関数で引数を評価し、非対応な数値範囲と、","無しをエラーで弾き、エラーがなければ、
引数Value1で指定するLED(0ならLED1、1ならLED2)へ、
引数Value2のLSB値だけ取り出す演算をしてから、
out[Value1] = Value2 & 0x01; で書き込みを実行しています。

ESP32では、Arduino IDE環境下での開発になるため、DigitalOutは使えず pinModedigitalWrite を使っての拡張したいGPIO操作関数の追加が必要と思われます。

IOのハードウェア操作部分には、開発環境依存の部分があるのでしょうが、iout()の作り方や、iexe()関数内でのcase分岐の追加方法など、は大変参考になります。

ここまで分かってきたので、ESP32のGPIO操作の拡張もできそうな気がしてきました。
注意:C言語では、戻り値があろうがなかろうが、「全て関数として扱う」との事なので、上記説明では命令やコマンドと言う言葉を使わず関数で統一しました。


Arduino IDE環境下では、例えばpinMode(1,OUTPUT)でGPIO1をOUTPUTに指定できますが、TinyBasicでは言語上の制約があり、簡単にはできない気がして、少し調べました。
要は、"INPUT"や"OUTPUT"と言ったMODEを指定する文字列は、Arduino IDEでは標準的に定義されていて、意識せずに使えますが、TinyBasicはそもそもそんな文字列すら扱えません。
であれば、"INPUT"や"OUTPUT"を使わず、この文字列に割り当てられた元の数値を直接指定すれば、GPIOのモードを数値で設定できそうと考えました。もっとスマートな方法があるかもしれませんが、先ずは簡単でやれそうな方法で進めたいし。
Arduino for ESP32 - ESP32 Forum では、2016年10月8日の古い投稿記事に esp32-hal-gpio.h#define OUTPUT 0x02 等の定数が宣言されているとの記述があったので、これをヒントに調べました。記事が古いので0x02は昔の定義と思われます。

自分のPCにインストールしたArduino関係のフォルダを探し、以下の場所に esp32-hal-gpio.h を見つけました。
見つかった場所(使用環境で変わる様です):C:\Users\username\AppData\Local\Arduino15\packages\esp32\hardware\esp32\2.0.14\cores\esp32\esp32-hal-gpio.h
このファイルに以下の定義部分がありました。
Arduinoと同じにするためOUTPUTを0x02から0x03に変えたコメントもあります。

//GPIO FUNCTIONS
#define INPUT 0x01
// Changed OUTPUT from 0x02 to behave the same as Arduino pinMode(pin,OUTPUT)
// where you can read the state of pin even when it is set as OUTPUT
#define OUTPUT 0x03
#define PULLUP 0x04
#define INPUT_PULLUP 0x05
#define PULLDOWN 0x08
#define INPUT_PULLDOWN 0x09
#define OPEN_DRAIN 0x10
#define OUTPUT_OPEN_DRAIN 0x13
#define ANALOG 0xC0

他にも、LOWが0x0、HIGHが0x1 等の基本的な定数が、ここで定義されているのも確認出来ます。

PC上のesp32-hal-gpio.hとの関係は、理解が及ばない部分ですが、以下のGitHubにも同じものがあります。
arduino-esp32/cores/esp32/esp32-hal-gpio.h at master · espressif/arduino-esp32 · GitHub

そもそも、Arduino IDEを使う際には、ファイル⇒基本設定⇒追加のボードマネージャーで以下のHitHubのファイルを指定をするので、https://raw.githubusercontent.com/espressif/arduino-esp32/gh-pages/package_esp32_index.json
GitHubの方が大元なのでしょうね。

これで上記文字定数の定義値が分かったので、例えばOUTPUTに代わり"3"を、INPUT_PULLUPに代わり"5"を指定する事で、TinyBasicでもpinMode相当の関数を追加できそうです。
pinMode(26,OUTPUT);
digitalWrite(26, HIGH);
digitalWrite(26, LOW);
でGPIO26に繋いだLEDを点滅できたので、OUTPUTの指定は3で問題ないはずです。
もっと簡単で直接的に確認するなら、Serial.print(OUTPUT);等で、シリアルモニタ上でOUTPUTの定義値を確認する事ができそうです。

GPIO操作関数の拡張にだいぶ見込みがたってきました。
まだ拡張の編集など何もしていませんが、次の休日で頑張ってみようかな。 
TinyBasicでpinMode相当の拡張関数が動くようになれば、モード指定に 2 や 3を書いたらどうなるか、実機のTinyBasic上で簡単にできますしね。


2024.3.14追記 Serial.print()でOUTPUT等の定数の値の確認ができました。esp32-hal-gpio.hの定義値のままでした。
2024.3.16追記 GPIO操作の拡張関数の追加が成功しました。

2024年3月 3日 (日)

タイニーBASICの簡易拡張準備

以前、ESP32で豊四季TinyBasic WiFi Telnet対応版を動かせたのですが、GPIO操作命令がないので、Lチカすらできない状態です。
pinMode、digitalWrite、digitalReadに相当する命令や関数だけとかで良いので、簡易的に拡張できないものかと、ネット情報やソースコードを見たりしても、いまいち分からずもんもんとしています。
WiFi Telnet対応版と拡張がなされているとは言え、元は豊四季TinyBasicで、そのソースコードをベースに拡張するのが当然容易なはずなので、そのための有益な情報源を探してネット上をさまよい、拡張に大変参考になりそうな本を見つけました。

鈴木哲哉氏の著書タイニーBASICをCで書く パソコンでもマイコンでも走り、機能拡張し放題 」2016年5月発売 ソシム
Photo_20240303195501
ソシムのこの本のページから、ソースコードのダウンロードができるようです。
Photo_20240309081401_20240310091101
豊四季TinyBasicの制作者鈴木さんが書かれた本で既に絶版なのですが、内部動作や拡張に関する情報が、盛りだくさんの様です。

幸い都立図書館にあったので、最寄り図書館で貸出手続きし、現在確保待ち。都民で良かったー。
入手したら、豊四季TinyBasicの簡易拡張を自由研究としてやってみたいと考えています。

過還暦頭の無謀なチャレンジとは思いつつも、どうなります事やら...
30年程前の、Z80機械語のTinyBasicを独自改変したり、V25でCで独自仕様の簡易インタープリタをゼロから作ったりの、経験の記憶だけで中身は完全に忘却の彼方だし。

 


ESP32で走らせたTiny Basicは以下のものです。
TOYOSHIKI Tiny BASIC for Arduino(ESP32/ESP-WROOM-32) WiFi Telnet対応版
オリジナルの豊四季TinyBasicに対し、robo8080さんがWiFiでTelnet対応されたものです。
Xユーザーのrobo8080さん: 「豊四季タイニーBASICをESP32に移植してみた。
Xユーザーのrobo8080さん: 「ESP32-DevKitCに豊四季タイニーBASICを移植して、WiFi経由でTelnet接続できるようにしてみた。
ESP32-DevKitCでいろいろ実験 - Togetter

GitHubにソース等が置いてあります。
GitHub - robo8080/ttbasic_ESP32_WiFiTelnet: ESP32 WiFi Telnet対応版 豊四季タイニーBASIC

実行中の様子です。
 Photo_20230629183601_20240303095301
Photo_20230822174801_20240303095301

オリジナルの豊四季タイニーBasicの記事も作者の方のブログが以下にありました。
豊四季タイニーBASICのリファレンスを公開 | 電脳伝説 (wordpress.com)
TinyBASIC | 電脳伝説 (wordpress.com) 関係する記事の目次かな。
 機能拡張の大まかな話もあります。
 └機能拡張のおおまかな話 | 電脳伝説 (wordpress.com)

良く読んで理解を進めれば、自分で拡張できるかもしれませんが、ブラウザ画面を見ながらじっくり考えるのはやりにくい感じす。
なので、じっくり考えながら理解を進めやすい、まとまった情報源が欲しいところです。
今回、作者の書かれた拡張に超役立ちそうな本があるのを発見できたので、すごく頼りになる気がします。

これの立ち読み版のpdfもあります。
https://www.socym.co.jp/samplebook/1020.pdf

本は絶版で入手困難ですが、都立図書館にあり協力貸出対応、最寄り図書館へ手配を依頼、先ずは借りて見てみるのが先決との思い。
アマゾンの中古は6,000円と高いし、ヤフーショッピングなら8,000円〜12,000円ともっと高い。ヤフオクなら落札価格は3,400円程度なるも現在出品なし、欲しいものリストへ登録、多少は期待できそうかな。メルカリなら3,500円程度ですが全部売り切れ、新着商品のメール通知を設定し出品待ち、でも期待は薄いかな。ブックオフで入荷時メール連絡を依頼したけどいつになるか期待は超薄。国会図書館にはあるけど行かないと閲覧できないし、行く気力もなし。日本の古本屋の検索はヒットなし、JINBOU BOOK TOWNの古書検索でもヒットなし、過還暦で古書店を探し回る体力気力はもはやなし。うーん、中古を買うとしても一度読んで本当に必要と判断してからかな。

2024-3-16追記 図書館から3/13に借りました。同時にアマゾンの中古品を3/14にゲットしました。

簡易拡張の方法に関し続報あり。


参考:拡張例・関連情報

robo8080さんの記事で、mbedへの豊四季TinyBasicの移植の説明があり、参考になります。
別マイコンへの移植に役立ちそうな事例。
豊四季タイニーBASICをmbedに移植してみた。 - robo8080のブログ (goo.ne.jp)
上記で、IOへのOUT命令とWAIT命令を追加した事例。何をしているかについては大変参考になります。
mbed版 豊四季タイニーBASICの機能を拡張してみた。(1) - robo8080のブログ (goo.ne.jp)

 上記を参照し、簡易拡張の方法を少し掘り下げてみました

他にも拡張したブログ記事も見付けました。
TinyBASICプロジェクト - ネコマ製作所 (make-lab.sakura.ne.jp)

PIC用にLED操作など拡張された豊四季Tiny Basicの記事 (制作者鈴木さんご自身の拡張例ですが、参考にするには違い過ぎたかも)
豊四季タイニーBASIC拡張例 | 電脳伝説 (wordpress.com)

他、ESP32以外でも使えそうで、移植・改変しやすそうなTiny Basicの記事がありました。こちらは将来用かな。
Natural Tiny Basic (NT-Basic) (cubeatsystems.com)
397 行で tiny basic のインタプリタを作る #C++ - Qiita


« 2024年2月 | トップページ | 2024年4月 »