How to add arudino libraries to matlab

3 ビュー (過去 30 日間)
文宏
文宏 2022 年 10 月 8 日
コメント済み: Image Analyst 2022 年 10 月 9 日
a = arduino();
s = servo(a,'D6');
lib = listArduinoLibraries()
Hello!
Now I have [Matlab support package for arduino hardware 21.2.1]
It is installed and there are 11 libraries as shown in the picture above.
I want to use MATLAB to control the angle of the servo motor. Therefore, I want to put "VarSpeedServo.h" into Matlab, but I don't know how to include it.
What I was able to do
1.Angular speed control using "VarSpeedServo.h" with arduino software only (without using MATLAB)
2. Checked simple operation using [Servo] in MATLAB.
Operation confirmed
clear a s
a = arduino('com5', 'Uno', 'Libraries', 'Servo');
s = servo(a, 'D6');
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);
If anyone can help me understand, I'd appreciate it if you could let me know.
I'm glad it's simple grammar!

採用された回答

Image Analyst
Image Analyst 2022 年 10 月 8 日
It's hard without us having your servo hardware, but why can't you make the arduino code "VarSpeedServo.h" into a MATLAB function and then call it from your main script (which is something like in your step 2)?
  2 件のコメント
文宏
文宏 2022 年 10 月 9 日
Thanks for the answer!
I have not much experience with arduino language to MATLAB language.
I can't convert it alone, especially since the functions in this library are all variables and such that I've never seen before. (Different ways of defining and writing...)
If you can help me figure it out, I'd love to know!
Perhaps this is the place, right?
Perhaps you mean that I just need to convert this place to MATLAB?
#ifndef VarSpeedServo_h
#define VarSpeedServo_h
#include <inttypes.h>
/*
* Defines for 16 bit timers used with Servo library
*
* If _useTimerX is defined then TimerX is a 16 bit timer on the curent board
* timer16_Sequence_t enumerates the sequence that the timers should be allocated
* _Nbr_16timers indicates how many 16 bit timers are available.
*
*/
// Say which 16 bit timers can be used and in what order
#if defined(__AVR_ATmega1280__) || defined(__AVR_ATmega2560__)
#define _useTimer5
#define _useTimer1
#define _useTimer3
#define _useTimer4
typedef enum { _timer5, _timer1, _timer3, _timer4, _Nbr_16timers } timer16_Sequence_t ;
#elif defined(__AVR_ATmega32U4__)
#define _useTimer3
#define _useTimer1
typedef enum { _timer3, _timer1, _Nbr_16timers } timer16_Sequence_t ;
#elif defined(__AVR_AT90USB646__) || defined(__AVR_AT90USB1286__)
#define _useTimer3
#define _useTimer1
typedef enum { _timer3, _timer1, _Nbr_16timers } timer16_Sequence_t ;
#elif defined(__AVR_ATmega128__) ||defined(__AVR_ATmega1281__)||defined(__AVR_ATmega2561__)
#define _useTimer3
#define _useTimer1
typedef enum { _timer3, _timer1, _Nbr_16timers } timer16_Sequence_t ;
#else // everything else
#define _useTimer1
typedef enum { _timer1, _Nbr_16timers } timer16_Sequence_t ;
#endif
#define VarSpeedServo_VERSION 2 // software version of this library
#define MIN_PULSE_WIDTH 544 // the shortest pulse sent to a servo
#define MAX_PULSE_WIDTH 2400 // the longest pulse sent to a servo
#define DEFAULT_PULSE_WIDTH 1500 // default pulse width when servo is attached
#define REFRESH_INTERVAL 20000 // minimum time to refresh servos in microseconds
#define SERVOS_PER_TIMER 12 // the maximum number of servos controlled by one timer
#define MAX_SERVOS (_Nbr_16timers * SERVOS_PER_TIMER)
#define INVALID_SERVO 255 // flag indicating an invalid servo index
#define CURRENT_SEQUENCE_STOP 255 // used to indicate the current sequence is not used and sequence should stop
typedef struct {
uint8_t nbr :6 ; // a pin number from 0 to 63
uint8_t isActive :1 ; // true if this channel is enabled, pin not pulsed if false
} ServoPin_t ;
typedef struct {
ServoPin_t Pin;
unsigned int ticks;
unsigned int value; // Extension for external wait (Gill)
unsigned int target; // Extension for slowmove
uint8_t speed; // Extension for slowmove
} servo_t;
typedef struct {
uint8_t position;
uint8_t speed;
} servoSequencePoint;
class VarSpeedServo
{
public:
VarSpeedServo();
uint8_t attach(int pin); // attach the given pin to the next free channel, sets pinMode, returns channel number or 0 if failure
uint8_t attach(int pin, int min, int max); // as above but also sets min and max values for writes.
void detach();
void write(int value); // if value is < 544 its treated as an angle, otherwise as pulse width in microseconds
void write(int value, uint8_t speed); // Move to given position at reduced speed.
// speed=0 is identical to write, speed=1 slowest and speed=255 fastest.
// On the RC-Servos tested, speeds differences above 127 can't be noticed,
// because of the mechanical limits of the servo.
void write(int value, uint8_t speed, bool wait); // wait parameter causes call to block until move completes
void writeMicroseconds(int value); // Write pulse width in microseconds
void slowmove(int value, uint8_t speed);
void stop(); // stop the servo where it is
int read(); // returns current pulse width as an angle between 0 and 180 degrees
int readMicroseconds(); // returns current pulse width in microseconds for this servo (was read_us() in first release)
bool attached(); // return true if this servo is attached, otherwise false
uint8_t sequencePlay(servoSequencePoint sequenceIn[], uint8_t numPositions, bool loop, uint8_t startPos);
uint8_t sequencePlay(servoSequencePoint sequenceIn[], uint8_t numPositions); // play a looping sequence starting at position 0
void sequenceStop(); // stop movement
void wait(); // wait for movement to finish
bool isMoving(); // return true if servo is still moving
private:
uint8_t servoIndex; // index into the channel data for this servo
int8_t min; // minimum is this value times 4 added to MIN_PULSE_WIDTH
int8_t max; // maximum is this value times 4 added to MAX_PULSE_WIDTH
servoSequencePoint * curSequence; // for sequences
uint8_t curSeqPosition; // for sequences
};
#endif
Image Analyst
Image Analyst 2022 年 10 月 9 日
Yeah sorry but my only experience with arduino and MATLAB was a very limited amount many years ago. Call tech support.

サインインしてコメントする。

その他の回答 (0 件)

カテゴリ

Help Center および File ExchangeArduino Hardware についてさらに検索

製品


リリース

R2021b

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!

Translated by