您好,登錄后才能下訂單哦!
1.舵機原理簡介
控制信號由接收機的通道進入信號調制芯片,獲得直流偏置電壓。它內部有一個基準電路,產生周期為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下位機源碼
相關源碼已壓縮上傳,需要請下載對應附件
#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=""; }
我選擇我的是arduino Uno,舵機的接線方法是紅色(VCC)端接控制板的5V處,棕色端接板子的GND,舵機的橙色線為信號線,接板子上的3號口;
3.C#上位機源碼及界面
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; } } }
未連接設備狀態
連接設備后
這是自己做的機械臂控制軟件 相關源碼也有
這是wifi智能小車控制軟件
第一次寫博文,有不好的地方還請多多包涵。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。