快捷搜索:  汽车  科技

树莓派编程常用库(树莓派平台的旋转编码开关编程使用例程)

树莓派编程常用库(树莓派平台的旋转编码开关编程使用例程)./a.out运行程序:源代码如下:#include <stdio.h> #include <string.h> #include <errno.h> #include <stdlib.h> #include <wiringPi.h> #define SWPin 0 #define RoAPin 1 #define RoBPin 2 static volatile int globalCounter = 0 ; unsigned char flag; unsigned char Last_RoB_Status; unsigned char Current_RoB_Status; void btnISR(void) //中断服务程序(ISR) 按下按钮时出发中断,该中断服务的任务是对计数值进行清零 { global

在电子产品的设计中,经常会用到旋转编码开关,也就是旋转编码器、数码电位器、Rotary Encoder。它具有左转、右转功能,有些旋转编码开关还具有按下的功能。

树莓派编程常用库(树莓派平台的旋转编码开关编程使用例程)(1)

上图就是一个带有按键功能的旋转编码开关。上面的两个引脚常态下是断开的,当按下按钮时这两个引脚就接通了,所以可以当成普通的按键来用。下面的三个引脚中,一般是中间的引脚接地,两边的两个引脚分别接上拉电阻后接MCU的两个GPIO,当左右旋转旋钮时,这两个引脚会有相应的脉冲输出,MCU通过对这两个脉冲判断,可以获取是正转还是反转,从而对设备进行相应的控制。

在本例程中,我将树莓派的GPIO0,GPIO1,GPIO2配置成相应的功能,用来对旋转编码开关的状态进行检测。GPIO0检测按钮是否按下,GPIO1和GPIO2配合实现左右旋转的检测,在程序中分别命名为SWPin,RoAPin,RoBPin。下图是树莓派的GPIO引脚分配图。

树莓派编程常用库(树莓派平台的旋转编码开关编程使用例程)(2)

实物图如下:

树莓派编程常用库(树莓派平台的旋转编码开关编程使用例程)(3)

源代码如下:

#include <stdio.h> #include <string.h> #include <errno.h> #include <stdlib.h> #include <wiringPi.h> #define SWPin 0 #define RoAPin 1 #define RoBPin 2 static volatile int globalCounter = 0 ; unsigned char flag; unsigned char Last_RoB_Status; unsigned char Current_RoB_Status; void btnISR(void) //中断服务程序(ISR) 按下按钮时出发中断,该中断服务的任务是对计数值进行清零 { globalCounter = 0; } void rotaryDeal(void) { Last_RoB_Status = digitalRead(RoBPin); while(!digitalRead(RoAPin)){ Current_RoB_Status = digitalRead(RoBPin); flag = 1; } if(flag == 1){ flag = 0; if((Last_RoB_Status == 0)&&(Current_RoB_Status == 1)){ globalCounter ; //向右旋转一步,全局变量globalCounter加1 } if((Last_RoB_Status == 1)&&(Current_RoB_Status == 0)){ globalCounter --; //向左旋转一步,全局变量globalCounter减1 } } } int main(void) { if(wiringPiSetup() < 0){ fprintf(stderr "Unable to setup wiringPi:%s\n" strerror(errno)); return 1; } pinMode(SWPin INPUT); pinMode(RoAPin INPUT); pinMode(RoBPin INPUT); pullUpDnControl(SWPin PUD_UP); //将GPIO0设置为带上拉电阻的模式 if(wiringPiISR(SWPin INT_EDGE_FALLING &btnISR) < 0){ //设置中断为下降沿触发 fprintf(stderr "Unable to init ISR\n" strerror(errno)); return 1; } while(1){ rotaryDeal(); printf("%d\n" globalCounter); } return 0; }

编译程序:

gcc rotaryEncoder.c -lwiringPi

运行程序:

./a.out

当你顺时针旋转按钮时,屏幕上打印出的globalCounter的值会增加;当你逆时针旋转按钮时,屏幕上打印出的globalCounter的值会减小;当你按下按钮时,globalCounter的值会清零。

猜您喜欢: