8 заметок с тегом

GPIO

Использование GPIO на OrangePi

Кнопки на GPIO Mainline Linux OrangePi

Мы можем использовать GPIO (линии ввода/вывода общего назначения ) и с минимальными ресурсами отслеживать изменения на линии GPIO.
Также мы можем запустить любой скрипт или программу с помощью кнопок подключённых к GPIO.
тестировал на mainline ядре 4.14.15-sunxi

Пример подключения пяти нормально разомкнутых кнопок:

использовал драйвер gpio-keys
ставим хидеры ядра, в терминале:

apt upgrade

armbian-config -> Software -> Headers

по умолчанию в  armbian, модуль gpio-keys не установлен.
ставим модуль gpio-keys :

git clone https://github.com/ua3nbw-cf/gpio-keys
cd gpio-keys
make all install

вот фрагмент оверлея gpio-keys.dts из папки gpio-keys

g-keys_up {
					label = "GPIO KEY_UP";
					linux,code = <103>; /* KEY_UP, see /usr/include/linux/input-event-codes.h */
					gpios = <&pio 0 7 1>; /* PA7 GPIO_ACTIVE_LOW */
				};

				g-keys_down {
					label = "GPIO KEY_DOWN";
					linux,code = <108>; /* KEY_DOWN, see /usr/include/linux/input-event-codes.h */
					gpios = <&pio 0 8 1>; /* PA8 GPIO_ACTIVE_LOW */
				};

				g-keys_left {
					label = "GPIO KEY_LEFT";
					linux,code = <105>; /* KEY_LEFT, see /usr/include/linux/input-event-codes.h */
					gpios = <&pio 0 9 1>; /* PA9 GPIO_ACTIVE_LOW */
				};

				g-keys_right {
					label = "GPIO KEY_RIGHT";
					linux,code = <106>; /* KEY_RIGHT, see /usr/include/linux/input-event-codes.h */
					gpios = <&pio 0 10 1>; /* PA10 GPIO_ACTIVE_LOW */
				};
				g-keys_enter {
					label = "GPIO KEY_ENTER";
					linux,code = <28>; /* KEY_ENTER, see /usr/include/linux/input-event-codes.h */
					gpios = <&pio 0 21 1>; /* PA21 GPIO_ACTIVE_LOW */
				};

можно менять linux,code и gpios
компилируем:

armbian-add-overlay gpio-keys.dts
reboot

проверяем:

cat /sys/kernel/debug/gpio
evtest

в моём случае device event number 1 (gpio-keys-user)

готово, кнопки подключённые к GPIO дублируют кнопки обычной клавиатуры.

Компилируем демон, который будет следить за нажатиями

git clone https://github.com/elopez/keybinder.git
cd keybinder
make install

проверяем:

keybinder /dev/input/event1

event1 это мой event номер один, у вас event может быть другой.
жмакаем кнопки которые подключили к GPIO
Идем /etc/ правим keybinder.conf
для примера опять моргаем светодиодами на плате

28,reboot
103,echo heartbeat | sudo tee "/sys/class/leds/orangepi:red:status/trigger"
105,echo none | sudo tee "/sys/class/leds/orangepi:red:status/trigger"
106,echo heartbeat | sudo tee "/sys/class/leds/orangepi:green:pwr/trigger"
108,echo none | sudo tee "/sys/class/leds/orangepi:green:pwr/trigger"

.....................................................................

Для автозапуска после перезагрузки
Идем /etc/ правим rc.local ……………..
до строки exit
добавляем строку

/usr/local/bin/keybinder /dev/input/event1 >/dev/null &

Device Tree Mainline Linux

1 февраля   armbian   Device Tree   GPIO   overlay

Управление 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

Аудио плеер squeezelite с дополнительными опциями.

Дополнение для Logitech Media Server (LMS) on the OrangePI PC
Собрал squeezelite с гита: squeezelite
с опциями: LINUX ALSA EVENTFD RESAMPLE FFMPEG VISEXPORT IR GPIO DSD LINKALL

поддержка ffmpeg, lirc, DSD over PCM (DoP).
встроена опция -S Absolute path to script to launch on power commands from LMS
для вкл/выкл плеера в LMS. Что-бы включать выключать усилитель мощности.
по умолчанию используется 28 нога гребёнки.
тестировал на

uname -a
Linux orangepipc 3.4.113-sun8i #10 SMP PREEMPT Thu Feb 23 19:55:00 CET 2017 armv7l GNU/Linux

Установка плеера squeezelite:

apt upgrade
apt install ffmpeg libmad0 libvorbisfile3 libfaad2  libmpg123-0 libavcodec56  libavformat56  liblircclient0 
wget http://ua3nbw.ru/files/squeezelite-armv6hf.tar.gz
tar xzvf squeezelite-armv6hf.tar.gz
mv squeezelite-armv6hf /usr/bin
mv gpiopower.sh /usr/local/bin

запуск плеера с опцией S

squeezelite-armv6hf -o hw:CARD=audiocodec,DEV=0 -S /usr/local/bin/gpiopower.sh

редактируя скрипт gpiopower.sh , можно менять GPIO_OUT.
логическая единица на этом gpio — сигнал выключения усилителя.

Дисплей HD4478 на OrangePi

HD44780 (а также совместимый с ним KS0066) — контроллер монохромных жидкокристаллических знакосинтезирующих дисплеев с параллельным 4- или 8-битным интерфейсом. Разработан фирмой Hitachi. Управляющий интерфейс и протокол являются де-факто стандартом для такого типа дисплеев.


Типовой 14-пиновый интерфейс дисплеев на HD44780:

Подача питания подсветки может различаться от модели к модели в зависимости от её типа. Обычно подсветка питается от 5 вольт, токоограничительный резистор (50-100 Ом) обычно обязателен.

Дисплей может работать в 4- или 8-битном режимах. В первом случае ножки с седьмой по десятую не используются, а данные передаются через 11-14 ножки, по четыре бита за такт (старший полубайт, затем младший полубайт).


У меня оказался дисплей LMB162ABC-1, с питанием 3.3 v, он не требует дополнительной обвязки.


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

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

подключаем дисплей и тестируем

cd /root/WiringOtherPi/examples
nano lcd.c

Меняем строку lcdHandle = lcdInit (rows, cols, 4, 11,10, 4,5,6,7,0,0,0,0) ;
на  lcdHandle = lcdInit (rows, cols, 4, 30,21, 22,23,24,25,0,0,0,0) ;


соответствие выводов подключения можно посмотреть командой gpio readall столбец: wPi

make lcd
./lcd 4 16 2
2017   armbian   GPIO   HD4478   OrangePI PC

Прошивка чипов с SPI интерфейсом при помощи OrangePi

Flashrom — консольная утилита для идентификации, чтения, записи, проверки и стирания микросхем Flash.
на Orange Pi Zero замечательно работает Программатор из Orange Pi Zero, также и у меня на raspberry.
C OrangePi Pc пока не победил.
Отметьтесь в комментариях, у кого завелся программатор на OpiPC

Установкаf flashrom :

apt-get install pciutils-dev pkg-config
git clone https://github.com/flashrom/flashrom.git
cd flashrom

make CONFIG_INTERNAL=no CONFIG_RAYER_SPI=no CONFIG_NIC3COM=no CONFIG_GFXNVIDIA=no CONFIG_SATASII=no \
CONFIG_ATAHPT=no CONFIG_DRKAISER=no CONFIG_NICREALTEK=no CONFIG_NICNATSEMI=no \
CONFIG_NICINTEL=no CONFIG_NICINTEL_SPI=no CONFIG_OGP_SPI=no CONFIG_SATAMV=no

make install

spi_mosi = port:PC00
spi_miso = port:PC01
spi_sclk = port:PC02
spi_cs0 = port:PC03

Поддерживаемые микросхемы флэш-памяти
тест замкнкть MOSI and MISO

wget https://raw.githubusercontent.com/raspberrypi/linux/rpi-3.10.y/Documentation/spi/spidev_test.c
gcc -o spidev_test spidev_test.c
./spidev_test -D /dev/spidev0.0

root@orangepipc:~/flashrom# ./spidev_test -D /dev/spidev0.0
spi mode: 0
bits per word: 8
max speed: 500000 Hz (500 KHz)

FF FF FF FF FF FF
40 00 00 00 00 95
FF FF FF FF FF FF
FF FF FF FF FF FF
FF FF FF FF FF FF
DE AD BE EF BA AD
F0 0D


Если запустить flashrom без параметров, то он попытается определить тип подключенного чипа
-V — verbose режим (вывод служебных сообщений )

flashrom -p linux_spi:dev=/dev/spidev0.0  -V

Для прошивки чипа используется команда:

sudo flashrom -w /home/firmware.bin -V -p linux_spi:dev=/dev/spidev0.0

здесь -w — команда на запись прошивки (write), после неё указывается путь до файла с прошивкой (/home/firmware.bin), -p — тип программатора.
Если в качестве программатора выступает OrangePi, то тип будет linux_spi:dev=/dev/spidev0.0,
-V — verbose режим (вывод служебных сообщений во время прошивки)

Перед записью чип желательно очистить командой

sudo flashrom -E -p linux_spi:dev=/dev/spidev0.0

Считать прошивку в файл можно командой

sudo flashrom -r /путь_до_файла/ -p linux_spi:dev=/dev/spidev0.0

Верификация

sudo flashrom -v /путь_до_файла/ -p linux_spi:dev=/dev/spidev0.0
2017   armbian   Flashrom   GPIO   OrangePI PC   SPI

Датчик давления и температуры BMP085 /BMP180 на OrangePi

Тестировал на ARMBIAN VERSION= 5.25 OrangePi PC
В файл /etc/modprobe.d/fbdev-blacklist.conf
добавить строки:


blacklist pcf8591
blacklist bmp085


Подключаем датчик:

После подключения датчика, в выводе команды dmesg | grep -i 085 должны быть строки:


[ 0.063970] plat: add bmp085 device
[ 7.980858] systemd[1]: Starting Syslog Socket.
[ 12.102085] gmac0: probed


установим i2c-tools

apt-get install i2c-tools
i2cdetect -y 0

root@orangepipc:~# i2cdetect -y 0
0 1 2 3 4 5 6 7 8 9 a  b c d e f
00:  — — — — — — — — — — — — —
10: — — — — — — — — — — — — — — — —
20: — — — — — — — — — — — — — — — —
30: — — — — — — — — — — — — — — — —
40: — — — — — — — — — — — — — — — —
50: — — — — — — — — — — — — — — — —
60: — — — — — — — — — — — — — — — —
70: — — — — — — — 77
root@orangepipc:~#


Если в выводе i2cdetect -y 0 не 77, а UU , то начинаем с начала.

Далее ставим WiringOtherPi :

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

Ну и тест датчика:

git clone https://github.com/mvadai/BMP085.git
cd BMP085
gcc -Wall -std=gnu99 MV_bmp085.c -o MV_bmp085 -l wiringPi 
./MV_bmp085

Temperature: 25.3 *C, Pressure: 100515 Pa


2017   armbian   BMP180   GPIO   OrangePI PC

Дисплейно-клавиатурный драйвер TM1638

Переписал библиотеку TM1638 library for the Raspberry Pi , ну просто заменил либу bcm2835 на  WiringOtherPi , теперь такой модуль работает на OrangePi PC.

TM1638 принимает и передает данные по собственному последовательному интерфейсу. Отличие от SPI состоит в объединении в одну линию двух линий, приема и передачи.

Сигналы интерфейса TM1638.

STB — разрешение работы микросхемы при низком уровне сигнала. После переключения в активный уровень первый принимаемый байт воспринимается как команда.
CLK — тактовый сигнал при передаче данных в микросхему. Данные фиксируются по фронту сигнала. Источником сигнала CLK служит внешнее устройство.
DIO — данные. Передача синхронизируется фронтом сигнала CLK.
ставим WiringOtherPi :

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

затем:

git clone https://github.com/ua3nbw-cf/TM1638-WiringPi.git
cd TM1638-WiringPi
gcc -Wall -std=c99 -lwiringPi clock.c tm1638.c -o clock
./clock

Модуль нормально заработал от 3.3v
подключал к контактам 33,35,37 гребёнки, питание +3,3 на 1, общий на 6 контакты.
Тестировал на таком модуле:

2017   armbian   GPIO   OrangePI PC   TM1638   WiringOP

Про GPIO на OrangePi

Не все наверное знают про  WiringOtherPi This is a GPIO access library for OrangePi форк original WiringPi for Raspberry Pi

Для проверки, как заработает на OrangePi код для Raspberry Pi использующий прерывания и библиотеку Wiring ,
скомпилируем программу для определения направления вращения вала энкодера .
Reading a Rotary Encoder from a Raspberry Pi

ставим WiringOtherPi :

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

затем:

git clone https://github.com/astine/rotaryencoder
cd rotaryencoder
nano test.c

вставляем:


#include "stdio.h"
#include "rotaryencoder.h"
int main()
{
printf("Hello!\n");
wiringPiSetup () ;
/*using pins 3/7*/
struct encoder *encoder = setupencoder(7,8);
long value;
while (1)
 {
 updateEncoders();
 long l = encoder->value;
   if(l!=value)
   {
     printf("value: %d\n", (void *)l);
     value = l;
   }
 }
return(0);
}

Save and compile it:

gcc -lwiringPi test.c rotaryencoder.c -o test

энкодер подключаем к контактам 3 и 7 гребенки, общий вывод к 6 контакту.

./test

value: 0
value: 1
value: 2
value: 3
value: 4


работает!

2017   armbian   GPIO   OrangePI PC   Wiring