主要内容

转向双轮机器人

本示例展示了如何使用MATLAB®Arduino®硬件支持包来控制基于Arduino金宝app的双轮机器人的闭环控制。

硬件需求

  • Arduino到期板

  • MinSegShield™Kit M2V3.2

  • 9V电池组

硬件设置

组装硬件:

  • 将MinSegShield M2V3.2连接到Arduino Due板。

  • 将电池组的Vcc连接到MinSegShield的2端子座上的VIN端口。

  • 将电池包的Gnd连接到MinSegShield的2端子排的Gnd接口上。

创建旋转编码器对象

创建一个arduino对象,并包括“RotaryEncoder”图书馆。

A = arduino(“COM5”“由于”“库”“RotaryEncoder”
更新服务器代码到期(COM5)。这可能需要几分钟。
a = arduino with properties: Port: 'COM5' Board: 'Due' AvailablePins: {'D2-D53', 'A0-A11'} AvailableDigitalPins: {'D2-D53', 'A0-A11'} AvailablePWMPins: {'D2-D13'} AvailableAnalogPins: {'A0-A11'} AvailableI2CBusIDs: [0, 1] AvailableSerialPortIDs: [1,2,3] Libraries: {'RotaryEncoder'}显示所有属性

为两个编码器创建旋转编码器对象,指定连接的输出通道A和通道B引脚。该套件附带的正交编码器的分辨率为每转180个脉冲。

channelA1 =“A8”;channelB1 =“D15”;channelA2 =“D18”;channelB2 =“D19”;encoder1 = rotaryEncoder(a,channelA1,channelB1,180)
encoder1 =旋转式编码器的属性:ChannelA: 'A8' ChannelB: 'D15' PulsesPerRevolution: 180
encoder2 = rotaryEncoder(a,channelA2,channelB2,180)
encoder2 =带有属性的rotyencoder: ChannelA: 'D18' ChannelB: 'D19' PulsesPerRevolution: 180

开启马达

每个电机由一个PWM引脚控制速度和一个数字引脚控制方向。要打开电机,将PWM电压设置为0以上,并将数字引脚输出设置为0或1,用于正向或反向。

motor1SpeedPin =“D2”;motor1DirectionPin =“D5”;motor2SpeedPin =“D6”;motor2DirectionPin =D8的

通过施加相同的PWM电压并设置相同的方向来启动旋转两个电机。

方向= 0;initialPWMVoltage = 1.5;writeDigitalPin (motor1DirectionPin,方向);writeDigitalPin (motor2DirectionPin,方向);writePWMVoltage (a、motor1SpeedPin initialPWMVoltage);writePWMVoltage (a、motor2SpeedPin initialPWMVoltage);%等待更改在硬件上生效暂停(3);

测量电机转速

要测量一个电机速度,传入相应的编码器对象。

rpm = readSpeed(encoder1);流('当前电机转速:%.2f\n'rpm);
当前电机转速为:-29.17

要同时测量两个电机的速度,可以传入两个编码器对象的数组。

rms = readSpeed([encoder1,encoder2]);流(当前电机转速为:%。2 f % .2f \ n 'rpm (1) rpm (2));
目前电机转速为:-25.00,-33.33

将机器人转向直线

一般来说,对每个轮子施加相同的功率不会导致两个电机以相同的速度旋转,因此机器人不会直线移动。为了使其直线行驶,采用了闭环控制算法,根据两个电机的实际速度差异来调整施加在它们上的功率。在这个例子中,比例控制器被用来帮助调整速度。下图解释了控制器逻辑。

定义控制器执行时间、目标速度、采样周期和比例增益参数。

executionTime = 5;targetSpeed = -50;周期= 0.1;Kp = 0.002;

实现闭环控制算法,读取两个电机转速,并根据差值调整一个电机转速。确保防护罩由9V电池组供电,以便电机正常旋转。

抽搐;toc < executionTime rpm = readSpeed([encoder1,encoder2]);diff = rpms-targetSpeed;newpwmvoltage = initialPWMVoltage - diff*Kp;writePWMVoltage (a motor1SpeedPin newPWMVoltages (1));writePWMVoltage (a motor2SpeedPin newPWMVoltages (2));暂停(时期);结束

通过不通过PWM引脚施加电源来停止电机。

writePWMVoltage (motor1SpeedPin 0);writePWMVoltage (motor2SpeedPin 0);

注意,控制器运行在软实时中,因为它在MATLAB中运行,而不是在Arduino硬件上运行。因此,控件的质量会受到同时在计算机上运行的任何其他任务的影响,例如反病毒活动。要获得硬实时控制,请使用金宝appSimulink Ard金宝appuino支持包

清理

当不再需要连接时,清除旋转编码器对象和arduino对象。

清晰的encoder1encoder2一个