Показать сообщение отдельно
Старый 16.02.2014, 17:50   #4
kononvaler
Новый Пользователь
 
Регистрация: 16.02.2014
Город: Алма-ата
Регион: Казахстан
Машина: Montero Sport
Сообщений: 14
kononvaler is on a distinguished road
По умолчанию

4. Выключаем питание.
Вначале Raspberry и Tp-Link были подключены через 12->5vUSB адаптер в боковом отсека багажника рядом с гнездом прикуривателя, и, естественно, мгновенно выключались при отключении зажигания. Особые неудобства испытывал при кратковременных остановках, когда выключаешь двигатель и затем его снова надо запустить. В момент поворота ключа зажигания на "Старт" отключается питание прикуривателя, и приходится ждать когда заново запустятся оба устройства. У Pi несколько раз файловая система давала ошибки так, что приходилось вытаскивать SD карту и прогонять системный раздел утилитой fsck.
Очевидно, нужно как-то резервировать питание. Напрямую к батарее устройства подключать нельзя, хотя у Pi потребляемая мощность 3,5вт, но если его не выключать, то например несвежую 60А/ч батарею за выходные можно теоретически посадить. Если Pi выключать скриптом то вылазит другая проблема - его невозможно запустить пока не перемкнешь Reset на плате для сброса процессора или не "передернешь" питание. Так как в схеме решил использовать миниатюрные реле, то второй вариант по экономии питания явно предпочтительнее.
Идея заключалась в использовании таймеров, запускаемых по включению зажигания и удерживающих включенными WiFi на 30 секунд, а Pi на минуту после выключения зажигания. Так-же необходимо реализовать условие на случай, что-бы после выключения зажигания, когда Pi начинает выключаться, а тут вернулось питание от замка зажигания, то таймер после завершения отключения Pi должен опять запуститься.
В итоге после размышлений, перепаивания различных версий на макете и доводки получилась такая схема:
[img width=700]http://vinstel.kz/vk_pictures/timers.png[/img] (Я не виноват, что движок форума не слушает указания по ширине изображения)
При подаче напряжения от ключа зажигания на контакт Х1.1 на выходе инвертора DD1.3 установится низкий уровень, который через конденсатор С1 запустит таймер DT1, но через диод VD1 будет удерживаться времязадающий конденсатор С2 от заряда. В итоге уже запущенный таймер отработает только тогда, когда будет выключено зажигание. Через диод VD2 низкий уровень так-же будет подаваться на "слушающий"вход Raspberry Pi для получения информации о состоянии питания (т.е. низкий уровень на Х2.1 - зажигание включено). Следует заметить, что выключение и возврат зажигания до истечения отрабатывания таймера приведет к разряду конденсатора С2, т.е. к возврату таймера к началу интервала.
Аналогично построена схема для включения таймера DT2, но здесь добавлено условие - запуск произойдет только в том случае, если таймер DT2 в выключенном состоянии ("И" на элементе DD1.1) и не ранее чем через пару секунд (задержка R8C8 и инвертор DD1.2), а удержание времязадающего конденсатора С5 будет производится подачей уровня "1" с выхода Raspberry Pi на транзистор VT1, которым система будет показывать , что она запущена.
Включение реле любого из таймеров подает напряжение через контакты К1.1 и К1.2 на преобразователь 12v-> 5v , а уже через соответствующие контакты К2.1 и К2.2 5V напряжение на соответствующие устройства. Время отработки таймеров с указанными в схеме номиналами: от момента снятия зажигания DT1=30s, после снятия "1" от Pi DT2=60s.
Соединяем:
[img width=300]http://storage8.static.itmages.ru/i/13/1121/h_1385050783_3630076_afa638ec42.jpg[/img]
Если для запитывания и подключения Pi использовал разъемы от USB коннектора для подключения к материнской плате, то для питания WiFi просто отрезал кусок miniUSB кабеля и подпаял его. При этом WiFi при необходимости можно отключить и забрать например с собой в гостиницу.

Обобщаем: при включении зажигания включается таймер 1 и включает WiFi и удерживает его включенным 30 сек после выключения. Кратковременные выключения (меньше 30 сек) не влияют на работу WiFi.
Так-же включается таймер 2, подает питание и начинает отсчитывать время, запускается Pi и выставляет "1", чем сбрасывает таймер в начало отсчета и держится в этом состоянии. После выключения зажигания Pi на своем входе получает "0" и получив несколько раз подтверждение об этом состоянии в течении минуты затем снимает "1" с выхода и выполняет команду выключения. В это время таймер отсчитывает свою разрешенную минуту и выключается. Если зажигание было опять подано в то время. как Pi начала выключаться, то таймер не получит сигнала включения до тех пор, пока сам не отработает до конца и плюс задержка в пару секунд, и только после этого опять подаст питание на Pi.
Конечно, маленькую батарею в моей схеме не обязательно использовать, если рядом доступно постояннное питание от батареи автомобиля (у меня же эти устройства в боковом отсеке в багажнике и не хотелось тащить туда дополнительный провод). Тогда диод VD5 будет не нужен и вместо батареи на схеме нужно подключиться к батарее в машине. Интегральные таймеры NE555 и логические элементы на CD4001 имеют крайне низкое энергопотребление и не окажут негативного влияния на автомобильный аккумулятор.
Напаял все на монтажке, и выглядит это в сборе внутри старого корпуста от ADSL модема Dlink вот так:
[img width=500]http://vinstel.kz/vk_pictures/poweron.jpg[/img]
Если не считать батарею то затрачено на элементы схемы примерно тенге 500.
Ну осталось подружить нашу Pi с получившейся схемой. Есть два решения с одинаковым результатом, одно на C++ (громко сказано) с использованием специальной библиотеки, ну и просто скриптик на баш .
sudo nano /opt/power_onoff.sh

[hr]
#!/bin/bash
PIN_IN=2
PIN_OUT=4
PIN_TIMEOUT=6s

#export needed pins
echo "${PIN_IN}" > /sys/class/gpio/export
echo "in" > /sys/class/gpio/gpio${PIN_IN}/direction

echo "${PIN_OUT}" > /sys/class/gpio/export
echo "out" > /sys/class/gpio/gpio${PIN_OUT}/direction

#set PIN_OUT to high
echo "1" > /sys/class/gpio/gpio${PIN_OUT}/value

let cnt=10
while (( cnt != 0 ))
do
if (( $(cat /sys/class/gpio/gpio${PIN_IN}/value) == 1 ))
then
# echo "waiting ${cnt}"
sleep ${PIN_TIMEOUT}
let cnt--
else
let cnt=10
fi
done

#echo "done waiting! shut down!"

#unexport pins
echo "${PIN_IN}" > /sys/class/gpio/unexport
echo "${PIN_OUT}" > /sys/class/gpio/unexport

shutdown -h +0

exit 0
[hr]
Где:
PIN_IN=2 - вход подключенный к Х2.1 на котором следим за отключением зажигания
PIN_OUT=4 - выход, подключенный к Х2.2 на который подаем "1" пока система запущена
PIN_TIMEOUT=6s - время между проверками наличия зажигания

Добавляем скрипт в автозагрузку:
sudo nano /etc/rc.local
дописываем перед exit:
/opt/power_onoff.sh &
exit 0

Собственно и все. Как писали в старых добрых радиолюбительских журналах "правильно собранная схема в настройке не нуждается". ^_^
Надеюсь идеи на этом не закончатся и будет чем еще поделиться.

Последний раз редактировалось kononvaler; 16.02.2014 в 18:08. Причина: не сохраняет заданную ширину изображения
kononvaler вне форума   Ответить с цитированием