シリアル通信
基本操作
シリアル通信では,データの受信と送信にRXピンとTXピンを使用する.
共通のクロック信号がないため,どちらのデバイスもいくつかのパラメータが一致しなければならない.マイクロコントローラの"Serial"指定に,必要に応じて以下のパラメータを使うことができる.
| "BaudRate" | Automatic | データ転送レート(ビット/秒) |
| "DataBits" | Automatic | 使用するフレームあたりのデータビット数 |
| "Parity" | Automatic | パリティビット設定 |
| "StopBits" | Automatic | 使用するストップビット数 |
Needs["MicrocontrollerKit`"]MicrocontrollerEmbedCode[StateSpaceModel[{{}, {}, {}, {{1}}}, SamplingPeriod -> 1, SystemsModelLabels -> None], <|"Target" -> "ArduinoUno", "Inputs" -> 0 -> "Serial", "Outputs" -> 1 -> "Serial", "Serial" -> "BaudRate" -> 57600|>, "/dev/cu.usbmodem14101"]UnoにはRXピンとTXピンが1つずつしかないので,可能な指定は"Serial"だけである.
MicrocontrollerEmbedCode[StateSpaceModel[{{}, {}, {}, {{1}}}, SamplingPeriod -> 1, SystemsModelLabels -> None], <|"Target" -> "ArduinoUno", "Inputs" -> "Serial", "Outputs" -> "Serial", "Serial" -> "BaudRate" -> 57600|>, "/dev/cu.usbmodem14101"]また,この他,送信される実際のデータを設定するための指定もある.
| "StartByte" | 19 (XOff) | 送信された,または受信する最初のバイト |
| "DelimiterByte" | 44 (,) | データ間のバイト |
| "EndByte" | 17(XOn) | 送信された,または受信する最後のバイト |
| "FractionalPartDigits" | Automatic | 小数部の桁数 |
"DelimiterByte"は入力チャンネルまたは出力チャンネルが2つ以上ある場合に関与してくる.
ℳ = MicrocontrollerEmbedCode[StateSpaceModel[{{}, {}, {}, {{0.5}, {2}}}, SamplingPeriod -> 1, SystemsModelLabels -> None], <|"Target" -> "ArduinoUno", "Inputs" -> "Serial", "Outputs" -> {"Serial", "Serial"}, "Serial" -> "DelimiterByte" -> " "|>, "/dev/cu.usbmodem14101"]配備されたコードのパラメータはMicrocontrollerCodeDataオブジェクトから取り出せる.
Dataset[ℳ["Serial"]]"BaudRateError"はボーレートの誤差率を与える."TransmissionSpeedMode"等の特性は,マイクロコントローラ特有である."BaudRateError"以外のすべての特性は"Serial"オプションで設定できる.
ℳ["Serial"]["BaudRate"]仮想COMポート
マイクロコントローラのシリアル機能はUSB上で設定できることがある.その場合,RXピンとTXピンではなく,代わりにUSBピンであるD-とD+を使用する.
通信は仮想ポート上で行われ,パラメータは"SerialOverUSB" を使って設定する.それ以外は通常の場合と同様のワークフローとなる.
ℳ = MicrocontrollerEmbedCode[StateSpaceModel[{{}, {}, {}, {{1}}}, {}, {Automatic}, SamplingPeriod -> 0.5, SystemsModelLabels -> None], <|"Target" -> "ArduinoMicro", "Inputs" -> "A0" -> "Analog", "Outputs" -> "SerialOverUSB", "SerialOverUSB" -> "StartByte" -> 8|>, "/dev/cu.usbmodem14101"]ℳ["SerialOverUSB"]["StartByte"]デバイスフレームワーク
Arduino Micro等,シリアル機能がソフトウェアで実装されているボードもあるが,Arduino Uno等のようにUSB-シリアル変換器を持つボードもある.どちらのボードも,シリアルインターフェースを使い,USBポートを通してパーソナルコンピュータと通信できる.Wolfram Device Frameworkはこのシリアルインターフェースを通してこれらのボードと通信できる.
まず,データの送信または受信ができるようにマイクロコントローラを設定する必要がある.
ℳ = MicrocontrollerEmbedCode[NonlinearStateSpaceModel[{{}, {Sin[r]}}, {}, {r}, {Automatic}, Automatic, SamplingPeriod -> 0.75],
<|"Target" -> "ArduinoUno", "Inputs" -> "Serial", "Outputs" -> "Serial"|>, "/dev/cu.usbmodem14101"]マイクロコントローラがシリアルデバイスになったので,デバイスフレームワークを使ってシリアル接続を開く.
dev = DeviceOpen["Serial", "/dev/cu.usbmodem14101"]u = y = c = {};
task = SessionSubmit@ScheduledTask[
If[DeviceExecute[dev, "SerialReadyQ"],
AppendTo[y, DeviceReadBuffer[dev, "ReadTerminator" -> ℳ["Serial"]["EndByte"]]];DeviceExecute[dev, "ReadFlush"];
AppendTo[c, RandomReal[]];
AppendTo[u, RandomReal[{0, 2π}]];
DeviceWrite[dev, ℳ["Serial"]["StartByte"]];
DeviceWrite[dev, ToString@u[[-1]]];
DeviceWrite[dev, ℳ["Serial"]["EndByte"]]
],
0.75];ListPlot[MapThread[Style[{#1, #2}, Hue@#3]&, {Most@u, ToExpression[FromCharacterCode[Rest@#]]& /@ Rest[y], Most@c}]]TaskRemove[task];
DeviceClose[dev]