资料51hei下载地址:
WIFI智能小车改键值.rar
(35.43 KB, 下载次数: 93)
- //============================智宇科技===========================、
- /*前进 按下发出 ONA 松开ONF
- 后退:按下发出 ONB 松开ONF
- 左转:按下发出 ONC 松开ONF
- 右转:按下发出 OND 松开ONF
- 停止:按下发出 ONE 松开ONF
-
- WIFI程序功能是按下对应的按键执行操,松开按键就停止
- */
- int sd = 115;
- int Left_motor=8; //左电机(IN3) 输出0 前进 输出1 后退
- int Left_motor_pwm=9; //左电机PWM调速
- int Right_motor_pwm=10; // 右电机PWM调速
- int Right_motor=11; // 右电机后退(IN1) 输出0 前进 输出1 后退
- int servopin7=7;//设置左右舵机驱动脚到数字口7
- int servopin12=12;//设置上下舵机驱动脚到数字口12
- int myangle;//定义角度变量
- int pulsewidth;//定义脉宽变量
- int val;
- char buffer[18]; //串口缓冲区的字符数组
- void setup() //设定串口和引脚模式
- {
- Serial.begin(9600);
- Serial.flush(); //清空串口缓存
- pinMode(Left_motor,OUTPUT); // PIN 8 8脚无PWM功能
- pinMode(Left_motor_pwm,OUTPUT); // PIN 9 (PWM)
- pinMode(Right_motor_pwm,OUTPUT);// PIN 10 (PWM)
- pinMode(Right_motor,OUTPUT);// PIN 11 (PWM)
- pinMode(servopin7,OUTPUT);//设定舵机接口为输出接口
- pinMode(servopin12,OUTPUT);//设定舵机接口为输出接口
- }
- void run(int sd) // 前进
- {
- digitalWrite(Right_motor,LOW); // 右电机前进
- digitalWrite(Right_motor_pwm,HIGH); // 右电机前进
- analogWrite(Right_motor_pwm,sd);//PWM比例0~255调速,左右轮差异略增减
-
-
- digitalWrite(Left_motor,LOW); // 左电机前进
- digitalWrite(Left_motor_pwm,HIGH); //左电机PWM
- analogWrite(Left_motor_pwm,sd);//PWM比例0~255调速,左右轮差异略增减
- //delay(time * 100); //执行时间,可以调整
- }
- void brake() //刹车,停车
- {
-
- digitalWrite(Right_motor_pwm,LOW); // 右电机PWM 调速输出0
- analogWrite(Right_motor_pwm,0);//PWM比例0~255调速,左右轮差异略增减
- digitalWrite(Left_motor_pwm,LOW); //左电机PWM 调速输出0
- analogWrite(Left_motor_pwm,0);//PWM比例0~255调速,左右轮差异略增减
- //delay(time * 100);//执行时间,可以调整
- }
- void left() //左转(左轮不动,右轮前进)
- {
- digitalWrite(Right_motor,LOW); // 右电机前进
- digitalWrite(Right_motor_pwm,HIGH); // 右电机前进
- analogWrite(Right_motor_pwm,130);//PWM比例0~255调速,左右轮差异略增减
-
-
- digitalWrite(Left_motor,LOW); // 左电机前进
- digitalWrite(Left_motor_pwm,LOW); //左电机PWM
- analogWrite(Left_motor_pwm,0);//PWM比例0~255调速,左右轮差异略增减
- //delay(time * 100); //执行时间,可以调整
- }
- void spin_left() //左转(左轮后退,右轮前进)
- {
- digitalWrite(Right_motor,LOW); // 右电机前进
- digitalWrite(Right_motor_pwm,HIGH); // 右电机前进
- analogWrite(Right_motor_pwm,130);//PWM比例0~255调速,左右轮差异略增减
-
- digitalWrite(Left_motor,HIGH); // 左电机后退
- digitalWrite(Left_motor_pwm,HIGH); //左电机PWM
- analogWrite(Left_motor_pwm,130);//PWM比例0~255调速,左右轮差异略增减
- //delay(time * 100); //执行时间,可以调整
- }
- void right() //右转(右轮不动,左轮前进)
- {
- digitalWrite(Right_motor,LOW); // 右电机不转
- digitalWrite(Right_motor_pwm,LOW); // 右电机PWM输出0
- analogWrite(Right_motor_pwm,0);//PWM比例0~255调速,左右轮差异略增减
-
-
- digitalWrite(Left_motor,LOW); // 左电机前进
- digitalWrite(Left_motor_pwm,HIGH); //左电机PWM
- analogWrite(Left_motor_pwm,150);//PWM比例0~255调速,左右轮差异略增减
- //delay(time * 100); //执行时间,可以调整
- }
- void spin_right() //右转(右轮后退,左轮前进)
- {
- digitalWrite(Right_motor,HIGH); // 右电机后退
- digitalWrite(Right_motor_pwm,HIGH); // 右电机PWM输出1
- analogWrite(Right_motor_pwm,130);//PWM比例0~255调速,左右轮差异略增减
-
-
- digitalWrite(Left_motor,LOW); // 左电机前进
- digitalWrite(Left_motor_pwm,HIGH); //左电机PWM
- analogWrite(Left_motor_pwm,130);//PWM比例0~255调速,左右轮差异略增减
- //delay(time * 100); //执行时间,可以调整
- }
- void back() //后退
- {
- digitalWrite(Right_motor,HIGH); // 右电机后退
- digitalWrite(Right_motor_pwm,HIGH); // 右电机前进
- analogWrite(Right_motor_pwm,100);//PWM比例0~255调速,左右轮差异略增减
-
-
- digitalWrite(Left_motor,HIGH); // 左电机后退
- digitalWrite(Left_motor_pwm,HIGH); //左电机PWM
- analogWrite(Left_motor_pwm,100);//PWM比例0~255调速,左右轮差异略增减
- //delay(time * 100); //执行时间,可以调整
- }
- void servopulse(int servopin7,int myangle)/*定义一个脉冲函数,用来模拟方式产生PWM值舵机的范围是0.5MS到2.5MS 1.5MS 占空比是居中周期是20MS*/
- {
- pulsewidth=(myangle*11)+450;//将角度转化为500-2480 的脉宽值 这里的myangle就是0-180度 所以180*11+50=2480 11是为了换成90度的时候基本就是1.5MS
- digitalWrite(servopin7,HIGH);//将舵机接口电平置高 90*11+50=1490uS 就是1.5ms
- delayMicroseconds(pulsewidth);//延时脉宽值的微秒数 这里调用的是微秒延时函数
- digitalWrite(servopin7,LOW);//将舵机接口电平置低
- delay(20-(pulsewidth*0.001));//延时周期内剩余时间 这里调用的是ms延时函数
- }
- void servopulsesx(int servopin12,int myangle)/*定义一个脉冲函数,用来模拟方式产生PWM值舵机的范围是0.5MS到2.5MS 1.5MS 占空比是居中周期是20MS*/
- {
- pulsewidth=(myangle*11)+400;//将角度转化为500-2480 的脉宽值 这里的myangle就是0-180度 所以180*11+50=2480 11是为了换成90度的时候基本就是1.5MS
- digitalWrite(servopin12,HIGH);//将舵机接口电平置高 90*11+50=1490uS 就是1.5ms
- delayMicroseconds(pulsewidth);//延时脉宽值的微秒数 这里调用的是微秒延时函数
- digitalWrite(servopin12,LOW);//将舵机接口电平置低
- delay(20-(pulsewidth*0.001));//延时周期内剩余时间 这里调用的是ms延时函数
- }
- void front_detection()// 左右电机前
- {
- //此处循环次数减少,为了增加小车遇到障碍物的反应速度
- for(int i=0;i<=5;i++) //产生PWM个数,等效延时以保证能转到响应角度
- {
- servopulse(servopin7,1);//模拟产生PWM
- }
- }
- void left_detection()//左右舵机靠左
- {
- for(int i=0;i<=1;i++) //产生PWM个数,等效延时以保证能转到响应角度
- {
- // servopulse(servopin7,175);//模拟产生PWM
- digitalWrite(servopin7,HIGH);//将舵机接口电平置高 90*11+50=1490uS 就是1.5ms
- delayMicroseconds(2476);//延时脉宽值的微秒数 这里调用的是微秒延时函数
- digitalWrite(servopin7,LOW);//将舵机接口电平置低
- delay(2);//延时周期内剩余时间 这里调用的是ms延时函数
- }
- }
- void right_detection()//左右电机靠右
- {
- for(int i=0;i<=1;i++) //产生PWM个数,等效延时以保证能转到响应角度
- {
- // servopulse(servopin7,1);//模拟产生PWM
- digitalWrite(servopin7,HIGH);//将舵机接口电平置高 90*11+50=1490uS 就是1.5ms
- delayMicroseconds(200);//延时脉宽值的微秒数 这里调用的是微秒延时函数
- digitalWrite(servopin7,LOW);//将舵机接口电平置低
- delay(2);//延时周期内剩余时间 这里调用的是ms延时函数
- }
- }
- void s_detection()//上下舵机上
- {
- for(int i=0;i<=1;i++) //产生PWM个数,等效延时以保证能转到响应角度
- {
- servopulsesx(servopin12,1);//模拟产生PWM
- }
- }
- void x_detection()//上下舵机下
- {
- for(int i=0;i<=1;i++) //产生PWM个数,等效延时以保证能转到响应角度
- {
- servopulsesx(servopin12,175);//模拟产生PWM
- }
- }
- void loop()
- {
- if(Serial.available() > 0) //Serial.available()返回串口收到的字节数
- {
- int index = 0;
- delay(100); //延时等待串口收完数据,否则刚收到1个字节时就会执行后续程序
- int numChar = Serial.available();
- if(numChar > 15) //确认数据不会溢出,应当小于缓冲大小
- {
- numChar = 15;
- }
- while(numChar--)
- {
- buffer[index++] = Serial.read(); //将串口数据一字一字的存入缓冲
- }
- splitString(buffer); //字符串分割
- }
- }
- void splitString(char *data)
- {
- Serial.print("Data entered:");
- Serial.println(data);
- char *parameter;
- parameter = strtok(data, " ,"); //string token,将data按照空格或者,进行分割并截取
- Serial.print("***");
- Serial.println(parameter);
- while(parameter != NULL)
- {
- setLED(parameter);
- parameter = strtok(NULL, " ,"); //string token,再次分割并截取,直至截取后的字符为空
- Serial.print("---");
- Serial.println(parameter);
- }
- for(int x = 0; x < 16; x++) //清空缓冲
- {
- buffer[x] = '\0';
- }
- Serial.flush();
- }
- void setLED(char *data)
- {
- if((data[0] == 'O') && (data[1] == 'N')&& (data[2] == 'A'))
- {
- Serial.println("go forward!");
- run(sd);
- }
- if((data[0] == 'O') && (data[1] == 'N')&& (data[2] == 'B'))
- {
- Serial.println("go back!");
- back();
- }
- if((data[0] == 'O') && (data[1] == 'N')&& (data[2] == 'C'))
- {
- Serial.println("go left!");
- spin_left();
- }
- if((data[0] == 'O') && (data[1] == 'N')&& (data[2] == 'D'))
- {
- Serial.println("go right!");
- spin_right();
- }
- if((data[0] == 'O') && (data[1] == 'N')&& (data[2] == 'E'))
- {
- Serial.println("Stop!");
- brake();
- }
- if((data[0] == 'O') && (data[1] == 'N')&& (data[2] == 'F'))
- {
- Serial.println("Stop!");
- brake();
- }
- /* 以下是控制舵机左,上下舵机 */
- if((data[0] == 'O') && (data[1] == 'N')&& (data[2] == 'L'))//左
- {
- left_detection();
- }
- if((data[0] == 'O') && (data[1] == 'N')&& (data[2] == 'I'))//右
- {
- right_detection();
- }
-
- if((data[0] == 'O') && (data[1] == 'N')&& (data[2] == 'K'))//上
- {
- s_detection();
- }
- if((data[0] == 'O') && (data[1] == 'N')&& (data[2] == 'J'))//下
- {
- x_detection();
- }
- //---------------------------
- if((data[0] == 'O') && (data[1] == 'N')&& (data[2] == 'G'))
- {
- if(sd+10<=255)
- {
- sd = sd+10;
- }
- Serial.println(sd);
- run(sd);
- }
- if((data[0] == 'O') && (data[1] == 'N')&& (data[2] == 'H'))//jianshu
- {
- if(sd-10>40)
- {
- sd = sd-10;
- }
- Serial.println(sd);
- run(sd);
- }
-
- }
复制代码
|