ゼロから学ぶコード

コードを1行も書いたことがありませんか? それなら大歓迎です。このページでは、簡単な数行を書くだけで、本物のライトを点滅させたり、本物のブザーでメロディを鳴らしたりします。配線も設定もインストールも不要です。買い物リストが書ける人なら、きっとできます。

今すぐ始めましょう: IDE のシミュレーターを開いてください。ブラウザの中にある小さな仮想ボードで、3色のライト、ブザー、ボタンが付いています。ここで紹介することは、ハードウェアがなくてもまずここで動きます。
はじめに

プログラムとは?

プログラムとは、機械が従う命令のリストのことです。上から下へ、1つずつ実行されます。料理のレシピやダンスの振り付けのようなものです。機械は速くて、とても素直です。書いたとおりに、書いた順番で、そのまま実行します。それ以上でも以下でもありません。

ですから「コーディング」とは、思い描いたことを小さくはっきりした手順に分けることが中心です。「赤いライトをつける。1秒待つ。消す。」これだけでもう立派なプログラムです。

BASIC と Chip BASIC

BASIC は1964年に、まったくの初心者に教えるために作られたプログラミング言語です。名前は「Beginner's All-purpose Symbolic Instruction Code」の略で、まさに初心者向けという意味です。ほとんど普通の英語のように読めるので、ここで使っています。

私たちのバージョンは Chip BASIC といい、同じプログラムの中で一緒に使える2つの層でできています。1つは昔から変わらないBASIC の基本で、行番号、GOTO、IF…THEN、LET、変数、計算など、1964年から続く考え方です。もう1つはボードに話しかける独自のコマンドで、LED、WAIT、SOUND、PLAY、BUTTON、そして MISSION 全体です。

10 LET a = 0
20 LED green, on
30 WAIT 1s
40 LED green, off
50 a = a + 1
60 IF a < 3 THEN GOTO 20
70 MISSION "ALLARME"

1つのプログラムに2つの層が同時に入っています。昔ながらの BASIC(LET、計算、IF…THEN、GOTO)がループを動かし、独自コマンド(LED、WAIT、MISSION)がボードを動かします。切り替えるモードはありません。好きな行で自由に混ぜて使えます。

Chip BASIC の大事なルールは、すべての行が番号で始まることです(10、20、30…)。この番号が行を実行する順番を決め、ジャンプ先としての名前にもなります。1、2、3 ではなく10ずつ数えておくと、あとで間に新しい行を差し込めるので便利です。10 と 20 の間なら 15 になります。

Text to Chip のしくみ

あなたは BASIC を書きます。ブラウザがそれを、小さくて単純な命令のリスト(バイトコードと呼びます)に変換します。そのあと小さな「プレーヤー」がその命令を実行します。実行する場所は、画面上のシミュレーターか、USB でつないだ本物のチップ(ESP32-S3)です。

うまい点は、どちらでも同じ変換後のプログラムが動くことです。シミュレーターで点滅したものが、そのまま本物のボードでも点滅します。ハードウェアなしで作ってテストし、あとで同じものを本物のチップで動かせます。

大事な考え方: 回路をどう配線するかではなく、「赤いライトをつける」「コインの音を鳴らす」のように何をしたいかを伝えます。やり方はボードがもう知っています。

最初のプログラム

赤いライトを点滅させてみましょう。IDE を開いてシミュレーターが選ばれていることを確認し、エディターに次の5行を入力してください。

10 LED red, on
20 WAIT 1s
30 LED red, off
40 WAIT 1s
50 GOTO 10

次に(左上の)▶ 実行を押します。赤いライトが1秒つき、1秒消え、またつき…ずっと繰り返します。これであなたもプログラムを書きました! 終了するには■ 停止を押します。

各行の意味は次のとおりです。

  • 10 LED red, on:赤いライトをつけます。
  • 20 WAIT 1s:1秒待ちます(待っている間、ライトはついたままです)。
  • 30 LED red, off:赤いライトを消します。
  • 40 WAIT 1s:もう1秒待ちます(今度は消えたままです)。
  • 50 GOTO 10:10行目に戻って、もう一度すべて繰り返します。これでずっと点滅し続けます。
試してみましょう: 2つの WAIT 行の 1s を 0.2s に変えてもう一度実行すると、ライトがずっと速く点滅します。数字を変えて結果を見ることが、いちばんの学び方です。

行が実行される順番

プレーヤーはいちばん小さい行番号から始めて、10、20、30…と下へ進みます。最後まで来て何も残っていなければ、止まります。

GOTO はその道筋を変えます。指定した行にジャンプするのです。GOTO 10 はプレーヤーを10行目に戻し、ループ(繰り返す部分)を作ります。信号機が切り替わり続けるのも、点滅が続くのも、ループのおかげです。

言語について

道具箱:すべての命令

ここにあるのは、Chip BASIC が理解して本物の動作にするすべての「言葉」です。昔ながらの BASIC の命令と、ボード用のコマンドが並んでいます。各カードに、命令の形、働き、短い例が載っています。暗記する必要はありません。必要なときにここを見返してください。

ライト、時間、繰り返し

LED <colour>, <on|off>

3色のライトのどれかをつけたり消したりします。色は red、yellow、green です。

10 LED green, on
WAIT <n>s · WAIT <n>ms

プログラムを一時停止します。秒は s、ミリ秒は ms を使います(1000 ms = 1 s)。0.5s のような小数も使えます。待っている間、つけたものや消したものはそのままの状態です。

20 WAIT 2s
GOTO <line>

別の行番号にジャンプし、そこからプログラムを続けます。ループしたり、先に飛ばしたりするときに使います。

50 GOTO 10
END

プログラムをきれいに終了します。(GOTO でループするプログラムは END に届かないので、■ ボタンで止めます。)

90 END
REM <note>

自分用のメモです。REM のあとは機械がすべて無視するので、各部分の説明に使えます。

10 REM blink the light
<statement> : <statement>

: で区切って、1行に2つの命令を置きます。ひとまとまりの短い手順に便利です。

10 LED red, on : WAIT 1s

判断する

IF <condition> THEN <action>

判断をします。もし条件が真なら、その動作を行い、そうでなければ飛ばします。条件は &gt;、&lt;、= で数を比べ、AND でつなげられます。

30 IF a > 5 THEN LED red, on
BUTTON("A")

ボタン A が押されている間、真になります。IF の中に置いて、押されたときの反応を作ります。

30 IF BUTTON("A") THEN SOUND "coin"

数を覚える

LET <var> = <value> ( a … z )

数に名前をつけて覚えます。a から z まで、26個の小さな箱があります。LET は省略できます。a = 0 でも同じです。

10 LET a = 0
+ - * / > < = AND OR NOT ABS()

+ - * / で計算し、&gt; &lt; = で比べ、AND で条件をつなぎ、ABS() で正の値を得ます。ものを数えるのにぴったりです。

20 a = a + 1

音を出す

SOUND "<name>"

ブザーで音を鳴らします。短いビープ音か、名前つきのメロディ(mario、tada、coin、win、siren、scale)です。

40 SOUND "coin"
PLAY "<notes>"

自分のメロディを鳴らします。音は文字とオクターブで書きます(c5、e5、g5)。- は休符(無音)で、音のあとの :500 はその長さをミリ秒で指定します。

50 PLAY "c5 e5 g5 c6"

再利用できるブロックとミッション

GOSUB <line> … RETURN

GOTO のように行へジャンプしますが、RETURN で元の場所に戻ります。複数の場所から使い回したいブロック(「ミニプログラム」)に使います。

10 GOSUB 100
FOR <var> = <from> TO <to> [STEP <n>] … NEXT

NEXT までの行を、数えながら繰り返します。WHILE … WEND は条件が成り立つ間繰り返し、DO … LOOP UNTIL は条件を最後に確認します。

10 FOR i = 1 TO 5
MISSION "<NAME>" [WITH k=v …]

信号機、メトロノーム、アラームなど、できあいの動作全体を1行で実行します。WITH name=value で調整できます。詳しくはすぐ下で説明します。

10 MISSION "SEMAFORO" WITH green=4s

同時に2つのこと、名前つきブロック

WHEN <input> PRESSED … END WHEN

ボタンが押されるたびに1回実行されるブロックです。プログラムのほかの部分が何をしていても、WAIT の最中でも動きます。PRESSED の代わりに RELEASED にするとボタンを離したときに、WHEN DISTANCE() &lt; 20 のようにすると条件が真になるたびに実行されます。END WHEN で閉じます。

100 WHEN BUTTON("A") PRESSED
EVERY <time> … END EVERY

決まった間隔で何度も実行されるブロックです。EVERY 500ms、EVERY 2s、EVERY 10m のように書きます。END EVERY で閉じます。

200 EVERY 500ms
SUB <name>(<values>) … END SUB · CALL <name>(…)

名前と専用の値を持つブロックです。SUB lampeggia(volte) … END SUB と書き、CALL lampeggia(3) で実行します。ブロックの中では volte は 3 になります。

10 CALL lampeggia(3)

動く、聞く、見る(ロボットと AI)

MOVE <left> <right>

2つの車輪を動かします。1つ目の数が左の車輪、2つ目が右の車輪です。速度は -255…255 で、マイナスは後退、0 は停止です。キットのモーターは 200 から回り始めます。それ未満だと車輪はうなるだけで止まったままなので、動く車輪は 200 から 255 です。速度を変えると曲がります。MOVE 200 255 は左に曲がり、MOVE 0 220 は止まった左の車輪を軸に左へ回ります。そのまま続くので、次の MOVE までロボットは動き続けます。止めるには MOVE 0 0 を使います。

10 MOVE 220 220
SERVO <angle>

サーボモーターを、0 から 180 度の角度まで回します。

20 SERVO 90
VOICE()

ロボットがマイクで最後に聞いた言葉です(AI)。IF の中で使います。知っている言葉は go、left、right、stop です。

10 IF VOICE()="go" THEN MOVE 220 220
SEE()

ロボットのカメラが認識したものです(AI)。IF の中で使います。知っているものは person、ball、hand です。

10 IF SEE()="person" THEN SOUND "coin"
SENSOR("<name>") · AREAD()

アナログセンサーを読み取ります。距離や明るさのような 0 から 4095 の数です。IF の中で使って、小さいときや大きいときに反応させます。

10 IF SENSOR("radar") < 20 THEN MISSION "ALLARME"

できあいのミッション

ミッションとは、すでに誰かが作ってくれた完成済みの動作です。信号機の動きを1行ずつ書く代わりに、1行で呼び出せます。

10 MISSION "SEMAFORO" WITH green=4s yellow=1s red=4s beep=slow
20 GOTO 10

WITH の部分で調整できます。緑の長さやビープ音の速さなどです。各ミッションは、安全な範囲で決まった設定だけを許します(信号機では赤を消せません。危険だからです)。使えるものはサイドバーのライブラリにあります。SEMAFORO(信号機)、PIANOLA(鍵盤)、METRONOMO(拍)、ALLARME(アラーム)です。

ミッションの設定をいちばん簡単に変える方法は、エディターで MISSION の行をクリックすることです。すべての項目が入った小さなフォームが開くので、そのまま調整できます。

ミッション一覧

現在シミュレーターで動かせるミッションを、段階別にすべて並べています。ライブラリ(サイドバーのグリッド)から開くか、MISSION "RADAR" のように行を書くだけでも使えます。どれも、上の信号機と同じように WITH で調整できます。

ジュニア

  • MISSION "SEMAFORO" — 信号機 · 赤、黄、緑
  • MISSION "METRONOMO" — メトロノーム · 一定のリズム
  • MISSION "ALLARME" — アラーム · ボタンで鳴るサイレン
  • MISSION "TIMER" — タイマー · カウントダウン
  • MISSION "CONTAPASSI" — 歩数計 · 歩数を数える

メーカー

  • MISSION "LAMPADA" — ランプ · ボタン、人感、リレー
  • MISSION "MOVIMENTO" — モーション · 人が通ると鳴る
  • MISSION "TERMOMETRO" — 温度計 · 暑いと知らせる
  • MISSION "NOTTURNA" — ナイトライト · 暗くなると点灯
  • MISSION "BARRIERA" — 遮断機 · 上がるゲート
  • MISSION "POMPA" — ポンプ / タイマー · スケジュールで水を出す
  • MISSION "HIGHWAY" — ハイウェイ · 障害物を避ける
  • MISSION "LINEFOLLOW" — ライントレーサー · 線をたどる

プロ · AI

  • MISSION "ROBOCAR" — 音声カー · 3 輪ロボット
  • MISSION "VOICE" — 音声 · 音声コマンド
  • MISSION "TROVAPALLA" — ボールを探せ · カメラで探索

パラメーターで調整できます。WITH 句を足すと、タイミング、ビープ、ボタンを変えられます:

MISSION "SEMAFORO" WITH green=6s yellow=1s red=4s beep=off|slow|fast button=on|off minGreen=2s

範囲:green 2~15 秒、yellow 0.5~3 秒、red 2~15 秒、minGreen 2~10 秒。beep は off、slow、fast のいずれか、button は on か off です。時間は小数またはミリ秒で指定できます(0.5s、1500ms)。必要なパラメーターだけ設定すれば十分です。例:MISSION "SEMAFORO" WITH green=4s beep=fast。

歩行者ボタン

button=on のとき、ボタンを押すと横断のリクエストになります。受け付けた合図として緑の LED がすぐに点滅し、緑が少なくとも minGreen 続いたところで信号が赤に変わります(押しただけで車をすぐ止めることはできません)。シミュレーターでは画面上のボタンをクリックし、実機では GPIO 6 に配線します(アクティブロー、GND へ)。

固定の安全ガードレール

変えられないことがあります。これは安全のためのガードレールです。信号は必ず緑 → 黄 → 赤の順に巡り、一度に点灯するのは 1 つだけ、歩行ビープは赤のときだけ鳴り、ボタンを押しても緑を minGreen より短くすることはできません。

アシスタントに手伝ってもらおう(@ ヘルパー)

行き詰まったり、急いでいたりしませんか? エディターの下に@ 変更を説明ボックスがあります。「ライトをもっと速く点滅させて」や「ボタンを押したら楽しい曲を鳴らして」のように普通の言葉で書くと、アシスタントが BASIC を書いたり直したりしてくれます。

答えは必ず本物の BASIC の行としてエディターに出るので、読んで、実行して、そこから学べます。アシスタントは、手の内を見せてくれる先生であり、中身の見えない箱ではありません。

ヒント:選んだ言語で返事をします。ヘッダーで言語を切り替えると、説明もそれに合わせて変わります。

自動実行

トップバーに自動実行の切り替えがあり、初期状態ではオンです。プログラムが変わって問題なくコンパイルできると、有効なバックエンドに自動で読み込まれて実行されます。アップロードして実行を自分でクリックしなくても、結果がすぐに見られます。

完成したプログラムの例

どれでもエディターに貼り付けて、実行を押してください。そのあと数字を変えて、何が起きるか見てみましょう。それがこの遊びのすべてです。

信号機

10 LED red, on
20 WAIT 5s
30 LED red, off
40 LED yellow, on
50 WAIT 1s
60 LED yellow, off
70 LED green, on
80 WAIT 5s
90 LED green, off
100 GOTO 10

赤が5秒、黄が1秒、緑が5秒で、そのあと GOTO 10 でまた最初から繰り返します。待ち時間を変えてみましょう。

ボタンを押す → コインの音

10 IF BUTTON("A") THEN SOUND "coin"
20 GOTO 10

10行目はボタンを何度も確認します(20行目がすぐそこへ戻ります)。シミュレーターでボタン A を押し続けると、コインのメロディが聞こえます。

短いメロディを鳴らす

10 PLAY "c5 e5 g5 c6"
20 END

上がっていく4つの音を鳴らして、終わります。音を変えて("c5 d5 e5 f5 g5" も試してみましょう)もう一度実行してください。

さらに先へ

これらの部品は小さく見えますが、組み合わせれば何でも作れます。いくつかのコマンドと少しの論理があれば、本物のプログラムになります。ここでは、「ライトを点滅させる」から「考えるもの」へ進むためのパターンを紹介します。

ちょうど決めた回数だけ繰り返す

10 LET a = 0
20 LED red, on
30 WAIT 0.3s
40 LED red, off
50 WAIT 0.3s
60 a = a + 1
70 IF a < 5 THEN GOTO 20
80 SOUND "tada"
90 END

変数は、数を覚えておく小さな箱です。ここでは a が点滅の回数を数えます。60行目でループのたびに1を足し、70行目は a が5になるまで戻り続け、最後にファンファーレが鳴ります。5 を変えれば、好きな回数だけ繰り返せます。

ブロックを再利用する:GOSUB と RETURN

10 GOSUB 100
20 WAIT 1s
30 GOSUB 100
40 END
100 SOUND "coin"
110 LED green, on
120 WAIT 0.5s
130 LED green, off
140 RETURN

ブロックを1回書けば、どこでも使えます。GOSUB 100 は100行目へジャンプし、RETURN は呼び出しの直後に戻します。100〜140行目は「ビープ + フラッシュ」のブロックで、メインプログラムが2回実行します。大きなプログラムも、まさにこのような小さな再利用ブロックでできています。

同時に2つのこと:WHEN と EVERY

10 LED green, on
20 WAIT 5s
30 LED green, off
40 LED red, on
50 WAIT 5s
60 LED red, off
70 GOTO 10
100 WHEN BUTTON("A") PRESSED
110 SOUND "coin"
120 END WHEN
200 EVERY 500ms
210 a = 1 - a
220 IF a THEN LED yellow, on
230 IF a = 0 THEN LED yellow, off
240 END EVERY

ライトはゆっくりした WAIT のままですが、それでもボタンの押下を見逃しません。メインプログラムが待っている間も、ボードは自分のブロックを確認し続けているからです。WHEN BUTTON("A") PRESSED は押されるたびに1回その行を実行し、EVERY 500ms は決まった間隔で実行し、END WHEN と END EVERY がそれぞれを閉じます。ブロックの中に WAIT を入れてはいけません。待ち受けが止まってしまいます。

状態を覚える

10 LET a = 0
20 IF a = 0 THEN LED red, on
30 IF a = 1 THEN LED green, on
40 WAIT 0.5s
50 LED red, off
60 LED green, off
70 a = 1 - a
80 GOTO 20

変数は、数を数えるだけでなく、今どの段階にいるかも覚えられます。ここでは a が誰の番かを表し、赤(0)か緑(1)です。a = 1 - a はループのたびに 0 と 1 を入れ替えるので、ライトが交互に光ります。この小さな記憶が、プログラムが時間とともに判断するしくみです。

計算と組み合わせた条件

10 LET a = 10
20 LET b = 3
30 IF a > 5 AND b < 5 THEN SOUND "coin"
40 LET a = a - b
50 IF a = 7 THEN LED green, on
60 END

数が入る場所ならどこでも計算でき、AND で条件をつなげられます。30行目は両方の条件が真のときだけ動き、40行目は引き算で a を更新します。+ - * /、&gt; &lt; =、AND、ABS() があれば、本格的なルールを表現できます。

ロボットはミッションの連なり

10 MISSION "SEMAFORO" WITH green=2s yellow=1s red=2s
20 MISSION "METRONOMO" WITH beat=0.4s bar=4
30 GOTO 10

いちばん大きな考え方です。プロジェクト全体は、学んだ BASIC で操られるミッションの連なりにすぎません。ここでは各行が完成した動作で、GOTO 10 がショー全体をループさせます。ミッションを入れ替え、IF で選び、変数で回数を数えれば、もうロボットをプログラミングしています。

今度は組み合わせてみましょう。ライトを5回点滅させて、そのあとミッションを実行する。ボタンを押した回数を数えて、3回に1回ちがうメロディを鳴らす。2つのミッションをループごとに交互に動かす。どれも上のパターンを組み合わせただけです。プログラミングとは、結局そういうものです。
ボードの上で

プログラムを動かす場所

実機を使うためのブラウザ要件:Web Serial は、HTTPS 上の Chromium 系デスクトップブラウザ(Chrome、Edge、Brave)でのみ動作します。https://textochip.com は HTTPS で提供されています。Firefox や Safari、モバイルでもシミュレーターは使えます。
シミュレーター
ハードウェア不要

すべてブラウザ内で動きます。どの OS でも誰でも使え、最初に試すのに最適です。

ESP32-S3
動作確認済みのハードウェア

基準となるボードです。Zephyr ファームウェアを一度書き込めば、あとは USB 経由でアップロードして実行できます。

その他のボード
ツールチェーンは共通

ファームウェアは Zephyr なので、同じコードで新しいチップにも対応できます。変わるのは小さな HAL ファイルだけです。次は Nordic nRF54L です。

ワークフロー(どのバックエンドでも共通)

  1. エディターの 1 行に @ とリクエストを入力する(AI が BASIC を書きます)か、サイドバーのライブラリから用意されたプログラムを選びます。プログラムは行番号付きの BASIC で、直接編集できます。
  2. シミュレーター / 実機の切り替えで、動かす場所を選びます。
  3. コンパイル:コンソールに結果(命令数と警告)が表示されます。
  4. アップロードして実行:プログラムを送信し、VM を開始します(自動実行がオンなら、変更のたびに自動で行われます)。
  5. 停止で止まります。行に OVERRIDE: コマンド(例:OVERRIDE: STOP や OVERRIDE: SET 4 0)を入力して Enter を押すと、再アップロードなしで命令を 1 つその場で差し込めます。

単独で動かす(ボードに保存)

実機では、ボードに保存を押すとプログラムがボードのフラッシュに保存され、起動のたびに実行されます。これでPC を外せます。USB 充電器やバッテリーでボードに給電すれば単独で動き、RST を押すと再起動します。プログラムは、新しいものを保存するか自動実行オフを押すまで残ります。これが大切なところです。動作はブラウザで作り、そのあとはコンピューターなしでチップが動かし続けます。

1 · シミュレーター(ハードウェア不要)

  1. 好きなブラウザで https://textochip.com を開きます。
  2. 切り替えをシミュレーターのままにします(自動で接続されます)。
  3. アップロードして実行をクリックします。画面上の LED、ブザーの表示、ボタンが、実際のボードと全く同じ動きをします。
  4. ボタンを読むプログラムでは、画面上のボタンをクリックして入力ピンを操作します。

シミュレーターは TypeScript の VM で、ファームウェアと同じ命令セットとティックの仕組みを持ちます。ここで動くプログラムは、ボードでも同じように動きます。

2 · ESP32-S3(おすすめ、動作確認済み)

基準ボード:Freenove ESP32-S3-WROOM(USB-C、USB ポート 2 つ)。汎用の Zephyr VM ファームウェアを一度だけ書き込みます。そのあとは、IDE から何度でもバイトコードをアップロードでき、プログラムを変えるたびに書き込み直す必要はありません。

ファームウェアを入手する

ボードでは、Zephyr で作られた小さな汎用 VM ファームウェアが動きます。ファームウェアは専用のオープンリポジトリ textochip-runtime にあり、そこで一度だけビルドして書き込んだら、あとはブラウザからプログラムをアップロードします。コピーして使える完全な手順は、そのリポジトリの README にあります。

必要なもの

  • ESP32-S3 ボードと USB-C ケーブル(Freenove には USB ポートが 2 つあり、どちらも使います)
  • ブレッドボード、LED 3 個(赤・黄・緑。青もあれば)と 220 Ω の抵抗(UNO R4 は 1 ピンあたり 8 mA までなので 470 Ω)
  • パッシブ圧電ブザーとタクトボタン(任意)
  • Zephyr ツールチェーン:west ワークスペースと Zephyr SDK(Zephyr の Getting Started ガイドを参照)

配線

部品ピン配線
緑の LEDGPIO 1→ 抵抗 → GND
黄色の LEDGPIO 2→ 抵抗 → GND
赤の LEDGPIO 4→ 抵抗 → GND
青の LED(任意)GPIO 18→ 抵抗 → GND
RGB LED の R · G · B(任意)GPIO 47 · 3 · 46各脚 → それぞれの抵抗。長い脚 → GND
ブザー(パッシブ)GPIO 5→ GND
ボタン AGPIO 6→ GND(内部プルアップ、アクティブロー)

これらのピンはボードプロファイル(lib/boardProfile.ts)で決まり、コンパイラーがバイトコードに埋め込みます。GPIO 1/2/4/5/6/18 は ESP32-S3 で安全に使えるデジタル I/O です。RGB LED の緑と青の脚にあたる 3 と 46 はストラッピングピンで、LED をつないだ状態なら Low のままです(プルアップは絶対に付けないでください)。

ファームウェアのビルドと書き込み(一度だけ)

  1. Zephyr ツールチェーンを用意します。west ワークスペースと Zephyr SDK です(Zephyr の Getting Started ガイド)。ファームウェアのソースは専用リポジトリ textochip-runtime にあります(クローンしてください)。
  2. textochip-runtime のクローンで、ESP32-S3 向けにビルドします:
    west build -b esp32s3_devkitc/esp32s3/procpu zephyr
    west packages pip --install を一度実行しておくと、書き込み時に esptool ≥ 5.0.2 が PATH に入ります。
  3. ボードの「USB UART」ポート(CH343 チップ)をつなぎ、west flash で書き込みます。このポートでは esptool の自動リセットでダウンロードモードに入れます。
  4. 自動リセットで書き込めないとき(例:ファームウェアがすでに動いている場合):BOOT を押したまま RST を軽く押し、BOOT を離してから、もう一度 west flash を実行します。
  5. ポートは 2 つ、役割も 2 つ:書き込み(flash)は「USB UART」ポートで行い、IDE をつなぐのは「USB OTG」(ネイティブ USB)ポートです。入れ替えないでください。

IDE から接続して実行

  1. Chrome/Edge/Brave で https://textochip.com を開きます。
  2. 切り替えを実機にします。
  3. ボードを接続をクリックし、ボードの「USB OTG」(ネイティブ USB)ポートを選びます。CDC_ACM_serial_backend と表示されます。(書き込みに使った「USB UART」ポートではありません。)
  4. アップロードして実行をクリックします。実行中は停止とオーバーライドが使えます。
正しいポートを選んでください。IDE は「USB OTG」のネイティブ USB ポートで接続します。これはアプリが提供する CDC-ACM で、接続してもリセットはかかりません。「USB UART」ポートは west flash 専用です。ブラウザで開くとチップがリセットされます(WARN: no PONG と表示されます)。

3 · その他のボード(Zephyr)

ファームウェアは Zephyr なので、同じ VM、ISA、ミッションが、Zephyr 対応のどのボードでも動きます。変わるのは小さな HAL ファイルだけです。ブラウザのコンパイラー、シリアルプロトコル、.bas プログラムは同じなので、IDE の操作の流れはボードが変わってもそのままです。

ボードごとに変わるもの

変わるのは 2 つだけです。lib/boardProfile.ts の GPIO 番号(コンパイラーがバイトコードに埋め込みます)と、HAL の実装 1 つ(ピン・PWM・クロックをそのチップに対応づける約 9 個の関数)です。あとは west build -b &lt;board&gt; zephyr で対象向けにビルドします。

Nordic nRF54L(近日対応)

次の対象は nRF54LM20 DK です。nRF Connect SDK(Nordic 版の Zephyr)でビルドします:west build -b nrf54lm20dk/nrf54lm20a/cpuapp zephyr、続けて west flash。IDE の流れは Web Serial 経由で同じです。BLE OVERRIDE と、Axon NPU によるエッジ AI ミッションは今後対応します。

ヘルプとリファレンス

言語のあらまし

最初のプログラム:ループする信号機(プロジェクト 01):

10 LED red, on
20 WAIT 5s
30 LED red, off
40 LED yellow, on
50 WAIT 1s
60 LED yellow, off
70 LED green, on
80 WAIT 5s
90 LED green, off
100 GOTO 10

実行できる部分はバイトコードにコンパイルされます:LED、WAIT、GOTO、GOSUB/RETURN、IF … THEN、LET、算術と比較(&gt;= &lt;= &lt;&gt; を含む)、SOUND/PLAY(ビープ音とメロディ)、BUTTON("A")、ロボットとエッジ AI のコマンド MOVE、SERVO、VOICE()、SEE()(物や「yellow」などの色)と SEEX()(フレーム内の位置、0~100)、SEESIZE()(見た目の大きさ、0~100:大きいほど近い)、DISTANCE()(センチメートル)、SENSOR()/AREAD()、そして MISSION ブロック(例:歩行者用の横断歩道を丸ごと)。このボードにないハードウェア(GPS、ディスプレイなど)が必要な文も、失敗せずにコンパイルされ、何もしない命令とコンソールの警告になります。

ヒントとよくある間違い

  • どの行にも番号が必要です。番号のない行(LED red, on だけ)は動きません。10 LED red, on と書きましょう。
  • 10ずつ数えましょう(10、20、30)。あとで間に新しい行を差し込めます。
  • 時間には単位が必要です。WAIT 2s(秒)か WAIT 500ms(ミリ秒)と書きます。単位なしの WAIT 2 は2ミリ秒の意味で、ほとんど待ちません!
  • GOTO のループは自分では止まりません。点滅するライトのように、たいていはそれで正解です。終わらせるには ■ 停止ボタンを押します。
  • コンソールが教えてくれます。何か問題があると、エディターの下のコンソールに、黄色の警告か赤いエラーが行番号つきで表示されます。読んでみてください。助けようとしてくれています。
  • 小さな一歩が勝ちます。こまめに実行しましょう。1つ変えて、実行して、見る。大きな当て推量1回より、小さな実験10回のほうがずっと多くを学べます。

トラブルシューティング

  • 「ボードを接続」ボタンがない、または押しても反応しない:Chromium 系のデスクトップブラウザではないか、HTTPS ではありません。https://textochip.com を Chrome/Edge/Brave で開いてください。
  • 接続時に「no PONG」:おそらく「USB UART」ポート(チップをリセットします)を開いています。代わりに「USB OTG」ポート(CDC_ACM_serial_backend)を選んでください。それでも失敗するときは RST を押して約 3 秒待ち、再接続します。
  • Linux でポートが出ない:自分を dialout グループに追加し(sudo usermod -a -G dialout $USER)、ログアウトしてからログインし直します。
  • 何も点灯しない:LED の極性と、配線したピンがボードプロファイルと一致しているかを確認してください。