嗨,在花了几个晚上做机器人之后,我决定与你分享我的上一份工作。一个基于 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 → arduinoVin
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.inoProduct:Catosci4WDCarforUNODescription:AMultifunctionalBluetoothRemoteCar.Auther:CarloIurisciModification: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"#defineUPLOAD_VOL_TIME3000#defineUPLOAD_DATA_TIME500#defineCOMMANDS_COUNT_MAX8#defineINTERVAL_CHAR'@'//#defineDEBUGu32lastUploadVoltageTime;u32 lastUploadDataTime;StringinputStringBLE ="";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 misuraVbatteriaall'AppogniUPLOAD_VOL_TIMEupLoadVoltageToApp();// invia lettura sensori all'AppogniUPLOAD_DATA_TIMEupLoadAndReadSonarValueToApp();if(stringComplete) { //da eseguiro solo alla ricezione di un comandoStringinputCommandArray[COMMANDS_COUNT_MAX];StringinputStringTemp = 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){caseACTION_MOVE:if(paramterCount ==2) {motorRun(paramters[1], paramters[2]); //app contol catoscicar_speed is0~100,pwm is0~255}break;caseACTION_CAR_MODE:if(paramterCount ==1) {bleCarMode = paramters[1];switch (bleCarMode){caseMODE_NONE:caseMODE_GRAVITY:resetCarAction();writeServo(OA_SERVO_CENTER);break;caseMODE_ULTRASONIC:oa_CalculateVoltageCompensation();break;caseMODE_ULTRASONIC_NOIR:oa_CalculateVoltageCompensation();break;caseMODE_FOLLOW:oa_CalculateVoltageCompensation();break;caseMODE_TRACKING:tk_CalculateVoltageCompensation();break;default:break;}}break;caseACTION_BUZZER:if (paramterCount== 1) {setBuzzer(paramters[1]);}break;default:break;}}switch (bleCarMode) //loop per modalità di controllo{caseMODE_NONE: caseMODE_GRAVITY:break;caseMODE_ULTRASONIC:updateAutomaticObstacleAvoidance();break;caseMODE_ULTRASONIC_NOIR:updateAutomaticObstacleAvoidanceNoInfrared();break;caseMODE_FOLLOW:UltrasonicFollow();break;caseMODE_TRACKING:updateAutomaticTrackingLine();break;default:break;}void upLoadVoltageToApp() {int voltage = 0;if (millis() - lastUploadVoltageTime >UPLOAD_VOL_TIME) {if (getBatteryVoltage()) {voltage = batteryVoltage * 1000;}StringsendString =String(ACTION_GET_VOLTAGE) +String(INTERVAL_CHAR) +String((voltage)) +String(INTERVAL_CHAR);Serial.println(sendString);lastUploadVoltageTime = millis();}}void upLoadAndReadSonarValueToApp() {// invia lettura sensori all'Appif (millis() - lastUploadDataTime >UPLOAD_DATA_TIME) {StringsendString =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°。
重要提示:如果需要,将面支架重新定位在伺服器上。
您现在可以使用串行命令测试机器人运动和动作模式。
以下是串行命令的说明:
#defineACTION_MOVE'A'//control movement of the smartcarA#speedl#speedr##defineACTION_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#defineACTION_BUZZER'D'//control buzzerD#1# buzzer on /D#0# buzzer off#defineMODE_NONE0#defineMODE_GRAVITY1#defineMODE_ULTRASONIC2#defineMODE_ULTRASONIC_NOIR3#defineMODE_TRACKING4#defineMODE_FOLLOW5
现在是时候对 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文件。
在上传代码之前,您需要在以下变量中插入您的网络凭据:
constchar* ssid ="REPLACE_WITH_YOUR_SSID";constchar* 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 connected20:43:18.265 -> Camera Ready! Use'http://192.168.1.27'toconnect20:43:18.359 -> Starting webserveron port:'80'20:43:18.359 -> Starting streamserveron port:'81'
您现在可以使用我开发的应用程序通过蓝牙控制机器人并通过 wifi 观看实时视频。
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表德赢Vwin官网 网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。举报投诉
全部0条评论
快来发表一下你的评论吧 !