2014-6-5 15:39:56 [显示全部楼层]
67564浏览
查看: 67564|回复: 25

[入门教程] DFR0100 Arduino教程 12-- 可控舵机

[复制链接]
该教程实验平台:Arduino入门套件
上一篇教程:Arduino教程 Lesson 11 -- 舵机初动

在前面一个项目中,我们知道了如何让舵机动起来,这里将进一步的通过外部信号来让舵机随着输入的改变来相应改变角度,方便做一些可控的转动装置。我们这里通过一个可变电阻——电位器,来控制舵机。当然你也可以通过其他的模拟量或者数字量来控制舵机。模拟量的话,比如改造一下前面的感光灯,变成一个会动的感光灯。数字量的话,比如通过一个按钮,倾斜开关等等,一旦触发开关,就让舵机转动,可以有很多玩儿法。再给舵机加个外壳,让它更具生命力。

所需材料
1×   Micro Servo 9g
1×  10K 电位器

STEP 1: 硬件连接
与前面一节不同处在于多了一个电位器,电位器相当于一个可变阻值的电阻,两个引脚的一边分别接5V与GND,而另一边只有单独一个引脚的接模拟口0,用于做输入信号。

DFR0100 Arduino教程 12-- 可控舵机图1


STEP 2:输入代码
  1. #include <Servo.h>           // 声明调用Servo.h库
  2. Servo myservo;               // 创建一个舵机对象
  3. int potpin = 0;              // 连接到模拟口0               
  4. int val;                     //变量val用来存储从模拟口0读到的值
  5. void setup() {
  6.       myservo.attach(9);          // 将引脚9上的舵机与声明的舵机对象连接起来
  7. }
  8. void loop() {
  9.        val = analogRead(potpin);         //从模拟口0读值,并通过val记录         
  10.        val = map(val, 0, 1023, 0, 179);  //通过map函数进行数值转换   
  11.        myservo.write(val);               // 给舵机写入角度  
  12.        delay(15);                        // 延时15ms让舵机转到指定位置  
  13. }
复制代码
下载代码,成功后,旋转电位器,看看舵机是不是随着电位器转动。

STEP 3:代码回顾
代码的开始部分还是需要调用<Servo.h>库,并创建相应的对象。同时,需要一个模拟口用来读取电位器的值,我们这里用变量potPin代表模拟口0。

这里主要讲下map函数。
函数格式如下:
map(value, fromLow, fromHigh, toLow, toHigh)

map函数的作用是将一个数从一个范围映射到另外一个范围。也就是说,会将 fromLow 到 fromHigh 之间的值映射到 toLow 在 toHigh 之间的值。

map函数参数含义:
value:需要映射的值
fromLow:当前范围值的下限
fromHigh:当前范围值的上限
toLow:目标范围值的下限
toHigh:目标范围值的上限

map的神奇之处还在于,两个范围中的“下限”可以比“上限”更大或者更小,因此map()函数可以用来翻转数值的范围,可以这么写:
  1. y = map(x, 1, 50, 50, 1);
复制代码

这个函数同样可以处理负数,请看下面这个例子:
  1. y = map(x, 1, 50, 50, -100);
复制代码
  1. val = map(val, 0, 1023, 0, 179);
复制代码

所以,回到代码中,我们是想将模拟口读到的0~1023的值,转换为舵机的0~180°。

STEP 4:硬件回顾
电位器
电位器可以理解为个电阻,只是这个电阻阻值可变。我们这里可调节的范围是0~10KΩ。电阻两端接电源,通过中间引脚调节阻值,随着电阻值的改变而带动电压变化。我们用模拟口0读取到这个变化中的电压值,并转换为对应的舵机的角度值。这就是整个的控制过程。

电位器在电路上的表示的图标为下图,分别对应器件上的3个引脚。
DFR0100 Arduino教程 12-- 可控舵机图2

简单的看下原理,不知道还记不记得在Arduino教程 Lesson 10 -- 感光灯中讲到的分压原理。电位器用的同样是分压原理。我们可以理解为,电位器被拆分为上下两个电阻R1和R2,随着转动电位器,上下阻值发生变化,从而对应的输出电压就不同。我们可以想象成切蛋糕,分到的蛋糕越多(电阻),吃下去的能量(电压Vout)也就越大。电压值大小的变化可以直接通过模拟口读到的值(0~1023)反应出来。

DFR0100 Arduino教程 12-- 可控舵机图3



下一篇教程:Arduino教程 Lesson 13-- 彩灯调光台


tutorials

猪爱吃面  学徒

发表于 2023-7-7 22:23:41

#include <Servo.h>           
Servo myservo;               



int potpin = 0;                             
int val;
int ledPin = 5;                     

void setup() {
      
      myservo.attach(9);
      pinMode(ledPin, OUTPUT);         
}

void loop() {
      
      
       val = analogRead(potpin);              
       val = map(val, 0, 1023, 0, 179);     
       myservo.write(val);              
       delay(15);

         
       digitalWrite(ledPin,HIGH);
       delay(500);
       digitalWrite(ledPin,LOW);
       delay(200);                     
}


为撒 加了个闪灯程序 舵机就疯了 ?
回复

使用道具 举报

juju大叔  学徒

发表于 2023-2-15 22:39:27

本帖最后由 juju大叔 于 2023-2-15 22:41 编辑
Jane 发表于 2014-7-17 14:02
这是由AD芯片的转换精度决定的,这个AD芯片10位的,所以也就是2^10=1024。也就是0~1023 ...

正好看到,不知道这个10位的来源。看了一下文档,在此标注一下。
https://wiki.dfrobot.com.cn/_SKU_DFR0216_DFRduino_UNO_R3#target_8
[输入输出/2.6路模拟输入A0到A5]有讲到
file:///Users/fai/Desktop/%E6%88%AA%E5%B1%8F2023-02-15%2022.37.32.png
截屏2023-02-15 22.37.32.png
回复

使用道具 举报

talos  禁止发言

发表于 2018-5-4 11:46:24

提示: 作者被禁止或删除 内容自动屏蔽
回复

使用道具 举报

lvyangyang1314  学徒

发表于 2014-6-17 16:27:53

请问为啥o-5v对应的是o-1023?
回复

使用道具 举报

Jane  高级技匠
 楼主|

发表于 2014-7-17 14:02:06

lvyangyang1314 发表于 2014-6-17 16:27
请问为啥o-5v对应的是o-1023?

这是由AD芯片的转换精度决定的,这个AD芯片10位的,所以也就是2^10=1024。也就是0~1023
回复

使用道具 举报

翻滚的魔方  初级技师

发表于 2014-9-7 14:56:19

本帖最后由 翻滚的魔方 于 2014-9-7 14:57 编辑

UNO的板,模拟端口有哪几个,怎么区分啊。
顺便问一下,板上的接口各代表什么含义,能不能介绍一下


回复

使用道具 举报

Jane  高级技匠
 楼主|

发表于 2014-9-9 10:02:00

翻滚的魔方 发表于 2014-9-7 14:56
UNO的板,模拟端口有哪几个,怎么区分啊。
顺便问一下,板上的接口各代表什么含义,能不能介绍一下

推荐你看下 UNO 产品资料
���
回复

使用道具 举报

Jane  高级技匠
 楼主|

发表于 2014-11-20 17:09:01

舵机还可以这么玩~通过环境光传感器,其实也就是光敏二极管啦~那手头资源就可以做一个

https://mc.dfrobot.com.cn/thread-3331-1-1.html
回复

使用道具 举报

siska  初级技师

发表于 2015-7-15 18:23:14

我用电位器和一个LED做了个可调节亮度的LED,但是我发现LED的亮度是瞬变的,没有渐变的过程(就是类似于呼吸灯那种渐变),我打开串口监视器看了看数值,发现没问题,但我搞不懂为什么LED不会渐变。
这是我的代码:
  1. int a = 13;
  2. int potpin = 0;              // 连接到模拟口0         
  3. int val;                     //变量val用来存储从模拟口0读到的值
  4. void setup() {
  5.       pinMode(a,OUTPUT);
  6.       Serial.begin(9600);        //设置波特率为9600 bps
  7. }
  8. void loop() {
  9.        val = analogRead(potpin);         //从模拟口0读值,并通过val记录         
  10.        val = map(val, 0, 1023, 0, 255);  //通过map函数进行数值转换  
  11.        Serial.print(val);  
  12.        analogWrite(a, val);
  13.        delay(100);                        // 延时
  14. }
复制代码
回复

使用道具 举报

siska  初级技师

发表于 2015-7-15 20:07:05

siska 发表于 2015-7-15 18:23
我用电位器和一个LED做了个可调节亮度的LED,但是我发现LED的亮度是瞬变的,没有渐变的过程(就是类似于呼 ...

刚才重新做了一遍呼吸灯的课程,发现LED也不会渐变了,变成了瞬变,换了LED试了下还是瞬变,之前做这个课程的时候也会渐变的,搞不懂啊:'(
回复

使用道具 举报

Jane  高级技匠
 楼主|

发表于 2015-7-16 11:22:06

siska 发表于 2015-7-15 20:07
刚才重新做了一遍呼吸灯的课程,发现LED也不会渐变了,变成了瞬变,换了LED试了下还是瞬变,之前做这个课 ...

是不是你调整的时间太短了呀
回复

使用道具 举报

siska  初级技师

发表于 2015-7-16 17:23:38

Jane 发表于 2015-7-16 11:22
是不是你调整的时间太短了呀

我又试了试,发现引脚接13、12是瞬变,而接10、9等等才是渐变= =
回复

使用道具 举报

ceihowu  学徒

发表于 2015-10-17 11:17:16

siska 发表于 2015-7-16 17:23
我又试了试,发现引脚接13、12是瞬变,而接10、9等等才是渐变= =

那是因为数字输出口和模拟输出口的原因,数字输出是不会渐变的,直接到位,而模拟就会逐渐变量。
回复

使用道具 举报

辉竹雾云晨  学徒

发表于 2019-2-1 15:39:03

抢沙发啦
回复

使用道具 举报

LeSoleil  见习技师

发表于 2019-7-17 09:18:56

太好了!
回复

使用道具 举报

绝地智者  见习技师

发表于 2019-7-19 22:15:27

厉害了,新手来顶一顶帖子,加油学习~
回复

使用道具 举报

gran  学徒

发表于 2019-10-11 09:44:41

没有三脚按键可以怎么改?
回复

使用道具 举报

DFBk9YQRr-m  学徒

发表于 2020-8-9 07:18:59

老师,我想问一下,如果我用360°舵机是不是可以控制360°旋转???
回复

使用道具 举报

IdSNilMdFl2A  学徒

发表于 2021-8-6 22:51:29

给作者赞一个!
回复

使用道具 举报

Melody-王俊皓  见习技师

发表于 2022-8-20 10:53:39

感谢感谢,小白学的很方便
回复

使用道具 举报

三春牛-创客  初级技神

发表于 2023-2-18 11:08:44

厉害厉害
回复

使用道具 举报

12下一页
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

为本项目制作心愿单
购买心愿单
心愿单 编辑
[[wsData.name]]

硬件清单

  • [[d.name]]
btnicon
我也要做!
点击进入购买页面
上海智位机器人股份有限公司 沪ICP备09038501号-4

© 2013-2024 Comsenz Inc. Powered by Discuz! X3.4 Licensed

mail