本帖最后由 liuxing4585 于 2016-6-16 22:31 编辑
上一篇中,刚子根据网上的例程,调用Servo.h实现了舵机的旋转和角度控制,根据接口板上的标示,使用的是D10做信号线,这次实验想学习一下电机的旋转控制。
最初的想法是在上一期舵机程序上增加,看到接口板上的接口是D6 D9 D3 D5四个引脚来控制电机驱动芯片:L9110S,先来点资料,看看怎么控制。
根据Arduino的资料,可知道D3 D5 D6 D9均为PWM输出口,可以实现电机调速,因此编写了一下程序,想实现电机正转3秒-停1秒-反转3秒-停1秒,不断循环。代码如下:
- #include
- Servo myservo; //创建一个舵机控制对象
- // 使用Servo类最多可以控制8个舵机
- int pos = 0; // 该变量用与存储舵机角度位置
- void setup()
- {
- myservo.attach(10); // 该舵机由arduino第10脚控制
- for(pos = 98; pos < 180; pos += 1) // 从0度到180度运动
- { // 每次步进一度
- myservo.write(pos); // 指定舵机转向的角度
- delay(15); // 等待15ms让舵机到达指定位置
- }
- for(pos = 180; pos>=1; pos-=1) //从180度到0度运动
- {
- myservo.write(pos); // 指定舵机转向的角度
- delay(15); // 等待15ms让舵机到达指定位置
- }
- for(pos = 0; pos < 98; pos += 1) // 从0度到180度运动
- { // 每次步进一度
- myservo.write(pos); // 指定舵机转向的角度
- delay(15); // 等待15ms让舵机到达指定位置
- }
- pinMode( 3, OUTPUT);
- pinMode( 6, OUTPUT);
- pinMode( 5, OUTPUT);
- pinMode( 9, OUTPUT);
- }
-
- void loop()
- {
- analogWrite(3 , 0);
- analogWrite(5 , 200);
- analogWrite(6 , 200);
- analogWrite(9 , 0);
- delay( 3000 );
- analogWrite(3 , 0);
- analogWrite(5 , 0);
- analogWrite(6 , 0);
- analogWrite(9 , 0);
- delay( 500 );
- analogWrite(3 , 200);
- analogWrite(5 , 0);
- analogWrite(6 , 0);
- analogWrite(9 , 200);
- delay( 3000 );
- analogWrite(3 , 0);
- analogWrite(5 , 0);
- analogWrite(6 , 0);
- analogWrite(9 , 0);
- delay( 500 );
- }
复制代码
可是电机转起来却不太正常,D9所控制的电机只能单方向旋转,刚开始以为是电机驱动模块有问题,于是将D9接LED指示灯,发现LED闪烁也不正常,观察控制引脚输出指示灯,发现输出不正常。因此确定是D9引脚的问题。
将舵机代码注释掉,发现旋转正常了。原来是Servo类搞的鬼,它把D9 D10都控制了。
回头仔细看Servo的说明,
1.servo类成员函数 | | | | | 用于设定舵机旋转角度的语句,可设定的角度范围是0°到180°。 | | | | 用于读取舵机角度的语句,可理解为读取最后一条write()命令中的值。 | | | | 使舵机与其接口分离,该接口(9或10)可继续被用作PWM接口。 |
原来是没使用detach()进行接口分离,加进程序试一下。
myservo.detach();//释放供电机PWM使用
发现没有作用。。。
- #include
- Servo myservo; //创建一个舵机控制对象
- // 使用Servo类最多可以控制8个舵机
- int pos = 0; // 该变量用与存储舵机角度位置
- void setup()
- {
- myservo.attach(10); // 该舵机由arduino第10脚控制
-
- for(pos = 98; pos < 180; pos += 1) // 从0度到180度运动
- { // 每次步进一度
- myservo.write(pos); // 指定舵机转向的角度
- delay(15); // 等待15ms让舵机到达指定位置
- }
- for(pos = 180; pos>=1; pos-=1) //从180度到0度运动
- {
- myservo.write(pos); // 指定舵机转向的角度
- delay(15); // 等待15ms让舵机到达指定位置
- }
- for(pos = 0; pos < 98; pos += 1) // 从0度到180度运动
- { // 每次步进一度
- myservo.write(pos); // 指定舵机转向的角度
- delay(15); // 等待15ms让舵机到达指定位置
- }
- myservo.detach();//释放9脚供电机使用
- pinMode( 3, OUTPUT);
- pinMode( 6, OUTPUT);
- pinMode( 5, OUTPUT);
- pinMode( 9, OUTPUT);
- }
-
- void loop()
- {
- analogWrite(3 , 0);
- analogWrite(5 , 200);
- analogWrite(6 , 200);
- analogWrite(9 , 0);
- delay( 3000 );
- analogWrite(3 , 0);
- analogWrite(5 , 0);
- analogWrite(6 , 0);
- analogWrite(9 , 0);
- delay( 500 );
- analogWrite(3 , 200);
- analogWrite(5 , 0);
- analogWrite(6 , 0);
- analogWrite(9 , 200);
- delay( 3000 );
- analogWrite(3 , 0);
- analogWrite(5 , 0);
- analogWrite(6 , 0);
- analogWrite(9 , 0);
- delay( 500 );
- }
复制代码
完全注释掉舵机程序,电机能够正常动作了。看来还得重新研究舵机控制方式了。使用从网络上找到的例程试一下,
- #include
- Servo myservo; //创建一个舵机控制对象
- // 使用Servo类最多可以控制8个舵机
- int pos = 0; // 该变量用与存储舵机角度位置
- int sp1=10;//定义舵机接口数字接口7
- int pulsewidth;//定义脉宽变量
- int val;
- int val1;
- int myangle1;
- void servopulse(int sp1,int val1)//定义一个脉冲函数
- {
- myangle1=map(val1,0,180,500,2480);
- digitalWrite(sp1,HIGH);//将舵机接口电平至高
- delayMicroseconds(myangle1);//延时脉宽值的微秒数
- digitalWrite(sp1,LOW);//将舵机接口电平至低
- delay(20-val1/1000);
- }
- void setup()
- {
- pinMode( 3, OUTPUT);
- pinMode( 6, OUTPUT);
- pinMode( 5, OUTPUT);
- pinMode( 9, OUTPUT);
- pinMode(10,OUTPUT);//设定舵机接口为输出接口
-
-
- }
-
- void loop()
- {
- analogWrite(3 , 0);
- analogWrite(5 , 200);
- analogWrite(6 , 200);
- analogWrite(9 , 0);
- delay( 3000 );
- analogWrite(3 , 0);
- analogWrite(5 , 0);
- analogWrite(6 , 0);
- analogWrite(9 , 0);
- delay( 500 );
- analogWrite(3 , 200);
- analogWrite(5 , 0);
- analogWrite(6 , 0);
- analogWrite(9 , 200);
- delay( 3000 );
- analogWrite(3 , 0);
- analogWrite(5 , 0);
- analogWrite(6 , 0);
- analogWrite(9 , 0);
- delay( 500 );
- for(pos = 98; pos < 180; pos += 1) // 从0度到180度运动
- { // 每次步进一度
- servopulse(sp1,pos); // 指定舵机转向的角度
- delay(15); // 等待15ms让舵机到达指定位置
- }
- for(pos = 180; pos>=1; pos-=1) //从180度到0度运动
- {
-
- servopulse(sp1,pos); // 指定舵机转向的角度
- delay(15); // 等待15ms让舵机到达指定位置
- }
- for(pos = 0; pos < 98; pos += 1) // 从0度到180度运动
- { // 每次步进一度
- servopulse(sp1,pos); // 指定舵机转向的角度
- delay(15); // 等待15ms让舵机到达指定位置
- }
- }
复制代码
|