analogRead()

Arduino控制器有多个10位数模转换通道。这意味着Arduino可以将0-5伏特的电压输入信号映射到数值0-1023(最大值是2的10次方-1)

换句话说,我们可以将5V等分成1024份。0伏特的输入信号对应着数值0,而5伏特的输入信号对应着1023。

例如当输入电压为2V时,analogRead()函数得到的的值为1024*2/5=410

电位器

电位器就像一个滑动变阻器,可以把1接到Arduino的5V引脚,3接到

Arduino的GND,2接到模拟输入引脚,此时模拟引脚测到的就是电阻R(1-2)上的电压

伺服电机

伺服电机(舵机)内部有反馈装置,使得其能够精确转动固定角度

其有三根线,红色和灰色分别接5V和GND,黄色的是PWM信号线。

下面代码是对其简单的演示:

#include <Servo.h> //定义使用舵机的库函数
//这个库函数在Linux上是用不了的
//我尝试在树莓派上用arduino,结果显示没有这个库函数

Servo myservo;  // 创建伺服电机名myservo(学过C语言的人知到这是结构体)
//在大多数开发板上,可以同时创建12个伺服电机对象

int pos = 0;    // 定义伺服电机的角度,初始为0

void setup() {
  myservo.attach(9);  // 将myservo信号线连接到9号引脚
}

void loop() {
  for (pos = 0; pos <= 180; pos += 1) { // for循环使角度从0缓慢变为到180,每次步长为1
    myservo.write(pos);              // 使舵机转到角度pos
    delay(15);                       // 等待15毫秒,使舵机转到相应位置
  } 
  for (pos = 180; pos >= 0; pos -= 1) { // for循环使角度从180缓慢变为到0,每次步长为1
    myservo.write(pos);              
    delay(15);                      
  }
}

这个代码会让舵机从0转到180,再转回来

map()函数

map 函数用于将一个数值从一个范围线性地转换到另一个范围,其函数原型为 :

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

其中, value 是要转换的值, fromLow 和 fromHigh 指定了 value 原来的范围, toLow 和 toHigh 指定了要转换到的目标范围。

例:

 // 模拟一个传感器读数,范围在0 - 1023
  int sensorValue = 700;
  // 将传感器读数映射到0 - 255的范围,用于控制LED亮度等
  int ledBrightness = map(sensorValue, 0, 1023, 0, 255);

接下来,把这个部分结合起来:

用电位器控制伺服电机:

#include <Servo.h>

Servo myServo;  // 创建一个舵机对象myServo
int analogInput;  // 用于存储电位器读取的值
int pos;  // 用于存储舵机角度

void setup() {
  Serial.begin(9600); //设置串口通讯波特率9600
  myServo.attach(9);  // 将舵机连接到数字引脚9
  pinMode(A0, INPUT);  // 将电位器引脚设置为输入模式
}

void loop() {
  analogInput = analogRead(A0);  // 读取电位器的值
  Serial.println(analogInput); //串口监视器上打印电位器的值
  pos = map(analogInput, 0, 1023, 0, 180);  // 将电位器的值映射到0 - 180度
  myServo.write(pos);  // 设置舵机角度
  delay(15);  // 等待舵机转动到位
}

打开串口监视器,可以查看电位器的值:

Logo

智能硬件社区聚焦AI智能硬件技术生态,汇聚嵌入式AI、物联网硬件开发者,打造交流分享平台,同步全国赛事资讯、开展 OPC 核心人才招募,助力技术落地与开发者成长。

更多推荐