28浏览
查看: 28|回复: 12

[项目] 【Arduino 动手做】带有摄像头的 Web 控制 ESP32 桌面机器人

[复制链接]
Arduino是一个开放源码的电子原型平台,它可以让你用简单的硬件和软件来创建各种互动的项目。Arduino的核心是一个微控制器板,它可以通过一系列的引脚来连接各种传感器、执行器、显示器等外部设备。Arduino的编程是基于C/C++语言的,你可以使用Arduino IDE(集成开发环境)来编写、编译和上传代码到Arduino板上。Arduino还有一个丰富的库和社区,你可以利用它们来扩展Arduino的功能和学习Arduino的知识。

Arduino的特点是:
1、开放源码:Arduino的硬件和软件都是开放源码的,你可以自由地修改、复制和分享它们。
2、易用:Arduino的硬件和软件都是为初学者和非专业人士设计的,你可以轻松地上手和使用它们。
3、便宜:Arduino的硬件和软件都是非常经济的,你可以用很低的成本来实现你的想法。
4、多样:Arduino有多种型号和版本,你可以根据你的需要和喜好来选择合适的Arduino板。
5、创新:Arduino可以让你用电子的方式来表达你的创意和想象,你可以用Arduino来制作各种有趣和有用的项目,如机器人、智能家居、艺术装置等。

【Arduino 动手做】带有摄像头的 Web 控制 ESP32 桌面机器人图1

【Arduino 动手做】带有摄像头的 Web 控制 ESP32 桌面机器人图2

驴友花雕  中级技神
 楼主|

发表于 6 小时前

【Arduino 动手做】带有摄像头的 Web 控制 ESP32 桌面机器人

一个简单的 Web 控制 ESP32 机器人,带有摄像头。由 LiPo 电池供电,使用 4 个 n20 电机。

【Arduino 动手做】带有摄像头的 Web 控制 ESP32 桌面机器人图1
回复

使用道具 举报

驴友花雕  中级技神
 楼主|

发表于 6 小时前

【Arduino 动手做】带有摄像头的 Web 控制 ESP32 桌面机器人

用品与材料

1 个 ESP32-CAM 微控制器

4x N20 电机 (60RPM)(全球速卖通))

2x MX 1508 有刷直流电机驱动器(有时也称为迷你 L298 驱动器)(Amazon UK)(全球速卖通))

1x 7.4v Lipo 电池(亚马逊英国))

1 个 JST 连接器(Amazon UK)

1x Mini3060 DC-DC 降压模块(Amazon UK)(全球速卖通))

1 个 160 度 OVO2640 75mm 长的模块。(亚马逊英国)

1x 60x80mm 原型 / pef 板(我用的是双面,但单面应该可以)(全球速卖通)

一个 40 针的公板接头条。

母跳线选择。(提供 40 个每种的套件应该足够了,因为有些会被切成两半)

2 个 8 针母板接头(用于插入 esp32)

2 针摇杆开关(内部尺寸应约为 18.6 毫米 x 11.8 毫米,如果您的开关需要更大的孔,您可以将开口锉磨或打磨得更大或调整印刷品)(亚马逊英国))

12 个 M3x8 螺栓

4 个 M2x6 螺栓(如果您没有 2 个就足够了)

带有外露端的跳线,用于在配电板上创建连接

预计建造成本(2025 年 4 月):35-45 英镑/40-50 欧元/50-60 美元/60-80元人民币(但由于关税,可能会更多),但是您可能需要购买 2、5、10 等套装的某些零件,这意味着它可能会花费更多,但您有备件,甚至可能有足够的零件来建造 2 个!您可能会在其他地方找到更便宜的零件。

回复

使用道具 举报

驴友花雕  中级技神
 楼主|

发表于 6 小时前

【Arduino 动手做】带有摄像头的 Web 控制 ESP32 桌面机器人

第 1 步:3D 打印组件

在 PLA 中打印 Wheels、bottom、mid、top、shell 部分。这总共需要大约 7-8 小时,但可能需要更长的时间,具体取决于您的打印机。我建议打印底部、车轮、轮胎和 N20 电机外壳,以便在打印外壳和上部时更快地开始项目。

使用 95A TPU 打印轮胎(确保在正确的温度下打印以减少任何瑕疵)

【Arduino 动手做】带有摄像头的 Web 控制 ESP32 桌面机器人图1

【Arduino 动手做】带有摄像头的 Web 控制 ESP32 桌面机器人图3

【Arduino 动手做】带有摄像头的 Web 控制 ESP32 桌面机器人图2

回复

使用道具 举报

驴友花雕  中级技神
 楼主|

发表于 6 小时前

【Arduino 动手做】带有摄像头的 Web 控制 ESP32 桌面机器人

第 2 步:焊接电机连接

您的电机可能带有预焊接的电线,但我发现它们可能很弱并且几乎不费吹灰之力就会折断。我将其中一根母对母跨接电缆切成两半,将非连接器端剥去约 5-10 毫米,然后将其焊接到电机上。

焊接到电机引脚时要小心,不要焊接得太热,否则可能会损坏电机外壳和连接点。对所有 4 个电机执行此作。我发现最好用黑色和红色电缆焊接它们,并将它们全部焊接到相同的方向(你可以通过电机上的齿轮看出)。

【Arduino 动手做】带有摄像头的 Web 控制 ESP32 桌面机器人图1

【Arduino 动手做】带有摄像头的 Web 控制 ESP32 桌面机器人图2

回复

使用道具 举报

驴友花雕  中级技神
 楼主|

发表于 6 小时前

【Arduino 动手做】带有摄像头的 Web 控制 ESP32 桌面机器人

第 3 步:安装电机 + 轮子

在底壳上,您会看到中间有 8 个螺丝孔,这是 4 个电机外壳拧入到位的位置。

首先将每个电机插入 n20 电机外壳杆端,然后将背面卡入到位。

对于 4 个轮子将轮胎重叠在一个车轮上,它应该很紧,几乎看起来不合适,但 95a 的伸展性刚好可以放在车轮上。这样做是为了确保它保持原状。现在将每个轮子连接到 N20 电机。如果您查看 4 个部分之一的车轮,它会有一个轻微的颠簸,这是 N20 轴的平坦部分应该面向的一侧,并将车轮推到电机上。根据你的打印方式,有些可能几乎没有力量继续,但有些可能需要更多的鼓励。如果它太容易滑入和滑出,那么您可能需要检查您的打印设置。

现在拧入每个外壳,并将轮子连接到底座上。外壳应与中间部分的螺丝柱位于同一侧。


【Arduino 动手做】带有摄像头的 Web 控制 ESP32 桌面机器人图1

【Arduino 动手做】带有摄像头的 Web 控制 ESP32 桌面机器人图2

【Arduino 动手做】带有摄像头的 Web 控制 ESP32 桌面机器人图3

回复

使用道具 举报

驴友花雕  中级技神
 楼主|

发表于 6 小时前

【Arduino 动手做】带有摄像头的 Web 控制 ESP32 桌面机器人

第 4 步:将接头焊接到电机驱动器上


您可以直接在电机和驱动器之间焊接电线,但在尝试解决问题时可能会导致问题。我发现只需焊接一些接头就更容易了,这样我就可以连接或断开跳线以帮助发现任何问题。焊接所有 9 个接头。您应该能够为每个 2 针孔一组 2 个来执行它们。同样,不要焊接得太热,否则可能会熔化将引脚固定到位的塑料。


【Arduino 动手做】带有摄像头的 Web 控制 ESP32 桌面机器人图1
回复

使用道具 举报

驴友花雕  中级技神
 楼主|

发表于 6 小时前

【Arduino 动手做】带有摄像头的 Web 控制 ESP32 桌面机器人

第 5 步:焊接配电板

图为配电板上需要如何连接。我的焊接不是最好的,但应该让您大致了解它们应该如何协同工作。lipo 需要为电机驱动器的 2 个电源连接和直流降压转换器的连接供电。转换器的另一侧需要连接到 ESP32 上的 5V 和 GND。然后将 8 个接头(2 行,每行 4 行)连接到 GPIO。

【Arduino 动手做】带有摄像头的 Web 控制 ESP32 桌面机器人图2

【Arduino 动手做】带有摄像头的 Web 控制 ESP32 桌面机器人图1

【Arduino 动手做】带有摄像头的 Web 控制 ESP32 桌面机器人图3

回复

使用道具 举报

驴友花雕  中级技神
 楼主|

发表于 6 小时前

【Arduino 动手做】带有摄像头的 Web 控制 ESP32 桌面机器人

第 6 步:连接所有内容

一旦打印出中间部分,您就可以将每个电机的电缆向上穿过提供的小孔,如图所示插入电机驱动器,并将电池放在中间的部分..确保您也拧紧了中段。拧紧电源板,使连接点朝上。将电源和接地连接到每个电机控制器,然后连接到每根控制电缆。

【Arduino 动手做】带有摄像头的 Web 控制 ESP32 桌面机器人图1

【Arduino 动手做】带有摄像头的 Web 控制 ESP32 桌面机器人图3

【Arduino 动手做】带有摄像头的 Web 控制 ESP32 桌面机器人图2

【Arduino 动手做】带有摄像头的 Web 控制 ESP32 桌面机器人图4

【Arduino 动手做】带有摄像头的 Web 控制 ESP32 桌面机器人图6

【Arduino 动手做】带有摄像头的 Web 控制 ESP32 桌面机器人图5

【Arduino 动手做】带有摄像头的 Web 控制 ESP32 桌面机器人图7

【Arduino 动手做】带有摄像头的 Web 控制 ESP32 桌面机器人图8


回复

使用道具 举报

驴友花雕  中级技神
 楼主|

发表于 6 小时前

【Arduino 动手做】带有摄像头的 Web 控制 ESP32 桌面机器人

第 7 步:对 ESP32 CAM 进行编程

将代码上传到开发板,但将您的 SSID 名称和密码插入相关部分。加载后,使用 115200 波特率的串行监视器查看设备将使用的 IP。(如果未在路由器中分配静态 IP,这可能会发生变化,但您也可以通过查看连接的设备来检查路由器上的 IP)

【Arduino 动手做】带有摄像头的 Web 控制 ESP32 桌面机器人图2

【Arduino 动手做】带有摄像头的 Web 控制 ESP32 桌面机器人图1


  1. //Adapted Code based on project by NT Tronix https://nabatechblog.com/esp32-cam-wifi-camera-with-pan-tilt-control-diy-smart-surveillance/
  2. #include "esp_camera.h"
  3. #include <WiFi.h>
  4. #include "esp_timer.h"
  5. #include "img_converters.h"
  6. #include "Arduino.h"
  7. #include "fb_gfx.h"
  8. #include "soc/soc.h"
  9. #include "soc/rtc_cntl_reg.h"
  10. #include "esp_http_server.h"
  11. // Replace with your network credentials
  12. const char* ssid = "INSERTSSIDHERE";
  13. const char* password = "INSERTPASSWORDHERE";
  14. #define PART_BOUNDARY "123456789000000000000987654321"
  15. #define CAMERA_MODEL_AI_THINKER
  16. #if defined(CAMERA_MODEL_AI_THINKER)
  17.   #define PWDN_GPIO_NUM     32
  18.   #define RESET_GPIO_NUM    -1
  19.   #define XCLK_GPIO_NUM      0
  20.   #define SIOD_GPIO_NUM     26
  21.   #define SIOC_GPIO_NUM     27
  22.   #define Y9_GPIO_NUM       35
  23.   #define Y8_GPIO_NUM       34
  24.   #define Y7_GPIO_NUM       39
  25.   #define Y6_GPIO_NUM       36
  26.   #define Y5_GPIO_NUM       21
  27.   #define Y4_GPIO_NUM       19
  28.   #define Y3_GPIO_NUM       18
  29.   #define Y2_GPIO_NUM        5
  30.   #define VSYNC_GPIO_NUM    25
  31.   #define HREF_GPIO_NUM     23
  32.   #define PCLK_GPIO_NUM     22
  33. #else
  34.   #error "Camera model not selected"
  35. #endif
  36. // Motor control pins
  37. #define MOTOR_LEFT_IN1   14
  38. #define MOTOR_LEFT_IN2   15
  39. #define MOTOR_RIGHT_IN1  12
  40. #define MOTOR_RIGHT_IN2  13
  41. // Streaming constants
  42. static const char* _STREAM_CONTENT_TYPE = "multipart/x-mixed-replace;boundary=" PART_BOUNDARY;
  43. static const char* _STREAM_BOUNDARY = "\r\n--" PART_BOUNDARY "\r\n";
  44. static const char* _STREAM_PART = "Content-Type: image/jpeg\r\nContent-Length: %u\r\n\r\n";
  45. httpd_handle_t camera_httpd = NULL;
  46. httpd_handle_t stream_httpd = NULL;
  47. // Simple web UI
  48. static const char PROGMEM INDEX_HTML[] = R"rawliteral(
  49. <html>
  50.   <head><title>ESP32-CAM Remote Robot</title>
  51.   <style>
  52.     body { font-family: Arial; text-align: center; }
  53.     .button {
  54.       background-color: #2f4468; border: none; color: white;
  55.       padding: 10px 20px; font-size: 18px; margin: 6px 3px;
  56.       cursor: pointer; touch-action: manipulation;
  57.     }
  58.   </style>
  59.   </head>
  60.   <body>
  61.     <h1>ESP32-CAM Motor Control</h1>
  62.     <img src="" id="photo">
  63.      <div>
  64.       <button class="button" ontouchstart="send('up')" ontouchend="send('stop')"
  65.               onmousedown="send('up')" onmouseup="send('stop')">Up</button><br>
  66.       <button class="button" ontouchstart="send('left')" ontouchend="send('stop')"
  67.               onmousedown="send('left')" onmouseup="send('stop')">Left</button>
  68.       <button class="button" ontouchstart="send('stop')" ontouchend="send('stop')"
  69.               onmousedown="send('stop')" onmouseup="send('stop')">Stop</button><br>
  70.       <button class="button" ontouchstart="send('right')" ontouchend="send('stop')"
  71.               onmousedown="send('right')" onmouseup="send('stop')">Right</button><br>
  72.       <button class="button" ontouchstart="send('down')" ontouchend="send('stop')"
  73.               onmousedown="send('down')" onmouseup="send('stop')">Down</button>
  74.     </div>
  75.     <script>
  76.       function send(cmd) {
  77.         var xhr = new XMLHttpRequest();
  78.         xhr.open("GET", "/action?go=" + cmd, true);
  79.         xhr.send();
  80.       }
  81.       window.onload = () => document.getElementById("photo").src = window.location.href.slice(0, -1) + ":81/stream";
  82.     </script>
  83.   </body>
  84. </html>
  85. )rawliteral";
  86. // Motor control helper
  87. void stopMotors() {
  88.   digitalWrite(MOTOR_LEFT_IN1, LOW);
  89.   digitalWrite(MOTOR_LEFT_IN2, LOW);
  90.   digitalWrite(MOTOR_RIGHT_IN1, LOW);
  91.   digitalWrite(MOTOR_RIGHT_IN2, LOW);
  92. }
  93. void moveBackward() {
  94.   digitalWrite(MOTOR_LEFT_IN1, HIGH);
  95.   digitalWrite(MOTOR_LEFT_IN2, LOW);
  96.   digitalWrite(MOTOR_RIGHT_IN1, HIGH);
  97.   digitalWrite(MOTOR_RIGHT_IN2, LOW);
  98. }
  99. void moveForward() {
  100.   digitalWrite(MOTOR_LEFT_IN1, LOW);
  101.   digitalWrite(MOTOR_LEFT_IN2, HIGH);
  102.   digitalWrite(MOTOR_RIGHT_IN1, LOW);
  103.   digitalWrite(MOTOR_RIGHT_IN2, HIGH);
  104. }
  105. void turnRight() {
  106.   digitalWrite(MOTOR_LEFT_IN1, LOW);
  107.   digitalWrite(MOTOR_LEFT_IN2, HIGH);
  108.   digitalWrite(MOTOR_RIGHT_IN1, HIGH);
  109.   digitalWrite(MOTOR_RIGHT_IN2, LOW);
  110. }
  111. void turnLeft() {
  112.   digitalWrite(MOTOR_LEFT_IN1, HIGH);
  113.   digitalWrite(MOTOR_LEFT_IN2, LOW);
  114.   digitalWrite(MOTOR_RIGHT_IN1, LOW);
  115.   digitalWrite(MOTOR_RIGHT_IN2, HIGH);
  116. }
  117. static esp_err_t index_handler(httpd_req_t *req) {
  118.   httpd_resp_set_type(req, "text/html");
  119.   return httpd_resp_send(req, (const char *)INDEX_HTML, strlen(INDEX_HTML));
  120. }
  121. static esp_err_t stream_handler(httpd_req_t *req){
  122.   camera_fb_t * fb = NULL;
  123.   esp_err_t res = ESP_OK;
  124.   size_t _jpg_buf_len = 0;
  125.   uint8_t * _jpg_buf = NULL;
  126.   char * part_buf[64];
  127.   res = httpd_resp_set_type(req, _STREAM_CONTENT_TYPE);
  128.   if(res != ESP_OK){
  129.     return res;
  130.   }
  131.   while(true){
  132.     fb = esp_camera_fb_get();
  133.     if (!fb) {
  134.       Serial.println("Camera capture failed");
  135.       res = ESP_FAIL;
  136.     } else {
  137.       if(fb->format != PIXFORMAT_JPEG){
  138.         bool jpeg_converted = frame2jpg(fb, 80, &_jpg_buf, &_jpg_buf_len);
  139.         esp_camera_fb_return(fb);
  140.         if(!jpeg_converted){
  141.           Serial.println("JPEG compression failed");
  142.           res = ESP_FAIL;
  143.         }
  144.       } else {
  145.         _jpg_buf_len = fb->len;
  146.         _jpg_buf = fb->buf;
  147.       }
  148.     }
  149.     if(res == ESP_OK){
  150.       size_t hlen = snprintf((char *)part_buf, 64, _STREAM_PART, _jpg_buf_len);
  151.       res = httpd_resp_send_chunk(req, (const char *)part_buf, hlen);
  152.     }
  153.     if(res == ESP_OK){
  154.       res = httpd_resp_send_chunk(req, (const char *)_jpg_buf, _jpg_buf_len);
  155.     }
  156.     if(res == ESP_OK){
  157.       res = httpd_resp_send_chunk(req, _STREAM_BOUNDARY, strlen(_STREAM_BOUNDARY));
  158.     }
  159.     if(fb){
  160.       esp_camera_fb_return(fb);
  161.     }
  162.     if(res != ESP_OK){
  163.       break;
  164.     }
  165.   }
  166.   return res;
  167. }
  168. static esp_err_t cmd_handler(httpd_req_t *req){
  169.   char*  buf;
  170.   size_t buf_len;
  171.   char variable[32] = {0,};
  172.   buf_len = httpd_req_get_url_query_len(req) + 1;
  173.   if (buf_len > 1) {
  174.     buf = (char*)malloc(buf_len);
  175.     if(!buf){
  176.       httpd_resp_send_500(req);
  177.       return ESP_FAIL;
  178.     }
  179.     if (httpd_req_get_url_query_str(req, buf, buf_len) == ESP_OK) {
  180.       httpd_query_key_value(buf, "go", variable, sizeof(variable));
  181.     }
  182.     free(buf);
  183.   } else {
  184.     httpd_resp_send_404(req);
  185.     return ESP_FAIL;
  186.   }
  187.   if(!strcmp(variable, "up")) {
  188.     moveForward();
  189.   } else if(!strcmp(variable, "down")) {
  190.     moveBackward();
  191.   } else if(!strcmp(variable, "left")) {
  192.     turnLeft();
  193.   } else if(!strcmp(variable, "right")) {
  194.     turnRight();
  195.   } else if(!strcmp(variable, "stop")) {
  196.     stopMotors();
  197.   } else {
  198.     httpd_resp_send_404(req);
  199.     return ESP_FAIL;
  200.   }
  201.   return httpd_resp_send(req, NULL, 0);
  202. }
  203. void startCameraServer(){
  204.   httpd_config_t config = HTTPD_DEFAULT_CONFIG();
  205.   config.server_port = 80;
  206.   httpd_uri_t index_uri = { .uri = "/", .method = HTTP_GET, .handler = index_handler };
  207.   httpd_uri_t cmd_uri = { .uri = "/action", .method = HTTP_GET, .handler = cmd_handler };
  208.   httpd_uri_t stream_uri = { .uri = "/stream", .method = HTTP_GET, .handler = stream_handler };
  209.   if (httpd_start(&camera_httpd, &config) == ESP_OK) {
  210.     httpd_register_uri_handler(camera_httpd, &index_uri);
  211.     httpd_register_uri_handler(camera_httpd, &cmd_uri);
  212.   }
  213.   config.server_port += 1;
  214.   config.ctrl_port += 1;
  215.   if (httpd_start(&stream_httpd, &config) == ESP_OK) {
  216.     httpd_register_uri_handler(stream_httpd, &stream_uri);
  217.   }
  218. }
  219. void setup() {
  220.   WRITE_PERI_REG(RTC_CNTL_BROWN_OUT_REG, 0);
  221.   Serial.begin(115200);
  222.   // Motor pins
  223.   pinMode(MOTOR_LEFT_IN1, OUTPUT);
  224.   pinMode(MOTOR_LEFT_IN2, OUTPUT);
  225.   pinMode(MOTOR_RIGHT_IN1, OUTPUT);
  226.   pinMode(MOTOR_RIGHT_IN2, OUTPUT);
  227.   stopMotors();
  228.   WiFi.hostname("ESP32-MiniBot");  
  229.   // Wi-Fi
  230.   WiFi.begin(ssid, password);
  231.   while (WiFi.status() != WL_CONNECTED) {
  232.     delay(500);
  233.     Serial.print(".");
  234.   }
  235.   Serial.println("\nWiFi connected");
  236.   camera_config_t config;
  237.   config.ledc_channel = LEDC_CHANNEL_0;
  238.   config.ledc_timer = LEDC_TIMER_0;
  239.   config.pin_d0 = Y2_GPIO_NUM;
  240.   config.pin_d1 = Y3_GPIO_NUM;
  241.   config.pin_d2 = Y4_GPIO_NUM;
  242.   config.pin_d3 = Y5_GPIO_NUM;
  243.   config.pin_d4 = Y6_GPIO_NUM;
  244.   config.pin_d5 = Y7_GPIO_NUM;
  245.   config.pin_d6 = Y8_GPIO_NUM;
  246.   config.pin_d7 = Y9_GPIO_NUM;
  247.   config.pin_xclk = XCLK_GPIO_NUM;
  248.   config.pin_pclk = PCLK_GPIO_NUM;
  249.   config.pin_vsync = VSYNC_GPIO_NUM;
  250.   config.pin_href = HREF_GPIO_NUM;
  251.   config.pin_sccb_sda = SIOD_GPIO_NUM;
  252.   config.pin_sccb_scl = SIOC_GPIO_NUM;
  253.   config.pin_pwdn = PWDN_GPIO_NUM;
  254.   config.pin_reset = RESET_GPIO_NUM;
  255.   config.xclk_freq_hz = 20000000;
  256.   config.pixel_format = PIXFORMAT_JPEG;
  257.   config.frame_size = FRAMESIZE_VGA;
  258.   config.jpeg_quality = 10;
  259.   config.fb_count = 1;
  260.   if (esp_camera_init(&config) != ESP_OK) {
  261.     Serial.println("Camera init failed");
  262.     return;
  263.   }
  264.   Serial.println("Camera ready at:");
  265.   Serial.println(WiFi.localIP());
  266.   Serial.printf("PSRAM size: %d bytes\n", ESP.getPsramSize());
  267.   Serial.printf("Free PSRAM: %d bytes\n", ESP.getFreePsram());
  268.   startCameraServer();
  269. }
  270. void loop() {}
复制代码


回复

使用道具 举报

驴友花雕  中级技神
 楼主|

发表于 5 小时前

【Arduino 动手做】带有摄像头的 Web 控制 ESP32 桌面机器人

第 8 步:测试它有效

在下一步切割电池连接器之前,将电池连接到电源板上,电缆完好无损,并测试 esp32 是否上电。


第 9 步:添加 Power 按钮并关闭 shell

【Arduino 动手做】带有摄像头的 Web 控制 ESP32 桌面机器人图1

【Arduino 动手做】带有摄像头的 Web 控制 ESP32 桌面机器人图3

【Arduino 动手做】带有摄像头的 Web 控制 ESP32 桌面机器人图2

【Arduino 动手做】带有摄像头的 Web 控制 ESP32 桌面机器人图4

【Arduino 动手做】带有摄像头的 Web 控制 ESP32 桌面机器人图5


回复

使用道具 举报

驴友花雕  中级技神
 楼主|

发表于 5 小时前

【Arduino 动手做】带有摄像头的 Web 控制 ESP32 桌面机器人

第 10 步:控制机器人

打开电源开关,然后在您的 PC、Mac 或 Phone 上,通过步骤 7 中所述的 IP 地址连接到浏览器中的设备。(您的机器人本地 IP 可能与我的不同)。您应该会看到一个摄像头源和 4 个按钮来控制。在移动设备上,按钮有时会卡住,因此在台式机/笔记本电脑浏览器上通常控制得更好。那应该是它,如果您发现您的电机没有正确运行,那么您可能需要检查您的接线并重新组织它,直到电机都正常工作。

为了给电池充电,我还没有在这个项目中加入 lipo 充电器,所以你需要拧下顶部,断开电池并将其连接到充电器(通常随电池一起提供)。但是,它可能是您融入自己的升级点!

【Arduino 动手做】带有摄像头的 Web 控制 ESP32 桌面机器人图1

回复

使用道具 举报

驴友花雕  中级技神
 楼主|

发表于 5 小时前

【Arduino 动手做】带有摄像头的 Web 控制 ESP32 桌面机器人

本帖最后由 驴友花雕 于 2025-5-23 17:35 编辑

第 11 步:未来版本

正如您会注意到的那样,在摄像头正下方的外壳中,有一个足够大的空间可以容纳 15 毫米扬声器,而在中段框架上,则有空间可以连接MAX98357A。将来,我计划更新项目以包含此内容,但请随时自行添加!esp32 上应该有足够的引脚供您添加它。只需调整配电板即可从 ESP32-CAM 进行连接。


我计划在今年晚些时候发布这个机器人的第 2 版,希望它能包括音频,甚至可能还包括麦克风功能,这样它就可以用作远程控制安全摄像头。



附录
项目链接:https://www.instructables.com/ESP32-CAM-Web-Controlled-Car/
项目作者:英国 Kent(BeepBoopPrints)

项目代码:https://github.com/BeepBoopindie ... ain/ESP32CAMBOT.ino
3D打印文件:https://content.instructables.co ... KLO6STM9PNR6FM._3mf

【Arduino 动手做】带有摄像头的 Web 控制 ESP32 桌面机器人图1

项目代码 3D打印件.zip

989.53 KB, 阅读权限: 50, 下载次数: 0

回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

为本项目制作心愿单
购买心愿单
心愿单 编辑
[[wsData.name]]

硬件清单

  • [[d.name]]
btnicon
我也要做!
点击进入购买页面
上海智位机器人股份有限公司 沪ICP备09038501号-4 备案 沪公网安备31011502402448

© 2013-2025 Comsenz Inc. Powered by Discuz! X3.4 Licensed

mail