DFR0100 Arduino教程 11-- 可控舵机

2014-06-059万
AI 快速预览详细 收起
本篇Arduino教程介绍了如何通过电位器控制舵机角度,实现可控转动装置。首先列出了所需的元件清单,包括DFR0100套件中的电位器和舵机。接着详细说明了硬件连接方法,电位器的一边分别接5V与GND,另一边单独一个引脚接模拟口0。代码部分调用了Servo.h库,并创建了一个舵机对象。通过map函数将模拟口读到的0~1023的值转换为舵机的0~180°,实现精确控制。最后,通过旋转电位器,可以观察到舵机随着电位器转动。
【本篇课程内容于 2024年11月14日更新】
>本系教程配套硬件套件:【新版】Arduino入门套件 DFR0100

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

元件清单
DFR0100 Arduino教程 11-- 可控舵机图1

硬件连接

与项目【舵机初动】不同处在于多了一个电位器,电位器相当于一个可变阻值的电阻,两个引脚的一边分别接5V与GND,而另一边只有单独一个引脚的接模拟口0,用于做输入信号。

DFR0100 Arduino教程 11-- 可控舵机图2

图 1 可控舵机连线图



代码示例

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


下载代码,成功后,旋转电位器,看看舵机是不是随着电位器转动。

代码回顾

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

map(value, fromLow, fromHigh, toLow, toHigh)

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

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

map的神奇之处还在于,两个范围中的“下限”可以比“上限”更大或者更小,因此map()函数可以用来翻转数值的范围,可以这么写:

y = map(x, 1, 50, 50, 1);

这个函数同样可以处理负数,请看下面这个例子:

y = map(x, 1, 50, 50, -100);
val = map(val, 0, 1023, 0, 179);

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

示例代码下载附件Interact_with_Servo_Chinese.rar
下一篇教程:Arduino教程 12-- 彩灯调光台


DFRobot版权所有,欢迎转载。
转载请务必标注来源: DF创客社区+作者姓名+原文网址。


创作许可协议

本项目采用 None(不开放任何权利,保留所有权利) 进行许可。

评论(18)
花生编程
花生编程
学习了,感谢分享!
花生编程
花生编程
不错不错
猪爱吃面
猪爱吃面
#include
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);
}
为撒 加了个闪灯程序 舵机就疯了 ?
三春牛-创客
三春牛-创客
感谢分享
三春牛-创客
三春牛-创客
学习了!
三春牛-创客
三春牛-创客
厉害厉害
Melody-王俊皓
Melody-王俊皓
感谢感谢,小白学的很方便
IdSNilMdFl2A
IdSNilMdFl2A
给作者赞一个!
DFBk9YQRr-m
DFBk9YQRr-m
老师,我想问一下,如果我用360°舵机是不是可以控制360°旋转???
gran
gran
没有三脚按键可以怎么改?
绝地智者
绝地智者
厉害了,新手来顶一顶帖子,加油学习~
LeSoleil
LeSoleil
太好了!
辉竹雾云晨
辉竹雾云晨
抢沙发啦
talos
talos
欢迎使用深圳市天乐思智能总线伺服及其学习套件, 其特点如下:1、自带ros开发包,无缝对接ROS。2、提供6自由度机械臂套件,AGV套件。3、完整兼容ROBOTIS的dynamixel protocol 2.0 协议的伺服,而且我们对该协议进行了扩充,我们的功能其实比ROBOTIS还要多。
siska
siska
我用电位器和一个LED做了个可调节亮度的LED,但是我发现LED的亮度是瞬变的,没有渐变的过程(就是类似于呼吸灯那种渐变),我打开串口监视器看了看数值,发现没问题,但我搞不懂为什么LED不会渐变。
这是我的代码:
[code]int a = 13;
int potpin = 0; // 连接到模拟口0
int val; //变量val用来存储从模拟口0读到的值
void setup() {
pinMode(a,OUTPUT);
Serial.begin(9600); //设置波特率为9600 bps
}
void loop() {
val = analogRead(potpin); //从模拟口0读值,并通过val记录
val = map(val, 0, 1023, 0, 255); //通过map函数进行数值转换
Serial.print(val);
analogWrite(a, val);
delay(100); // 延时
}
[/code]
ceihowu
ceihowu回复siska
那是因为数字输出口和模拟输出口的原因,数字输出是不会渐变的,直接到位,而模拟就会逐渐变量。
siska
siska回复Jane
我又试了试,发现引脚接13、12是瞬变,而接10、9等等才是渐变= =
共4条回复,已加载2条,点击查看更多共4条回复,已加载全部
Jane
Jane
作者
舵机还可以这么玩~通过环境光传感器,其实也就是光敏二极管啦~那手头资源就可以做一个
https://mc.dfrobot.com.cn/thread-3331-1-1.html
qq721001561564
qq721001561564
UNO的板,模拟端口有哪几个,怎么区分啊。
顺便问一下,板上的接口各代表什么含义,能不能介绍一下
Jane
Jane
作者
回复qq721001561564

推荐你看下 UNO 产品资料
���
lvyangyang1314
lvyangyang1314
请问为啥o-5v对应的是o-1023?
juju大叔
juju大叔回复Jane
正好看到,不知道这个10位的来源。看了一下文档,在此标注一下。
https://wiki.dfrobot.com.cn/_SKU_DFR0216_DFRduino_UNO_R3#target_8
[输入输出/2.6路模拟输入A0到A5]有讲到
Jane
Jane
作者
回复lvyangyang1314
这是由AD芯片的转换精度决定的,这个AD芯片10位的,所以也就是2^10=1024。也就是0~1023
- 没有更多了 -