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がなかったりでした。よって、自作することを決めました。
私の要求は以下です。
・軽くて小さい
・簡単なIDE(MSX同様)
・WiFiが使える
・GPIOが使える
・GPIOが設定可能
オプションです。
・色対応
・IDEで行全体が見れる
・LOAD/SAVEコマンド対応
・大文字、小文字対応。ただし、コマンドとして全て大文字に置き換え
・:でコマンドの区分け
・2進数、16進数入力可能
・AD変換機対応
・IF 用ELSEおよびEND。(限定的なELSEは実装済み)
実装項目
本ソフトは下記から構成されています。元の実装があったため、非常に助かりました。作成者に感謝です。
・BASIC実行部
豊四季さんのタイニーBASICを元にしています。
* IDE
AntirezさんおKiloエディタが元です。
* GPIO IF
pigpioを利用しています。
コンパイルおよび実行(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 コマンドに対して, 以下を追加しています(IchigoJamとMSXが元です)。
コマンド | 詳細 |
---|---|
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ピン配置も作成しました。pdfとodsです。
各ポートは入力( 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 です。
例:(設定ファイルとプログラム例は後述)
サポートしている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がチャンネル番号です。
例
下記がいくつかのコマンド例です。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) 任意番号
以下が上記の例です。例では物理的に同じピンを、別の論理番号に設定しています。
最後に、以下がテストに用いた設定ファイルとプログラムです。
入力には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 を変更)
1歳10ヶ月でお箸!
子供が1歳半を過ぎたころ、自分もお箸を欲しがりはじめました。小さいのがあったので渡しました。
以降、毎食にとりあえず子供のお箸も食卓に並べました。言葉も通じないので教えることができず、使えるなら使ってみ〜って感じです。
気がつくと、勝手になんとか使えそうになり、1歳10ヶ月でご覧のとおり。
youtubeにも映像をあげました。