进阶之路(中级篇) - 017 有关于Arduino 驱动舵机及相关问题

 1 /*********************************
 2 代码功能:通过串口控制电机
 3 使用函数:
 4     Serial.available();                          //判断串口是否接收到数据
 5     Serial.print(字符串);                       //通过TX传出去
 6     Serial.write(字符串);                       //写入串口中
 7     Serial.println(字符串);                      //通过TX传出去,并在尾端加换行
 8     strtol(字符串启始指针,字符串结束指针,字符转换长度);  //字符串转整形
 9     constrain(数据,区间上界,区间下界);               //约束数据范围函数
10     strtok(将要分解字符串首地址,"分割字符");         //字符分割函数(s指向要分解的字符串,之后再次调用要把s设成NULL。)
11 调用的库:#include <Servo.h>                //设置舵机的库:详情见:https://www.arduino.cc/en/Reference/Servo
12     (电机名称).attach(控制电机引脚);          //初始化电机
13     (电机名称).write(角度);                    //写入旋转角度
14     (电机名称).writeMicroseconds(中间参数);    //设置电机的转动方向值,详情见:http://www.cnblogs.com/jikexianfeng/p/6269629.html
15     (电机名称).read();                        //用于读取舵机角度的语句,可理解为读取最后一条write()命令中的值。返回值为伺服的角度,从0到180度。
16     (电机名称).attached();                    //检查伺服变量是否连接到引脚。如果伺服器连接到引脚,则为真; 否则为假。
17     (电机名称).detach();                     //从其引脚分离伺服变量。如果所有伺服变量都分离,则引脚9和10可以用于使用analogWrite()进行PWM输出。
18 创作时间:2016*01*10
19 作者邮箱:jikexianfeng@outlook.com
20 ********************************/
21 #include <Servo.h>
22 
23 char buffer[10];
24 Servo servo1;
25 Servo servo2;
26 int L = 2;
27 int R = 3;
28 
29 void setup()
30 {
31     servo1.attach(L);
32     servo2.attach(R);
33     Serial.begin(9600);
34     Serial.flush();
35     servo1.write(90);
36     servo2.write(90);
37     Serial.println("STARTINC....");
38 }
39 void loop()
40 {
41     if(0<Serial.available()){
42         int index = 0;
43         delay(100);
44         int numChar = Serial.available();
45         if(numChar > 10){
46             numChar = 10;
47         }
48         while(numChar--){
49             buffer[index++] = Serial.read();
50         }
51         splitString(buffer);
52     }
53 }
54 
55 void splitString(char *data){
56     Serial.print("Data entered:");
57     Serial.println(data);
58     char *parameter;
59     parameter = strtok(data,",");        //首次调用时,s指向要分解的字符串,之后再次调用要把s设成NULL
60     while(NULL != parameter){
61         setServo(parameter);
62         parameter = strtok(NULL,",");    //首次调用时,s指向要分解的字符串,之后再次调用要把s设成NULL
63     }
64     for(int x =0;x<9;x++){
65         buffer[x] = '\0';
66     }
67     Serial.flush();
68 }
69 
70 void setServo(char *data){
71     if((data[0] == 'R')||(data[0] == 'r')){
72         int firstVal = strtol(data+1,NULL,10);
73         firstVal = constrain(firstVal,0,180);
74         servo2.write(firstVal);
75         Serial.print("Servo2 is set to:");
76         Serial.println(firstVal);    
77     }
78     if((data[0] == 'L')||(data[0] == 'l'))
79     {
80         int firstVal = strtol(data+1,NULL,10);
81         firstVal = constrain(firstVal,0,180);
82         servo1.write(firstVal);
83         Serial.print("Servo1 is set to:");
84         Serial.println(firstVal);    
85     }
86 }

 

 参考博客:http://www.cnblogs.com/jikexianfeng/p/6269629.html

 参考网站:https://www.arduino.cc/en/Reference/Servo

posted @ 2017-05-08 16:37  极客先锋  阅读(664)  评论(0编辑  收藏  举报