「豊四季Tiny Basic for micro:bit」は、オリジナル版「TOYOSHIKI Tiny BASIC for Arduino」を
Arduino micro:bit向けに移植・機能拡張したプログラムです。
オリジナル版配布サイト https://github.com/vintagechips/ttbasic_arduino
関連情報 電脳伝説 Vintagechips - 豊四季タイニーBASIC確定版
「豊四季タイニーBASIC」の著作権は開発者のTetsuya Suzuki氏にあります.
プログラム利用については、オリジナル版の著作権者の配布条件に従うものとします .
著作権者の同意なしに経済的な利益を得てはいけません.
この条件のもとで、利用、複写、改編、再配布を認めます.
バイナリファイルのみの配布は行わないで下さい.
「豊四季Tiny Basic for micro:bit」のコマンドの使い方等は
リファレンス・マニュアル「Toyosiki Tiny BASIC for microbit V008.pdf」を参照して下さい。
修正内容
- ラインエディタ部の差し換え
オリジナルのラインエディタ部分をフルスリーンテキストエディタに差し換えました.
ターミナル上で昔のBASICっぽい編集操作を出来るようにしました.
日本語全角文字列(シフトJIS)が利用出来るようになりました.
編集キー [F7]:行の分割、[F8]:行の結合を追加しました.
美咲フォントの利用が可能になりました.
V0.06版からカーソルキーのキーコードを変更しました (マニュアルを確認下さい)
カーソルキーのコードKUP、KDOWN、LRIGHT、KLEFT追加
(new!)プログラム保存領域を8本から16本に増やしました。
(new!)UARTコマンドの追加。任意のピンにてシリアル通信が可能になりました。
(new!)CLINEコマンドの追加。文字による直線描画機能を追加しました。
注意事項
UARTコマンドの追加にあたり、Arduino micro:bitのコアモジュールのソースの一部を修正しています。 スケッチをコンパイルする場合はUart.hにARDUINO_GENERICの定義の追加が必要となります。
\AppData\Local\Arduino15\packages\sandeepmistry\hardware\nRF5\0.5.1\cores\nRF5\Uart.h
#include "HardwareSerial.h"
#include "RingBuffer.h"
#include <cstddef>
// <-- add by Tamakichi 2018/05/06
#define ARDUINO_GENERIC
-
コマンドの追加
-
(new!)UART :指定ピンをシリアル通信(TxD、RxD)に利用する
-
(new!)CLINE :文字による直線・矩形・塗りつぶし四角の描画
-
RENUM :行番号再割り当て
-
CLS :画面クリア
-
LOCATE:カーソル移動
-
COLOR: 文字色の指定
-
ATTR:文字装飾の指定
-
WAIT n:時間待ち(マイクロ秒)
-
VPEEK:スクリーン位置の文字コード参照
-
CHR$()、HEX$()、BIN$()、ASC()、INKEY() 関数の追加
-
TICK() 関数追加
-
?:PRINT文の省略系を追加
-
AND、OR、!、~、!の追加
-
GPIO、OUT、IN()、ANA()、SHIFTIN、SHIFTOUT:GPIO利用コマンドの追加
-
I2Cコマンド対応
-
FILES、SAVE、LOAD: 内部フラッシュメモリへのプログラム保存機能の追加
-
ACCEL x,y,z:加速度センサーの値取得
-
LEDマトリックスの描画・制御コマンド追加
- PSET x,y,c:点の描画
- LINE x1,y1,x2,y2,c:線の描画
- RECT x1,y1,w,h,c,mode:矩形の描画
- CIRCLE x,y,r,c,mode:円の描画
- MSG 方向,ウェイト,"文字列":テキストメッセージの表示
- GSCROLL x1,y1,x2,y2,方向:スクロール
- GPRINT x,y,"文字列":指定位置に文字の表示
- BITMAP x,y,データ格納アドレス,インデックス,h,w [,倍率]:ビットマップの表示
- MATRIX ON|OFF :LEDマトリックス利用のON・OFF
-
PCG(文字定義機能)の追加
- CLP :書き換えたFNT領域のデータをデフォルトに戻す
- SETFONT 文字コード,d1,d2,d3,d4,d5:指定した文字の5x5ドットフォントデータの設定
(FNT領域にPOKE文で変更する方法でも可能)
-
PWM制御コマンドの追加
- POUT pinNo,dty:PWM出力(dty に0~255で指定、255で100%)
※STM32版と異なり、GPIOコマンドによるピンモード設定は不要
※PWMは同時に3つまで利用可能
- POUT pinNo,dty:PWM出力(dty に0~255で指定、255で100%)
-
NeoPixel制御コマンドの追加
- NPBEGIN datPin, LED数:NeoPixelの利用を開始する
- NPEND:NeoPixelの利用を終了する
- NPCLS:LEDの表示クリア
- NPRGB LEDNo, R, G, B [,表示指定]:指定したLEDの表示色RGB指定
LEDNoは0~LED数-1、R、G、Bは0~255で指定
表示指定:0 設定のみで表示しない、1 指定した表示を行う(デフォルト) - NPPSET LEDNo, 色 [,表示指定]:指定したLEDの表示色指定
LEDNoは0~LED数-1、色は2バイト 0~32767(RGBの順番で各色5ビット)
表示指定:0 設定のみで表示しない、1 指定した表示を行う(デフォルト) - NPPUT LEDNo, 仮想アドレス, 転送数, バイト長 [,表示指定]:ピクセルデータの転送
バイト長は1,2,3の指定が可能。
1の場合RGBは3,3,2ビット割当て、2の場合は5,5,5、3の場合は8,8,8 - NPSHOW :設定を表示に反映する
- NPSHIFT UP|DOWN [, ループ指定 [,表示指定]] :表示を1つシフトする
- NPLEVEL 輝度:NPPSET、NPPUTで指定した色の輝度補正値を設定する
輝度:0~3(デフォルト 0) - 関数 RGB(R,G,B) :R、G、Bから2バイト色コード (0~32767)を求める
R、G、Bは0~31の範囲で指定する - 関数 RGB8(R,G,B) :R(0-7)、G(0-7)、B(0-3)から色コード (0~255)を求める
-
サウンド対応コマンドの追加
- TONE 周波数(Hz) [,出力期間(msec)]
PN8ピン(SETTONEコマンドで変更可能)に接続している圧電スピーカーから
指定した周波数の音を出力する。出力期間省略時は出力を継続する。 - NOTONE :サウンド出力停止
- SETTONE ピン番号:サウンド出力で利用するポートを設定する
- PLAY "MML文" : 指定したMML文(文字列)を演奏する。
- TEMPO テンポ : PLAY文の演奏テンポを設定する(デフォルト 120)
- TONE 周波数(Hz) [,出力期間(msec)]
-
全角文字列を扱う関数、美咲フォント関連の追加
- **WLEN(**文字列):LEN()の全角文字列対応版.文字数をカウントする
- WASC(文字列[,文字位置]):ASC()の全角対応版.文字コード(SJIS)を取得する
- WCHAR
$
(SJISコード):CHR$
()の全角対応版.文字コードの文字を取得する - WSTR
$
(変数[
,位置,文字数]]
):STR$
()の全角対応版. 変数が参照している文字列を返す - WADR(SJISコード):SJISコードで指定したフォントデータ格納アドレスを取得する
- FNT2:定数 美咲フォントデータ格納先頭アドレス
- GETS(仮想アドレス[,有効バイト数]):文字列入力関数.文字入力を行いその格納アドエスを返す.
-
その他
- V0.06の不具合対応
- MATRIX OFFコマンド実行時にポートの初期化し忘れの対応
- V0.05の不具合対応
- RND(n)を0~n-1に修正
- LEDマトリックスの色指定コード2(反転)の対応
- WIDTHで設定出来ない不具合対応
- 2進数定数対応:`101010の形式で1から16ビットを定義
- RTC系コマンドのサポート(SETDATE、GATDATE、GETTIME、DATE)
- 関数 GRADE(値, 配列No,個数)の追加
等級を求める関数(サンプルプログラム参照)
- V0.06の不具合対応
-
文法の変更
- 定数の16進数表記対応(例 $1234,$AB)
- 命令文区切りを';'から':'に変更
- PRINT文の行継続を';'でも可能に変更
- PRINT文の数値桁指定#nのnにマイナス値指定時、空白ではなく0埋め出来るように追加
- IF文の不一致判定を"!="でも可能に変更、ELSE文対応
- 演算子 剰余計算'%'、シフト演算子 '>>'、'<<'を追加
- 論理積・論理和 '|'、'&'ビット演算子を追加
- STOP命令をENDに変更
- SIZEをFREEに変更
- 文字列囲みにシングルクォーテーションを利用出来ないように変更
- コメントをシングルクォーテーション(')での記述出来るように修正
- 配列の連続値設定を可能した(例: @(0)=1,2,3,4,5)
- GOTO,GOSUBをラベル対応(例: GOTO "ラベル" ダブルクォーテーション囲み)
- INPUT文の入力改善、オーバーフローエラー回避対策追加
-
その他
- (new!)プログラム保存領域を16本に拡大
- (new!)UARTコマンド、CLINEコマンドの追加
- プログラム領域を256バイトから4096バイトに拡大
- 配列サイズを32から100に拡大
- 変数はA~Zの他に、A0..A6 ~ Z0..Z6の数字を付けた2桁も利用可能
- リセット
- ボタンAを5秒間押し続けた後、ボタンAを離す
- プログラムno.0の自動起動
- ボタンBを押しながら電源を入れるまたはリセットボタンでリセットする
- ボタンA、ボタンBを5秒間押し続けた後、ボタンAだけ離す
本プログラムは下記のライブラリを利用しています。
- misakiフォントライブラリSJIS版(組込済み)
https://github.com/Tamakichi/Arduino-misakiSJIS - mcursesライブラリ(組込済み)
https://github.com/ChrisMicro/mcurses - Adafruit_microbit_Matrix (組込済み)(Adafruit_Microbit libraryを流用し改造)
https://github.com/adafruit/Adafruit_Microbit - nrf51-neopixel (組込済み)Arduino対応して組み込み
https://github.com/lavallc/nrf51-neopixel - Adafruit MMA8653 library (要別途インストール)下記のページのリンクからダウンロード
https://learn.adafruit.com/use-micro-bit-with-arduino/accelerometer-and-magnetometer - Adafruit GFX library(要別途インストール)下記のページのリンクからダウンロード
https://learn.adafruit.com/adafruit-gfx-graphics-library/
-
ダウンロード
https://github.com/Tamakichi/ttbasic_microbit/archive/master.zip -
インストトール
micro:bitを接続します。
micro:bitのドライブ MICROBITを開いてファイルを書き込める状態にします。
ダウンロードファイル ttbasic_microbit-master.zipを解凍します。
フォルダbin内のttbasic_microbit.ino.hexをmicro:bit用のドライブにドラック&ドロップします。 プログラム書き込みが終了したら、ターミナルソフト(TeraTerm)等でシリアル接続します。
スクリーンサイス 80列x24行
ターミナル通信条件
通信速度:115200bbs、パリティ:none、ストップビット:1、フロー制御:なし
TeraTermを利用して、プログラムをコピー&ペーストして取り込み場合は、
送信遅延を1ミリ秒/字に設定して下さい。
利用可能キー
- カーソル移動 カーソルキー
- [Delete]、[CTRL-X] :カーソル位置の文字削除
- [BackSpace]:カーソル前の文字削除と前に移動
- [PageUP]、[PageDown]、[CTRL-R]:画面の再表示
- [HOME]、[END]:行内でカーソルを左端、右端に移動
- [INS]:挿入・上書きのトグル切り替え
- [Enter]:行入力確定
- [ESC]2回押し、[CTRL-C]:実行プログラムの中断
- [CTRL-L]、[F1]:画面のクリア
- [CTRL-R]、[F5]:画面再表示
- ピン: PN0 ~ PN32 で指定、または 0 ~ 32で指定する
- ピンモード指定コマンド :GPIO ピン, OUTPUT|INPUT_PU|INPUT_PD|INPUT_FL"
- デジタル出力:OUT ピン, HIGH|LOW|0|1
- デジタル入力:変数=IN(ピン)
- アナログ入力:変数=ANA(ピン)
10 FOR I=0 TO 10
20 FOR J=0 TO 10
30 COLOR RND(8): ? "*";
35 WAIT 100
40 NEXT J
50 ?
60 NEXT I
1 'Lチカ
5 MATRIX OFF
10 GPIO 3,OUTPUT
20 OUT 3,LOW
30 GPIO 26,OUTPUT
35 "@loop"
40 OUT 26,HIGH
50 WAIT 300
60 OUT 26,LOW
70 WAIT 300
80 GOTO "@loop"
10 CLS
20 A=ANA(PN0)
30 LOCATE 5,5:?A;" "
40 GOTO 20
10 CLS
20 IF !IN(BTNA) ?"Button A"
30 IF !IN(BTNB) ?"Button B"
40 WAIT 200
50 GOTO 20
10 CLS 1
20 D=1
30 FOR Y=0 TO 4
40 FOR X=0 TO 4
50 PSET X,Y,D
60 WAIT 100
70 NEXT X
80 NEXT Y
90 IF D D=0 ELSE D=1
100 GOTO 30
10 CLS 1
20 MSG LEFT,200,"コンニチハ"
30 FOR I=O TO 30
40 MSG DOWN,50,I/10
50 WAIT 50
60 MSG LEFT,100,I%10
70 NEXT I
80 WAIT 500
90 GOTO 20
10 POKE FNT+ASC("A")*5+0,`00000000
20 POKE FNT+ASC("A")*5+1,`01010000
30 POKE FNT+ASC("A")*5+2,`00000000
40 POKE FNT+ASC("A")*5+3,`10001000
50 POKE FNT+ASC("A")*5+4,`01110000
60 MSG TOP,0,"A"
10 SETFONT ASC("A"),$00,$50,$00,$88,$70
MSG TOP,0,"A"
10 'Neopixel(1)
20 NPBEGIN 0,16
30 NPCLS
40 FOR I=0 TO 7
50 NPRGB I,0,0,(2<<I)-1
60 NEXT I
70 NPSHIFT 1
80 WAIT 50
90 GOTO 70
10 'Keypad 4x4
20 G0=-1
30 @(10)=1013,920,840,780,670,630,590,560,502,477,455,435,400,320,267,228
40 G0=G
50 G=GRADE(ANA(1),10,16)
60 IF G<>G0 WAIT 1 GOTO 40
70 IF G>=0 ?"KEY=[";G+1;"]"
80 GOTO 40
1 'トケイ
10 MATRIX ON
20 SETDATE 2018,1,16,12,0,0
30 IF !IN(BTNA) GOSUB "@ShowTime"
40 WAIT 200
50 GOTO 30
60 "@ShowTime"
70 GETTIME T1,T2,T3
80 MSG LEFT,80,#-2,T1;":";T2;":";T3;" "
90 RETURN
1 '美咲フォントの利用
10 S="あ"
20 A=WADR(WASC(S))
30 FOR Y=0 TO 7
40 D=PEEK(A+Y)
50 FOR X=0 TO 7
60 IF D&($80>>X) ?"■"; ELSE ?" ";
70 NEXT X
80 ?
90 NEXT Y
10 'NeoPixelで文字表示
20 SETFONT 0,$50,$A8,$88,$88,$70
30 MSG TOP,0,CHR$(0)
40 NPBEGIN 12,64
50 NPCLS
60 S="こんにちは☆さい玉":C0=RGB8(0,2,3)
70 FOR I=1 TO WLEN(S)
80 A=WADR(WASC(S,I))
90 FOR Y=0 TO 7
100 D=PEEK(A+Y)
110 FOR X=0 TO 7
120 IF D&($80>>X) C=C0 ELSE C=0
130 IF Y&1 POKE MEM+Y*8+X,C ELSE POKE MEM+Y*8+7-X,C
140 NEXT X
150 NEXT Y
160 NPPUT 0,MEM,64,1
170 WAIT 400
180 NEXT I
190 GOTO 70
1 'PCG EDIT
5 ATTR 0:COLOR 7
10 CLS:CLS 1:CLV:LET @(20)=79,42
20 FOR I=0 TO 4:FOR J=0 TO 4
30 LOCATE I,J:?CHR$(@(20));:NEXT J:NEXT I:GOSUB 500
40 K=INKEY()
50 X=X+(K=KRIGHT)*(X<4)-(K=KLEFT)*(X>0)
60 Y=Y+(K=KDOWN)*(Y<4)-(K=KUP)*(Y>0)
70 LOCATE X,Y:C=VPEEK(X,Y)
75 ATTR 2:?CHR$(C):LOCATE X,Y:WAIT 100:ATTR 0:?CHR$(C):LOCATE X,Y
80 IF K=32:IF C=@(20) P=@(21) ELSE IF C=@(21) P=@(20)
90 IF K<>32 GOTO 40
100 ?CHR$(P);
110 FOR I=0 TO 4:D=0
120 FOR J=0 TO 4:C=VPEEK(J,I)
130 IF C=@(21) D=D+(1<<(7-J))
140 NEXT J:@(I)=D
150 NEXT I
160 GOSUB 500:GOTO 40
500 LOCATE 0,10:?"SETFONT ASC(";CHR$(34,90,34,41);
510 FOR I=0 TO 4:?",$";HEX$(@(I),2);:NEXT I
520 SETFONT ASC("Z"),@(0),@(1),@(2),@(3),@(4)
530 MSG TOP,0,"Z"
540 RETURN
TOYOSHIKI Tiny BASIC for Arduino
The code tested in Arduino Uno R3. Use UART terminal, or temporarily use Arduino IDE serial monitor.
Operation example
> list 10 FOR I=2 TO -2 STEP -1; GOSUB 100; NEXT I 20 STOP 100 REM Subroutine 110 PRINT ABS(I); RETURN
OK >run 2 1 0 1 2
OK >
The grammar is the same as PALO ALTO TinyBASIC by Li-Chen Wang Except 3 point to show below.
(1)The contracted form of the description is invalid.
(2)Force abort key PALO ALTO TinyBASIC -> [Ctrl]+[C] TOYOSHIKI TinyBASIC -> [ESC] NOTE: Probably, there is no input means in serial monitor.
(3)Other some beyond my expectations.
(C)2012 Tetsuya Suzuki GNU General Public License