58浏览
查看: 58|回复: 10

[项目] 【Arduino 动手做】带有 ESP32 和 FreeRTOS 的微型桌面机器人

[复制链接]
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 动手做】带有 ESP32 和 FreeRTOS 的微型桌面机器人图1

【Arduino 动手做】带有 ESP32 和 FreeRTOS 的微型桌面机器人图2

驴友花雕  中级技神
 楼主|

发表于 9 小时前

【Arduino 动手做】带有 ESP32 和 FreeRTOS 的微型桌面机器人

DLR(哑巴小机器人)是我名为 Deskbots 的更大项目的一部分。住在您办公桌上的小机器人。到目前为止,我已经制作了它们的 3 种不同的变体。

这是一个具有 freeRTOS 和面部表情的微型 ESP32 机器人。它通过 wifi 应用程序进行无线控制。它有一个 Oled 屏幕,根据机器人正在做什么显示不同的面部动画。

这是该项目的第一个版本。我只添加了基本表达式,将来会添加更多。将来我还会添加 SLAM 和 Swarming 功能。我已经在尝试 SLAM 并取得了非常好的结果。在一个项目中解释所有内容会太多,因此我决定制作它的多个部分。此项目包含有关如何组装和使用机器人的说明。

【Arduino 动手做】带有 ESP32 和 FreeRTOS 的微型桌面机器人图1

【Arduino 动手做】带有 ESP32 和 FreeRTOS 的微型桌面机器人图3

【Arduino 动手做】带有 ESP32 和 FreeRTOS 的微型桌面机器人图2

回复

使用道具 举报

驴友花雕  中级技神
 楼主|

发表于 9 小时前

【Arduino 动手做】带有 ESP32 和 FreeRTOS 的微型桌面机器人

材料与用品

ESP32 扫帚 32D
128X64 镀锌
TB6612FNG 电机驱动器
DC-DC 降压模块
7.4 伏 Lipo 电池
MPU6050 (可选)
2 X N20 电机
M3(15 毫米和 6 毫米)螺丝
2mm 螺丝

【Arduino 动手做】带有 ESP32 和 FreeRTOS 的微型桌面机器人图1

回复

使用道具 举报

驴友花雕  中级技神
 楼主|

发表于 9 小时前

【Arduino 动手做】带有 ESP32 和 FreeRTOS 的微型桌面机器人

第 1 步:3D 打印部件

机身在 ender 3 Pro 上用 PLA 打印。它使用 M3 和 2mm 螺钉连接在一起。我没有把它设计得很坚固,我想尽可能地小。所以有些部分有点弱。但好消息是我还包含了原始设计文件,因此您可以轻松更改设计。

您可以从此处下载 STL 文件。Grabcad 具有**模型功能,因此如果您不确定哪个部分放在哪里,请使用它。我在教程视频中详细展示了该组件。

【Arduino 动手做】带有 ESP32 和 FreeRTOS 的微型桌面机器人图2

【Arduino 动手做】带有 ESP32 和 FreeRTOS 的微型桌面机器人图3

【Arduino 动手做】带有 ESP32 和 FreeRTOS 的微型桌面机器人图1

回复

使用道具 举报

驴友花雕  中级技神
 楼主|

发表于 9 小时前

【Arduino 动手做】带有 ESP32 和 FreeRTOS 的微型桌面机器人

第 2 步:电路和电路板连接

我为我是如何找到减少布线的方法感到非常自豪的。基本上,不同的组件安装在两个 PCB 上以连接 PCB,我使用非常大的母头作为板对板连接器。他们给了我足够的空间来放置带有引脚和接头的传感器。


我的目标是使电路尽可能小,因此我使用了双面穿孔板。电路分为两层,顶层包含 ESP32,底层有电机驱动器和降压模块。也有MPU6050的空间,但目前,我没有使用它,因为我把 MPU 和 OLED 放在同一行,所以当我尝试同时使用它们时,我在动画方面遇到了一些问题。所以现在我已经删除了 MPU。

我在视频的这一部分展示了如何组装电路板。

电池和电源

我正在使用 7 伏 Lipo 供电。降压模块用于将电压降低到 5V 为 ESP32 供电。Oled 由 ESP32 本身通过 3V 线路供电。

“不要向 ESP5 提供超过 32V 的电压”

为电机驱动器供电

电机驱动器有两个电源连接,一个用于电机驱动器芯片,一个用于电机。对于电机,我们为“VM”引脚提供 7V,对于驱动芯片,我们从 ESP32 板向“VCC”提供 3-5V 电压。请阅读本文以了解此电动机驱动器的工作原理。

【Arduino 动手做】带有 ESP32 和 FreeRTOS 的微型桌面机器人图2

【Arduino 动手做】带有 ESP32 和 FreeRTOS 的微型桌面机器人图1

【Arduino 动手做】带有 ESP32 和 FreeRTOS 的微型桌面机器人图3

回复

使用道具 举报

驴友花雕  中级技神
 楼主|

发表于 9 小时前

【Arduino 动手做】带有 ESP32 和 FreeRTOS 的微型桌面机器人

第 3 步:上传程序


使用 Arduino ide 上传 sketch。您必须选择 ESP32 开发板才能执行此作。默认情况下,您不会在开发板的管理器中看到 ESP32。使用此链接将 ESP32 添加到 Arduino IDE

“请勿同时将电池和 USB 数据线连接到 ESP32”

您将需要一些额外的库来编译代码。它们都可以在 Arduino 库管理器中找到。如果您需要帮助,请阅读这篇文章 如何将库添加到 Arduino IDE。

Adafruit GFX
Adafruit SSD1306
异步 UDP
要编译代码,请选择您的 ESP32 开发板。此代码应该适用于大多数 ESP32 开发板。

Tools  > Ports > Select your  board(ESP32 Dev Kit 1)

如果一切设置正常,代码应该可以编译。然后,如果一切正常,只需上传代码,您将看到机器人第一次闪烁。代码在 GitHub 上可用,如果有任何问题请提出问题,我会尽力帮助你。

*请使用 IDE 1.8 新版,错误很多

*如果您遇到任何与 anlogwrite 函数相关的错误,请尝试在 MotorController.h 文件中注释或取消注释 #include < analogWrite.h>

【Arduino 动手做】带有 ESP32 和 FreeRTOS 的微型桌面机器人图1

【Arduino 动手做】带有 ESP32 和 FreeRTOS 的微型桌面机器人图2

回复

使用道具 举报

驴友花雕  中级技神
 楼主|

发表于 6 小时前

【Arduino 动手做】带有 ESP32 和 FreeRTOS 的微型桌面机器人

本帖最后由 驴友花雕 于 2025-5-22 16:32 编辑

第 4 步:开源与代码解释

  1. #include <Wire.h>
  2. #include <Adafruit_GFX.h>
  3. #include <Adafruit_SSD1306.h>
  4. #include "WiFi.h"
  5. #include "roboteyes.h"
  6. #include "AsyncUDP.h"
  7. #include "seperatestring.h"
  8. #include "MotorController.h"
  9. #define freertos/queue.h
  10. #define SCREEN_WIDTH 128 // OLED display width, in pixels
  11. #define SCREEN_HEIGHT 64 // OLED display height, in pixels
  12. //char Direction ='';
  13. //left side motor
  14. #define PWM1 12
  15. #define AIN1 14
  16. #define AIN2 27
  17. //Right side motor
  18. #define PWM2 32
  19. #define BIN1 33
  20. #define BIN2 25
  21. //#define STBY 26
  22. #define CommandArray_SIZE   20
  23. char *CommandArray [CommandArray_SIZE]; // this is reused each call
  24. char *strData = NULL; // this is allocated in separate and needs to be free( ) eventually
  25. const char * ssid = "SINGTEL-42E6";//Change your wifi name
  26. const char * password = "huiweimaev";//Change your wifi password
  27. const char * BroadcastData = "";
  28. AsyncUDP udp;
  29. String PhrasedData = "";
  30. int Speed=255;
  31. int count = 1;
  32. int aninum=0;
  33. // Declaration for an SSD1306 display connected to I2C (SDA, SCL pins)
  34. Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, -1);
  35. TaskHandle_t xHandle = NULL;
  36. //Animation task
  37. //There are better ways of doing this but this was the easiest.
  38. //Let me know if you can make this part better.
  39. void dispTask(void *pvParameters) {
  40.      while (1) {   
  41.           if(aninum ==1) //animation number 1 when robot goes left
  42.           {
  43.             //Serial.println("left");
  44.              look_left(500);
  45.           }
  46.           if(aninum ==2)//animation number 2 when robot goes right
  47.           {  //Serial.println("right");
  48.              look_right(500);
  49.           }
  50.           if(aninum ==0)//animation number 0 for rest.
  51.           {  //Serial.println("right");
  52.              //blink_eyes(1000,1);
  53.              sad_blink(400,1);
  54.           }
  55.          // vTaskDelete(xHandle);
  56.            //vTaskSuspend( NULL );
  57.     vTaskDelay(1);
  58.     }
  59. }
  60. void setup() {
  61.       //Motor drivers pins
  62.   pinMode(PWM1,OUTPUT);
  63.   pinMode(AIN1,OUTPUT);
  64.   pinMode(AIN2,OUTPUT);
  65.   pinMode(PWM2,OUTPUT);
  66.   pinMode(BIN1,OUTPUT);
  67.   pinMode(BIN2,OUTPUT);
  68.   Serial.begin(115200);
  69.   //-startwifi  
  70.     WiFi.mode(WIFI_STA);
  71.     WiFi.begin(ssid, password);
  72.     if (WiFi.waitForConnectResult() != WL_CONNECTED) {
  73.         Serial.println("WiFi Failed");
  74.         while(1) {
  75.             vTaskDelay(500/ portTICK_RATE_MS);
  76.         }
  77.     }
  78.       // Recieve data through wifi
  79.   if(udp.listen(1234)) {//UDP port number if there is any problem change this.
  80.         Serial.print("UDP Listening on IP: ");
  81.         Serial.println(WiFi.localIP());
  82.         udp.onPacket([] (AsyncUDPPacket packet) {      
  83.             /*
  84.             Serial.print(", From: ");
  85.             Serial.print(packet.remoteIP());
  86.             Serial.print(":");
  87.             Serial.print(", Length: ");
  88.             Serial.print(packet.length());
  89.             Serial.print(", Data: ");
  90.             Serial.write(packet.data(), packet.length());
  91.             Serial.println();
  92.             */
  93.             //Data phrasing making recieved readable into string
  94.             //packet.printf("Got %u bytes of data", packet.length());
  95.             char* tmpStr = (char*) malloc(packet.length() + 1);
  96.             memcpy(tmpStr, packet.data(), packet.length());
  97.             tmpStr[packet.length()] = '\0'; // ensure null termination
  98.             PhrasedData = String(tmpStr);
  99.             free(tmpStr); // Strign(char*) creates a copy so we can delete our one
  100.             Serial.println(PhrasedData);   
  101.         });      
  102.   }
  103. //display
  104. if(!display.begin(SSD1306_SWITCHCAPVCC, 0x3C)) { // Address 0x3D for 128x64
  105.     Serial.println(F("SSD1306 allocation failed"));
  106.     for(;;);
  107.   }
  108.   display.clearDisplay();
  109.   //Create a task to diaply eyes animation
  110.     xTaskCreatePinnedToCore(
  111.     dispTask,   // Display task
  112.     "dispTask", // Task name
  113.     4096,       // Stack size
  114.     NULL,       // No parameters
  115.     0,          // Priority
  116.     &xHandle,       // No handle returned
  117.     0);
  118. }
  119. void loop() {
  120.   
  121.   Plzgetstring(PhrasedData);// Get the incoming data and seprerate the commands into array.
  122.   Speed = (String(CommandArray [1])).toInt();//Speed of the robot
  123.   if(String(CommandArray [0])=="f"|| String(CommandArray [0])=="F")
  124. {
  125. forward(PWM1,AIN1,AIN2,PWM2,BIN1,BIN2,Speed);
  126. }
  127. if(String(CommandArray [0])=="b"|| String(CommandArray [0])=="B")
  128. {
  129. backward(PWM1,AIN1,AIN2,PWM2,BIN1,BIN2,Speed);
  130. }
  131. if(String(CommandArray [0])=="L"|| String(CommandArray [0])=="l")
  132. {
  133. left(PWM1,AIN1,AIN2,PWM2,BIN1,BIN2,Speed);
  134. aninum=1;
  135. }
  136. if(String(CommandArray [0])=="R"|| String(CommandArray [0])=="r")
  137. {
  138. right(PWM1,AIN1,AIN2,PWM2,BIN1,BIN2,Speed);
  139. aninum=2;
  140. }
  141. if(String(CommandArray [0])=="S" || String(CommandArray [0])=="s")
  142. {
  143. aninum=0;
  144. Stop(PWM1,AIN1,AIN2,PWM2,BIN1,BIN2,Speed);
  145. }
  146. }
  147. void Plzgetstring(String phraseData)
  148. {
  149.   String str;
  150.   int N = 0;
  151.   str = phraseData;
  152.   //Serial.print(F("input str:")); Serial.println(str);
  153.   N = separate (str, CommandArray, CommandArray_SIZE,  &strData);
  154. // for (int n = 0; n < N; n++) {
  155.    // Serial.println (CommandArray [n]);
  156. // }
  157.   freeData(&strData);
  158. }
复制代码


代码非常简单,基本上它通过 wifi 接收数据并分离字符串并根据查看的命令控制电机。 “roboteyes.h”、“seperatestring.h” 和 “MotorController.h” 是自定义库。这些包含在 sketch 文件夹中。我将来会更新更多的表情和面部动画。这是我第一次尝试制作一个库,所以任何反馈和建议都会有所帮助。

您需要的所有库。

  1.   #include <Wire.h>
  2.         #include <Adafruit_GFX.h>
  3.         #include <Adafruit_SSD1306.h>
  4.         #include "WiFi.h"
  5.         #include "roboteyes.h"
  6.         #include "AsyncUDP.h"
  7.         #include "seperatestring.h"
  8.         #include "MotorController.h"
  9.         #define freertos/queue.h
复制代码

将您的 SSID 和密码更改为您的 wifi 网络。

  
  1. const char * ssid = "SINGTEL-42E6";//Change your wifi name
  2.     const char * password = "huiweimaev";//Change your wifi password
复制代码

这是 UDP 端口。我把它设为 1234,所以很容易记住,但你可以把它改成你想要的任何四位数。

   if(udp.listen(1234)) {//UDP port number if there is any problem change this.
在这里,我们创建 “dispTask” 来处理面部动画。借助 FreeRTOS,我们可以同时播放动画和移动机器人。有更好的方法可以做到这一点,比如使用队列,但我无法让它工作。所以如果你能改进这部分,请告诉我。

  1.   xTaskCreatePinnedToCore(
  2.             dispTask,   // Display task
  3.             "dispTask", // Task name
  4.             4096,       // Stack size
  5.             NULL,       // No parameters
  6.             0,          // Priority
  7.             &xHandle,       // No handle returned
  8.             0);
复制代码

此函数通过 wifi 读取传入数据,并将每个命令分离到一个数组中

  1.    Plzgetstring(PhrasedData);// Get the incoming data and seprerate the commands into array.
复制代码

回复

使用道具 举报

驴友花雕  中级技神
 楼主|

发表于 6 小时前

【Arduino 动手做】带有 ESP32 和 FreeRTOS 的微型桌面机器人

第 5 步:应用程序

在您的手机上下载并安装该应用程序。Apk 文件包含在 Github 上的代码中。要使用该应用程序,您需要两样东西:IP 地址和 UDP 端口号。

默认 UDP 端口为 1234

要获取 IP 地址,请在 Deskbot 通过 USB 连接到 PC 时打开串行监视器。然后按 ESP32 上的 reset。如果 wifi 连接成功,您将看到 IP 地址。

Tools > Serial monitor > Change baud rate to 115200


打开应用程序并键入 IP 地址和 UDP 端口号。您的手机和 Deskbot 应该在同一个 wifi 网络上。如果一切正常,您应该能够驾驶钻头。



“请勿同时将电池和 USB 数据线连接到 EPS32”



现在我们已经结束了,享受与您的新可爱朋友一起玩耍的乐趣。如果您被困在任何地方或需要更详细的说明,请告诉我我会更新此页面。

【Arduino 动手做】带有 ESP32 和 FreeRTOS 的微型桌面机器人图1

【Arduino 动手做】带有 ESP32 和 FreeRTOS 的微型桌面机器人图2

回复

使用道具 举报

驴友花雕  中级技神
 楼主|

发表于 6 小时前

【Arduino 动手做】带有 ESP32 和 FreeRTOS 的微型桌面机器人

第 6 步:您可以改进的地方

【Arduino 动手做】带有 ESP32 和 FreeRTOS 的微型桌面机器人图4

【Arduino 动手做】带有 ESP32 和 FreeRTOS 的微型桌面机器人图3

【Arduino 动手做】带有 ESP32 和 FreeRTOS 的微型桌面机器人图2

【Arduino 动手做】带有 ESP32 和 FreeRTOS 的微型桌面机器人图1



回复

使用道具 举报

驴友花雕  中级技神
 楼主|

发表于 6 小时前

【Arduino 动手做】带有 ESP32 和 FreeRTOS 的微型桌面机器人

这是这个项目的第一部分,所以我只包含了基本的东西。在未来的更新中,我将添加更逼真的动画和更多传感器。

我这个项目的最终目标是制作一个小巧的桌面助手,它位于我的办公桌上,并且足够智能,可以在不碰撞或从桌子上掉下来的情况下导航。我不知道它在现实生活中的用途是什么。

您可能已经在代码中看到了一些额外的内容,例如 MPU6050 引用和应用程序中的一些冗余功能。那是因为我已经在试验 SLAM。您在应用程序中看到的黑框是一个画布,您将在其中看到机器人在桌子上移动时绘制的地图。此外,顶部的风扇未连接到任何东西。我打算添加 LED,但认为事情可能会变热,所以我添加了风扇。它看起来很酷,所以我保留了它。



附录
项目链接:https://www.instructables.com/Ti ... ESP32-and-FreeRTOS/
项目作者:印度 shubham_bhatt
视频教程(6分钟):https://www.youtube.com/watch?v=DRXjLnhupkE
3D打印文件:https://grabcad.com/library/esp32-3d-printed-robot-1
项目开源代码:https://github.com/sastejugaad/LittleBoi




LittleBoi-main.zip

5.77 MB, 下载次数: 1

stl.zip

11.49 MB, 下载次数: 0

回复

使用道具 举报

驴友花雕  中级技神
 楼主|

发表于 6 小时前

【Arduino 动手做】带有 ESP32 和 FreeRTOS 的微型桌面机器人

【Arduino 动手做】带有 ESP32 和 FreeRTOS 的微型桌面机器人图1
回复

使用道具 举报

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

本版积分规则

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

硬件清单

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

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

mail