天天看点

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

1.舵机原理简介

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

控制信号由接收机的通道进入信号调制芯片,获得直流偏置电压。它内部有一个基准电路,产生周期为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

<code>#include&lt;Servo.h&gt;  //库文件</code>

<code>Servo servo1;     </code>

<code>static</code> <code>int</code> <code>v=0;</code>

<code>String mycommand=</code><code>""</code><code>;</code>

<code>void</code> <code>setup()</code>

<code>  </code><code>{</code>

<code>    </code><code>Serial.begin(9600);</code><code>//此处为串口设置的波特率 ,可以修改 必须同上位机设置的波特路一致。</code>

<code>    </code><code>servo1.attach(3);  </code><code>// 控制的端口是~3号</code>

<code>    </code><code>servo1.write(90);</code>

<code>  </code><code>}</code>

<code>void</code> <code>loop() </code>

<code> </code><code>{</code>

<code>    </code><code>while</code><code>(Serial.available()&gt;0)</code>

<code>    </code><code>{</code>

<code>      </code><code>mycommand+=</code><code>char</code><code>(Serial.read());</code>

<code>      </code><code>delay(2);</code>

<code>    </code><code>}</code>

<code>    </code><code>for</code><code>(</code><code>int</code> <code>m=0;m&lt;mycommand.length();m++) </code><code>// </code>

<code>       </code><code>{</code>

<code>          </code><code>char</code> <code>ch = mycommand[m];   </code><code>//读取串口数据</code>

<code>          </code><code>switch</code><code>(ch)</code>

<code>             </code><code>{</code>

<code>                 </code><code>case</code> <code>'0'</code><code>...</code><code>'9'</code><code>:</code>

<code>                       </code><code>v = v*10 + ch - </code><code>'0'</code><code>;   </code><code>//字符转换成十进制</code>

<code>                        </code><code>break</code><code>;</code>

<code>                  </code><code>case</code> <code>'a'</code><code>:   </code><code>//如果数据后带a,则表示是一号舵机的数据,比如串口发送85a</code>

<code>                        </code><code>//if(v &gt;= 5 || v &lt;= 175 )   </code>

<code>                         </code><code>servo1.write(v); </code><code>// 让A从66度旋转到9度 (可修改角度)                     </code>

<code>                         </code><code>//用于设定舵机旋转角度的语句,可设定的角度范围是0°到180°,“V”得到所输入的值而改变角度,比如85a为85度角</code>

<code>                         </code><code>Serial.println(v+</code><code>"°"</code><code>);</code><code>//舵机角度改变后 发送改变的角度到上位机。</code>

<code>                         </code><code>v = 0;</code>

<code>                          </code><code>break</code><code>;</code>

<code>                     </code><code>}</code>

<code>   </code> 

<code>          </code><code>}  </code>

<code>   </code><code>mycommand=</code><code>""</code><code>;</code>

<code>}</code>

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

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

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

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

<code>using</code> <code>System;</code>

<code>using</code> <code>System.Collections.Generic;</code>

<code>using</code> <code>System.ComponentModel;</code>

<code>using</code> <code>System.Data;</code>

<code>using</code> <code>System.Drawing;</code>

<code>using</code> <code>System.Linq;</code>

<code>using</code> <code>System.Text;</code>

<code>using</code> <code>System.Threading.Tasks;</code>

<code>using</code> <code>System.Windows.Forms;</code>

<code>namespace</code> <code>舵机上位机源码</code>

<code>{</code>

<code>    </code><code>public</code> <code>partial </code><code>class</code> <code>Form1 : Form</code>

<code>        </code><code>bool</code> <code>open = </code><code>false</code><code>;</code>

<code>        </code><code>public</code> <code>delegate</code> <code>void</code> <code>HandleInterfaceUpdataDelegate(</code><code>string</code> <code>text);</code>

<code>        </code><code>private</code> <code>HandleInterfaceUpdataDelegate interfaceUpdataHandle;</code>

<code>        </code><code>int</code> <code>a;</code>

<code>        </code><code>public</code> <code>Form1()</code>

<code>        </code><code>{</code>

<code>            </code><code>InitializeComponent();</code>

<code>        </code><code>}</code>

<code>        </code><code>private</code> <code>void</code> <code>Form1_Load(</code><code>object</code> <code>sender, EventArgs e)</code>

<code>            </code><code>comboBox1.Items.AddRange(System.IO.Ports.SerialPort.GetPortNames());</code><code>//从系统获取已有串口</code>

<code>            </code><code>if</code> <code>(comboBox1.Items.Count &gt; 0)</code>

<code>            </code><code>{</code>

<code>                </code><code>comboBox1.SelectedIndex = 0;</code><code>//串口变量初始化</code>

<code>                </code><code>serialPort1.RtsEnable = </code><code>true</code><code>;</code><code>//DataReceived事件委托</code>

<code>                </code><code>serialPort1.ReceivedBytesThreshold = 1;</code><code>//设置 DataReceived 事件发生前内部输入缓冲区中的字节数</code>

<code>                </code><code>serialPort1.DataReceived += </code><code>new</code> <code>System.IO.Ports.SerialDataReceivedEventHandler(</code><code>this</code><code>.serialPort1_DataReceived);</code>

<code>                </code><code>comboBox2.SelectedIndex = 6;</code>

<code>            </code><code>}</code>

<code>            </code><code>else</code>

<code>                </code><code>MessageBox.Show(</code><code>"未检测到设备\r\n"</code><code>);</code>

<code>        </code><code>//监听串口</code>

<code>        </code><code>private</code> <code>void</code> <code>serialPort1_DataReceived(</code><code>object</code> <code>sender, System.IO.Ports.SerialDataReceivedEventArgs e)</code>

<code>            </code><code>try</code>

<code>                </code><code>string</code> <code>text = </code><code>string</code><code>.Empty;</code>

<code>                </code><code>byte</code><code>[] result = </code><code>new</code> <code>byte</code><code>[serialPort1.BytesToRead];</code>

<code>                </code><code>serialPort1.Read(result, 0, serialPort1.BytesToRead);</code>

<code>                </code><code>text = Encoding.UTF8.GetString(result);</code>

<code>            </code><code>catch</code> 

<code>               </code> 

<code>        </code><code>//串口刷新按钮</code>

<code>        </code><code>private</code> <code>void</code> <code>button2_Click(</code><code>object</code> <code>sender, EventArgs e)</code>

<code>            </code><code>comboBox1.Items.Clear();</code>

<code>            </code><code>comboBox1.Items.AddRange(System.IO.Ports.SerialPort.GetPortNames());</code>

<code>                </code><code>comboBox1.SelectedIndex = 0;</code>

<code>                </code><code>MessageBox.Show(</code><code>"未检测到串口\r\n"</code><code>);</code>

<code>        </code> 

<code>        </code><code>//打开串口</code>

<code>        </code><code>private</code> <code>void</code> <code>btnOpen_Click(</code><code>object</code> <code>sender, EventArgs e)</code>

<code>            </code><code>if</code> <code>(open == </code><code>false</code><code>)</code>

<code>                </code> 

<code>                </code><code>if</code> <code>(serialPort1.IsOpen)</code>

<code>                </code><code>{</code>

<code>                    </code><code>MessageBox.Show(</code><code>"串口已经打开"</code><code>, </code><code>"提示"</code><code>, MessageBoxButtons.OK, MessageBoxIcon.Information);</code>

<code>                    </code><code>return</code><code>;</code>

<code>                </code><code>}</code>

<code>                </code><code>//串口</code>

<code>                </code><code>if</code> <code>(comboBox1.Text == </code><code>string</code><code>.Empty)</code>

<code>                    </code><code>MessageBox.Show(</code><code>"请选择串口"</code><code>, </code><code>"提示"</code><code>, MessageBoxButtons.OK, MessageBoxIcon.Information);</code>

<code>                </code><code>//波特率</code>

<code>                </code><code>if</code> <code>(comboBox2.Text == </code><code>string</code><code>.Empty)</code>

<code>                    </code><code>MessageBox.Show(</code><code>"请选择波特率"</code><code>, </code><code>"提示"</code><code>, MessageBoxButtons.OK, MessageBoxIcon.Information);</code>

<code>                </code><code>serialPort1.BaudRate = </code><code>int</code><code>.Parse(comboBox2.Text);</code>

<code>                </code><code>try</code>

<code>                    </code><code>serialPort1.PortName = comboBox1.SelectedItem.ToString();</code>

<code>                    </code><code>serialPort1.Open();</code>

<code>                </code><code>catch</code>

<code>                    </code><code>try</code>

<code>                    </code><code>{</code>

<code>                        </code><code>comboBox1.SelectedIndex = comboBox1.SelectedIndex + 1;</code>

<code>                    </code><code>}</code>

<code>                    </code><code>catch</code>

<code>                        </code><code>comboBox1.SelectedIndex = 0;</code>

<code>                    </code><code>serialPort1.Close();</code>

<code>                </code><code>btnOpen.Text = </code><code>"关闭"</code><code>;</code>

<code>                </code><code>comboBox1.Enabled = </code><code>false</code><code>;</code>

<code>                </code><code>comboBox2.Enabled = </code><code>false</code><code>;</code>

<code>                </code><code>open = </code><code>true</code><code>;</code>

<code>                </code><code>trackBarSend_Scroll(</code><code>this</code><code>, </code><code>null</code><code>);</code>

<code>                </code><code>btnReserch.Enabled = </code><code>false</code><code>;</code>

<code>                </code><code>btnsend.Enabled = </code><code>true</code><code>;</code>

<code>                </code><code>tbxSend.Enabled = </code><code>true</code><code>;</code>

<code>                </code><code>trackBarSend.Enabled = </code><code>true</code><code>;</code>

<code>                </code><code>pictureBox1.BackColor = Color.Lime;</code>

<code>                    </code><code>btnOpen.Text = </code><code>"打开"</code><code>;</code>

<code>                    </code><code>open = </code><code>false</code><code>;</code>

<code>                    </code><code>comboBox1.Enabled = </code><code>true</code><code>;</code>

<code>                    </code><code>comboBox2.Enabled = </code><code>true</code><code>;</code>

<code>                    </code><code>btnReserch.Enabled = </code><code>true</code><code>;</code>

<code>                    </code><code>btnsend.Enabled = </code><code>false</code><code>;</code>

<code>                    </code><code>tbxSend.Enabled = </code><code>false</code><code>;</code>

<code>                    </code><code>trackBarSend.Enabled = </code><code>false</code><code>;</code>

<code>                    </code><code>pictureBox1.BackColor = Color.Silver;</code>

<code>        </code><code>private</code> <code>void</code> <code>trackBarSend_Scroll(</code><code>object</code> <code>sender, EventArgs e)</code>

<code>            </code><code>if</code> <code>(serialPort1.IsOpen)</code>

<code>                </code><code>a = trackBarSend.Value;</code>

<code>                </code><code>string</code> <code>duojiA = trackBarSend.Value.ToString() + </code><code>"a"</code><code>;</code>

<code>                    </code><code>serialPort1.WriteLine(duojiA);</code>

<code>                    </code><code>tbxSend.Text = a.ToString(); ; ;</code>

<code>        </code><code>private</code> <code>void</code> <code>btnsend_Click(</code><code>object</code> <code>sender, EventArgs e)</code>

<code>                </code><code>byte</code><code>[] SendBuf = </code><code>new</code> <code>byte</code><code>[100000];</code>

<code>                </code><code>SendBuf = System.Text.Encoding.Default.GetBytes(tbxSend.Text+</code><code>"a"</code><code>);</code>

<code>                </code><code>serialPort1.Write(SendBuf, 0, SendBuf.Length);</code>

<code>            </code><code>catch</code> <code>(Exception err)</code>

<code>                    </code><code>serialPort1.Close();</code><code>//如果是写数据时出错,此时窗口状态为开,就应关闭串口,防止下次不能使用,串口是不能重复打开和关闭的</code>

<code>                </code><code>MessageBox.Show(err.ToString(), </code><code>"错误"</code><code>);</code>

<code>        </code><code>private</code> <code>void</code> <code>tbxSend_ValueChanged(</code><code>object</code> <code>sender, EventArgs e)</code>

<code>            </code><code>trackBarSend.Value = (</code><code>int</code><code>)tbxSend.Value;</code>

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

                                                            未连接设备状态

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

                                                                连接设备后

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

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

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

                                                            这是wifi智能小车控制软件

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