37款传感器与模块的提法,在网络上广泛流传,其实Arduino能够兼容的传感器模块肯定是不止37种的。鉴于本人手头积累了一些传感器和执行器模块,依照实践出真知(一定要动手做)的理念,以学习和交流为目的,这里准备逐一动手试试多做实验,不管成功与否,都会记录下来——小小的进步或是搞不掂的问题,希望能够抛砖引玉。
【Arduino】168种传感器模块系列实验(资料代码+仿真编程+图形编程)
实验四十:360度旋转编码器模块 KY-040 FOR模块电位器数字脉冲输出电子积木
在中间旋转的圆盘叫编码盘,它随着旋钮一起转动。可以把编码盘看做是导电金属盘,A、B引脚都分别接入单片机的两个GPIO脚,且同时拉高这两个引脚,C引脚就直接接地。当编码盘旋转时,A引脚在编码盘上的触点如果接触到编码盘,则与C引脚在编码盘上的触点接通,因为C引脚是接地的,那么就相当于此时把A引脚接地了,因此连接在A引脚上的GPIO脚则被拉低。B引脚同理。
旋转旋钮时,是安装下图所示原理来采样出A、B脚的电平的:
【Arduino】168种传感器模块系列实验(资料代码+仿真编程+图形编程)
实验四十:360度旋转编码器模块 KY-040 FOR模块电位器数字脉冲输出电子积木
程序七:简易检测按钮(SW)的变化
Arduino实验开源代码
/*
【Arduino】168种传感器模块系列实验(资料代码+仿真编程+图形编程)
程序七:简易检测按钮(SW)的变化
*/
int SW = 4; //定义引脚连接 SW->D4
bool lastButtonStatus = false;
void setup() {
pinMode(SW, INPUT);
digitalWrite(SW, HIGH);//连接按钮的引脚设为上拉
Serial.begin(9600);
}
void loop() {
bool buttonStatus = !digitalRead(SW);//高电平时未按下,状态为false
if (buttonStatus != lastButtonStatus)
{
Serial.println(buttonStatus ? "按下SW" : "松开SW");
lastButtonStatus = buttonStatus; //保存当前状态
}
delay(100);
}
实验串口返回情况
Arduino实验场景图
Arduino实验接线示意图与模块参考电原理图
【Arduino】168种传感器模块系列实验(资料代码+仿真编程+图形编程)
实验四十:360度旋转编码器模块 KY-040 FOR模块电位器数字脉冲输出电子积木
程序八:顺时针或者反时针旋转,按下按钮读取CLK和DT的值
Arduino实验开源代码
/*
【Arduino】168种传感器模块系列实验(资料代码+仿真编程+图形编程)
程序八:顺时针或者反时针旋转,按下按钮读取CLK和DT的值
*/
//定义引脚连接
int CLK = 2;//CLK->D2
int DT = 3;//DT->D3
int SW = 4;//SW->D4
void setup(){
pinMode(SW, INPUT);
digitalWrite(SW, HIGH);//连接按钮的引脚设为上拉
pinMode(CLK, INPUT);
pinMode(DT, INPUT);
Serial.begin(9600);
}
void loop(){
if (!digitalRead(SW)) //读取到按钮按下时读取CLK和DT的值
{
int clkValue = digitalRead(CLK);//读取CLK引脚的电平
int dtValue = digitalRead(DT);//读取DT引脚的电平
Serial.print("CLK:");
Serial.print(clkValue);
Serial.print("; DT:");
Serial.println(dtValue);
delay(1000);
}
}
实验串口返回情况
实验发现,不管顺时针还是逆时针旋转,每次按下按钮之后读取的CLK和DT的值都是一样的,并且相邻两步之间的值是不一样的。
【Arduino】168种传感器模块系列实验(资料代码+仿真编程+图形编程)
实验四十:360度旋转编码器模块 KY-040 FOR模块电位器数字脉冲输出电子积木
程序九:通过中断0监控CLK上的电平变化,读取CLK和DT的电平值
Arduino实验开源代码
/*
【Arduino】168种传感器模块系列实验(资料代码+仿真编程+图形编程)
程序九:通过中断0监控CLK上的电平变化,读取CLK和DT的电平值
*/
//定义引脚连接
int CLK = 2;//CLK->D2
int DT = 3;//DT->D3
const int interrupt0 = 0;// Interrupt 0 在 pin 2 上
void setup() {
pinMode(CLK, INPUT);
pinMode(DT, INPUT);
attachInterrupt(interrupt0, ClockChanged, CHANGE);//设置中断0的处理函数,电平变化触发
Serial.begin(9600);
}
void loop() {
}
//中断处理函数
void ClockChanged() {
int clkValue = digitalRead(CLK);//读取CLK引脚的电平
int dtValue = digitalRead(DT);//读取DT引脚的电平
Serial.print("CLK:");
Serial.print(clkValue);
Serial.print("; DT:");
Serial.println(dtValue);
delay(300);
}
实验串口返回情况
顺时针旋转,CLK和DT的值都是不一样的,且相邻步数的值顺序不同。
逆时针旋转,CLK和DT的值都是一样的,且相邻步数的值不同。
【Arduino】168种传感器模块系列实验(资料代码+仿真编程+图形编程)
程序十:使用旋转编码器模块控制伺服电机SG-90
SG-90 伺服电机是一款低成本、高输出功率的伺服电机。它最多可旋转 180 度,每步最大可旋转 90 度。此外,它足够小,可以轻松融入您的机器人 ARM 或避障机器人项目。最重要的是,它只需要一个输出脉冲信号来控制它的运动。SG90伺服电机的引脚图,它仅由三个引脚组成,例如 PWM、接地和 Vcc 引脚。棕色、橙色和红色线分别是 GND、Vcc 和 PWM 引脚。
Arduino实验接线示意图
Arduino实验开源代码
/*
【Arduino】168种传感器模块系列实验(资料代码+仿真编程+图形编程)
程序十:使用旋转编码器模块控制伺服电机SG-90
*/
//使用舵机库
#include <Servo.h>
//定义引脚连接
#define CLK 2
#define DT 3
Servo servo; // 创建一个伺服对象
int count = 0;
int current_stateCLK;
int last_stateCLK;
void setup() {
pinMode(CLK, INPUT); // 将编码器引脚设置为输入
pinMode(DT, INPUT); // 将编码器引脚设置为输入
Serial.begin(115200);// 初始化串行通信在115200bps
//将引脚7上的伺服附加到伺服对象
servo.attach(7);
servo.write(count);
// 读取inputCLK的初始状态
// 赋值给 previousStateCLK 变量
last_stateCLK = digitalRead(CLK);
}
void loop() {
current_stateCLK = digitalRead(CLK); //读取CLK的当前状态
// 如果CLK 的先前状态和当前状态不同,则发生脉冲
if (current_stateCLK != last_stateCLK && current_stateCLK == 1) {
// 如果 inputDT 状态与 inputCLK 状态不同,则
// 编码器逆时针旋转
if (digitalRead(DT) != current_stateCLK) {
count --;
if (count < 0)
count = 0;
} else {
// 编码器顺时针旋转
count ++;
if (count > 179)
count = 179;
}
servo.write(count); // 移动舵机
Serial.print("角度位置: ");
Serial.println(count);
}
last_stateCLK = current_stateCLK; // 用当前状态更新 last_stateCLK
}
实验串口返回情况
Arduino实验场景图
实验视频
https://v.youku.com/v_show/id_XNTg0NjU0MDE0OA==
【Arduino】168种传感器模块系列实验(资料代码+仿真编程+图形编程)
实验十一:TM1637四位数码管显示旋转编码器数值
开源仿真编程(Linkboy V4.63)
Arduino实验场景图