現在..
arduino UNOとMATLAB(2021b)を使ってサーボモーターを制御しています。
背景
より正確にサーボモータを制御するためにarduinoにあるライブラリ(varspeedservo.h)を使う必要があることがわかっています。
(MATLABだけでarduinoを制御することも可能ですがサーボの精度が落ちます..)
実現したいこと
arduino IDEのソースコードの変数[servoAngle]をMATLABから値を送って実行したいです。(まずは一つの変数で)
arduino IDEの通信用コードーーーーーーーーーーーーーーーーーーーー
arduino
1#include <VarSpeedServo.h> // ライブラリのインクルード 2VarSpeedServo myservo; // サーボオブジェクトの作成 3 4 5// グローバル変数の宣言 6char input[4]; // 文字列格納用 7int i = 0; // 文字数のカウンタ 8int val = 0; // 受信した数値 9int deg = 100; // サーボの角度 10 11// 初期設定 12void setup() { 13 Serial.begin(9600); // シリアルポートを9600 bps[ビット/秒]で初期化 14 myservo.attach(9); // 制御信号を送る出力ピンの設定 15} 16 17// シリアル通信で受信したデータを数値に変換 18int serialNumVal(){ 19 // データ受信した場合の処理 20 if (Serial.available()) { 21 input[i] = Serial.read(); 22// 文字数が3以上 or 末尾文字がある場合の処理 23 if (i > 2 || input[i] == '\0') { 24 val = atoi(input); // 文字列を数値に変換 25 Serial.write(input); // 文字列を送信 26 Serial.write("\n"); 27 i = 0; // カウンタの初期化 28 } 29 else { i++; } 30 } 31 return val; 32} 33 34// メインループ 35void loop() { 36 deg = serialNumVal(); 37 myservo.write(deg, 30, true); // deg度まで速度30で回転 38 //myservo.write(180, 255, true); // 180°まで速度255で動かし完了をまつ 39} 40
matlab
1serialportlist("available") 2arduinocom=serialport("COM9",9600); 3configureTerminator(arduinocom,"CR/LF"); 4 5a=1; 6while a==1 7 8 % 入力待機(回転させたい角度を入力) 9 deg = input("回転角度"); 10 % eが入力されたら終了 11 if deg == 0 12 arduinocom.close() 13 break; 14 end 15 16 % 回転角と終端文字を送信 17 arduinocom.write(deg,"uint8") 18 19end
エラーは出ていないのですがサーボが動いてくれません...どなたかアドバイスなど頂けると嬉しいです。
参考URL
シリアル通信
あなたの回答
tips
プレビュー