极客工坊

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 111953|回复: 23

arduino驱动舵机,不调用库函数

  [复制链接]
发表于 2011-10-9 12:39:22 | 显示全部楼层 |阅读模式
  1. int sp1=10;//定义舵机接口数字接口7
  2. int pulsewidth;//定义脉宽变量
  3. int val;
  4. int val1;
  5. int myangle1;
  6. //下面是servopulse函数部分(此函数意思:也就是說每次都是0.5ms高電平 1.98ms低電平 然後再0.52ms低電平 17ms延時也是低電平)

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

  24. void loop()//将0到9的数转化为0到180角度,并让LED闪烁相应数的次数
  25. {
  26.   val=Serial.read();//读取串行端口的值

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

  39. }
复制代码
Togke兄加油,我觉得你非常非常厉害的啊。
这个就是一个简单的arduino不调用库函数驱动舵机的程序,输入0-9不同数字,舵机转动到相应的角度并返回pwm值。
Ansifa写的PWM介绍的帖子非常不错哦。

现在开始接触新的控制方法了,希望一切顺利能在两个月内做出个简易的版本再慢慢升级更新吧。用arm做了个舵机控制器后觉得其实PWM控制真的不是很喜欢,虽然用arm写确实比较麻烦。。熬了一周才写出来,完善通信又是一周时间。这次的485通信,基于cortex-m3和stm8的舵机控制器相对PWM的小土坡来说估计算是堵墙了,翻过去有一片不同的天了。希望能学到更多东西。大家一起加油吧。

等着这个月收雕刻机了 嘻嘻

评分

参与人数 1 +1 收起 理由
弘毅 + 1 神马都是浮云

查看全部评分

回复

使用道具 举报

发表于 2011-10-10 11:48:21 | 显示全部楼层
本帖最后由 i7456 于 2011-10-10 11:48 编辑

用了延时,不好。
回复 支持 反对

使用道具 举报

发表于 2011-10-14 08:49:08 | 显示全部楼层
回复 支持 反对

使用道具 举报

发表于 2011-12-7 23:01:03 | 显示全部楼层
看了好多pwm,肿么没有看到电位器控制舵机的程序呢

是太简单了吗···

什么原因······
回复 支持 反对

使用道具 举报

 楼主| 发表于 2011-12-8 08:26:21 | 显示全部楼层
回复地方 发表于 2011-12-7 23:01
看了好多pwm,肿么没有看到电位器控制舵机的程序呢

是太简单了吗···

这个很简单的,你看arduino自带例程,那个就是用的电位器
回复 支持 反对

使用道具 举报

发表于 2011-12-27 15:32:11 | 显示全部楼层
表示佛山三水这帖子很帅
回复 支持 反对

使用道具 举报

发表于 2012-6-16 22:25:33 | 显示全部楼层
回复地方 发表于 2011-12-7 23:01
看了好多pwm,肿么没有看到电位器控制舵机的程序呢

是太简单了吗···

如果这么简单的东西都写不出来。。。。。。基本上可以不用玩arduino了。
基本上等于简单的语法练习
原理就是通过检测连接到地和5V中间的极的电压,确定幅度,然后直接转就好了
PWM可以用系统库或者上面你的程序。。。
基本上属于几十分钟调试好的程序,没难度。
回复 支持 反对

使用道具 举报

发表于 2012-6-16 22:32:14 | 显示全部楼层
这个程序不错。 不过就是占用CPU失序,运行的时候其他代码必须等转完了才可以继续
用SERVO库这方面好些!
回复 支持 反对

使用道具 举报

发表于 2012-10-15 23:24:34 | 显示全部楼层
这个貌似。。。。。12个舵机一个周期22ms,如果这种写法,是不是最后一个舵机到等11*22毫秒才会收到脉冲?
原先也这么写,后来觉得不妥直接在一个定时器里写,可是定时器用的不好,中间只要写延时函数,会导致串口丢、错数据。最后还是改回舵机库写法。。

for(int i=0;i<channel_num;i++){
     pwm_with[i]=map(input_val[i],0,1023,500,2500);
}
for(int i=0;i<channel_num;i++){
       myservo[i].writeMicroseconds(pwm_with[i]);
}
这样好像不用自己去写定时器、也不会有时序的问题出现



是否直接用库舵机库的myservo[i].writeMicroseconds(pwm_with[i]); 比较好?
回复 支持 反对

使用道具 举报

发表于 2014-4-16 08:40:36 | 显示全部楼层
哈不用调用函数使用舵机的真的是变得很少了呢,楼主强大!
回复 支持 反对

使用道具 举报

发表于 2014-4-16 22:20:13 | 显示全部楼层
强大         
回复 支持 反对

使用道具 举报

发表于 2014-11-13 11:01:17 | 显示全部楼层
回复地方 发表于 2011-12-7 23:01
看了好多pwm,肿么没有看到电位器控制舵机的程序呢

是太简单了吗···

arduino学习笔记21 - 舵机控制实验
回复 支持 反对

使用道具 举报

发表于 2014-11-16 21:24:45 | 显示全部楼层
myangle1=map(val1,0,180,500,2480);这句话是啥意思啊?
回复 支持 反对

使用道具 举报

发表于 2015-2-1 17:46:48 | 显示全部楼层
支持,参考下!
回复 支持 反对

使用道具 举报

发表于 2015-3-17 13:14:32 | 显示全部楼层
还行
回复 支持 反对

使用道具 举报

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

本版积分规则 需要先绑定手机号

Archiver|联系我们|极客工坊

GMT+8, 2024-3-29 17:06 , Processed in 0.057460 second(s), 32 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2021, Tencent Cloud.

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