Arduino开发板实验四:串口通讯,通过计算机控制舵机
由 动力老男孩 发表于 2010/02/24 22:32:26前几天肩膀可能是拉伤了,休息了几天。先回答一个朋友们比较关心的问题,那一对直流电机的扭矩差不多是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度左右,并且控制并不是特别精确。这意味着将来做机械臂的时候,可能会有很大的误差。头大中…..早知道就选步进电机了,不过一口吃不成胖子,慢慢来吧,硬件的误差可以通过软件来弥补。