MicrocontrollerEmbedCode[sys,μc,p]
p を使ってマイクロコントローラ μc に系のモデル sys を埋め込む.
MicrocontrollerEmbedCode
MicrocontrollerEmbedCode[sys,μc,p]
p を使ってマイクロコントローラ μc に系のモデル sys を埋め込む.
詳細とオプション
- MicrocontrollerEmbedCodeはマイクロコントローラ指定 μc を使うための sys についてソースコードを生成し, それをコンパイルし,結果の機械コードを μc に埋め込む.
- MicrocontrollerCodeDataオブジェクトも生成され,それを使ってさまざまな特性を得ることができる.
- システムモデル sys には離散時間のTransferFunctionModel,StateSpaceModel,AffineStateSpaceModel,NonlinearStateSpaceModel,またはSystemsConnectionsModelが使用できる.
- マイクロコントローラ μc は以下の主キーを持つ連想として与えられる:
-
"Target" ターゲット名 "Inputs" 入力チャンネル "Outputs" 出力チャンネル - 可能な入出力チャンネル指定:
-
cnametype type として設定されるチャンネル cname cname<|"Type"type|> type として設定されるチャンネル cname cname<|"Type"type,s1v1,…|> その他の指定 type cname は type に対して固有 <|"Type"type,…|> または Automatic-><|"Type"type,…|> cname は type に対して固有 - μc のその他の可能なキー:
-
"ADC" A/D変換指定 "ClockFrequency" マイクロコントローラのシステムクロックの周波数 "I2CAddress" I2Cスレーブデバイスとして動作する場合のI2Cアドレス "Microcontroller" コードを生成する対象であるマイクロコントローラ "OperatingVoltage" マイクロコントローラの動作電圧 "Serial" シリアル通信指定 "SerialOverUSB" Serial over USB指定 "SlaveSelect" SPIスレーブデバイスとして動作する場合のスレーブ選択ピン "Timer" タイマまたはカウンタの数 - コードを直接ソースコードに差し込むための μc のキー:
-
"IncludeFiles" インクルードするファイル "Definitions" マクロの定義 "Declarations" 関数宣言 "Utilities" ユーティリティ関数・変数 "Initializations" プログラムの初期化 "Loop" 各サンプリング時点で実行する "PreLoop" "Loop"の前に実行する "PostLoop" "Loop"の後に実行する "UntimedLoop" プロセッサが解放されているときに繰り返し実行する - プログラミングメカニズム p は連想で指定される.
- p に使用できるキーには以下のようなものがある:
-
"BaudRate" コードを埋め込むボーレート "ConnectionPort" 外部プログラマが接続されるポート "ExternalProgrammer" 使用する外部プログラマ "ProgrammerName" 使用するプログラマ "ProgrammerConfigurationName" 使用するプログラマ設定 "ProgrammerConfigurationInstallation" プログラマ設定ソフトウェアの場所 "ProgrammerInstallation" プログラマソフトウェアの場所 - p が文字列の場合,外部プログラマはシリアルポート p に接続されると想定される.
- MicrocontrollerEmbedCode[sys,μc,p,specs]はその他の指定を与えるのに使用できる.
- 指定 specs は連想であり,キーには以下が使用できる:
-
"CleanIntermediate" True 一時ファイルを削除するかどうか "CompileOptions" Automatic コンパイラに渡すオプション "CompilerInstallation" Automatic コンパイラソフトウェアの場所 "CompilerName" Automatic 使用するコンパイルコマンド "CreateBinary" Automatic 機械コードを作成するかどうか "I2C" {} 外部I2Cデバイス指定 "IncludeDirectories" {} インクルードパスに加えるディレクトリ "Language" Automatic ソースコードの言語 "Libraries" {} 実行ファイルの構築に使用するライブラリ "SPI" {} 外部SPIデバイス指定 "WorkingDirectory" Automatic 一時ファイルが生成されるディレクトリ
例題
すべて開く すべて閉じる例 (1)
Needs["MicrocontrollerKit`"]Adafruit Trinket 5V上のLEDを半分の輝度で点灯する:
ℳ = MicrocontrollerEmbedCode[NonlinearStateSpaceModel[{{}, {(5/2)}}, {}, {}, {Automatic}, Automatic, SamplingPeriod -> 0.25], <|"Target" -> "AdafruitTrinket5V", "Outputs" -> 1 -> "Analog"|>,
<|"ExternalProgrammer" -> "usbtiny"|>]ℳ["MachineCodeByteCount"]Pane[Framed[ℳ["SourceCode"], Background -> ColorData["HTML", "AliceBlue"]], {Automatic, 300}, Scrollbars -> {False, True}]スコープ (37)
デジタル出力 (2)
MicrocontrollerEmbedCode[NonlinearStateSpaceModel[{{}, {5}}, {}, {}, {Automatic}, Automatic, SamplingPeriod -> 1], <|"Target" -> "ArduinoUno", "Outputs" -> 13 -> "Digital"|>, "/dev/cu.usbmodem14101"]sys = NonlinearStateSpaceModel[{{Which[x > 0, 0, True, 1]}, {x}}, {x}, {}, {Automatic}, Automatic, SamplingPeriod -> 2];MicrocontrollerEmbedCode[sys, <|"Target" -> "ArduinoUno", "Outputs" -> 13 -> "Digital"|>, "/dev/cu.usbmodem14101"]パルス出力 (2)
MicrocontrollerEmbedCode[NonlinearStateSpaceModel[{{}, {1}}, {}, {}, {Automatic}, Automatic, SamplingPeriod -> 4], <|"Target" -> "ArduinoUno", "Outputs" -> 13 -> "Pulse"|>, "/dev/cu.usbmodem14101"]全体のサンプリング周期とは異なるようにパルスのサンプリング周期を指定する:
MicrocontrollerEmbedCode[NonlinearStateSpaceModel[{{}, {1}}, {}, {}, {Automatic}, Automatic, SamplingPeriod -> 4], <|"Target" -> "ArduinoUno", "Outputs" -> 13 -> <|"Type" -> "Pulse", SamplingPeriod -> 2|>|>, "/dev/cu.usbmodem14101"]アナログ出力 (5)
MicrocontrollerEmbedCode[NonlinearStateSpaceModel[{{}, {(5/2)}}, {}, {}, {Automatic}, Automatic, SamplingPeriod -> 1], <|"Target" -> "ArduinoUno", "Outputs" -> 3 -> "Analog"|>, "/dev/cu.usbmodem14101"]MicrocontrollerEmbedCode[NonlinearStateSpaceModel[{{}, {3.75}}, {}, {}, {Automatic}, Automatic, SamplingPeriod -> 1], <|"Target" -> "ArduinoUno", "Outputs" -> 3 -> "Analog"|>, "/dev/cu.usbmodem14101"]MicrocontrollerEmbedCode[NonlinearStateSpaceModel[{{}, {3.75}}, {}, {}, {Automatic}, Automatic, SamplingPeriod -> 1], <|"Target" -> "ArduinoUno", "Outputs" -> 4 -> "Analog"|>, "/dev/tty.usbmodem14101"]出力が適切にスケールされるように必要に応じて範囲を指定する:
μc = <|"Target" -> "ArduinoUno", "Outputs" -> 3 -> <|"Type" -> "Analog", "MaxValue" -> 10|> |>;MicrocontrollerEmbedCode[NonlinearStateSpaceModel[{{}, {10}}, {}, {}, {Automatic}, Automatic, SamplingPeriod -> 1], μc, "/dev/cu.usbmodem14101"]MicrocontrollerEmbedCode[NonlinearStateSpaceModel[{{}, {5}}, {}, {}, {Automatic}, Automatic, SamplingPeriod -> 1], μc, "/dev/cu.usbmodem14101"]正負の値のアナログ信号には,方向のためのピンがもう一つ必要である:
μc = <|"Target" -> "ArduinoUno", "Outputs" -> 3 -> <|"Type" -> "Analog", "Negative" -> 4|>|>;3番ピンのLEDは半分の輝度で光り,4番ピンのLEDは点灯する:
MicrocontrollerEmbedCode[NonlinearStateSpaceModel[{{}, {-2.5}}, {}, {}, {Automatic}, Automatic, SamplingPeriod -> 1], μc, "/dev/cu.usbmodem14101"]MicrocontrollerEmbedCode[NonlinearStateSpaceModel[{{}, {2.5}}, {}, {}, {Automatic}, Automatic, SamplingPeriod -> 1], μc, "/dev/cu.usbmodem14101"]μc = <|"Target" -> "ArduinoUno", "Outputs" -> 3 -> <|"Type" -> "Analog", "Positive" -> 4|>|>;MicrocontrollerEmbedCode[NonlinearStateSpaceModel[{{}, {2.5}}, {}, {}, {Automatic}, Automatic, SamplingPeriod -> 1], μc, "/dev/cu.usbmodem14101"]MicrocontrollerEmbedCode[NonlinearStateSpaceModel[{{}, {-2.5}}, {}, {}, {Automatic}, Automatic, SamplingPeriod -> 1], μc, "/dev/tty.usbmodem1411"]ℳ = MicrocontrollerEmbedCode[NonlinearStateSpaceModel[{{}, {2.5}}, {}, {}, {Automatic}, Automatic, SamplingPeriod -> 1], <|"Target" -> "ArduinoUno", "Outputs" -> 3 -> <|"Type" -> "Analog", "TimerMode" -> 5|>|>, "/dev/cu.usbmodem14101"]ℳ["PulseWidthWaveform"]アナログ入力 (3)
「A0」に接続されたポテンショメータの値を読み取り,それを使って3番ピンのLEDの輝度を調整する:
MicrocontrollerEmbedCode[StateSpaceModel[{{}, {}, {}, {{1}}}, SamplingPeriod -> 1, SystemsModelLabels -> None], <|"Target" -> "ArduinoUno", "Inputs" -> "A0" -> "Analog", "Outputs" -> 3 -> "Analog"|>, "/dev/cu.usbmodem14101"]μc := <|"Target" -> "ArduinoUno", "Inputs" -> "A0" -> <|"Type" -> "Analog", "Reference" -> #|>, "Outputs" -> 3 -> "Analog"|>&;p = "/dev/cu.usbmodem14101";MicrocontrollerEmbedCode[StateSpaceModel[{{}, {}, {}, {{1}}}, SamplingPeriod -> 1, SystemsModelLabels -> None], μc["AVCC"], p]MicrocontrollerEmbedCode[StateSpaceModel[{{}, {}, {}, {{1}}}, SamplingPeriod -> 1, SystemsModelLabels -> None], μc["Internal"], p]MicrocontrollerEmbedCode[StateSpaceModel[{{}, {}, {}, {{1}}}, SamplingPeriod -> 1, SystemsModelLabels -> None], μc["AREF" -> 3.3], p]ADCの入力クロックがプリスケーラを使用するように指定する:
MicrocontrollerEmbedCode[StateSpaceModel[{{}, {}, {}, {{1}}}, SamplingPeriod -> 1, SystemsModelLabels -> None], <|"Target" -> "ArduinoUno", "Inputs" -> "A0" -> <|"Type" -> "Analog", "Prescaler" -> 64|>, "Outputs" -> 3 -> "Analog"|>, "/dev/cu.usbmodem14101"]デジタル入力 (3)
MicrocontrollerEmbedCode[StateSpaceModel[{{}, {}, {}, {{1}}}, SamplingPeriod -> 0.1, SystemsModelLabels -> None], <|"Target" -> "ArduinoUno", "Inputs" -> "8" -> "Digital", "Outputs" -> "3" -> "Digital"|>, "/dev/cu.usbmodem14101"]MicrocontrollerEmbedCode[NonlinearStateSpaceModel[{{}, {Which[u > 0, 1, True, 0]}}, {}, {u}, {Automatic}, Automatic, SamplingPeriod -> 0.1], <|"Target" -> "ArduinoUno", "Inputs" -> "8" -> "Logic", "Outputs" -> "3" -> "Digital"|>, "/dev/cu.usbmodem14101"]切り替え回数(10秒間に最大5回を想定)を使ってLEDの輝度を設定する:
μc := <|"Target" -> "ArduinoUno", "Inputs" -> 2 -> #, "Outputs" -> 3 -> <|"Type" -> "Analog", "MaxValue" -> 5|>|>&p = "/dev/cu.usbmodem14101";MicrocontrollerEmbedCode[StateSpaceModel[{{}, {}, {}, {{1}}}, SamplingPeriod -> 10, SystemsModelLabels -> None], μc["ToggleCount"], p]MicrocontrollerEmbedCode[StateSpaceModel[{{}, {}, {}, {{1}}}, SamplingPeriod -> 10, SystemsModelLabels -> None], μc["RisingEdgeCount"], p]MicrocontrollerEmbedCode[StateSpaceModel[{{}, {}, {}, {{1}}}, SamplingPeriod -> 10, SystemsModelLabels -> None], μc["FallingEdgeCount"], p]MicrocontrollerEmbedCode[StateSpaceModel[{{}, {}, {}, {{1}}}, SamplingPeriod -> 10, SystemsModelLabels -> None], μc["LowCount"], p]シリアル(RS-232)通信 (2)
ℳ = MicrocontrollerEmbedCode[StateSpaceModel[{{}, {}, {}, {{1}}}, SamplingPeriod -> 1, SystemsModelLabels -> None], <|"Target" -> "ArduinoUno", "Inputs" -> 0 -> "Serial", "Outputs" -> 1 -> "Serial"|>, "/dev/cu.usbmodem14101"]Arduino Unoにおいてシリアルピンは固有なので,シリアルタイプを直接与えることもできる:
ℳ = MicrocontrollerEmbedCode[StateSpaceModel[{{}, {}, {}, {{1}}}, SamplingPeriod -> 1, SystemsModelLabels -> None], <|"Target" -> "ArduinoUno", "Inputs" -> "Serial", "Outputs" -> "Serial"|>, "/dev/cu.usbmodem14101"]dev = DeviceOpen["Serial", "/dev/cu.usbmodem14101"]u = y = {};task = SessionSubmit@ScheduledTask[
If[DeviceExecute[dev, "SerialReadyQ"],
AppendTo[y, DeviceReadBuffer[dev, "ReadTerminator" -> ℳ["Serial"]["EndByte"]]];DeviceExecute[dev, "ReadFlush"];
AppendTo[u, RandomReal[]];
DeviceWrite[dev, ℳ["Serial"]["StartByte"]];
DeviceWrite[dev, ToString@u[[-1]]];
DeviceWrite[dev, ℳ["Serial"]["EndByte"]]
],
0.5];TaskRemove[task];
DeviceClose[dev]ListLinePlot[{Most@u, ToExpression[FromCharacterCode[Rest@#]]& /@ Rest[y]}]ℳ = MicrocontrollerEmbedCode[StateSpaceModel[{{}, {}, {}, {{1}}}, SamplingPeriod -> 1, SystemsModelLabels -> None], <|"Target" -> "ArduinoUno", "Inputs" -> "Serial", "Outputs" -> "Serial", "Serial" -> "BaudRate" -> 38400|>, "/dev/cu.usbmodem14101"]ℳ["Serial"]["BaudRate"]SPI (Serial Peripheral Interface)通信 (1)
MAX6675熱電対は,データが2バイトであるSPIセンサである: »
exchangeSequence = {"SELECT", "READ", "READ", "DESELECT"};bConversion[b1_, b2_] := {CDeclare["uint16_t", CAssign["sxtnBtValue", COperator[BitOr, {COperator[BitShiftLeft, {b1, 8}], b2}]]], COperator[Times, {0.25, COperator[BitShiftRight, {"sxtnBtValue", 3}]}]}ToCCodeString[bConversion["byte1", "byte2"]]//StringTrim7番ピンをSSピンとし,センサをSPIスレーブデバイスとして指定する:
ic = 12 -> <|"Type" -> "SPI", "SlaveSelect" -> 7, "Conversion" -> bConversion|>;oc = "Serial";
ℳ = MicrocontrollerEmbedCode[StateSpaceModel[{{}, {}, {}, {{1}}}, SamplingPeriod -> 1, SystemsModelLabels -> None], <|"Target" -> "ArduinoUno", "Inputs" -> ic, "Outputs" -> oc|>, "/dev/cu.usbmodem14101", <|"SPI" -> {7 -> exchangeSequence}|>]y = {};
dv = DeviceOpen["Serial", "/dev/cu.usbmodem14101"]task = SessionSubmit@ScheduledTask[
If[DeviceExecute[dv, "SerialReadyQ"],
AppendTo[y, DeviceReadBuffer[dv, "ReadTerminator" -> ℳ["Serial"]["EndByte"]]];DeviceExecute[dv, "ReadFlush"];
],
1
];TaskRemove[task];
DeviceClose[dv];ListLinePlot[(ToExpression@FromCharacterCode@Rest@#& /@ y)[[2 ;; -1]], PlotRange -> All]I2C (Inter-Integrated Circuit)通信 (1)
MPU6050センサを使って温度を測定する.データは0x41から始まって2つのレジスタに入る: »
i2cread = {"START", "0x41", "START", "READ", "ACK", "READ", "STOP"};センサのアドレスは0x68で,0x6Bの電源管理レジスタは初期化する必要がある:
i2cinit = "Initialization" -> {"START", "0x6B", "0x0", "STOP"};i2cspecs = "0x68" -> {i2cread, i2cinit};fn = COperator[BitOr, {COperator[BitShiftLeft, {#1, 8}], #2}]&;ToCCodeString[fn["hbyte", "lbyte"]]sys1 = NonlinearStateSpaceModel[{{}, 36.53 + 𝓊 / 340}, {}, 𝓊, SamplingPeriod -> 0.5]温度が25° Cを超えている場合はHighの値を出力するモデル:
sys2 = NonlinearStateSpaceModel[{{}, {Which[𝓊 > 24, 1, True, 0]}}, {}, {𝓊}, SamplingPeriod -> 0.5]温度を読み取り,HighまたはLowの値を出力するモデル全体:
sys = SystemsConnectionsModel[{sys1, sys2}, {{1, 1}{2, 1}}, {{1, 1}}, {{2, 1}}]埋め込まれたコードは,温度が25° Cを超えている場合に
番ピンのLEDを点灯する:
MicrocontrollerEmbedCode[sys, <|"Target" -> "ArduinoUno", "Inputs" -> "A4" -> <|"Type" -> "I2C", "SlaveAddress" -> "0x68", "Conversion" -> fn|>, "Outputs" -> 4 -> "Digital"|>, "/dev/cu.usbmodem14101", <|"I2C" -> i2cspecs|>]外部ライブラリ (1)
lib = FileNameJoin[{$HomeDirectory, "Documents", "Arduino", "libraries", "MAX6675", "max6675.cpp"}];さまざまな段階で呼び出す必要のあるコードとヘッダファイルを指定する:
i = "max6675.h";
u = "MAX6675 thermocouple(13, 7, 12)";
l = "thermocouple.readCelsius()";ic = <|"Type" -> "ExternalLibrary", "IncludeFiles" -> i, "Utilities" -> u, "Loop" -> l|>;
MicrocontrollerEmbedCode[StateSpaceModel[{{}, {}, {}, {{1}}}, SamplingPeriod -> 1, SystemsModelLabels -> None], <|"Target" -> "ArduinoUno", "Inputs" -> ic, "Outputs" -> "Serial"|>, "/dev/cu.usbmodem14101", <|"Libraries" -> lib|>]系のモデル (6)
ics = {"A0" -> "Analog", 2 -> "RisingEdgeCount"};
ocs = {3 -> "Analog"};
MicrocontrollerEmbedCode[TransferFunctionModel[{{{1, 1}}, 1}, s, SamplingPeriod -> 1], <|"Target" -> "ArduinoUno", "Inputs" -> ics, "Outputs" -> ocs|>, "/dev/cu.usbmodem14101"]ics = {"A0" -> "Analog", 0 -> "Serial"};
ocs = {1 -> "Serial", 1 -> "Serial"};
ℳ = MicrocontrollerEmbedCode[TransferFunctionModel[Unevaluated[{{1, 1}, {1, -1}}], z, SamplingPeriod -> 1,
SystemsModelLabels -> None], <|"Target" -> "ArduinoUno", "Inputs" -> ics, "Outputs" -> ocs|>, "/dev/cu.usbmodem14101"]{sb, db, eb} = Lookup[ℳ["Serial"], {"StartByte", "DelimiterByte", "EndByte"}]dv = DeviceOpen["Serial", "/dev/cu.usbmodem14101"]毎周期,入力信号を1つ送り,2つの出力信号を受信するタスクを設定する:
y = {};task = SessionSubmit@ScheduledTask[
If[DeviceExecute[dv, "SerialReadyQ"],
AppendTo[y, DeviceReadBuffer[dv, "ReadTerminator" -> eb]];DeviceExecute[dv, "ReadFlush"];
DeviceWrite[dv, sb];
DeviceWrite[dv, ToString@RandomReal[]];
DeviceWrite[dv, eb]
],
1];シリアル接続から受け取る実際の速度値と基準速度値を解釈する関数:
parseData[{sb, val1__, db, val2__}] := ToExpression@FromCharacterCode@#& /@ {{val1}, {val2}}
parseData[___] := Sequence[]TaskRemove[task];
DeviceClose[dv]ListLinePlot[Transpose[parseData /@ y], PlotLegends -> Automatic]ssm = StateSpaceModel[𝓎[𝓀] == (1/3)(𝓊[𝓀] + 𝓊[𝓀 - 1] + 𝓊[𝓀 - 2]), 𝓎[𝓀], 𝓊[𝓀], 𝓎[𝓀], 𝓀, SamplingPeriod -> 1]
MicrocontrollerEmbedCode[ssm, <|"Target" -> "ArduinoUno", "Inputs" -> "A0" -> "Analog", "Outputs" -> 3 -> "Analog"|>, "/dev/cu.usbmodem14101"]eqns = m L^2θ''[t] + κ θ'[t] + m g L Sin[θ[t]] == τ[t] /. {m -> 0.5, g -> 9.8, L -> 1, κ -> 0.1};pend = AffineStateSpaceModel[eqns, θ[t], τ[t], θ[t], t]Subscript[pend, d] = ToDiscreteTimeModel[pend, 0.01]
MicrocontrollerEmbedCode[Subscript[pend, d], <|"Target" -> "ArduinoUno", "Inputs" -> "A2" -> "Analog", "Outputs" -> 1 -> "Serial"|>, "/dev/cu.usbmodem14101"]単振り子のSystemsConnectionsModelを埋め込む:
Subscript[pend, d] = AffineStateSpaceModel[{{Subscript[x, 1] + 0.01 Subscript[x, 2], 0.02 (-4.9 Sin[Subscript[x, 1]] - 0.1 Subscript[x, 2]) + Subscript[x, 2]}, {{0}, {0.02}}, {Subscript[x, 1]}, {{0}}}, {Subscript[x, 1], Subscript[x, 2]}, {{τ, 0}}, {Automatic}, Automatic, SamplingPeriod -> 0.01];均衡値が2.525であるジョイスティックで入力トルクのシミュレーションを行う:
jstick = NonlinearStateSpaceModel[{{}, (𝓊 - 2.525/2.525)}, {}, {{𝓊, 2.525}}, SamplingPeriod -> 0.01]sys = SystemsConnectionsModel[{jstick, Subscript[pend, d]}, {{1, 1}{2, 1}}, {{1, 1}}, {{2, 1}}]ℳ = MicrocontrollerEmbedCode[sys, <|"Target" -> "ArduinoUno", "Inputs" -> "A2" -> "Analog", "Outputs" -> 1 -> "Serial"|>, "/dev/cu.usbmodem14101"]dv = DeviceOpen["Serial", "/dev/cu.usbmodem14101"]parseData[{ℳ["Serial"]["StartByte"], val__}] := ToExpression@FromCharacterCode@#& /@ {{val}}
parseData[___] := {}
y = {};0.01秒ごとに値を読み取るようにスケジュールされたタスクを設定する:
task = SessionSubmit@ScheduledTask[
If[DeviceExecute[dv, "SerialReadyQ"],
y = Join[y, parseData@DeviceReadBuffer[dv, "ReadTerminator" -> ℳ["Serial"]["EndByte"]]];
DeviceExecute[dv, "ReadFlush"];
],
0.01
];TaskRemove[task];
DeviceClose[dv];ListLinePlot[Rest[y], PlotRange -> All]MicrocontrollerEmbedCode[NonlinearStateSpaceModel[{{BitXor[1, x]}, {x}}, {x}, {}, {Automatic}, Automatic, SamplingPeriod -> 1], <|"Target" -> "ArduinoUno", "Outputs" -> 13 -> "Digital"|>, "/dev/cu.usbmodem14101", <|ExternalTypeSignature -> "int"|>]ターゲット (2)
外部20 MHzクロックを使い,15番ピンが出力に設定されたATmega328P_28PDIPマイクロコントローラ:
μc = <|"Target" -> "ATmega328P_28PDIP", "Outputs" -> 15 -> "Digital", "ClockFrequency" -> 20 10^6|>;p = <|"ExternalProgrammer" -> "avrisp", "ConnectionPort" -> "/dev/cu.usbmodem14101", "BaudRate" -> 19200|>;MicrocontrollerEmbedCode[NonlinearStateSpaceModel[{{Which[x > 0, 0, True, 1]}, {x}}, {x}, {}, {Automatic}, Automatic, SamplingPeriod -> 0.5], μc, p]工場出荷時設定のATmega168A_28PDIPマイクロコントローラ:
MicrocontrollerEmbedCode[NonlinearStateSpaceModel[{{Which[x > 0, 0, True, 1]}, {x}}, {x}, {}, {Automatic}, Automatic, SamplingPeriod -> 0.5], <|"Target" -> "ATmega168A_28PDIP", "Outputs" -> 15 -> "Digital"|>,
<|"ExternalProgrammer" -> "avrisp", "ConnectionPort" -> "/dev/cu.usbmodem14101", "BaudRate" -> 19200|>]物理的ターゲットがない場合 (1)
ℳ = MicrocontrollerEmbedCode[NonlinearStateSpaceModel[{{Which[x > 0, 0, True, 1]}, {x}}, {x}, {}, {Automatic}, Automatic, SamplingPeriod -> 2], <|"Target" -> "ArduinoUno", "Outputs" -> 13 -> "Digital"|>, "/dev/cu.usbmodem14101"]Framed[StringTrim[ℳ["StandardError"]], Background -> ColorData["HTML", "MintCream"]]接続ポートがNoneと指定されている場合,コードは埋め込まれない:
MicrocontrollerEmbedCode[NonlinearStateSpaceModel[{{Which[x > 0, 0, True, 1]}, {x}}, {x}, {}, {Automatic}, Automatic, SamplingPeriod -> 2], <|"Target" -> "ArduinoUno", "Outputs" -> 13 -> "Digital"|>, <|"ConnectionPort" -> None|>]外部プログラマ (1)
usbaspプログラマを使ってマイクロコントローラをプログラムする:
MicrocontrollerEmbedCode[NonlinearStateSpaceModel[{{Which[x > 0, 0, True, 1]}, {x}}, {x}, {}, {Automatic}, Automatic, SamplingPeriod -> 1], <|"Target" -> "ATmega168A_28PDIP", "Outputs" -> 15 -> "Digital"|>, <|"ExternalProgrammer" -> "usbasp"|>]タイマ (1)
ℳ = MicrocontrollerEmbedCode[NonlinearStateSpaceModel[{{Which[x > 0, 0, True, 1]}, {x}}, {x}, {}, {Automatic}, Automatic, SamplingPeriod -> 2], <|"Target" -> "ArduinoUno", "Outputs" -> 13 -> "Digital", "Timer" -> 2|>, "/dev/cu.usbmodem14101"]ℳ["Timer"]特性 (1)
MicrocontrollerCodeDataオブジェクトから利用できる特性のリストを取得する:
ℳ = MicrocontrollerEmbedCode[StateSpaceModel[{{}, {}, {}, {{1}}}, SamplingPeriod -> 1, SystemsModelLabels -> None], <|"Target" -> "ArduinoUno", "Inputs" -> 2 -> "RisingEdgeCount", "Outputs" -> "Serial"|>, "/dev/cu.usbmodem14101"]allP = ℳ["Properties"]ℳ["Microcontroller"]Dataset[ℳ["Serial"]]その他の指定 (5)
wdir = CreateDirectory[];MicrocontrollerEmbedCode[StateSpaceModel[{{}, {}, {}, {{1}}}, SamplingPeriod -> 1, SystemsModelLabels -> None], <|"Target" -> "ArduinoUno", "Inputs" -> "A0" -> "Analog", "Outputs" -> 3 -> "Analog"|>, "/dev/cu.usbmodem14101", <|"WorkingDirectory" -> wdir, "CleanIntermediate" -> False|>]FileNameTake /@ (ifiles = FileNames["*", wdir])DeleteFile[ifiles]MicrocontrollerEmbedCode[StateSpaceModel[{{}, {}, {}, {{1}}}, SamplingPeriod -> 1, SystemsModelLabels -> None], <|"Target" -> "ArduinoUno", "Inputs" -> "A0" -> "Analog", "Outputs" -> 3 -> "Analog"|>, "/dev/cu.usbmodem14101", <|"WorkingDirectory" -> wdir|>]FileNameTake /@ FileNames["*", wdir]DeleteDirectory[wdir]cmpIn = FileNameJoin[{$RootDirectory, "usr", "local", "bin"}];MicrocontrollerEmbedCode[StateSpaceModel[{{}, {}, {}, {{1}}}, SamplingPeriod -> 1, SystemsModelLabels -> None], <|"Target" -> "ArduinoUno", "Inputs" -> "A0" -> "Analog", "Outputs" -> 3 -> "Analog"|>, "/dev/cu.usbmodem14101", <|"CompilerInstallation" -> cmpIn|>]cmpIn = FileNameJoin[{$RootDirectory, "usr", "local", "bin"}];MicrocontrollerEmbedCode[StateSpaceModel[{{}, {}, {}, {{1}}}, SamplingPeriod -> 1, SystemsModelLabels -> None],
<|"Target" -> "ArduinoUno", "Inputs" -> "A0" -> "Analog", "Outputs" -> 3 -> "Analog"|>, "/dev/cu.usbmodem14101", <|"CompilerInstallation" -> cmpIn, "CompilerName" -> "avr-gcc"|>]ℳ𝒸 = MicrocontrollerEmbedCode[StateSpaceModel[{{}, {}, {}, {{1}}}, SamplingPeriod -> 1, SystemsModelLabels -> None], <|"Target" -> "ArduinoUno", "Inputs" -> "A0" -> "Analog", "Outputs" -> 3 -> "Analog"|>, "/dev/cu.usbmodem14101"];Pane[Framed[ℳ𝒸["SourceCode"], Background -> ColorData["HTML", "AliceBlue"]], {Automatic, 300}, Scrollbars -> {False, True}](Arduinoスケッチが使用する)Wiring言語を使用する:
ℳ𝓌 = MicrocontrollerEmbedCode[StateSpaceModel[{{}, {}, {}, {{1}}}, SamplingPeriod -> 1, SystemsModelLabels -> None], <|"Target" -> "ArduinoUno", "Inputs" -> "A0" -> "Analog", "Outputs" -> 3 -> "Analog"|>, "/dev/cu.usbmodem14101", <|"Language" -> "Wiring"|>];Pane[Framed[ℳ𝓌["SourceCode"], Background -> ColorData["HTML", "AliceBlue"]], {Automatic, 300}, Scrollbars -> {False, True}]ソースコードを生成するが,コンパイルしたりターゲットに埋め込んだりしない:
ℳ𝒸 = MicrocontrollerEmbedCode[StateSpaceModel[{{}, {}, {}, {{1}}}, SamplingPeriod -> 1, SystemsModelLabels -> None], <|"Target" -> "ArduinoUno", "Inputs" -> "A0" -> "Analog", "Outputs" -> 3 -> "Analog"|>, <||>, <|"CreateBinary" -> False|>]一般化と拡張 (1)
sys1 = {{u1, u2}, {u1 + u2, u1 - u2}};sys2 = NonlinearStateSpaceModel[{{}, {u1 + u2, u1 - u2}}, {}, {u1, u2}, SamplingPeriod -> 1]{ℳ1, ℳ2} = Table[MicrocontrollerEmbedCode[sys, <|"Target" -> "ArduinoUno", "Inputs" -> {"A0" -> "Analog", "A1" -> "Analog"}, "Outputs" -> {"Serial", "Serial"}|>, "/dev/cu.usbmodem14101"], {sys, {sys1, sys2}}]sC[sCode_] := With[{pos = StringPosition[sCode, "double u[2]" | "u[1];
}"]}, StringTake[sCode, {Min[pos], Max[pos]}]]Text[Grid[{Table[sC[M["SourceCode"]], {M, {ℳ1, ℳ2}}]}, Frame -> True, Background -> {{RGBColor[0.7643533, 0.8585172999999999, 0.9872238999999999], RGBColor[0.9962797318147592, 0.9150199086759445, 0.7052834430698727]}}]]考えられる問題 (2)
tfm = TransferFunctionModel[{{{5}}, 1 + 10*s}, s];MicrocontrollerEmbedCode[tfm, <|"Target" -> "ArduinoUno", "Inputs" -> "A0" -> "Analog", "Outputs" -> 10 -> "Analog"|>, "/dev/cu.usbmodem14101"]Subscript[tfm, d] = ToDiscreteTimeModel[tfm, 0.5]MicrocontrollerEmbedCode[Subscript[tfm, d], <|"Target" -> "ArduinoUno", "Inputs" -> "A0" -> "Analog", "Outputs" -> 10 -> "Analog"|>, "/dev/cu.usbmodem14101"]接続モデルにおいて,すべての部分系のサンプリング周期は同じでなければならない:
Subscript[sys, 1] = StateSpaceModel[{{{1 / 2}}, {{1}}, {{-4}}, {{0}}}, SamplingPeriod -> 1, SystemsModelLabels -> None];
Subscript[sys, 2] = StateSpaceModel[{{{3 / 5}}, {{1}}, {{5}}, {{0}}}, SamplingPeriod -> 0.1, SystemsModelLabels -> None];SystemsConnectionsModel[{Subscript[sys, 1], Subscript[sys, 2]}, {{1, 1}{2, 1}}, {{1, 1}}, {{2, 1}}]MicrocontrollerEmbedCode[%, <|"Target" -> "ArduinoUno", "Inputs" -> "A0" -> "Analog", "Outputs" -> 10 -> "Analog"|>, "/dev/tty.usbmodemfa1311"]Subscript[sys, 1] = ToDiscreteTimeModel[ToContinuousTimeModel[Subscript[sys, 1]], 0.1]SystemsConnectionsModel[{Subscript[sys, 1], Subscript[sys, 2]}, {{1, 1}{2, 1}}, {{1, 1}}, {{2, 1}}]MicrocontrollerEmbedCode[%, <|"Target" -> "ArduinoUno", "Inputs" -> "A0" -> "Analog", "Outputs" -> 10 -> "Analog"|>, "/dev/cu.usbmodem14101"]テクニカルノート
関連するガイド
-
▪
- Microcontroller Kit ▪
- 制御系 ▪
- 信号処理 ▪
- 接続デバイスの使用
関連リンク
テキスト
Wolfram Research (2019), MicrocontrollerEmbedCode, Wolfram言語関数, https://reference.wolfram.com/language/MicrocontrollerKit/ref/MicrocontrollerEmbedCode.html.
CMS
Wolfram Language. 2019. "MicrocontrollerEmbedCode." Wolfram Language & System Documentation Center. Wolfram Research. https://reference.wolfram.com/language/MicrocontrollerKit/ref/MicrocontrollerEmbedCode.html.
APA
Wolfram Language. (2019). MicrocontrollerEmbedCode. Wolfram Language & System Documentation Center. Retrieved from https://reference.wolfram.com/language/MicrocontrollerKit/ref/MicrocontrollerEmbedCode.html
BibTeX
@misc{reference.wolfram_2026_microcontrollerembedcode, author="Wolfram Research", title="{MicrocontrollerEmbedCode}", year="2019", howpublished="\url{https://reference.wolfram.com/language/MicrocontrollerKit/ref/MicrocontrollerEmbedCode.html}", note=[Accessed: 11-August-2026]}
BibLaTeX
@online{reference.wolfram_2026_microcontrollerembedcode, organization={Wolfram Research}, title={MicrocontrollerEmbedCode}, year={2019}, url={https://reference.wolfram.com/language/MicrocontrollerKit/ref/MicrocontrollerEmbedCode.html}, note=[Accessed: 11-August-2026]}