//============================kuman===========================
// 智能小车红外避障实验
//===============================================================
//#include <Servo.h>
int Left_motor_back=9; //左电机后退(IN1)
int Left_motor_go=8; //左电机前进(IN2)
int Right_motor_go=6; // 右电机前进(IN4)
int Right_motor_back=7; // 右电机后退(IN3)
int Right_motor_en=5; // 右电机前进(ENb)
int Left_motor_en=10; // 左电机后退(ENa)
int key=13;
int beep=12;
const int SensorRight = A3; //右循迹红外传感器(A3)
const int SensorLeft = A2; //左循迹红外传感器(A2)
int SL; //左循迹红外传感器状态
int SR; //右循迹红外传感器状态
const int SensorRight_2 = A4; //右红外传感器(A4)
const int SensorLeft_2 = A5; //左红外传感器(A5)
int SL_2; //左红外传感器状态
int SR_2; //右红外传感器状态
void setup()
{
//初始化电机驱动IO为输出方式
pinMode(Left_motor_go,OUTPUT); // PIN 8(PWM)
pinMode(Left_motor_back,OUTPUT); // PIN 9 (PWM)
pinMode(Right_motor_go,OUTPUT);// PIN 6 (PWM)
pinMode(Right_motor_back,OUTPUT);// PIN 7 (PWM)
pinMode(Right_motor_en,OUTPUT);// PIN 5 (PWM)
pinMode(Left_motor_en,OUTPUT);// PIN 10(PWM)
pinMode(key,INPUT);
pinMode(beep,OUTPUT);
pinMode(SensorRight, INPUT); //定义右循迹红外传感器为输入
pinMode(SensorLeft, INPUT); //定义左循迹红外传感器为输入
pinMode(SensorRight_2, INPUT); //定义右红外传感器为输入
pinMode(SensorLeft_2, INPUT); //定义左红外传感器为输入
digitalWrite(key,HIGH);
digitalWrite(beep,LOW);
}
void run() // 前进
{
digitalWrite(Left_motor_en,HIGH); // 左电机使能
digitalWrite(Right_motor_en,HIGH); // 右电机使能
digitalWrite(Right_motor_go,HIGH); // 右电机前进
digitalWrite(Right_motor_back,LOW);
analogWrite(Right_motor_go,120);//PWM比例0~255调速,左右轮差异略增减
analogWrite(Right_motor_back,0);
digitalWrite(Left_motor_go,HIGH); // 左电机前进
digitalWrite(Left_motor_back,LOW);
analogWrite(Left_motor_go,140);//PWM比例0~255调速,左右轮差异略增减
analogWrite(Left_motor_back,0);
//delay(time * 100); //执行时间,可以调整
}
void brake() //刹车
{
digitalWrite(Right_motor_go,LOW);
digitalWrite(Right_motor_back,LOW);
digitalWrite(Left_motor_go,LOW);
digitalWrite(Left_motor_back,LOW);
//delay(time * 100);
}
void left() //左转(左轮不动,右轮前进)
{
digitalWrite(Right_motor_go,HIGH); // 右电机前进
digitalWrite(Right_motor_back,LOW);
analogWrite(Right_motor_go,190); //PWM比例0~255调速
analogWrite(Right_motor_back,0);//PWM比例0~255调速
digitalWrite(Left_motor_go,LOW); //左电机后退
digitalWrite(Left_motor_back,LOW);
analogWrite(Left_motor_go,0); //PWM比例0~255调速
analogWrite(Left_motor_back,0);//PWM比例0~255调速
//delay(time * 100);
}
void spin_left(int time) //左转(左轮后退,右轮前进)
{
digitalWrite(Right_motor_go,HIGH);//右电机前进
digitalWrite(Right_motor_back,LOW);
analogWrite(Right_motor_go,200);//PWM比例0~255调速
analogWrite(Right_motor_back,0);//PWM比例0~255调速
digitalWrite(Left_motor_go,LOW); // 左电机后退
digitalWrite(Left_motor_back,HIGH);
analogWrite(Left_motor_go,0); //PWM比例0~255调速
analogWrite(Left_motor_back,200);//PWM比例0~255调速
delay(time * 100);
}
void right() //右转(右轮不动,左轮前进)
{
digitalWrite(Right_motor_go,LOW); //右电机后退
digitalWrite(Right_motor_back,LOW);
analogWrite(Right_motor_go,0); //PWM比例0~255调速
analogWrite(Right_motor_back,0);//PWM比例0~255调速
digitalWrite(Left_motor_go,HIGH);//左电机前进
digitalWrite(Left_motor_back,LOW);
analogWrite(Left_motor_go,230);//PWM比例0~255调速
analogWrite(Left_motor_back,0);//PWM比例0~255调速
//delay(time * 100);//执行时间,可以调整
}
void spin_right(int time) //右转(右轮后退,左轮前进)
{
digitalWrite(Right_motor_go,LOW); //右电机后退
digitalWrite(Right_motor_back,HIGH);
analogWrite(Right_motor_go,0);
analogWrite(Right_motor_back,200);//PWM比例0~255调速
digitalWrite(Left_motor_go,HIGH);//左电机前进
digitalWrite(Left_motor_back,LOW);
analogWrite(Left_motor_go,200);//PWM比例0~255调速
analogWrite(Left_motor_back,0);
delay(time * 100);
}
void back(int time) //后退
{
digitalWrite(Right_motor_go,LOW); //右电机后退
digitalWrite(Right_motor_back,HIGH);
analogWrite(Right_motor_go,0);
analogWrite(Right_motor_back,150);//PWM比例0~255调速
analogWrite(Right_motor_en,165);
digitalWrite(Left_motor_go,LOW); //左电机后退
digitalWrite(Left_motor_back,HIGH);
analogWrite(Left_motor_go,0);
analogWrite(Left_motor_back,140);//PWM比例0~255调速
delay(time * 100);
}
//==========================================================
void keysacn()
{
int val;
val=digitalRead(key);//读取按键的值赋给val
while(digitalRead(key))//当按键没被按下时,一直循环
{
val=digitalRead(key);
}
while(!digitalRead(key))//当按键被按下时
{
delay(10); //延时10ms
val=digitalRead(key);//读取按键的值赋给val
if(val==LOW) //第二次判断按键是否被按下
{
digitalWrite(beep,HIGH); //蜂鸣器响
delay(50);
while(!digitalRead(key)) //判断按键是否被松开
digitalWrite(beep,LOW); //蜂鸣器停止
}
else
digitalWrite(beep,LOW);//蜂鸣器停止
}
}
/*main loop*/
void loop()
{
//delay(2000); //delay 2s runing
keysacn();//Press the button to start
while(1)
{
//有信号为LOW 没有信号为HIGH
SR_2 = digitalRead(SensorRight_2);//读取SensorRight_2的数据并把读取到的数字赋值给SR_2
SL_2 = digitalRead(SensorLeft_2);////读取SensorLeft_2的数据并把读取到的数字赋值给SL_2
if (SL_2 == HIGH&&SR_2==HIGH)
run(); //调用前进函数
else if (SL_2 == HIGH & SR_2 == LOW)// 右边探测到有障碍物,有信号返回,向左转
spin_left(3);
else if (SR_2 == HIGH & SL_2 == LOW) //左边探测到有障碍物,有信号返回,向右转
spin_right(3);
else // 都是有障碍物, 后退
back(6);//600ms 后退
}
}
//如果小车遇到障碍物,请调整避障的红外传感器感应距离。
//============================KUMAN==========================
// 智能小车超声波避障实验
//===============================================================
int Echo = A1; // Echo回声脚(A1)
int Trig =A0; // Trig 触发脚(A0)
int Distance = 0;
//==============================
//==============================
int Left_motor_back=9; //左电机后退(IN1)
int Left_motor_go=8; //左电机前进(IN2)
int Right_motor_go=6; // 右电机前进(IN4)
int Right_motor_back=7; // 右电机后退(IN3)
int Right_motor_en=5; // 右电机使能
int Left_motor_en=10; // 右电机使能
int key=13; //按键引脚定义
int beep=12; //蜂鸣器引脚定义
void setup()
{
Serial.begin(9600); //波特率9600 (蓝牙通讯设定波特率)
//初始化电机驱动IO为输出方式
pinMode(Left_motor_go,OUTPUT); // PIN 8 (PWM)
pinMode(Left_motor_back,OUTPUT); // PIN 9 (PWM)
pinMode(Right_motor_go,OUTPUT);// PIN 6 (PWM)
pinMode(Right_motor_back,OUTPUT);// PIN 7 (PWM)
pinMode(Right_motor_en,OUTPUT);// PIN 5 (PWM)
pinMode(Left_motor_en,OUTPUT);// PIN 10 (PWM)
pinMode(key,INPUT);// pin 13
pinMode(beep,OUTPUT);// pin 12
pinMode(Echo, INPUT); // pin A1
pinMode(Trig, OUTPUT); // pin A0
digitalWrite(key,HIGH);//初始化按键
digitalWrite(beep,LOW);// 设置蜂鸣器静音
}
void run() // 前进
{
digitalWrite(Left_motor_en,HIGH); // 左电机使能
analogWrite(Left_motor_en,157);
digitalWrite(Right_motor_en,HIGH); // 右电机使能
digitalWrite(Right_motor_go,HIGH); // 右前电机前进
digitalWrite(Right_motor_back,LOW); //右后电机停止
analogWrite(Right_motor_go,200);//PWM比例0~255调速,右前电机速度为200,左右轮差异略增减
analogWrite(Right_motor_back,0);//PWM比例0~255调速,右后电机速度为0,左右轮差异略增减
digitalWrite(Left_motor_go,HIGH); // 左电机前进
digitalWrite(Left_motor_back,LOW);
analogWrite(Left_motor_go,137);//PWM比例0~255调速,左前电机速度为137,左右轮差异略增减
analogWrite(Left_motor_back,0);//PWM比例0~255调速,左后电机速度为0,左右轮差异略增减
// delay(time * 100); //执行时间,可以调整 毫秒级
}
void brake(int time) //刹车,停车
{
digitalWrite(Right_motor_go,LOW);//右电机停止
digitalWrite(Right_motor_back,LOW);
digitalWrite(Left_motor_go,LOW);//左电机停止
digitalWrite(Left_motor_back,LOW);
delay(time * 100);//执行时间,可以调整
}
void left(int time) //左转(左轮不动,右轮前进)
{
digitalWrite(Right_motor_go,HIGH); // 右电机前进
digitalWrite(Right_motor_back,LOW);
analogWrite(Right_motor_go,190); // PWM比例0~255调速,右前电机速度为190
analogWrite(Right_motor_back,0);// PWM比例0~255调速,右后电机速度为0
digitalWrite(Left_motor_go,LOW); // 左电机停止
digitalWrite(Left_motor_back,LOW);
analogWrite(Left_motor_go,0); // PWM比例0~255调速,左前前电机速度为0
analogWrite(Left_motor_back,0);// PWM比例0~255调速,左后电机速度为0
delay(time * 100); //执行时间,可以调整
}
void spin_left(int time) //左转(左轮后退,右轮前进)
{
digitalWrite(Right_motor_go,HIGH); // 右电机前进
digitalWrite(Right_motor_back,LOW);
analogWrite(Right_motor_go,200);// PWM比例0~255调速,右前电机速度为200
analogWrite(Right_motor_back,0); // PWM比例0~255调速,右后电机速度为0
digitalWrite(Left_motor_go,LOW); // 左电机后退
digitalWrite(Left_motor_back,HIGH);
analogWrite(Left_motor_go,0); // PWM比例0~255调速,左前电机速度为0
analogWrite(Left_motor_back,200);// PWM比例0~255调速,左后电机速度为200
delay(time * 100); //执行时间,可以调整
}
void right(int time) //右转(右轮不动,左轮前进)
{
digitalWrite(Right_motor_go,LOW); // 右前电机停止
digitalWrite(Right_motor_back,LOW);
analogWrite(Right_motor_go,0); // PWM比例0~255调速,右前电机速度为0
analogWrite(Right_motor_back,0);// PWM比例0~255调速,右后电机速度为0
digitalWrite(Left_motor_go,HIGH);// 左前电机前进
digitalWrite(Left_motor_back,LOW);
analogWrite(Left_motor_go,230); // PWM比例0~255调速, 左前电机速度为230
analogWrite(Left_motor_back,0);// PWM比例0~255调速,左后电机速度为0
delay(time * 100); //执行时间,可以调整
}
void spin_right(int time) //右转(右轮后退,左轮前进)
{
digitalWrite(Right_motor_go,LOW); // 右电机后退
digitalWrite(Right_motor_back,HIGH);
analogWrite(Right_motor_go,0); // PWM比例0~255调速,右前电机速度为0
analogWrite(Right_motor_back,200);// PWM比例0~255调速,右后电机速度为200
digitalWrite(Left_motor_go,HIGH);// 左前电机前进
digitalWrite(Left_motor_back,LOW);
analogWrite(Left_motor_go,200); // PWM比例0~255调速,左前电机速度为200
analogWrite(Left_motor_back,0);
delay(time * 100); //执行时间,可以调整
}
void back(int time) //后退
{
digitalWrite(Right_motor_go,LOW); //right motor back off
digitalWrite(Right_motor_back,HIGH);
analogWrite(Right_motor_go,0);// PWM比例0~255调速,右前电机速度为0
analogWrite(Right_motor_back,150);// PWM比例0~255调速,右后电机速度为150
analogWrite(Right_motor_en,165);
digitalWrite(Left_motor_go,LOW); // 左电机停止
digitalWrite(Left_motor_back,HIGH);
analogWrite(Left_motor_go,0);
analogWrite(Left_motor_back,140);// PWM比例0~255调速,右后电机速度为140
delay(time * 100); //执行时间,可以调整
}
//==========================================================
void Distance_test() // 测距
{
digitalWrite(Trig, LOW); // 设置Trig管脚低电平2us
delayMicroseconds(2);
digitalWrite(Trig, HIGH); //设置Trig管脚高电平10μs(最少 10μs)
delayMicroseconds(10);
digitalWrite(Trig, LOW); // 设置trig管脚低电平
float Fdistance = pulseIn(Echo, HIGH); // 读取echo 管脚高电平时间
Fdistance= Fdistance/58; // Distance(m) =(time(s) * 344(m/s)) / 2
Serial.print("Distance:"); //打印 Distance字符
Serial.println(Fdistance); //显示距离
Distance = Fdistance;
}
//==========================================================
void keysacn()
{
int val;
val=digitalRead(key);// 读取按键的值并传递给val变量
while(digitalRead(key))// 判断按钮是否被按下
{
val=digitalRead(key);
}
while(!digitalRead(key))
{
delay(10); //delay 10ms
val=digitalRead(key);//读取按键的值并传递给val变量
if(val==LOW) //再次判断按键是否被按下
{
digitalWrite(beep,HIGH);//蜂鸣器发声
delay(50);//delay 50ms
while(!digitalRead(key)) //判断按键是否松开
digitalWrite(beep,LOW);//蜂鸣器静音
}
else
digitalWrite(beep,LOW);//蜂鸣器静音
}
}
/*主函数*/
void loop()
{
keysacn();//你按下按钮开始
while(1)
{
Distance_test();//测量前方距离
if(Distance <38)//判断前方距离, 35这个值是遇到障碍物的距离,可以根据实际情况来设定
{
delay(10);
Distance_test();//测量前方距离
while(Distance<38)//再次判断前方距离。如果前方距离小于35CM,就旋转后继续判断
{
spin_right(4);//向右旋转 300ms
brake(1);//刹车
delay(100);
Distance_test();//测量前方距离
}
}
else
run();//判断没有障碍物就前进
}
}
//============================KUMAN========================================
// 智能小车红外遥控实验
//=============================================================================
#include <IRremote.h>//包含红外库
//Infrared Remote Control
int RECV_PIN = 2;//端口声明
IRrecv irrecv(RECV_PIN);
decode_results results;//结构声明
int on = 0;//标志位
unsigned long last = millis();
long run_car = 0x00FD8877;//按键 UP
long back_car = 0x00FD9867;//按键 DW
long left_car = 0x00FD28D7;//按键L
long right_car = 0x00FD6897;//按键R
long stop_car = 0x00FDA857;//按键OK
long left_turn = 0x00FD30CF;//按键*
long right_turn = 0x00FD708F;//按键#
long Buzzer_speak = 0x00FDB04F;//按键 0
//==============================
int Left_motor_back=9; //左电机后退(IN1)
int Left_motor_go=8; //左电机前进(IN2)
int Right_motor_go=6; // 右电机前进(IN4)
int Right_motor_back=7; // 右电机后退(IN3)
int Right_motor_en=5; // 右电机前进(ENb)
int Left_motor_en=10; // 左电机后退(ENa)
int Left_led=3;//Left led
int Right_led=4;//Right led
int key=13;
int beep=12;
void setup()
{
//初始化电机驱动IO为输出方式
pinMode(Left_motor_go,OUTPUT); // PIN 8 (PWM)
pinMode(Left_motor_back,OUTPUT); // PIN 9 (PWM)
pinMode(Right_motor_go,OUTPUT);// PIN 6 (PWM)
pinMode(Right_motor_back,OUTPUT);// PIN 7 (PWM)
pinMode(Right_motor_en,OUTPUT);// PIN 5 (PWM)
pinMode(Left_motor_en,OUTPUT);// PIN 10(PWM)
pinMode(Left_led,OUTPUT);// PIN 3 OUTPUT HIGH
pinMode(Right_led,OUTPUT);// PIN 4 OUTPUT HIGH
pinMode(key,INPUT);
pinMode(beep,OUTPUT);
Serial.begin(9600); //波特率9600
irrecv.enableIRIn(); // Start the receiver
}
void run() // 前进
{
digitalWrite(Left_motor_en,HIGH); // 右电机使能
analogWrite(Left_motor_en,157);
digitalWrite(Right_motor_en,HIGH); // 右电机使能
digitalWrite(Right_motor_go,HIGH); // 右电机前进
digitalWrite(Right_motor_back,LOW);
analogWrite(Right_motor_go,200);//PWM比例0~255调速
analogWrite(Right_motor_back,0);//PWM比例0~255调速
digitalWrite(Left_motor_go,HIGH); // 左电机前进
digitalWrite(Left_motor_back,LOW);
analogWrite(Left_motor_go,137);//PWM比例0~255调速
analogWrite(Left_motor_back,0);//PWM比例0~255调速
//delay(time * 100); //Running time can be adjusted
digitalWrite(Right_led,LOW);
digitalWrite(Left_led,LOW);
}
void brake() //STOP
{
digitalWrite(Left_motor_back, LOW); //右电机停止
digitalWrite(Left_motor_go, LOW);
digitalWrite(Right_motor_go, LOW); //左电机停止
digitalWrite(Right_motor_back, LOW);
//delay(time * 100); //执行时间,可以调整
led();
}
void left() //turn left
{
digitalWrite(Right_motor_go,HIGH); // right motor go ahead
digitalWrite(Right_motor_back,LOW);
analogWrite(Right_motor_go,190); // PWM--Pulse Width Modulation(0~255) control speed,right motor go speed is 255.
analogWrite(Right_motor_back,0);
digitalWrite(Left_motor_go,LOW); // left motor stop
digitalWrite(Left_motor_back,LOW);
analogWrite(Left_motor_go,0);
analogWrite(Left_motor_back,0);
//delay(time * 100);
digitalWrite(Left_led,HIGH);
digitalWrite(Right_led,LOW);
}
void spin_left() //左转(左轮后退,右轮前进)
{
digitalWrite(Right_motor_go, HIGH); // 右前电机前进
digitalWrite(Right_motor_back, LOW);// 右后电机停止
analogWrite(Right_motor_go,200); //PWM比例0~255调速
analogWrite(Right_motor_back,0);//PWM比例0~255调速
digitalWrite(Left_motor_go, LOW); // 左前电机停止
digitalWrite(Left_motor_back, HIGH);// 左后电机后退
analogWrite(Left_motor_go,0); //PWM比例0~255调速
analogWrite(Left_motor_back,200);//PWM比例0~255调速
//delay(time * 100);//执行时间,可以调整
digitalWrite(Left_led,HIGH);
digitalWrite(Right_led,LOW);
}
void right() //右转(右轮不动,左轮前进)
{
digitalWrite(Right_motor_go, LOW); // 右电机后退
digitalWrite(Right_motor_back, LOW);
analogWrite(Right_motor_go,0); //PWM比例0~255调速
analogWrite(Right_motor_back,0);//PWM比例0~255调速
digitalWrite(Left_motor_go, HIGH); // 左电机前进
digitalWrite(Left_motor_back, LOW);
analogWrite(Left_motor_go,230); //PWM比例0~255调速
analogWrite(Left_motor_back,0);//PWM比例0~255调速
//delay(time * 100);//执行时间,可以调整
digitalWrite(Right_led,HIGH);
digitalWrite(Left_led,LOW);
}
void spin_right() //右转(右轮后退,左轮前进)
{
digitalWrite(Right_motor_go, LOW); // 右电机后退
digitalWrite(Right_motor_back, HIGH);
analogWrite(Right_motor_go,0); //PWM比例0~255调速
analogWrite(Right_motor_back,200);//PWM比例0~255调速
digitalWrite(Left_motor_go, HIGH); //左电机前进
digitalWrite(Left_motor_back, LOW);
analogWrite(Left_motor_go,200); //PWM比例0~255调速
analogWrite(Left_motor_back,0);//PWM比例0~255调速
//delay(time * 100);//执行时间,可以调整
digitalWrite(Right_led,HIGH);
digitalWrite(Left_led,LOW);
}
void back() //后退
{
digitalWrite(Right_motor_go, LOW); // 右电机后退
digitalWrite(Right_motor_back,HIGH);
analogWrite(Right_motor_go,0);//PWM比例0~255调速
analogWrite(Right_motor_back,150);//PWM比例0~255调速
analogWrite(Right_motor_en,165);
digitalWrite(Left_motor_go, LOW); // 左电机后退
digitalWrite(Left_motor_back,HIGH);
analogWrite(Left_motor_go,0);//PWM比例0~255调速
analogWrite(Left_motor_back,140);//PWM比例0~255调速
// delay(time * 100);//执行时间,可以调整
}
void buzzer()
{
digitalWrite (beep,HIGH);
delay(1000);
digitalWrite (beep,LOW);
}
void led()
{
digitalWrite(Right_led,HIGH);
digitalWrite(Left_led,HIGH);
delay (100);
digitalWrite(Right_led,LOW);
digitalWrite(Left_led,LOW);
delay (100);
digitalWrite(Right_led,HIGH);
digitalWrite(Left_led,HIGH);
delay (100);
digitalWrite(Right_led,LOW);
digitalWrite(Left_led,LOW);
delay (100);
digitalWrite(Right_led,HIGH);
digitalWrite(Left_led,HIGH);
}
void dump(decode_results *results)//解码红外遥控接收信号
{
int count = results->rawlen;
if (results->decode_type == UNKNOWN)
{
brake();
}
//串口打印,调试时可以打开,实际运行中会影响反应速度,建议屏蔽
/*else
{
if (results->decode_type == NEC)
{
Serial.print("Decoded NEC: ");
}
else if (results->decode_type == SONY)
{
Serial.print("Decoded SONY: ");
}
else if (results->decode_type == RC5)
{
Serial.print("Decoded RC5: ");
}
else if (results->decode_type == RC6)
{
Serial.print("Decoded RC6: ");
}
Serial.print(results->value, HEX);
Serial.print(" (");
Serial.print(results->bits, DEC);
Serial.println(" bits)");
}
Serial.print("Raw (");
Serial.print(count, DEC);
Serial.print("): ");
for (int i = 0; i < count; i++)
{
if ((i % 2) == 1)
{
Serial.print(results->rawbuf[i]*USECPERTICK, DEC);
}
else
{
Serial.print(-(int)results->rawbuf[i]*USECPERTICK, DEC);
}
Serial.print(" ");
}
Serial.println("");
*/
}
void loop()
{
if (irrecv.decode(&results)) //调用库函数:解码
{
if (millis() - last > 250) //确定接收到信号
{
on = !on;//标志位置反
dump(&results);//解码红外信号
}
if (results.value == run_car )//按键UP
run();//前进
if (results.value == back_car )//按键DW
back();//后退
if (results.value == left_car )//按键left
left();//左转
if (results.value == right_car )//按键right
right();//右转
if (results.value == stop_car )//按键ok
brake();//停车
if (results.value == left_turn )//按键*
spin_left();//左旋转
if (results.value == right_turn )//按键#
spin_right();//右旋转
if (results.value == Buzzer_speak )//按键0
buzzer();//speaker
last = millis();
irrecv.resume(); // Receive the next value
}
}以上代码是三个功能的单个代码组成,请帮我把这三个代码集成为一个代码并且互不影响,并且将批注全部改成英文