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智能小车控制软件

 

 

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

目录
相关文章
|
2月前
|
开发框架 前端开发 JavaScript
C# 6.0+JavaScript云LIS系统源码  云LIS实验室信息管理新型解决方案
云LIS是为区域医疗提供临床实验室信息服务的计算机应用程序,可协助区域内所有临床实验室相互协调并完成日常检验工作,对区域内的检验数据进行集中管理和共享,通过对质量控制的管理,最终实现区域内检验结果互认。其目标是以医疗服务机构为主体,以医疗资源和检验信息共享为目标,集成共性技术及医疗服务关键技术,建立区域协同检验,最大化利用有限的医疗卫生资源。
112 1
|
2月前
|
数据采集 安全 JavaScript
C#医院手术麻醉信息管理系统源码 对接院内HIS、LIS、PACS
手麻系统的功能涵盖了麻醉临床业务管理、麻醉运营业务管理以及手术进程管理等,实现了将多种麻醉病历文书与医院HIS系统的有效关联,让手术室人员、设备资源和信息资源高度共享;实现了手术安排、各种统计报表等科室管理和科研工作的需求,可借其收集临床数据、进行整合分析,为围术期临床信息、管理、科研提供整体解决方案;该系统的运行,为医护人员提供了流程化、信息化、自动化、智能化的临床业务综合管理。
49 5
|
2月前
|
前端开发 Java C#
java/C#语言开发的医疗信息系统11套源码
java/C#语言开发的医疗信息系统11套源码
56 2
|
3天前
|
监控 C#
技术经验解读:【转】c#实现魔兽(warIII)中显血和改键功能(附源码)(不影响聊天打字)
技术经验解读:【转】c#实现魔兽(warIII)中显血和改键功能(附源码)(不影响聊天打字)
|
2月前
|
存储 运维 BI
基于C#-VC-MSSQL开发的全套PACS系统源码 3D PACS系统源码:可实现医学影像获取、存档、观片、处理、打印多项应用
PACS的功能价值在于通过连接不同的影像设备,存储与管理图像,图像的调用与后处理,实现资源共享,降低成本,达到提高工作效率、提升医疗水平的目地;
31 1
基于C#-VC-MSSQL开发的全套PACS系统源码  3D PACS系统源码:可实现医学影像获取、存档、观片、处理、打印多项应用
|
2月前
|
数据采集 存储 安全
C#手术麻醉系统源码 可对接HIS LIS PACS 医疗系统各类设备
术麻醉信息管理系统主要还是为了手术室开发提供全面帮助的系统,其主要是由监护设备数据采集子系统和麻醉临床系统两个子部分组成。包括从手术申请到手术分配,再到术前访视、术中记录及术后恢复的全过程中都可以得到全方位的保障。
25 4
C#手术麻醉系统源码 可对接HIS  LIS   PACS 医疗系统各类设备
|
2月前
|
存储 安全 Oracle
C#检验科lis实验室信息管理系统源码
LIS是全院信息化建设的一个重要组成部分,其主要功能是将检验的实验仪器传出的检验数据经分析后,生成检验报告,通过网络存储在数据库中,使医生能够方便、及时的看到患者的检验结果,LIS已经成为现代化医院管理中必不可少的一部分。有助于提高实验室的整体管理水平,减少漏洞,提高检验质量。
30 1
|
2月前
|
C#
C#掌上医院预约挂号支付系统源码
医院微信预约挂号系统是一种基于微信平台的医疗服务系统,它利用微信的广泛覆盖和便捷性,为患者提供线上预约挂号的服务。通过该系统,患者可以使用自己的微信账号登录,浏览医院的医生排班信息,选择合适的医生和就诊时间进行预约。 医院微信预约挂号系统主要是让自费、医保患者在手机上就能实现就医全过程,实时自费、医保结算,同时还可以查询检查检验报告等就诊信息。
24 3
|
2月前
|
存储 开发框架 前端开发
C#开发的全套成熟的LIS系统源码JavaScript+SQLserver 2012区域云LIS系统源码
医院云LIS系统是一套成熟的实验室信息管理系统,目前已在多家三级级医院应用,并不断更新。云LIS系统是为病人为中心、以业务处理为基础、以提高检验科室管理水平和工作效率为目标,将医学检验、科室管理和财务统计等检验科室/实验室所有工作进行整合,全面改善检验科室/实验室的工作现状。
31 0
|
2月前
|
存储 安全 C#
C#全新一代医院手术麻醉系统围术期全流程源码
手术麻醉临床信息系统有着完善的临床业务功能,能够涵盖整个围术期的工作,能够采集、汇总、存储、处理、展现所有的临床诊疗资料。通过该系统的实施,能够规范麻醉科的工作流程,实现麻醉手术过程的信息数字化,自动生成麻醉的各种医疗文书,完成共享HIS、LIS、PACS和 EMR等手术患者信息,从而提高麻醉、手术工作的管理水平。
18 2