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


Многие наверняка знают, что подать питание на 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 .

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

Здравствуйте друзья

После того, как я испытал возможности системы управления умным домом Domoticz на своем настольном компьютере и убедился в том, что она отлично дополняет, а где и заменяет Mi Home - штатную систему Xiaomi - я решил приобрести для нее отдельный одноплатный компьютер - Raspberry Pi. И в этом обзоре я расскажу про свой опыт.

Вступление

Для тех кто не читал мой первый обзор про Domoticz - . Буквально после первых удачных экспериментов, я загорелся идеей отдельной аппаратной базы для нее, в качестве рабочей платформы настольный ПК не подходит. Выбор свой я остановил, после штудирования пабликов - на Raspberry Pi Model 3 B - компактный но мощный одноплатный компьютер на базе Soc процессора BCM2837 с 4 ядрами Cortex-A53, работающим на частоте 1.2GHz, 1GB ОЗУ и беспроводными модулями Wi-Fi и Bluetoth 4.1.

Комплект

В свой заказ я включил 4 позиции -

Что интересно в магазине имеется две модификации - китайская и английская. На момент покупки китайская стоила на 7 долларов дешевле, ее я и взял. Чего там китайского - честно говоря для меня загадка.

Медные радиаторы для Raspberry Pi - страница товара

Еще для полного комплекта вам понадобится microSD карта - не менее 4 GB и HDMI кабель. У меня в загашнике был и кабель и карта на 32 ГБ, потому покупать не стал.

Что в посылке

Через положенный срок - чуть более двух недель, курьер принес посылку с моим заказом.


Рассмотрим подробнее. Блок питания с вилкой Тип С и разъемом micro-USB.


Заявленный максимальный ток - 2А при напряжении 5 В.


Тестовое включение с нагрузкой в 2А - показывает некоторое проседание напряжения, но в пределах допустимого, блок питания - более-менее честный.


Комплект из трех медных радиаторов в пакетике, для пассивного охлаждения.


Все радиаторы имеют квадтарную форму, два радиатора с штырями и длиной стороны около 12 мм и один плоский со стороной около 15 мм.


Корпус из темного пластика с выдавленным изображением ягоды малины на крышке


Размеры корпуса - примерно 90 на 65 мм



Корпус разбирается на 5 частей - держится все защелках, никаких винтов.


С аксессуарами покончено - пора переходить к самому главному

RASPBERRY PI 3 MODEL B

Raspberry Pi 3 Model B является прямым наследником Raspberry Pi 2 Model B. Плата полностью совместима с предшественником, но наделена большей производительностью и новыми средствами коммуникации:
64-х битным четырёхядерным процессором ARM Cortex-A53 с тактовой частотой 1,2 ГГц на однокристальном чипе Broadcom BCM2837; встроенными Wi-Fi 802.11n и Bluetooth 4.1.
Кроме того, процессор имеет архитектуру ARMv53, а значит вы сможете использовать любимую операционную систему: Debian Wheezy, Ubuntu Mate, Fedora Remix и даже MS Windows 10.


Технические характеристики подробнее

CPU - Broadcom BCM2837, ARM Cortex-A53 Quad Core, 1.2 GHz
Количество ядер процессора - 4
GPU - VideoCore IV 3D
RAM - 1 GB
Хранилище - microSD
Сетевые возможности
Ethernet 10/100
WiFi 2.4G 150 mb/s
Видео вывод - HDMI
USB порты - 4
Беспроводные возможности - Bluetooth
Аудио вывод - 3,5 Jack
85,6 х 53,98 х 17мм, 45 грамм


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


На одной из длинных сторон компьютера размещены порты micro USB для питания, полноразмерный порт HDMI, CSI-2 Camera port - для подключения камеры по интерфейсу MIPI, 3,5 мм аудиоразъем. Так же на верхней стороне находится модуль процессора и Ethernet/USB Hub lan9514-jzx


На торцевой стороне скомпонованы 4 USB порта и порт Ethernet


На другой стороне материнской платы находится 40 контактов ввода/вывода общего назначения (GPIO)


На второй торцевой стороны - находится DSI Display Port для подключения штатного дисплея


На нижней стороне платы находится модуль памяти LPDDR2 SDRAM - EDB8132B4PB-8D-F


И micro-SD разъем для карты памяти


Медные радиаторы ставятся на USB/Ethernet Hub и процессор с одной стороны


И на чип памяти с другой. Этот радиатор плоский - не мешает установке платы компьютера в корпус


В корпус все устанавливается отлично, винтовых соединений нет - садится на пластиковые выступы.


Все вырезы на корпусе в точности совпадает с разъемами компьютера



Для запуска нам потребуется внешний монитор (телевизор) с HDMI входом, USB клавиатура, будет удобнее если так же будет и мышка и питания. Монитор, клавиатура и мышка - понадобятся только на момент установки, дальше достаточно будет только блока питания.


Установка операционной системы

Для установки операционной системы, первым делом необходимо загрузить архив с дистрибутивами - отсюда . Пока скачивается почти полутора гигабайтный архив, загружаем утилиту для форматирования SD карты - SD Card Formatter - отсюда . Этот дистрибутив гораздо компактнее - всего 6 МБ, поэтому не теряя времени, устанвливаем программу


и, после установки, вставляем карту памяти в картридер (у вас же есть картридер не правда ли) и запускаем SD Card Formatter. В меню Options необходимо установить “FORMAT SIZE ADJUSTMENT” в “ON”


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

Следующий шаг - первый запуск Raspberry Pi (флешку с записанным дистрибутивом, конечно устанавливаем в него). Извините за качество нескольких следующих фото - с экрана телевизора:(

При первом запуске стартует меню выбора операционной системы - что ставить, причем в списке имеется даже версия WIndows 10 для Raspberry Pi. На этом этапе можно выбрать язык (внизу экрана) - русский есть и подключится к Wi-Fi сети - кнопка Wi-Fi networks


Нужная мне опарационка - Raspbian базирующаяся на Linux Debian - представлена в двух вариантах, lite И полном, с графическим интерфейсом. Я выбрал полную версию


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


Периодически измеряя температуру во время установки, максимально что я видел - 38 градусов.

После завершения установки и перезагрузки компьютера, загружается рабочий стол Raspbian


Единственное что я сделал здесь - это в настройках включил SSH - для того чтобы управлять системой с настольного ПК, все остальное я уже делал через терминал.


Для управления Raspberry с настольного ПК, нам понадобится любая программа терминал, я использую старый добрый Putty


Имя пользователя и пароль по умолчанию - pi и raspberry . Для смены пароля воспользуйтесь командой passwd .


eth0 - это Ethernet

lo - это локальный интерфейс 127.0.0.1

wlan0 - это wi-fi интерфейс


а для того что бы отредактировать файл с настройками - вводим команду

sudo nano /etc/dhcpcd.conf

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

Например мы хотим использовать адрес 192.168.0.222, маска 255.255.255.0, адрес шлюза и DNS - 192.168.0.1

Для Ethernet вставляем

static ip_address=192.168.0.222/24
static routers=192.168.0.1

interface wlan0
static ip_address=192.168.0.222/24
static routers=192.168.0.1
static domain_name_servers=192.168.0.1


Для выходя из редактора нажимаем ctrl+x
Для сохранения изменений - нажимаем “Y” и затем enter

Установка Domoticz

Большая часть работы по настройке уже закончена, теперь нам нужно установить систему Domoticz. Делается это одной командой -

sudo curl -L install.domoticz.com | sudo bash

Которая инициализирует процесс загурзки и установки системы


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


После успешной установки, инсталлятор напишет адреса и порты веб интерфейса системы Domoticz


Но, для работы с шлюзом Xiaomi - нам нужна beta версия системы. Обновление до крайней версии беты производится командами

cd ~/domoticz
sudo ./updatebeta


После этого, мы можем приступать к добавлению устройств в систему Domoticz - про это я уже рассказывал в своем предыдущем обзоре про нее.


На данный момент я уже перенес все свои рабочие сценарии с Windows версии на Raspberry - кстати стоит добавить что обе системы мирно сосуществуют одновременно. Для обеспечения бесперебойного питания миникомпьютера достаточно использовать PowerBank, который позволяет одновременно питать устройство и получать питание от внешнего источника.

Видеоверсия обзора:

Все мои обзоры устройств Xiaomi в хронологическом порядке - Список

Надеюсь обзор был полезен и интересен, спасибо за внимание.

Всем привет! Сегодня я расскажу как мне удалось сэкономить порты своей 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 является применение специализированных драйверов или плат расширения, к некоторым из которых можно подключать шаговые двигатели или несколько бесщеточных двигателей.

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

Как видно из схемы, если кнопка не нажата, вход GPIO5 будет подключен через резистор к шине 3.3 В. Входной порт RPi имеет высокое входное сопротивление, поэтому напряжение на входной линии будет близко к 3.3 В. Это означает, что при отпущенной кнопке RPi будет определять состояние входа как «лог. 1». Когда кнопка нажата, напряжение на входе будет равно 0 В, что является «лог. 0».

Для этой простой схемы величина сопротивления резистора R1 некритична и может находиться в диапазоне от 1 кОм до 47 кОм, однако низких значений следует избегать, поскольку в этом случае увеличивается ток, потребляемый при нажатии кнопки.

Исходный код программы для чтения состояния кнопки доступен в разделе загрузок (файл с именем Listing_4(Button).txt ). Сохраните код в файле с именем button-test.py и запустите на выполнение командой

sudo python button-test.py.

Результат выполнения программы выводится на экран в виде сообщения о текущем состоянии кнопки и количестве нажатий на нее. При выполнении этого примера вы заметите, что иногда значение счетчика становится больше реального количества нажатий на кнопку, и это происходит из-за «дребезга» контактов. Примерно то же самое происходит и при отпускании кнопки. Решение состоит в использовании механизма подавления «дребезга» контактов (debouncing). Этот механизм может быть как аппаратным, так и программным, причем последний распространен больше. В исходном коде, приведенном в файле Listing_5(Button_Debounce).txt , подавление дребезга контактов кнопки реализовано, и подсчет количества нажатий кнопки будет более точным. Единственное отличие от предыдущего кода заключается в том, что теперь с задержкой 20 мс выполняется вторая проверка состояния входа - за это время дребезг контактов прекращается.

Еще один пример: вольтметр

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

Примером может служить очень простой, но точный вольтметр с диапазоном измерений 0 … 1 В (Рисунки 13, 14). Учтите, что заменить портативный мультиметр он не может, поскольку не имеет необходимых цепей защиты, и может выйти из строя сам или повредить плату RPi, если используется для чего-либо, выходящего за рамки описанных здесь примеров.

В схеме используется микросхема AD654 (преобразователь напряжение-частота), которая генерирует прямоугольные импульсы с частотой, зависящей от входного напряжения. Цифровой выход Fout микросхемы подключен к входу GPIO5 (вывод 29 разъема GPIO). Максимальная частота прямоугольных импульсов при указанных на схеме номиналах элементов равна 10 кГц, поэтому для определения входного напряжения нам потребуется точная система отсчета времени. Код для этого примера (файл Listing_6(Voltmeter).txt ) написан на Си и использует библиотеку wiringpi, написанную Гордоном Хендерсоном (Gordon Henderson). Прежде всего, установите библиотеку wiringpi , для чего выполните следующие команды:

mkdir development
cd development
git clone git://git.drogon.net/wiringPi
cd wiringPi
./build

Сохраните код в файле с именем voltmeter.c и скомпилируйте его командой

gcc -o voltmeter -lrt -lwiringPi voltmeter.c.

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

sudo ./voltmeter.

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

Несколько элементов в схеме вольтметра также влияют на точность измерений. Конденсатор С1 и резистор R1 задают характеристики преобразования, поэтому желательно выбрать пленочный полипропиленовый конденсатор и точный резистор с допуском 1%. Можно использовать подстроечный резистор. Напряжение питания схемы 5 В поступает с разъема GPIO, но его реальное значение может несколько отличаться от 5 В, поэтому лучше использовать отдельный более точный источник питания.

Для быстрой проверки схемы можно использовать делитель напряжения, состоящий из двух резисторов. Схема включения делителя показана в левой части схемы вольтметра (Рисунок 12). Если резисторы прецизионные и напряжение питания в точности равно 5 В, расчет напряжения на выходе делителя дает 0.04950 В. Значение, полученное в результате реального программного измерения, составило 0.04991 В. Неплохо для такого простого проекта!

Диоды Шоттки D1 и D2 в схеме не являются обязательными, но настоятельно рекомендуются, поскольку они обеспечат некоторую защиту микросхемы, если случайно на вход будет подано напряжение вне диапазона 0…1 В.

Защищенные входы

RPi можно защитить от случайного попадания высокого напряжения, добавив к используемым входам дополнительную схему. В некоторых случаях очень хорошей и недорогой альтернативой показанной ниже схеме (Рисунок 15) может служить оптрон, способный защитить входы RPi от напряжений до 60 В и справится с переполюсовкой. Транзистор BC547B в схеме на Рисунке 14 можно заменить на 2N3904 или BC549. Допустимая мощность рассеивания резистора R1 может быть 0.25 Вт при входных напряжениях до 50 В, в противном случае лучше использовать 0.5 Вт.

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

Подключение к 5-вольтовй логике

Прямое подключение устройств с 5-вольтовыми логическими выходами к входам RPi может вывести плату из строя. В этом случае есть множество решений.

Если состояние 5-вольтового логического выхода меняется относительно медленно, можно рассмотреть возможность использования резистивного делителя на входе RPi, но к быстрым схемам такой способ не применим. Тогда намного более хорошим решением будет использование буферной микросхемы. Для средних скоростей (до 100 кГц) вполне подойдет схема на N-канальном MOSFET ZVN2110A (Рисунок 16). Эта схема также инвертирует входной сигнал.

Показанный на схеме транзистор можно заменить на ZVNL120A или VN10LP.

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

Скорость работы и джиттер

Опрос состояния кнопок и управление светодиодами - события относительно медленные, измеряющиеся десятками и сотнями миллисекунд. Иногда встречаются намного более высокоскоростные сигналы. Например, пульт от телевизора излучает инфракрасные световые импульсы со скоростью 40 тыс. раз в секунду. Несмотря на то, что основной процессор RPi работает на частоте 1 ГГц, работа подсистемы ввода/вывода с такой скоростью не поддерживается по ряду причин, как аппаратных, так и программных. Мы рассмотрим некоторые программные аспекты, касающиеся темы статьи.

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

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

Кроме того, немаловажное значение имеет выбор языка программирования, поскольку некоторые библиотеки подходят лучше, чем другие. Интерпретированные и компилированные коды могут выполняться с разными скоростями. Короче говоря, если требуется очень точная временнáя привязка событий, возможно, придется написать драйвер Linux или использовать внешнее оборудование (например, другой микроконтроллер или логические схемы и генератор).

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

Чтобы узнать это, был написан код для периодического переключения логического состояния выходного порта, к которому был подключен осциллограф. Результат представлен в Таблице 1.

Таблица 1. Максимальная частота переключения выходов при
использовании различных языков программирования
Язык
программирования
Частота Длительность
высокого уровня
Длительность
низкого уровня
Python 71.2 кГц 3.9 мкс 10.1 мкс
Си 5.8 МГц 85 нс 85 нс
Командный скрипт 3.9 кГц 115 мкс 139 мкс

Однако всегда важно помнить о джиттере, которым обязательно сопровождается работа ОС Linux. Для случая простого переключения светодиода это, кончено же, не проблема. Характер джиттера можно увидеть на осциллографе в режиме наложения нескольких каналов при синхронизации общим сигналом (Рисунок 17). Обратите внимание, что джиттер может принимать множество значений, несмотря на то, что сигналы дискретно разнесены на 4 нс (250 МГц), что связано с аппаратными особенностями RPi.

Заключение

Теперь вы увидели, что 40-контактный разъем GPIO на платах RPi может использоваться для различных проектов - от управления светодиодами до электронных схем для измерения аналоговых величин. С небольшими дополнительными схемами адаптации логических уровней RPi может взаимодействовать 5-вольтовыми устройствами. С помощью Python очень легко управлять выходами, так же как не представляет сложности и чтение состояния входов, а библиотека wiringpi значительно упрощает управление программистам, использующим Си.







2024 © gtavrl.ru.