Arduino超声波智能避障小车+舵机 完整代码 |
您所在的位置:网站首页 › 智能车超声波避障原理是什么呢 › Arduino超声波智能避障小车+舵机 完整代码 |
//============================================================================= //arduino超声波智能避障小车源码(含舵机) // 本实验控制速度的pwm值和延时均有调节,自己视实际情况调节。 //============================================================================= #include //申明1602液晶的函数库 //申明1602液晶的引脚所连接的Arduino数字端口,8线或4线数据模式,任选其一 LiquidCrystal lcd(11,2,3,4,7,8); //4数据口模式连线声明, //LCD的接口:各个引脚连接的I/O口编号,格式为 // LiquidCrystal(rs, enable, d4, d5, d6, d7) // LiquidCrystal(rs, rw, enable, d4, d5, d6, d7) // LiquidCrystal(rs, enable, d0, d1, d2, d3, d4, d5, d6, d7) // LiquidCrystal(rs, rw, enable, d0, d1, d2, d3, d4, d5, d6, d7)
int Echo = A0; // Echo回声脚(P2.0) int Trig =A1; // Trig 触发脚(P2.1) int F_Distance = 0; int L_Distance = 0; int R_Distance = 0; int L_motor_back=5; //左电机后退(IN1) int L_motor_go=6; //左电机前进(IN2) int R_motor_go=9; // 右电机前进(IN3) int R_motor_back=10; // 右电机后退(IN4) int servopin=12;//设置舵机驱动脚到数字口12 int angle;//定义角度变量 int pulsewidth;//定义脉宽变量 int val; void setup() { Serial.begin(9600); // 初始化串口 //初始化电机驱动IO为输出方式 pinMode(L_motor_go,OUTPUT); // PIN 5 (PWM) pinMode(L_motor_back,OUTPUT); // PIN 6 (PWM) pinMode(R_motor_go,OUTPUT);// PIN 9 (PWM) pinMode(R_motor_back,OUTPUT);// PIN 10 (PWM) //初始化超声波引脚 pinMode(Echo, INPUT); // 定义超声波输入脚 pinMode(Trig, OUTPUT); // 定义超声波输出脚 lcd.begin(16,2); //初始化1602液晶工作 模式 //定义1602液晶显示范围为2行16列字符 pinMode(servopin,OUTPUT);//设定舵机接口为输出接口 } //=======================智能小车的基本动作========================= void run() // 前进 { analogWrite(R_motor_go,200);//右电机前进,PWM比例0~255调速,左右轮差异略增减 analogWrite(R_motor_back,0); analogWrite(L_motor_go,200);// 左电机前进,PWM比例0~255调速,左右轮差异略增减 analogWrite(L_motor_back,0); } void brake() //刹车,停车 { digitalWrite(R_motor_go,LOW); digitalWrite(R_motor_back,LOW); digitalWrite(L_motor_go,LOW); digitalWrite(L_motor_back,LOW); } void left() //左转(左轮不动,右轮前进) { analogWrite(R_motor_go,200); //右电机前进,PWM比例0~255调速 analogWrite(R_motor_back,0); digitalWrite(L_motor_go,LOW); //左轮不动 digitalWrite(L_motor_back,LOW); } void spin_left() //左转(左轮后退,右轮前进) { analogWrite(R_motor_go,200); //右电机前进,PWM比例0~255调速 analogWrite(R_motor_back,0); analogWrite(L_motor_go,0); analogWrite(L_motor_back,200);//左轮后退PWM比例0~255调速 } void right() //右转(右轮不动,左轮前进) { digitalWrite(R_motor_go,LOW); //右电机不动 digitalWrite(R_motor_back,LOW); analogWrite(L_motor_go,200); analogWrite(L_motor_back,0);//左电机前进,PWM比例0~255调速 } void spin_right() //右转(右轮后退,左轮前进) { analogWrite(R_motor_go,0); analogWrite(R_motor_back,200);//右电机后退,PWM比例0~255调速 analogWrite(L_motor_go,200); //左电机前进,PWM比例0~255调速 analogWrite(L_motor_back,0); } void back() //后退 { analogWrite(R_motor_go,0); analogWrite(R_motor_back,150);//右轮后退,PWM比例0~255调速 analogWrite(L_motor_go,0); analogWrite(L_motor_back,150);//左轮后退,PWM比例0~255调速 } //========================================================== float Distance_test() // 量出前方距离 { digitalWrite(Trig, LOW); // 给触发脚低电平2μs delayMicroseconds(2); digitalWrite(Trig, HIGH); // 给触发脚高电平10μs,这里至少是10μs delayMicroseconds(10); digitalWrite(Trig, LOW); // 持续给触发脚低电 float Fdistance = pulseIn(Echo, HIGH); // 读取高电平时间(单位:微秒) Fdistance= Fdistance/58; //为什么除以58等于厘米, Y米=(X秒*344)/2 // X秒=( 2*Y米)/344 ==》X秒=0.0058*Y米 ==》厘米=微秒/58 //Serial.print("Distance:"); //输出距离(单位:厘米) //Serial.println(Fdistance); //显示距离 //Distance = Fdistance; return Fdistance; } void Distance_display(int Distance)//显示距离 { if((2 |
今日新闻 |
推荐新闻 |
CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3 |