ジョイスティックを使ってステッピングモータを制御するコードを配備する
はじめに
ステッピングモータは位置を正確に制御する.ステッピングモータの軸の1回転は,特定数の角度の増分,つまりステップで達成される.モータの電磁石に特定のデジタルパルスシーケンスを適用するとモータが1ステップ動く.シーケンスを反転すると,モータは反対方向に動く.ステップ数を指定することで,軸を希望の位置に動かすことができる.
このプロジェクトでは,28BYJ48ステッピングモータのステップ数と回転方向を,ジョイスティックを使って指定する.ジョイスティックの測定値に基づいて,Adafruit Trinketマイクロコントローラが必要なパルスシーケンスを適用する.マイクロコントローラのピン配置とステッピングモータのパルスシーケンスは,外部ライブラリに記述されている.ステッピングモータの開ループ制御を行うために,外部ライブラリのコードと生成されたコードを使用する.
電気配線
開ループ制御器設計
1回転512ステップは,より少ない数の増分に分割できる.
Grid[Join[{{"分割数", "1増分あたりのステップ数"}}, Table[{d, 512 / d}, {d, Divisors[512]}]], Frame -> True, Background -> {None, {LightGray, {White, LightBlue}}}]1増分につき8ステップにする.
steps = 8;3Vより高いジョイスティックの前進動作を,モータの1増分とする.
f = Sequence[v > 3, steps]1Vより低い値を,逆方向の1増分とする.
r = Sequence[v < 1, -steps]開ループ制御器を組み立てる.
sys = NonlinearStateSpaceModel[{{}, With[{f = f, r = r}, Which[f, r, True, 0]]}, {}, {{v, 2.5}}, SamplingPeriod -> 0.1]制御器の配備
ジョイスティックの入力.
ic = {"4" -> "Analog"};出力は外部ライブラリが処理し,Trinketの0番から3番までのピンを使用する.
i = "stepper28BYJ48ATtiny85.h";
u = {"uint8_t pins[4] = {0, 1, 2, 3}", "StepperMotor m(pins)"};
l = {"int val", "m.rotate(val)"};oc = <|"Type" -> "ExternalLibrary", "IncludeFiles" -> i, "Utilities" -> u, "Loop" -> l|>;マイクロコントローラの全指定.
μc = <|"Target" -> "AdafruitTrinket5V", "Inputs" -> ic, "Outputs" -> oc|>TrinketはUSBTinyプログラマを使用する.
p = <|"ExternalProgrammer" -> "usbtiny"|>;ライブラリの場所.
lib = FileNameJoin[{Nest[ParentDirectory, NotebookDirectory[], 3], "Resources", "stepper28BYJ48ATtiny85"}];パッケージをロードする.
Needs["MicrocontrollerKit`"]コードをアップロードする.アップロードの前にジョイスティック入力の4番ピンへの接続を切断しなければならないこともある.
MicrocontrollerEmbedCode[sys, μc, p, <|"Libraries" -> lib|>]このように,ジョイスティックの動きからステップ数を取得する適切なモデルを作成することで,ステッピングモータの開ループ制御を行うコードが配備できる.
発展
- 制御器を改善する方法はあるだろうか.ジョイスティックの動きによってステップ数を設定するモデルを使用する.ジョイスティックのデフォルトの位置では,一般に測定値にノイズが含まれる.そのためデフォルト位置付近では何かしらのフィルタが必要となる.
- ジョイスティックの代りにポテンショメータを使い,モデルがポテンショメータの測定値の違いに基づくようにする.
- 未使用のアナログピンがあるマイクロコントローラボードを使い,ポテンショメータを使って回転速度を制御する.