当前位置:   article > 正文

ESP32-摇杆控制舵机_

一、读取摇杆数值

为了使用ESP32读取XY摇杆的值,可以按照以下步骤操作。这里使用Arduino IDE进行编程。

所需材料

  1. ESP32开发板
  2. 摇杆模块
  3. 面包板和跳线

接线

  1. 将摇杆模块的VCC连接到ESP32的3.3V,GND连接到ESP32的GND。
  2. 将摇杆模块的VRx连接到ESP32的GPIO 34(可以选择任意ADC引脚),VRy连接到GPIO 35。!!!!注意注意,35、34、36、39只能输入,别踩坑
  3. 如果需要读取摇杆按键状态,可以将SW引脚连接到ESP32的一个数字输入引脚。

代码

  1. int VRx = 34; // X轴引脚
  2. int VRy = 35; // Y轴引脚
  3. int SW = 32; // 按键引脚
  4. void setup() {
  5. Serial.begin(115200);
  6. pinMode(VRx, INPUT);
  7. pinMode(VRy, INPUT);
  8. pinMode(SW, INPUT_PULLUP); // 如果使用按键引脚
  9. }
  10. void loop() {
  11. int xValue = analogRead(VRx); // 读取X轴的值
  12. int yValue = analogRead(VRy); // 读取Y轴的值
  13. int swState = digitalRead(SW); // 读取按键状态(如果有)
  14. // 打印读取的值
  15. Serial.print("X-axis: ");
  16. Serial.print(xValue);
  17. Serial.print(" | Y-axis: ");
  18. Serial.print(yValue);
  19. Serial.print(" | Switch: ");
  20. Serial.println(swState);
  21. delay(500); // 延迟0.5秒
  22. }

解释

  1. int VRx = 34;int VRy = 35; 分别定义了摇杆的X轴和Y轴引脚。
  2. int SW = 32; 定义了摇杆按键引脚(如果使用)。
  3. setup() 中初始化串口通信,并设置引脚模式。
  4. loop() 中,使用 analogRead() 读取摇杆的X轴和Y轴的模拟值,并使用 digitalRead() 读取按键状态。
  5. 打印读取的值到串口监视器。

调试与调整

  1. 检查接线是否正确。
  2. 确保摇杆模块的VCC和GND正确连接。
  3. 如果读取的值不正确或有噪声,可以尝试增加电源滤波电容。

这样,通过读取摇杆模块的X轴和Y轴的值,你可以在ESP32上实现各种与摇杆相关的控制和互动功能。

二、控制舵机

这里使用别人封装好的库,因为用pwm脉冲信号周期控制太麻烦了(不过可以控制LED做呼吸灯)

下一步试一下吧

使用ESP32Servo.h库来控制舵机,可以简化控制舵机的代码,并与读取摇杆的值结合起来实现更方便的控制。以下是如何实现这一功能的详细步骤和示例代码。

安装ESP32Servo

  1. 打开Arduino IDE。
  2. 选择 工具 > 库管理器
  3. 搜索 ESP32Servo,然后点击 安装

所需材料

  1. ESP32开发板
  2. 摇杆模块
  3. 舵机
  4. 面包板和跳线

接线

  1. 将摇杆模块的VCC连接到ESP32的3.3V,GND连接到ESP32的GND。
  2. 将摇杆模块的VRx连接到ESP32的GPIO 34(可以选择任意ADC引脚),VRy连接到GPIO 35。
  3. 将舵机的VCC连接到ESP32的5V,GND连接到ESP32的GND,信号线连接到ESP32的GPIO 13(可以选择任意PWM引脚)。

代码

  1. #include <ESP32Servo.h>
  2. Servo myservo; // 创建舵机对象
  3. int VRx = 34; // X轴引脚
  4. int VRy = 35; // Y轴引脚
  5. int SW = 32; // 按键引脚
  6. int servoPin = 13; // 舵机控制引脚
  7. void setup() {
  8. Serial.begin(115200);
  9. myservo.attach(servoPin); // 将舵机附加到指定的引脚上
  10. pinMode(VRx, INPUT);
  11. pinMode(VRy, INPUT);
  12. pinMode(SW, INPUT_PULLUP); // 如果使用按键引脚
  13. }
  14. void loop() {
  15. int xValue = analogRead(VRx); // 读取X轴的值
  16. int yValue = analogRead(VRy); // 读取Y轴的值
  17. int swState = digitalRead(SW); // 读取按键状态(如果有)
  18. // 将X轴和Y轴的值映射到0-180度范围内
  19. int angleX = map(xValue, 0, 4095, 0, 180);
  20. int angleY = map(yValue, 0, 4095, 0, 180);
  21. // 控制舵机
  22. myservo.write(angleX);
  23. // 打印读取的值和映射后的角度值
  24. Serial.print("X-axis value: ");
  25. Serial.print(xValue);
  26. Serial.print(" | Mapped X-axis angle: ");
  27. Serial.print(angleX);
  28. Serial.print(" | Y-axis value: ");
  29. Serial.print(yValue);
  30. Serial.print(" | Mapped Y-axis angle: ");
  31. Serial.print(angleY);
  32. Serial.print(" | Switch: ");
  33. Serial.println(swState);
  34. delay(500); // 延迟0.5秒
  35. }
 

解释

  1. #include <ESP32Servo.h> 引入了ESP32Servo库。
  2. Servo myservo; 创建了一个舵机对象。
  3. myservo.attach(servoPin); 将舵机附加到指定的引脚上。
  4. loop() 中,读取摇杆的X轴和Y轴的模拟值,并将这些值映射到舵机的角度范围内。
  5. 使用 myservo.write(angleX); 控制舵机。

调试与调整

  1. 检查接线是否正确。
  2. 如果舵机抖动或反应不灵敏,可以调整代码中的映射范围和延迟时间。
  3. 确保舵机使用的电源足够稳定,避免电源不足导致的抖动问题。

通过这种方式,你可以使用ESP32和ESP32Servo库通过摇杆来控制舵机,实现各种有趣的项目。

选择引脚的考虑因素

有4个引脚只能输入

  1. PWM功能: ESP32的几乎所有GPIO引脚都支持PWM输出功能,这是控制舵机所必需的。常用的PWM引脚有GPIO 12、GPIO 13、GPIO 14、GPIO 15等。
  2. 引脚冲突: 避免使用已经占用或有特殊功能的引脚。例如,GPIO 0、GPIO 2、GPIO 15在启动时有特定功能,可能会导致冲突。
  3. 硬件布局: 根据你的硬件布局和方便程度选择引脚。选择一个方便连接和调试的引脚。

三、XY摇杆控制两个舵机

引脚都可以自己定义,记得对照引脚图

视频

ESP32摇杆控制两个舵机

代码

里面有控制LED灯和点灯科技的物联网相关东西,可以忽略

  1. #include "OneButton.h" //引用库函数 按钮
  2. #include <WiFi.h>
  3. #include <DNSServer.h>
  4. #include <WebServer.h>
  5. #include <WiFiManager.h>
  6. #define BLINKER_MIOT_LIGHT
  7. #define BLINKER_WIFI
  8. #include <Blinker.h>
  9. #define SERVO_PIN_1 32 //舵机接GPIO33(需要ADC引脚)
  10. #define SERVO_PIN_2 33 //舵机接GPIO25(需要ADC引脚)
  11. #define YJOY_PIN 35 //从双轴读取的 Y 轴将接入模拟引脚 (需要ADC引脚)
  12. #define XJOY_PIN 34 //从双轴读取的 X 轴将接入模拟引脚 (需要ADC引脚)
  13. #define RedLed 14 // esp32开发版的引脚号 要对照开发板引脚图 GPIO来
  14. #define GreeLed 12
  15. #define BlueLed 13
  16. #include <ESP32Servo.h>
  17. Servo myservo1;
  18. Servo myservo2;
  19. // 建立WiFiManager对象
  20. WiFiManager wifiManager;
  21. int isWifi = 1;
  22. int isOk = 0;
  23. volatile int a = 1000, b = 3000;
  24. int statemachine = 0;
  25. BlinkerButton Button1("btn1"); //这里需要根据自己在BLINKER里面设置的名字进行更改
  26. void setup() {
  27. // 初始化串口
  28. Serial.begin(115200);
  29. // rgb红色 定义输出引脚
  30. pinMode(RedLed, OUTPUT);
  31. // rgb绿色 定义输出引脚
  32. pinMode(GreeLed, OUTPUT);
  33. // rgb蓝色 定义输出引脚
  34. pinMode(BlueLed, OUTPUT);
  35. pinMode(XJOY_PIN, INPUT);
  36. pinMode(YJOY_PIN, INPUT);
  37. // pinMode(SERVO_PIN_1, OUTPUT);
  38. // pinMode(SERVO_PIN_2, OUTPUT);
  39. // 初始LED关闭
  40. digitalWrite(RedLed, LOW);
  41. digitalWrite(GreeLed, LOW);
  42. digitalWrite(BlueLed, LOW);
  43. myservo1.attach(SERVO_PIN_1);
  44. myservo2.attach(SERVO_PIN_2);
  45. // ledcSetup(1, 50, 8); // 设置通道1
  46. // ledcAttachPin(SERVO_PIN_1, 1); // 将通道与对应的引脚连接
  47. // ledcSetup(2, 50, 8); // 设置通道2
  48. // ledcAttachPin(SERVO_PIN_2, 2); // 将通道与对应的引脚连接
  49. initWifi();
  50. initBlinker();
  51. }
  52. // int calculatePWM(int degree) { //0-180度
  53. // //20ms周期,高电平0.5-2.5ms,对应0-180度角度
  54. // const float deadZone = 6.4; //对应0.5ms(0.5ms/(20ms/256)) 舵机转动角度与占空比的关系:(角度/90+0.5)*1023/20
  55. // const float max = 32; //对应2.5ms
  56. // if (degree < 0)
  57. // degree = 0;
  58. // if (degree > 180)
  59. // degree = 180;
  60. // return (int)(((max - deadZone) / 180) * degree + deadZone);
  61. // }
  62. void initBlinker() {
  63. BLINKER_DEBUG.stream(Serial);
  64. String ssid = WiFi.SSID();
  65. const char* ssid_char = ssid.c_str();
  66. String psk = WiFi.psk();
  67. const char* psk_char = psk.c_str();
  68. Blinker.begin("c14dba82695f", ssid_char, psk_char);
  69. Serial.print("要链接的wifi账号:");
  70. Serial.println(ssid_char);
  71. Serial.print("wifi密码:");
  72. Serial.println(psk_char);
  73. Button1.attach(button1_callback);
  74. }
  75. void loop() {
  76. int XVal = analogRead(XJOY_PIN); //读取引脚 XJOY_PIN 上的双轴输入
  77. int YVal = analogRead(YJOY_PIN); //读取引脚 YJOY_PIN 上的双轴输入
  78. // // 打印读取的值
  79. // Serial.print("X-axis: ");
  80. // Serial.print(XVal);
  81. // Serial.print(" | Y-axis: ");
  82. // Serial.println(YVal);
  83. // 在串口监视器进行串口绘图
  84. Serial.print("X:");
  85. Serial.println(XVal);
  86. Serial.print("Y:");
  87. Serial.println(YVal);
  88. // Serial.print(" | Switch: ");
  89. // Serial.println(swState);
  90. // Serial.print(" 输出1舵机=");
  91. // XVal = map(XVal, 0, 1023, 0, 179); // 转换读取数值到角度 ,1023约等于180° 179约等于0°
  92. // Serial.println(YVal);
  93. // Serial.print(" 输出2舵机=");
  94. // YVal = map(YVal, 0, 1023, 0, 179);
  95. // Serial.println(YVal);
  96. // 将X轴和Y轴的值映射到0-180度范围内
  97. int angleX = map(XVal, 0, 4095, 0, 180);
  98. int angleY = map(YVal, 0, 4095, 0, 180);
  99. myservo1.write(angleX);
  100. myservo2.write(angleY);
  101. Serial.print("angleX:");
  102. Serial.println(angleX);
  103. Serial.print("angleY:");
  104. Serial.println(angleY);
  105. // ledcWrite(1, calculatePWM(XVal)); // 输出PWM,设置 LEDC 通道的占空比。
  106. // ledcWrite(2, calculatePWM(YVal)); // 输出PWM,设置 LEDC 通道的占空比。
  107. if (isOk == 1) {
  108. RedLedFun();
  109. GreeLedFun();
  110. BuleLedFun();
  111. }
  112. delay(30);
  113. // 一直循环点灯科技的东西
  114. Blinker.run();
  115. }
  116. void RedLedFun() {
  117. digitalWrite(RedLed, 1);
  118. delay(500);
  119. digitalWrite(RedLed, 0);
  120. }
  121. void GreeLedFun() {
  122. digitalWrite(GreeLed, 1);
  123. delay(500);
  124. digitalWrite(GreeLed, 0);
  125. }
  126. void BuleLedFun() {
  127. digitalWrite(BlueLed, 1);
  128. delay(500);
  129. digitalWrite(BlueLed, 0);
  130. }
  131. void button1_callback(const String& state) {
  132. BLINKER_LOG("get button state: ", state);
  133. Blinker.vibrate();
  134. if (state == "on" && isWifi == 1) {
  135. isOk = 1;
  136. // 给app反馈开关状态
  137. Button1.print("on");
  138. // 给app按钮变成绿色
  139. Button1.color("#00cc00");
  140. } else if (state == "off" && isWifi == 1) {
  141. isOk = 0;
  142. Button1.print("off");
  143. // 给app按钮变灰色
  144. Button1.color("#00EE00");
  145. }
  146. }
  147. void initWifi() {
  148. // wifiManager.resetSettings();
  149. // 自动连接WiFi。以下语句的参数是连接ESP8266时的WiFi名称
  150. wifiManager.autoConnect("33的热水壶");
  151. // 如果您希望该WiFi添加密码,可以使用以下语句:
  152. // wifiManager.autoConnect("AutoConnectAP", "12345678");
  153. // 以上语句中的12345678是连接AutoConnectAP的密码
  154. // WiFi连接成功后将通过串口监视器输出连接成功信息
  155. Serial.println("");
  156. Serial.print("ESP8266 Connected to ");
  157. Serial.println(WiFi.SSID()); // WiFi名称
  158. Serial.print("IP address:\t");
  159. Serial.println(WiFi.localIP()); // IP
  160. }

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/秋刀鱼在做梦/article/detail/961095
推荐阅读
相关标签
  

闽ICP备14008679号