1.舵機(jī)原理簡(jiǎn)介
創(chuàng)新互聯(lián)建站專注于企業(yè)成都全網(wǎng)營(yíng)銷、網(wǎng)站重做改版、衡山網(wǎng)站定制設(shè)計(jì)、自適應(yīng)品牌網(wǎng)站建設(shè)、H5頁(yè)面制作、商城網(wǎng)站建設(shè)、集團(tuán)公司官網(wǎng)建設(shè)、外貿(mào)網(wǎng)站建設(shè)、高端網(wǎng)站制作、響應(yīng)式網(wǎng)頁(yè)設(shè)計(jì)等建站業(yè)務(wù),價(jià)格優(yōu)惠性價(jià)比高,為衡山等各大城市提供網(wǎng)站開(kāi)發(fā)制作服務(wù)。
控制信號(hào)由接收機(jī)的通道進(jìn)入信號(hào)調(diào)制芯片,獲得直流偏置電壓。它內(nèi)部有一個(gè)基準(zhǔn)電路,產(chǎn)生周期為20ms,寬度為1.5ms的基準(zhǔn)信號(hào),將獲得的直流偏置電壓與電位器的電壓比較,獲得電壓差輸出。最后,電壓差的正負(fù)輸出到電機(jī)驅(qū)動(dòng)芯片決定電機(jī)的正反轉(zhuǎn)。當(dāng)電機(jī)轉(zhuǎn)速一定時(shí),通過(guò)級(jí)聯(lián)減速齒輪帶動(dòng)電位器旋轉(zhuǎn),使得電壓差為0,電機(jī)停止轉(zhuǎn)動(dòng)。
舵機(jī)的控制一般需要一個(gè)20ms左右的時(shí)基脈沖,該脈沖的高電平部分一般為0.5ms-2.5ms范圍內(nèi)的角度控制脈沖部分,總間隔為2ms。以180度角度伺服為例,那么對(duì)應(yīng)的控制關(guān)系是這樣的:
0.5ms--------------0度;
1.0ms------------45度;
1.5ms------------90度;
2.0ms-----------135度;
2.5ms-----------180度;
2.arduino下位機(jī)源碼
相關(guān)源碼已壓縮上傳,需要請(qǐng)下載對(duì)應(yīng)附件
#include//庫(kù)文件 Servo servo1; static int v=0; String mycommand=""; void setup() { Serial.begin(9600);//此處為串口設(shè)置的波特率 ,可以修改 必須同上位機(jī)設(shè)置的波特路一致。 servo1.attach(3); // 控制的端口是~3號(hào) servo1.write(90); } void loop() { while(Serial.available()>0) { mycommand+=char(Serial.read()); delay(2); } for(int m=0;m = 5 || v <= 175 ) servo1.write(v); // 讓A從66度旋轉(zhuǎn)到9度 (可修改角度) //用于設(shè)定舵機(jī)旋轉(zhuǎn)角度的語(yǔ)句,可設(shè)定的角度范圍是0°到180°,“V”得到所輸入的值而改變角度,比如85a為85度角 Serial.println(v+"°");//舵機(jī)角度改變后 發(fā)送改變的角度到上位機(jī)。 v = 0; break; } } mycommand=""; }
我選擇我的是arduino Uno,舵機(jī)的接線方法是紅色(VCC)端接控制板的5V處,棕色端接板子的GND,舵機(jī)的橙色線為信號(hào)線,接板子上的3號(hào)口;
3.C#上位機(jī)源碼及界面
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 舵機(jī)上位機(jī)源碼 { 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());//從系統(tǒng)獲取已有串口 if (comboBox1.Items.Count > 0) { comboBox1.SelectedIndex = 0;//串口變量初始化 serialPort1.RtsEnable = true;//DataReceived事件委托 serialPort1.ReceivedBytesThreshold = 1;//設(shè)置 DataReceived 事件發(fā)生前內(nèi)部輸入緩沖區(qū)中的字節(jié)數(shù) serialPort1.DataReceived += new System.IO.Ports.SerialDataReceivedEventHandler(this.serialPort1_DataReceived); comboBox2.SelectedIndex = 6; } else { MessageBox.Show("未檢測(cè)到設(shè)備\r\n"); } } //監(jiān)聽(tīng)串口 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("未檢測(cè)到串口\r\n"); } } //打開(kāi)串口 private void btnOpen_Click(object sender, EventArgs e) { if (open == false) { if (serialPort1.IsOpen) { MessageBox.Show("串口已經(jīng)打開(kāi)", "提示", MessageBoxButtons.OK, MessageBoxIcon.Information); return; } //串口 if (comboBox1.Text == string.Empty) { MessageBox.Show("請(qǐng)選擇串口", "提示", MessageBoxButtons.OK, MessageBoxIcon.Information); return; } //波特率 if (comboBox2.Text == string.Empty) { MessageBox.Show("請(qǐng)選擇波特率", "提示", 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 = "關(guān)閉"; 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 = "打開(kāi)"; 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();//如果是寫數(shù)據(jù)時(shí)出錯(cuò),此時(shí)窗口狀態(tài)為開(kāi),就應(yīng)關(guān)閉串口,防止下次不能使用,串口是不能重復(fù)打開(kāi)和關(guān)閉的 MessageBox.Show(err.ToString(), "錯(cuò)誤"); } } private void tbxSend_ValueChanged(object sender, EventArgs e) { trackBarSend.Value = (int)tbxSend.Value; } } }
未連接設(shè)備狀態(tài)
連接設(shè)備后
這是自己做的機(jī)械臂控制軟件 相關(guān)源碼也有
這是wifi智能小車控制軟件
第一次寫博文,有不好的地方還請(qǐng)多多包涵。
附件:http://down.51cto.com/data/2366150另外有需要云服務(wù)器可以了解下創(chuàng)新互聯(lián)scvps.cn,海內(nèi)外云服務(wù)器15元起步,三天無(wú)理由+7*72小時(shí)售后在線,公司持有idc許可證,提供“云服務(wù)器、裸金屬服務(wù)器、高防服務(wù)器、香港服務(wù)器、美國(guó)服務(wù)器、虛擬主機(jī)、免備案服務(wù)器”等云主機(jī)租用服務(wù)以及企業(yè)上云的綜合解決方案,具有“安全穩(wěn)定、簡(jiǎn)單易用、服務(wù)可用性高、性價(jià)比高”等特點(diǎn)與優(yōu)勢(shì),專為企業(yè)上云打造定制,能夠滿足用戶豐富、多元化的應(yīng)用場(chǎng)景需求。