凌顺实验室/指南/Arduino 指南/

Arduino Uno 使用电位器控制舵机角度

在本实例中,使用到2个元件包括电位器和舵机,之前都有写文章分享如何使用。这次就介绍怎么合并两个元件写程序。

实验效果

通过转动电位器控制舵机的角度转动

元件说明

舵机 https://lingshunlab.com/book/arduino/arduino-uno-drive-servo

电位器 https://lingshunlab.com/book/arduino/arduino-use-potentiometer

如果没有单独使用过以上元件,建议先分别实现一次。

BOM表

名称 数量
Arduino Uno x1
舵机 x1
电位器 x1
面包板 x1
跳线(杜邦线) 若干

接线方式

Arduino Uno 引脚 <---> 电位器 引脚
5V <-> VCC
GND <-> GND
A0 <-> OUT
Arduino Uno 引脚 <---> 舵机引脚
5V <-> VCC(红色)
GND <-> GND(黑色或褐色)
9 <-> 信号线(橙色)

程序提点

程序逻辑是先获取电位器的数值,使用map()函数进行等比映射0 ~ 180之间的数值,并以此数值为舵机的角度,进行舵机的控制。

程序中还输出了电位器的数值和映射的角度,方便观察。

map() 等比映射

这次用到map函数
主要是将一个数字从一个范围重新映射到另一个范围。也就是说,fromLow的值会被映射到Low,fromHigh的值会被映射到High,中间的值会被映射到中间的值,等等。

语法:
map(value, fromLow, fromHigh, toLow, toHigh)

参数:
value:要映射的数字。
fromLow:数值当前范围的下限。
fromHigh:数值当前范围的上界。
toLow:数值目标范围的下限。
toHigh:目标范围的上界。

返回:
等比映射后的数值

Serial.print() 不换行输出

Serial.print()函数和Serial.println()函数的不同之处,就是在串口输出中是否换行。前者Serial.print()函数是不换行,后者Serial.println()函数是换行。

程序实现

// lingshunlab.com

// 加载舵机库
#include <Servo.h>; 

Servo myservo; // 创建一个名为 myservo 的伺服电机实例(名称可随你喜欢命名)
int potpin = 0; // 定义 potpin 变量,用于定义模拟引脚口编号,0则为主板上A0的引脚
int val; // 定义 val 变量, 用于存储电位器的数值
int angle; // 定义 angle 变量, 用于储存角度值

// 初始化
void setup() { 
  myservo.attach(9);  // 配置myservo实例的引脚为9
  Serial.begin(9600);  //设置波特率,这是串口应用中很重要的数字
}

// 主程序
void loop() { 
  val = analogRead(potpin); // 通过analogRead函数,获取指定模拟口的数值
  angle = map(val, 0, 1023, 0, 179); //map()是等比映射函数,把val的数值等比映射为0-180度
  myservo.write(angle); // 控制舵机转动到相应的角度位置。

  Serial.print("val: ");  // 从串口中输出以下数据,方便观察
  Serial.print(val);
  Serial.print(" | ");
  Serial.print("angle: ");
  Serial.println(angle);

  delay(15); // 等待15毫秒,给舵机移动到指定位置
}