そーたとメイの工作 (sohtaMei)

拡張ブロック作成

  つくるっちアプリにはつくるっち独自のマイコン拡張&Firmwareとデバイス拡張があります、目的に合わせて使い分けて下さい。

デバイス拡張

マイコン拡張+Firmware
  「つくるっちexe」はマイコンボードのマイコン拡張とFirmwareを自動生成します、Arduino用のライブラリを使用することが出来ます。

マイコン拡張とデバイス拡張

マイコン拡張 共通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-ERROR
    Wire.beginTransmission(引数1),
    Wire.write(引数2),
    Wire.endTransmission(false),
    sendWireRead(引数1,引数3)
    84 wire_read adrs,
    readNum
    [DATA]-OK,
    NULL-ERROR
    sendWireRead(引数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()  
    sendWireReadなどはつくるっち独自のC言語関数です、ソースコードは自動生成されたrobot_pcmode.inoを参照して下さい。
    コマンド詳細
  • マイコン拡張ユーザーAPI
    ユーザーがjsonファイルで定義したマイコン拡張の新規APIはデバイス拡張から下記方法で呼び出すことが可能です。
    this.runtime.dev.Block名( {ARG1:引数1, ARG2:引数2, ...} )

デバイス拡張

デバイス拡張 編集

  1. ヘッダ部(extName, その他)
    例:

    var extName = 'ext名';
    デバイス拡張名、_ や . などの記号を使わないで下さい。
    const IconURI = 'data:image/png;base64, ..
    つくるっちアプリで表示されるアイコン画像です。
    /*_
    const ArgumentType = require('../../extension-support/argument-type');
     :
    _*/
    
    デバイス拡張で使うことが出来る外部参照です。format-messageを使うことが出来ます。
    他のjavascriptライブラリを xx = require('xx.js') で呼び出すことは出来ません。
  2. constructor
    runtimeを保存します、runtimeのメンバとしてcomlibやマイコン拡張があります。
    例:
  3. getInfo
    usage:

    getInfo() { return { id: extName, Name: extName, menuIconURI: IconURI, // メニューアイコン(省略可) blockIconURI: IconURI, // ブロックアイコン(省略可) blocks: [ ブロック定義1, : ], menus: { メニュー定義1, // 省略可 : }, }; }
    例:

    formatMessage から this._local を生成しています、1-日本語、0-その他です。
  4. getInfo - ブロック定義
    usage:

    blocks: [ {ブロック定義1, arguments: { ARG1: {ARG定義}, : }}, : ],
    ブロック定義、ARG定義
    メンバ 内容
    blockType BlockType COMMAND
    REPORTER
    BOOLEAN
    opcode string ブロック名。ブロック名の関数を定義すること
    text string ブロック表示、引数1 [ARG1]、引数2 [ARG2]、..
    arguments ARG1
    ARG2
     :
    type ArgumentType NUMBER
    STRING
    defaultValue * 初期値
    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] ブランチ/サブスタックの数
    参考:scratch-vm/src/extension-support/extension-metadata.js
    .
    例: block=setCar, menu=direction

  5. getInfo - メニュー定義
    usage:

    menus: { メニュー名1: {メニュー定義} },
    メンバ 内容
    acceptReporters Boolean レポーターをドロップすることを許可
    items text string 表示名
    value sting
    例:
  6. ブロック関数定義
    引数に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を表示することが出来ます。
  • 必要なマイコン拡張を読み込み。

マイコン拡張+Firmware

マイコン拡張+Firmware - 準備

  1. つくるっちexe(full版)をインストール。
    つくるっちexe
     
  2. 展開したフォルダに下記の通りマイコン拡張があります。下記は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\scratch3\esp32.js 自動生成、マイコン拡張、つくるっちbuild用
    ext\scratch3\esp32.load.js 自動生成、マイコン拡張、外部拡張読み込み用

マイコン拡張+Firmware - robot.json編集

  • マイコンボードの種類に応じて、下記ディレクトリのrobot.jsonを編集して下さい。
       ESP32の場合 :ext\libraries\esp32
      M5シリーズの場合 :ext\libraries\M5xx
      Atmega328pの場合 :ext\libraries\uno
  • ※microbitのマイコン拡張自動生成は準備中です。
  1. robot.jsonファイル構成
    robot.jsonからrobot_pcmode.inoとマイコン拡張を自動生成します。
    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":{
          ラベル(英語):ラベル(日本語),
          ブロック表示(英語):ブロック表示(日本語),
          ...
        }
      }
    }
  2. マイコン拡張定義
    例:

    • scratch3extは英数のみ。 _ や . など記号を使わないでください。
    • (参考) uno32など実際のマイコン拡張では、1つのマイコン拡張を2つのFirmware=unoとuno32で使用するために
       マイコン拡張&Firmware=uno32
       マイコン拡張(scratch3)=uno
      としています。またscratch3burnに別のFirmware "uno"を追加しています。
      マイコン拡張を共通にすることにより1つのスクラッチプログラムで2つのマイコンボード=uno32とunoを動かすことが出来ます。
  3. ブロック定義
    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ブロックは対応していません、取得ブロックを使用して下さい。
  4. メニュー定義
    ブロック表示の%dで使用するメニューを定義、下記は%d.digitalの例です。

    メニュー項目は数値 or ラベルを記述。
    例:
  5. ラベル定義
    ラベルを数値に変換。メニュー定義、初期値で使用。
    例:
  6. 翻訳定義
    ブロック表示とラベルを英語→日本語に変換。
    例:

    下記のように言語モードに従ってブロック表示が英語→日本語に翻訳されます。引数の定義もコピーして下さい。
      英語 日本語
    翻訳定義 "set port %n output as %d.digital" "ポート %n の出力を %d.digital にする"
    ブロック表示
  7. main.cpp, main.h編集
    setup, loop, ブロックから自分の関数を呼ぶ場合はmain.cpp, main.hに自分の関数を追加して下さい。

マイコン拡張+Firmware - buildとブロックの動作確認

  1. つくるっち.exe を起動し、[ロボット] - 目的のマイコン拡張を選択。
    既に目的のマイコン拡張を選択済みのときは、もう一度 [ロボット] - 目的のマイコン拡張を選択することでrobot.jsonを再読み込み。

    robot.jsonにエラーがある場合下記のようにエラー表示されます。

  2. 作成した拡張ブロックを選択し、作成した拡張ブロックが正しく表示されるか確認。

    下記ブロックはWifi設定用ブロックです。ESP32の場合robot.jsonのブロック定義に追加して表示されます。
  3. [ロボット] - [PC modeプログラムを開く] を選択。
    robot.jsonにエラーがある場合下記のようにエラー表示されます、ブロック定義の引数の数をチェックして下さい。

  4. Arduino IDEでCtrl-UでビルドしてFirmwareをマイコンボードに書き込み。
    コンパイルエラーが出る場合は自動生成されたrobot_pcmode.inoやmain.cpp, hのエラー箇所を確認して下さい。
    .
  5. まず つくるっちexeでマイコンボードを接続、拡張ブロックをクリックして正しく動作するか確認して下さい。
    Arduinoタブを選択することで通信ログを確認することが出来ます。USB(COM)接続のみ対応、Wifi/BLE接続非対応です。


    確認後は必ずつくるっちexeを閉じて下さい。
  6. Chromeブラウザでつくるっちアプリを起動して[拡張機能] - [外部拡張読み込み] -TuKuRutch\ext\scratch3\xx.load.jsを選択。

    F12ボタンを押すことでjavascriptのlogを表示することが出来ます。
    マイコンボードを接続してブロックが正しく動作するか確認して下さい。
  7. 必要に応じてxxx.load.jsを編集することができます。つくるっちexeで上書きされないよう注意して下さい。
inserted by FC2 system