Arduino开发板实验四:串口通讯,通过计算机控制舵机

前几天肩膀可能是拉伤了,休息了几天。先回答一个朋友们比较关心的问题,那一对直流电机的扭矩差不多是30kg*cm。前几天我已经接上电源,并且压了一些重物,看上去在室内平地可以轻松带动(爬坡没有测试)。因为还没有写电机的遥控程序,所以只是用原地打转做测试。按照我的计划,笔记本电脑将会作为一个配件,安装在小爱的胸前。所以今天做了一个串口通信的小实验,将来也要通过计算机这样控制小爱的各种运动。

实验目标是:做一个小程序,通过鼠标拖拽来控制舵机的角度,计算机和Arduino实验板之间使用USB线连接。

首先看一下接线图:

舵机接线图

舵机接线图

舵机控制的命令可以参考之前的小实验:Arduino开发板实验三(舵机控制)。先看看我们这个实验里需要用到的几个串口通信命令:

Serial.begin(9600);  //设置波特率
Serial.available();  //如果有数据传来,这个值大于0
int readValue = Serial.read();  //读取一个字节的数据

这个实验里只需要从计算机接受数据,如果需要发送数据的话,可以使用下面的命令:

Serial.print();
Serial.println();
Serial.write();
Serial.flush();

具体的用法可以去Arduino的官网上查看: http://arduino.cc/en/Reference/Serial

在Arduino端的程序如下:

void loop()
{
  while (Serial.available() > 0)
  {
    //读取计算机发送的角度值
    readValue = Serial.read();
  }
  //发送50个脉冲
  for(int i=0;i<50;i++)
  {
     //引用脉冲函数
     servopulse(readValue);
  }
}

计算机端的程序使用C#编写,Arduino使用USB连接计算机以后,其实也被映射到一个端口,所以连接的方法和蓝牙连接类似,可以参考萝卜头的蓝牙通讯部分。

下面是小程序的界面:

计算机上运行的小程序

计算机上运行的小程序

创建一个从0到180的轨道条(TrackBar,也有人叫它滑尺),当滑尺位置变换时,就把设置的角度发送到指定的端口上。代码如下:

        private void AngleTrack_Scroll(object sender, EventArgs e)
        {
            ReadValue.Text = AngleTrack.Value.ToString();
            if (serialConn != null && serialConn.IsOpen)
            {
                BlueToothDataSend(new byte[] { Convert.ToByte(ReadValue.Text) });
            }
        }

        private SerialPort serialConn;
        private void ConnectButton_Click(object sender, EventArgs e)
        {
            serialConn = new SerialPort();
            ConnectButton.Enabled = false;
            serialConn.PortName = PortNumber.Text;
            serialConn.Open();
            serialConn.ReadTimeout = 10000;
        }

        private void BlueToothDataSend(byte[] data)
        {
            int length = data.Length;
            byte[] readData = new byte[length + 2];
            readData[0] = (byte)(length % 255);
            readData[1] = (byte)(length / 255);
            for (int i = 0; i < length; i++)
            {
                readData[i + 2] = data[i];
            }
            serialConn.Write(readData, 0, length + 2);
        }

实验结果:拖动轨道条可以实现对舵机的控制,但是在0~30和150~180的区间,舵机是不动的;在30~150区间,舵机基本能按照鼠标拖动的角度旋转。结果表示串口通信成功了,但同时也说明这个舵机的实际转角只能达到120度左右,并且控制并不是特别精确。这意味着将来做机械臂的时候,可能会有很大的误差。头大中…..早知道就选步进电机了,不过一口吃不成胖子,慢慢来吧,硬件的误差可以通过软件来弥补。



对 “Arduino开发板实验四:串口通讯,通过计算机控制舵机” 的 17 条 评论

  1. dead_lee 说:

    可以考慮給轉動的地方接個電位器, 通過電阻的變化判斷是否轉到了理想的角度.

    • 这个问题我也考虑了很久,需要一个反馈机制来判断电机是否转到了指定位置,因为可能被卡住或者正转到一半。

      但是舵机的内部就是用电位器来实现角度控制的,所以自己加电位器是严重冗余
      的,而且同样也会有误差。最悲惨的情况是自己的电位器和内部电位器误差不同步,可能会出现摆来摆去的抖舵现象。

      所以我打算拆一个舵机研究一下,看能不能把内置电位器的信号接出来。至于误差方面,我觉得可以对每个舵机做一次标定,然后用误差曲线来修正

      上面是对舵机的反馈处理的想法,对于直流电机。因为是连续旋转,所以不能用电位器。我打算参考鼠标滚轮的做法,用带孔圆盘+信号传感器,或者用黑白色卡+亮度传感器的方法,来判断转过的角度

      请有经验的高手们多提建议:)

  2. dot 说:

    纯精神支持

  3. x 说:

    private SerialPort serialConn;
    运行这一句报错……

  4. 乐乐寺 说:

    还是以前跟你说的嘛,用舵机那难以达到一定精确度的控制,基本上算个开环控制。你至少也搞点步进电机的,你这又不是要飞上去的东西体积啊重量啊可以稍微牺牲一下。

    • 专家同学,你早不说,呵呵
      其实没选不进电机的主要原因是安装困难,基本都是一根光杆输出
      舵机还有舵角,舵桨等配件 :)

      • Duron 说:

        自己动手做,呵呵 相信你的实力

        伺服电机貌似也不错,不过价格。。。。。。。

      • 刘刚 说:

        呵呵,我打算年底老丈人的新房子弄好了,打着寿礼的名义送他一台家用机床,他是机械厂的技师,以后小件东西的加工就可以请老丈人操刀了。

  5. 安鹏浩 说:

    老男孩兄台 可否一起讨论下修正舵机控制的问题 我也研究了很久
    有个设想不知可否共同探讨下 qq 313321380

  6. Arduino开发板是个什么东东,介绍介绍?

  7. 慕小野 说:

    我用的是atmage16芯片,自己制作的开发板,如果想用twi(i2c)来连接电调,进而控制电机转速,该怎么做?

  8. 窗外的窗 说:

    为什么不考虑用光电编码器呢

发表评论

可以使用下列 XHTML 标签:<a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>