.. note::
Hola, ¡bienvenido a la comunidad de entusiastas de SunFounder Raspberry Pi & Arduino & ESP32 en Facebook! Sumérgete en el mundo de Raspberry Pi, Arduino y ESP32 con otros entusiastas.
**¿Por qué unirse?**
- **Soporte Experto**: Resuelve problemas post-venta y desafíos técnicos con la ayuda de nuestra comunidad y equipo.
- **Aprender y Compartir**: Intercambia consejos y tutoriales para mejorar tus habilidades.
- **Avances Exclusivos**: Obtén acceso anticipado a nuevos anuncios de productos y adelantos.
- **Descuentos Especiales**: Disfruta de descuentos exclusivos en nuestros productos más recientes.
- **Promociones y Sorteos Festivos**: Participa en sorteos y promociones de temporada.
👉 ¿Listo para explorar y crear con nosotros? Haz clic en [|link_sf_facebook|] y únete hoy mismo.
.. _2.1.6_c:
2.1.6 Módulo de Encoder Rotatorio
====================================
Introducción
-------------------
En este proyecto, aprenderás sobre el encoder rotatorio. Un encoder rotatorio es
un interruptor electrónico con un conjunto de pulsos regulares en una secuencia
estricta de tiempo. Cuando se usa con IC, puede lograr incrementos, decrementos,
cambio de páginas y otras operaciones como el desplazamiento del ratón, selección
de menús, etc.
Componentes Necesarios
--------------------------------
En este proyecto, necesitamos los siguientes componentes.
.. image:: ../img/Part_two_25.png
Es definitivamente conveniente comprar un kit completo, aquí está el enlace:
.. list-table::
:widths: 20 20 20
:header-rows: 1
* - Nombre
- COMPONENTES EN ESTE KIT
- ENLACE
* - Kit Raphael
- 337
- |link_Raphael_kit|
También puedes comprarlos por separado en los enlaces a continuación.
.. list-table::
:widths: 30 20
:header-rows: 1
* - INTRODUCCIÓN DEL COMPONENTE
- ENLACE DE COMPRA
* - :ref:`cpn_gpio_board`
- |link_gpio_board_buy|
* - :ref:`cpn_breadboard`
- |link_breadboard_buy|
* - :ref:`cpn_wires`
- |link_wires_buy|
* - :ref:`cpn_rotary_encoder`
- |link_rotary_encoder_buy|
**Diagrama Esquemático**
------------------------
.. image:: ../img/image349.png
:align: center
Procedimientos Experimentales
---------------------------------
**Paso 1:** Construye el circuito.
.. image:: ../img/2.1.6_fritzing.png
:align: center
**Paso 2:** Abre el archivo de código.
.. raw:: html
.. code-block::
cd ~/raphael-kit/c/2.1.6/
**Paso 3:** Compila el código.
.. raw:: html
.. code-block::
gcc 2.1.6_RotaryEncoder.c -lwiringPi
**Paso 4:** Ejecuta.
.. raw:: html
.. code-block::
sudo ./a.out
Verás el conteo en la terminal. Cuando gires el encoder rotatorio en el sentido de las agujas del reloj, el conteo aumentará; cuando lo gires en sentido antihorario, el conteo disminuirá. Si presionas el interruptor en el encoder rotatorio, las lecturas volverán a cero.
.. note::
Si no funciona después de ejecutarlo, o aparece un mensaje de error: \"wiringPi.h: No such file or directory\", consulta :ref:`install_wiringpi`.
**Código**
.. code-block:: c
#include
#include
#include
#include
#include
#define clkPin 0
#define dtPin 1
#define swPin 2
static volatile int globalCounter = 0 ;
unsigned char flag;
unsigned char Last_dtPin_Status;
unsigned char Current_dtPin_Status;
void btnISR(void)
{
globalCounter = 0;
}
void rotaryDeal(void)
{
Last_dtPin_Status = digitalRead(dtPin);
while(!digitalRead(clkPin)){
Current_dtPin_Status = digitalRead(dtPin);
flag = 1;
}
if(flag == 1){
flag = 0;
if((Last_dtPin_Status == 0)&&(Current_dtPin_Status == 1)){
globalCounter --;
}
if((Last_dtPin_Status == 1)&&(Current_dtPin_Status == 0)){
globalCounter ++;
}
}
}
int main(void)
{
if(wiringPiSetup() < 0){
fprintf(stderr, "Unable to setup wiringPi:%s\n",strerror(errno));
return 1;
}
pinMode(swPin, INPUT);
pinMode(clkPin, INPUT);
pinMode(dtPin, INPUT);
pullUpDnControl(swPin, PUD_UP);
if(wiringPiISR(swPin, INT_EDGE_FALLING, &btnISR) < 0){
fprintf(stderr, "Unable to init ISR\n",strerror(errno));
return 1;
}
int tmp = 0;
while(1){
rotaryDeal();
if (tmp != globalCounter){
printf("%d\n", globalCounter);
tmp = globalCounter;
}
}
return 0;
}
**Análisis del Código**
* Leer el valor de dtPin cuando clkPin está bajo.
* Cuando clkPin está alto, si dtPin pasa de bajo a alto, la cuenta disminuye, de lo contrario, la cuenta aumenta.
* swPin emitirá bajo cuando se presione el eje.
A partir de esto, el flujo del programa se muestra a continuación:
.. image:: ../img/2.1.6_flow.png
:align: center
**Imagen del Fenómeno**
---------------------------------
.. image:: ../img/2.1.6rotary_ecoder.JPG
:align: center