Arduino&MATLABでサーボモータ(とか)を制御する
ArduinoとMATLABを連携すると要はコンパイルなしにいろいろデバッグができて作業効率が良いということです。
Pythonでもできそうなもんだけど誰か代わりに調べてください。
この30分のビデオ見ればここにあることは全部わかります。
Using Arduino with MATLAB and Simulink - Video - MATLAB
パッケージのインストール
matlab2014以降から対応です。
Support Package InstallerからArduinoに関する追加のパッケージをインストールします。
Home画面のAdd-onから探せるそうですが
matlabコンソールから試しに
a = arduino();
とか入力してみて出たエラーからも簡単に飛ぶことが出来ます。
あとはひたすらポチポチするだけです。大体15分弱かかります。
Arduinoとの接続と試運転
Control Servo Motors - MATLAB & Simulink Example
を参考に進めていきます。
接続
ホーム画面から「コンピュータの管理」というのを探し当ててそこからデバイスマネージャーのポートという所を探してください。
こんな感じ。
ここから得た情報を元に次のように入力してみます。
2つ目の変数はボードの種類なのでunoを使っている人はunoを入れてください。
a = arduino('com4', 'Mega2560', 'Libraries', 'Servo');
サーボモータの制御
サーボモータのピンを調べます。私のはモータシールドの「OUT5」につながっているので以下のドキュメントからD5とわかります。
Arduino Motor Shield Rev3
s = servo(a, 'D5') s = Servo のプロパティ: Pins: D5 MinPulseDuration: 5.44e-04 (s) MaxPulseDuration: 2.40e-03 (s)
実際に遊んだ時のコードです。writePosition(s, angle);とcurrent_pos = readPosition(s);のようにして
位置の読み書きをします。
注意として0~180°が0~1に置き換わっているので180で割ったりしてください。
%% write value Base_angle = 90; Min_angle = -30; Max_angle = 30; for angle = Min_angle:10:Max_angle Wangle = (angle+Base_angle)/180; writePosition(s, Wangle); current_pos = readPosition(s); current_pos = current_pos*180; fprintf('Current motor position is %d degrees\n', current_pos); pause(1); end Wangle = (Base_angle)/180; writePosition(s, Wangle);
他のmethodの確認
methods(a)
とうつことで使用できる関数を確認できます。
私のはこんなのでした。最新バージョンではボタン等のUIも書けるようです。とビデオにはあったんですがね。
addon configurePin display readDigitalPin servo writePWMDutyCycle configureAnalogPin details i2cdev readVoltage spidev writePWMVoltage configureDigitalPin disp playTone scanI2CBus writeDigitalPin
連続的に制御するには?
時間を取得するticとtocというコマンドを使ってwhileループぶん回すことで擬似的にそれっぽい制御をすることが可能になります。
あとはdelayを適宜入れれば遅い周期の動作は可能です。
DCモータの制御
本当はシステム同定をしたかったのですが手持ちの環境ではちょっと難し目です。あとで別に書きます。
特定の部品を使っている場合は簡単
Adafruit社のモーターシールドV2を使っている場合はとても簡単にDCモータを制御可能です。
裏を返すとそうでないと割りと面倒という...
Control Motors Using Adafruit Motor Shield V2 - MATLAB & Simulink Example
安いので楽をしたい人は買ってどうぞ。
Adafruit Motor/Stepper/Servo Shield for Arduino v2 Kit [v2.3] ID: 1438 - $19.95 : Adafruit Industries, Unique & fun DIY electronics and kits
私は持ってなくて悔しいのでこれについては書きません(公式のドキュメントが十分わかりやすい為でもある)