主要内容

引导两轮机器人

这个例子展示了如何使用MATLAB®Arduino®硬件支持包来控制一个基于Ardu金宝appino的两轮机器人的闭环控制。

硬件需求

  • Arduino由于董事会

  • MinSegShield™工具M2V3.2

  • 9 v电池

硬件设置

组装硬件:

  • 将MinsegShield M2V3.2连接到Arduino抵达。

  • 将电池组的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] availableserialportid: [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'通道:'D15'PulsesperRevolution:180
encoder2 = rotaryEncoder (a channelA2 channelB2,180)
encoder2 = RotaryEncoder与属性: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

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

rpm = 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电池组供电,使电机正常旋转。

Tic;尽管toc < executionTime rpms = readSpeed([encoder1,encoder2]);diff = rpms-targetSpeed;newpwmvoltage =初始pwmvoltage - 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对象。

清除Encoder1.Encoder2.一个