C#串口控制舵机、arduino源码 及C#源码及界面

简介: 原文 C#串口控制舵机、arduino源码 及C#源码及界面 1.舵机原理简介         控制信号由接收机的通道进入信号调制芯片,获得直流偏置电压。它内部有一个基准电路,产生周期为20ms,宽度为1.5ms的基准信号,将获得的直流偏置电压与电位器的电压比较,获得电压差输出。

原文 C#串口控制舵机、arduino源码 及C#源码及界面

1.舵机原理简介

       wKiom1X83d_A7UpBAAEyGBJFunE380.jpg

控制信号由接收机的通道进入信号调制芯片,获得直流偏置电压。它内部有一个基准电路,产生周期为20ms,宽度为1.5ms的基准信号,将获得的直流偏置电压与电位器的电压比较,获得电压差输出。最后,电压差的正负输出到电机驱动芯片决定电机的正反转。当电机转速一定时,通过级联减速齿轮带动电位器旋转,使得电压差为0,电机停止转动。 

舵机的控制一般需要一个20ms左右的时基脉冲,该脉冲的高电平部分一般为0.5ms-2.5ms范围内的角度控制脉冲部分,总间隔为2ms。以180度角度伺服为例,那么对应的控制关系是这样的:   

0.5ms--------------0度;    

1.0ms------------45度;    

1.5ms------------90度;    

2.0ms-----------135度;    

2.5ms-----------180度;

 

2.arduino下位机源码

相关源码已压缩上传,需要请下载对应附件

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
#include<Servo.h>  //库文件
Servo servo1;     
static  int  v=0;
String mycommand= "" ;
void  setup()
   {
     Serial.begin(9600); //此处为串口设置的波特率 ,可以修改 必须同上位机设置的波特路一致。
     servo1.attach(3);   // 控制的端口是~3号
     servo1.write(90);
   }
void  loop() 
  {
     while (Serial.available()>0)
     {
       mycommand+= char (Serial.read());
       delay(2);
     }
     for ( int  m=0;m<mycommand.length();m++)  // 
        {
           char  ch = mycommand[m];    //读取串口数据
           switch (ch)
              {
                  case  '0' ... '9' :
                        v = v*10 + ch -  '0' ;    //字符转换成十进制
                         break ;
                   case  'a' :    //如果数据后带a,则表示是一号舵机的数据,比如串口发送85a
                         //if(v >= 5 || v <= 175 )   
                          servo1.write(v);  // 让A从66度旋转到9度 (可修改角度)                     
                          //用于设定舵机旋转角度的语句,可设定的角度范围是0°到180°,“V”得到所输入的值而改变角度,比如85a为85度角
                          Serial.println(v+ "°" ); //舵机角度改变后 发送改变的角度到上位机。
                          v = 0;
                           break ;
                      }
    
           }  
    mycommand= "" ;
}



    wKiom1X85Y7CkQbwAD6l1QJr6rA555.jpg

     

我选择我的是arduino Uno,舵机的接线方法是红色(VCC)端接控制板的5V处,棕色端接板子的GND,舵机的橙色线为信号线,接板子上的3号口;

 

 

 

 

 

 

3.C#上位机源码及界面

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
using  System;
using  System.Collections.Generic;
using  System.ComponentModel;
using  System.Data;
using  System.Drawing;
using  System.Linq;
using  System.Text;
using  System.Threading.Tasks;
using  System.Windows.Forms;
namespace  舵机上位机源码
{
     public  partial  class  Form1 : Form
     {
         bool  open =  false ;
         public  delegate  void  HandleInterfaceUpdataDelegate( string  text);
         private  HandleInterfaceUpdataDelegate interfaceUpdataHandle;
         int  a;
         public  Form1()
         {
             InitializeComponent();
         }
         private  void  Form1_Load( object  sender, EventArgs e)
         {
             comboBox1.Items.AddRange(System.IO.Ports.SerialPort.GetPortNames()); //从系统获取已有串口
             if  (comboBox1.Items.Count > 0)
             {
                 comboBox1.SelectedIndex = 0; //串口变量初始化
                 serialPort1.RtsEnable =  true ; //DataReceived事件委托
                 serialPort1.ReceivedBytesThreshold = 1; //设置 DataReceived 事件发生前内部输入缓冲区中的字节数
                 serialPort1.DataReceived +=  new  System.IO.Ports.SerialDataReceivedEventHandler( this .serialPort1_DataReceived);
                 comboBox2.SelectedIndex = 6;
             }
             else
             {
                 MessageBox.Show( "未检测到设备\r\n" );
             }
         }
         //监听串口
         private  void  serialPort1_DataReceived( object  sender, System.IO.Ports.SerialDataReceivedEventArgs e)
         {
             try
             {
                 string  text =  string .Empty;
                 byte [] result =  new  byte [serialPort1.BytesToRead];
                 serialPort1.Read(result, 0, serialPort1.BytesToRead);
                 text = Encoding.UTF8.GetString(result);
             }
             catch 
             {
                
             }
         }
         //串口刷新按钮
         private  void  button2_Click( object  sender, EventArgs e)
         {
             comboBox1.Items.Clear();
             comboBox1.Items.AddRange(System.IO.Ports.SerialPort.GetPortNames());
             if  (comboBox1.Items.Count > 0)
             {
                 comboBox1.SelectedIndex = 0;
             }
             else
             {
                 MessageBox.Show( "未检测到串口\r\n" );
             }
         }
         
         //打开串口
         private  void  btnOpen_Click( object  sender, EventArgs e)
         {
             if  (open ==  false )
             {
                 
                 if  (serialPort1.IsOpen)
                 {
                     MessageBox.Show( "串口已经打开" "提示" , MessageBoxButtons.OK, MessageBoxIcon.Information);
                     return ;
                 }
                 //串口
                 if  (comboBox1.Text ==  string .Empty)
                 {
                     MessageBox.Show( "请选择串口" "提示" , MessageBoxButtons.OK, MessageBoxIcon.Information);
                     return ;
                 }
                 //波特率
                 if  (comboBox2.Text ==  string .Empty)
                 {
                     MessageBox.Show( "请选择波特率" "提示" , MessageBoxButtons.OK, MessageBoxIcon.Information);
                     return ;
                 }
                 serialPort1.BaudRate =  int .Parse(comboBox2.Text);
                 try
                 {
                     serialPort1.PortName = comboBox1.SelectedItem.ToString();
                     serialPort1.Open();
                 }
                 catch
                 {
                     try
                     {
                         comboBox1.SelectedIndex = comboBox1.SelectedIndex + 1;
                     }
                     catch
                     {
                         comboBox1.SelectedIndex = 0;
                     }
                     serialPort1.Close();
                 }
                 btnOpen.Text =  "关闭" ;
                 comboBox1.Enabled =  false ;
                 comboBox2.Enabled =  false ;
                 open =  true ;
                 trackBarSend_Scroll( this null );
                 btnReserch.Enabled =  false ;
                 btnsend.Enabled =  true ;
                 tbxSend.Enabled =  true ;
                 trackBarSend.Enabled =  true ;
                 pictureBox1.BackColor = Color.Lime;
             }
             else
             {
                 try
                 {
                     serialPort1.Close();
                     btnOpen.Text =  "打开" ;
                     open =  false ;
                     comboBox1.Enabled =  true ;
                     comboBox2.Enabled =  true ;
                     btnReserch.Enabled =  true ;
                     btnsend.Enabled =  false ;
                     tbxSend.Enabled =  false ;
                     trackBarSend.Enabled =  false ;
                     pictureBox1.BackColor = Color.Silver;
                 }
                 catch
                 {
                 }
             }
         }
         private  void  trackBarSend_Scroll( object  sender, EventArgs e)
         {
             if  (serialPort1.IsOpen)
             {
                 a = trackBarSend.Value;
                 string  duojiA = trackBarSend.Value.ToString() +  "a" ;
                 try
                 {
                     serialPort1.WriteLine(duojiA);
                     tbxSend.Text = a.ToString(); ; ;
                 }
                 catch
                 {
                 }
             }
         }
         private  void  btnsend_Click( object  sender, EventArgs e)
         {
             try
             {
                 byte [] SendBuf =  new  byte [100000];
                 SendBuf = System.Text.Encoding.Default.GetBytes(tbxSend.Text+ "a" );
                 serialPort1.Write(SendBuf, 0, SendBuf.Length);
             }
             catch  (Exception err)
             {
                 if  (serialPort1.IsOpen)
                     serialPort1.Close(); //如果是写数据时出错,此时窗口状态为开,就应关闭串口,防止下次不能使用,串口是不能重复打开和关闭的
                 MessageBox.Show(err.ToString(),  "错误" );
             }
         }
         private  void  tbxSend_ValueChanged( object  sender, EventArgs e)
         {
             trackBarSend.Value = ( int )tbxSend.Value;
         }
     }
}

 

   

wKioL1X89RzTSBEvAAC-pgj9rOE503.jpg

wKiom1X88uLiaNuNAACSH9kDILg122.jpg

                                                            未连接设备状态

wKioL1X89R2TOm6tAACW11E8wdI166.jpg

                                                                连接设备后

wKiom1X883uRwFneAAGPDChUgtI158.jpg

                                            这是自己做的机械臂控制软件 相关源码也有

wKioL1X89bahD3yCAAW1gGFplBI493.jpg

                                                            这是wifi智能小车控制软件

 

 

第一次写博文,有不好的地方还请多多包涵。

目录
相关文章
|
6月前
|
开发框架 前端开发 JavaScript
C# 6.0+JavaScript云LIS系统源码  云LIS实验室信息管理新型解决方案
云LIS是为区域医疗提供临床实验室信息服务的计算机应用程序,可协助区域内所有临床实验室相互协调并完成日常检验工作,对区域内的检验数据进行集中管理和共享,通过对质量控制的管理,最终实现区域内检验结果互认。其目标是以医疗服务机构为主体,以医疗资源和检验信息共享为目标,集成共性技术及医疗服务关键技术,建立区域协同检验,最大化利用有限的医疗卫生资源。
169 1
|
6月前
|
数据采集 安全 JavaScript
C#医院手术麻醉信息管理系统源码 对接院内HIS、LIS、PACS
手麻系统的功能涵盖了麻醉临床业务管理、麻醉运营业务管理以及手术进程管理等,实现了将多种麻醉病历文书与医院HIS系统的有效关联,让手术室人员、设备资源和信息资源高度共享;实现了手术安排、各种统计报表等科室管理和科研工作的需求,可借其收集临床数据、进行整合分析,为围术期临床信息、管理、科研提供整体解决方案;该系统的运行,为医护人员提供了流程化、信息化、自动化、智能化的临床业务综合管理。
104 5
|
6月前
|
前端开发 Java C#
java/C#语言开发的医疗信息系统11套源码
java/C#语言开发的医疗信息系统11套源码
104 2
|
2月前
|
编解码 C# 数据库
C# + WPF 音频播放器 界面优雅,体验良好
【9月更文挑战第18天】这是一个用 C# 和 WPF 实现的音频播放器示例,界面简洁美观,功能丰富。设计包括播放/暂停按钮、进度条、音量控制滑块、歌曲列表和专辑封面显示。功能实现涵盖音频播放、进度条控制、音量调节及歌曲列表管理。通过响应式设计、动画效果、快捷键支持和错误处理,提升用户体验。可根据需求扩展更多功能。
101 3
|
4月前
|
存储 Oracle 关系型数据库
PACS源码,C#语言数字医学影像系统成品源码
**数字医学影像系统(RIS/PACS)**采用C#开发,基于C/S架构,配Oracle数据库,具备自主版权,适用于项目实施。系统包含分诊、超声、放射、内镜、病理等工作站,支持基本信息维护、报表查询和系统维护。功能亮点有:WorkList管理、影像采集传输、存储检索、图像处理、多序列浏览、流程控制、报告录入与审核、支持多种影像设备及高级影像处理。RIS与PACS数据库同步,并集成HIS、电子病历等系统接口。全面遵循DICOM3.0标准。
PACS源码,C#语言数字医学影像系统成品源码
|
3月前
|
Android开发 iOS开发 C#
Xamarin.Forms:从零开始的快速入门指南——打造你的首个跨平台移动应用,轻松学会用C#和XAML构建iOS与Android通用界面的每一个步骤
【8月更文挑战第31天】Xamarin.Forms 是一个强大的框架,让开发者通过单一共享代码库构建跨平台移动应用,支持 iOS、Android 和 Windows。使用 C# 和 XAML,它简化了多平台开发流程并保持一致的用户体验。本指南通过创建一个简单的 “HelloXamarin” 应用演示了 Xamarin.Forms 的基本功能和工作原理。
74 0
|
4月前
|
BI 数据处理
一体化的医学实验室信息系统源码,C#LIS系统源码
面向医学实验室的一体化平台提供标本流程管理、报告发布及科室管理支持。它与HIS无缝对接,简化患者信息录入,实现检验结果实时同步。系统自动处理数据、分类样本、计算参考范围,并对异常结果预警。条码管理简化样本追踪,质控管理提升检测准确性。平台还支持数据审核发布、历史结果查询对比、灵活报表打印及统计分析等功能,辅助科室管理和试剂库存控制,加强科室间沟通协作。
一体化的医学实验室信息系统源码,C#LIS系统源码
|
5月前
|
开发框架 前端开发 .NET
LIMS(实验室)信息管理系统源码、有哪些应用领域?采用C# ASP.NET dotnet 3.5 开发的一套实验室信息系统源码
集成于VS 2019,EXT.NET前端和ASP.NET后端,搭配MSSQL 2018数据库。系统覆盖样品管理、数据分析、报表和项目管理等实验室全流程。应用广泛,包括生产质检(如石化、制药)、环保监测、试验研究等领域。随着技术发展,现代LIMS还融合了临床、电子实验室笔记本和SaaS等功能,以满足复杂多样的实验室管理需求。
80 3
LIMS(实验室)信息管理系统源码、有哪些应用领域?采用C# ASP.NET dotnet 3.5 开发的一套实验室信息系统源码
|
3月前
|
存储 前端开发 C#
WPF/C#:更改界面的样式
WPF/C#:更改界面的样式
41 0
|
4月前
|
数据采集 监控 BI
C#实验室检验LIS信息系统源码 微生物检验、质控维护
LIS系统的主要目标是为检验室开展检验工作提供更加有效的系统支持。该系统将尽量减少以人工操作的方式来实现信息转移,减少在接收检验项目、报告结果和保存记录等工作中可能会出现的人为误差,为检验结果查询提供更有效的方法,节省了管理信息所需的琐碎时间和精力。为实验室技术人员提供智能化的运行模式,使处理诸如按照规程审核检验结果、取消检验项目、分析、处理存在重大疑问的检验结果、执行特殊的命令和处理质量控制等问题更轻松自如,这将使检验人员更快地获得准确清晰的检验结果。为临床医护人员提供在线设施,使他们可以及时准确地获得相关实验室信息。确保检验结果的可靠性和准确性,利用实验室管理信息系统的仪器监控和质量控制,
41 0