Управление LMS on the OrangePI при помощи энкодера

Дополнение для Logitech Media Server (LMS) on the OrangePI PC

Регулирует громкость и при нажатии кнопки энкодера включает паузу.
Энкодер с кнопкой удалось подключить без использования подтягивающих резисторов, работает на прерываниях очень стабильно, cpu вообще не грузит, загрузка памяти 0.1%, наводки на монтаж отсутствуют.
Проверял с проводами к энкодеру в 20 см.

Тестировал на ARMBIAN 5.31 stable Debian GNU/Linux 8 (jessie) 3.4.113-sun8i

root@orangepipc:~# uname -a
Linux orangepipc 3.4.113-sun8i #18 SMP PREEMPT Thu Jun 15 02:16:06 CEST 2017 armv7l GNU/Linux

Используем библиотеку WiringOtherPi
ставим WiringOtherPi :

git clone https://github.com/lanefu/WiringOtherPi.git
cd WiringOtherPi
sudo ./build
cd ..

в основе код drogonа, автора Wiring Pi с форума https://www.raspberrypi.org/forums/viewtopic.php?f=33&t=125225

#include <stdio.h>
#include <errno.h>
#include <wiringPi.h>

#define   PIN_A   8
#define   PIN_B   9
#define BUTTON_PIN 7

#define   DEBOUNCE   5

static volatile int counter ;
// -------------------------------------------------------------------------
// the event counter
volatile int eventCounter = 0;

void myInterrupt(void) {
  eventCounter++;
}

// -------------------------------------------------------------------------
void encoder (void)
{
  static unsigned int debounce = 0 ;

// If PIN_A is high then ignore it
//   This may be due to bouncing, or a bug/feature of the edge detect

  if (digitalRead (PIN_A) == HIGH) return ;

// Ignore multiple interrupts inside our debounce time

  if (millis () < debounce) return ;
  if (digitalRead (PIN_B) == LOW)   // Anti-clockwise
    --counter ;
  else
    ++counter ;
  debounce = millis () + DEBOUNCE ;
}

int main ()
{
  int last ;
  last = counter = 0 ;
  wiringPiSetup () ;
    pinMode(PIN_A, INPUT);
    pinMode(PIN_B, INPUT);
    pullUpDnControl(PIN_A, PUD_UP);
    pullUpDnControl(PIN_B, PUD_UP);
// -------------------------------------------------------------------------
  pinMode(BUTTON_PIN, INPUT);
  pullUpDnControl (BUTTON_PIN, PUD_UP) ;
  wiringPiISR (BUTTON_PIN, INT_EDGE_FALLING, myInterrupt) ;
 // -------------------------------------------------------------------------

  wiringPiISR (PIN_A, INT_EDGE_FALLING, encoder) ;

  printf ("\nRunning... \n") ;

  for (;;)
  {
// -------------------------------------------------------------------------
    if (eventCounter != 0) system("curl http://192.168.0.3:9000/status.html?p0=pause");
    eventCounter = 0;
// -------------------------------------------------------------------------
    if (counter != last)
    {
    if (counter > last) system("curl  'http://192.168.0.3:9000/status.html?p0=mixer&p1=volume&p2=%2B5'");
    if (counter < last) system("curl  'http://192.168.0.3:9000/status.html?p0=mixer&p1=volume&p2=-5'");
    last = counter ;
    }
// -------------------------------------------------------------------------
    delay( 100 ); // wait 0.1 second
// -------------------------------------------------------------------------
    
  }

  return 0 ;
}

Для компиляции этого кода скачаем исходник:

wget https://raw.githubusercontent.com/ua3nbw-cf/gpiokey/master/encoder.c

меняем в коде 192.168.0.3 на свой IP адрес и компилируем:

gcc -o encoder encoder.c -lpthread -lwiringPi -lwiringPiDev

запуск

./encoder
Share
Send
Pin
Your comment
won’t be published

HTML will not work

Ctrl + Enter
Popular