02-伺服马达驱动激光雷达旋转扫描
伺服马达长这个样子:
我们小时候玩四驱赛车的电机。当然是升级版。
手边的是下面这个:
这里是型号:
型号:日本COOL MUSCLE马达CM1-P-23L20C
电源情况:
支持网口和串口通信。转换器长这样:
以上都时扯淡,重点来了:
怎么驱动旋转。
using System;
namespace MotorControl
{
public class Motor
{
//归零
public string Init()
{
return "|.1";
}
//获取所在位置,约为0~3200,上下有误差
//获取结果ex: Px.1=187 187即当前位置
public string Query()
{
return "?96.1";
}
//输入目标位置,获取当前的角度
public string Conversion(int position)
{
string angle = (position * 0.018 - 28.8).ToString();
return angle;
}
//控制输入
//position在0~3200
//acceleration默认200
//speed为速度,为1的整数倍,最好别超过100
public string Control(int position, int speed, int acceleration=200)
{
string command = "P.1=" + position + "\r\n";
command += "S.1=" + speed + "\r\n";
command += "A.1=" + acceleration + "\r\n";
command += "^";
return command;
}
}
}
天才的我,基于上面这些信息,提取了控制指令。用网络调试助手NetAssist联网,测试了一下,指令。写了如下代码:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Net;
using System.Net.Sockets;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
using System.Windows.Forms;
namespace MotorControlWinform
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
Socket socketSend;
private void btnConnect_Click(object sender, EventArgs e)
{
try
{
socketSend = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
IPAddress ip = IPAddress.Parse(tbxIP.Text);
IPEndPoint point = new IPEndPoint(ip, Convert.ToInt32(tbxPort.Text));
socketSend.Connect(point);
ShowMsg("登录成功!");
Thread th = new Thread(Receive);
th.IsBackground = true;
th.Start();
}
catch { }
}
void Receive()
{
while(true)
{
try
{
byte[] buffer = new byte[1024];
int r = socketSend.Receive(buffer);
ShowMsg("收到消息长度为:" + r.ToString());
if (r==0)
{
break;
}
ShowMsg("开始解析消息....");
string s = Encoding.UTF8.GetString(buffer, 0, r);
ShowMsg(socketSend.RemoteEndPoint + ":" + s);
}
catch (System.InvalidOperationException ex)
{
MessageBox.Show(ex.ToString());
}
}
}
public void ShowMsg(string str)
{
tbxLog.AppendText(str + "\r\n");
}
private void btnInit_Click(object sender, EventArgs e)
{
string str = "|.1\r\n";
byte[] buffer = System.Text.Encoding.UTF8.GetBytes(str);
socketSend.Send(buffer);
}
private void Form1_Load(object sender, EventArgs e)
{
Control.CheckForIllegalCrossThreadCalls = false;
}
private void btnQuery_Click(object sender, EventArgs e)
{
string str = "?96.1" + "\r\n";
byte[] buffer = System.Text.Encoding.UTF8.GetBytes(str);
socketSend.Send(buffer);
}
private void button1_Click(object sender, EventArgs e)
{
string command = "P.1=" + Convert.ToInt32(tbxPos.Text) + "\r\n";
command += "S.1=" + 10 + "\r\n";
command += "A.1=" + 200 + "\r\n";
command += "^.1";
command += "|.1\r\n";
byte[] buffer = System.Text.Encoding.UTF8.GetBytes(command);
socketSend.Send(buffer);
}
}
}
实践证明一:只要驱动就好了,不要较真。虽然最后这个按钮一看就是拼凑的。拼凑原因是:我每次按执行,不干活,点初始化才执行命令,所以我在后面拼接上初始化指令,他可以转过去。
实践证明二:你要在每个命令后面加上“\r”,否则不干活。"\n"非必须。
我们只需知道可以旋转的position可以在0到3200之间,测试那个数值,是我们激光雷达需要的就行了。毕竟我还没开始扫描成像,只是要姿态成线,提取线。
有朋友推荐:小绿和小黄。
就是这俩软件:
USR-M0_V2.2.5.8.exe
USR-TCP232-Test-V1.3.exe
打开小绿:直接搜索设备,就可以找到伺服电机,获取当前伺服电机的设置参数。比如最重要的IP和Port。
直接socket通信即可。
小黄可以模拟发送指令:细节没研究:那不重要。