TypeScriptについて一通り知るべき内容が記載されている書籍だろうと思います。
発行が2020年なのでTypeScript 3.0準拠でしょうが、4.0では大きな変更はないとのことなので差分を意識すれば十分使えるでしょう。
admin

la vie libre
初めて知りましたが、MacでAppleのスクリプト言語(OSA : open scripting architecture対応)を使えばJavaScriptの実行も呼び出せるということ。
例えば、以下のようなhello.jsファイルを実行するには、
let helloWorld = "Hello World";
console.log(helloWorld);
----------------------------------
% osascript -l JavaScript hello.js
Hello World
のように呼び出せます。一番簡単に使えるJavaScriptの実行環境になるかと思います。もちろんDOMなどの呼び出しはできませんが。
osascriptのコマンド使用方法は、
https://support.moonpoint.com/os/os-x/man/man_osascript.html
node.jsがインストールされていれば、その環境で実行するのが一番確実ではありますが。
admin
以下を参照に一番簡単に作れるであろう、出来合いの拡張ブロックを動かしてみた。
https://qiita.com/tkyko13/items/081b8759ed98f6ed577d
手順はリンクの通りですが、普通にGitHubに上げることもできるので共有(全体になるので、ブロックを部品としては扱えない)もできます。
内部的にはブロックはおそらくStatic TypeScriptに変換され、さらにJavaScript、そしてマシンコードに落とされてhexファイルが作成されて、それをmicro:bitに転送すれば実行されるという流れになります。
Type Script(Java Script)のコードは適当なドキュメントが存在しない(見つけられないだけ)ようなので、ブロックからJavaScriptのコードを拾い出して使うしかなさそう。
admin
pxt-microbitを調べている間に、すでに拡張機能でmicro:bit内蔵のFlashにログが取れる機能があることを知りました。で画像下の黒ラインをトレースさせた結果のログを取ってみると、
こんな感じで画像化できました。ログデータはmicro:bitディレクトリから見えるMY_DATA.HTMをダウンロードするとcsvファイルなのでnumbersで加工。ログをクリアする処理を処理の初期化で入れてしまうと、ログを取ろうとすると中身が消えてしまうので追記型にしています。
ログの対象はモーター駆動パワーと、ラインセンサーのフォトトランジスタ電圧をAD変換したもの。駆動パワーが130を超えている部分はラインを逸脱しそうになって右回転あるいは左回転を実行している部分です。
グラフ化してみると概ねイメージと合っていますが、データをビジアル化してみるのは理解が早まると思います。
今現在のコードは、
https://github.com/chateight/trace_microbit
P.S. 2023/6/14
フラッシュメモリへのログは予想以上に時間がかかっていて、ループ時間のおよそ30msは大半がログのための時間のようです
admin
makecodeのうちでmicrobit用のバージョンがmake code for microbitになります。pxtという言葉も出てきますが、makecodeというのは目に見える画面エディタのことで、pxtはmakecodeを動かすためのGitHubのリソースのことだという記述があります。
https://github.com/microsoft/pxt-microbit
にmicrobit用のpxtリソースが存在しますが、このpxtリソースでできることは、
① makecode for microbitをローカルサーバーで動かす
② ローカルで開発環境を構築
の二つだと思います。
手順通り動かしてみると、ローカルでmakecode for microbitが立ち上がりました。
大半はTypeScriptで拡張機能が実現できそうですが、ハードウェアを扱うときにはC++も必要になるでしょう。
admin
makecodeはマイクロソフトが開発したオープンソースでユーザ側が自由に拡張できますが、その元になっている仕組みを調べ始め。ネット上には情報が少ないですが、
きっかけは、
https://interface.cqpub.co.jp/magazine/202202/
ですが、雑誌というのは決まった分量に収めないといけないので、行間が省略されているので、雑誌のテキストだけではよく理解できないので自分なりに理解のための整理。
makecodeで何ができるのか?
開発がマイクロソフトなので、① Arcade、② micro:bit、③ Minecraftができるということです。
makecodeの開発言語はStatic TypeScript、なぜStaticなのかというとメモリの少ないマイコンでJavaScriptの動作環境は用意できないからネーティブのコードに変換する、つまりJavaScriptが持つDynamicな機能は削除されたTypeScriptのサブセットなのでStaticという名前がつけられています。実はmakecodeの開発環境にはTypeScipt以外にBlocksとStatic Pythonも使われている(BlocksとStatic Pythonはコンパイル時にTypeScriptに変換される)ようです。Blockは” Blocks is implemented using Google Blockly.“だそうですが、ScratchもGoogle Blocklyを使っています。
<makecode用の言語についてのリンク>
一方pxtはStatic TypeScriptコンパイルの実行環境。
<pxtについてのリンク>
https://github.com/Microsoft/pxt
pxtの実行環境には三種類あるそうですが、
“PXT programs are executed in at least three different environments: microcontrollers, with native code compilation (ARM) browsers * server-side JavaScript engines (node.js, etc)”
実際的にはnode.jsを使うのが一番ポピュラーでしょう。
admin
以下で作成した倒立振子、
https://isehara-3lv.sakura.ne.jp/blog/2022/12/30/倒立振子(pi制御でハンチングなくした)/
Wi-Fi環境無いところのために、Wi-Fi関連の処理(Pose情報をudpで送信)を削除すると、PIDパラメータの最適値が変わってきます。
モーターの駆動力を計算しているところをloop処理から切り出すと以下のような処理ですが、
// calc motor power
float Duty, P, D, now, dt, Time;
now = TARGET - roll_data; // calc delta
if (-25 < now && now < 25) { if (abs(now) >= 0){
Time = micros();
dt = (Time - preTime)/1000000;
preTime = Time;
P = now/90; // (-90~90) → (-1.0~1.0)
I += P*dt;
D = (P - preP)/dt;
preP = P;
power = P_val * P + I_val * I + D_val * D;
//Serial.println(power);
if (power < -1) power = -1; // limit the max value
if (1 < power) power = 1;
if (power < 0){
dir = 1;
}else{
dir = -1;
} // set forward/reverse
}時間で正規化されてるわけでも無いから、powerの値そのものが変動してしまうからでしょう。
電池電圧変動でも同じpower指定しても実際のモーター駆動力は変化して、調整点がズレるのと似ていると言えば似ているかもしれません。
admin
直前のブログでLED表示時間が異様に長い件、micro:bitのドキュメントにその理由と思われる記載がありました。
overviewの最後にある通り、
“In it’s normal mode, the display will update every 18ms (55 Hz). If the display is in light saving mode the period is changed to 15ms (66 Hz).”
18ms毎にupdateされるようなので、この時間がLED表示データ書き込み時間として見えて来ているようです。マルチタスク動作ではないだろうmicrobitのファームウェアでは。
admin
Arduinoベースの車では、簡単に軌跡を外れるので、Micro:bit carにセンサを外付けしてあたりを付けてみた。Arduino(VScodeのPlatformIO)ではmicro:bit(makecode)に比較して開発のループ時間が長くなるので。
3Dプリンタでアタッチメントを作成して、センサーを両面テープで貼り付けました。アナログ入力はP0とP2を使っています。
動きを遅くするために、モーターの動作時間を限定してフィードバックが確実にかかるようにしてやると『カメモード』ですがトレースできるようになりましたが、動かすにはパラメータが多いので調整は大変そうです。ましてP.I.D制御までやろうとすると。
makecodeのコードは以下に、
https://github.com/chateight/trace_microbit
2023/5/18 LED表示に時間が掛かっている
LED表示にステータス、前進/右旋回/左旋回の数字を表示させるだけで数十ms必要で制御が間に合わなくてコースアウトしていたので、LED表示を削除して『ネズミモード』ぐらいまで高速化、展開時のモーター駆動にはP制御も追加しました。P制御の原理はフォトトランジスタの読み取り差をモーター駆動力にリニアに反映(下限と上限は決めていますが)しています。
admin