IchigoJam Advent Calendar 2019 - Day 8

ふうせん🎈 Fu-sen. です。

2019年12月6日、IchigoJam BASIC 1.4.1 が正式公開されました。
1.4 系になった~~~!! 👏パチパチパチ…
という事で緊急企画でこの記事を作ったのです。

IchigoJam BASIC 1.4.1

IchigoJam 公式サイトのダウンロードページからファームウェアをダウンロードできます。

※ IchigoJam ap は含まれていません。ベータ版 1.4b13 をダウンロードして下さい。

イチゴジャム レシピ にファームウェアの更新方法を入れてあります。

ファームウェアの更新に必要な USB-シリアルモジュール などは
ショップのふうせん で販売しています。
IchigoDake のファームウェアを更新できる フッククリップ も扱っています。


ところで……

IchigoJam 公式サイトのダウンロードページにはリファレンスがありますが、
それとは別に自分が独自にまとめてあるリファレンスがあります。

かなり細かい仕様も説明してあります。
ベータ版での更新も細かく反映して、なんとか最新仕様を追いかけてます。

この中には バージョン履歴 もあります。

IchigoJam-BASIC / バージョン履歴 IchigoJam BASIC.txt

そこから……まずここを引用します。

IchigoJam BASIC バージョン履歴

2019/12/06 1.4.1
2019/02/04 1.3.1
2019/01/14 1.3.0(1.2b63 を継承)

1.3.0 は今年(2019 年)1 月、1.3.1 は 2 月、そして 1.4.1 が 12 月です。
ええ、2019 年は 1.3 系と 1.4 系が新たにリリースされています。
1.3 系から 1 年もしないうちに 1.4 系へバージョンアップしてしまったのですね。

なぜそんな事になったのか?

もう IchigoJam BASIC に新機能を入れるのは困難だと誰もが思っていた中、
なんとまさかの 864 バイトも空き容量が発生! 😲😲😲
このため、公式コミュニティ Facebook グループ IchigoJam-FAN で、
久々に「IchigoJamに欲しい機能アンケート」が取られました。

https://www.facebook.com/groups/ichigojam/permalink/1432456136894135/

という事で、1.4 系は新機能が多数追加されたのです。
あまりにも変化があるので、1.4 に更新された、という経緯です。
細かい部分でも追加されている事があります。その辺も触れていければ……


では、バージョン履歴より、前のバージョン 1.3.1 からの変更を確認します……

2019/12/06 1.4.1
・BTN(88)、BTN(-1) に 32 の値(X キー割り当て)を追加
・IOT.OUT 即時送信フラグ(値 3)追加
・LIST 画面毎の停止に関係なく Esc キーの中断が可能に
・POINT 仮想グラフィック以外の文字があるところは 1 を返すように
・RUN 時にキーバッファをクリアするように
・TICK(1) を追加
・UART ,6 ESC コード信号無視+改行コード CR→LF 変換 (=2+4) 追加
・VER(4) に 1 秒の TICK() 追加
・WS.LED 出力ポートを LED へ変更
・液晶表示(SWITCH 1)での VIDEO 2(画面反転)を追加
・Tab・PRINT の , および CHR$(9) 動作を一時的にスペース 1 文字へ変更
 (検討中により、バージョンによってスペース 1・2 文字の動作が異なる)
・カナの切り替えに Ctrl+SPACE 追加
・F11 にカーソル以下削除、F12 に行削除を割り当て
・Segmentation Fault からの復帰で割込を許可するように変更
・プログラム番号 3 キーボード切替プログラム入り (-withexchg) を追加
・キャラクター < > ( ) { } c ハ を変更
・その他 バグ修正

2019/06/19 1.3.2b24(1.3b08~1.3b10 を含む)
・COS・DRAW・POS・POINT・SIN・WS.LED 追加
・BTN(-1) を追加(#1002・#1E02(IchigoCake BASIC) の値)
・LOCATE 左上からの位置設定追加
・IoT.IN 最大 8 バイト受信に対応
・IoT.OUT 複数バイトの送信に対応
・LANG 削除→VER(3) に変更
・PLAY の音声精度を上げる(O5~O6 は VIDEO 0 での再生を推奨)
・PWM 現在動作している値と同じ値を入れた場合はリセットしないように
・SAVE 内部的に保存後仮想メモリ内容と一致しているかを確認するように
・SWITCH 液晶の濃さ設定に対応
・UART 8~15 追加(画面出力せずシリアルのみに送出)
・USR R0 レジスタの値を省略可能に・存在しないアドレス指定はエラーに
・VIDEO 3~8 の表示を調整(ブレを少なく)
・API の実装(一部の機能をマシン語呼び出しできるように)
・キーボード切り替え対応(API 使用)
・プログラム番号 0 の先頭行が @ARUN ではじまる時は自動起動するように
・割り算の処理コードを削減(空き容量増加対策として)
・EEPROM アクセス時に I2C バッファを使用するように
・複雑な計算式のエラーを Complex Expression に変更
 (スタックからあふれた場合の Segmentation Fault も有効)
・その他バグ修正
※PSET 追加は 1.3b8 のみ。1.3b9 より DRAW へ変更
※VPEEK は 1.3b8~1.3b9 のみ削除。1.3b10 で復活
※WS.OUT 追加は 1.3b9~1.3b10 のみ。1.3b11 より WS.LED へ変更

※ 1.3b07 がこの下にありますが、エラーメッセージの変更とバグ修正のみです。

……えええ~~こんなに追加・変更されてるんですか~~~!! 😲😁😆
まとめていた自分自身も驚きです~~~
でもこれだけでは分からない事もあると思いますので、
いくつか説明してみます。


DRAW・POINT 追加

DRAW 10,10
DRAW 20,20,30,30

点・線を仮想グラフィックを用いて線画します。

DRAW の値 動作
DRAW 横,縦 点を線画
DRAW 横,縦,方法 方法(0=非表示、1=表示、2=反転)で点を線画
DRAW 横,縦,横,縦 線を線画
DRAW 横,縦,横,縦,方法 方法(0=非表示、1=表示、2=反転)で線を線画

仮想グラフィックが 1 文字に対して 2✕2 で構成されるため、
指定する座標も文字の座標から横 2 倍・縦 2 倍となっています。
デフォルトのビデオ画面 VIDEO 1・2 は横 32(0~31)・縦 24(0~23)なので、
DRAW の座標は横 64(0~63)・縦 48(0~47)となります。

?POINT(10,10)

この状態を取り出すのが POINT です。

上のコマンドを実行

縦座標・横座標は DRAW に同じです。
仮想グラフィックの点が存在する場合は 1、なければ 0 です。
他の文字がある場合、キャラクター 0 のみ 0、それ以外は 1 の扱いとなります。\


COS・SIN 追加

10 CLS
20 FOR D=0 TO 360 STEP 10
30 X=SIN(D)*23/256+32
40 Y=COS(D)*23/256+24
50 DRAW X,Y
60 NEXT

プログラムを実行

三角関数が使えるようになりました。
STEP の値を変えてみると実線になったりします。

指定する値は 度(通常 0~360)です。256 倍で返されます。
(IchigoLatte JavaScript の sin8 に同等)

ところで、上に出していた「IchigoJamに欲しい機能アンケート」に
「SIN 実装後、誰か バイオリズム 製作お願いします」
ってコメントに入れてたんです。
そうしたら SIN 対応後、SHIRO さんがバイオリズム作ってくれたんです!
わ~~~い!! 😄😆😁


POS 追加

?POS()

カーソルの位置を得ます。POS(値) もあり、
横位置・縦位置の他、画面サイズも得られます。
今まで POS がなかったのが不思議な位ですね。

POS(値) 返される値
POS() または POS(0) 左上からの相対距離(横座標×横幅+縦座標)
POS(1) カーソル横座標
POS(2) カーソル縦座標
POS(3) 表示画面横幅
POS(4) 表示画面縦幅

WS.LED 追加

フルカラー対応の LED を制御します。
WS2812B の LED、入手してありますよ。

LED

DIN・VDD・GND・DOUT となっているので、
DIN-LED、VDD-VCC、GND-GND と接続します。
2 個以上あれば、LED 同士の DOUT-DIN を接続していきます。
[0] [1] [2] が 1 個目の LED です。
( 2 個目だと [3] [4] [5]、3 個目だと……)
ただしチップによって R G B と G R B の場合があります。
あとは 1 個の WS.LED であれば WS.LED 1 とします。
多くの LED を制御する場合、
WS.LED 個数,リピート という指定も可能です。
WS.LED 1,3 なら [0]~[2] の値が 3 つの LED に反映されます。

ここでは簡単にランダムで変化させる事にしましょう。

10 FOR I=0 TO 2
20 [I]=RND(256)
30 NEXT
40 WS.LED 1
50 WAIT 60
60 GOTO 10
RUN

いろんな色に変化

こんな感じにいろんな色へ変化します。


BTN(88)、BTN(-1) に 32 の値(X キー割り当て)を追加

BTN(-1) を追加(#1002・#1E02(IchigoCake BASIC) の値)

10 ?BTN(88):CONT
RUN

X キーを押してみて下さい。
英大文字の状態である必要があります。

10 ?BIN$(BTN(-1),8):CONT
RUN

こちらは 矢印キー・スペースキー・X キーです。

10 ?BIN$(PEEK(#1002),8):CONT
RUN

と同じ動作ですが、IchigoCake BASIC は #1002 ではなく #1E02 です。
BTN(-1) にする事で、番地を気にせず使えるようになっています。

BTN(-1) 返し値 割り当てキー
1 ← 矢印左キー
2 → 矢印右キー
4 ↑ 矢印上キー
8 ↓ 矢印下キー
16 SPACE スペースキー
32 X キー

BTN(-1) は同時押しに対応です。
17 であれば ← と SPACE が押されている事になります。


TICK(1) を追加

Tab・PRINT の , および CHR$(9) 動作を一時的にスペース 1 文字へ変更

10 ?TICK(),TICK(1):CONT
RUN

TICK() は 1/60 秒(または 1/50 秒)ですが、
TICK(1) はより細かい単位で変化していて、
NTSC 版では 1/15706 秒で 1 進む仕様になっています。
LPC1114 動作の IchigoJam 限定の機能で、
他のプラットフォームは 0 固定です。

で、PRINT(?) に , も使ってました。
2 つの値の間は 1 文字の空白になっています。


VER(4) に 1 秒の TICK() 追加

LANG 削除→VER(3) に変更

?VER(4)

TICK() が 1/60 秒なのか、1/50 秒なのかは
VER(4) を参照すれば分かるようになりました。

?VER(1)

なんかも増えてます。VER(1) はプラットフォーム種別です。

IchigoJam 実機

上が IchigoJam 実機ですが……

IchigoJam web

IchigoJam ap

……こんな感じ。
プログラム側でプラットフォームが分かるようになりました。
ちなみに DakeJacket 版(IchigoDake。末尾 D が付いてます)や
IchigoJam BASIC RPi、IchigoCake BASIC では
プラットフォーム独自のバージョンを含み、3 桁か 4 桁の表示になるはずです。

VER(値) と返し値の関係は次のとおりです。

VER(値) 返される値
VER() または VER(0) IchigoJam BASIC バージョン(94~97、10001~)
VER(1) プラットフォーム種別(プラットフォームバージョン)
VER(2) キーボード種別(0=US、1=日本語)
VER(3) 言語・キーボード配列(0=カナ 1=キリル 2=ベトナム等)
VER(4) TICk() 単位・ビデオ規格(50=PAL、60=NTSC)

液晶表示(SWITCH 1)での VIDEO 2(画面反転)を追加

SWITCH 1
VIDEO 2

持ってない人もいると思うので……こんな感じです。

液晶モジュールの表示

ちなみに液晶モジュールは ST7567 が主に公開されていますが、
上画像のモジュールは ST7565 です。正常に表示できています。
海外でしか入手できないかもしれませんが、ST7567 の半額以下だったりします。

SWITCH 液晶の濃さ設定に対応

持ってる人はこちらも確認できますね。

SWITCH 1,10
SWITCH 1,50
SWITCH 1,0

デフォルト=0 は 14 になっています。
モジュールによって適切な濃さが異なるので、
濃さを設定できるようになったのは嬉しいところ。


LOCATE 左上からの位置設定追加

10 VIDEO 1:CLS
20 FOR P=0 TO 766
30 LC P:? CHR$(236);
40 WAIT 1
50 LC P:? CHR$(32);
60 NEXT
70 GOTO 20

左上からの相対位置(縦座標✕表示画面横幅+横座標)で
LOCATE(LC)の値を一つにして指定できるようになりました。
PRINT(?)が 1 文字であれば、POKE #900+位置,キャラクター 相当になります。
画面下だとスクロールする、コード指定などの違いはありますが……


自動起動方法の追加

プログラム番号 0 に何か入れている場合は他のところへ退避して下さい。
例えば番号 0 のプログラムを番号 1 へ退避する場合は……

LOAD 0
SAVE 1
FILES

その上で次を入れます。

1 @ARUN
2 BEEP
3 ?"Hello IchigoJam
SAVE 0

SAVE 0 でプログラムを保存したら、電源を切り、入れ直してみて下さい。

プログラム番号 0 の先頭行が @ARUN ではじまる場合、
プログラムが自動起動するようになりました。
従来のボタンを押しながら起動も使用できます。

……あ、上のプログラムを消したい?

NEW
SAVE 0
FILES

退避したプログラムを戻すなら……(例えば 1 から 0)

LOAD 1
SAVE 0
FILES

ブログ上で紹介できそうなのはこの辺でしょうか。
他にもいろいろ機能が加わっています。お試しあれ。

イチゴジャム レシピ にはベータ版の段階で作成していたプログラムを
いくつか追加してあります。

そして IchigoJam Advent Calendar 2019 は明日も自分の記事です 😆😅😲


IchigoJam Advent Calendar 2019

IchigoJam Advent Calendar 2019 | Qiita