3D采集设备(二)伺服马达驱动激光雷达旋转扫描

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通信即可。

小黄可以模拟发送指令:细节没研究:那不重要。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值