通过串口传值给Arduino,再通过Arduino控制小车(直流电机)移动与二自由度云台转动角度
2017-05-31 21:57
525 查看
## 首先,先附上代码 ##
![](https://oscdn.geek-share.com/Uploads/Images/Content/201705/1d44baa8a228eeb698455ef6067da730)
![](https://oscdn.geek-share.com/Uploads/Images/Content/201705/5e55b196c7e3587a0abe8b90eb6bcb80)
![](https://oscdn.geek-share.com/Uploads/Images/Content/201705/0a50e979221b26c281ecddcf89a8e23d)
也可以使用各种串口通信的方式,通过其他东西(如:树莓派)传值给Arduino的串口来控制他的直流电机与云台。
#include<Servo.h> Servo up,down; String comdata=""; //用于接收串口数据 int numdata[2]={0,0}; //numdata数组用于存储串口传来的角度 int mark=0; //标志位,1表示有数据进来 //使用数字端口4,5,6,7控制电机(4,5为一组;6,7为一组) int IN1=4; int IN2=5; int IN3=6; int IN4=7; void sport(int direction,int del){ int i=0; if(direction=='f'){ //串口输入一个‘f’前进一次 while(i<del){ //运行次数受del控制 digitalWrite(IN1,HIGH); digitalWrite(IN2,LOW); digitalWrite(IN3,HIGH); digitalWrite(IN4,LOW); i++; } Serial.println("前进..."); stopp(); } else if(direction=='b'){ //串口输入一个‘b’后退一次 while(i<del){ digitalWrite(IN1,LOW); digitalWrite(IN2,HIGH); digitalWrite(IN3,LOW); digitalWrite(IN4,HIGH); i++; } Serial.println("后退..."); stopp(); } else if(direction=='l'){ //串口输入一个‘l’左转一次 while(i<del){ digitalWrite(IN1,LOW); digitalWrite(IN2,HIGH); digitalWrite(IN3,HIGH); digitalWrite(IN4,LOW); i++; } Serial.println("左转..."); stopp(); } else if(direction=='r'){ //串口输入一个‘r’右转一次 while(i<del){ digitalWrite(IN1,HIGH); digitalWrite(IN2,LOW); digitalWrite(IN3,LOW); digitalWrite(IN4,HIGH); i++; } Serial.println("右转..."); stopp(); } } void stopp(){ //停止 digitalWrite(IN1,LOW); digitalWrite(IN2,LOW); digitalWrite(IN3,LOW); digitalWrite(IN4,LOW); } void setup() //初始化 { for (int i=4;i<=7;i++) { pinMode(i,OUTPUT); //设置数字端口4,5,6,7为输出模式 digitalWrite(i,HIGH); //设置数字端口4,5,6,7为HIGH,电机保持不动 } up.attach(10,1000,2000); //上面的舵机附加到引脚10 down.attach(9,1000,2000); //下面的舵机附加到引脚9 up.write(60); //上面的舵机初始角度为60° (个人项目需要) down.write(30); //下面的舵机初始角度为30° Serial.begin(9600); } void loop() { int j = 0; while(Serial.available() > 0) //当Serial.available()>0时,说明串口接收到了数据,可以读取。 { char flag=Serial.read(); //如果串口传值进来为‘f,b,l,r’则执行sport函数(控制小车移动) if(flag=='f'||flag=='b'||flag=='l'||flag=='r') { sport(flag,5000); } //否则就控制云台转动 else { comdata += flag; delay(2); mark=1; //标志位置1,标明有值传入 } } if(mark==1) //当标志位为1时,才执行 { numdata[0]=0; //此时numdata数组应该置0,重新赋予传来的值 numdata[1]=0; Serial.println(comdata); for(int i=0;i<comdata.length();i++) { //逐个分析comdata[i]字符串的文字,如果碰到文字是分隔符(这里选择逗号分割)则将comdata数组下标下移一位 //即比如: 120,60 开始的120记到numdata[0];碰到逗号j等于1了 //如果没有逗号的话,就将读到的数字*10加上以前读入的数字 //并且(comdata[i] - '0')就是将字符'0'的ASCII码转换成数字0 //因此可以将字符串变成数字存储起来 if(comdata[i]==',') { j++; } else { numdata[j] += numdata[j]*10 + (comdata[i]-'0'); } } up.write(numdata[0]); //上舵机转到numdata[0]所记录的角度 down.write(numdata[1]); //下舵机转到numdata[1]所记录的角度 comdata=String(""); //comdata的字符串已经全部转换到numdata了,清空comdata以便下一次使用 mark=0; //将标志位mark置0,不 9405 置0下次循环就会在运行 if(mark==1)....的程序段。 } }
自己搭的Arduino小车
二自由度云台
直流电机驱动小车
上诉代码后面都有详细的解释了,就不再重复解释了。
然后,你可以通过串口监视器输入‘f’控制小车前进一段距离,同理输入‘b’控制小车后退一段距离。输入‘60,30’控制二自由度云台转动到(60°,30°)。注意‘,’为英文下的逗号。也可以使用各种串口通信的方式,通过其他东西(如:树莓派)传值给Arduino的串口来控制他的直流电机与云台。
相关文章推荐
- 通过Arduino控制二自由度云台
- Arduino通过串口控制舵机角度实验
- Arduino学习笔记(四)Matlab串口控制Arduino转动电机
- C#与Arduino通过串口通信来控制LED灯的状态
- Arduino 通过串口字符串控制LED开关
- 基于ROS平台的移动机器人-4-通过ROS利用键盘控制小车移动
- 通过android传感器控制ROV云台转动
- Arduino通过L298N红板控制板控制直流电机
- Arduino控制直流电机
- 配置实现通过串口(com 口、RS232 接口)终端控制 Linux 系统
- Cocos2d-x 通过虚拟按键控制人物移动
- 通过键盘控制盒子的移动与缩放
- 自制摄像头云台,并通过计算机LPT并口直接控制(一)
- Android蓝牙控制arduino机器人自走小车
- 通过键盘控制物体移动
- Arduino编程->步进电机角度控制
- Arduino控制风扇转动
- 通过Arduino编译器查看串口数据~~~~
- 终于完成了第一个arduino控制的小车
- 安卓通过USB控制Arduino