halo~我是bay_Tong桐小白
本文内容是桐小白个人对所学知识进行的总结和分享,知识点会不定期进行编辑更新和完善,了解最近更新内容可参看更新日志,欢迎各位大神留言、指点
身体、心理等各种原因,停滞住了两个月,没有学习,没有写文章,为了恢复状态每天都在睡觉休息,揽了一些小型比赛调整自己“强迫”自己学习,目前仍然有些低烧,还在慢慢调整,努力开始往起捡专业课以及考研复习,给关注我的新老朋友道声抱歉~
【更新日志】
最近更新:
- 暂无编辑记录,持续更新中……
任务描述
- 能自主进行电路分析设计
- 能自主完成电路连接与硬件组装
- 能自主分析排查维修硬件故障
- 能通过编程代码编写实现小车的运行
- 能通过编程代码编写实现小车的自动循迹运行
- 能自主分析调整小车的循迹跑动速度,优化弯道逻辑,排除潜在bug
Arduino 开源平台
- Arduino是一款便捷灵活、方便上手的开源电子原型平台。包含硬件(各种型号的Arduino板)和软件(ArduinoIDE)。它构建于开放原始码simple I/O介面版,并且具有使用类似Java、C语言的Processing/Wiring开发环境
- Arduino能通过各种各样的传感器来感知环境,通过控制灯光、马达和其他的装置来反馈、影响环境。板子上的微控制器可以通过 Arduino 的编程语言来编写程序,编译成二进制文件,烧录进微控制器。
- 对Arduino的编程是通过 Arduino编程语言(基于Wiring)和Arduino开发环境(基于Processing)来实现的。基于Arduino的项目,可以只包含Arduino,也可以包含Arduino和其他一些在PC上运行的软件,它们之间进行通信 (比如 Flash, Processing, MaxMSP)来实现。
(引用自百度百科)
硬件电路设计组装
硬件器件
主控板:Arduino Nano
基本原理:
- 循迹模块上连接的传感器接收光信号来识别轨道,将识别的信号传送至NANO电路板上
- NANO内写好的代码根据接收到的信号,按照代码逻辑做出相应操作,驱动电机驱动做出相应动作
循迹小车基本逻辑
基本函数
1.基本结构
- setup () {}
在 Arduino 中程序运行时将首先调用 setup() 函数。用于初始化变量、设置针脚的输出\输入类型、配置串口、引入类库文件等等。每次 Arduino 上电或重启后,setup 函数只运行一次
- loop () {}
该函数在程序运行过程中不断的循环,根据一些反馈,相应改变执行情况。通过该函数动态控制 Arduino主控板
2.常用函数
/*将指定的引脚配置成输出或输入*/
//语法:
pinMode(pin, mode);
/*参数:
* pin:要设置模式的引脚
* mode:INPUT或OUTPUT
*/
/*读取指定引脚的值(HIGH或LOW)*/
//语法:
digitalRead(PIN);
/*参数:
* PIN:想要读取的引脚编号
*返回:HIGH或LOW
*/
/*给一个数字引脚写入状态(HIGH或LOW)*/
//语法:
digitalWrite(pin, value);
/*参数:
* pin:引脚编号
* value:HIGH或LOW
*/
/*从一个引脚输出模拟值(PWM)。可用于让 LED 以不同的亮度点亮或驱动电机以不同的速度旋转*/
//语法:
analogWrite(pin, value);
/*参数:
* pin:用于输入数值的引脚
* value:占空比,[0,255) 之间
*/
电路设计
【持续更新中……】
小车组装
组装完成样品展示:
逻辑设计
小车直走/加速:
小车倒退/减速:
小车左转:
小车右转:
四个传感器接受到的信号只有0/1两种状态,为了方便代码的设计编写,可将四个信号分别进行x1、x10、x100、x1000并将结果相加,以此四位数作为整体接收的信号结果,再通过switch语句对其进行逻辑判断,完成不同情况下的代码编写
循迹小车编码测试
【PS:此测试代码为初步测试所用,可进行简单轨道的循迹,对于角度略大的弯道(如直角弯)等赛道仍存在问题,且未进行代码封装,仅可进行简单测试,改进后的代码后续更新】
/*电机驱动逻辑输入引脚定义*/
#define IN1 3
#define IN2 4
#define IN3 5
#define IN4 6
/*电机驱动调速引脚定义*/
#define ENA 9
#define ENB 10
/*四路寻迹传感器引脚定义*/
#define SensorPin_L1 A4 //A1-out4 L1
#define SensorPin_L2 A3 // A2-out3 L2
#define SensorPin_R1 A2 // A3-out2 R1
#define SensorPin_R2 A1 // A4-out1 R2
/*速度定义*/
#define normalspeed 255
#define lowspeed 100
#define highspeed 225
void setup() {
/*将连接电机驱动模块的引脚全部配置为输出模式,用于控制电机驱动*/
pinMode(IN1, OUTPUT);
pinMode(IN2, OUTPUT);
pinMode(IN3, OUTPUT);
pinMode(IN4, OUTPUT);
pinMode(ENA, OUTPUT);
pinMode(ENB, OUTPUT);
/*将连接传感器的引脚配置为输入模式,用于传感器的读取*/
pinMode(SensorPin_L1, INPUT);
pinMode(SensorPin_L2, INPUT);
pinMode(SensorPin_R1, INPUT);
pinMode(SensorPin_R2, INPUT);
}
void loop() {
/*读取四路传感器*/
int read = digitalRead(SensorPin_L1) * 1000 + digitalRead(SensorPin_L2) * 100 + digitalRead(SensorPin_R1) * 10 + digitalRead(SensorPin_R2);
switch (read)
{
case 1000 ://大左转 左反右正
digitalWrite(IN1, LOW);
digitalWrite(IN2, HIGH);
analogWrite(ENA, normalspeed);//low->
digitalWrite(IN3, LOW);
digitalWrite(IN4, HIGH);
analogWrite(ENB, normalspeed);//high->
delay(100);
break;
case 1100:
digitalWrite(IN1, LOW);
digitalWrite(IN2, HIGH);
analogWrite(ENA, lowspeed);
digitalWrite(IN3, LOW);
digitalWrite(IN4, HIGH);
analogWrite(ENB, highspeed);
break;
case 100://左转
digitalWrite(IN1, LOW);
digitalWrite(IN2, HIGH);
analogWrite(ENA, lowspeed);
digitalWrite(IN3, LOW);
digitalWrite(IN4, HIGH);
analogWrite(ENB, highspeed);
break;
case 10://右转
digitalWrite(IN1, HIGH);
digitalWrite(IN2, LOW);
analogWrite(ENA, highspeed);
digitalWrite(IN3, HIGH);
digitalWrite(IN4, LOW);
analogWrite(ENB, lowspeed);
break;
case 11:
digitalWrite(IN1, HIGH);
digitalWrite(IN2, LOW);
analogWrite(ENA, highspeed);
digitalWrite(IN3, HIGH);
digitalWrite(IN4, LOW);
analogWrite(ENB, lowspeed);
break;
case 1://大右转 左正右反
digitalWrite(IN1, HIGH); //左电机正转
digitalWrite(IN2, LOW);
analogWrite(ENA, normalspeed);//high->
digitalWrite(IN3, HIGH);
digitalWrite(IN4, LOW);
analogWrite(ENB, normalspeed);//low->
delay(100);
break;
default:
digitalWrite(IN1, HIGH ); //左电机正转
digitalWrite(IN2, LOW);
analogWrite(ENA, normalspeed );
digitalWrite(IN3, LOW); //右电机正转
digitalWrite(IN4, HIGH);
analogWrite(ENB, normalspeed );
break;
}
}
持续更新中……
我是桐小白,一个摸爬滚打的计算机小白