极客工坊

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 11880|回复: 4

混成了中级会员,尝试给初学者写个例程(舵机控制方面)

[复制链接]
发表于 2013-6-20 22:41:46 | 显示全部楼层 |阅读模式
首先,本人的水平是从这里学习来的,一直在本坛索取,混成了中级会员,感觉应该回报一点,至少可以给初学者看看.

多路舵机的同时操作,最好是用并口定时器中断方式,可惜本人不会,所以用ARDUINO写了(抄)一个”伪“同时操作多路舵机程序,试验下来,效果还是可以的,不多说,上菜啦........
/---------------------------------------------------------------------------------------------------------------------------------------------------------
//串口接收命令方式:"x1,x2,x3,x4,",其中xy为0-225之间的整数(我的烂货舵机不能满量程0-250),注意每个数字后面要加逗号//
//PWM引脚8,9,10,11分别对应SERVO 0,1,2,3四个舵机,并且分别与X1,X2,X3,X4四个控制字对应//
//SERVO库舵机刷新率已由50HZ,改为200HZ;注改为400HZ时我的舵机抖舵,可能数字舵机在400HZ刷新时是不会抖的.//
//代码大部份是来源于本论坛的大神们,感谢他们!//
/---------------------------------------------------------------------------------------------------------------------------------------------------------

#include <Servo.h>
int numdata[4] = {0} ;
int mark = 0;
String rcvByte ="";
int  servoPins[] = {8,9,10,11};  
Servo myServo[4];
void setup()   
{  
   Serial.begin(38400);
   for(int i = 0; i < 4; i++) myServo[i].attach(servoPins[i]);  
}  
void loop()  
{  
  int j = 0;
// Serial.println("input 0-250:");
  long t0 = micros();
  double T = 2400; //数据源自SERVO库
  while(Serial.available())
    {  
     rcvByte += char(Serial.read());
     delay(5);
     mark = 1;
    }
  if(mark == 1)
   {
    //Serial.println(rcvByte);
    //Serial.println(rcvByte.length());
     for(int i = 0; i < rcvByte.length() ; i++)
    {
   
      if(rcvByte[i] == ',')
      {
        j++;
      }
      else
      {
        numdata[j] = numdata[j] * 10 + (rcvByte[i] - '0');
      }
    }
     rcvByte = String("");
   
  for(int i = 0; i < 4; i++)
  {
      Serial.print("servo ");    //这几句串口输出可以去掉,这是调试时用的.
      Serial.print(i);
      Serial.print(" = ");
      Serial.println(numdata[i]);
      myServo[i].writeMicroseconds(544 + numdata[i] * 7.4);  //具体数据来源于SERVO库,7.4=(2400-544)/250,即DIV值!
      int leftMs = (int) (t0 + T - micros());  
      delayMicroseconds(leftMs);
      numdata[i] = 0;
  }
   mark = 0;
  }
}
回复

使用道具 举报

发表于 2013-8-8 14:36:57 | 显示全部楼层
先谢谢大神 你的这个方法  是通过接收字符串来控制舵机的 我也做成过用  L R D  U 这四个字母来控制舵机的左右上下动。现在是要用C# 发送十六进制的1 2 3 4给arduino,再控制舵机动。不是字符串了  。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2013-8-8 15:48:32 | 显示全部楼层
罹凝寒冰 发表于 2013-8-8 14:36
先谢谢大神 你的这个方法  是通过接收字符串来控制舵机的 我也做成过用  L R D  U 这四个字母来控制舵机的 ...

你不会把十六进制数当成字符串啊
回复 支持 反对

使用道具 举报

发表于 2013-8-8 18:02:35 | 显示全部楼层
拾瑞 发表于 2013-8-8 15:48
你不会把十六进制数当成字符串啊

C#发送十六进制很容易 可是arduino接收就比较困难 该怎么接收呢?》
回复 支持 反对

使用道具 举报

发表于 2013-9-8 21:29:05 | 显示全部楼层
正找这个资料,感谢楼主的奉献
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

Archiver|联系我们|极客工坊

GMT+8, 2026-6-7 22:45 , Processed in 0.036026 second(s), 20 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表