基于arduino的5路循迹小车(4)与舵机控制板的通信控制

2023-11-05

基于arduino的5路循迹小车(4)
arduino与舵机控制板的通信控制
以及语音播报模块
接第一篇链接 https://blog.csdn.net/weixin_45984029/article/details/103437347

1.硬件选用

1.舵机控制板
在这里插入图片描述
2.语音播报模块
在这里插入图片描述

2.接线

1.舵机控制板

开发板与舵机控制板的TX,RX交叉相连,VCC,GND对应相连

2.语音播报模块
VCC,GND与开发板对应相连
语音播报模块的每一个触发端子与开发板的数字端相连(具体位置对应代码)

3.代码

#include <LobotServoController.h>

LobotServoController myse;

int Left_motor_go1 = 24;        //左电机前进 AIN1
int Left_motor_back1 = 25;      //左电机后退 AIN2

int Right_motor_go1 = 22;       //右电机前进 BIN1
int Right_motor_back1 = 23;     //右电机后退 BIN2

int Left_motor_pwm1 = 3;       //左电机控速 PWMA1
int Right_motor_pwm1= 5;      //右电机控速 PWMB1
int Left_motor_pwm2 = 4;       //左电机控速 PWMA2
int Right_motor_pwm2= 6;      //右电机控速 PWMB2

//循迹红外引脚定义
//TrackSensorLeftPin1 TrackSensorLeftPin2 TrackSensorMid TrackSensorRightPin1 TrackSensorRightPin2 
//      A1                   A2                  A3                   A4                A5
const int TrackSensorLeftPin1  =  A1;  //定义第一个循迹红外传感器引脚为A1
const int TrackSensorLeftPin2  =  A2;  //定义第二个循迹红外传感器引脚为A2
const int TrackSensorMid = A3;       //定义第三个循迹红外传感器引脚为A3
const int TrackSensorRightPin1 =  A4;  //定义第四个循迹红外传感器引脚为A4
const int TrackSensorRightPin2 =  A5;  //定义第五个循迹红外传感器引脚为A5

// TrackSensorRightPin3 进行计数
//        A6              
const int TrackSensorRightPin3 =  A6;  //右主计数 

//定义计数变量
int JS2;

//定义各个循迹红外引脚采集的数据的变量
int SLL;
int SL;
int SM;
int SR;
int SRR;

int echoPin   = 32; //超声波
int trigPin   = 33;
unsigned int S;

int a;
int i;

int G1 = 26;
int G2 = 27;
int G3 = 28;
int G4 = 29;
int G5 = 30;

void setup()
{ 
  Serial.begin(9600);//超声波
  Serial1.begin(9600);
  
  pinMode(13,OUTPUT);
  
  digitalWrite(13,LOW);
  while(!Serial1);
  digitalWrite(13,HIGH);
  
  pinMode(trigPin, OUTPUT);
  pinMode(echoPin, INPUT);

  //初始化语音输出
  pinMode(G1, OUTPUT);
  pinMode(G2, OUTPUT);
  pinMode(G3, OUTPUT);
  pinMode(G4, OUTPUT);
  pinMode(G5, OUTPUT);

  digitalWrite(G1, HIGH);
  digitalWrite(G2, HIGH);
  digitalWrite(G3, HIGH);
  digitalWrite(G4, HIGH);
  digitalWrite(G5, HIGH);
  
  //初始化电机驱动IO口为输出方式
  pinMode(Left_motor_go1, OUTPUT);
  pinMode(Left_motor_back1, OUTPUT);
  pinMode(Right_motor_go1, OUTPUT);
  pinMode(Right_motor_back1, OUTPUT);

   //定义四路循迹红外传感器为输入接口
  pinMode(TrackSensorLeftPin1, INPUT);
  pinMode(TrackSensorLeftPin2, INPUT);
  pinMode(TrackSensorMid,INPUT);
  pinMode(TrackSensorRightPin1, INPUT);
  pinMode(TrackSensorRightPin2, INPUT);

   //四路循迹红外传感器初始化为高电平
  digitalWrite(TrackSensorLeftPin1, HIGH);
  digitalWrite(TrackSensorLeftPin2, HIGH);
  digitalWrite(TrackSensorMid,HIGH);
  digitalWrite(TrackSensorRightPin1, HIGH);
  digitalWrite(TrackSensorRightPin2, HIGH);

  digitalWrite(G1, LOW);//播报第一条语音
}

void run(int left_speed, int right_speed)
{
  //左电机前进
  digitalWrite(Left_motor_go1, LOW);   //左电机前进使能
  digitalWrite(Left_motor_back1, HIGH);  //左电机后退禁止
  analogWrite(Left_motor_pwm1, LOW);
  analogWrite(Left_motor_pwm2, left_speed);
  //右电机前进
  digitalWrite(Right_motor_go1, LOW);  //右电机前进使能
  digitalWrite(Right_motor_back1, HIGH); //右电机后退禁止
  analogWrite(Right_motor_pwm1, LOW);
  analogWrite(Right_motor_pwm2, right_speed);
}

void  left(int left_speed, int right_speed)
{
  //左电机后退
  digitalWrite(Left_motor_go1, HIGH);    //左电机前进禁止
  digitalWrite(Left_motor_back1,LOW);  //左电机后退禁止
  analogWrite(Left_motor_pwm2, left_speed);
  analogWrite(Left_motor_pwm1,LOW);

  //右电机前进
  digitalWrite(Right_motor_go1, LOW);  //右电机前进使能
  digitalWrite(Right_motor_back1, HIGH); //右电机后退禁止
  analogWrite(Right_motor_pwm2, LOW);
  analogWrite(Right_motor_pwm1, right_speed);
}

void right(int left_speed, int right_speed)
{
  //左电机前进
  digitalWrite(Left_motor_go1, LOW);   //左电机前进使能
  digitalWrite(Left_motor_back1, HIGH);  //左电机后退禁止
  analogWrite(Left_motor_pwm2, LOW);
  analogWrite(Left_motor_pwm1, left_speed);

  //右电机后退
  digitalWrite(Right_motor_go1, HIGH );   //右电机前进禁止
  digitalWrite(Right_motor_back1,LOW); //右电机后退禁止
  analogWrite(Right_motor_pwm2, right_speed);
  analogWrite(Right_motor_pwm1, LOW );

}

void barke(int left_speed, int right_speed)
{
  //左电机停止
  digitalWrite(Left_motor_go1, HIGH);   //左电机前进使能
  digitalWrite(Left_motor_back1, HIGH);  //左电机后退禁止
  analogWrite(Left_motor_pwm1, left_speed);
  analogWrite(Left_motor_pwm2, left_speed);

  //右电机停止
  digitalWrite(Right_motor_go1, HIGH );   //右电机前进禁止
  digitalWrite(Right_motor_back1,HIGH); //右电机后退禁止
  analogWrite(Right_motor_pwm1, right_speed);
  analogWrite(Right_motor_pwm2, right_speed);
  
}

void back(int left_speed, int right_speed)
{
  //左电机后退
  digitalWrite(Left_motor_go1, HIGH);   //左电机前进禁止
  digitalWrite(Left_motor_back1, LOW);  //左电机后退使能
  analogWrite(Left_motor_pwm1, left_speed);
  analogWrite(Left_motor_pwm2, LOW);
  //右电机后退
  digitalWrite(Right_motor_go1, HIGH);  //右电机前进禁止
  digitalWrite(Right_motor_back1, LOW); //右电机后退使能
  analogWrite(Right_motor_pwm1, right_speed);
  analogWrite(Right_motor_pwm2, LOW);
}

void bank(int left_speed, int right_speed)//惯性停车
{
  //左电机空
  digitalWrite(Left_motor_go1, LOW);   //左电机前进禁止
  digitalWrite(Left_motor_back1, LOW);  //左电机后退禁止
  analogWrite(Left_motor_pwm1, left_speed);
  analogWrite(Left_motor_pwm2, left_speed);

  //右电机空
  digitalWrite(Right_motor_go1, LOW);   //右电机前进禁止
  digitalWrite(Right_motor_back1,LOW); //右电机后退禁止
  analogWrite(Right_motor_pwm1, right_speed);
  analogWrite(Right_motor_pwm2, right_speed);
}

void xunji()//循迹
{
  a = 0;
  //检测到黑线时循迹模块相应的指示灯灭,端口电平为HIGH
  //未检测到黑线时循迹模块相应的指示灯亮,端口电平为LOW
  
  SLL  = digitalRead(TrackSensorLeftPin1);
  SL  = digitalRead(TrackSensorLeftPin2);
  SM = digitalRead(TrackSensorMid);
  SR = digitalRead(TrackSensorRightPin1);
  SRR = digitalRead(TrackSensorRightPin2);

  //计数

  JS2 = digitalRead(TrackSensorRightPin3);

 //循迹
  if( SM == HIGH )
  {
      run(45,37);                                                                                                                  
  }
  if( SL == HIGH && SM == LOW)
  {
    
    left(35,57);
  }
  if( SLL == HIGH && SM == LOW)
  {
    
    left(35,57);
  }
  if( SR == HIGH && SM == LOW)
  {
    
    right(50,32);
  }
  if( SRR == HIGH && SM == LOW)
  {
    right(50,32);
  }
  if(SR == HIGH && SRR == HIGH)
 {
  right(50,32);
 }
 if(SL == HIGH && SLL == HIGH)
 {
  left(30,57);
 }
  if(SRR == HIGH && SR == HIGH && SM == HIGH && SL == HIGH)
 {
  right(50,32);
 }

  if(SM == HIGH && (SL == HIGH && SLL == HIGH) || (SR == HIGH && SL == HIGH) || (SR == HIGH && SRR == HIGH))
 {
  run(45,37);
 }

}

void loop()
{
  xunji();//调用循迹
if(JS2 == HIGH)
   {
    a++;
    i++;

    if(a == 1)
    {
    barke(120,120);//停车
    delay(650);
    bank(0,0);
    delay(1000);
   
     if(i == 1)
    {
      
      digitalWrite(G2, LOW);//语音播报第二条语音
      myse.runActionGroup(100,1);  //运行100号识别1组
      delay(2000);
      /*scan();//识别
      shangp();*/
      myse.runActionGroup(26,1);
      delay(16000);
    }
    if(i == 2)
    {
      myse.runActionGroup(100,1);  //运行100号识别1组
      delay(2000);
      /*scan();//识别
      shangp();*/
      myse.runActionGroup(27,1);
      delay(16000);
    }
    if(i == 3)
    {
      myse.runActionGroup(100,1);  //运行100号识别1组
      delay(2000);
      /*scan();//识别
      shangp();*/
      myse.runActionGroup(28,1);
      delay(16000);
      myse.runActionGroup(110,1);  //运行110号动作组
      delay(4000);
      bank(0,0);
      delay(1000);
      run(42,34);
      delay(300);
      run(15,8);
      delay(500);
    }
    if(i == 4)
    {
      myse.runActionGroup(98,1);  //运行98号动作组
      delay(2000);
      run(50,42);
      delay(400);
     return;
    }
    
    if(i == 5)//下料
    {
      
      /*scan();//识别
      fangp();*/
    }
    if(i == 6)
    {
      
      /*scan();//识别
      fangp();*/
    }
    if(i == 7)
    {
      
      /*scan();//识别
      fangp();*/
    }
    if(i == 8)
    {
      digitalWrite(G5, LOW);
      myse.runActionGroup(81,1);  //运行101号识别2组
      delay(16000);
      /*myse.runActionGroup(101,1);  //运行101号识别2组
      delay(4000);
      scan();//识别
      fangp();*/
    }
    if(i == 9)
    {
      myse.runActionGroup(82,1);  //运行101号识别2组
      delay(16000);
      /*myse.runActionGroup(101,1);  //运行101号识别2组
      delay(4000);
      scan();//识别
      fangp();*/
    }
    if(i == 10)
    {
      myse.runActionGroup(83,1);  //运行101号识别2组
      delay(16000);
      /*myse.runActionGroup(101,1);  //运行101号识别2组
      delay(4000);
      scan();//识别
      fangp();*/
    }
      run(100,90);
      delay(200);
      return;
      
    }
   }
   range();//超声波检测
}
void range()
{ 
 digitalWrite(trigPin,LOW); //测距
 delayMicroseconds(2); //延时2微秒
 digitalWrite(trigPin,HIGH);
 delayMicroseconds(20);
 digitalWrite(trigPin,LOW);
 int distance = pulseIn(echoPin,HIGH); //读取高电平时间
 distance = distance/58; 
 S = distance; //把值赋给S
 if( S < 16 )//小于16厘米时,调用避障程序
      { 
      BZ();
      }
}

void BZ()//避障程序
{
  barke(120,120);
  delay(600);
  bank(0,0);
  delay(300);
  
  back(45,37);
  delay(300);
  barke(120,120);
  delay(300);
  bank(0,0);
  delay(300);
  
  left(55,65);
  delay(700);
  run(55,55);
  delay(1000);
  right(55,45);
  delay(400);
  run(55,55);
  delay(1000);
  right(55,45);
  delay(400);
  run(55,55);
  delay(1046);
  left(55,55);
  delay(550);
}

4.测试小车

在IDE中必须要加载舵机控制板的库,不然无法控制舵机

动作组直接保存在舵机控制板中,开发板直接调用

语音播报模块低电平触发一次,播报一次对应音频文件

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

基于arduino的5路循迹小车(4)与舵机控制板的通信控制 的相关文章

  • 如何使用 PHP 读取串口 [重复]

    这个问题在这里已经有答案了 如何使用 php 从连接到我的服务器 运行 kali linux 的旧笔记本电脑 上的 COM 端口的 arduino 读取串行数据 以便我可以在网页上显示数据 我读过有关同一问题的其他问题 所有这些问题要么超级
  • Arduino:字符串到整数得到奇怪的值

    我想转换一个String to an int 我所能找到的就是你必须将 String 转换为 char 数组 然后将该数组转换为int 但我的代码产生奇怪的值 我无法弄清楚问题是什么 void ledDimm String command
  • 蓝牙 HC-05 发送错误 1F 仅适用于 INQ 命令

    我的新蓝牙 HC 05 模块有问题 在 AT 模式下 它可以与我需要的所有命令完美配合 除了 INQ 我已经尝试事先发送一大堆其他命令 AT INIT OK AT ORGL OK AT ROLE 1 OK AT CLASS 0 OK 他们都
  • PySerial 从 Arduino 读取线路的延迟

    我正在使用带有基本 DigitalReadSerial 设置的 arduino uno 如下所述 http arduino cc en Tutorial DigitalReadSerial http arduino cc en Tutori
  • Arduino:使用串口和软件串口与蓝牙模块

    我的目的是使用 Arduino 通过 HC 05 蓝牙模块在 PC 和 Android 设备之间建立通信 我使用 PC 和 Arduino 串行监视器 之间的 USB 通信以及 SoftwareSerial 来连接到 HC 05 我的问题是
  • 如何将 ASCII char 转换为其 ASCII int 值?

    我想将 char 转换为它的ASCII http en wikipedia org wiki ASCIIint 值 我可以用所有可能的值填充一个数组并与其进行比较 但这对我来说似乎不正确 我想要类似的东西 char mychar k pub
  • Java RXTX 库不加载本机库

    基本上我想使用 Arduino 编写一个简单的通信工具java 的 RXTX 库 http rxtx qbang org wiki index php Main Page并且在加载动态库时严重失败 我的系统规格 操作系统 OS X 优胜美地
  • Python自动选择串口(适用于Arduino)

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

    我一直在研究 LoNet 迷你 GSM 模块 SIM800L 并将其与 Arduino 连接 我已插入 SIM 移动卡并且可以连接互联网 通过串行监视器 我可以毫无问题地与它通信 但是当向网络服务器页面发出 GET 或 POST 请求时 它
  • ESP32 Arduino-ide如何获取唯一id

    我试图自动为每个 esp32 设置一个唯一的 id 在我使用提供该方法的 ESP IDF 框架对设备进行编程之前esp efuse mac get default 这将返回一个 8 字节值 该值在我手上的所有设备上都是唯一的 在arduin
  • Arduino从SD卡读取最后一行

    我对 Arduino 业务还很陌生 如何从 SD 卡读取最后一行 通过以下代码片段 我可以读取第一行 n 之前的所有字符 现在我想添加一个 向后 声明 或其他内容 到目前为止我的代码 include
  • AVRDUDE Android Arduino ioctl 错误

    我之前的问题 Android 无法使用 AVRDUDE 与 Arduino 通信 https stackoverflow com questions 15596376 android cannot talk to arduino using
  • 使用 Java 控制 Arduino

    我正在寻找一个LED http en wikipedia org wiki Light emitting diode用Java程序打开和关闭 我用 C 完成了这个项目大约 5 分钟 但用 Java 似乎更具挑战性 我让 Arduino 等待
  • 如何使用GSM模块SIM800和Arduino Uno发送短信?

    我正在尝试通过 SIM800 GSM 模块从 Arduino 发送短信 消息到达给定号码 但格式不正确 它显示 消息格式不支持 我在这里添加了我的代码 非常感谢您的快速回复 include
  • 使用 Ardulink 命令 Arduino Uno

    我试图在我的 JAVA 应用程序中使用 Ardulink 库来命令我的 Arduino Uno 但没有成功 我不知道我错过了什么 这是我的代码 Link link Link getDefaultInstance boolean connec
  • 通过iPhone音频插孔读取数据

    我正在寻找一种方法来读取通过 iPhone 的音频插孔从 Arduino 发送的原始数据 我搜索了很多并发现this https github com sanjibahmad Is Headphone Plugged In tree mas
  • 在链接时合并全局数组/从多个编译单元填充全局数组

    我想定义一系列的东西 比如事件处理程序 的内容 该数组在编译时是完全已知的 但定义在 多个编译单元 分布在多个库中 至少在最终 静态 链接之前是相当解耦的 我想要 也保持这种方式 因此添加或删除编译单元将 还可以自动管理事件处理程序 而无需
  • Python串口通信

    我正在开发一个 Arduino 项目 由于内存限制 我将其与 Python 脚本连接起来 在Python方面 我有一个二维矩阵 其中包含各自的x y坐标值 并且在此列表中有26000个坐标对 因此 为了向大家澄清数据结构 pathlist
  • ESP32:dsb1820 温度传感器给出恒定的负 127 读数

    我正在尝试使用连接到 esp32 微控制器的单个 dsb1820 温度传感器来获取温度读数 传感器连接到 esp32 的 GPIO 4 我打算将温度读数发送到云端 我面临的问题是温度读数总是给出值 127 我在网上某处读到 当 dsb182
  • 仅从日期计算夏令时

    我正在使用 Arduino 和实时时钟芯片 该芯片补偿了闰年等 因此它始终具有正确的日期 但我认为由于区域复杂性 它不处理夏令时 时钟可以给出日 月 年 从 1 开始 以及星期几 星期日 0 到星期六 6 因为我需要与用户输入的日期和时间进

随机推荐