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

 

 

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

目录
相关文章
|
11天前
|
数据采集 安全 JavaScript
C#医院手术麻醉信息管理系统源码 对接院内HIS、LIS、PACS
手麻系统的功能涵盖了麻醉临床业务管理、麻醉运营业务管理以及手术进程管理等,实现了将多种麻醉病历文书与医院HIS系统的有效关联,让手术室人员、设备资源和信息资源高度共享;实现了手术安排、各种统计报表等科室管理和科研工作的需求,可借其收集临床数据、进行整合分析,为围术期临床信息、管理、科研提供整体解决方案;该系统的运行,为医护人员提供了流程化、信息化、自动化、智能化的临床业务综合管理。
24 5
|
4月前
|
存储 C# 图形学
【Unity 3D】C#数据类型和变量、命名规范的讲解(附源码)
【Unity 3D】C#数据类型和变量、命名规范的讲解(附源码)
51 1
|
4月前
|
搜索推荐 算法 C#
【Unity 3D】C#中冒泡排序、选择排序、插入排序等算法的详解(附源码 超详细)
【Unity 3D】C#中冒泡排序、选择排序、插入排序等算法的详解(附源码 超详细)
46 1
|
8天前
|
开发框架 前端开发 JavaScript
采用C#.Net +JavaScript 开发的云LIS系统源码 二级医院应用案例有演示
技术架构:Asp.NET CORE 3.1 MVC + SQLserver + Redis等 开发语言:C# 6.0、JavaScript 前端框架:JQuery、EasyUI、Bootstrap 后端框架:MVC、SQLSugar等 数 据 库:SQLserver 2012
|
25天前
|
安全 JavaScript 前端开发
C#医院手麻系统源码,手术麻醉管理系统源码
手术麻醉管理系统贯穿患者入院至出院全程,整合术前术后流程,如手术排班、麻醉计划、术中监护及术后恢复。采用C#.net6.0、Vue、Ant-Design等技术,与sqlserver2019数据库结合。系统提供麻醉记录、手术安全核查、费用管理等功能,确保信息数字化和流程规范化。通过自动化记录和数据分析,增强手术安全,优化资源分配,并支持医疗质控与研究。
C#医院手麻系统源码,手术麻醉管理系统源码
|
26天前
|
存储 监控 安全
C#手术麻醉系统源码 大型医院手麻系统4大需求是什么?
C#编写的大型医院手术麻醉系统旨在满足四大核心需求:智慧医院建设,要求实时患者信息共享与监控;医院等级评级,强调安全评估与术后管理;电子病历评级,规定手术预约、麻醉信息的标准化;科室需求,包括系统互联、流程信息化、数据追溯、操作简便、文书完整、快速响应、生命体征动态采集及质量控制。系统提升手麻工作的效率与安全性,确保手术顺利进行。
|
1月前
|
数据挖掘 C# 开发工具
采用C#语言开发的全套医院体检系统PEIS源码功能介绍
体检系统,是专为体检中心/医院体检科等体检机构,专门开发的全流程管理系统,通过软件实现检测仪器数据自动提取,内置多级医生工作台,细化工作将体检检查结果汇总,生成体检报告登记到计算机系统中。通过软件系统进行数据分析统计与评判以及建立体检相关的体检档案。从而实现体检流程的信息化,提高工作效率,减少手动结果录入的一些常犯错误。 在实际应用中,医院体检系统能够解决传统体检中手工操作带来的问题,如工作量大、效率低下、易漏检、重检或错检等。通过与医院信息系统(如HIS、LIS、PACS等)的连接,系统能够满足体检中心的日常工作流程,提供更好的管理、统计和查询分析功能。同时,基于网络基础的系统可以在网上传输
23 1
|
2月前
|
前端开发 JavaScript BI
C#区域医院云LIS信息管理系统源码
区域医院云LIS可协助区域内所有临床实验室相互协调并完成日常检验工作,对区域内的检验数据进行集中管理和共享,通过对质量控制的管理,最终实现区域内检验结果互认。其目标是以医疗服务机构为主体,以医疗资源和检验信息共享为目标,集成共性技术及医疗服务关键技术,建立区域协同检验。
33 2
|
2月前
|
开发框架 前端开发 NoSQL
C#医院区域云LIS系统源码
LIS操作流程标本流转----标本核收----标本上机检验----费用汇总----报告审核----报告发布----报告打印等基础流程
38 3
|
3月前
|
运维 数据挖掘 C#
C#大型LIS检验信息系统项目源码
LIS系统能实现临床检验信息化,检验科信息管理自动化。其主要功能是将检验科的实验仪器传出的检验数据经数据分析后,自动生成打印报告,通过网络存储在数据库中,使医生能够通过医生工作站方便、及时地看到患者的检验结果。
31 0