|
本人小白一个,年纪不小,专业机械类,工作做产品结构设计,负责公司产品开发,主要是小家电类的,低端制造业;前段时间突然对单片机有点兴趣,找了简单的ARDUINO入手,买了一堆配件,主板,驱动板,以及一些元件,万能板之类的;废话少说,在学习过程中,自己摸索舵机的控制,用串口输入控制到用电位器控制舵机转动角度,用电位器控制角度时,模拟舵机在两个端点有抖动,估计是器件的误差导致的,数字舵机不会有问题;另外,在尝试给舵机加载时,数字舵机要好很多,位置定位准确,无抖动,模拟舵机即使用大扭力的,在一定负载时,都会出现比较严重的抖动;抖动估计都是舵机在调整姿态来适应预设的位置;从串口监视器可以看到,模拟舵机的角度在接近0度和180度两个极限时,舵机表现出抖动;所以数字舵机贵的还是有道理的;测试多个双轴数字舵机 单轴舵机以及单轴模拟舵机,包括MG996 MG90S等大小不等舵机;程序内容如下:
int servopin=7;//定义数字接口7
int myangle;//定义角度变量
int pulsewidth;//定义脉宽变量
int val;// 暂存来自传感器的变量数值
const int aInPin=A0;// 定义电位器的输入端
void servopulse(int servopin,int myangle)//定义一个脉冲函数
{
pulsewidth=(myangle*11)+500;//将角度转化为500-2480 的脉宽值
digitalWrite(servopin,HIGH);//将舵机接口电平至高
delayMicroseconds(pulsewidth);//延时脉宽值的微秒数
digitalWrite(servopin,LOW);//将舵机接口电平置低
delay(20-pulsewidth/1000);
}
void setup()
{
pinMode(servopin,OUTPUT);//设定舵机接口为输出接口
Serial.begin(9600);//连接到串行端口,波特率为9600
Serial.println("servo=o_seral_simple ready" ) ;
}
void loop()//
{
val=analogRead(aInPin); //读取A0端电位器模拟量转为数字量
val=map(val,0,1023,0,180);//将电位器的数字量转化成角度的量
Serial.println(val);
if(val>'0'&&val<='180');
{
Serial.print("moving servo to ");
Serial.print(val,DEC);
Serial.println();
for(int i=0;i<=50;i++) //给予舵机足够的时间让它转到指定角度
{
servopulse(servopin,val);//引用脉冲函数
}
}
}
照片如下,扩展板自己用万能板焊的,舵机供电是用单独的2596供电,电位器用的是普通的2K可调。
控制照片
|
|