作者 主题: 呃,最近忙着改造舵机的计划,也发一个舵机控制的方法吧  (阅读 5771 次)

i3water

  • Newbie
  • *
  • 帖子: 8
(*^__^*) ……这个方法就是延时,用arduino的延时来做舵机控制。
我暑假做的舵机控制是cortex-m0做的,那天有个朋友问到arduino不调用servo库的情况下怎么驱动舵机,于是就有了这个帖子。

    int sp1=10;//定义舵机接口数字接口7
    int pulsewidth;//定义脉宽变量
    int val;
    int val1;
    int myangle1;
    //下面是servopulse函数部分(此函数意思:也就是說每次都是0.5ms高電平 1.98ms低電平 然後再0.52ms低電平 17ms延時也是低電平)

    void servopulse(int sp1,int val1)//定义一个脉冲函数
    {
      myangle1=map(val1,0,180,500,2480);
      digitalWrite(sp1,HIGH);//将舵机接口电平至高
      delayMicroseconds(myangle1);//延时脉宽值的微秒数
      digitalWrite(sp1,LOW);//将舵机接口电平至低
      delay(20-val1/1000);
    }
    //servopulse函数部分到此结束
    void setup()
    {
      pinMode(sp1,OUTPUT);//设定舵机接口为输出接口
      //设置两组串口波特率
      Serial.begin(9600);
      delay(500);
      Serial.println("servu=o_seral_simple ready" ) ;
    }

    void loop()//将0到9的数转化为0到180角度
    {
      val=Serial.read();//读取串行端口的值

      if(val>'0'&&val<='9')
      {
        val1=val-'0';//将特征量转化为数值变量
        val1=map(val1,0,9,0,180);//将角度转化为500-2480的脉宽值
        Serial.print("moving servo to ");
        Serial.print(val1,DEC);
        Serial.println();
        for(int i=0;i<=50;i++)//给予舵机足够的时间让它转到指定角度
        {
          servopulse(sp1,val1);//引用脉冲函数
        }
      }

    }

每个舵机控制最多使用2500us,所以在控制普通舵机的50hz的PWM频率下(即20ms一次循环)可以使用一个定时器控制8路舵机,每个舵机到了2500us的时候进入下一个舵机的控制。于是就能扩展很多舵机控制了-0-,我用别的MCU做控制的时候就是调用不同的定时器然后结合带有PWM功能的IO来做的,最多做过42路的。大家一起动手做一个吧\(^o^)/~

说到舵机控制,传统的使用PWM方波控制,相信大家都知道的(废话真多,pia飞~)。现在岛国人民弄出了AX12+等型号的数字舵机,使用485通信,最多可以扩展到255路控制。于是我也想试一试485通信控制的了,但是买不起他们的舵机啊%>_<%,所以现在准备自己改造舵机,正在筹划中。使用12位磁编码器检测角度,精度0.089,希望能够最后实现对速度角度的实时控制及信息反馈,加过载、堵转和温度保护。有兴趣的可以一起做啊,联系我哦,QQ121024123。

 ;)因为开始改造舵机的计划,所以很多学习笔记没有整理,不敢发过来,怕大家笑话。等舵机控制改造完了,整理开源出来,大家一起玩啊。然后我再继续写学习笔记,继续整理。望大家多多指教,若有错误之处望大家多多批评。
« 最后编辑时间: 十月 13, 2011, 07:31:01 上午 作者 i3water »

ChocolateUniverse

  • Jr. Member
  • **
  • 帖子: 97
  • BigQ 勤劳勇敢,爱好艺术
Re: 呃,最近忙着改造舵机的计划,也发一个舵机控制的方法吧
« 回复 #1 于: 十月 12, 2011, 09:22:37 下午 »
三水绝对是潜力股.加油!
BigQ 勤劳勇敢 爱好艺术

Contra

  • SuperManager
  • Sr. Member
  • *****
  • 帖子: 347
  • AC, game dev, new media art&tech.
    • i'm Contra
Re: 呃,最近忙着改造舵机的计划,也发一个舵机控制的方法吧
« 回复 #2 于: 十月 12, 2011, 10:59:41 下午 »
特地翻墙登陆网站来顶!

vinjn

  • SuperManager
  • Hero Member
  • *****
  • 帖子: 586
Re: 呃,最近忙着改造舵机的计划,也发一个舵机控制的方法吧
« 回复 #3 于: 十月 13, 2011, 12:26:15 上午 »
加油,冉冉升起的新星

RavenKwok

  • Sr. Member
  • ****
  • 帖子: 277
  • Artist/ Animator/ Coder/ Cynical Asshole
Re: 呃,最近忙着改造舵机的计划,也发一个舵机控制的方法吧
« 回复 #4 于: 十月 13, 2011, 12:39:46 上午 »
顶。

ArdyPro

  • Newbie
  • *
  • 帖子: 17
Re: 呃,最近忙着改造舵机的计划,也发一个舵机控制的方法吧
« 回复 #5 于: 十月 13, 2011, 09:06:25 下午 »
支持三水,三水加油 :D

Ansifa

  • Newbie
  • *
  • 帖子: 18
    • 博客
Re: 呃,最近忙着改造舵机的计划,也发一个舵机控制的方法吧
« 回复 #6 于: 十月 13, 2011, 10:23:46 下午 »
哈哈,先顶再看...强烈要求给个多个同时控制的例子

执着的虫子

  • Newbie
  • *
  • 帖子: 1
Re: 呃,最近忙着改造舵机的计划,也发一个舵机控制的方法吧
« 回复 #7 于: 十月 14, 2011, 11:55:38 上午 »
咋你们都是英文名字,就我是中文的啊

英文名字的都用英文回复 :P :P :P

三水潜力股

杭州坏鸟

  • Newbie
  • *
  • 帖子: 2
Re: 呃,最近忙着改造舵机的计划,也发一个舵机控制的方法吧
« 回复 #8 于: 十月 14, 2011, 07:06:38 下午 »
程序代码
这个程序那天在群上你已经看过了........
好处就是只要改一下变量名理论上可以控制无限部舵机的运行(同时),当然实际能控制几部要看芯片的驱动能力~~~~~~~

[code//=====================舵机旋转变量定义====================
long time_on, time_off, rundelay;
int pulse_on, pulse_off, val;

void setup()
{
    //=====================舵机旋转设置=======================
    pinMode(4, OUTPUT);   //PWM控制针脚
   pinMode(5, INPUT);
    // Serial.begin(9600);
}

void loop()
{
    //=====================舵机旋转===========================
    if(millis() - rundelay >= 18/*舵机改变角度(电位器)数值读取延迟时间*/)
    {
        val = analogRead(5);
        pulse_on = map(val, 0, 151, 500, 2290);
        //舵机接受的PWM最大脉宽2.5MS左右(2290uS),周期为20MS(20000uS)。此处由电位器数值换算出PWM高电平脉宽持续时间
        if (pulse_on >= 2290) pulse_on = 2290;//限制最大值和最小值
        if (pulse_on < 500) pulse_on = 500;
        //    Serial.println(val);
        pulse_off = 20000 - pulse_on;//周期减去高电平脉宽得出低电平脉宽持续时间
        rundelay = millis();
    }
    if (micros() - time_off >= pulse_off && !digitalRead(4))//根据低电平脉宽持续时间把引脚电平置高
    {
        digitalWrite(4, 1);
        time_on = micros();
    }
    if (digitalRead(4))
    {
        if (micros() - time_on >= pulse_on)//根据高电平脉宽持续时间把引脚电平置低
        {
            digitalWrite(4, 0);
            time_off = micros();
        }
    }

当然程序只是写着玩的,也有一些可以再优化的地方。只不过提供一种不同的概念........就是程序进行不停顿的持续运行,不让被控制设备的等待变成MCU的等待。好处一套程序当中如果具有几个功能模块或者要同时控制多个外部器件的时候互相不会产生干扰,冲突。(比如同时控制多个舵机)

当然坏处么也有.......偶目前为止是没想出来这种写法怎么可以封装到函数里;也就是说这种写法各种功能模块无法以函数的形式存在,只能都写在主函数里。
« 最后编辑时间: 十月 14, 2011, 11:03:39 下午 作者 杭州坏鸟 »

i3water

  • Newbie
  • *
  • 帖子: 8
Re: 呃,最近忙着改造舵机的计划,也发一个舵机控制的方法吧
« 回复 #9 于: 十月 14, 2011, 11:41:20 下午 »
程序代码
这个程序那天在群上你已经看过了........
好处就是只要改一下变量名理论上可以控制无限部舵机的运行(同时),当然实际能控制几部要看芯片的驱动能力~~~~~~~

[code//=====================舵机旋转变量定义====================
long time_on, time_off, rundelay;
int pulse_on, pulse_off, val;

void setup()
{
    //=====================舵机旋转设置=======================
    pinMode(4, OUTPUT);   //PWM控制针脚
   pinMode(5, INPUT);
    // Serial.begin(9600);
}

void loop()
{
    //=====================舵机旋转===========================
    if(millis() - rundelay >= 18/*舵机改变角度(电位器)数值读取延迟时间*/)
    {
        val = analogRead(5);
        pulse_on = map(val, 0, 151, 500, 2290);
        //舵机接受的PWM最大脉宽2.5MS左右(2290uS),周期为20MS(20000uS)。此处由电位器数值换算出PWM高电平脉宽持续时间
        if (pulse_on >= 2290) pulse_on = 2290;//限制最大值和最小值
        if (pulse_on < 500) pulse_on = 500;
        //    Serial.println(val);
        pulse_off = 20000 - pulse_on;//周期减去高电平脉宽得出低电平脉宽持续时间
        rundelay = millis();
    }
    if (micros() - time_off >= pulse_off && !digitalRead(4))//根据低电平脉宽持续时间把引脚电平置高
    {
        digitalWrite(4, 1);
        time_on = micros();
    }
    if (digitalRead(4))
    {
        if (micros() - time_on >= pulse_on)//根据高电平脉宽持续时间把引脚电平置低
        {
            digitalWrite(4, 0);
            time_off = micros();
        }
    }

当然程序只是写着玩的,也有一些可以再优化的地方。只不过提供一种不同的概念........就是程序进行不停顿的持续运行,不让被控制设备的等待变成MCU的等待。好处一套程序当中如果具有几个功能模块或者要同时控制多个外部器件的时候互相不会产生干扰,冲突。(比如同时控制多个舵机)

当然坏处么也有.......偶目前为止是没想出来这种写法怎么可以封装到函数里;也就是说这种写法各种功能模块无法以函数的形式存在,只能都写在主函数里。
:D不错的方法,其实调用库也不错,更新后的库支持更多路舵机了,也优化了很多。http://arduino.cc/en/Reference/Servo
 :'(今天买元件被吭一笔。。哎。。伤心ing

i3water

  • Newbie
  • *
  • 帖子: 8
Re: 呃,最近忙着改造舵机的计划,也发一个舵机控制的方法吧
« 回复 #10 于: 十一月 05, 2011, 07:43:14 下午 »
最新进展


电机驱动


编码器


已完成对电机控制和编码器数据读取。貌似进度有点慢(arduino用于测试,arm上的控制同步进行并已成功)。接下来是闭环控制部分了。

Tags: