TanbaBASIC: Raspberry PI GPIO 対応 BASIC 言語実行環境!

教育のため、本BASIC言語実行環境を作成しました。
現状、私の要求(Raspberry PIのGPIO含む)に対して動作していますが、あまり時間がなく、十分なテスト等を行っていないです。
RPIを数台保有していて、問題なく動作していますが、ライセンスにも記載されていますように、本ソフトは NO Warrantyです。


コードはこちらです。

 

なぜBASIC言語

初めて学んだ言語はBASICでした。プログラミングを始めるためには最も良い言語でした。

現在になると、プログラミングを学ぶための言語について終わりのない議論が行われています。
多数意見を読み、私の結論はBASICです。この議論については述べませんが、現在のPCでどうしたらBASICを学ぶことがきるのかについて悩んでいました。

 

ある日、IchigoJamを見つけました。これだ!と思い、早速試しました。
私がプログラミングをはじめたころ、主にモニターで何かを表示するプログラムが面白かったので、PRINT等を子供に教えようとしたら、やってくれるけど、あまり興味を持って貰えなく。

 

しかし、LEDを操作して見せたら、面白いのか、興味を持つようになったので、LED、モータやセンサーをGPIOに接続して教えてきました。
モータを使った例では、GPIOから長い配線をしたおもちゃの車がありますが、配線が限界でした。

IchigoJamが無線になったらと思い、探しはじめました。無線の場合、さらにモニターがつけれなくても、遠隔でデバッグもできます。
RPI用のIchigoJamはありますが、これはISOのイメージが提供されていて、WiFiは使えないです。
よって、Linux用のBASICを探し始めました。これを蓄電池で動作するRPI Zeroに入れ、sshで入り、BASICを立ち上げて遠隔で操作する、って案です。
しかし、既存のLinux用BASICは、RPIのGPIOに対応していなかったり、重すぎたり(遅すぎ)、複雑すぎたり(コード理解&GPIO対応困難)、
軽い場合はIDEがなかったりでした。よって、自作することを決めました。

 

 

f:id:tanbalabs:20200712221943p:plain

 

私の要求は以下です。
・軽くて小さい
・簡単なIDEMSX同様)
WiFiが使える
・GPIOが使える
・GPIOが設定可能

オプションです。
・色対応
IDEで行全体が見れる
・LOAD/SAVEコマンド対応
・大文字、小文字対応。ただし、コマンドとして全て大文字に置き換え
・:でコマンドの区分け
・2進数、16進数入力可能
・AD変換機対応
・IF 用ELSEおよびEND。(限定的なELSEは実装済み)
 

実装項目

本ソフトは下記から構成されています。元の実装があったため、非常に助かりました。作成者に感謝です。


・BASIC実行部
豊四季さんのタイニーBASICを元にしています。
* IDE
AntirezさんおKiloエディタが元です。
* GPIO IF
pigpioを利用しています。

f:id:tanbalabs:20200712222006p:plain

 

 コンパイルおよび実行(GPIO無し。RPI限定ではないですが、GPIOコマンドは効果ないです)

    make

実行:

    ./tanbabasic


 GPIO有でコンパイルおよび実行(RPI用)。
   pigpioのインストるが必要。

      (sudo apt-get install pigpio) 

      make rpi

RPIでGPIOありの実行(GPIOの設定はファイル形式は後述):
     sudo ./tanbabasic <設定ファイ>


Tanba BASIC IDE コマンド

CTRL + S IDEエディタ情報を保存 (BASICのSAVEコマンドではなです。)
ESC プログラム実行を停止
CTRL + Q Tanba BASICを終了.プログラム実行の際、最初に実行を停止のこと(ESCキー)。

   問題
たまに ESCキーが使えなくなり、プログラムを停止できなくなります。
再現できていない状態です。唯一の停止方法をプロセスをkillすることです。
再現できたら直したいです。


Tanba BASIC コマンド:
  TinyBasic コマンドに対して, 以下を追加しています(IchigoJamMSXが元です)。

コマンド 詳細
INKEY() キーコードを出力。特別キー
    0: 何も押されていない。
      9: TAB
    13: ENTER
    28: 右
    29: 左
    30:上
    31:下
IF用ELSE(全て一行) 元のTinyBasicはIFのみに対応しており、さらに全て(IFおよび条件後に実行するコマンド)は一行に記述する必要があります。ここではELSEも使えるようにしましたが、ここでも全てが一行にあり、かつこの一行には一つのみのIFに対応しています(複数IFとELSEがある場合、動作は未定義です)。
CLS 画面クリア
COLOR N1,N2

色の設定  

    N1: 文字の色  N2:(オプション)背景の色。  

    COLOR -1,N2で背景のみを変更。  

    N1とN2は0-255の数値、または後述の色コード。  

    本コマンドは下記のSGR 30-37,39,90-97,40-47,49,100-107で上書き。

SGR N

ターミナルのSGRを設定。  

    38 および 48は効果がないです (COLOR で設定).  

    TanbaBASIC 特別コード:HL または HIGHLIGHTはBASICの強調モードに切り替え。他のコードはHLを無効にする。

LOCATE X,Y カーソルをX,Yに設定。
LC X,Y 同上
LOAD "STR" STRで指定されたファイルのプログラムを読み込み。(Linux形式)(注意:ロードしない場合があります。デバッグ中)
SAVE "STR" STRで指定したファイルにプログラムを保存。
RESIZE W,H ターミナルの大きさをW,Hに変更。(注意:効果がないターミナルもあります)
WAIT TIME TIMEセンチ秒待ち(WSL1ではバグのため、待たない )。
? PRINTのかわりに?が使える。

RPI用GPIOコマンド。ポート番号は後述の設定ファイルを参考のこと。
IO利用にあたり、追加回路が必要です。

I/Oコマンド 詳細
IN(N) ポートNの入力を取得
OUT N1,N2 ポートN1にN2を出力。N2>0の場合、1を出力。
OUT N Nの各16 ビットは対応する論理ポートに出力。論理ポート選定は設定ファイルのOUT_MODEで決められる(後述)。


数値形式

数値は2, 10, 16進数で表現が可能です。2進数は ` または 0Bで指定. 16進
数は0Xで指定。例:以下は全て10進数の10です。

    `1010
    0B1010
    0XA

利用例

    A=0XA
    ? 0XA 
    OUT 0XA


対応RPI
下記でテストしております。

  * 初期 Model B
  * Pi3B
  * Pi zero

ここのように、三種類のGPIOがあります。
上記テストに使った機種は、type 1と3が対象のため、本ソフトはtype 2では動作しないようにしています
type 2 で動作させたい場合、rpi.c の if (type==2)部分をコメントして試しても良いですが、動作未確認です。

RPI用GPIO設定ファイル形式

設定ファイルはポート番号とモードを設定します。
RPIにはポート番号を指定する二つの方法があります:BOARD (pin番号)および BCM (GPIO 番号)
Tanba BASICでは以下のように論理ポート番号を設定できます。
1) BOARDと同じ番号を利用
2) BCMと同じ番号を利用
3) 別の論理番号をBOARDまたはBCMに利用。
例:IchigoJamと同じポート番号を利用
RPI用のIchigoJanピン配置も作成しました。pdfodsです。

f:id:tanbalabs:20200718095308j:plain




各ポートは入力( pullup/down)か出力に設定できます。

ファイル形式:

項目 詳細
# 行の#以降は全てコメントです。
BOARD または BCM 最初の有効行は必ず BOARD かBCMにする(上記説明の通り)。
OUT_MODE M 最初の有効行の BOARD または BCMの後のオプション。OUT Nに使われる。下記参考
ADC_MAIN ADC_TYPE 有効2行目のオプション。ADC_TYPEがサポートされているADCチップ。下記参考
P,OUT GPIOポートP (BOARD か BCM) を出力に設定。論理ポートもPになる。
P,OUTN

GPIOポートP (BOARD か BCM) を出力に設定。論理ポートはNになる。注意:OUTとNの間に空白はない。

P,IN,MODE  GPIOポートP (BOARD か BCM) を入力に設定。論理ポートもPになる。MODEはオプションであり、次のいずれか:PULLOFF(clear), PULLUP または PULLDOWN
P,INN,MODE  GPIOポートP (BOARD か BCM) を入力に設定。論理ポートはNになる。MODEは上記の通り。注意:INとNの間に空白はない。

 

上記より、最初の有効行は以下のいずれかです。

  BOARD
  BCM
  BOARD OUT_MODE M
  BCM OUT_MODE M

OUT_MODEのMは、OUT NのNの各ビットがどの論理ポートに出力されるのかを定義します。
M>=0 : 論理ポート番号は M で始まるが、定義されていない論理ポートには出力しないです。
M< 0 : 定義された論理ポート順のみになります。
Mのデフォルトは 0 です。

例:(設定ファイルとプログラム例は後述)

f:id:tanbalabs:20200718095154p:plain

サポートしているADC

前述のGPIO設定ファイルの通り、ADCチップは下記の通りに設定できます。

  ADC_MAIN ADC_TYPE

ADC_MAINは、Main SPIを利用の意味です(Aux SPIは未実装)。

下記のADC_TYPEのソースコードを記述しています。
送信データが全タイプで確認していますが、MCP3202しか保有していないため、完全テストはこのチップのみです。

     MCP3002
     MCP3004
     MCP3008
     MCP3202 (完全テストはこれのみ)
     MCP3204
     MCP3208

RPIとADCの配線および交換されるデータは下記図の通りです。
MCPはSingle-Ended modeで動作します (SGL/DIFFを1に設定).存在する場合、MSBFは0に設定しています。詳細はそれぞれのハードの仕様をネットで確認ください。
回路図の通り、ADCをCE0に接続する必要があります。

ADCデータを取得するためには、前述の ANA(N)を使います。Nがチャンネル番号です。

f:id:tanbalabs:20200727181823p:plain


下記がいくつかのコマンド例です。LOADを使って読み込んで、RUNで実行します。

プログラム 詳細
test/lc.bas LC 例
test/inkey.bas INKEY 例。ESCで停止
test/resize.bas RESIZE 例(ターミナルにより効果がない場合があります)
test/color.bas COLOR 例
test/sgr.bas SGR 例
test/bin_hex.bas 2進数、16進数例

 

GPIO 例

GPIOはボタンやLED/モータでテストしました。

初心者の場合、特にボタンの動作の問題等を認識するため、ここの確認をおすすめします。
入力の場合、PULLUP/DOWN抵抗で試しました。

上記のように、論理ポートは以下の通りに設定できます。
a) ボードの番号に同じ
b) GPIO番号に同じ
c) 任意番号

以下が上記の例です。例では物理的に同じピンを、別の論理番号に設定しています。

f:id:tanbalabs:20200718095232p:plain



最後に、以下がテストに用いた設定ファイルとプログラムです。
入力にはPULLUP/DOWNボタン、出力にはLEDを使いました。

UARTポート(GPIO14と15)はテストしていないです。

バイス 設定ファイル プログラム
PI Z/3B test/rpiv3_bcm_in_out.cfg test/v3_bcm_in_2_7_out_8_13.bas
PI Z/3B test/rpiv3_bcm_in_out.cfg test/v3_bcm_in_16_21_out_22_27.bas
PI Z/3B test/rpiv3_bcm_out_in.cfg test/v3_bcm_out_2_7_in_8_13.bas
PI Z/3B test/rpiv3_bcm_out_in.cfg test/v3_bcm_out_16_21_in_22_17.bas
PI Z/3B test/rpiv3_bcm_ichigo.cfg test/v3_ichigo.bas
PI Z/3B test/rpiv3_board_in_out.cfg test/v3_board_in_3_13_out_15_22.bas
PI Z/3B test/rpiv3_board_in_out.cfg test/v3_board_in_23_32_out_33_40.bas
PI Z/3B test/rpiv3_board_out_in.cfg test/v3_board_out_3_13_in_15_22.bas
PI Z/3B test/rpiv3_board_out_in.cfg test/v3_board_out_23_32_in_33_40.bas
PI Z/3B test/rpiv3_board_ichigo.cfg test/v3_ichigo.bas
PI B test/rpiv1_bcm_in_out.cfg test/v1_bcm_in_0_7_out_8_11.bas
PI B test/rpiv1_bcm_in_out.cfg test/v1_bcm_in_17_21_out_22_25.bas
PI B test/rpiv1_bcm_out_in.cfg test/v1_bcm_out_0_7_in_8_11.bas
PI B test/rpiv1_bcm_out_in.cfg test/v1_bcm_out_7_21_in_22_25.bas
PI B test/rpiv1_bcm_ichigo.cfg test/v1_2_ichigo.bas
PI B test/rpiv1_2_board_in_out.cfg test/v1_2_board_in_3_11_out_12_16.bas
PI B test/rpiv1_2_board_in_out.cfg test/v1_2_board_in_18_21_out_22_26.bas
PI B test/rpiv1_2_board_out_in.cfg test/v1_2_board_out_3_11_in_12_16.bas
PI B test/rpiv1_2_board_out_in.cfg test/v1_2_board_out_11_21_in_22_26.bas
PI B test/rpiv1_2_board_ichigo.cfg test/v1_2_ichigo.bas


OUT_MODE 例(上記図等の参考のこと)

バイス 設定ファイル プログラム
PI Z/3B test/rpiv3_bcm_out_mode_default.cfg test/v3_out_mode.bas
PI Z/3B test/rpiv3_bcm_out_mode_0.cfg test/v3_out_mode.bas
PI Z/3B test/rpiv3_bcm_out_mode_2.cfg test/v3_out_mode.bas
PI Z/3B test/rpiv3_bcm_out_mode_defined.cfg test/v3_out_mode.bas

 

ADC MCP3202 例

 

バイス 設定ファイル プログラム
PI B test/rpiv1_2_board_ichigo_mcp3202.cfg test/adc.bas
PI Z/3B test/test/rpiv3_bcm_ichigo_mcp3202.cfg test/adc.bas

 色コード

 色選定方法はこちら(pdf)こちら(ods)を確認
Check this file ([pdf](color.pdf), [ods](color.ods)) on how I defined the color codes.

利用できる色のコードは次です。

BLACK
BLUE
BROWN
CYAN
DARKBLUE
DARKGREEN
DARKRED
DARKVIOLET
DEEPPINK
GOLD
GRAY
GREEN
LIME
MAGENTA
MAROON
ORANGE
ORANGERED
PINK
PURPLE
RED
VIOLET
WHITE
YELLOW

制限

* 1行は256文字まで
* Basic プログラムは8192バイトまで。これは静的にlistbuf (t_ttbasic.c)で確保されます。私の使ったシステムでは上限は32kです (tanba.hのSIZE_LIST を変更)