Jane 发表于 2014-6-5 15:39:56

DFR0100 Arduino教程 11-- 可控舵机

【本篇课程内容于 2024年11月14日更新】>本系教程配套硬件套件:【新版】Arduino入门套件 DFR0100
在前面一个项目中,我们知道了如何让舵机动起来,这里将进一步的通过外部信号来让舵机随着输入的改变来相应改变角度,方便做一些可控的转动装置。我们这里通过一个可变电阻——电位器,来控制舵机。当然你也可以通过其他的模拟量或者数字量来控制舵机。模拟量的话,比如改造一下前面的感光灯,变成一个会动的感光灯。数字量的话,比如通过一个按钮,倾斜开关等等,一旦触发开关,就让舵机转动,可以有很多玩儿法。再给舵机加个外壳,让它更具生命力。

元件清单


硬件连接

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


图 1 可控舵机连线图


代码示例

//项目 - 可控舵机
#include <Servo.h>         // 声明调用Servo.h库
Servo myservo;               // 创建一个舵机对象

int potpin = 0;            // 连接到模拟口0               
int val;                  //变量val用来存储从模拟口0读到的值

void setup() {
myservo.attach(9);   // 将引脚9上的舵机与声明的舵机对象连接起来
}

void loop() {
val = analogRead(potpin);   
//从模拟口0读值,并通过val记录         
val = map(val, 0, 1023, 0, 179);//通过map函数进行数值转换   
myservo.write(val);               // 给舵机写入角度
delay(15);                        // 延时15ms让舵机转到指定位置
}

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

代码回顾

代码的开始部分还是需要调用<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°。

示例代码
下一篇教程:Arduino教程 12-- 彩灯调光台


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


猪爱吃面 发表于 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

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不会渐变。
这是我的代码:
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);                        // 延时
}

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

厉害厉害
页: [1] 2
查看完整版本: DFR0100 Arduino教程 11-- 可控舵机