文章目录
- 前言
- 1.实验器材
- 2.实验原理
-
- 2.1实验接线
- 2.2实物接线图
- 3.代码示例
-
- 3.部分代码解释
-
- 去抖动操作
- 直接用`==`比较字符串
- 3.2 Linux编译操作代码
- 3.3运行效果
- 结语
前言
昨天补充了树莓派的初始化博客,这个专栏的模块就全了!
欢迎向其他有兴趣学习树莓派的朋友推荐本专栏!
从这个博客开始,它将不再被告知,所有所有操作解决
还在等什么?心不如行动!点我注意
本专栏代码仓库:Raspberry-practice
1.实验器材
- 树莓派开发板
- 40p软排线 T型转接板 面包板
- 倾斜传感器模块
- 双色LED模块
- 跳线一堆
上:倾斜传感器;下:双色LED
2.实验原理
在倾斜开关中,有一个用于检测小角度倾斜的金属球。倾斜开关模块的结构是双向球形倾斜关。只要倾斜力满足条件,开关就会通电并输出信号。
2.1实验接线
树莓派 | T型转接板 | 倾斜开关 |
---|---|---|
GPIO 0 | GPIO 17 | Do |
5V | 5V | VCC |
GND | GND | GND |
树莓派 | T型转接板 | 双色LED |
---|---|---|
GPIO 1 | GPIO 18 | R(中间) |
GND | GND | GND(-) |
GPIO 2 | GPIO 27 | G(S) |
2.2实物接线图
连接排线后,倾斜开关模块PWR-LED
指示灯亮起
当检测到倾角变化时,DO-LED
此时也会亮起Do
管脚输出低电平,对应值为0。这一原理将用于后续程序的编写
3.代码示例
以下是C语言的示例代码
//倾斜传感器实验 #include <wiringPi.h> #include <stdio.h> #define makerobo_TiltPin 0 ///倾斜传感器管脚定义 #define makerobo_Rpin 1 //红色LED定义模块管脚 #define makerobo_Gpin 2 //绿色LED定义模块管脚 //双色LED控制函数 void double_colorLED(char* color) {
pinMode(makerobo_Rpin, OUTPUT); //设置为输出模式 pinMode(makerobo_Gpin, OUTPUT); //设置为输出模式
if (color == "makeroboRED") //点亮红色LED灯
{
digitalWrite(makerobo_Rpin, HIGH);
digitalWrite(makerobo_Gpin, LOW);
}
else if (color == "makeroboGREEN") //点亮绿色LED灯
{
digitalWrite(makerobo_Rpin, LOW);
digitalWrite(makerobo_Gpin, HIGH);
}
else
printf("Double color LED Error");
}
int main(void)
{
//初始化连接失败时,将消息打印到屏幕
if(wiringPiSetup() == -1){
printf("setup wiringPi failed !");
return 1;
}
//倾斜传感器Pin设置为输入模式
pinMode(makerobo_TiltPin, INPUT);
double_colorLED("makeroboGREEN");
while(1){
//如果没有检测到倾斜,输出高电平1
//检测到了之后,输出高电平0
if(0 == digitalRead(makerobo_TiltPin))
{
//倾斜传感器发生倾斜
delay(10); //倾斜传感器去除抖动处理
if(0 == digitalRead(makerobo_TiltPin)){
double_colorLED("makeroboRED"); // 点亮红色LED灯
printf("Tilt!\n"); // 打印出出现倾斜
}
}
else if(1 == digitalRead(makerobo_TiltPin))
{
// 倾斜传感器没有发生倾斜
delay(10);
if(1 == digitalRead(makerobo_TiltPin)){
while(!digitalRead(makerobo_TiltPin));
double_colorLED("makeroboGREEN"); // 点亮绿色LED灯
printf("No Tilt!\n"); // 打印没有出现倾斜
}
}
}
return 0;
}
3.1部分代码解释
去抖动操作
因为都是物理结构,需要有一定的延时来进行去抖动操作
直接用==
比较字符串
(color == "makeroboGREEN")
这里用到了==
直接比较字符串,之前我以为这样写是错误的,因为Linux-gcc
报错了(但是可以编译出可执行文件,也能正常运行)
实际上这个在VS下是可以正常运行的,不会报错
个人理解,这样直接传入字符串的操作,实际上是在函数中创建了一个形参color
,接收了传过来的常量字符串,随后的==
比较的其实是内存中的字符串的地址,而不是直接比较字符串本身
这个代码里面包含的wiringPi函数,在之前的博客中已经讲解过了,详情可以看实验06👉传送门
如果有不懂的,可以在评论区提出!
3.2 Linux编译运行代码
输入以下语句编译这个代码,生成可执行文件TEST
gcc -Wall 07tiltswitch.c -o TEST -lwiringPi
./TEST
运行这个文件,按CTRL+C
终止程序
3.3运行效果
抬起倾斜开关,LED亮绿灯。放下它后,变成默认的红灯
结语
本次实验到这里就结束啦!感觉这个倾斜开关就是手机中。
目前我设想的是,以后的小车实验中可以通过它来判断小车现在是在上坡还是在平地,如果在上坡,就加大马达的输出。嗯,应该是这样!