|
|
发表于 2016-7-20 17:11:10
|
显示全部楼层
本帖最后由 wolfcolorful 于 2016-7-20 17:15 编辑
学习了!
做了一点改变。
代码如下:
- #include <Servo.h>
- Servo myservo; //创建一个舵机控制对象, 使用Servo类最多可以控制8个舵机
- int pos = 0; // 该变量用与存储舵机角度位置
- int chePos; // 设置正反转检测,1为反转,0为正转
- int analogINT = 1; // 按键检测口
- int i; // 按键检测参数
- int x=180; //全局角度
- void setup()
- {
- pinMode(9,OUTPUT); //舵机控制线为输出口
- pinMode(7,OUTPUT); // 红色LED电源端为输出口
- pinMode(6,OUTPUT); // 绿色LED电源端为输出口
- myservo.attach(9); // 该舵机由arduino第九脚控制
- }
- void Clockwise(void) //正转程序
- {
- chePos=0;
- //pos=x;
- for(pos; pos < 180; pos++) // 从0度到180度运动
- { // 每次步进一度
- i=analogRead(analogINT);
- myservo.write(pos); // 指定舵机转向的角度
- delay(15); // 等待15ms让舵机到达指定位置
- x=pos;
- if (i<1000) return; //检测按键是否按下,如果没有按下则跳出循环
- }
- if (x>=170) chePos=1; //检测舵机角度,超过170度,设定为反转
- }
- void Anti_clockwisefan(void) //反转程序
- {
- chePos=1;
- pos=x;
- for(pos ; pos >= 2; pos--) // 从180度到0度运动,每次步进一度
- {
- i=analogRead(analogINT);
- myservo.write(pos); // 指定舵机转向的角度
- delay(15); // 等待15ms让舵机到达指定位置
- x=pos;
- if (i<1000) return; //检测按键是否按下,如果没有按下则跳出循环
- }
- if (x<=3) chePos=0; //检测舵机角度,低于3度,设定为正转
- }
- void loop()
- {
- while(1) //循环,条件永远为真
- {
- i=analogRead(analogINT); //i为模拟1口电压
- if (i>1000) //如果i>1000,判断按键按下
- {
- if (chePos==0) //如果chePos为0,运行正转程序
- {
- digitalWrite(7,HIGH); //数字7口高电平,点亮LED
- digitalWrite(6,LOW); //数字6口低电平,熄灭LED
- Clockwise(); //运行正转程序
- }
- else
- {
- digitalWrite(6,HIGH); //数字6口高电平,点亮LED
- digitalWrite(7,LOW); //数字7口低电平,熄灭LED
- Anti_clockwisefan(); //运行反转程序
- }
- }
- else
- {
- digitalWrite(7,LOW);
- digitalWrite(6,LOW);
- digitalWrite(9,LOW);
- }
- }
- }
复制代码
不过还是有个缺陷:程序初始化的时候舵机一定会归零后再开始转动。也就是说,如果在任意角度位置放开按键,重新下载程序到板上,此时舵机将快速回零(零位是相对的,视程序中取消哪一个pos=x),再旋转、限位后反向旋转。
暂时还不知道是什么原因,研究中…… |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有帐号?注册
x
|