NLL for micro:bitで簡易PWM発振器を作ってみました.
波形や周波数を指定して,PWMで発振できます.(ローパスフィルタを通せば,アナログ波になるはず)
micro:bitに拡張OLEDディスプレイを接続して利用します.
出力先をmicro:bitのスピーカーにすると,ピーピーガーガーと音を出して遊ぶことができます.
先月の簡易オシロスコープと組み合わせて,出力した波形を確認したりして遊ぶことができます.
↑「アプリケーション」の「簡易オシロスコープ」です
NLL for micro:bitで簡易PWM発振器を作ってみました.
波形や周波数を指定して,PWMで発振できます.(ローパスフィルタを通せば,アナログ波になるはず)
micro:bitに拡張OLEDディスプレイを接続して利用します.
出力先をmicro:bitのスピーカーにすると,ピーピーガーガーと音を出して遊ぶことができます.
先月の簡易オシロスコープと組み合わせて,出力した波形を確認したりして遊ぶことができます.
↑「アプリケーション」の「簡易オシロスコープ」です
micro:bit で,簡易オシロスコープを作ってみました.
安価なオシロスコープとして利用できると思います.
10kHz〜80kHzのサンプリング周波数でキャプチャできます.
micro:bit用の拡張OLEDディスプレイに表示します.
トリガを設定して,決まった電圧を検出したらスキャンする,みたいなこともできます.
Aボタンで再スキャン,Bボタンでキャプチャ画像の保存です.
キャプチャした画像はファイルとして保存され,PCに転送できます.
乾電池&PC無しで動作させられるため,出先でちょっとオシロを使いたいときなどに便利かなと思います.
(家に余っているmicro:bitを簡易オシロにできます)
NLL for micro:bit のアプリとして作ってあるので,簡単な改造もしやすいと思います.
↑「アプリケーション」の「簡易オシロスコープ」です
(2026/01/05追記)
A/Bボタンでの操作をいろいろ追加しました.
・Aボタンを押しっぱなし:繰り返しスキャン
・Aボタンを押しながらBボタンを1回押し,Aボタンを離す:サンプリング周波数を変更
・Aボタンを押しながらBボタンを2回押し,Aボタンを離す:サンプル数を変更
・Aボタンを押しながらBボタンを3回押し,Aボタンを離す:トリガの有無を切替え
・Aボタンを押しながらBボタンを4回以上押し,Aボタンを離す:終了
NLLのmicro:bit移植を進めていますが,micro:bit shields for Arcadeのゲームパッド上で動作しました.
対象ハードウェアは以下です.ほぼリファレンス回路どおりのようなので,micro:bit shields for Arcadeの他のハードウェアでも動作するかもしれません.
https://kitronik.co.uk/products/56116-kitronik-arcade-for-bbc-micro-bit-makecode-arcade
独自言語「NLL」で動作します.テキスト型プログラミング言語で,ゲームを作ったりすることができます.
(NLLがベアメタルで動いています.言いかたを変えると,NLLがOSとして動いています)
PCとUSBケーブルで接続し,TeraTermなどの端末エミュレータで接続して操作します.
フラッシュROM上にファイルシステムを持っているので,プログラムを保存することができます.プログラムを書き込んで保存し,電源ON時に起動するプログラムを指定することで,PCと切り離して動作することができます.
このゲームパッドの標準の開発環境はMakeCodeですが,ディスプレイの下8ラインが使えない(320x240のディスプレイにスムーズに拡張できるようにするためらしい)のですが,NLLだと全画面が使えます.
あとMakeCodeでのグラフィックプログラミングは基本的にキャラクタベースなので(よく知らないですが),線や円を描くようなプログラムを書きたい場合には,NLLのほうがやりやすいかもしれないです.
独自言語「NLL」をmicro:bitに対応しました.
PCとmicro:bitをUSBケーブルで繋ぎ,端末エミュレータで接続するとNLLのプロンプトが出ます.
以下のことができます.ファイルシステム上にNLLのプログラムをいくつか保存しておいて,ロードして起動したり,テキストエディタで編集して実行したりができます.
micro:bitは標準の開発環境はブラウザ上でのプログラミングで,テキスト型言語だとMicroPythonが使えるようですが,それらとはまた違った「80年代のBASICっぽい感じの言語」でmicro:bitを制御できます.
vectorにもあります.
大熱血!アセンブラ入門のアセンブラ出力環境のバージョンアップ版と,NLUXのバージョンアップ版を一気にリリースしました.
https://kozos.jp/books/asm/ →アセンブラ出力環境(gcc-11)
https://kozos.jp/nlux/download.html →2025/06/13版
これらは今まで別々のツールだったのですが,今回,これらが協調動作するようになりました.
まず,大熱血アセンブラのアセンブラ出力環境はgccベースになっていて,各種CPUアーキテクチャ向けのクロスコンパイラ(gcc)をビルドし,サンプルプログラムをクロスコンパイルすることで実行ファイルを生成したり,その実行ファイルをシミュレータ上で動作させたりすることができます.
またNLUXには,独自のCコンパイラ(NLCC)と独自の標準Cライブラリ(のサブセット)(nllibc)が含まれています.
で,今回のリリースでは,以下のようなことができるようになりました.(やりかたはNLUXのトップのREADME.txtの「クロスコンパイル」の章を参照)
MIPS16とRXはnllibcを用いての実行確認ができていませんがそれを差し引いても,NLCCは9種類のアーキテクチャで,標準Cライブラリのサブセット(printf()含む)をビルドして動作確認できる程度には動いたということなので,そこそこ動作確認がとれたということにはなるかなと思います.
これはNLCCが新たなCPUアーキテクチャに対応しやすいという特徴があるためです.
詳しくはNLUXのREADMEに書いてあるのですが,具体的には以下のような方針で設計することで実現しています.
2つのレジスタ(NLCC内では「R0」と「R1」と呼んでいる)に何を使うかを決めて,R0に定数値を代入する命令,R1をR0に代入する命令,R0とR1を加算しR0に格納する命令,などを登録しておけば,それらを組み合わせて処理をするようなアセンブリのコードを生成してくれます.
x86-64の例だと,R0にRAX,R1にRDXを指定して,上の例なら以下のような関数を登録しておくことになります.(asm_code_amd64.c参照)
static void get_value(FILE *out, long value)
{
ASM_CODE_OUT(out, "\tmov\t$0x%lx, %%rax\n", value);
}
static void get_r1(FILE *out)
{
ASM_CODE_OUT(out, "\tmov\t%%rdx, %%rax\n");
}
static void calc_add(FILE *out, model_t model, model_t model_arg0, model_t model_arg1)
{
ASM_CODE_OUT(out, "\tadd\t%%rdx, %%rax\n");
}
現状では最適化を一切しないため,生成されるアセンブリは非効率極まり無いものとなっています.
が,10アーキでとりあえず動きますし,新たなアーキに対応させるコストも極小です.