Показать сообщение отдельно
Старый 28.01.2017, 17:50   #120
laba
Местный
 
Аватар для laba
 
Регистрация: 06.03.2009
Адрес: Питер
Сообщений: 3,693
Сказал(а) 'не согласен(а)'!: 10
Сказали 'не согласен'! 0 раз(а) в 0 сообщениях
Сказал(а) спасибо: 6,942
Поблагодарили 4,844 раз(а) в 1,822 сообщениях
Все 'Спасибо' этого пользователя. :
0 за это сообщение
0 Всего
Репутация: репутация неоспорима (5127)
По умолчанию

Ещё один способ прикручивания кнопок управления к RasPi, без использования Pyton-а. Инфу брал отсюда.
Подключаем кнопки, с подтяжкой к +3,3V, по схеме, которую выкладывал Андрей в самом начале темы.
Лучше использовать последние пины, начиная с 29 выхода, т.к. выходы с 1 по 28 могут быть использованы для подключения различной периферии к RasPi. Я использовал 35,36,37,38 пины и резисторы ставил на 10 кОм.



Создадим папку, где будет лежать наш скрипт, в принципе этого можно и не делать, а хранить скрипт в папке пользователя.

Код:
sudo mkdir -p /script/gpio
Меняем права доступа к папке и всему её содержимому:
Код:
sudo chmod -R 0777 /script
Переходим в эту папку:

Код:
cd /script/gpio
И создаём в ней файл скрипта, под названием "buttons.sh":

Цитата:
sudo nano buttons.sh
В открывшемся блокноте вводим следующий код:

Скрытый текст
Код:
#! /bin/bash

# 1) Говорим ядру, что мы хотим использовать пины 36,35,38,37(GPIO16, GPIO19, GPIO20, GPIO26)
echo "16" > /sys/class/gpio/export
echo "19" > /sys/class/gpio/export
echo "20" > /sys/class/gpio/export
echo "26" > /sys/class/gpio/export

# 2) Указываем, что они будут работать, как входы
echo "in" > /sys/class/gpio/gpio16/direction
echo "in" > /sys/class/gpio/gpio19/direction
echo "in" > /sys/class/gpio/gpio20/direction
echo "in" > /sys/class/gpio/gpio26/direction

# Далее идёт логика:
while ( true )
do
# 3) Если контакт №36(GPIO16) получает логическое значение 0
# (а он его получит, когда нажмётся кнопка и цепь замкнётся на GND)
    if [ $(</sys/class/gpio/gpio16/value) == 0 ]
    then
# тогда
#  освобождаем(unexport) порт GPIO16(порядковый номер 36)
        echo "16" > /sys/class/gpio/unexport
#  освобождаем(unexport) порт GPIO19(порядковый номер 35)
        echo "19" > /sys/class/gpio/unexport
#  освобождаем(unexport) порт GPIO20(порядковый номер 38)
        echo "20" > /sys/class/gpio/unexport
#  освобождаем(unexport) порт GPIO26(порядковый номер 37)
        echo "26" > /sys/class/gpio/unexport
#  подаём команду на выключение raspberry pi (shutdown -h now)
        shutdown -h now 
    fi
#  в противном случае приостанавливаем выполнение освобождения
# портов и выключение на 0.02 секунды
    sleep 0.02
# 4) Если контакт №38(GPIO20) получает логическое значение 0
# (а он его получит, когда нажмётся кнопка и цепь замкнётся на GND)
    if [ $(</sys/class/gpio/gpio20/value) == 0 ]
    then
# тогда
#  освобождаем(unexport) порт GPIO16(порядковый номер 36)
        echo "16" > /sys/class/gpio/unexport
#  освобождаем(unexport) порт GPIO19(порядковый номер 35)
        echo "19" > /sys/class/gpio/unexport
#  освобождаем(unexport) порт GPIO20(порядковый номер 38)
        echo "20" > /sys/class/gpio/unexport
#  освобождаем(unexport) порт GPIO26(порядковый номер 37)
        echo "26" > /sys/class/gpio/unexport
#  подаём команду на перезагрузку raspberry pi (shutdown -r now)
        shutdown -r now 
    fi
#  в противном случае приостанавливаем выполнение освобождения
# портов и выключение на 0.02 секунды
    sleep 0.02	
# 5) Если контакт №35(GPIO19) получает логическое значение 0
# (а он его получит, когда нажмётся кнопка и цепь замкнётся на GND)
    if [ $(</sys/class/gpio/gpio19/value) == 0 ]
    then
# тогда
#  занимаем(export) порт GPIO26(порядковый номер 37), если он был освобождён до этого, при нажатии кнопки
        echo "26" > /sys/class/gpio/export
		echo "in" > /sys/class/gpio/gpio26/direction
#  освобождаем(unexport) порт GPIO19(порядковый номер 35)
        echo "19" > /sys/class/gpio/unexport
#  подаём команду на остановку сервера Rocrail(sudo /etc/init.d/rocraild stop)
        sudo /etc/init.d/rocraild stop 
    fi
#  в противном случае приостанавливаем выполнение освобождения
# портов и выключение на 0.02 секунды
    sleep 0.02
# 6) Если контакт №37(GPIO26) получает логическое значение 0
# (а он его получит, когда нажмётся кнопка и цепь замкнётся на GND)
    if [ $(</sys/class/gpio/gpio26/value) == 0 ]
    then
# тогда
#  занимаем(export) порт GPIO19(порядковый номер 35), если он был освобождён до этого, при нажатии кнопки
        echo "19" > /sys/class/gpio/export
		echo "in" > /sys/class/gpio/gpio19/direction
#  освобождаем(unexport) порт GPIO26(порядковый номер 37)
        echo "26" > /sys/class/gpio/unexport
#  подаём команду на запуск сервера Rocrail(sudo /etc/init.d/rocraild start)
        sudo /etc/init.d/rocraild start 
    fi
#  в противном случае приостанавливаем выполнение освобождения
# портов и выключение на 0.02 секунды
    sleep 0.02	
done

Скрипт писал, как понял это сам, может он и не идеален.

Сохраняем изменения и закрываем файл.
Теперь сделаем файл исполняемым:
Код:
sudo chmod +x /script/gpio/buttons.sh
и запихиваем его в автозагрузку:
Код:
sudo nano /etc/rc.local
Вписываем перед «exit 0» строчку:
Код:
sudo /script/gpio/buttons.sh &
Вот скрипты, которые будут делать тоже самое, но только через запуск скрипта в консоли:
1. Выключение RasPi
Сохраняем файл скрипта в папке пользователя под именем down
Для этого вводим команду:
Код:
nano down
пишем туда следующий код
Код:
#!/bin/sh
sudo shutdown -h -P now
2. Запуск службы Rocrail
Сохраняем файл скрипта в папке пользователя под именем r
Для этого вводим команду:
Код:
nano r
пишем туда следующий код
Код:
#!/bin/sh
sudo /etc/init.d/rocraild start
3. Остановка службы Rocrail
Сохраняем файл скрипта в папке пользователя под именем s
Для этого вводим команду:
Код:
nano s
пишем туда следующий код
Код:
#!/bin/sh
sudo /etc/init.d/rocraild stop
Меняем права доступа к файлам:
Код:
chmod +rx down
chmod +rx r
chmod +rx s
Для запуска скрипта вводим ./имя скрипта.

---------- Сообщение добавлено в 17:44 ---------- Предыдущие сообщение было в 17:41 ----------

Цитата:
Сообщение от shalex Посмотреть сообщение
Круто, теперь, я так понимаю, роутер не нужен.
Вопрос, как тогда подключать ту же z21 по ethernet? Кросс-кабелем?
Не-не.... без роутера не обойтись, в случае с z21. Сейчас RasPi получает инет по проводу, а раздаёт по воздуху.

---------- Сообщение добавлено в 17:50 ---------- Предыдущие сообщение было в 17:44 ----------

Цитата:
Сообщение от shalex Посмотреть сообщение
поделитесь ссылкой, пожалуйста на приобретенную "малину"?
Брал на Али, вот у этого продавца. Приехало достаточно быстро, с учётом того, что закупался 11.11. Посылка идёт с международным треком и нормально отслеживается. В начале января на GearBest была распродажа с купонами от Казус форума, там сама плата 26 баксов стоила. Прикупил по случаю, ещё не приехала.
__________________
HO, цифра, OpenDCC, S-88N, OpenCar, BiDiB
С приветом из подземки!!!
laba вне форума  
Вверх
3 пользователя(ей) сказали cпасибо: