舵机在人工智能领域使用相当广泛,尤其是涉及到各种精确运动转向的控制中几乎都有它的身影。在我们的雷达扫描案例中就必须使用到舵机(当然,伺服电机也是可以的,步进电机由于没有角度位置传感器一般不使用在这种精确角度控制的场合)。
不论是伺服电机还是舵机,都是有角度传感器的,舵机中比伺服电机中多了一个减速齿轮而已增加其扭矩,以便使用在负重运动的关节上,其余基本一样,也就是说使用上基本没有什么差别,他们都是靠脉冲宽度调制(PWM)来驱动的。
首先我们看看,我们能买到的最便宜的舵机是什么样子吧,这里我们用的是SG90(SG90有两种一种是SG90A一类是SG90D,分别是模拟和数字类型的,我这里使用模拟量的SG90A),转动角度为(090度或者0180)。如果要满足我们前面雷达扫描的360度的扫描可以购买360度的舵机(如MG945/946、995/996都可以,伺服电机也很好,就是贵了些)。
下图为SG90
下图为MG996/995/945/946
三根线:橙色为正极,棕色为负极,黄色为信号线
我们必须首先了解一下什么是PWM?
PWM是Pulse-width modulation的缩写,我们可以简单的翻译为脉冲宽度调制,或者脉冲宽度控制。那么这个东东是干什么用的呢,实际可以很简单的理解,就是通过将能量切片后得到的宽度占比来控制单位时间内输出能量的大小的方法。切片的宽度越小,输出的能量大小则越小,电机啊,灯泡等单位时间内得到的能量就越小,转速及亮度就越小,举个栗子,在电流不变的情况下,我们将输出的脉冲电压(如5V电压)切割为原来一半的宽度,并每间隔一个就拿掉它,那么就只剩下原来脉冲波的一半的宽度了,那么输出的总能量也就是以前的一半了,相当如2.5V。我们可以从下图来尝试理解:
了解了PWM后,我们就必须了解如何获得不同的脉冲宽度,尤其是在arduino中如何获得不同的脉冲宽度。
既然,我们已经知道,不同的脉冲宽度可以通过持续拉高或者拉低某个管脚的电平来实现,那么代码就很容易实现了。我们看看最简单的代码实现:
学会了如何使舵机工作起来后,接下来我们就要对它的精准度进行测试了。
我们知道,在arduino中或者是51单片机程序中使用舵机是需要先加载驱动类库的,如果没有这些类库,电机基本无法正常驱动的。当然,即使有驱动库,有很多时候舵机也可能不会按照我们设定的方式转动。
所以才有了我下面的这段自编写的舵机测试代码。
ardunio端代码如下:
int srvPin = 9; //数字接口9连接舵机信号线
int Angle;
int pWidth;
char val;
void setup(){
pinMode(srvPin,OUTPUT);
Serial.begin(9600);
Serial.println("--");
}
void loop()
{
turnAround(90);
}
//转动函数
void turnAround(int pin,float agl)
{
for(int i = 0;i<=18;i++)
{
angleChange(pin,agl);
delay(20);
}
}
//脉冲函数
void angleChange(int pin ,float angle)
{
//500高电平毫秒为0度
pWidth =500+map(angle,180,0,1800,0);//
digitalWrite(pin,HIGH); //舵机电平升高
delayMicroseconds(pWidth);//延时脉宽值的微妙数
digitalWrite(pin,LOW); //拉低电平
}
经过测试电机要旋转18次才能旋转到指定的角度。
1、对于板载电压的测试
还有一点,arduino uno的板子,很多时候供电达不到,舵机也不会转动,会导致串口通讯中断,不能通过指令来转动。而且在脱机转动的时候,arduino板上的指示灯会随着转动变暗。
2、脉冲宽度的测试
经过测试为13.9ms转动1度,与官方给出的2.5秒转动180度基本吻合。一旦脉冲宽度达到2500后超过300都按照2500来计算,或者叫做这300叫做冗余部分,超过2800后就开始这算了,自动折算为2800-2500,那么转动角度就是300/2500
3、转动角度测试
我对10个SG90进行了测试,没有一个会按照脉冲2500来转动180度,都会存在接近30度的多于角度,也就是每转动30度就会有5度的余量差。对于转动180度来说最终我们调整脉冲宽度为2100时基本转动角度符合要求了,但对于转动90度来说确有不足90了。
所以最终,我们决定将脉冲宽度的映射做一个变化处理,,这也就是angleChange函数中第一行使用map的原因。
我们通过测试,发现在0到20度内的角度无法给出转动动作。所以感觉这种舵机基本不能用于小角度的控制。当然,从大角度回转到小角度20度以内也会产生很大的误差,舵机会转动到0度附近。
每个舵机实际都需要调试,脉冲宽度为0的时候,电机也是为转动到某个角度的,而且转动到某个极限角度,在这个极限下,直到某个脉冲宽度下,都被视为0度,所以我们在调试舵机的时候必须给定一个0度参考脉冲宽度,也就是说,这个脉冲款都就是0度,在这个的基础上增加脉冲宽度是有转动动作发生的。
也就是说,我们给出了列入200的脉冲宽度,虽然舵机转动到了某个角度,但我们试图给它增加200的脉冲令其转动是不能成功的,它可能还在原地。也就是说,500内的脉冲区域其实都是舵机的转动死角区域,或者说非响应区,跟没有发指令一样,最多电机响动但不转动,而且进入死区后舵机可能在接收正常脉冲后还会一时难以恢复正常转动。
理论上2500毫秒是可以达到180度的转动,但实际也需要根据不同的舵机的位置传感器来确定,有的脉冲宽度2300就到了180度。这是我们必须引起注意的。
舵机的转速测试
舵机的转速慢,给定脉冲后它会朝着目标角度转去,位置传感器会告知电机是否到达了目标位置,如果没有到达那就继续转,一直到到达则不再转动。