Как стать автором
Обновить

Комментарии 31

Есть более оптимальный вариант на Python без цикла:

import subprocess
import RPi.GPIO as GPIO
GPIO.setmode(GPIO.BCM)

# GPIO3 (pin 5)
GPIO.setup(3, GPIO.IN, pull_up_down=GPIO.PUD_UP)

GPIO.wait_for_edge(3, GPIO.FALLING)
subprocess.call(['shutdown -h now "System halted by GPIO action"'], shell=True)

GPIO.cleanup()


Замыкаются пины 5 и 6 (GPIO3 и земля).
Спасибо, попробую. Правда, как я писал, хочется использовать «последние» пины, так что попробую на 39-м и 40-м.
Вы можете попробовать взять один из «верхних» GPIO с гребёнки и землю подцепить куда-нибудь ещё. 2 порта для кнопки не нужны
А зачем выключать RPi? Ест она примерно ничего, включать всё равно кнопкой не выйдет. Я не пристаю, просто на официальном форуме часто встаёт этот вопрос и ответа не него всё ещё нет.
А почему бы не переписать на С++? На сколько я знаю, из него GPIO тоже доступен и ничего лишнего для бинарника доставлять не придётся.
Область применения raspberry (и подобных штук), не ограничивается лежанием дома и работой 24х7.
Я, например, сейчас делаю девайс, который работает от аккумулятора, и как то жаль «в холостую» расходовать аккумулятор. Проблемы с выключением у меня правда нет, так как есть дисплей с тачскрином. Проблема включения решается либо включателем на разрыв питания, хотя можно и заморочиться на кнопку )
Да, я тоже планирую сделать из «малинки» портативный фотик с инфракрасной камерой. Работать он тоже будет от пауэрбанка. Если брать на природу, то разумно было бы выключать его между снимками. Данная кнопка — как раз для этого.

А на C++, не переписал, так как совсем его не знаю. Python тоже не знаю, но начал изучать.

Кстати, подумалось, можно ли удалённо «эмулировать» нажатие кнопки (через Webiopi, например), переназначив пины?
Да для таких операций на С++ вообщем то смысла особого нет переписывать — производительность высокая не нужна, а python является лишь «клеем» для низкоуровневых операций.

А смысл какой что то «эмулировать», переназначать и пр, если то же выключение можно сделать и другими способами, без кнопки )
А как он тогда выключается, что его включить нельзя? Глянул по быстрому схему и документацию на BCM2835, но нигде не могу найти распиновку микросхемы. Заинтересовала нога D15, подписанная как «RUN». Возможно передернув там состояние, можно перезапустить схему.
если эти выводы закоротить, при запущенной системе — горячая перезагрузка (как на PC кнопка Reset)
если эти выводы закоротить, при выкл системе (командой halt) — система запуститься (как на PC кнопка Power)
http://raspberrypi.ru/blog/readblog/562.html
Если я не путаю, то на Raspberry Pi незапаянный разъём P6 это Reset. С него можно перезапустить систему.
После перехода с B на B+ словил очень неприятный баг. Если выключить малину не правильно, то ФС при старте уже не примонтируется и нужно вытаскивать флешку и делать ей fsck. Единственный совет, который удалось найти — «купите совместимую с малиной флешку», попробовал три разных, две из которых в списке совместимых значатся как рабочие — не помогло.
А можно больше деталей? У меня 3 малины «в парке», стопка разных флешек и никаких проблем.
Сейчас под рукой малины нет, но ошибка примерно следующая:
Kernel panic-not syncing:
VFS: unable to mount root fs on unknown- block(179,2)

Если делать reboot или shutdown, то всё нормально, а если halt или сброс по питанию, то почти наверняка не загрузится, а fsck найдёт ошибки в разделе. Но стоит раздел корректно размонтировать перед перезагрузкой и никаких ошибок нет. На модели «B» таких проблем не было (были другие :D), по питанию дёргалась чуть ли ни каждый день, ничего не сыпалось, всегда загружалось нормально. apt-get upgrade и rpi-update ничего нового не видят.
у меня после очередного выключения малины она больше не включилась, в качестве системы там стоял xbian, флешка была разбита на 3 раздела FAT,Btrfs — системный и swap, дак вот теперь флешку не отформатировать совершенно ни чем нельзя, точнее она форматируется но после передергивания опять в том же состоянии, файлы с виндового раздела, тоже удаляются но после размонтирования\монтирования опять все на месте. Флешка Transcend 16GB ей и месяца не было. Что с ней можно еще сделать кроме, как выкинуть, подскажите.
Купил новую флеху с неизвестным названием на 8GB c ней система не стартует вообще, у меня подозрение уже: может малина сдохла? Ее можно как нибудь проверить без флешки на работоспособность?
Спасибо, попробовал подключиться, молчание, постоянно горит индикатор RX на USB TTL адаптере, хоть с карточкой хоть без.
Такое может быть?
Возможно, uboot не пишет в консоль. Можно посмотреть доку и настроить его так, чтобы он это делал elinux.org/RPi_U-Boot
Погодите, чтобы малина начала что-то писать в консоль — ей надо хотя бы ядро загрузить с флешки? А если флешка «умерла» — то и код, пишущий что-то в консоль недоступен.
Или я не прав?
За циклы сканирования для ожидания нажатия надо расстреливать.
Для обработки внешних событий микроконтроллера существуют прерывания, т.ч. и от внешних сигналов.
Если вы так любите питон смотри сюда raspberrywebserver.com/gpio/using-interrupt-driven-gpio.html
Насколько вижу по исходникам, эти «прерывания» эмулируются запуском отдельного потока, который делает практически тоже самое, что и код в первом комментарии. Так что наоборот, будет больший оверхед.
поэтому лучше всего написать маленький модуль ядра который просто зареквестит нужный gpio, повешает на него обработчик прерывания, а в обработчике вызовет функцию ctrl_alt_del() (да, в ядре есть такая функция, посылает SIGINT иниту)
Тут человек python только осваивает, а вы предлагаете модуль ядра писать ))
Хотя дело не в этом, бывает что такие одноразовые костыли в итоге использовать удобней.

Приведу пример из того что делаю сейчас:
Для девайса сделал контроллер тачскрина на МК, который тупо по UART шлет координаты. На заморочки с USB-HID в плане софта и железа ушло бы много времени.
Далее скрипт на raspberry принимает эти цифры, вычисляет нужную точку (с МК идут сырые данные) и через xdotool делает клик. Тут можно было написать простенький модуль ядра, но дошло что по UART нужно передавать не только это.
Да и зачем такие сложности в устройстве, которое существует в единственном экземпляре и только для себя ))
Ну например для понднятия скилов :)

А почему xdotool кстати? Есть же python-uinput. Получите самый настоящий инпут девайс, неотличимый от настоящего. А так да, писать tty discipline driver — это ещё то развлечение… И всё равно без юзерспейса не обойтись.
Мне кажется, есть смысл делать выключение на долгое нажатие. Во избежание случайных срабатываний.
Пока фальстартов небыло, но кнопкой я пользуюсь всего несколько дней. До этого долго просто замыкал проводки. На самом деле есть несколько чисто механических решений. Например, утопленная кнопка или откидывающаяся защитная крыжечка на кнопке. Я такой прикрыл на аппе для квадрокоптера кнопку отключения моторов

Если механическое, то слайдер будет надёжнее утопленной кнопки. Правда, за корпус придётся придерживать при выключении. А дребезг контактов как-то обрабатывается или он тут не нужен?
А Raspberry Pi не поддерживает ACPI?

Вообще я ожидал прочитать статью про прерывания, управление режимами работы процессора, ACPI, модули ядра…

В любом случае с этим надо разбираться, чтобы научить его включаться по кнопочке.

Нет, на АРМах нету ACPI. Точнее нету одного определенного стандарта. Каждый производитель лепит свой ROM-код для таких функций как уход в спящий режим, запуск и остановка дополнительных ядер и т.д. На некоторых платах питание вообще выключается прямой просьбой к PMIC выключить напряжение. Эдакое харакири.

Было бы круто, если бы поддерживался EFI, но такого нет, к сожалению.
А можно поподробнее про «можно установить в одно из двух состояний: «выход» (он же OUT или логическая 1) или «вход» (IN или логический 0)»?
Так вроде же всё там написано. О чём конкретнее хотите знать подробнее?
Не понимаю, как я пропустил тогда, но лучше поздно, чем никогда. Режим работы порта (IN или OUT) не имеет никакого отношения к выдаваемому портом в режиме OUT значению (0 или 1).
Зарегистрируйтесь на Хабре, чтобы оставить комментарий

Публикации

Истории