我之前偶然间买了维特智能的16路舵机控制版,发现网上相关资料比较少,于是只能自己看说明书,自己不断探索,于是乎想把自己总结的一点知识传递出来,供大家一起学习。
硬件连接:
双路供电
1.USB 口/串口是给舵机控制板供电的, 电压 3.3V, 也是用来和上位机通讯的接口。
2.JP1 口是给舵机供电的, 电压 5-7.2V, 电流不能过小 在 1A 以上。
注: 上位机上编程时可以直接 USB 口/串口, 如果有连接舵机, 必须要用 JP1 口给舵机
供电, 不然舵机无法转动。 有双路供电情况下, 上位机操作也正确情况下, 还是不能控制
舵机的话, 请测量下 JP1 口电压是否正常, 这种现象一般是电源不稳定引起的。
USB 连接
仅需要一条手机 USB 数据线, 连接电脑和控制板, 即可连接上位机, 测试控制板的基
本功能
软件连接
( 1) 双击上位机图标 , 打开上位机。
( 2) 点击文件, 选择 16 路舵机控制板。
当上位机界面底部的显示为绿色, 即为在线状态, 此时控制板指示灯( DS1) 缓慢
闪烁
我是用正点原子的STM32F407ZGT6探索者开发板来操控的,编写了一个wt.c作为模块化管理;话不多说,上代码。
#include "sys.h"
#include "wt.h"
#include "DMREG.h"
#include "delay.h"
#define GET_LOW_BYTE(A) ((uint8_t)(A))
#define GET_HIGH_BYTE(A) ((uint8_t)((A)>>8))
uint8_t Data[128]={0};
static unsigned char TxBuffer[256];
static unsigned char TxCounter=0;
static unsigned char count=0;
extern void CopeSerial1Data(unsigned char ucData);
void UART2_Init(u32 bound)
{
GPIO_InitTypeDef GPIO_InitStructure;
USART_InitTypeDef USART_InitStructure;
NVIC_InitTypeDef NVIC_InitStructure;
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOD,ENABLE);
RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2,ENABLE);
GPIO_PinAFConfig(GPIOD,GPIO_PinSource5,GPIO_AF_USART2);
GPIO_PinAFConfig(GPIOD,GPIO_PinSource6,GPIO_AF_USART2);
//USART2端口配置
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5 | GPIO_Pin_6;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;//复用功能
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //速度50MHz
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; //推挽复用输出
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP; //上拉
GPIO_Init(GPIOD,&GPIO_InitStructure);
//USART2 初始化设置
USART_InitStructure.USART_BaudRate = bound;//波特率设置
USART_InitStructure.USART_WordLength = USART_WordLength_8b;//字长为8位数据格式
USART_InitStructure.USART_StopBits = USART_StopBits_1;//一个停止位
USART_InitStructure.USART_Parity = USART_Parity_No;//无奇偶校验位
USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;//无硬件数据流控制
USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx; //收发模式
USART_Init(USART2, &USART_InitStructure); //初始化串口2
NVIC_InitStructure.NVIC_IRQChannel = USART2_IRQn;//串口2中断通道
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=0;//抢占优先级3 数值越小优先级越高
NVIC_InitStructure.NVIC_IRQChannelSubPriority =2; //子优先级3,响应优先级
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //IRQ通道使能
NVIC_Init(&NVIC_InitStructure); //根据指定的参数初始化VIC寄存器、
USART_ITConfig(USART2, USART_IT_RXNE, ENABLE);//开启接收中断
USART_Cmd(USART2, ENABLE); //使能串口2
}
void UART2_Put_Char(unsigned char DataToSend)
{
TxBuffer[count++] = DataToSend;
USART_ITConfig(USART2, USART_IT_TXE, ENABLE);
}
void UART2_Put_String(unsigned char *Str)
{
while(*Str)
{
if(*Str=='\r')UART2_Put_Char(0x0d);
else if(*Str=='\n')UART2_Put_Char(0x0a);
else UART2_Put_Char(*Str);
Str++;
}
}
void CopeSerial1Data(unsigned char ucData)
{
}
void USART2_IRQHandler(void)
{
if(USART_GetITStatus(USART2, USART_IT_TXE) != RESET)
{
USART_SendData(USART2, TxBuffer[TxCounter++]);
if(TxCounter == count)
{
USART_ITConfig(USART2, USART_IT_TXE, DISABLE);// 全部发送完成
}
USART_ClearITPendingBit(USART2, USART_IT_TXE);
}
else if(USART_GetITStatus(USART2, USART_IT_RXNE) != RESET)
{
CopeSerial1Data((unsigned char)USART2->DR);//处理数据
USART_ClearITPendingBit(USART2, USART_IT_RXNE);
}
USART_ClearITPendingBit(USART2,USART_IT_ORE);
}
void UART2_Put_StringL(unsigned char *Str,unsigned char len)
{
unsigned char i = 0;
for (i=0;i<len;i++) UART2_Put_Char(*(Str + i));
}
//单个舵机操作
void one_servo_control(u8 servoID,u16 time,u16 degree)//舵机ID,快慢,角度(取1000-2500对应0-180°)
{
Data[0]=Data[5]=0xff;
Data[1]=0x01;Data[6]=0x02;
Data[2]=Data[7]=servoID;
Data[3]=GET_LOW_BYTE(time);
Data[4]=GET_HIGH_BYTE(time);
Data[8]=GET_LOW_BYTE(degree);
Data[9]=GET_HIGH_BYTE(degree);
UART2_Put_StringL(Data,10);
}
//动作组操作
void servo_group(u8 GroupID)//动作组ID,需提前在上位机中设置好动作组
{
Data[0]=0xff;
Data[1]=0x09;
Data[2]=0x00;
Data[3]=GET_LOW_BYTE(GroupID);
Data[4]=GET_HIGH_BYTE(GroupID);
UART2_Put_StringL(Data,5);
}
void UART_DM_ReportData(unsigned char data[])
{
UART2_Put_StringL(data,10); //打印长度根据所打印的数组长度来改,动作组是5,速度状态是10。最好填10。
}
void stop_action(void)//停止动作
{
UART_DM_ReportData(stop);
}
void next (void)//继续动作组
{
UART_DM_ReportData(continu);
}
wt.h文件如下:
#ifndef __USART2_H
#define __USART2_H
#include "sys.h"
void UART2_Init(u32 bound);
void UART2_Put_Char(unsigned char DataToSend);
void UART2_Put_String(unsigned char *Str);
void CopeSerial1Data(unsigned char ucData);
void USART2_IRQHandler(void);
void UART2_Put_StringL(unsigned char *Str,unsigned char len);
void UART_DM_ReportData(unsigned char data[]);
void one_servo_control(u8 servoID,u16 time,u16 degree);
void stop_action(void);
void next (void);
#endif
接下来只要在其他文件中调用:
one_servo_control()来进行单个多级操作;
servo_group()来进行动作组操作便可以了;
如有需要,愿君自取。