Применение Raspberry Pi в быту и нестандартные применения

Сегодня четвертый урок, на котором мы поработаем с портами GPIO, в частности помигаем светодиодом в разных режимах.

Урок ориентирован на начинающих пользователей и представлен в текстовом и видео-форматах.

Видео четвертого урока:

Для урока нам понадобится:

  • плата Raspberry Pi;
  • кабель питания;
  • USB-клавиатура;
  • USB-мышь;
  • монитор или телевизор с HDMI/RCA/DVI интерфейсом;
  • кабель, один конец которого RCA или HDMI, а другой соответствует вашему монитору;
  • SD-карта с уже установленной ОС Raspbian ();
  • светодиод;
  • кнопка;
  • резистор на 220 Ом
  • 3 провода «мама-папа»
  • 2 провода «папа-папа».

Программирование Raspberry Pi GPIO на языке Python

Для сегодняшнего урока мы выбрали язык программирования Python.

Python — современный объектно-ориентированный язык. Он наиболее часто используется для программирования GPIO на Raspberry Pi. Python входит в состав операционной системы Raspbian.

Сборка модели

Для работы нам потребуется собрать следующую схему:

Схема подключения светодиода и кнопки к Raspberry Pi

Обратите внимание, что порты GPIO на Raspberry Pi не подписаны, полезно иметь распечатанную распиновку.

Распиновка Raspberry Pi. Схема с ledgerlabs.us

Собранная модель со светодиодом и кнопкой

Управление светодиодом на Raspberry Pi из консоли

Заходим в LXTerminal и набираем:

После этого вместо имени пользователя в начале строки должно отобразиться >>> .

Вводим следующие строки:

Import RPi.GPIO as GPIO #импорт библиотеки
GPIO.setmode(GPIO.BOARD) #"включение" GPIO
GPIO.setup(7, GPIO.OUT) #объявление 7-го пина как выход

Затем для включения светодиода можно использовать команду
GPIO.output(7, 1)

А для выключения
GPIO(output(7, 0)

После работы с GPIO желательно выполнить команду
GPIO.cleanup()

Программа для мигания светодиодом на Raspberry Pi

Для автономной работы светодиода нам потребуется написать и запустить программу. Для этого откроем предустановленную программу IDLE 3 и в меню File нажмем New. В открывшемся окне мы можем писать программу.

Напишем:
import RPi.GPIO as GPIO #импорт библиотеки для работы с GPIO
import time #импорт библиотеки для ожидания
GPIO.setmode(GPIO.BOARD) #"запуск" GPIO


____GPIO.output(7, 1) #включение светодиода

____GPIO.output(7, 0) #выключение светодиода
____time.sleep(1) #ожидание 1 секунды

Сохраним программу в папке /home/pi.

Теперь мы можем запустить программу из LXTerminal с помощью команды
sudo python programname.py

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

Поуправляем светодиодом с помощью внешней кнопки: когда кнопка зажата — светодиод горит, когда отжата — не горит.

Для этого подключим кнопку к порту 5.

Для управления нам потребуется следующая программа:

Import RPi.GPIO as GPIO #импорт библиотеки GPIO
GPIO.setmode(GPIO.BOARD) #"включение GPIO"
GPIO.setup(7, GPIO.OUT) #объявление порта 7 как выход
GPIO.setup(3, GPIO.IN) #объявление порта 3 как вход
while True: #бесконечный цикл
____if GPIO.input(3) == False: #если кнопка зажата
________GPIO.output(7, 1) #включаем светодиод
____else: #иначе
________GPIO.output(7, 0) #выключаем

Управление светодиодом с клавиатуры

Сделаем еще одну программу. Она будет менять состояние светодиода при получении пустой строки и заканчиваться при получении другой строки.

Import RPi.GPIO as GPIO
GPIO.setmode(GPIO.BOARD)
GPIO.setup(7, GPIO.OUT)
while True:
____str = input("Enter - включение, другое - выход ");
____if str != "":
________break
____else:
________GPIO.output(7, 1)
____str = input("Enter - выключение, другое - выход ");
____if str != "":
________break
____else:
________GPIO.output(7, 0)
GPIO.cleanup()

На этом четвертый урок по Raspberry Pi для начинающих закончен, продолжение следует!

Всем привет! Сегодня я расскажу как мне удалось сэкономить порты своей Raspberry Pi. Давно хотел подключить строчный дисплей к этому одноплатному компьютеру, и даже попробовал это сделать используя библиотеку wiringpi, но уж очень много выводов занимает такое подключение. Первое, что пришло в голову, было использование сдвиговых регистров, но все же я решил посмотреть в сторону шины I2C или SPI. Почитав топики в интернете нашел классное решение - RGB LCD SHIELD KIT W/ 16X2 CHARACTER DISPLAY - ONLY 2 PINS USED! . На плате используется всего два пина для управления SDL и SCK по шине I2C, плюс еще места хватило для пяти тактовых кнопок. В данном устройстве скорость не так сильно важна, поэтому шина I2C мне вполне подошла. «Сердцем» платы является микросхема компании Microchip, расширитель портов MCP23017 .

Всем привет!

Время от времени в практике возникали ситуации, когда я мечтательно задумывался о том, что неплохо было бы запилить веб-сервер в качестве бэкенда для каких-то своих несложных проектов. Ну, чтобы был hostname, как положено, и чтобы снаружи можно было отдать ему какие-то данные и получить какие-то данные, может быть прикрутить API-шечку, а может и вообще - хостить там свой уютный бложик.

В воображении сразу вырисовывались какие-то стойки с blade-ами, аренда виртуалки на Digital Ocean, или, на худой конец, круглосуточно гудящий компьютер под столом.

А ведь хочется чего-то тихого, изящного, бесшумного, и желательно бесплатного…

Стоп! Но ведь все уже изобретено до нас!

Сегодня я хочу рассказать про то, как можно за копейки, обладая минимальным количеством знаний, запилить машину, которая обеспечит 90% ваших (ну, моих - точно) потребностей в бэкенде.
Рассказ будет нести характер записей для самого себя - чтобы не забыть что делать, повторяя это в следующий раз, например)

Кому интересно - го под кат (кстати, обратите внимание, как бутербродом напаяны чипы на плате).

С точки зрения внешних интерфейсов Raspberry Pi, как и другие небольшие одноплатные компьютеры, не сильно отличается от обычного настольного ПК. На плате RPi предусмотрены USB порты для подключения клавиатуры и мыши, порт HDMI для подключения дисплея. Однако, благодаря тому, что RPi значительно компактнее и дешевле, чем ПК, становится возможным использовать их в различных системах и приложениях, где ПК или ноутбуки неуместны.

Нередко возникает желание подключить к ПК какие-либо нестандартные «вещи». Возможно, например, что вам захочется использовать компьютер для измерения уровня яркости и автоматического управления освещением, или для подачи звукового сигнала при обнаружении нарушителя.

В более широком плане, речь идет о желании использовать компьютер для управления электронными схемами (выходы) и для получения информации от схем или устройств (входы).

Именно здесь проявляется очевидное преимущество RPi и других SBC, обусловленное ключевым различием между одноплатными компьютерами и ПК: одноплатные компьютеры имеют порты ввода/вывода общего назначения, - то, чего нет у больших ПК (Рисунок 1).

Через эти выводы (штыревые разъемы) RPi может взаимодействовать с электронным миром, состоящим (помимо прочего) из датчиков, индикаторов и исполнительных механизмов.

В статье мы рассмотрим примеры схем, которые можно использовать «как есть» (или изменить и расширить), вместе с примерами кода на нескольких языках программирования.

Разъем расширения Raspberry Pi

На Рисунке 2 показано расположение и назначение выводов разъема расширения Raspberry Pi. Первые выводы подобных разъемов на печатных платах, как правило, могут быть идентифицированы по квадратной контактной площадке на нижнем слое платы. На 40-контактный разъем расширения RPi выведены цифровые входы и выходы, совместимые с логическими уровнями 3.3 В.

Совместимость с логическими уровнями 3.3 В означает, что RPi будет интерпретировать входной уровень близкий к 0 В как логический «0», а уровень выше 2 В как логическую «1». Подача на вход напряжения выше 3.3 может вывести RPi из строя. Соответственно, когда GPIO порт сконфигурирован как выход, RPi будет устанавливать на нем напряжение близкое к 0, либо к 3.3 В.

В статье мы будем говорить о выводах, отмеченных на Рисунке 2 розовым, белым, красным и оранжевым цветом. Остальные порты используются последовательными интерфейсами передачи данных.

Цифровые выходы RPi

Первые шаги: управление светодиодом

Простейший пример использования выходов - управление светодиодом или лампочкой, или каким-нибудь приводом или мотором. Для преобразования выходного сигнала RPi во что-то, что будет управлять нужным устройством, обычно требуется электронная схема. Все, что необходимо для небольшого светодиода - последовательный токоограничительный резистор, защищающий светодиод и выход RPi. Сопротивление резистора выбирается из диапазона 100 Ом … 1 кОм, в зависимости от используемого светодиода и необходимой яркости при установке на выходе логической «1».

Подключение светодиода к контактам разъема GPIO с помощью беспаечной макетной платы показано на Рисунке 3, а сама схема - на Рисунке 4. Соединение GND (0 В) было взято с вывода 6 разъема GPIO, для управления светодиодом используется порт GPIO22 (вывод 15). Можно использовать любой порт GPIO, отмеченный розовым цветом на Рисунке 2.

После того, как выполнены и проверены все соединения, можно приступать к написанию кода или сценария управления светодиодом. Выбор языка зависит от вас. Один из примеров на популярном языке Python содержится в (Листинге 1).

Листинг 1. Пример программы на Python для простого мигания светодиодом.


import time
import RPi.GPIO as GPIO
GPIO.setmode(GPIO.BCM)
GPIO.setup(22, GPIO.OUT)
GPIO.output(22, True)
time.sleep(3)
GPIO.cleanup()

Сохраните код в файл с именем led-test.py , а затем запустите его, выполнив команду:

sudo python led-test.py

Другая программа (Листинг 2) демонстрирует пример управления светодиодом. Светодиод мигает 10 раз. (Примечание: в Python, в отличие от других языков программирования, важно использование отступов в коде).

Листинг 2. Исходный код программы на Python (светодиод мигает 10 раз).

# Светодиод подключен к GPIO22 (контакт 15)
import time
import RPi.GPIO as GPIO
GPIO.setmode(GPIO.BCM)
for x in range(0,10):
GPIO.setup(22, GPIO.OUT)
GPIO.output(22, True)
time.sleep(0.05)
GPIO.output(22, False)
time.sleep(0.45)

GPIO.cleanup()

Другой способ управления портами GPIO основан на использовании Shell-скрипта (сценария оболочки). Этот метод кажется немного более сложным (если вы не любите писать скрипты), но он хорош просто для расширения кругозора, поскольку многие языки программирования часто позволяют запускать командные скрипты, и в случае необходимости это может быть одним из быстрых способов управления портами GPIO из других языков. Кроме того, описанный в Листинге 3 способ является стандартным для различных платформ, поэтому ваш код может быть перенесен на другие платы.

Листинг 3. Командный скрипт (Shell-скрипт) для управления светодиодом, подключенным к GPIO22 Raspberry Pi.

#!/bin/sh
GPIO_PATH=/sys/class/gpio
LED_PIN=22 #GPIO 22 is pin 15
echo "$LED_PIN" > $GPIO_PATH/export
echo "out" > $GPIO_PATH/gpio$LED_PIN/direction
echo "1" > $GPIO_PATH/gpio$LED_PIN/value
sleep 1
echo "$LED_PIN" > $GPIO_PATH/unexport

Первая строка скрипта выглядит как комментарий, но она указывает оболочке Linux, что делать со скриптом при выполнении, поэтому изменять ее нельзя. Остальные строки скрипта используются для контроля соответствующего GPIO порта, конфигурирования его как выхода, установки на нем высокого уровня и выполнения задержки на 1 с. В конце порт освобождается, чтобы дать возможность использовать его в других программах.

Другим распространенным языком программирования, с которым вы можете встретиться, является Си, или его старший брат Си++. Примеры исходного кода на Си или Си++ будут приведены далее, когда мы приступим к работе с цифровыми входами.

Генератор тональных сигналов

Более интересным примером может служить использование нескольких портов GPIO для управления тональным генератором. У RPi есть разъем для подключения наушников, но часто для оповещения о событиях (например, для будильника) достаточно простого сигнала или серии сигналов разной тональности.

Принципиальная схема простого генератора звуковых сигналов, выполненного на микросхеме интегрального таймера ICM7555, изображена на Рисунке 5. Вид конструкции, собранной на макетной плате, показан на Рисунке 6. Меняя номиналы резистора и конденсатора, можно создавать разные тональные сигналы и звуки.

Управление генератором осуществляется посредством двух портов GPIO RPi. Один выход (GPIO22) используется для включения или выключения звука, а второй (GPIO27) - для переключения между двумя альтернативными частотами сигнала. При желании можно выбрать другие тона, изменив номиналы компонентов C1, R1 и R2.

Исходный код программы на языке Python, генерирующей несколько звуковых эффектов, приведен в Листинге 4. Сохраните код в файле с именем tone-test.py и затем запустите на выполнение командой

sudo python tone-test.py.

Листинг 4. Программа управления генератором звуковых сигналов.

import time
import RPi.GPIO as GPIO
GPIO.setmode(GPIO.BCM)
GPIO.setup(22, GPIO.OUT) # Вкл/Выкл генератора
GPIO.setup(27, GPIO.OUT) # Изменение тональности

GPIO.output(22, True)
for x in range(0,5):
GPIO.output(27, True)
time.sleep(0.1)
GPIO.output(27, False)
time.sleep(0.2)
GPIO.output(22, False)
time.sleep(0.5)

For x in range(0,5):
GPIO.output(22, True)
time.sleep(0.1)
GPIO.output(22, False)
time.sleep(0.2)
GPIO.output(27, True)
time.sleep(0.2)

For x in range(0,5):
GPIO.output(22, True)
time.sleep(0.05)
GPIO.output(22, False)
time.sleep(0.05)

For x in range(0,10):
GPIO.output(22, True)
time.sleep(0.1)
GPIO.output(22, False)
time.sleep(0.1)
time.sleep(1)

GPIO.cleanup()

Обратите внимание, что схема питается напряжением 3.3 В (вывод 1 разъема GPIO). Используйте этот источник только в том случае, если уверены, что ваша схема не потребляет значительный ток. Шину питания 3.3 В можно нагружать током до 50 мА. При необходимости можно воспользоваться отдельным регулятором напряжения 5 В - 3.3. В и подключить его к источнику питания 5 В, доступному на выводе 2 разъема GPIO.

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

Подключение к 5-вольтовым логическим устройствам

Использование RPi для управления 5-вольтовыми устройствами не потребует каких-либо дополнительных схем. Логические входы устройства с напряжением питания 5 В будут нормально функционировать с выходными сигналами 3.3 В портов RPi.

Маломощные светодиоды

Для маломощных синих и белых светодиодов может потребоваться напряжение выше 3.3 В. Проще всего управлять единичным светодиодом с помощью транзисторного ключа, коммутирующего ток шины 5 В (Рисунок 7). Сопротивление резистора R1 рассчитывается исходя из технических характеристик конкретного светодиода, транзистор - любой n-p-n типа.

Мощные устройства

Самым простым и распространенным способом управления мощными устройствами, питающимися от источника переменного или постоянного тока (но не от сети), является использование реле с транзисторным ключом (Рисунок 8). Подойдут практически любые n-p-n транзисторы, в частности, популярные BC547B, 2N3904 и BC549. При этом, если внешнее устройство может работать от 5 В, подать питание на реле можно с вывода 2 разъема GPIO. Но и в этом случае не следует забывать о токе потребления. В противном случае реле может быть подключено к внешнему источнику питания с соблюдением мер предосторожности, исключающих попадание внешнего напряжения на RPi.

Устройства c питанием от электросети

Обращение с любыми схемами или устройствами, непосредственно управляющими приборами, подключенными к сети переменного тока, требует особой осторожности. Большинство из них просто не отвечает стандартам безопасности, несмотря на то, что некоторые изготовители утверждают обратное. Достаточно безопасный подход заключается в том, чтобы найти готовое решение дистанционного управления авторитетного производителя, предлагаемое авторитетным поставщиком, в котором для управления устройствами, питающимися от сети, используются инфракрасные или беспроводные технологии. Например, компания Energenie предлагает сетевые розетки с управлением по радиоканалу в комплекте с небольшим модулем радиопередатчика (Рисунок 9), подключаемым непосредственно в разъем GPIO платы RPi, а также примеры программ на Python.

Группа реле, светодиодов или иных устройств

Для управления несколькими светодиодами, реле или другими устройствами, которые питаются от 12 В и потребляют менее 200 мА, можно использовать древнюю (выпускаемую более 25 лет) микросхему ULN2803. Микросхема представляет собой набор из восьми ключей на основе транзистора Дарлингтона. Один из вариантов подключения микросхемы ULN2803 к RPi показан на Рисунке 10.

Маломощные двигатели постоянного тока

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

5

Hi-Fi аудиоплеер на базе миникомпьютера «Raspberry Pi». Часть 1. Блок питания для Raspberry Pi (5V, 2A)

Цепочка C31, R15 обеспечивает нулевое состояние триггера при включении блока питания в сеть 220 V.

Задержка выключения нужна потому что после программного выключения, после того как все GPIO погашены, ещё 2-3 секунды идёт обращение к флеш-памяти миникомпьютера (там установлена операционная система). Это ещё одна небольшая проблема, которую необходимо предусмотреть в данном блоке питания.

Программное обеспечение

Код программы, выдающей сигнал «RPi_OFF»
#include "stdlib.h" #include "bcm2835.h" #define PIN_12 RPI_V2_GPIO_P1_12 #define PIN_07 RPI_V2_GPIO_P1_07 int init_system (void) { if (!bcm2835_init()) return 0; bcm2835_gpio_fsel(PIN_12, BCM2835_GPIO_FSEL_OUTP); //пин на выход bcm2835_gpio_fsel(PIN_07, BCM2835_GPIO_FSEL_INPT); //как вход } int main (int argc, char *argv, char *enpv) { if (!init_system()) return 1; bcm2835_gpio_write(PIN_12, HIGH); // (Машина загружена) //ожидания низкого уровня (кнопки выключения) while(bcm2835_gpio_lev(PIN_07)) delay(50); system("poweroff"); return 0; }
Этот код у меня включен в основном программном обеспечении, здесь он просто как рабочий пример для ознакомления или повторения. Далее надо добавить эту программу в автозагрузку. Для этого в файл /etc/rc.local в конце перед EXIT 0 добавим:
#! /bin/sh …… /programs/autorun.sh & EXIT 0

Папку проекта «programs.zip» можно скачать в секции «Файлы» внизу статьи. autorun.sh - это наш исполняемый скрипт, который запустит программу. В нем:
#! /bin/sh ./programs/project_pin_on/bin/pin12on exit 0

ШИМ-контроллер DP408P (1M0880) в импульсном БП

Здесь стоит уделить внимание замечательной микросхеме ШИМ-контроллеру DP408P (аналог 1M0880). DP408P работает на частоте 25 КГц, 1M0880 – 64 КГц. За время моих испытаний, попыток изготовить идеальных трансформаторов и т.п., сложилось впечатление, что убить чип невозможно. Без снабберных цепей я её включал, перегружал, все ей нипочём. Рекомендую чип для тех, кто впервые решил построить обратноходовой преобразователь. Я так ни одной микросхемы и не сжег. DP408P можно наковырять в старых СRT мониторах от SAMSUNG. Даташит, к сожалению, на нее не найти, но у меня в наличии так же имелась и 1M0880 и, в результате сравнения, выяснилось, что они практически одинаковые.

Микросхема включается, как только напряжение её питания превысит 15 V. Микросхема выключается, когда напряжение питания упадет до 8,5-9 V. То есть, после того, как микросхема включилась, напряжение не обязательно должно быть 15 V и выше, но желательно.

Если напряжение питания превысит 27 V (25V для 1М0880), срабатывает защита и микросхема выключается. Следующая попытка включения пройдёт только после снятия питания, если напряжение питания упадет ниже 8,5-9 V и опять превысит 15 V.

В процессе испытаний, например, свеженамотанного трансформатора, удобно сначала запитать ШИМ от отдельного лабораторного блока питания. Надо помнить про очередность подачи напряжений: сначала высокое 308 V, затем 15 V.

Для первичного запуска используется отдельный выпрямитель D5. За счёт R6 и С18 напряжение питания достигает уровня 15 V немного позже появления 308 V. ШИМ запускается, потребляя около 20 мА. И если не подключить обмотку самопитания, С18 разряжается и микросхема выключается. Затем опять зарядится конденсатор, и процесс запуска повторится снова.

В конце подключаем обмотку самопитания. Намотать обмотку надо так, чтобы напряжение 15-17 V было на минимальной нагрузке - нагрузке холостого хода (в моем случае ок. 0,25 Вт).

В данном блоке питания я не стал применять самодельные трансформаторы, Был применен трансформатор от убитого молнией AC/DC вот такого адаптера:


Рис 4. Доноры импульсных трансформаторов


Питал этот адаптер какой-то роутер или свитч, не помню уже, с заявленными параметрами 5V 2A MAX.

Дело в том, что я не смог намотать трансформатор лучше, чем этот. Как я не изгалялся - выбросы при закрывании силового транзистора микросхемы были больше чем с данным китайским трансформатором. Ну и ладно!

Вооруженным глазом

Посмотрим, что же получилось:


Рис 5 . Осциллограмма (pin-1 IC1), нагрузка 2.1А (Сток силового транзистора).



Рис 6 . Осциллограмма (pin-1 IC1), нагрузка 2,1 А. (Выброс срезанный снаббером)



Рис 7. Осциллограмма (pin-1 IC1), нагрузка 50 mА. (Сток силового транзистора).



Рис 8. Осциллограмма (pin-1 IC1), нагрузка 2,1 А. (38 nS на 300 V).

По температуре: снабберный резистор при нагрузке 2,1 А = 50°С, DP408 = 37°С, трансформатор = 40°С. Температуру измерял бесконтактным термометром для младенцев.

И ещё фото конструкции


Рис 9. Блок питания – вид слева.


Рис 10. Блок питания – вид снизу.


Рис 11. Плата A2.

На рисунке 11 плата A2. Три светодиода разного цвета и под ними кнопка. В корпусе кнопка имеет стеклышко (см. видео) поэтому крайние светодиоды загнул, чтобы светили к центру. Плата выполнена по аналогии родной платы видеомагнитофона (корпус применил от видеомагнитофона).

Видео

Система не оптимизирована поэтому «Малина» загружается долго, да и флешка с операционной системой медленная. Потом вставлю настоящую,

Многие наверняка знают, что подать питание на Arduino от Raspberry Pi не трудно, для этого просто нужен USB шнур. Обратная задача выглядит сложнее, так как у большинства контроллеров Arduino нет USB выхода (Due - исключение). Тем не менее, это возможно сделать с помощью пинов GPIO, и я хочу рассказать о конкретном примере для Arduino Nano V3.0 и Raspberry Pi B rev.2. Помимо самой подачи питания, также расскажу как можно контроллировать это питание используя кнопку и MOSFET транзистор.

Теоретическая возможность
Большинство Arduino-совместимых контроллеров изпользуют 5V пины. Исключение составляет разве что Arduino Due и 3.3V выход из Arduino, но сейчас не об этом. Также известно, что один из способов подать питание на Raspberry Pi - это использование 5V и GND пинов на 26-ти контактном разъеме P1:

Казалось бы, что решение очевидно - надо подсоединить Raspberry Pi к любому из пинов Arduino, и все заработает. Моя попытка сделать это привела к тому, что Raspberry Pi засветил светодиодом PWR, но светодиод ACT так и не зажегся. Причина - очень маленькая сила тока от пинов Arduino (порядка 40-50 мА). Но у Arduino есть отдельный пин 5V, который (согласно ссылке) может выдавать около 400-500 мА. Теперь необходимо проверить, хватит ли такого тока для питания Raspberry.

Для нормального питания Raspberry Pi с двумя подключенными USB устройствами необходимо порядка 700 мА. Каждое USB устройство может потреблять до 140 мА (). Малина может потреблять еще больше тока, если она разогнана (моя - нет). Таким образом, если использовать неразогнанную RPi без USB устройств, то силы тока от Arduino 5V пина должно вполне хватить.

Для того чтобы контроллировать подачу питания, необходимо еще несколько ингредиентов: кнопка питания и что-то, способное управлять большими токами. Я для этих целей использовал MOSFET транзистор. Перейдем непосредственно к использованным частям.

Необходимое аппаратное и программное обеспечение
Я использовал следующие «железные» части:
  • Raspberry Pi B rev. 2;
  • Arduino Nano V3.0;
  • кнопка для контроля питания (я использовал кнопку с фиксацией и сигнальным проводом);
  • MOSFET транзистор (у меня оказался IRF530N);
  • Breadboard и несколько проводов.
Для прошивки Arduino понадобится IDE, я использовал версию 1.5.8 BETA, но стабильная 1.0.6 тоже подойдет. Также понадобится моя маленькая библиотека для PowerButton (ссылка в конце статьи в разделе про утилиты).
Схемы
Схема подключения выглядит так:

Принципиальная схема так:

Пояснения к схемам:

  1. D2 подсоединен к пину SIG у кнопки.
  2. D4 подсоединен к пину VCC у кнопки.
  3. D5 подсоединен к затвору MOSFET.

Cоединение c D2 пином не случайно: библиотека для кнопки использует прерывания, а у Arduino Nano только пины D2/D3 предназначены для этих целей (проверить какие пины на вашей Arduino поддерживают прерывания можно ).

Исходный код программы для Arduino
#include

#define POWER_PIN_SIG 2
#define POWER_PIN_VCC 4
#define POWER_FET_GATE 5
#define POWER_PIN_INT 0

PowerButtonSwitch pbs;

void onPowerOn() {
Serial.println ("Power On" ) ;
digitalWrite(POWER_FET_GATE, 1 ) ; // Открываем затвор (gate)
}

void onPowerOff() {
Serial.println ("Power Off" ) ;
// Закрываем затвор (gate)
}

void setup() {
Serial.begin (9600 ) ;

// Вывод сигнала от Arduino к затвору MOSFET (gate)
pinMode(POWER_FET_GATE, OUTPUT) ;
digitalWrite(POWER_FET_GATE, 0 ) ;

// Начальная настройка кнопки питания
pbs.setupPowerButton (POWER_PIN_SIG, POWER_PIN_VCC, POWER_PIN_INT) ;

// Считываем текущее значение
// Если есть сигнал от кнопки,
// включаем Raspberry Pi
int st = pbs.getSwitchStatus () ;
if (st == POWER_ON) {
onPowerOn() ;
}

// Добавляем обработчики событий
pbs.onPowerOn (onPowerOn) ;
pbs.onPowerOff (onPowerOff) ;
}

void loop() {
// Пустой цикл
delay(1000 ) ;
Serial.println ("No actions" ) ;
}

Большинство действий на себя берет библиотека, так что код очень прост.

Тестирование решения
Короткое видео с тестированием:

Как видно, визуально все работает. Но все-таки надо проверить напряжение между пинами TP1/TP2 (методика ). У меня получилось значение ~4.6V, рекомендуемое значение больше 4.75V.
Заключение
Несмотря на то, что все работает, все-таки есть подозрение что при подключении периферии тока от 5V пина Arduino будет недостаточно. MOSFET и кнопка работают отлично в паре, такая связка может пригодится для дальнейших проектов.

Утилиты и библиотеки, использованные для написания:

  • Fritzing : использовалась для рисования схем, доступна .
  • собственно библиотека для PowerButton : можно взять с GitHub .

Так как это мой первый пост, отзывы и комментарии будут очень полезны.