问小白 wenxiaobai
资讯
历史
科技
环境与自然
成长
游戏
财经
文学与艺术
美食
健康
家居
文化
情感
汽车
三农
军事
旅行
运动
教育
生活
星座命理

基于Arduino的基础循迹小车制作教程(含代码)

创作时间:
作者:
@小白创作中心

基于Arduino的基础循迹小车制作教程(含代码)

引用
CSDN
1.
https://m.blog.csdn.net/2302_81380153/article/details/144469170

本文将介绍如何使用Arduino UNO或ESP32制作一个基础循迹小车。内容包括供电控制、PWM连线实例、硬件选择以及完整的代码实现。

供电控制

只需要在12V供电处接上7-12V电压,供电GND处与单片机共地即可,5V供电处会输出一个5V的电压,可以用于给单片机供电,做小车时最常用的就是这种方式。使用这种方式时,板载5V使能不用管。

PWM连线实例

L298N 电源
12V 电源12V
GND 电源负
L298N UNO
OUT1和OUT2 电机1的两个端子
OUT3和OUT4 电机2的两个端子
ENA 5
ENB 9
IN1和IN2 6和7
IN3和IN4 10和11
VSS 5V
GND GND

L298N详细信息大家可以看电机驱动----L298N,这里就不再重复了。

硬件

单片机选用UNO或ESP32(本文代码是UNO的,ESP32改个引脚就好)。

基础函数

  • pinMode(引脚,状态) // (INPUT输入,OUTPUT输出)
  • analogWrite(引脚,PWM(0-255)) //PWM函数
  • digitalWrite(引脚, 高低电平); //引脚设置
  • digitalRead(引脚) //读取引脚高低电平

代码

#include <Arduino.h>
int ENA=5, IN1=6, IN2=7, ENB=9, IN3=10,IN4=11;    //电机驱动
int L1=2, L2=4, R1=12, R2=13;    //循迹模块
int La, Lb, Ra, Rb;

void setup() {
  pinMode(L1, INPUT);
  pinMode(L2, INPUT);
  pinMode(R1, INPUT);
  pinMode(R2, INPUT);
  pinMode(IN1, OUTPUT);
  pinMode(IN2, OUTPUT);
  pinMode(IN3, OUTPUT);
  pinMode(IN4, OUTPUT);
}

// the loop routine runs over and over again forever:
void loop() {
  La = digitalRead(L1);
  Lb = digitalRead(L2);
  Ra = digitalRead(R1);
  Rb = digitalRead(R2);
  
  if (La == 0 && Lb == 0 && Ra == 0 && Rb == 0) {
      analogWrite(ENA, 50);
      digitalWrite(IN1, 1);
      digitalWrite(IN2, 0);
      analogWrite(ENB, 50);
      digitalWrite(IN3, 1);
      digitalWrite(IN4, 0);
  }
  if (La == 1 && Lb == 0 && Ra == 0 && Rb == 0) {
      analogWrite(ENA, 80);
      digitalWrite(IN1, 1);
      digitalWrite(IN2, 0);
      analogWrite(ENB, 80);
      digitalWrite(IN3, 0);
      digitalWrite(IN4, 1);
      delay(150);
  }
  if (La == 0 && Lb == 1 && Ra == 0 && Rb == 0) {
      analogWrite(ENA, 60);
      digitalWrite(IN1, 1);
      digitalWrite(IN2, 0);
      analogWrite(ENB, 50);
      digitalWrite(IN3, 1);
      digitalWrite(IN4, 0);
  }
  if (La == 0 && Lb == 0 && Ra == 1 && Rb == 0) {
      analogWrite(ENA, 50);
      digitalWrite(IN1, 1);
      digitalWrite(IN2, 0);
      analogWrite(ENB, 60);
      digitalWrite(IN3, 1);
      digitalWrite(IN4, 0);
  }
  if (La == 0 && Lb == 0 && Ra == 0 && Rb == 1) {
      analogWrite(ENA, 80);
      digitalWrite(IN1, 0);
      digitalWrite(IN2, 1);
      analogWrite(ENB, 80);
      digitalWrite(IN3, 1);
      digitalWrite(IN4, 0);
      delay(150);
  }
  if (La == 1 && Lb == 1 && Ra == 0 && Rb == 0) {
      analogWrite(ENA, 80);
      digitalWrite(IN1, 1);
      digitalWrite(IN2, 0);
      analogWrite(ENB, 80);
      digitalWrite(IN3, 0);
      digitalWrite(IN4, 1);
  }
  if (La == 0 && Lb == 0 && Ra == 1 && Rb == 1) {
      analogWrite(ENA, 80);
      digitalWrite(IN1, 0);
      digitalWrite(IN2, 1);
      analogWrite(ENB, 80);
      digitalWrite(IN3, 1);
      digitalWrite(IN4, 0);
  }
  if (La == 1 && Lb == 1 && Ra == 1 && Rb == 1) {
      analogWrite(ENA, 60);
      digitalWrite(IN1, 1);
      digitalWrite(IN2, 0);
      analogWrite(ENB, 60);
      digitalWrite(IN3, 1);
      digitalWrite(IN4, 0);  
  }
  if (La == 1 && Lb == 0 && Ra == 0 && Rb == 1) {
      analogWrite(ENA, 60);
      digitalWrite(IN1, 1);
      digitalWrite(IN2, 0);
      analogWrite(ENB, 60);
      digitalWrite(IN3, 1);
      digitalWrite(IN4, 0);  
  }
  delay(1);
}  

正常应该封装模块化的,但我觉得这样其实也行(毕竟我是写好一个判断就开始Ctrl+v了)
代码有问题欢迎指正

下面有一个UNO循迹小车的照片和ESP32小车(因为我真的做了两个车...)

UNO小车战损版

本文原文来自CSDN

© 2023 北京元石科技有限公司 ◎ 京公网安备 11010802042949号