210浏览
查看: 210|回复: 0

[K10项目分享] 行空板K10驱动舵机点亮屏

[复制链接]
本帖最后由 meiyao 于 2025-2-7 16:01 编辑

行空板K10是一款集成了多种功能的开发板,适用于教学、物联网项目等多种场景,所以它可以做很多好玩的东西。
思路:
      利用行空板与自己画的底板连接,插入的方式进行连接,要注意插入时,是有正反方向的,如果插入弄反了,会出现供电与通信不上的情况,还有可能出现烧坏相关元件和K10板的情况。
      底板的功能主要是扩展相关的外设作用,上面可以连接1.25mm-2.0MM间距的通用连接器的IIC通信的外设.
      底板上面还有一个PCA9685PW芯片,这个芯片可以同时控制多个舵机工作。
      底板上面还有一个充电管理芯片,可以进行电池充电和升压功能的功能,可以同时满足K10与外设的工作,但是功率不能超过他的实际设定功率,功率过高会出现不能给其它外设供电不足的情况。
      底板上面还有几个按键,是为了方向进行GPIO操作的,用来控制其它功能动作的,还包括充电指示,电源开关的作用。


一、硬件
1、行定板K10。
2、自己设计的底板。
3、舵机

硬件设计与它们的性能:

扩展板3D正面图:
行空板K10驱动舵机点亮屏图1
K10底板正面主要的器件是连接作用。
主要是给其它的通信外设进行连接,比如可以进行温度湿度传感器,IIC通信的键盘连接,中间黑色2.54MM的排针主要是给舵机进行连接的,电源和地PWM引脚需要注意方向,不能连接相反,可以并排8个舵机同时工作。
还有三个GPIO按键与一个电源开关,还有一个TYPE C供电输入口。


扩展板3D底部图:
行空板K10驱动舵机点亮屏图2
扩展板3D底部图:主要是电源与PCA9685PW芯片,还包括1117LDO供电芯片。

原理图:
行空板K10驱动舵机点亮屏图3

下图1红框中是2.0MM的连接器,
2黄框中是2.54MM舵机的连接位,
3白框是电源连接器接口,
当然还有与TYPE C并排的1.25连接器。
行空板K10驱动舵机点亮屏图12


芯片:
PCA9685PW
厂商:NXP(恩智浦)
封装:TSSOP28
工作电压范围:2.3V至5.5V
输入/输出容差电压:5.5V
输出电流:25mA(5V时)



技术参数:
产品名称:SG90 9g 小型舵机 (S版)
厂家编号:SG90S
产品尺寸: 23x12.2x29mm
产品扭矩: 1.6kg/cm(4.8V)
反应速度: 0.1sec/60degree(4.8v)
工作电压: 4.8V
使用温度: 0-55度
动作死区: 10us
齿轮介质: 尼龙
工作模式: 模拟

包含:
1 x  9g 小型舵机 (S版) 带摇臂包

行空板K10驱动舵机点亮屏图4


二、焊接与连接事物图:

焊接完成图:
行空板K10驱动舵机点亮屏图5
上面的图是手工焊接完成的实物照片,正反面照。

未焊接插座图:
行空板K10驱动舵机点亮屏图6

底部图:
行空板K10驱动舵机点亮屏图7
上面的两个是当时焊接过程的照片。

成品连接图:
行空板K10驱动舵机点亮屏图8

行空板K10驱动舵机点亮屏图9

三、代码:

  1.   Use SERVO2 Module to control the rotation of 16-channel servo.
  2.   使用 SERVO2 模块控制 16 通道舵机的旋转。
  3. */
  4. // #include <M5Stack.h>
  5. #include <Wire.h>
  6. #include "Adafruit_PWMServoDriver.h"
  7. Adafruit_PWMServoDriver pwm = Adafruit_PWMServoDriver(0x40, Wire);
  8. #define SERVOMIN \
  9.     102  // This is the 'minimum' pulse length count (out of 4096)
  10.          // 这是“最小”脉冲长度计数(共 4096 个)
  11. #define SERVOMAX \
  12.     512  // This is the 'maximum' pulse length count (out of 4096)
  13.          // 这是“最大”脉冲长度计数(共 4096 个)
  14. #define USMIN \
  15.     500  // This is the rounded 'minimum' microsecond length based on the
  16.          // minimum pulse of 102  这是基于 102 的最小脉冲的舍入“最小”微秒长度
  17. #define USMAX \
  18.     2500  // This is the rounded 'maximum' microsecond length based on the
  19.           // maximum pulse of 512  这是基于 512 的最大脉冲的舍入“最大”微秒长度
  20. #define SERVO_FREQ \
  21.     50  // Analog servos run at ~50 Hz updates  模拟伺服以 ~50 Hz 更新运行
  22. void setup() {
  23.     // M5.begin(true, true, true, true);
  24.     Wire.begin(47,48);
  25.     pwm.begin();
  26.     pwm.setPWMFreq(50);
  27.     // M5.Lcd.setCursor(115, 0, 4);
  28.     // M5.Lcd.setTextColor(TFT_GREEN, TFT_BLACK);
  29.     // M5.Lcd.print("Servo2");
  30. }
  31. void setServoPulse(uint8_t n, double pulse) {
  32.     double pulselength;
  33.     pulselength = 1000000;  // 1,000,000 us per second
  34.     pulselength /= 50;      // 50 Hz
  35.     Serial.print(pulselength);
  36.     Serial.println(" us per period");
  37.     pulselength /= 4096;  // 12 bits of resolution
  38.     Serial.print(pulselength);
  39.     Serial.println(" us per bit");
  40.     pulse *= 1000;
  41.     pulse /= pulselength;
  42.     Serial.println(pulse);
  43.     pwm.setPWM(n, 0, pulse);
  44. }
  45. void servo_angle_write(uint8_t n, int Angle) {
  46.     double pulse = Angle;
  47.     pulse        = pulse / 90 + 0.5;
  48.     setServoPulse(n, pulse);
  49. }
  50. void loop() {
  51.     for (int i = 0; i < 16; i++) {
  52.         setServoPulse(i, 0.5);
  53.     }
  54.     delay(500);
  55.     for (int i = 0; i < 16; i++) {
  56.         setServoPulse(i, 2.5);
  57.     }
  58.     delay(500);
  59. }
复制代码
这段代码使用 Adafruit PWM/Servo Driver (PCA9685) 模块来控制一个 16 通道的舵机系统。主要代码引入了必要的库,用于 I2C 通信和 Adafruit_PWMServoDriver.h 用于控制 PCA9685 模块,定义脉冲长度,通过 pwm.setPWMFreq(50); 设置 PWM 频率为 50 Hz,模拟舵机的标准更新频率,代码的主要功能是使舵机按照程序的设定正反工作。


四、软件工作流程:

行空板K10驱动舵机点亮屏图13
说明:
开始:程序启动点。
初始化设置:包含一些未执行的M5Stack初始化等,以及后续执行的Wire和pwm初始化相关操作。
设置 I2C 引脚 47,48:通过Wire.begin(47, 48)设置 I2C 通信的引脚。
初始化 PWM 驱动:使用pwm.begin()初始化Adafruit_PWMServoDriver。
设置 PWM 频率为 50Hz:调用pwm.setPWMFreq(50)设置 PWM 频率,以满足模拟舵机约 50Hz 的更新需求。
进入主循环:程序进入loop函数开始循环执行。
遍历 16 通道舵机:通过for循环遍历 1 到 16 通道的舵机。
设置当前通道舵机脉冲为 0.5:调用setServoPulse函数设置当前通道舵机的脉冲为 0.5 。
延迟 500 毫秒:调用delay(500)函数使程序暂停 500 毫秒。
遍历 16 通道舵机:再次通过for循环遍历 1 到 16 通道的舵机。
设置当前通道舵机脉冲为 2.5:调用setServoPulse函数设置当前通道舵机的脉冲为 2.5 。
延迟 500 毫秒:调用delay(500)函数使程序暂停 500 毫秒,之后回到主循环继续执行。


五、实际运行视频:

行空板K10驱动舵机点亮屏图10

屏点亮效果图:
行空板K10驱动舵机点亮屏图11









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

本版积分规则

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

硬件清单

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

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

mail