基于STC8G2K64S4单片机使用幻尔舵机控制板

本文详细介绍了如何使用STC8G2K64S4单片机进行幻尔舵机控制板的二次开发,涉及硬件连接和软件编程。通过串口通讯,发送特定数组控制舵机动作,适合总线和非总线舵机。代码示例展示了控制单个舵机及运行预设动作组的方法。
摘要由CSDN通过智能技术生成

#前言

本文主要是讲解了如何使用STC8G2K64S4单片机二次开发使用幻尔舵机控制板

在官网给的资料里有使用方法,因为涉及到串口通讯,对于小白来说可能比较难懂

硬件方面

这块幻尔舵机控制板在淘宝店里就有卖,买的时候记得看清楚需求,类型分为总线控制和24路舵机控制。这个根据机械臂来定,总线舵机机械臂就用总线控制板,非总线舵机(包括散装)的就用24路舵机控制

个人认为总线舵机可以手动摆好位置然后在上位机上读取角度值这一个优点,其他都一样,价格是非总线舵机便宜一点。总线舵机不能单独使用,非总线舵机一次用完了还可以用在其他地方

控制板接线如下图所示

发送数据引脚接到控制板的RX插针上,当然控制系统还要跟控制板进行共地,但不一定需要接VCC。

如果发送正确数据到控制板,控制板上的蓝色LED2 灯会闪一下, 表明已经接收到正确数据;如果发送的是错误数据,那么蓝色 LED2 灯不会有任何反应,保持常亮,蜂鸣器会“滴,滴”响两声,提示用户发送数据错误

软件方面

在这里需要用到单片机的串口通讯来控制舵机控制板,但是只有发送端,运用逐飞的STC8G2K64S4单片机库函数秩序要一行代码搞定

由于舵机控制板接收识别的信号时数组,所以这里发送数组

根据不用需求发送不同数组,比如说控制单个舵机时

代码如下: 

unsigned char dongzuo1[10] = { 0x55, 0x55, 0x08, 0x03, 0x01, 0xE8, 0x03, 0x01, 0xD0, 0x07};

uart_putbuff(UART_4,&dongzuo1[0],10);    //动作运行

也可以直接输出动作组,前提是在上位机里编辑好动作组并下载到舵机控制板中,根据动作组的编号来输出数组

 

代码如下:

unsigned char dongzuo2[7] =  { 0x55, 0x55, 0x05, 0x06, 0x08, 0x01, 0x00};

uart_putbuff(UART_4,&dongzuo2[0],7);    //动作运行

相比而言,如果使用类似舵机组合的机械臂时,用控制板是个很好的选择,但当舵机数量不多时且机械结构简单可以直接输出pwm波来控制,可参考基于STC8G2K64S4单片机控制舵机文章来控制舵机

本人小白,有问题交流讨论,虚心受教

以下是基于STC8G2K64S4单片机读取AS5600角度的示例代码: ```c #include "stc12c5a60s2.h" // 引入单片机头文件 #define AS5600_ADDR 0x36 // AS5600的I2C地址 sbit SCL = P1^0; // 定义I2C时钟引脚 sbit SDA = P1^1; // 定义I2C数据引脚 unsigned char angle_low, angle_high; void delay(unsigned int t) // 延时函数 { unsigned int i, j; for (i = 0; i < t; i++) for (j = 0; j < 120; j++); } void I2C_start() // I2C起始信号 { SDA = 1; delay(1); SCL = 1; delay(1); SDA = 0; delay(1); SCL = 0; delay(1); } void I2C_stop() // I2C停止信号 { SDA = 0; delay(1); SCL = 1; delay(1); SDA = 1; delay(1); } unsigned char I2C_write_byte(unsigned char dat) // I2C写一个字节 { unsigned char i, ack; for (i = 0; i < 8; i++) { SDA = dat & 0x80; delay(1); SCL = 1; delay(1); SCL = 0; delay(1); dat <<= 1; } SDA = 1; delay(1); SCL = 1; delay(1); ack = SDA; SCL = 0; delay(1); return ack; } unsigned char I2C_read_byte() // I2C读一个字节 { unsigned char i, dat; SDA = 1; delay(1); for (i = 0; i < 8; i++) { SCL = 1; delay(1); dat <<= 1; dat |= SDA; SCL = 0; delay(1); } return dat; } void AS5600_read_angle() // 读取AS5600的角度值 { I2C_start(); I2C_write_byte(AS5600_ADDR); I2C_write_byte(0x0E); I2C_start(); I2C_write_byte(AS5600_ADDR + 1); angle_high = I2C_read_byte(); angle_low = I2C_read_byte(); I2C_stop(); } void main() { while (1) { AS5600_read_angle(); // 将angle_high和angle_low拼接成16位角度值 unsigned int angle = ((unsigned int)angle_high << 8) | angle_low; // 输出角度值 printf("angle: %u\n", angle); delay(100); // 延时一段时间后再次读取 } } ``` 需要注意的是,上述代码中的`printf`函数需要在编译环境中支持,如果是使用Keil等集成开发环境,则需要在工程设置中打开相应的printf支持选项。另外,上述代码中的I2C通信部分只是简单的实现,实际应用中可能需要更加完善的I2C通信协议处理。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值