【电子综合实践与创新】循迹小车的简单实现

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;
  }
}

持续更新中……
我是桐小白,一个摸爬滚打的计算机小白

  • 8
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值