赞
踩
第一步:让车动起来
L298N控制逻辑 void setup() { //完整 // put your setup code here, to run once: // 配置2,3口为输出引脚 pinMode(2,OUTPUT);// 配置2口为输出引脚 pinMode(3,OUTPUT);// 配置3口为输出引脚 } void loop() { // put your main code here, to run repeatedly: //后退 2接的是IN1,3接的是IN2. 根据官方说明,正转,对应接线后的现象,后退 digitalWrite(2,HIGH); digitalWrite(3,LOW); delay(1000); //前进 2接的是IN1,3接的是IN2. 根据官方说明,反转,对应接线后的现象,前进 digitalWrite(2,LOW); digitalWrite(3,HIGH); delay(1000); }
第二步:实现前后左右
void setup() { // put your setup code here, to run once: pinMode(2,OUTPUT);// 配置2口为输出引脚 pinMode(3,OUTPUT);// 配置3口为输出引脚 pinMode(4,OUTPUT);// 配置4口为输出引脚 pinMode(5,OUTPUT);// 配置5口为输出引脚 } void loop() { // put your main code here, to run repeatedly: digitalWrite(2,LOW); digitalWrite(3,HIGH); digitalWrite(4,HIGH); digitalWrite(5,LOW); delay(1000); digitalWrite(2,HIGH); digitalWrite(3,LOW); digitalWrite(4,LOW); digitalWrite(5,HIGH); delay(1000); digitalWrite(2,HIGH); digitalWrite(3,LOW); digitalWrite(4,HIGH); digitalWrite(5,LOW); delay(1000); digitalWrite(2,LOW); digitalWrite(3,HIGH); digitalWrite(4,LOW); digitalWrite(5,HIGH); delay(1000); }
第三步:将小车运动状态封装成函数
void S(){ //左轮 后退 正转 IN1 高 IN2 低 digitalWrite(2,HIGH); digitalWrite(3,LOW); //右轮 后退 反转 IN3 低 IN4 高 digitalWrite(4,HIGH); digitalWrite(5,LOW); } void W(){ //左轮 前进 反转 IN1 低 IN2 高 digitalWrite(2,LOW); digitalWrite(3,150); //右轮 前进 正转 IN3 高 IN4 低 digitalWrite(4,LOW); digitalWrite(5,150); } void A(){ //左轮 停止 IN1 低 IN2 低 digitalWrite(2,LOW); digitalWrite(3,100); //右轮 前进 正转 IN3 高 IN4 低 digitalWrite(4,LOW); digitalWrite(5,230); } void D(){ //左轮 前进 反转 IN1 低 IN2 高 digitalWrite(2,LOW); digitalWrite(3,230); //右轮 停止 IN3 低 IN4 低 digitalWrite(4,LOW); digitalWrite(5,100); } void stop(){ // 停止 digitalWrite(2,LOW); digitalWrite(3,LOW); digitalWrite(4,LOW); digitalWrite(5,LOW); }
第四步:了解串口
void setup() {
// put your setup code here, to run once:
Serial.begin(115200);
}
void loop() {
// put your main code here, to run repeatedly:
Serial.print("hello");
Serial.println("!!!");
}
五. 跟随模式开发
void HC_SR04(){ //Trig接9,发送触发信号给超声波模块 pinMode(9,OUTPUT); //Echo接8,通过读取8引脚高电平维持时间 pinMode(8,INPUT); Serial.begin(9600); } void setup() { // put your setup code here, to run once: carInit(); HC_SR04(); myServo.attach(10); }
超声波测距原理:
long getDis() { // 测距函数 long t; long d; // put your main code here, to run repeatedly: // 发送一个10us的信号给超声波,9Trig digitalWrite(9, HIGH); delayMicroseconds(1); digitalWrite(9, LOW); delayMicroseconds(2); digitalWrite(9, HIGH); delayMicroseconds(10); digitalWrite(9, LOW);//超声波内部开始震荡,准备发送波 // 关注Echo高电平维持的时间,代表超声波发送到返回的时间,微秒 t = pulseIn(8,HIGH); Serial.println(t); // 距离(cm) = 时间(s) * 速度340m/s 34000cm/s = cm d = t * 0.017; return d; }
六.超声波模块摇头
#include <Servo.h> Servo myServo;//因为很多子函数要用这个变量,所以把servo定义成全局变量,作用域是整个代码文件 void setup() { // put your setup code here, to run once: //定义一个Servo变量 myServo.attach(10);//把舵机黄色信号线插在arduino的引脚10 } void loop() { // put your main code here, to run repeatedly: myServo.write(30);//右方向 delay(500); myServo.write(100);//中间方向 delay(500); myServo.write(170);//左边方向 delay(500); myServo.write(100);//中间方向 delay(500); }
七. 超声波摇头避障 (智障模式)
#include<Servo.h> Servo myServo; void S(){ //左轮 后退 正转 IN1 高 IN2 低 digitalWrite(2,HIGH); digitalWrite(3,LOW); //右轮 后退 反转 IN3 低 IN4 高 digitalWrite(4,HIGH); digitalWrite(5,LOW); } void W(){ //左轮 前进 反转 IN1 低 IN2 高 digitalWrite(2,LOW); digitalWrite(3,150); //右轮 前进 正转 IN3 高 IN4 低 digitalWrite(4,LOW); digitalWrite(5,150); } void A(){ //左轮 停止 IN1 低 IN2 低 digitalWrite(2,LOW); digitalWrite(3,100); //右轮 前进 正转 IN3 高 IN4 低 digitalWrite(4,LOW); digitalWrite(5,230); } void D(){ //左轮 前进 反转 IN1 低 IN2 高 digitalWrite(2,LOW); digitalWrite(3,230); //右轮 停止 IN3 低 IN4 低 digitalWrite(4,LOW); digitalWrite(5,100); } void stop(){ // 停止 digitalWrite(2,LOW); digitalWrite(3,LOW); digitalWrite(4,LOW); digitalWrite(5,LOW); } long getDis() { // 测距函数 long t; long d; // put your main code here, to run repeatedly: // 发送一个10us的信号给超声波,9Trig digitalWrite(9, HIGH); delayMicroseconds(1); digitalWrite(9, LOW); delayMicroseconds(2); digitalWrite(9, HIGH); delayMicroseconds(10); digitalWrite(9, LOW);//超声波内部开始震荡,准备发送波 // 关注Echo高电平维持的时间,代表超声波发送到返回的时间,微秒 t = pulseIn(8,HIGH); Serial.println(t); // 距离(cm) = 时间(s) * 速度340m/s 34000cm/s = cm d = t * 0.017; return d; } void carInit(){ //串口初始化 //左轮信号配置 pinMode(2,OUTPUT); pinMode(3,OUTPUT); //右轮信号配置 pinMode(4,OUTPUT); pinMode(5,OUTPUT); } void HC_SR04(){ //Trig接9,发送触发信号给超声波模块 pinMode(9,OUTPUT); //Echo接8,通过读取8引脚高电平维持时间 pinMode(8,INPUT); Serial.begin(9600); } void setup() { // put your setup code here, to run once: carInit(); HC_SR04(); myServo.attach(10); } void loop() { // put your main code here, to run repeatedly: long youjuli; long zhongjuli; long zuojuli; myServo.write(100);//中间方向 delay(500); zhongjuli = getDis(); Serial.print("中间距离是:"); Serial.println(zhongjuli); while(zhongjuli<=30){ S(); delay(300); stop(); myServo.write(100);//中间方向 delay(500); zhongjuli = getDis(); delay(500); } if(zhongjuli<=45){ stop(); myServo.write(30); delay(500); youjuli = getDis(); myServo.write(170); delay(500); zuojuli = getDis(); if(zuojuli > youjuli){ Serial.println("左转"); A(); delay(200); stop(); myServo.write(100);//中间方向 delay(500); zhongjuli = getDis(); }else{ Serial.println("右转"); D(); delay(200); stop(); myServo.write(100);//中间方向 delay(500); zhongjuli = getDis(); } } else { //前方无障碍物,小车前进 W(); } }
八.红外循迹模块 TCRT5000
TCRT5000传感器的红外发射二极管不断发射红外线,当发射出的红外线没有被反射回来或被反射回来但强度不够大时,红外接收管一直处于关断状态,此时模块的输出端为高电平,指示二极管一直处于熄灭状态;
int leftX = 11; int rightX = 12; void carInit() { // put your setup code here, to run once: pinMode(2, OUTPUT); // 配置2口为输出引脚 pinMode(3, OUTPUT); // 配置3口为输出引脚 //右轮信号方向初始化 pinMode(4, OUTPUT); // 配置4口为输出引脚 pinMode(5, OUTPUT); // 配置5口为输出引脚 } void W() { digitalWrite(2, LOW); analogWrite(3, 100); digitalWrite(4, LOW); analogWrite(5, 100); } void stop() { digitalWrite(2, LOW); analogWrite(3, 0); digitalWrite(4, LOW); analogWrite(5, 0); } void A() { digitalWrite(2, LOW); analogWrite(3, 80); digitalWrite(4, LOW); analogWrite(5, 250); } void D() { digitalWrite(2, LOW); analogWrite(3, 250); digitalWrite(4, LOW); analogWrite(5, 80); } void setup() { // put your setup code here, to run once: carInit(); pinMode(leftX,INPUT); pinMode(rightX,INPUT); } void loop() { if( digitalRead(leftX) == 1 && digitalRead(rightX) == 0 ){ A(); } if( digitalRead(leftX) == 0 && digitalRead(rightX) == 1 ){ D(); } if( digitalRead(leftX) == 0 && digitalRead(rightX) == 0 ){ W(); } if( digitalRead(leftX) == 1 && digitalRead(rightX) == 1 ){ stop(); } }
花了大概8到9个小时完成,很简单,第一次完嵌入式相关的内容。
大家可以去尝试,跟着四哥的做的。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。