嗨,在花了几个晚上做机器人之后,我决定与你分享我的上一份工作。一个基于 Arduino/ESP32 的机器人,能够避开障碍物、跟踪线路、跟随并显示来自摄像头的实时视频。
该机器人驾驶室通过蓝牙(连接到Arduino)或WIFI(ESP32板连接到Arduino)进行控制。
我希望以一种非常简单的方式制作这个机器人的分步指南。
避障机器人是一种完全自主的机器人,它能够避开移动时遇到的任何障碍物。简单的说,当它在前进的过程中遇到障碍物时,会自动停止前进并后退一步。然后它看起来左右两侧并开始以最佳方式移动,这意味着如果右侧有另一个障碍物则向左方向移动,或者如果左侧有另一个障碍物则向右方向移动。避障机器人非常有用,它是许多大型项目的基础,例如自动汽车、制造工厂中使用的机器人,甚至是航天器中使用的机器人。
线路跟踪机器人使用一些红外接近传感器来检测线路,并根据从传感器接收到的输入,Arduino 将在电机驱动器的帮助下引导电机移动。
跟随机器人使用接近传感器,可以检测附近的任何物体并跟随该物体。如果您来到机器人前面,它会开始跟随您。该机器人由超声波传感器和红外传感器组成,有助于跟踪物体。这就像机器人只有避障,但在工作中是相反的。它使用了 2 个红外传感器和一个超声波传感器。红外传感器用于跟随人或物体,超声波传感器用于移动机器人。
蓝牙机器人可以通过连接到 Arduino 的蓝牙设备进行控制。我开发了一个可以控制机器人方向和激活动作模式的 Android 应用程序。
ESP32板可以通过WIFI传输实时视频。我开发了一个 Android 应用程序,您可以在其中看到机器人运动过程中的实时视频。您可以将机器人用作物联网设备。
将底部机箱放在一个平面上,然后将双 H 桥 L298N 安装在其上(使用 4 个螺钉)。
注意双 H 桥方向(参见图片以供参考)。
使用较长的螺钉和螺母将 4 直流电机安装在底盘上(参见图片以供参考)。
按照架构将 4 直流电机连接到双 H 桥 L298N。请记住,双 H 桥 L298N 能够控制 2 个直流电机,我们必须将右电机和左电机连接在一起。
使用孔将 5V 5 路跟踪模块组装在底部机箱的前部位置(参见图片以供参考)。对于此步骤,您必须使用 2 个印刷垫片和 2 个 M2 螺母/螺钉。
使用小 M3 螺钉将 4 Standoff M3x50mm 拧到底部机箱上。该支架将用于将底架与顶架固定
将顶部机箱放在平面上并将 Arduino 板安装在其上(使用 4 个螺钉)。
将 Arduino Sensor Shield V5.0 放在 Arduino 板的顶部,注意将相应的引脚耦合在一起。
用螺钉将 2 IR 传感器安装在机箱上。使用底盘上的定向支撑,以使传感器定向为 30°。这一步很重要,因为红外传感器用于检查机器人左右两侧的障碍物。
将 Micro 伺服 SG90 安装在机箱方孔上。使用 2 个螺丝固定。
用螺丝将蜂鸣器模块安装在机箱上。使用正确方向的支撑。
用 2 颗螺丝将电池座安装在机箱上。使用正确方向的支撑。
您现在已经组装了顶部和底部机箱。好工作。
让我们继续其他步骤。
使用 3D 打印面部支架并将超声波传感器 HC-SR04 插入 2 圆孔中。
然后将Holder安装在已经安装在底盘上的微伺服上。
使用 4 母对母电缆连接超声波传感器 HC-SR04。
将 ESP32 Cam 安装在 3D 打印的面部支架上。
使用 2 根母对母电缆(5V 和 GND)连接 ESP32 Cam。
现在我们可以开始给智能汽车接线了。
在将机箱组装在一起之前,我们必须将组件连接到底部机箱上,以便使用孔穿过。
使用 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重要:连接时必须断开蓝牙
使用粘合剂将迷你面包板安装在顶部机箱上。
使用公公电缆将双 H 桥上的 12V 端口连接到面包板。
电池电压(100k和1M电阻串联)
100k电阻→12V
100k/1M 电阻 → arduino 模拟引脚 5
1M电阻→arduino G
迷你面包板也可用于您自己的实验!
现在您可以完成组装 4 个塑料轮并将所有电线组合在一起的工作。
创建一个名为 \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 进行编程以传输实时视频了。按照本教程使用 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'
您现在可以使用我开发的应用程序通过蓝牙控制机器人并通过 wifi 观看实时视频。
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
全部0条评论
快来发表一下你的评论吧 !