Запуск и остановка скриптов с помощью кнопок. GPIO:цифровые входы.

Цифровой вход позволяет считывать 2 значения, соответствующее уровню напряжения на пине, в  OPi имеет логический уровень 3,3 В, это означает, что цифровые значения соответствуют форме: ‘0’ (LOW) — 0 В; ‘1’ (HIGH) — 3,3 В.
Внимание! Для Orange Pi никогда не должно быть подано на пин напряжение выше 3,3 В (с учетом запаса прочности, 3,6 В).

Управление скриптами с помощью кнопок

У нас есть программа/скрипт и нам нужно выполнить и потом закрыть (убить процесс), однако, у нас нет времени делать это в консоли или нет возможности подключиться к системе (нет экрана или клавиатуры).
Подключим кнопку через контакты GPIO для того, чтобы запускать программу по нажатию кнопки и закрывать по повторному нажатию.
И добавим ещё одну, которая отключит систему, когда мы ее нажмем.
Определяем два контакта GPIO, которые находятся в подходящем месте и не имеют специальных функций.
В этом примере использовались контакты GPIO24 и GPIO25 (физические контакты 35 и 37):

Запуск и остановка скриптов с помощью кнопок. GPIO:цифровые входы.

Пины Orange Pi GPIO не могут справиться с напряжением выше 3,3, поэтому подключение кнопок должно использовать питание 3.3 В.

Необходимо будет добавить резисторы при подключении кнопок, поскольку библиотека WiringPi не реализует возможность включать внутренние подтягивающие резисторы для пина.

Таким образом, соединение должно выполняться следующим образом :

Запуск и остановка скриптов с помощью кнопок. GPIO:цифровые входы.

Создадим три файла: 1 программа управления в Cи, для управления кнопками и 2 сценария BASH для запуска и остановки программы/скрипта.

Таким образом, управляющая программа будет отвечать за определение нажатий клавиш, а также вызова системных функций для запуска сценариев BASH, которые отвечают за запуск или убийство программы.

Управляющая программа:

// Библиотеки
#include <stdio.h>
#include <wiringPi.h>
 
// Define
#define P_BTN_PWR 24
#define P_BTN_RUN 25
#define WAIT_NPRES 100
#define WAIT_PRES 3000
#define MAX_CMD_LINE 128
 
int main(int argc, char* argv[])
{
   int run = 0;
   char script[MAX_CMD_LINE];
 
   if(argc == 2) // Функция вызывается с аргументом
   {
       // Настройте WiringPi и кнопки в качестве входов
       wiringPiSetup();
       pinMode(P_BTN_PWR, INPUT);
       pinMode(P_BTN_RUN, INPUT);
 
       while(1)
       {
          // Кнопка запуска/остановки определенного скрипта
          if(digitalRead(P_BTN_RUN) == LOW)
          {
              if(run == 0) // Скрипт не запущен, запустить его
              {
                  run = 1;
                  snprintf(script, MAX_CMD_LINE, "run_mysh.sh %s", argv[1]);
                  system(script);
                  delay(WAIT_PRES);
              }
              else // Скрипт работает, остановите его (закройте)
              {
                  run = 0;
                  snprintf(script, MAX_CMD_LINE, "stop_mysh.sh %s", argv[1]);
                  system(script);
                  delay(WAIT_PRES);
              }
          }
 
          // Кнопка Shutdown, запуск сценария завершения работы системы
          if(digitalRead(P_BTN_PWR) == LOW)
              system("shutdown -h now");
 
          delay(WAIT_NPRES);
       }
   }
   else // Нет или слишком много аргументов
       printf("\n\n Неправильный вызов сценария. Вы должны указать аргумент (например, myscript blink)\n\n");
 
   return 0;
}

Код сценария выполнения программы, подлежащей контролю:

#!/bin/bash
 
ARG_FILE=$1
$ARG_FILE &

Код сценария завершения выполнения программы:

#!/bin/bash
 
ARG_FILE=$1
PID=`pidof $ARG_FILE`
kill -9 $PID

Программа управления принимает в качестве аргумента адрес управляемой программы и передает сценариям BASH, чтобы они знали, где они находятся.

Следует иметь в виду, что при использовании команд необходимо, чтобы запуск программы выполнялся с правами администратора (sudo):

sudo btnmyscript /ruta/programa/a/controlar

Когда нажата кнопка, подключенная к контакту 37 (WiringPi — GPIO25), программа будет выполнена и программа будет управляться, и когда кнопка будет нажата снова, программа будет убита, а когда будет нажата кнопка, подключенная к контакту 35 (WiringPi — GPIO24), система выключится.

Инструкции по загрузке и использованию:

Вышеупомянутые файлы были скомпилированы в репозитории Github, чтобы они были легко доступны и позволяли им интегрироваться в системы удобным образом:

1 — Загрузите репозиторий, содержащий исходные файлы:

git clone https://github.com/J-Rios/btnmyscript
cd btnmyscript

2 — Скомпилировать программу:

gcc -o btnmyscript btnmyscript.c -lwiringPi

3 — Скопируйте необходимые файлы в глобальный путь /usr/bin, чтобы вызвать сценарий из любого места («Установить»):

sudo cp -a btnmyscript /usr/bin/
sudo cp -a run_mysh.sh /usr/bin/
sudo cp -a stop_mysh.sh /usr/bin/

4 — (Необязательно) Удалить каталог загруженного репозитория:

cd ..
sudo rm -rf btnmyscript

5 — Пример использования программы (в данном случае для управления программой, которая находится в каталоге, где мы находимся):

sudo btnmyscript ./programaAcontrolar &

 

Оцените статью
( Пока оценок нет )
PcMiniPro
Добавить комментарий

  1. Petya

    НЕ РАБОТАЕТ
    gcc -o btnmyscript btnmyscript.c -lwiringPi
    //usr/local/lib/libwiringPi.so: undefined reference to pthread_join'
    //usr/local/lib/libwiringPi.so: undefined reference to
    pthread_create’
    //usr/local/lib/libwiringPi.so: undefined reference to `pthread_cancel’
    collect2: error: ld returned 1 exit status

    Ответить
217 / 0,879 / 75.1mb