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

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

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

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

实物图如下:

源代码如下:

#include <stdio.h>
#include <string.h>
#include <errno.h>
#include <stdlib.h>
#include <wiringPi.h>#define  SWPin     0
#define  RoAPin    1
#define  RoBPin    2static 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的值会清零。

代码已分享到360云盘:

点此下载   密码:a7b3

树莓派平台的旋转编码开关编程使用例程相关推荐

  1. 旋转编码开关 EC11 的工作原理

    EC11旋转编码开关:带有左转.右转.按下三个功能. 我只需要使用左右转功能,这里只需要使用A.B引脚. 1. 引脚设置: 使用的是A B 引脚,设置为上拉输入.因为需要通过检测A.B两个引脚的电平变 ...

  2. MSP430 判断 旋转编码开关转动方向

    msp430 是一款超低功耗的单片机,个人感觉市面上看到的教程远远少于Adrunio ,51和 stm32,可能是太底层了的原因吧.本文将使用MSP430F5529PL 来完成对于旋转编码开关转动方向 ...

  3. 【应用】使用STM32单片机定时器的Encoder模式驱动数字旋转编码开关

    RZ-51 6合1扩展板原理图.pdf:https://download.csdn.net/download/ZLK1214/29016144https://download.csdn.net/dow ...

  4. 树莓派旋转编码开关(python程序)

    1,工具:pri3,微雪Rotation Sensor 2,基本原理: Rotation Sensor SIA SIB SW分别与树莓派3.5.7PIN链接 Rotation Sensor SIA和S ...

  5. 编码开关的原理及使用方法

    这里附上旋转编码器 EC11的实现原理和C语言代码:https://blog.csdn.net/lovelijiapu/article/details/99584590 旋转编码开关:在电子产品中经常 ...

  6. 三个脚编码开关c语言,编码开关的原理及使用方法

    这里附上旋转编码器 EC11的实现原理和C语言代码 https://blog.csdn.net/lovelijiapu/article/details/99584590 旋转编码开关 在电子产品中经常 ...

  7. 【Android 内存优化】Android 原生 API 图片压缩原理 ( 哈夫曼编码开关 | 哈夫曼编码原理 | libjpeg-turbo 函数库 )

    文章目录 一. 哈夫曼编码开关 二. 哈夫曼编码原理 三. libjpeg-turbo 函数库 四. libjpeg-turbo 函数库下载 [Android 内存优化]图片文件压缩 ( Androi ...

  8. 旋钮编码开关工作原理

    现在有很多仪器和设备采用了旋钮编码开关做为输入装置.常用的编码开关有3个输出端口,如果A下跳沿时,B为低则表示顺时钟旋转:如果A下跳沿时,B为高电平则表示逆时钟旋转.与CPU的连接方法:将A端口接CP ...

  9. [技术文档]分享 HK32F030MF4P6 旋钮编码开关例程

    分享HK32F030MF4P6 旋钮编码开关例程,检测灵敏,基本无误触发.    串口助手窗口中,L表示向左旋转,R表示向右旋转,M表示中键按下,程序上每检测到一次L操作,变量数值加1,每检测到一次R ...

最新文章

  1. 电脑卡,eclipse Android stadio 卡,什么都卡解决方法
  2. Linux 内核的文件 Cache 管理机制介绍
  3. linux nfs系统客户端,Linux系统中挂载共享目录NFS文件系统客户端安装与配置
  4. Python+Opencv测量物体之间的距离
  5. cookie html5,HTML5——存储(cookie、localStorage、sessionStorage)的区别
  6. vue 渲染函数处理slot_vue render 渲染函数
  7. Ubuntu文件夹有锁标志(去除) 命令打包解包
  8. 【Tensorflow】Tensor的比较运算
  9. 基于JAVA+SpringMVC+MYSQL的火车票订票系统
  10. No input file specified的解决方法
  11. ros名称、命名空间和重映射
  12. input type=file与cursor:pointer的兼容性问题
  13. php 做 往安居客发布房源,安居客发布房源操作方法
  14. 纯CSS制作-旋转立方体效果
  15. meta标签下http-equiv 属性详解
  16. ∘(空心的点乘)的数学含义
  17. 多角度解析特斯拉电动车技术到底领先了多少?|厚势
  18. 笔记本建立WIFI热点的bat命令
  19. 【control】微分平坦(Differential Flatness)
  20. 【译文】抽象漏洞法则

热门文章

  1. flask异步操作_flask实现异步任务
  2. bootstrap支付宝充值html,jQuery+Bootstrap移动端支付宝金额充值表单页面网页特效
  3. 酿酒过程-你知道白酒的辣味是什么引起的吗?
  4. CDOJ 1292 卿学姐种花 暴力 分块 线段树
  5. 浓浓的咖喱味,你闻着了吗?
  6. IE10浏览器 默认的文档模式为IE7标准,无法更改
  7. 干货--如何利用微博来写原创文章
  8. WOW.js 使用教程
  9. alter在MySQL中是什么意思_MySql之ALTER命令用法详细解读(转)
  10. DiskGenius扩展分区大小错误:检测到下列文件系统错误,分区容量未做调整, 无效的的文件记录