Управление gpio raspberry pi через web. Raspberry Pi: настройка и управление

02.03.2019

Сегодня научимся управлять включением и выключением реле с помощью raspberry pi 2 , для примера будем включать и выключать розетку , управлять светильником или других электроприбором. Я использовал реле SRD-05VDC-SL-C .
1) Подключаем его к raspberry pi и к линии 220В. Я подключал только одно реле, но на плате у меня их два.

Перенесу сюда изображение разъемов GPIO raspberry pi 2

GPIO raspberry pi 2

На изображении ниже схема подключения реле к raspberry pi 2 и линии 220 В .

Схема подключения реле к raspberry pi 2 и линии 220 В
(изображение кликабельно)

Ещё раз поясню.
По схема реле соединяется с одной стороны с GPIO портами raspberry pi 2, а с другой с розеткой 220 В. На плате с реле есть 4-е пина — GND, IN1, IN2, VCC.
a) GND на реле надо соединить с GND на raspberry pi.
b) IN1 и IN2 — это как раз два реле. IN1 я подключил к GPIO17(пин 11), а IN2 к GPIO25(пин 22). Они у меня просто свободны, у вас могут быть свободны другие GPIO разъемы.
с) к пину VCC на реле подключаем 5v на raspberry pi 2. Я решил использовать пин №2 на raspberry.
Так же на плате есть контакты по три штуки возле каждого реле. От линии 220В я подвёл провод к контакту NO1 на реле 1. Контакт COM1 на реле 1 соединяю с одним из разъемов розетки. На второй контакт розетки я сразу подаю 220 B, то есть он идёт напрямую, минуя реле и raspberry. Если подключить не к NO1, а к NC1 то питание будет подаваться постоянно, розетка будет давать ток и без raspberry, поэтому NC1 я просто не использую.
С физическим подключением думаю понятно. Будьте аккуратны. Вы всё выполняете на свой страх и риск.

Перейдём к программной части.
2) пишем 2-а простейших скрипта:
sudo nano /script/gpio/relay01-01-down.sh

#!/bin/bash

echo 17 > /sys/class/gpio/export
echo out >
echo 1 > /sys/class/gpio/gpio17/value

и второй скриптик:
sudo nano /script/gpio/relay01-01-up.sh
содержимое должно быть таким:
#!/bin/bash

echo 17 > /sys/class/gpio/export
echo out > /sys/class/gpio/gpio17/direction
echo 0 > /sys/class/gpio/gpio17/value

3) делаем их исполняемыми:
sudo chmod +x /script/gpio/relay01-01-down.sh
sudo chmod +x /script/gpio/relay01-01-up.sh

В целом можно уже поиграться, подсоединив к розетке лампу поочерёдно запуская каждый скрипт, будет то включать лампу, то выключать
sudo /script/gpio/relay01-01-up.sh
sudo /script/gpio/relay01-01-down.sh

4) Но интересней сделать кнопки управления реле в веб-интерфейсе. Веб-сервер уже поднят по , поэтому в его корне(по умолчанию это директория /var/www/) пишем в файл index.php код с кнопками. Код можно .
Там же в корне веб-сервера создаём файл style.css с содержимым, которое можно .

Заходим на веб-сервер http://ip-адрес-raspberru-pi/ и должны увидеть две кнопки(они ещё не работают).

5) добавляем права для www-data следующим образом:
sudo visudo
там дописываем:
www-data ALL=(ALL) NOPASSWD: ALL

6) пробуем понажимать кнопки в веб-интерфейсе. Они уже должны работать и щёлкать релюшкой.
Результат сборки:

В данной статье мы рассмотрим управление входами/выходами (GPIO) микрокомпьютера Raspberry Pi через Web-интерфейс. Это дает возможность управлять различными устройствами через интернет.

Особенности данного проекта:

– серверная программа, запущенная на Raspberry Pi для чтения значений GPIO

использование MySQL базы данных для хранения состояния GPIO

– использование веб-сервера Apache2 для контроля GPIO через веб-браузер

Итак, первое, что вам необходимо установить на Raspberry Pi, это:

Apache веб-сервер

– MySQL сервер

– phpMyAdmin (есть русская версия)

Т.к. микрокомпьютер Raspberry Pi работает на Linux-системах, то в интернете полно описаний на русском языке как устанавливать все эти пакеты. Поэтому зацикливаться на этом мы не будем. Есть неплохая инструкция применительно к Raspberry Pi, но на английском языке: почитать .

Полноценный root-доступ

Для получения полного root доступа необходимо в терминале набрать команду sudo -i , которая переводит пользователя в сессию под root-ом.

Если вы уже включили root эккаунт, то дальше можете пропустить, если нет, то после команды sudo -i необходимо задать пароль пользователю root, делается это командой passwd root. После чего введите 2 раза пароль. Теперь можно закрыть SSH-сессию и войти заново уже под root’ом.

Настройка базы данных

Для упрощения работы, все действия с MySQL будем делать из оболочки phpMyAdmin.

Скачать файлы проекта

Оригинал статьи на английском языке (перевод Колтыков А.В. для сайта cxem.net)

7. Знакомство со средствами программирования, установленными на Raspberry Pi

Для изучения программирования в Raspbian ОС предустановлены пакеты Python, Scratch, Node-RED, SonicPi и Wolfram Mathematica. Именно ради того, чтобы сделать максимально доступным и удобным для всех изучение програмирования и физического компьютинга проект Raspberry Pi и создавался несколько лет назад! Так что же представляют в трех словах предустановленные на RasPi средства разработки?

Python представлять не надо - это самый популярный в университетской и научной среде язык программирования. Для работы с датчиками через GPIO для Python написана и предустановлена библиотека. Вообще говоря, через инструмент pip можно доустановить тысячи библиотек для Python буквально для решения всех практических задач физического компьютинга и научных вычислений.
Помимо самого языка Python версий 2 и 3 со средой разработки IDLE, в Raspbian ОС предустановлена специальная версия популярной игры Minecraft Pi и библиотеки на Python для управления игрой. (Введение см. и )
Node-RED - визуальный редактор от IBM с открытым исходным кодом для создания "интернета вещей", позволяющий практически без программирования, соединением готовых модулей "собирать" довольно сложные приложения для систем типа "умный дом". (Введение см. и ).
Язык Scratch - инструментарий визуального программирования, позволяющий детям создавать анимации и игры методом Drag&Drop. (Введение см. и )
Уникальный в своем роде язык SonicPi позволяет программировать музыку. (Введение см. )
Пакеты Wolfram и Mathematica - наиболее полная система для современных технических вычислений в мире. Она будет незаменимым помощником для технических вычислений как учащихся школ, так и студентов ВУЗов. Хотя продукт для Windows платный, на Raspbian ОС установлена полнофункциональная бесплатная версия.
(Введение см. и )
Кроме того, в Raspbian ОС по умолчанию предустановлены Node.js, Perl и Ruby.
Для удобной работы с кодом на Raspberry Pi предустановлен один из лучших редакторов с подсветкой синтаксиса и среда разработки Geany.

8. Восстановление работы Raspberry Pi после сбоев


Может возникнуть ситуация, когда несовместимость вновь установленного аппаратного или программного обеспечения вызовет ошибку при запуске системы. Напирмер, хотя в настройках Raspberry Pi 3 имеется пункт Open GL, как показала практика, включение этой опции вызовет ошибку загрузки системы.
Как показала практика, у Raspberry Pi имеется несколько возможностей восстановления после сбоя загрузки.

1) Откат до последней резервной копии microSD-карты при помощи Win32DiskImager.
Делайте почаще образы стабильной версии системы программой Win32DiskImager и можете быть уверены, что в случае сбоя система будет востановлена за считанные минуты.

2) Редактирование конфигурационного файла config.txt с microSD-карты на компьютере при помощи кард-ридера.
К примеру, в случае сбоя с Open GL надо закомментировать символом # последнюю строчку "dtoverlay=vc4-kms-v3d" в файле config.txt и система запустится нормально.

3) Удаленное подключение к Raspberry Pi по сети через SSH-терминал.
Во многих случаях, например, в случае того-же сбоя загрузки при включении Open GL, после загрузки ядра системы успевает запуститься SSH-сервер и продолжает работу в фоновом режиме. Можно зайти в консоль Raspberry Pi через SSH-терминал, отредактировать конфигурационные файлы (boot/config.txt), либо запустить raspi-config и отключить сбойные опции.

4) Чистка системы.

Удалите кеш пакетов:
sudo apt-get clean
Удалите осиротевшие пакеты:
sudo apt-get autoremove
Обновите список пакетов:
sudo apt-get update
Исправьте зависимости:
sudo apt-get -f install
Переустарновите пакет, если установка пакета была прервана
sudo apt-get install --reinstall имя_пакета

9. Удаленное управление Raspberry Pi (SSH/VNC)



Как и любой Unix-системой, Raspberry Pi можно управлять удаленно несколькими способами.
Самый простой - управление в консоли по протоколу SSH. Чтобы это стало возможным, необходимо зайти в настройки Raspberry Pi (sudo raspi-config), выбрать пункт меню "Interfacing options", в следующем окне выбрать пункт "SSH" и подтвердить включение сервера SSH при запуске. Рекомендуется сразу поменять пароль по умолчанию пользователя "pi" с "raspberry" на какой-нибудь другой, содержащий не менее 8 символов в английской раскладке.
Затем можно скачать на другом компьютере бесплатный SSH-клиент PuTTY , запусить его и ввести в строку "Host Name (or IP address)" локальный IP-адрес Raspberry Pi. В консоли появится запрос на логина, а за ним - пароля. Если все введено верно, появится приветствие Raspberry Pi и зеленый курсор ввода команд. Через SSH-терминал можно устанавливать и удалять программы, копировать, перемещать и удалять файлы, исполнять консольные команды системы и скрипты (BASH, Python, Perl...), работать с конфигурационными файлами Raspberry Pi. Словом, делать все многообразие операций, доступных в консоли Unix-систем. Многие вещи удобнее делать в консольных редакторах типа файл-менеджера MC, которые также работают через SSH-терминал.
Помимо терминального доступа к консоли, в Raspberry Pi встроена возможность полноценного управления в графическом интерфейсе. Для этого на Raspberry Pi предустановлена бесплатная версия VNC-сервера. Включить его автозапуск можно там-же, где до этого мы включили SSH-сервер. Надо выбрать следующий пункт меню "Iinterfacing options" - "VNC" и подтвердить влючение сервера. Для полноценного доступа к Raspberry Pi необходимо будет скачать бесплатный VNC-viewer , запустить его, и также как в случае с SSH ввести локальный IP-адрес Raspberry Pi. Пройдя процедуру авторизации, вы попадете на Raspberry Pi, как если бы находились перед подключенным к нему дисплеем, нажимали на клавиатуру и кликали мышью. Скорость работы в VNC-клиенте лишь немного медленнее, чем на самом Raspberry Pi. Меню открываются почти с той же скоростью, только графические файлы при открытии прорисовываются не мгновенно, с неболшой задержкой в доли секунды.
При удаленном подключении к Raspberry Pi по SSH и VNC необходимо только, чтобы устройство было подключено к локальной сети и сети питания. Клавиатура, мышь и монитор при этом могут быть и не подключены к Raspberry Pi . Это удобно в случае настройки "малинки" в качестве веб-сервера, или сервера IoT (сервера управления датчиками "умного дома").

К слову, по умолчанию размеры виртуального экрана в VNC слишком малы - всего 640х480 пикселей. Приведу мой маленький "хак" по настройке комфортного разрешения экрана (1024х768) при удаленном подключении по VNC:

Откроем для редактирования файл конфиргурации Raspberry Pi:
sudo nano /boot/config.txt
Раскоментируем (удалим слева символ #) и слегка подправим следующие строки:
hdmi_force_hotplug=1
hdmi_group=2
hdmi_mode=16

10. Установка комплекта ПО интернет-разработчика LAMP

Поскольку не только я считаю, что за интернетом - будущее, на компьютере юного программиста должен быть установлен пакет программ, обеспечивающийх возможность обучения основам интернет-программирования, создания и администрирования вебсайтов. Общепризнанным стандартом среды интернет-разработчика в ОС Linux является комплект программ, стостояший из вебсервера Apache, СУДБ MySQL и языка программирования PHP (LAMP). Для удобства администрирования баз данных также рекомендуют установить ПО PHPMyAdmin (все программы распространяются бесплатно). Следуя пошаговым инструкциям с офсайта Raspberry Pi , за полчаса LAMP и самая популярная система управления сайтами (CMS) Wordpress были установлены на "малинку" и настроены для работы. Привожу пошаговую инструкцию с пояснениями, чтобы у вас этот процесс не занял больше времени, чем у меня.


1. Установка сервера Apache2 (<1 мин)
sudo apt-get install apache2 -y
Проверка работы Apache
links2 http://192.168.0.100
Просмотр папки сайта
cd /var/www/html
ls -al

2. Установка PHP 5 (1 мин)
sudo apt-get install php5 libapache2-mod-php5 -y
sudo service apache2 restart
Создание тестовой страницы
sudo rm index.html
sudo nano index.php

Проверка работы PHP
links2 http://192.168.0.100

3. Установка mysql 5 (3 мин)
sudo apt-get install mysql-server php5-mysql -y
sudo service apache2 restart

Присвоение прав пользователю Apache
sudo chown -R www-data: .

Создание базы MySQL
mysql -uroot -ppassword
mysql> create database wordpress;

Включение Apache mod rewrite
sudo a2enmod rewrite

Включение возможности указывать настройки в.htaccess
sudo nano /etc/apache2/sites-available/000-default.c onf

Добавим следующий код

< VirtualHost *:80 >
< Directory "/var/www/html" >
AllowOverride All
< /Directory >

4. Установка PHPMyAdmin (3 мин)
sudo apt-get install phpmyadmin

5. Установка Wordpress

Скачивание Wordpress

cd /var/www/html/

Распаковка Wordpress

sudo tar xzf wordpress-4.7.2-ru_RU.tar.gz

sudo mv wordpress/* .

sudo rm -rf wordpress-4.7.2-ru_RU.tar.gz

Установка и настройка Wordpress
Заходим в броузере по вашему текущему адресу, например http://192.168.0.100 , либо по адресу http://localhost .
В соответствующих полях указываем имя, адрес (localhost), логин и пароль пользователя созданой вами ранее базы данных, название сайта, логин и пароль администратора сайта (не используйте простые имена типа "root" и "admin", придумайте пароль не короче 8 символов, содержащий цифры и буквы в разных регистрах), а также ваш e-mail.
Через несколько секунд после подрвеждения ввода данных Wordpress установится и уже будет готов к работе! Комплекты необходимых плагинов, таких как cyr3lat, wp-edit, hyper-cache, wp-db-backup и т.п., можно установить позже, просто введя их названия в форме поиска страницы Plugins консоли Администратора Wordpress.
Теперь Raspberry Pi готов стать домашним веб-сервером интернет-разработчика.

11. Знакомство с языком Python

Объектно-ориентированный интерпретируемый язык программирования Python появился в конце 80-начале 90х годов в центре математики и информатики в Нидерландах благодаря усилиям Гвидо ван Россума.
Изначально язык был ориентирован на повышение производительности разработчика и читаемости кода.
Python характеризуется минималистичным синтаксисом при высокой функциональности, поддерживает все основные парадигмы программирования, поддерживает динамическую типизацию, автоматическое управление памятью, обработку исключений, многопоточность вычислений, модульность.
В настоящее время Python активно используется как универсальная среда для научных расчётов. Во многих популярных программах трёхмерной графики, таких как Blender, язык Python используется для расширения стандартных возможностей программ.
Python используется во многих крупных компаниях, таких как Dropbox, Google, Facebook, Instagram.
Особенностью синтаксиса языка Python является выделение блоков кода с помощью отступов, поэтому в Python отсутствуют операторные скобки begin/end и фигурные скобки. Также в Python отсутствую явные завершающие символы конца строк, такие «;» как в Perl.
Одной из привлекательных сторон Python стала богатая библиотека стандартных модулей. Помимо стандартной библиотеки существует огромное множество прикладных библиотек для Python в самых разных областях. Для Python созданы программные каркасы для разработки веб-приложений, самым популярным из которых является Django.
С Python поставляется библиотека tkinter для создания кроссплатформенных программ с графическим интерфейсом. Также для Python существуют расширения для всех основных библиотек графических интерфейсов.
Существуют расширения Python для создания игр (Pygame), работы с мультимедиа, 3D-моделирования, обработки графики, построения графиков, астрономических вычислений (Astropy).
Установка и обновление пакетов для Python осуществляется через интерфейс PyPI (Python Package Index). Модули задействуются в начале программ командой import.
Изначально Python предполагался в качестве основного языка программирования на Raspberry Pi. Не случайно devboard имеет символическое окончание «Pi» в названии.
Для работы с внешними датчиками, подключаемыми к Raspberry Pi для Python написаны и предустановлены в Rasbian несколько библиотек, таких как RPi.GPIO.
Вместе с Python на Raspberry Pi предустанавливаются стандартный интерфейс разработки и тестирования приложений IDLE и удобный редактор Geany.
В Интернет имеется масса руководств по знакомству с языком Python и готовых примеров для создания IoT-приложений на Raspberry Pi, понятных даже школьникам младших классов.
Надо учитывать, что большинство примеров в Интернет написаны для версии Python 2.х, не совместимой с 3.Х Поэтому, на Raspberry Pi предустановлены обе версии Python. Также вместе с Python 3.Х поставляется программа (скрипт) «2to3», конвертирующая код с версии 2.х в 3.Х.

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

(Введение в основы языка Python см. и )

12. Работа с Python и GPIO, мигание светодиодом

После знакомства с основами синтаксиса и базового набора команд языка Python, решающим шагом на пути физического компьютинга является решение, вроде бы, простой задачи: «помигать светодиодом».
Именно с этого шага многие школьники, студенты и взрослые «гики» всего мира начинали свой путь в IoT-программировании.
Для этого мне в первую очередь потребовалось приобрести несколько радиодеталей: несколько пар резисторов от 100 до 300Ом (как предлагается в руководствах) и несколько светодиодов разного цвета (я взял красный, синий и белый). В ходе поиска подходящего радиоларька выяснилось, что радиодеталями в моем городе торгует только одна, конкретная точка. Стоимость деталей оказалась невысокой (3-5 рублей за штуку).
При сборе простенькой схемы, состоящей из светодиода и резистора, я обнаружил, что 40-пиновый кабель к моей монтажной плате (breadboard) не маркирован красной полосой по краю, а состоит из разноцветных кабелей. В интернете схемы подключения для такого кабеля к breadboard и Raspberry Pi 3 слету я не нашел. Пришлось открыть схему GPIO и прозванивать контакты кабеля цифровым тестером, чтобы понять, как его подсоединять.
Также оказалось, что «гребенка» для подключения кабеля к breadboard у меня не имеет отводов для вывода на линии питания breadboard, так что пришлось подключить Ground на гребенке к минусу на breadboard.
Собрав схему таким образом, чтобы длинный контакт (+) светодиода был подключен к 21 порту GPIO, а короткий — через резистор сопротивлением в 100 Ом — к «земле» (-), запустил Raspberry Pi 3 и подключился к нему по VNC.
Создал в IDLE3 программу мигания светодиодами flashpi.py, описанную на сайте http://edurobots.ru/ , и сохранил ее в папке /home/pi."
Запустил программу с помощью F5 в IDLE3 (можно также запустить программу командой "sudo python3 flashpi.py" в LXTerminal) и... светодиод не загорелся.
Проверив все контакты и правильность сборки схемы, понял, что дело не в аппаратной, а в программной части системы. Из примера в одной из электронных книжек по Raspberry Pi 3 выяснилось, что вместо команды
GPIO.setmode(GPIO.BOARD) надо инициализировать порты командой GPIO.setmode(GPIO.BCM). После правки кода и запуска программы, вслед за нажатием клавиши Enter светодиод, наконец, загорелся ярким светом!
Повторное нажатие клавиши Enter выключало светодиод. Нажатием любой другой клавиши осуществлялся выход из программы и корректное завершение работы с портами GPIO.
Вот код рабочей программы ("__" заменяем на пробелы - это необходимые отступы в Python):

Из цикла закрытие работы с GPIO

Никогда в жизни я так не радовался горящему светодиоду! Да и давно так не радовался вообще! Как это, надеюсь, рано или поздно сделали 10 миллионов покупателей Raspberry Pi, я таки "помигал светодиодом"! Причем, «помигал» программно!

Заключение - напутствие юным кибернетикам

Надеюсь, что мой долгий, но захватывающий путь длиной в 3 месяца, от решения купить одноплатный компьютер Raspberry Pi 3 до программного «мигания светодиодом», был пройден не зря.
Он познакомил меня с новым миром Unix и физического компьютинга, а заодно подготовил пошаговое руководство для всех, кто хочет войти в него (в первую очередь — для преподавателей школ и старшеклассников) и создал платформу для дальнейшего освоения физического компьютинга, веб-программирования и системного администрирования. На базе Raspberry Pi 3 стоимостью чуть больше 2 т.р. стало возможным создание домашнего вебсервера и мультимедиа-центра, интересных решений по автоматизации выполнения рутинных задач и более сложных IoT-систем, в том числе, решений для концепции «Умный дом».
Лично для меня в мои 43 года было занимательным и полезным приключением осваивать незнакомый мне язык программирования Python и новую, не похожую на распространенные у нас, операционную систему.
Компьютер Raspberry Pi 3, настроенный и проверенный в работе, вместе с breadboard, радиодеталями и комплектом из 16 датчиков я изначально планировал подарить дочке на День рождения для использования в качестве учебного ПК и перспективного исследовательского инструмента в кружке информатики местной гимназии. Договорился с учителем информатики о предоставлению помощи по приобретению и внедрению Raspberry Pi во внеурочных занятиях по информатике среди заинтересованных ребят и олимпиадников. Надеюсь, как и мне, Raspberry Pi даст моей дочери и ребятам в гимназии мощный импульс в учебе и развитии, раскроет новые возможности изменения себя и окружающего мира к лучшему при помощи современных технологий.

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



GPIO находятся на разъеме 2×13, на котором можно найти интерфейсы SPI, I2C, UART и линии питания 3.3 В и 5 В.



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



Итак, как же управлять линиями GPIO на Raspberry Pi?


Для начала нужно установить библиотеку RPi.GPIO Python Library. Возможно, она уже была предустановленна на ваш дистрибутив операционной системы Raspbian OS. Чтобы проверить это, введите:


sudo python


Затем введите в строчке:


import RPi.GPIO as GPIO


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


Для начала загружаем RPi GPIO Library:


wget http://pypi.python.org/packages/source/R/RPi.GPIO/RPi.GPIO-0.3.1a.tar.gz


Затем извлекаем файлы:


tar zxf RPi.GPIO-0.3.1a.tar.gz


Потом переходим в извлеченный каталог:


cd RPi.GPIO-0.3.1a


И устанавливаем библиотеку:


sudo python setup.py install


Использование библиотеки RPi.GPIO Python Library


# импорт библиотеки import RPi.GPIO as GPIO # используем нумерацию разъема Raspberry Pi GPIO.setmode(GPIO.BOARD) # или GPIO.setmode(GPIO.BCM) # настраиваем выводы GPIO на вход или выход GPIO.setup(11, GPIO.IN) GPIO.setup(13, GPIO.OUT) # берем входное значение с вывода 11 input_value = GPIO.input(11) # устанавливаем выходное значение на вывод 13 GPIO.output(13, GPIO.HIGH) #GPIO.output(13, GPIO.LOW)

Различие между GPIO.setmode(GPIO.BOARD) и GPIO.setmode(GPIO.BCM) заключается в системе нумерации выводов. В первом случае используется нумерация разъема P1 на борту Raspberry Pi, а во втором случае нумерация выводов системы-на-кристалле Broadcom, являющейся ядром Raspberry Pi. Следует знать, что в случае с BCM нумерация выводов между первой и второй ревизиями немного отличается, а при использовании BOARD ревизия не имеет никакого значения, все остается тем же самым.


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



Соединения:



Значения сопротивлений резисторов могут быть вычислены следующим образом. Используемые в данном случае 5-миллиметровые светодиоды потребляют ток 20 мА. Напряжение, подаваемое с Raspberry Pi, составляет 3.3 В. Тогда сопротивление будет равно 3.3 В / 20 мА = 165 Ом. Для кнопок были задействованы резисторы 1 КОм.




from time import sleep import RPi.GPIO as GPIO GPIO.setmode(GPIO.BOARD) GPIO.setup(16, GPIO.IN) GPIO.setup(18, GPIO.IN) GPIO.setup(11, GPIO.OUT) GPIO.setup(13, GPIO.OUT) GPIO.setup(15, GPIO.OUT) GPIO.output(11, GPIO.LOW) GPIO.output(13, GPIO.LOW) GPIO.output(15, GPIO.LOW) # state - определяет должен ли светодиод быть включенным или выключенным state = 0 # increment - направление изменения состояний inc = 1 while True: # кнопка нажата if (GPIO.input(16) == True): if (inc == 1): state = state + 1; else: state = state - 1; # достигнуто максимальное состояние state, возвращаемся назад (декремент) if (state == 3): inc = 0 #достигнуто минимальное состояние state, возвращаемся назад (инкремент) elif (state == 0): inc = 1 if (state == 1): GPIO.output(11, GPIO.HIGH) GPIO.output(13, GPIO.LOW) GPIO.output(15, GPIO.LOW) elif (state == 2): GPIO.output(11, GPIO.HIGH) GPIO.output(13, GPIO.HIGH) GPIO.output(15, GPIO.LOW) elif (state == 3): GPIO.output(11, GPIO.HIGH) GPIO.output(13, GPIO.HIGH) GPIO.output(15, GPIO.HIGH) else: GPIO.output(11, GPIO.LOW) GPIO.output(13, GPIO.LOW) GPIO.output(15, GPIO.LOW) print("pressed B1 ", state) # нажата кнопка сброса if (GPIO.input(18) == True): state = 0 inc = 1 GPIO.output(11, GPIO.LOW) GPIO.output(13, GPIO.LOW) GPIO.output(15, GPIO.LOW) print("pressed B2 ", state) sleep(0.2);

Итак, как мы видим, использовать GPIO на Raspberry Pi довольно-таки просто. Хотя их не так много, как у Arduino, но в совокупности с вычислительной мощностью системы-на-кристалле этот миникомпьютер будет полезен во

Предисловие

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

Из трех вариантов компьютера Raspberry Pi A, B и B+ мне удалось познакомится с двумя последними. Модель B продается с февраля 2012 года, а B+ с июля 2014. С точки зрения работы с камерой различий между этими моделями нет. Они оснащены ARM11 процессором Broadcom BCM2835 с тактовой частотой 700 МГц и модулем оперативной памяти 512МБ.

Различия в количестве портов USB и в расположении и типе разъемов. Модель B имеет раздельные аудио и видеовходы и разъем для карт SD, а D+ объединенный разъем для аудио и видео, как и на многих фотоаппаратах и разъем для карт памяти micro SD. Некая защита и стабилизация по питанию существует только, если подавать 5 В на разъем micro USB, и эта часть реализована у этих моделей по-разному. Если подавать питание на разъем GPIO, то о качестве питания надо заботиться самому. Успех проекта Arduino доказал, что для многих задач не в производительности счастье и надо использовать компьютеры той производительности, которая необходима для решения поставленной задачи. Оценки показывают, что по производительности центрального процессора Raspberry Pi сопоставима с 300 MHz Pentium II образца далекого 1997 года. Однако, графический процессор Broadcom VideoCore IV с частотой 250 МГц уже вполне из 21 века и обеспечивает вывод видео1080p с частотой 30 кадров в секунду и аппаратным декодированием H.264, MPEG-4 AVC.

Компьютеры Raspberry Pi моделей B и B+ (слева)

Модель B в фирменном корпусе.

Хотя в корпусе и предусмотрены щели для шлейфа, ведущего к камере, он мало полезен при создании установок для съемки. Корпус для камеры и компьютера надо делать в соответствии с задачей. Например, для уличной камеры с емкими аккумуляторами и большим сроком автономной работы я изготовил следующую конструкцию.

Безымянный адаптер 802:11n заработал из коробки, но постоянно терял сеть. Были куплены два внешне разных и разных фирм адаптера, но при детальном рассмотрении они оказались на одном чипе: REALTEK RTL8188ETV. Сборка драйверов из исходников дала для Raspberry Pi неработоспособные драйвера. Однако в сети нашлись уже скомпилированные бинарники на сайте www.fars-robotics.net / и с ними все стабильно заработало. Однако у этого пути оказался смертельный враг - sudo apt-get upgrade. Очередное обновление системы, коснувшееся в том числе и камеры и потому оправданное, привело адаптеры в нерабочее состояние и на вышеуказанном сайте обновлений не появилось. Поиск показал, что я не первый, кто обновился, и решение уже найдено и даже выложены бинарники драйверов для последней версии.

Адаптер USB-Bluetooth (первый на снимке) может быть использован для управления камерой, но соединение должно быть установлено до запуска программы, и поэтому оказалось удобнее использовать адаптер com-Bluetooth, поскольку последовательный порт от и в Африке последовательный порт и независимо от наличия соединения программа ругаться не будет. Для спаривания устройств в этом случае от ОС ничего не требуется, если на адаптер подано питание, то с ним может быть установлено соединение.

Подключив цифровой приемник ИК сигнала (например TSOP1736) к GPIO, можно воспользовавшись результатами трудов проекта LIRC , организовать управление камерой от пульта дистанционного управления.

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

Для работы с компьютером существует множество ОС. Мне, например, без проблем удалось установить Slackware ARM , но это получилась огромная базовая система, которую еще предстояло адаптировать для работы с камерой. Поэтому, несмотря на всю мою любовь к этому дистрибутиву, я остановился на самой массовой и соответственно наиболее адаптированной и документированной системе - Raspbian (Debian Wheezy) . В нем камера поддерживается из коробки, однако при первом включении надо разрешить к ней доступ вызвав sudo raspi-config. Операционная система устанавливается копированием командой dd на карту памяти и здесь отмечу, что к картам система оказалась весьма привередлива. Моя попытка использовать старые 4 ГБ карты в большинстве случаев окончилась неудачей, либо не записывалось, либо система с этих карт не стартовала.

Наиболее полный список ресурсов, на мой взгляд, расположен на elinux.org/RPi_Hub . И соответственно раздел, посвященный камере: elinux.org/Rpi_Camera_Module .

С точки зрения построения своих систем отличных от серийно выпускаемых наибольший интерес представляют огромные возможности дистанционного управления камерой. Это и проводная сеть, и Wi-Fi, и Bluetooth, и ИК пульт дистанционного управления, и цифровые входы, позволяющие опрашивать как простейшие кнопки, так и организовать передачу данных по самым разным последовательным протоколам.

Подключиться к сети можно как по витой паре через Ethernet, так и через Wi-Fi. Можно подключаться к роутеру, а можно и напрямую. При прямом подключении через Wi-Fi превращаем в роутер телефон, а в случае Ethernet, если сеть предварительно не настроена, задать IP локальному компьютеру и поднять сеть можно командой:

Bash-4.2# ifconfig eth0 192.168.0.214 up

А отключить командой:

Bash-4.2# ifconfig eth0 down

В случае подключения по сети простейший способ получить доступ к Raspberry Pi и соответственно к камере это в командной строке набрать команду: ssh -l pi 192.168.0.198 где 192.168.0.198 адрес Raspberry Pi и ввести пароль raspberry

Bash-4.1$ ssh -l pi 192.168.0.198 [email protected]"s password: Linux raspberrypi 3.12.22+ #691 PREEMPT Wed Jun 18 18:29:58 BST 2014 armv6l Last login: Sat Sep 27 16:49:37 2014 from 192.168.0.215 pi@raspberrypi ~ $

Постоянный IP-адрес можно присвоить, отредактировав файл etc/network/interfaces, примерно так, как приведено ниже. Т.е. комментируем строку с dhcp и добавляем настройки, соответствующие Вашей локальной сети.

Auto lo iface lo inet loopback #iface eth0 inet dhcp iface eth0 inet static address 192.168.0.199 netmask 255.255.255.0 network 192.168.0.0 broadcast 192.168.0.255 gateway 192.168.0.1 allow-hotplug wlan0 iface wlan0 inet manual wpa-roam /etc/wpa_supplicant/wpa_supplicant.conf #iface default inet dhcp iface default inet static address 192.168.0.198 netmask 255.255.255.0 network 192.168.0.0 broadcast 192.168.0.255 gateway 192.168.0.1

На телефоне с Android надо установить какой-нибудь SSH Client. У меня установлен . Это общее решение аналогичное по стилю и возможностям с работой с большого компьютера. Есть и множество программ, заточенных именно под работу с Raspberry Pi. Я попробовал работать с и . Хотя в первой уже есть предустановки для работы с камерой, мне вариант с составлением собственного списка команд, который предлагается во второй, понравился больше.

Теперь у нас есть возможность напрямую обратится к камере и, например, заставить ее делать снимки при нажатии Enter:

Pi@raspberrypi ~ $ raspistill -o foto%03d.jpg -k -v -t 999999
raspistill Camera App v1.3.6 Width 2592, Height 1944, quality 85, filename foto%03d.jpg Time delay 999999, Raw no Thumbnail enabled Yes, width 64, height 48, quality 35 Link to latest frame enabled no Full resolution preview No Capture method: Capture on keypress Preview Yes, Full screen Yes Preview window 0,0,1024,768 Opacity 255 Sharpness 0, Contrast 0, Brightness 50 Saturation 0, ISO 0, Video Stabilisation No, Exposure compensation 0 Exposure Mode "auto", AWB Mode "auto", Image Effect "none" Metering Mode "average", Colour Effect Enabled No with U = 128, V = 128 Rotation 0, hflip No, vflip No ROI x 0.000000, y 0.000000, w 1.000000 h 1.000000 Camera component done Encoder component done Starting component connection stage Connecting camera preview port to video render. Connecting camera stills port to encoder input port Press Enter to capture, X then ENTER to exit

Программа raspistill предоставляет доступ практически ко всем возможностям камеры.

Image parameter commands -?, --help: This help information -w, --width: Set image width -h, --height: Set image height -q, --quality: Set jpeg quality <0 to 100> -r, --raw: Add raw bayer data to jpeg metadata -o, --output: Output filename (to write to stdout, use "-o -"). If not specified, no file is saved -l, --latest: Link latest complete image to filename -v, --verbose: Output verbose information during run -t, --timeout: Time (in ms) before takes picture and shuts down (if not specified, set to 5s) -th, --thumb: Set thumbnail parameters (x:y:quality) or none -d, --demo: Run a demo mode (cycle through range of camera options, no capture) -e, --encoding: Encoding to use for output file (jpg, bmp, gif, png) -x, --exif: EXIF tag to apply to captures (format as "key=value") or none -tl, --timelapse: Timelapse mode. Takes a picture every ms -fp, --fullpreview: Run the preview using the still capture resolution (may reduce preview fps) -k, --keypress: Wait between captures for a ENTER, X then ENTER to exit -s, --signal: Wait between captures for a SIGUSR1 from another process -g, --gl: Draw preview to texture instead of using video render component -gc, --glcapture: Capture the GL frame-buffer instead of the camera image Preview parameter commands -p, --preview: Preview window settings <"x,y,w,h"> -f, --fullscreen: Fullscreen preview mode -op, --opacity: Preview window opacity (0-255) -n, --nopreview: Do not display a preview window Image parameter commands -sh, --sharpness: Set image sharpness (-100 to 100) -co, --contrast: Set image contrast (-100 to 100) -br, --brightness: Set image brightness (0 to 100) -sa, --saturation: Set image saturation (-100 to 100) -ISO, --ISO: Set capture ISO -vs, --vstab: Turn on video stabilisation -ev, --ev: Set EV compensation -ex, --exposure: Set exposure mode (see Notes) -awb, --awb: Set AWB mode (see Notes) -ifx, --imxfx: Set image effect (see Notes) -cfx, --colfx: Set colour effect (U:V) -mm, --metering: Set metering mode (see Notes) -rot, --rotation: Set image rotation (0-359) -hf, --hflip: Set horizontal flip -vf, --vflip: Set vertical flip -roi, --roi: Set region of interest (x,y,w,d as normalised coordinates ) -ss, --shutter: Set shutter speed in microseconds Exposure mode options: auto,night,nightpreview,backlight,spotlight,sports,snow,beach,verylong, fixedfps,antishake,fireworks AWB mode options: off,auto,sun,cloud,shade,tungsten,fluorescent,incandescent,flash,horizon Image Effect mode options: none,negative,solarise,sketch,denoise,emboss,oilpaint,hatch,gpen,pastel, watercolour,film,blur,saturation,colourswap,washedout,posterise, colourpoint,colourbalance,cartoon Metering Mode options: average,spot,backlit,matrix Preview parameter commands -gs, --glscene: GL scene square,teapot,mirror,yuv,sobel -gw, --glwin: GL window settings <"x,y,w,h">

Если надо на удаленном компьютере получить живую картинку с камеры, то надо воспользоваться программой raspivid. Тут возможны два варианта.

Первый с использованием netcat . Сперва запускаем на локальном компьютере:

Nc -l -p 5001 | mplayer -fps 31 -cache 1024 -

А затем на Raspberry Pi:

Raspivid -t 999999 -w 640 -h 480 -fps 10 -o - | nc -v 192.168.0.24 5001

Где 192.168.0.24 IP адрес локального компьютера.

Второй вариант с использованием VLC. Повторить при написании этой статьи мне этот подвиг не удалось. Я следовал инструкции, изложенной . Причина, как оказалось, в обновлении до версии до 3.12.28+. Решается переустановкой VLC.

Задержка конечно будет, причем довольно сильно варьирующаяся от настроек управляющего компьютера.

Для удобства работы с командной строкой можно сделать некий графический интерфейс. Его можно запускать, как на удаленном компьютере, так и если установить VNC, то можно получить удаленный доступ к рабочему столу и соответственно запускать его на Raspberry Pi. Есть уже готовые решения: Pi Vision и RaspiCam Remote . Другой штатный способ управления камерой это python, для которого существует специальная библиотека picamera . Для меня главное это повторяемость результатов, т.е. от программы мне в первую очередь требуется возможность задать выдержку и чувствительность. Поскольку готового решения мне сразу не попалось, то я написал свое. (Вариант Pi Sight меня не устроил.) Подробнее программу я планирую рассмотреть в отдельной статье, а пока для желающих покопаться привожу исходный текст для Python 2.7.3 и picamera 1.8.

Для доступа через сеть к папкам Raspberry Pi можно в Dolphin набрать следующий адрес:

Fish://[email protected]:22/home/pi/

Для доступа к рабочему столу с удаленного компьютера я установил на Raspberry Pi с ОС Raspbian:

Sudo apt-get install tightvncserver

Если есть желание в дальнейшем пользоваться буфером обмена с локальной машиной через меню F8, то дополнительно устанавливаем:

Sudo apt-get install gsfonts-x11 xfonts-75dpi xfonts-100dpi autocutsel

И в файле /home/pi/.vnc/xstartup добавляем сточку autocutsel -fork после строки xsetroot -solid grey.

Включаем vncserver:

Pi@raspberrypi ~ $ vncserver:1 -geometry 800x480 New "X" desktop is raspberrypi:1 Starting applications specified in /home/pi/.vnc/xstartup Log file is /home/pi/.vnc/raspberrypi:1.log

Для доступа с настольного компьютера и ноутбука с ОС Slackware я установил пакет tightvnc.

Запускаем vncviewer, в появившемся окне вводим, в моем случае, адрес 192.168.0.198:1, затем пароль и получаем:

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

Для Android существует множество приложений. Мне показались относительно приемлемыми Remote Ripple , VNC Viewer , DesktopVNC В моем случае для подключения надо было задать адрес и порт 5901 и при подключении ввести пароль заданный для vncserver. Общая проблема этого способа управления камерой - эмуляция мыши, которую на маленьком экране телефона назвать комфортной сложно. На маленьком экране телефона для меня, пожалуй, наиболее удобным оказался VNC Viewer с постоянным размещением кнопок мыши внизу экрана.

В если отвлечься от индивидуальных пристрастий к удобству интерфейса, то для сетевых подключений уже написано достаточно программ, чтобы реализовать любой вид съемки. При работе с ноутбуком tightvnc, на мой взгляд, вполне комфортно позволяет работать с программой управления камерой запущенной на Raspberry Pi. Если необходима живая картинка именно на нем, то, возможно, стоит написать некий интерфейс к командам, отправляемым через SSH для удобства переключения между режимом потокового видео для просмотра и режимом съемки фотографий. В этом случае особых преимуществ в использовании python я не вижу и можно ограничиться вызовом raspistill и raspivid.