简介:设计舵机控制的上位机和运行在舵机控制板的下位机的代码,实现舵机的联动控制。
显示如下效果:

开发环境:Visual Studio 2017/Arduino IDE
语言:C#/C
演示功能:
1.设计上位机,使用户可以拖动其界面中的滑块,并通过串口向单片机控制板发送指令。
2.在MCU控制板中设计固件程序,接收并解析来自上位机的串行命令,根据命令控制舵机运动。
3.这里的MCU控制板采用的是自己设计的一块arduino板,其他MCU板也可以,主要是了解它的通信原理。
以下源代码截图:
部分上位机源代码截图:
界面实现代码实现代码还有一些下位机的源代码截图:
arduino实现代码arduino实现代码上位机要注意串口的设置。demo设计比较简单,只实现了原理。在舵机控制方面,有多种玩法,包括将指定动作写入控制板,保存在芯片flash中实现回放;您也可以在线编辑行动组;舵机控制板也可以用stm32或51单片机设计电路和程序。
下面是源代码:
上位机源代码:
使用系统;
使用系统。集合。泛型;
使用系统。组件模型;
使用系统。数据;
使用系统。绘图;
使用系统。Linq
使用系统。文本;
使用系统。线程。任务;
使用系统。Windows . Forms
命名空间舵机图形主机软件
{
公共分部类Form1 : Form
{
公共表单1
{
InitializeComponent
}
bool buttonstatus = false
私有void按钮1_Click
{
尝试
{
如果
{
串行端口1。PortName = textBox3。Text . ToString//设置端口号
串行端口1。BaudRate =转换。ToInt32//设置波特率
串行端口1。开放;//打开串口
buttonstatus = true
面板1。BackColor =颜色。蓝色;
定时器1。Enabled = true
1.button = "关闭串口";
}
其他
{
串行端口1。关闭;//打开串口
buttonstatus = false
面板1。BackColor =颜色。红色;
定时器1。Enabled = false
1.button = "打开串口";
}
}
捕捉
{
MessageBox。展示;
}
}
私有空定时器1_Tick
{
串行端口1。write+" r n ");
串行端口1。write+" r n ");
文本框1。Text = trackBar1。Value . ToString
文本框2。Text = trackBar2。Value . ToString
}
}
}
下位机arduino源代码:
#包括
//定义转向器
伺服myservo2
伺服myservo3
int com data[8];//串口信息数组接收
int counter = 0;//串行计数器
电机内部;//定义舵号
int pwm
//转向器中值的定义
int compare2 = 1500
int compare3 = 1500
//串口接收数据位定义

int data _ 1;
int data _ 2;
int data _ 3;
int data _ 4;
int data _ 5;
int data _ 6;
int data _ 7;
int数据;
int标志;//串口接收标志位
无效设置{
//将您的安装代码放在这里,运行一次:
//舵机和串口配置
Serial.begin
my servo 2 . attach;
my servo 3 . attach;
}
无效循环{
//将您的主代码放在这里,以便重复运行:
While > 0) //串口接收数据时
{
comdata[counter]=);//读取数据
If )//判断数据帧的报头
{
flag = 1;//将接收标志位置1
}
如果
{
如果//判断何时接收到第一位数据
{
//判断舵号
如果
{
电机= 2;
}
否则如果
{
电机= 3;
}
}
//开始判断并求解舵机的运动参数。
如果
{
data _ 1 = com data[counter]-0x 30;
}
如果
{
data _ 2 = com data[counter]-0x 30;
}
如果
{
data _ 3 = com data[counter]-0x 30;
}
如果
{
data _ 4 = com data[counter]-0x 30;
}
如果
{
data _ 5 = com data[counter]-0x 30;
}
如果
{
//开始计算舵机的运动参数。
data _ 6 = com data[counter]-0x 30;
数据=数据_ 1 * 100000+数据_ 2 * 10000+数据_ 3 * 1000+数据_ 4 * 100+数据_ 5 * 10+数据_ 6;
flag = 0;
//用相应的数字开始舵机的打角。
如果
{
compare2 =数据;
my servo 2 . write微秒;
}
如果
{
compare3 =数据;
my servo 3 . write微秒;
}
计数器= 0;
goto aa
}

counter++;
aa:;
}
}
}


