粗大メモ置き場

個人用,たまーに来訪者を意識する雑記メモ

Arduino&MATLABでサーボモータ(とか)を制御する

ArduinoMATLABを連携すると要はコンパイルなしにいろいろデバッグができて作業効率が良いということです。
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
を参考に進めていきます。

接続

ホーム画面から「コンピュータの管理」というのを探し当ててそこからデバイスマネージャーのポートという所を探してください。
こんな感じ。
f:id:ossyaritoori:20170921065039p:plain

ここから得た情報を元に次のように入力してみます。
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を適宜入れれば遅い周期の動作は可能です。

Simukinkでもできます

Home->Addonからハードウェアパッケージのインストールを選択してAruduinoからsimulinkのパッケージを落とせばSimulinkでも開発ができます。
うーん、でもこちらは下のスライドにある通り、Simulinkで書いたプログラムをArduinoで実行するだけなので少々使い勝手は悪い感じがします。

f:id:ossyaritoori:20170922024235p:plain


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

私は持ってなくて悔しいのでこれについては書きません(公式のドキュメントが十分わかりやすい為でもある)