Arduino智能物流小车各部分功能代码详解(省工程训练能力综合竞赛)

2023-11-01

前言

考虑到之前那篇博客写的太简略,也只给了一个最终代码,比较容易让人看不懂。本篇主要写一些不同功能函数的代码讲解,要看整体部分的请前往我的另一篇博客—基于Arduino(MEGA2560)的智能物流小车项目

测试部分

▶ 此代码用于测试车轮是否正确连线,以及不同高低电平的小车行进状态。
▶ 更改运动控制函数的高低电平(HIGH,LOW),保证小车烧录代码后能依次执行向前、向后、向左、向右、停止四个运动状态。
▶ 若不是正常顺序,更改代码即可,并且记住自己小车的四个状态的高低电平。

#include <Servo.h>
//定义五中运动状态
#define STOP      0
#define FORWARD   1
#define BACKWARD  2
#define TURNLEFT  3
#define TURNRIGHT 4
//定义需要用到的引脚
int leftMotor1 = 14;
int leftMotor2 = 15;
int rightMotor1 = 16;
int rightMotor2 = 17;
int leftPWM = 2;
int rightPWM = 3;
void setup() {
  // put your setup code here, to run once:
  //设置控制电机的引脚为输出状态
  pinMode(leftMotor1, OUTPUT);
  pinMode(leftMotor2, OUTPUT);
  pinMode(rightMotor1, OUTPUT);
  pinMode(rightMotor2, OUTPUT);
  pinMode(leftPWM, OUTPUT);
  pinMode(rightPWM, OUTPUT);
}

void loop() {
  int cmd;
  for(cmd=0;cmd<4;cmd++)
  //依次执行向前、向后、向左、向右、停止四个运动状态
  {
    motorRun(cmd,255);  
    delay(1000);//每个命令执行2s 
  } 
}
//运动控制函数(注意!需要更改的地方为此处)
void motorRun(int cmd,int value)
{
  analogWrite(leftPWM, value);  //设置PWM输出,即设置速度
  analogWrite(rightPWM, value);
  switch(cmd){
      case 0:
      Serial.println("FORWARD"); //输出状态
      digitalWrite(leftMotor1, HIGH);
      digitalWrite(leftMotor2, LOW);
      digitalWrite(rightMotor1, LOW);
      digitalWrite(rightMotor2, HIGH);
      break;
      case 1:
      Serial.println("BACKWARD"); //输出状态
      digitalWrite(leftMotor1, LOW);
      digitalWrite(leftMotor2,HIGH );
      digitalWrite(rightMotor1,HIGH );
      digitalWrite(rightMotor2,LOW);
      break;
      case 2:
      Serial.println("TURN LEFT"); //输出状态
      digitalWrite(leftMotor1, HIGH);
      digitalWrite(leftMotor2, LOW);
      digitalWrite(rightMotor1, LOW);
      digitalWrite(rightMotor2, LOW);
      break;
    case 3:
      Serial.println("TURN RIGHT"); //输出状态
      digitalWrite(leftMotor1, LOW);
      digitalWrite(leftMotor2, LOW);
      digitalWrite(rightMotor1, LOW);
      digitalWrite(rightMotor2, HIGH);
      break;
     default:
      Serial.println("STOP"); //输出状态
      digitalWrite(leftMotor1, LOW);
      digitalWrite(leftMotor2, LOW);
      digitalWrite(rightMotor1, LOW);
      digitalWrite(rightMotor2, LOW);
  }
}

循迹部分

#include <Servo.h>

#define STOP      0
#define FORWARD   1
#define BACKWARD  2
#define TURNLEFT  3
#define TURNRIGHT 4

int leftMotor1 = 14; //直流电机引脚
int leftMotor2 = 15;
int rightMotor1 = 16;
int rightMotor2 = 17;

int trac1 = 11; //车头四个灰度传感器引脚
int trac2 = 10; //从车头方向的最右边开始排序
int trac3 = 9; 
int trac4 = 8; 

int leftPWM = 3; //驱动PWM引脚
int rightPWM = 2;

int data[4]; //记录灰度读取值(0/1)

void setup() {
  //串口初始化
  Serial.begin(9600); 
  //测速引脚初始化
  pinMode(leftMotor1, OUTPUT);
  pinMode(leftMotor2, OUTPUT);
  pinMode(rightMotor1, OUTPUT);
  pinMode(rightMotor2, OUTPUT);
  pinMode(leftPWM, OUTPUT);
  pinMode(rightPWM, OUTPUT);
  //寻迹模块引脚初始化
  pinMode(trac1, INPUT);
  pinMode(trac2, INPUT);
  pinMode(trac3, INPUT);
  pinMode(trac4, INPUT);
}

 //运动控制函数
 //确保与测试部分测试好的函数相同
void motorRun(int cmd,int value)
{
  analogWrite(leftPWM, value);  //设置PWM输出,即设置速度
  analogWrite(rightPWM, value);
  switch(cmd){
    case FORWARD:
     Serial.println("FORWARD"); //输出状态
      digitalWrite(leftMotor1, LOW);
      digitalWrite(leftMotor2, HIGH);
      digitalWrite(rightMotor1, LOW);
      digitalWrite(rightMotor2, HIGH);
      break;
      case BACKWARD:
      Serial.println("BACKWARD"); //输出状态
      digitalWrite(leftMotor1, HIGH);
      digitalWrite(leftMotor2, LOW);
      digitalWrite(rightMotor1, HIGH);
      digitalWrite(rightMotor2, LOW);
      break;
     case TURNLEFT:
      Serial.println("TURN LEFT"); //输出状态
      digitalWrite(leftMotor1, LOW);
      digitalWrite(leftMotor2,HIGH);
      digitalWrite(rightMotor1,HIGH);
      digitalWrite(rightMotor2,LOW);
      break;
     case TURNRIGHT:
      Serial.println("TURN RIGHT"); //输出状态
      digitalWrite(leftMotor1, HIGH);
      digitalWrite(leftMotor2, LOW);
      digitalWrite(rightMotor1, LOW);
      digitalWrite(rightMotor2, HIGH);
      break;
     default:
      Serial.println("STOP"); //输出状态
      digitalWrite(leftMotor1, LOW);
      digitalWrite(leftMotor2, LOW);
      digitalWrite(rightMotor1, LOW);
      digitalWrite(rightMotor2, LOW);
  }
}

//循迹函数
void tracing()
{
  data[0] = digitalRead(11);
  data[1] = digitalRead(10);
  data[2] = digitalRead(9);
  data[3] = digitalRead(8);
   if((!data[0] && data[1] && data[2] & 4& !data[3]))  
  {
    motorRun(FORWARD,220); 
  }
  
  else if(data[0] && data[1] && data[2] && data[3])
  {
    motorRun(FORWARD,220);
  }
  
  /*else if(!data[0] && data[1] && data[2] && data[3])
  {
    motorRun(TURNLEFT, 100,100);
  }   上坡微调*/ 

  else if(data[2] || data[3])  
  {
    motorRun(TURNLEFT,255);
  }

    else if(data[0] || data[1])  
  {
    motorRun(TURNRIGHT,255);
  }

  /* else if(!data[0] && !data[1] && data[2] &&!data[3])  
  {
    motorRun(TURNLEFT,220);
  }
   
   else if(!data[0] && !data[1] && data[2] && data[3])  
  {
    motorRun(TURNLEFT,220);
  }

  else if(!data[0] && !data[1] && !data[2] && data[3])  
  {
    motorRun(TURNLEFT,220);
  }

    else if(!data[0] && data[1] && !data[2] && !data[3])  
  {
    motorRun(TURNRIGHT,220);
  }

  else if(data[0] && data[1] && !data[2] && !data[3])  
  {
    motorRun(TURNRIGHT,220);
  }*/
  Serial.print(data[0]);
  Serial.print("---");
  Serial.print(data[1]);
  Serial.print("---");
  Serial.print(data[2]);
  Serial.print("---");
  Serial.print(data[3]);
  Serial.print("---");
}

void loop() 
{
  tracing();
}

超声波测距部分

const int TrigPin = 5; 
const int EchoPin = 4; // 发射,接收引脚
float cm; 
void setup() 
{ 
Serial.begin(9600); 
pinMode(TrigPin, OUTPUT); 
pinMode(EchoPin, INPUT); 
} 
void loop() 
{ 
digitalWrite(TrigPin, LOW); //低高低电平发一个短时间脉冲去TrigPin 
delayMicroseconds(2); 
digitalWrite(TrigPin, HIGH); 
delayMicroseconds(10); 
digitalWrite(TrigPin, LOW); 


cm = pulseIn(EchoPin, HIGH) / 58.0; //将回波时间换算成cm 
cm = (int(cm * 100.0)) / 100.0; //保留两位小数 
Serial.print(cm); 
Serial.print("cm"); 
Serial.println(); 
delay(1000); 
}

避障部分

▶ 此代码用于检测小车运动过程中,超声波是否在正常工作。有时候通过串口监视超声波能正确读出距离,小车运动时超声波就不会正常工作。
▶ 此代码为小车一直前进,检测到障碍物时,执行左转-前行-右转-大前行-右转-前行-左转从而达到避开障碍物的目的且车头回正。

#include <Servo.h>

#define STOP      0
#define FORWARD   1
#define BACKWARD  2
#define TURNLEFT  3
#define TURNRIGHT 4

int leftMotor1 = 14;
int leftMotor2 = 15;
int rightMotor1 = 16;
int rightMotor2 = 17;

int leftPWM = 2;
int rightPWM = 3;

Servo myServo;  //舵机

int inputPin=4;   // 定义超声波信号接收接口
int outputPin=5;  // 定义超声波信号发出接口

int dis;
float cm; 

void setup() {
  // put your setup code here, to run once:
  //串口初始化
  Serial.begin(9600); 
  //舵机引脚初始化
  myServo.attach(4);
  //测速引脚初始化
  pinMode(leftMotor1, OUTPUT);
  pinMode(leftMotor2, OUTPUT);
  pinMode(rightMotor1, OUTPUT);
  pinMode(rightMotor2, OUTPUT);
  pinMode(leftPWM, OUTPUT);
  pinMode(rightPWM, OUTPUT);
  //超声波控制引脚初始化
  pinMode(inputPin, INPUT);
  pinMode(outputPin, OUTPUT);
}
void motorRun(int cmd,int value)
{
  analogWrite(leftPWM, value);  //设置PWM输出,即设置速度
  analogWrite(rightPWM, value);
  switch(cmd){
    case FORWARD:
     Serial.println("FORWARD"); //输出状态
      digitalWrite(leftMotor1, HIGH);
      digitalWrite(leftMotor2, LOW);
      digitalWrite(rightMotor1, HIGH);
      digitalWrite(rightMotor2, LOW);
      break;
     case 
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Arduino智能物流小车各部分功能代码详解(省工程训练能力综合竞赛) 的相关文章

  • VSCode 上的 PlatformIO 未编译:collect2.exe:错误:ld 返回 1 退出状态

    我最近不得不擦拭我的计算机 在一切准备就绪并运行之后 是时候打开我之前正在处理的一些 ESP32 程序了 发现 VSCode 上的 Platform IO 将不再编译 运行编译器后 我收到以下错误 Compiling pio build e
  • Arduino Python3 脚本

    我正在尝试使用 Python3 脚本来控制 Arduino Mega 这是一个简单的脚本 用于从键盘获取一行并通过 Arduino 回显它 我从一个可用的 Python 2 脚本开始http petrimaki wordpress com
  • Fedora 中的 Arduino 上传错误“stk500_recv(): 程序员没有响应”

    我正在尝试上传库存Blink在 Fedora Core 15 Linux 中使用 Arduino IDE 绘制草图 我收到此错误 avrdude stk500 recv 程序员没有响应 要重现该问题 通过 USB 线插入 Arduino U
  • 如何将 char 数组定义为常量?

    这里是 C C 菜鸟 我已经在头文件中定义了它 typedef unsigned char BitChar 9 8 data bytes chars and one width byte char extern BitChar BitFon
  • Android 和 Arduino 都通过蓝牙接收奇怪的值

    我正在 Android 端使用 BluetoothChat 代码使用聊天框向 Arduino UNO 发送开 关信号 我发送 110 119 或下面定义的其他情况 但是当我显示接收到的值时 它显示奇怪的Arduino 串行监视器中的值 即
  • 经典蓝牙 (2.1) 设备可实现的最小数据包延迟是多少?

    我正在使用 RN42 http www microchip com wwwproducts en RN42 http www microchip com wwwproducts en RN42 蓝牙模块以 115200 波特率 UART S
  • Python自动选择串口(适用于Arduino)

    目前 Python 程序必须知道设备 Arduino 位于哪个端口 然后 Python 才能与设备进行通信 Problem 每当设备拔出并重新插入时 其 COM 端口都会发生变化 因此必须再次向 Python 提供正确的串行端口 以便它找到
  • 同时使用 GPRS 和 GSM

    我正在尝试使用 GSM GPRS 调制解调器的 GPRS 功能将数据发送到远程服务器 但我无法这样做 我在 Arduino 论坛上发布了一个问题 但没有得到任何回复 这是问题的链接 https robotics stackexchange
  • C-如何使用PROGMEM存储和读取char数组

    我有三个字符数组 我不希望 Arduino 将它们存储在SRAM http en wikipedia org wiki Static random access memory 所以我想使用PROGMEM来存储和读入flash http en
  • ESP32 Arduino-ide如何获取唯一id

    我试图自动为每个 esp32 设置一个唯一的 id 在我使用提供该方法的 ESP IDF 框架对设备进行编程之前esp efuse mac get default 这将返回一个 8 字节值 该值在我手上的所有设备上都是唯一的 在arduin
  • 带/不带类的回调函数指针 C++

    我被困 我正在尝试形成一个函数 它将吃掉无类函数指针和对象中的函数指针 这是我当前的代码 希望能解释更多 它应该在 Arduino 上运行 所以我不能使用大型库 首先 我在 Arduino 上使用这个库 SimpleTimer A time
  • Arduino:连接字符串时崩溃和错误

    我尝试将 AES 256 加密的输出连接到一个字符串 将此字符串与从 Android 手机发送的加密字符串进行比较 基本上 连接似乎有效 但在几次运行后会出现错误 不可读的字符 字符串变得更短而不是更长 或崩溃 它是可重现的 重启后在同一点
  • 如何提高 PySerial 读取速度

    我目前正在构建一台使用 Arduino Mega2560 作为主控制器的机器 Arduino 通过串口连接 获取命令 执行它并每 1ms 吐出一堆测量数据 我有一个运行 Python 的 Raspberry Pi 为用户提供一个漂亮的 GU
  • Arduino C++ 析构函数?

    我知道在Arduino中你不能使用delete 那么什么时候调用 C 类中定义的析构函数呢 同样 如果我想创建一个指向数组的指针 我必须使用malloc and free 当对象被销毁时 析构函数被调用 对于自动 堆栈上 变量 它在离开其作
  • 从 iBeacon 接收 BLE 信号到 Bluno(arduino with BLE)

    我想从 iBeacon 到 Bluno 接收 rssi 信号和 UUID Arduino 板具有 BLE 对此有一些疑问 有没有从 BLE 到 BLE 接收 UUID 和 rssi 的解决方案 两个BLE设备可以互相通信吗 我想找一些网站来
  • 当我启动程序时,Arduino IDE (Win10) 崩溃

    我的 Arduino IDE Win10 上的版本为 1 8 12 在启动时崩溃 运行arduino debug exe我收到此错误消息 C Program Files x86 Arduino gt arduino debug exe Se
  • Arduino C++ 代码:可以使用虚函数和异常吗?

    跟进这条评论 https stackoverflow com questions 452139 writing firmware assembly or high level 452401从问题中编写固件 汇编还是高级 https stac
  • 如何在 Arduino 中将 char 变量作为数字打印到串行端口?

    我正在使用 Arduino Uno 我正在从 EEPROM 读取一个字节值并将该值存储在类型变量中char 1 字节 我想将变量的值作为数字 而不是相应的 ASCII 代码 打印到串行监视器 例如考虑char val 5 我想查看串行监视器
  • 无法将 minicom 的输出保存到文件中

    当我使用Minicom从串口捕获数据时 我需要将大数据保存到一个文件中 名为minicom cap 但是 如果我按 Ctrl A 和 L 来捕获文件 则失败 没有创建文件 minicom cap之前并不存在 我的下载目录已正确创建 我的操作
  • Arduino 错误:未命名类型?

    我已经编写了一个库 但遇到错误未命名类型的问题 我已经尝试了一切 搜索了几个小时 但没有运气 库放置在arduino sketch文件夹的 libraries 文件夹中 请帮忙 我使用的是 OSX 但 Windows 上也出现同样的问题 这

随机推荐

  • 安卓手机硬改软件介绍。改机软件 改手机参数

    https www bilibili com video BV1Pp4y1S7hK 视频地址 硬改无需root权限 改完就是新机 手机端能一键操作的都是软改 就好比你女朋友化妆了还是你女朋友 硬改相当于换了一个新的女朋友
  • 初学者应该这样看盘

    首先在 开盘 时要看集合 竞价 的股价和成交额 看是高开还是低开 就是说 和昨天的收盘价相比价格是高了还是低了 它表示出市场的意愿 期待今天的股价是上涨还是下跌 成交量的大小则表示参与买卖的人的多少 它往往对一天之内成交的活跃程度有很大的影
  • Unity3D Glow Effect 自发光 颜色溢出效果

    unity自带的image effect中的一个摄像机特效 但它是针对全屏幕渲染的 而且我们要明确一点 只需你知道我们场景中的GameObject的材质shader通过alpha通道进行控制这个光晕的 也就是说将alpha变成0那么将是原来
  • 合工大 编译原理 实验

    目前仅有实验一二三四 Windows桌面应用程序项目 开发语言 c 开发环境 Visual Studio 实验一 GitHub 实验二 传送门 实验三 传送门 实验四 传送门 实验一大致功能 支持程序运行时输入关键词 支持已保存关键词的表格
  • Ethereum私有网络的搭建

    好久没有弄以太坊 因为工作需要 需要搭建一个以太坊的私有网络 private network 0 实验环境 3台阿里云服务器 Ubuntu 16 04 分别简称为ali1 ali2 ali3 1 Ethereum节点的编译 安装 这一点无需
  • DAY40:贪心算法(九)单调递增的数字(贪心的思路)

    文章目录 738 单调递增的数字 暴力解也需要看一下 暴力解写法 注意 必须引入 isIncreasing 变量的原因 贪心思路 遍历顺序 最开始的写法 debug测试 逻辑错误 修改版 debug测试 int转化为字符串的原因 to st
  • QMap的排序

    QMap排序方法运用实例 QMap的升序排序 巧妙避开默认排序规则 QMap 如何根据value排序 QMap排序方法运用实例 QMap排序方法运用实例 Music 爱好者的博客 CSDN博客 QVector
  • MsSqlServerJdbcUrl encrypt、trustServerCertificate、trustStore、trustStorePassword hostNameInCertif

    原文链接 为了允许应用程序使用 TLS 加密 从 1 2 版开始 Microsoft JDBC Driver for SQL Server 引入了以下连接属性 encrypt trustServerCertificate trustStor
  • 用CH340给STM32C8T6和野火stm32F103Mini板下载程序需要注意的三个问题

    一 给stm32c8t6下载 1 CH340的引脚RX TX的接法 CH340模块与stm32的串口引脚关系为 RX对应TX TX对应RX 通过串口给stm32烧录程序时要用串口1 即用A9和A10脚 其中A9为TX引脚 A10为RX引脚
  • oracle vm virtualbox右ctrl切换显示模式

    virtualbox里面有个HOME键 注意这个HOME键不一定是键盘上的HOME 而是设定的某一个键 默认的右CTRL 就是所说的HOME 有时候设置的自己不知道怎么切换回来或者找不到控制栏了 就可以按快捷切换 快捷键就是右边的Ctrl
  • C++类模板中的友元函数的声明和定义分别放在哪里

    前面提到了模板的声明和定义推荐都放在头文件中 那么该类中的友元函数的声明和定义该放在哪里呢 因为友元函数并不属于这个类 按照习惯 我们一般把声明放在类中 而把定义放在类的外面 但对于类模板来说 这样就出问题了 很多编译器并不支持将友元函数的
  • 生信笔记

    第一个问题 研究最热门的基因是什么 在NCBI的ftp里面关于人的一些基因信息 在 ftp ftp ncbi nlm nih gov gene 下载即可 其中 gene2pubmed gz 这个是NCBI的entrez ID号对应着该基因发
  • wifi和AP共存方案研究--Android8.0

    目录 Android原生不支持Wifi和AP同时打开 Android对同时开Wifi和AP的限制地方 1 设置 2 framework 3 Fwk与HAL层的代理 4 HAL层部分 可能遇到的问题 附 想象这样一个场景 你的手机通过某种方式
  • MIT 6.s081 Lab2 学习笔记

    因为发现写笔记能促进自己学习 提出问题 所以记笔记 risk 5如何启动 其实是通过kernerl kernel ld跳到汇编文件kernel entry S 里面 OUTPUT ARCH riscv ENTRY entry SECTION
  • JAVA中的@interface

    注解 interface不是接口是注解类 在jdk1 5之后加入的功能 使用 interface自定义注解时 自动继承了java lang annotation Annotation接口 在定义注解时 不能继承其他的注解或接口 interf
  • 【笔试强训选择题】Day27.习题(错题)解析

    作者简介 大家好 我是未央 博客首页 未央 303 系列专栏 笔试强训选择题 每日一句 人的一生 可以有所作为的时机只有一次 那就是现在 文章目录 前言 一 Day27习题 错题 解析 总结 前言 1 解析 A 相关知识点 本题主要考察有关
  • linux 如何隐藏 /proc/目录下的文件(version 2.6 其他版本没适配)

    只为研究而用 禁止用于非法行为 通过加载此模块 来将 proc目录下的文件进行隐藏 使用方式 insmod xx ko hidestr xxxx include
  • Django框架 - 应用命名空间app_name和实例命名空间namespace的区别

    Django框架学习笔记 include 区分app name和namespace 文章目录 前言 app name的两种写法 namespace的写法 namespace默认值 namespace的唯一性 app name的唯一性 结论
  • VMware Linux 可视化增加磁盘

    1 VMware 增加磁盘 2 disks挂载磁盘 此处我挂载的是20G磁盘 截图只是用5G的做过程演示例子 3 验证挂载磁盘
  • Arduino智能物流小车各部分功能代码详解(省工程训练能力综合竞赛)

    文章目录 前言 测试部分 循迹部分 超声波测距部分 避障部分 机械臂控制部分 扫码部分 初赛部分 前言 考虑到之前那篇博客写的太简略 也只给了一个最终代码 比较容易让人看不懂 本篇主要写一些不同功能函数的代码讲解 要看整体部分的请前往我的另