拡張ブロック作成
つくるっちアプリにはつくるっち用のFirmware&マイコン拡張とデバイス拡張があります、目的に合わせて使い分けて下さい。
つくるっち用ArduinoIDE
つくるっち用ArduinoIDEはマイコンボードのfirmwareとsrc.update.js(マイコン拡張)を自動生成します、firmwareのカスタマイズも可能です。
デバイス拡張
マイコン拡張とデバイス拡張
- 拡張機能の種類
特徴 記述 ライブラリ 開発環境 作成・デバッグ方法 Firmware,
マイコン拡張センサを含むマイコンボードのFirmwareと拡張機能。
現在Atmega328/ESP32/picoに対応C言語とjson ArduinoIDE ArduinoIDE
node.js1. robot.jsonとC言語編集
2. ./build.shでsrc.inoと.jsを自動生成
(3. つくるっち外部拡張でテスト)デバイス拡張 マイコンボード外付けのセンサやロボットの拡張機能。
一つのデバイス拡張でuno,M5StickC,microbitなど複数のマイコンボードに対応した拡張機能を実装javascript マイコン拡張 chromeブラウザ 1. javascript編集
2. つくるっち外部拡張でテスト既存拡張 scratch3.0で提供されている拡張機能 javascript note.js node.js
マイコン拡張 共通API
- 各マイコン拡張には下記の共通APIが自動的に追加されます、デバイス拡張から this.runtime.dev.comlib.xx の名前で呼び出すことができます。
各共通APIはスクラッチアプリからデバイス拡張「汎用I/Oブロック」でテストすることが出来ます。
API名 引数 戻り値 Arduino API 汎用I/Oブロック 81 wire_begin SDAポート,
SCLポート- Wire.begin(引数1, 引数2) 82 wire_write adrs,
[DATA]0-OK Wire.beginTransmission(引数1),
Wire.write(引数2),
Wire.endTransmission()83 wire_writeRead adrs,
[DATA],
readNum[DATA]-OK,
NULL-ERRORWire.beginTransmission(引数1),
Wire.write(引数2),
Wire.endTransmission(false),
sendWireRead(引数1,引数3)84 wire_read adrs,
readNum[DATA]-OK,
NULL-ERRORsendWireRead(引数1,引数2) 85 wire_scan - [LIST] sendWireScan() 86 digiWrite 配列[port:x,level:y] - pinMode(引数1[i+0], OUTPUT);
digitalWrite(引数1[i+0], 引数1[i+1]);87 digiRead port level pinMode(引数1,INPUT),
digitalRead(引数1)88 anaRead port, count level(int16) _analogRead(引数1,引数2) 89 tone port, freq, ms - _tone(引数1,引数2,引数3) setPwms 配列[port:x,level:y] - _setPwms(引数1) 0~4095
FB statusWifi - wlanStatus SSID ip statusWifi() FC scanWifi - SSID1 SSID2 SSID3 .. scanWifi() FD connectWifi ssid, pass wlanStatus connectWifi(引数1,引数2) 3-connected FE getFwName - FwName Serial.println(mVersion) FF reset - - _reset()
コマンド詳細 - マイコン拡張ユーザーAPI
ユーザーがjsonファイルで定義したマイコン拡張の新規APIはデバイス拡張から下記方法で呼び出すことが可能です。this.runtime.dev.Block名( {ARG1:引数1, ARG2:引数2, ...} )
つくるっち用ArduinoIDE
準備、build
- つくるっち用ArduinoIDEを参照して環境をセットアップし、main.cpp、main.hなどを編集、./build.sh してください。
robot.json → src.ino自動生成し、firmwareをbuild&書き込みます。
- 展開したフォルダに下記の通りソースコードとsrc.update.jsがあります。下記はesp32の例です、青字部分はマイコンごとに異なります。
ファイル名 ext\libraries\esp32\robot.json マイコン拡張定義。任意のC言語関数を呼び出すことが出来る。 ext\libraries\esp32\src\main.cpp, main.h setup、loop、独自のC言語関数定義。 ext\libraries\esp32\src\src.ino 自動生成 ext\libraries\esp32\src\src.update.js 自動生成、マイコン拡張、外部拡張読み込み用 ext\scratch3\esp32.js 自動生成、マイコン拡張、つくるっちbuild用
robot.json編集、src.update.js生成
- 既存のマイコン拡張やscratchサンプルを使う場合はrobot.jsonを編集しないでください、"マイコン拡張定義"、C言語部分は編集OKです。
./build.shでrobot.jsonからsrc.inoとsrc.update.jsを自動生成します。
- robot.jsonファイル構成
C言語記述部分では " を \" にして下さい。{ // マイコン拡張定義 "name" : "LED", // マイコン拡張名 "scratch3ext" : "LED", // scratch3 ext名 "boardType" : "arduino:avr:uno", // package:platform:board // ヘッダ (C言語) "header":" #define mVersion \"LED1.0\" // マイコン拡張名 #include \"main.h\" // 関数_setup, _loop, blinkLEDを定義 ", // setup処理 (C言語) "setup":"_setup(mVersion);", // loop処理 (C言語) "loop":"_loop();", // ブロック定義 "blockSpecs": [ ["-"], // dummy [ // Lチカブロック "w", // type : w-実行関数, R-取得関数, B-Boolean取得 "port %n cycle %n", // Block表示+引数: %n-数値, %d-数値+menu, %s-文字列, %m-文字列+menu "setLED", // Block名 13,2, // 引数初期値 { "remote":["B","B"], // 引数+戻値 型定義 B-int8, S-int16, L-int32, s-string "func":"blinkLED({0},{1});" // 実行/取得関数: 引数 {0},{1} }], ], // メニュー定義 "menus": { メニュー名:[メニュー項目1, ..], ... }, // ラベル定義 "values": { ラベル名:数値, ... }, // 翻訳定義 "translators": { "ja":{ ラベル(英語):ラベル(日本語), ブロック表示(英語):ブロック表示(日本語), ... } } }
- マイコン拡張定義
例:
- scratch3extは英数のみ。 _ や . など記号を使わないでください。
- (参考) uno32など実際のマイコン拡張では、1つのマイコン拡張を2つのFirmware=unoとuno32で使用するために
マイコン拡張&Firmware=uno32
マイコン拡張(scratch3)=uno
としています。またscratch3burnに別のFirmware "uno"を追加しています。
マイコン拡張を共通にすることにより1つのスクラッチプログラムで2つのマイコンボード=uno32とunoを動かすことが出来ます。
- ブロック定義
usage: "blockSpecs": [ [type, ブロック表示, ブロック名, 初期値, {"remote":[型定義], "func":関数定義} ], // 通常関数 [type, ブロック表示, ブロック名, 初期値, {"enum":"", "func":"{0}"} ], // enum定義 ... ],
例:
このブロック定義が以下のブロックに変換されます。
通常関数の各項目の定義と実装例です:
項目 定義 実行関数例
取得関数例
type(ブロック種類) w-実行,
R-取得,
B-true/false取得,
(h-プログラム開始)"w" "R" ブロック表示 表示文字列+引数
%n-数値,
%d-数値+menu,
%s-文字列"set port %n output as %d.digital"
%d.digital - digitalがメニュー名"read analog port %n average %n times" ブロック名 Blockの区別に使用 "setDigital" "getAnalog" 初期値 数値 or ラベル 2,"HIGH" 35, 4 型定義 引数, 戻値 型定義
B-int8,
S-int16,
L-int32,
F-float,
D-double,
s-string,
b-byteArray"B","B"
引数が2個"B","S", "S"
引数が2個、戻り値が1個関数定義 関数名({0}, {1})
{0} - 引数1
{1} - 引数2"pinMode({0},OUTPUT); digitalWrite({0},{1});" "_analogRead({0}, {1})"
関数定義に複数の関数を記述するとき:関数の区切り=wブロック-セミコロン, R/Bブロック-カンマ。
hatブロックは対応していません、取得ブロックを使用して下さい。 - メニュー定義
ブロック表示の%dで使用するメニューを定義、下記は%d.digitalの例です。
メニュー項目は数値 or ラベルを記述。
例:
- ラベル定義
ラベルを数値に変換。メニュー定義、初期値で使用。
例:
- 翻訳定義
ブロック表示とラベルを英語→日本語に変換。
例:
下記のように言語モードに従ってブロック表示が英語→日本語に翻訳されます。引数の定義もコピーして下さい。英語 日本語 翻訳定義 "set port %n output as %d.digital" "ポート %n の出力を %d.digital にする" ブロック表示
src.update.js動作確認
- デフォルトではsrc.update.jsを生成しません。parseRobotJson.js を編集してsrc.update.js生成を有効にし、./build.shして下さい。
Chromeブラウザでつくるっちアプリを起動して[拡張機能] - [外部拡張読み込み] -TuKuRutch.ext\libralies\xx\src\src.update.jsを選択。
F12ボタンを押すことでjavascriptのlogを表示することが出来ます。
マイコンボードを接続してブロックが正しく動作するか確認して下さい。
- 必要に応じてsrc.update.jsを編集することができます。./build.shで上書きされないよう注意して下さい。
デバイス拡張
デバイス拡張 編集
- つくるっちサンプルのページにデバイス拡張のjavascriptソースコードがあります、カスタマイズしてつくるっちで実行することができます。
ここではライントレーサ―用デバイス拡張 microbitLineTracer.load.js を例にデバイス拡張の編集方法を示します。
- ヘッダ部(extName, その他)
例:
var extName = 'ext名';
デバイス拡張名、_ や . などの記号を使わないで下さい。const IconURI = 'data:image/png;base64, ..
つくるっちアプリで表示されるアイコン画像です。
/*_ const ArgumentType = require('../../extension-support/argument-type'); : _*/
デバイス拡張で使うことが出来る外部参照です。format-messageを使うことが出来ます。
他のjavascriptライブラリを xx = require('xx.js') で呼び出すことは出来ません。
- constructor
runtimeを保存します、runtimeのメンバとしてcomlibやマイコン拡張があります。
例:
- getInfo
usage:
例:
getInfo() { return { id: extName, Name: extName, menuIconURI: IconURI, // メニューアイコン(省略可) blockIconURI: IconURI, // ブロックアイコン(省略可) blocks: [ ブロック定義1, : ], menus: { メニュー定義1, // 省略可 : }, }; }
formatMessage から this._local を生成しています、1-日本語、0-その他です。
- getInfo - ブロック定義
usage:
ブロック定義、ARG定義
blocks: [ {ブロック定義1, arguments: { ARG1: {ARG定義}, : }}, : ],メンバ 型 内容 blockType BlockType COMMAND
REPORTER
BOOLEANopcode string ブロック名。ブロック名の関数を定義すること text string ブロック表示、引数1 [ARG1]、引数2 [ARG2]、.. arguments ARG1
ARG2
:type ArgumentType NUMBER
STRINGdefaultValue * 初期値 menu string メニュー名 hideFromPalette Boolean ブロックパレットで非表示 isTerminal Boolean スタックの最終ブロック disableMonitor Boolean [REPORTER] モニター禁止 reporterScope ReporterScope [REPORTER] 値のscope/context isEdgeActivated Boolean [HAT] edge-activated shouldRestartExistingThreads Boolean [HAT] 既存のスレッドを再起動 branchCount int [FLOW] ブランチ/サブスタックの数
.
例: block=setCar, menu=direction
- getInfo - メニュー定義
usage:
menus: { メニュー名1: {メニュー定義} },メンバ 型 内容 acceptReporters Boolean レポーターをドロップすることを許可 items text string 表示名 value sting 値
- ブロック関数定義
引数にargsを持ち、args.ARG1 の形で引数を参照。戻り値でreporter/booleanの値を返す。
標準のjavascript APIとマイコン拡張共通API、マイコン拡張ユーザーAPIを呼び出すことが出来ます
usage: ブロック関数名(args) { let 引数1 = args.ARG1; // string let 引数2 = args.ARG2*1; // number : }
デバイス拡張 実行
- つくるっちアプリにアクセスして [拡張機能] - [外部拡張読み込み] - デバイス拡張ファイルを選択。
F12ボタンを押すことでjavascriptのlogを表示することが出来ます。 - 必要なマイコン拡張を読み込み。