×

Arduino ESP32多合一机器人开源

消耗积分:2 | 格式:zip | 大小:0.28 MB | 2022-10-20

李秀兰

分享资料个

描述

嗨,在花了几个晚上做机器人之后,我决定与你分享我的上一份工作。一个基于 Arduino/ESP32 的机器人,能够避开障碍物、跟踪线路、跟随并显示来自摄像头的实时视频。

该机器人驾驶室通过蓝牙(连接到Arduino)或WIFI(ESP32板连接到Arduino)进行控制。

我希望以一种非常简单的方式制作这个机器人的分步指南。

避障机器人是一种完全自主的机器人,它能够避开移动时遇到的任何障碍物。简单的说,当它在前进的过程中遇到障碍物时,会自动停止前进并后退一步。然后它看起来左右两侧并开始以最佳方式移动,这意味着如果右侧有另一个障碍物则向左方向移动,或者如果左侧有另一个障碍物则向右方向移动。避障机器人非常有用,它是许多大型项目的基础,例如自动汽车、制造工厂中使用的机器人,甚至是航天器中使用的机器人。

线路跟踪机器人使用一些红外接近传感器来检测线路,并根据从传感器接收到的输入,Arduino 将在电机驱动器的帮助下引导电机移动。

跟随机器人使用接近传感器,可以检测附近的任何物体并跟随该物体。如果您来到机器人前面,它会开始跟随您。该机器人由超声波传感器和红外传感器组成,有助于跟踪物体。这就像机器人只有避障,但在工作中是相反的。它使用了 2 个红外传感器和一个超声波传感器。红外传感器用于跟随人或物体,超声波传感器用于移动机器人。

蓝牙机器人可以通过连接到 Arduino 的蓝牙设备进行控制我开发了一个可以控制机器人方向和激活动作模式的 Android 应用程序。

ESP32板可以通过WIFI传输实时视频。我开发了一个 Android 应用程序,您可以在其中看到机器人运动过程中的实时视频。您可以将机器人用作物联网设备。

补给品

pYYBAGNPQvCAEHGHAAkBtLc4qJA850.jpg
 

组装底部机箱

 
 
 
pYYBAGNPQvaAceucAAZwGZwEIHs887.jpg
 
1 / 11
 

将底部机箱放在一个平面上,然后将双 H 桥 L298N 安装在其上(使用 4 个螺钉)。

注意双 H 桥方向(参见图片以供参考)。

使用较长的螺钉和螺母将 4 直流电机安装在底盘上(参见图片以供参考)。

按照架构将 4 直流电机连接到双 H 桥 L298N。请记住,双 H 桥 L298N 能够控制 2 个直流电机,我们必须将右电机和左电机连接在一起。

使用孔将 5V 5 路跟踪模块组装在底部机箱的前部位置(参见图片以供参考)。对于此步骤,您必须使用 2 个印刷垫片和 2 个 M2 螺母/螺钉。

使用小 M3 螺钉将 4 Standoff M3x50mm 拧到底部机箱上。该支架将用于将底架与顶架固定

组装顶部机箱

 
 
 
poYBAGNPQvuAI3N0AAjbOilL3v0733.jpg
 
1 / 6
 

将顶部机箱放在平面上并将 Arduino 板安装在其上(使用 4 个螺钉)。

将 Arduino Sensor Shield V5.0 放在 Arduino 板的顶部,注意将相应的引脚耦合在一起。

用螺钉将 2 IR 传感器安装在机箱上。使用底盘上的定向支撑,以使传感器定向为 30°。这一步很重要,因为红外传感器用于检查机器人左右两侧的障碍物。

将 Micro 伺服 SG90 安装在机箱方孔上。使用 2 个螺丝固定。

用螺丝将蜂鸣器模块安装在机箱上。使用正确方向的支撑。

用 2 颗螺丝将电池座安装在机箱上。使用正确方向的支撑。

您现在已经组装了顶部和底部机箱。好工作。

让我们继续其他步骤。

准备超声波传感器和 ESP32 CAM

 
 
 
pYYBAGNPQwGAcvCuAAMqxE1uDiQ050.jpg
 
1 / 5
 

使用 3D 打印面部支架并将超声波传感器 HC-SR04 插入 2 圆孔中。

然后将Holder安装在已经安装在底盘上的微伺服上。

使用 4 母对母电缆连接超声波传感器 HC-SR04。

将 ESP32 Cam 安装在 3D 打印的面部支架上。

使用 2 根母对母电缆(5V 和 GND)连接 ESP32 Cam。

接线组件

 
 
 
poYBAGNPQwOAE6gPAAD0AQQpZcg065.jpg
 
1 / 9
 

现在我们可以开始给智能汽车接线了。

在将机箱组装在一起之前,我们必须将组件连接到底部机箱上,以便使用孔穿过。

使用 5 母-母电缆将跟踪模块 5V 5 路连接到底部机箱上。

使用 6 母-母电缆将双 H 桥 L298N 连接到底部机箱上。

使用 2 公公电缆连接 GND、5V 端口。

将双 H 桥上的 GND、12V 端口连接到电池座。重要提示:将电源开关置于 OFF 位置。

现在您可以使用顶部机箱上的孔穿过之前接线的母-母电缆。不要忘记微伺服电缆。

将 Top Cassis 放在顶部并使用 M3 螺钉将其与底部机箱固定。

现在我们可以继续连接顶部机箱上的其他组件。

使用 3 根母对母电缆连接顶部机箱上的两个 IR 传感器。

使用 3 根母对母电缆连接顶部机箱上的蜂鸣器模块。

尝试使用弹性或类似的东西将所有电缆放在一起。

接线细节:

L298N电机驱动器:

+12V → 锂电池 (+)

GND → Lipo 电池 (-)重要:将 GND 连接到 lipo 电池 (-) 和 arduino 板的任何 GND 引脚

+5V → arduino Vin

EnA → arduino 数字引脚 3

In1 → arduino 数字引脚 4

In2 → arduino 数字引脚 5

In3 → arduino 数字引脚 6

In4 → arduino 数字引脚 7

EnB → arduino 数字引脚 11

OUT1 → 电机 FWD+BWD 右

OUT2 → 电机 FWD+BWD 右

OUT3 → 电机 FWD+BWD 左

OUT4 → 电机 FWD+BWD 左

蜂鸣器模块:

GND → Arduino V

VCC → Arduino G

I/O → arduino 数字引脚 13

微伺服:

GND → Arduino V

VCC → Arduino G

IN → arduino 数字引脚 12

红外右传感器:

GND → Arduino V

VCC → Arduino G

OUT → arduino 数字引脚 2

红外左传感器:

GND → Arduino V

VCC → Arduino G

OUT → arduino 数字引脚 8

HC-SR04 超声波

声纳传感器:

VCC → Arduino URF +5V

Trig → arduino URF 模拟引脚 2

Echo → arduino URF 模拟引脚 3

GND → Arduino URF GND

跟踪模块:

GND → Arduino G

5V → Arduino V

OUT2 → arduino 模拟引脚 4

OUT3 → arduino 模拟引脚 1

OUT4 → arduino 模拟引脚 0

蓝牙模块 HC-06

GND → Arduino G

5V → Arduino V

TX → Arduino RX

RX → arduino TX

ESP32 凸轮

GND → Arduino G

5V → Arduino V

RX → arduino TX重要:连接时必须断开蓝牙

带电压读取器的面包板

pYYBAGNPQwWAbklDAAAXw-B90uo215.jpg
 

使用粘合剂将迷你面包板安装在顶部机箱上。

使用公公电缆将双 H 桥上的 12V 端口连接到面包板。

电池电压(100k和1M电阻串联)

100k电阻→12V

100k/1M 电阻 → arduino 模拟引脚 5

1M电阻→arduino G

迷你面包板也可用于您自己的实验!

完成组装

 
 
 
poYBAGNPQuyAGBHRAAdKjx19z3s193.jpg
 
1 / 2
 

现在您可以完成组装 4 个塑料轮并将所有电线组合在一起的工作。

编程 Arduino UNO

poYBAGNPQwyAML5lAADe6n13y00234.jpg

创建一个名为 \Catosci_SmartCar 的文件夹并保存所有 .ino、.cpp 和 .h 文件。

在 Arduino IDE 上打开 Catosci_SmartCar.ino 文件并上传到 Arduino 板。

重要提示:请记住在连接 USB 数据线之前断开蓝牙
/**********************************************************************
  Filename    : Catosci_SmartCar.ino
  Product     : Catosci 4WD Car for UNO
  Description : A Multifunctional Bluetooth Remote Car.
  Auther      : Carlo Iurisci
  Modification: 2022/03/25
**********************************************************************/
#include "Catosci_4WD_Car_for_Arduino.h"
#include "Automatic_Obstacle_Avoidance_Mode.h"
#include "Automatic_Tracking_Line_Mode.h"
#include "BluetoothOrders.h"

#define UPLOAD_VOL_TIME    3000
#define UPLOAD_DATA_TIME   500
#define COMMANDS_COUNT_MAX  8
#define INTERVAL_CHAR '@'


//#define DEBUG


u32 lastUploadVoltageTime;
u32 lastUploadDataTime;
String inputStringBLE = "";
bool stringComplete = false;
int paramters[COMMANDS_COUNT_MAX], paramterCount = 0;
int bleCarMode = MODE_NONE;

void setup() {
  pinsSetup();
  Serial.begin(9600);
  servoSetup();
//  while (!strip.begin());
//  strip.setAllLedsColor(0xFF0000);
}


void loop() {
  // invia misura Vbatteria all'App ogni UPLOAD_VOL_TIME
  upLoadVoltageToApp();
  // invia lettura sensori all'App ogni UPLOAD_DATA_TIME
  upLoadAndReadSonarValueToApp();
  
  if (stringComplete) {         //da eseguiro solo alla ricezione di un comando
    String inputCommandArray[COMMANDS_COUNT_MAX];


    String inputStringTemp = inputStringBLE;
    for (u8 i = 0; i < COMMANDS_COUNT_MAX; i++) {
      int index = inputStringTemp.indexOf(INTERVAL_CHAR);
      if (index < 0) {
        break;
      }
      paramterCount = i;  //
      inputCommandArray[i] = inputStringTemp.substring(0, index);
      inputStringTemp = inputStringTemp.substring(index + 1);
      paramters[i] = inputCommandArray[i].toInt();
    }
    stringComplete = false;
    inputStringBLE = "";


    char commandChar = inputCommandArray[0].charAt(0);
    switch (commandChar)
    {
      case ACTION_MOVE:
        if (paramterCount == 2) {
          motorRun(paramters[1], paramters[2]); //app contol catoscicar_speed is 0 ~ 100 ,pwm is 0~255
        }
        break;
      case ACTION_CAR_MODE:
        if (paramterCount == 1) {
          bleCarMode = paramters[1];
          switch (bleCarMode)
          {
            case MODE_NONE: case MODE_GRAVITY:
              resetCarAction();
              writeServo(OA_SERVO_CENTER);
              break;
            case MODE_ULTRASONIC: 
              oa_CalculateVoltageCompensation();
              break;
            case MODE_ULTRASONIC_NOIR:
              oa_CalculateVoltageCompensation();
              break;
            case MODE_FOLLOW:
              oa_CalculateVoltageCompensation();
              break;           
            case MODE_TRACKING:
              tk_CalculateVoltageCompensation();
              break;
            default:
              break;
          }
        }
        break;
      case ACTION_BUZZER:
        if (paramterCount == 1) {
          setBuzzer(paramters[1]);
        }
        break;
      default:
        break;
    }
  }


  switch (bleCarMode) //loop per modalità di controllo
  {
    case MODE_NONE: case MODE_GRAVITY:
      break;
    case MODE_ULTRASONIC: 
      updateAutomaticObstacleAvoidance();
      break;
    case MODE_ULTRASONIC_NOIR:
      updateAutomaticObstacleAvoidanceNoInfrared();
      break;
    case MODE_FOLLOW:
      UltrasonicFollow();
      break;           
    case MODE_TRACKING:
      updateAutomaticTrackingLine();
      break;
    default:
      break;
  }

void upLoadVoltageToApp() {
  int voltage = 0;
  if (millis() - lastUploadVoltageTime > UPLOAD_VOL_TIME) {
    if (getBatteryVoltage()) {
      voltage = batteryVoltage * 1000;
    }
    String sendString = String(ACTION_GET_VOLTAGE) + String(INTERVAL_CHAR) + String((voltage)) + String(INTERVAL_CHAR);
    Serial.println(sendString);
    
    lastUploadVoltageTime = millis();
  }
}

void upLoadAndReadSonarValueToApp() {
  // invia lettura sensori all'App
  if (millis() - lastUploadDataTime > UPLOAD_DATA_TIME) {
    String sendString = String(ACTION_ULTRASONIC)+String(INTERVAL_CHAR)+String(getSonar());
    sendString += String(INTERVAL_CHAR)+ String(digitalRead(IR_AVOIDANCE_RIGHT_PIN));
    sendString += String(INTERVAL_CHAR) + String(digitalRead(IR_AVOIDANCE_LEFT_PIN)) + String(INTERVAL_CHAR);
    Serial.println(sendString);
    
    lastUploadDataTime = millis();
  }
}


void serialEvent() {
  while (Serial.available()) {
    char inChar = (char)Serial.read();
    inputStringBLE += inChar;
    if (inChar == '\n') {
      stringComplete = true;
      Serial.println(inputStringBLE);
    }
  }
}

上传完成后,代码将开始运行。

迷你伺服将定位到 90°。

重要提示:如果需要,将面支架重新定位在伺服器上。

您现在可以使用串行命令测试机器人运动和动作模式。

以下是串行命令的说明:

#define ACTION_MOVE        'A'  //control movement of the smartcar A#speedl#speedr#
#define ACTION_CAR_MODE    'H'  //smartcar mode.
//        H#MODE_NONE->stop
//        H#MODE_GRAVITY->stop
//        H#MODE_ULTRASONIC->obstacle avoidance with sonar and ir
//        H#MODE_ULTRASONIC_NOIR->obstacle avoidance with sonar and no-ir
//        H#MODE_TRACKING->tracking with ir
//        H#MODE_FOLLOW->follow with sonar and ir
#define ACTION_BUZZER      'D'  //control buzzer          D#1# buzzer on / D#0# buzzer off
#define MODE_NONE            0
#define MODE_GRAVITY         1
#define MODE_ULTRASONIC      2
#define MODE_ULTRASONIC_NOIR 3
#define MODE_TRACKING        4
#define MODE_FOLLOW          5

编程 ESP32 CAM

pYYBAGNPQw6AMhySAABLarQ6hQ4876.jpg
 

现在是时候对 ESP32 CAM 进行编程以传输实时视频了。按照本教程使用 FTDI 编程器将 ESP32 CAM 连接到您的笔记本电脑/计算机 USB。

https://randomnerdtutorials.com/program-upload-code-esp32-cam/

创建一个名为\esp32cam-robot的文件夹并保存 app_httpd.cpp ,esp32cam-robot.ino。

在 Arduino IDE 上打开esp32cam-robot.ino文件。

在上传代码之前,您需要在以下变量中插入您的网络凭据:

const char* ssid = "REPLACE_WITH_YOUR_SSID";
const char* password = "REPLACE_WITH_YOUR_PASSWORD";

然后,单击Arduino IDE 中的上传按钮

当您开始在调试窗口上看到一些点时,按下 ESP32-CAM 板载 RST 按钮。

几秒钟后,代码应该成功上传到您的板上。

当您看到“ Done uploading ”消息时,您需要从 GND 移除 GPIO 0 并按下 RST 按钮以运行您的新代码。

在串行监视器上,您应该看到类似这样的内容。记下 ESP32 IP 地址

20:43:13.775 -> ..........
20:43:18.265 -> WiFi connected
20:43:18.265 -> Camera Ready! Use 'http://192.168.1.27' to connect
20:43:18.359 -> Starting web server on port: '80'
20:43:18.359 -> Starting stream server on port: '81'

安卓应用

 
 
 
poYBAGNPQxGAYoMQAAGNrdIG7Mo555.jpg
 
1 / 2
 

您现在可以使用我开发的应用程序通过蓝牙控制机器人并通过 wifi 观看实时视频。

 


声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

评论(0)
发评论

下载排行榜

全部0条评论

快来发表一下你的评论吧 !