【2022得捷创新设计大赛】二自由度云台机器人控制平台
本帖最后由 HonestQiao 于 2022-11-1 23:41 编辑<p>目录:</p>
<ul>
<li><strong>一、作品简介</strong></li>
<li><strong>二、系统设计</strong></li>
<li><strong>三、硬件物料</strong></li>
<li><strong>四、硬件设计</strong></li>
<li><strong>五、实物连接</strong></li>
<li><strong>六、软件设计</strong></li>
<li><strong>七、程序代码</strong></li>
<li><strong>八、使用说明</strong></li>
<li><strong>九、实际效果</strong></li>
<li><strong>十、问题与改进</strong></li>
<li><strong>十一、参考资料</strong></li>
</ul>
<p> </p>
<p> </p>
<p><span style="font-size:20px;"><strong>一、作品简介</strong></span></p>
<p>本作品,实现了一个二自由度云台机器人控制平台,系统使用运动传感器做为控制手柄,来控制机器人的运动,并配合OLED屏,显示系统的当前状态。</p>
<p> </p>
<p><span style="font-size:20px;"><strong>二、系统设计</strong></span></p>
<p> </p>
<p>在本系统中,二自由度云台机器人,使用两个舵机,实现两个维度的自由运动。</p>
<p>系统使用一个MPU6050六轴运动传感器 ,通过实时获取其六轴运动数据,解码识别实际的运动,然后通过PCA9685控制两个舵机,从而实现通过控制手柄,来控制机器人的实际动作。</p>
<p>在机器人支架的平台上,还搭配有一个OLED显示屏,用于显示系统的当前状态,以及通过互联网对时的时钟。</p>
<p> </p>
<p><span style="font-size:20px;"><strong>三、硬件物料</strong></span></p>
<p> </p>
<p>在本作品中,使用到硬件如下:</p>
<ul>
<li>开发板:DFRobot FireBeetle ESP32-E</li>
<li>扩展板:DFRobot FireBeetle ESP32-E专用扩展板</li>
<li>OLED显示屏:SSD1306 128x64显示屏,带支架</li>
<li>运动传感器:DFRobot MPU6050,已经安装到手柄内部</li>
<li>舵机控制:PCA9685 16路舵机控制器</li>
<li>舵机:3120 20KG舵机2个</li>
<li>云台支架:1套</li>
<li>电源:正点原子数控电源</li>
</ul>
<p> </p>
<p><span style="font-size:20px;"><strong>四、硬件设计</strong></span></p>
<p>本系统的硬件结构,分为四个部分,分别为:</p>
<ol>
<li>主控中心:主控中心使用DFRobot FireBeetle ESP32-E进行逻辑控制,并搭配专用扩展板方便其他设备的接入</li>
<li>运动控制模块:使用DFRobot MPU6050,主控程序通过获取其数据,经过解码,生成纵轴和横轴控制数据,然后控制机器人运行。</li>
<li>动作执行模块:使用1个PCA9685舵机控制器和2个3120 20KG舵机,来进行机器人纵轴和横轴的动作控制。</li>
<li>显示模块:使用SSD1306 128x64的OLED显示屏,用于显示系统的当前状态,包括系统启动过程中的信息,启动后纵轴和横轴的状态,以及通过互联网对时的时钟。</li>
</ol>
<p>在上述模块中:</p>
<ul>
<li>舵机控制器PCA9685为I2C接口,供提供了16组舵机接口,编号为0-15,这里使用最后的两个接口,接入两个舵机分别用于机器人纵轴和横轴的控制</li>
<li>所使用的运动传感器DFRobot MPU6050,同样为I2C接口</li>
<li>所使用的SSD1306 128x64 OLED显示屏,也为I2C接口</li>
<li>专用扩展板上刚好提供了3组I2C接口,正好用于接入上述3个I2C设备的接入</li>
</ul>
<p>另外:</p>
<ul>
<li>为了确保舵机能够稳定运行,使用了一个正点原子数控电源专门为舵机控制器PCA9685提供5V电源输入。</li>
<li>为了方便使用MPU6050进行稳定的控制,使用了一个掏空内部的儿童牙刷来内置MPU6050,方便手持操作。</li>
</ul>
<p>硬件设计规划如下连线:</p>
<p> </p>
<p>在ESP32开发板上,上图对应的USB接口右则,有一个按键,Pin为27,系统使用该按键,来启停舵机的控制。</p>
<p> </p>
<p><span style="font-size:20px;"><strong>五、实物连接</strong></span></p>
<p><strong>1. 舵机归零矫正:</strong></p>
<p></p>
<p>连接说明:</p>
<ol>
<li>将 PCA9685 连接到扩展板的I2C接口</li>
<li>将舵机1连接到 PCA9685 的 14 舵机控制接口</li>
<li>将舵机2连接到 PCA9685 的 15 舵机控制接口</li>
</ol>
<p>在将舵机安装到支架上之前,需要先进行舵机归零矫正,确保安装时各零部件能够对准角度。</p>
<p><br />
<strong> 2. 实际运行连接:</strong></p>
<p> </p>
<p> <br />
<br />
</p>
<p>连接说明:</p>
<ol>
<li>将扩展板平插到ESP32开发板上</li>
<li>将 PCA9685 连接到扩展板的I2C接口1</li>
<li>将OLED连接到扩展板的I2C接口2</li>
<li>将 MPU6050 连接到扩展板的I2C接口3</li>
<li>将舵机连接到PCA9685的14、15舵机接口</li>
<li>使用数控电源给PCA9685供电</li>
</ol>
<p> </p>
<p><span style="font-size:20px;"><strong>六、软件设计</strong></span></p>
<p>本控制平台的软件逻辑设计图如下:</p>
<p></p>
<p> </p>
<p> </p>
<p>在系统的开发过程中,经过反复斟酌和测试,最终选用Arduino IDE进行开发。</p>
<p>在开发的过程中,使用到了如下的Arduino库:</p>
<ul>
<li>DFRobot ESP32 Boards:DFRobot提供的开发板支持库</li>
<li>WiFi:内置</li>
<li>
<p>Time:时间处理,<a href="https://github.com/PaulStoffregen/Time">PaulStoffregen/Time: Time library for Arduino (github.com)</a></p>
</li>
<li>
<p>Timezone:时区处理,<a href="https://github.com/JChristensen/Timezone">JChristensen/Timezone: Arduino library to facilitate time zone conversions and automatic daylight saving (summer) time adjustments. (github.com)</a></p>
</li>
<li>
<p>MPU6050_tockn:MPU6050驱动库,<a href="https://github.com/tockn/MPU6050_tockn">tockn/MPU6050_tockn: Arduino library for easy communication with MPU6050 (github.com)</a></p>
</li>
<li>
<p>Adafruit_PWMServoDriver:舵机驱动库,<a href="https://github.com/adafruit/Adafruit-PWM-Servo-Driver-Library">adafruit/Adafruit-PWM-Servo-Driver-Library: Adafruit PWM Servo Driver Library (github.com)</a></p>
</li>
<li>
<p>Adafruit_SSD1306:OLED驱动库,<a href="https://github.com/adafruit/Adafruit_SSD1306">adafruit/Adafruit_SSD1306: Arduino library for SSD1306 monochrome 128x64 and 128x32 OLEDs (github.com)</a></p>
</li>
<li>
<p>Adafruit-GFX:显示图形处理, <a href="https://github.com/adafruit/Adafruit-GFX-Library">adafruit/Adafruit-GFX-Library: Adafruit GFX graphics core Arduino library, this is the 'core' class that all our other graphics libraries derive from (github.com)</a></p>
</li>
<li>
<p>U8g2_for_Adafruit_GFX:支持Adafruit_GFX的U8g2库,用于Unicode字符串显示,<a href="https://github.com/olikraus/U8g2_for_Adafruit_GFX">olikraus/U8g2_for_Adafruit_GFX: Add U8g2 fonts to any Adafruit GFX based graphics library. (github.com)</a></p>
</li>
</ul>
<p> </p>
<p><span style="font-size:20px;"><strong>七、程序代码</strong></span></p>
<p>控制平台的系统代码如下:</p>
<p>1. 码云代码库:<a href="https://gitee.com/honestqiao/2d_robot" target="_blank">https://gitee.com/honestqiao/2d_robot</a></p>
<p>2. 代码截图:</p>
<p></p>
<p> </p>
<p>在代码中,有几个关键点,需要详细说明:</p>
<p>首先是显示的图标和字体:</p>
<p></p>
<p> </p>
<p>在OLED显示屏操作界面中,使用到了4个图标,分别为电源、启/停、WiFi,使用了U8g2中的特殊字体来显示的。</p>
<p>其中,电源和WiFi图标,为u8g2_font_siji_t_6x10字体的0x0e200、0x0e21a,启动图标为 0x0e058,停止图标为0x0e059</p>
<p>在启动控制后,控制界面中,纵轴圆圈指向图标,为u8g2_font_unifont_t_86字体的0x02b6f,横轴上下箭头图标为0x02b65</p>
<p>其他显示使用的字体,均为u8g2_font_unifont_t_chinese2</p>
<p> </p>
<p>然后,在获取到MPU6050数据解码后,对纵轴的数据,应用了卡尔曼滤波进行优化处理,得到更为准确的数据。</p>
<p>该卡尔曼滤波的Kalman_Filter函数,来自于网上公开的代码,向提供该函数的作者表示感谢。</p>
<p> </p>
<p>最后,互联网时间同步部分,使用了第三方的Time时间库,用于与公开的ntp服务器进行对时。该部分的代码,可以提取出来,做成互联网时钟。</p>
<p> </p>
<p> </p>
<p><span style="font-size:20px;"><strong>八、使用说明</strong></span></p>
<p>系统的使用步骤如下:</p>
<ol>
<li>系统启动:
<ul>
<li>确保各部分连接正确后,上电启动,初始化各部件</li>
<li>启动过程中,显示屏将显示当前启动进度</li>
<li>启动完成后,屏幕将显示操作界面</li>
<li>启动后,默认情况下,处于机器人停止状态</li>
</ul>
</li>
<li>按键操作:
<ul>
<li>ESP32开发板左则的RST按键,用于系统重启</li>
<li>ESP32开发板右则的Pin27按键,用于启停机器人舵机控制</li>
<li>Pin27按键奇数次按键,启动机器人舵机控制,偶数次按键,停止机器人舵机控制</li>
</ul>
</li>
<li>手柄操作:
<ul>
<li>系统启动过程中,应手持手柄保持垂直竖立状态,以便系统正确计算初始化状态;</li>
<li>应根据自己所使用的MPU6050芯片,确定正确的芯片放置方向</li>
<li>启动完成后,向前压手柄,或者向后压手柄,控制机器人横向舵机运动</li>
<li>启动完成后,以手柄竖向中心线为中心旋转,控制机器人纵向舵机运动</li>
</ul>
</li>
<li>显示屏状态:
<ul>
<li>启动过程中,依次显示各部分初始化情况</li>
<li>启动后,界面显示各状态图标,包括当前控制状态,以及当前的时钟</li>
<li>Pin27按键依次以后,将会显示纵轴和横轴舵机控制角度</li>
</ul>
</li>
</ol>
<p> </p>
<p><span style="font-size:20px;"><strong>九、实际效果</strong></span></p>
<p>按下ESP32开发板的RST按键后,手持手柄,保持竖立状态,等待系统初始化启动完成。</p>
<p>启动完成以后,按一下ESP32开发板右则的按键,使能手柄控制机器人,然后就可以进行操作控制了。</p>
<p> <br />
运行过程中,OLED显示屏显示如下:</p>
<p></p>
<p>在上图中,各区域信息如下:</p>
<ul>
<li>状态栏:分别为电源接入图标、运行状态图标(启动时默认暂停)、互联网对时时钟、WiFi图标</li>
<li>内容区域:显示平台名称</li>
</ul>
<p> 当按下ESP32开发板右则按键后,进行控制操作时,OLED显示屏显示如下:</p>
<p></p>
<p>在上图中,各区域的信息如下:</p>
<ul>
<li>状态栏:分别为电源接入图标、运行状态图标(当前为使用运行)、互联网对时时钟、WiFi图标</li>
<li>内容区域:显示纵轴和横轴舵机对应的角度值</li>
</ul>
<p> </p>
<p><span style="font-size:20px;"><strong>十、问题与改进</strong></span></p>
<p>在实际开发,经过反复的测试,目前还有如下问题需要解决或者优化:</p>
<ol>
<li>OLED显示屏操作界面的显示,目前使用了全屏刷新,可优化为仅刷新发生变化的部分;</li>
<li>MPU6050长时间使用后,会发生一定的漂移,正在详细了解相关的资料,以便进行优化。</li>
</ol>
<p> </p>
<p><span style="font-size:20px;"><strong>十一、参考资料</strong></span></p>
<p>在本作品设计开发的过程中,查阅学习了上百篇文档资料,对于提供这些资料的作者表示万分的感谢。</p>
<p>这些文档资料,包括但不限于如下链接:</p>
<ul>
<li><a href="https://wiki.dfrobot.com.cn/_SKU_DFR0654_FireBeetle_Board_ESP32_E">DFR0654_FireBeetle_Board_ESP32_E (dfrobot.com.cn)</a></li>
<li><a href="https://github.com/olikraus/u8g2">olikraus/u8g2: U8glib library for monochrome displays, version 2 (github.com)</a></li>
<li><a href="https://learn.adafruit.com/16-channel-pwm-servo-driver/hooking-it-up">Hooking it Up | Adafruit PCA9685 16-Channel Servo Driver | Adafruit Learning System</a></li>
<li><a href="https://www.aranacorp.com/en/using-a-pca9685-module-with-arduino/">Using a PCA9685 module with Arduino • AranaCorp</a></li>
<li><a href="https://www.7gp.cn/archives/326">16路PWM舵机驱动板(PCA9685)的使用说明(更新中) | 奇果派工坊 (7gp.cn)</a></li>
<li><a href="https://techexplorations.com/blog/esp32/firebeetle-esp32e-arduinoiotcloud/">Firebeetle ESP32-E with Arduino IoT Cloud, 评论 - 技术探索 (techexplorations.com)</a></li>
<li><a href="https://community.dfrobot.com/makelog-310356.html">Make a Home-made Network Clock with ESP32-E (dfrobot.com)</a></li>
<li><a href="https://randomnerdtutorials.com/esp32-ntp-client-date-time-arduino-ide/">Getting Date and Time with ESP32 (NTP Client) | Random Nerd Tutorials</a></li>
<li><a href="https://www.instructables.com/ESP32-and-OLED-Display-Internet-Clock-DHT22/">ESP32 and OLED Display: Internet Clock - DHT22 : 10 Steps (with Pictures) - Instructables</a></li>
<li><a href="https://www.dfrobot.com/product-2231.html">FireBeetle 2 ESP32-E IoT Microcontroller with Header - DFR0654-F | DFRobot Electronics</a></li>
<li><a href="https://cloud.tencent.com/developer/article/1891228">ESP32使用u8g2显示库(SSD1306驱动) - 腾讯云开发者社区-腾讯云 (tencent.com)</a></li>
<li><a href="https://blog.jmaker.com.tw/u8g2-oled/"> 一套u8g2函式庫,玩遍所有OLED (jmaker.com.tw)</a></li>
<li><a href="https://blog.darkthread.net/blog/u8g2-cht-font-tool/">Coding4Fun - Arduino/ESP u8g2 中文字庫自動化工具-黑暗執行緒 (darkthread.net)</a></li>
<li><a href="https://github.com/olikraus/U8g2_for_Adafruit_GFX">olikraus/U8g2_for_Adafruit_GFX: Add U8g2 fonts to any Adafruit GFX based graphics library. (github.com)</a></li>
<li><a href="https://learn.adafruit.com/monochrome-oled-breakouts/arduino-library-and-examples">Arduino Library & Examples | Monochrome OLED Breakouts | Adafruit Learning System</a></li>
<li><a href="https://juejin.cn/post/7097851044767465486">如何自制自平衡云台基于mpu6050,arduino输出三维倾斜角度的方法(含源码,库) - 掘金 (juejin.cn)</a></li>
<li><a href="https://atceiling.blogspot.com/2019/10/arduino74pca9685servo.html">Arduino筆記(74):PCA9685控制Servo伺服馬達 | 天花板隨記 (atceiling.blogspot.com)</a></li>
<li><a href="https://github.com/tockn/MPU6050_tockn">tockn/MPU6050_tockn: Arduino library for easy communication with MPU6050 (github.com)</a></li>
<li><a href="https://blog.51cto.com/u_15127578/3585308">mpu6050控制舵机云台_51CTO博客_mpu6050</a></li>
<li><a href="https://wiki.dfrobot.com/6_DOF_Sensor-MPU6050__SKU_SEN0142_">6_DOF_Sensor-MPU6050__SKU_SEN0142_-DFRobot</a></li>
<li><a href="https://github.com/adafruit/Adafruit-PWM-Servo-Driver-Library">adafruit/Adafruit-PWM-Servo-Driver-Library: Adafruit PWM Servo Driver Library (github.com)</a></li>
<li><a href="https://www.dfrobot.com/product-1576.html">Gravity I2C OLED-128x64 Display - DFRobot</a></li>
<li><a href="https://www.aranacorp.com/en/using-an-oled-display-with-arduino/">Using an OLED Display with Arduino • AranaCorp</a></li>
</ul>
<p>将舵机连接到PCA9685的14、15舵机接口,这个舵机接口是个什么协议接口呢</p>
火辣西米秀 发表于 2022-10-31 08:27
将舵机连接到PCA9685的14、15舵机接口,这个舵机接口是个什么协议接口呢
舵机是PWM脉宽控制的。
舵机控制器,是I2C接口的。
页:
[1]