Raspberry Pi: установка библиотеки rpilot62.ru для python | Класс робототехники

Выпуск 17. Июль 2014

← Асинхронный ввод/вывод с IO::AIO | Содержание | Обзор CPAN за июнь 2014 г. →


Использование портов GPIO в Raspberry Pi. Часть 1

В этой статье рассказано о том, как устроены универсальные порты ввода-вывода (GPIO) и о том, как работать с ними на перле.

Одноплатный компьютер Raspberry Pi примечателен не только своими размером и ценой, но и наличием порта ввода-вывода общего назначения (General Purpose Input-Output, GPIO).

Эдакая современная версия параллельного LPT-порта, которая вместе с компьютером занимает меньше места, чем плата PCI с контроллером LPT.

Базовая информация о портах

В базовом комплекте второй версии Raspberry Pi установлен один 26-контактный разьем (он обозначен на плате как P1), в котором доступно 17 портов ввода-вывода (тех самых GPIO). Остальные восемь контактов подключены к земле или к питанию +3,3 В и +5 В. Выводы, отданные под GPIO, могут быть программно переконфигурированы для работы в качестве последовательных портов, вывода с широтно-импульсной модуляцией и еще как-то (вот это все называется альтернативными режимами). Но по умолчанию после включения питания все контакты работают в режиме «один контакт — один бит». Каждый из них может быть либо входом, либо выходом (по умолчанию включен режим ввода).

Кроме упомянутого разъема P1 на плате есть отверстия для установки восьмиконтактного разъема P5, который дает возможность получить еще четыре порта GPIO. Итого в распоряжении программиста оказывается 21 бинарный порт.

Наличие GPIO позволяет относительно легко связывать компьютер с устройствами из реального мира и управлять ими программно. Разумеется, здесь потребуется знание не только программирования, но и хотя бы основ электроники (детям рекоменую книгу В. Т. Полякова «Посвящение в радиоэлектронику», взрослым — книгу П. Хоровица и У. Хилла «Искусство схемотехники»).

При работе с GPIO важно учитывать пару моментов:

  1. Рабочее напряжение всех выводов — 3,3 В. Случайная подача на вход GPIO большего напряжения (даже 5 В с соседнего штырька разъема) приводит к выходу из строя не только этого вывода, но и вообще всего Raspberry Pi (подтверждаю экспериментально).
  2. Контакты разъема P1 и нумерация портов GPIO не совпадает, поэтому при программировании надо всегда помнить, какая из нумераций используется. Еще более они не совпадают в первой версии Raspberry (надеюсь, сейчас, если не прилагать дополнительных усилий, купить удастся только новую модель).
  3. Дополнительным пунктом надо отметить, что нумерация самих GPIO в Raspberry Pi идет с пропусками.
  4. Raspberry Pi построен на ARM-процессоре BCM2835, поэтому иногда полезнее гуглить BCM2835, а не Raspberry GPIO (то же самое действительно для поиска на CPAN).

Хорошее практическое описание опубликовано на странице elinux.org/RPi_Low-level_peripherals.

Для справки, вот так разведены порты GPIO на контакты разъемов P1 и P5 (контакты традиционно обозначаются в формате PX-NN, где X — номер раъема, а NN — двузначный номер контакта):

  1. GPIO02 — P1-03
  2. GPIO03 — P1-05
  3. GPIO04 — P1-07
  4. GPIO07 — P1-26
  5. GPIO08 — P1-24
  6. GPIO09 — P1-21
  7. GPIO10 — P1-19
  8. GPIO11 — P1-23
  9. GPIO14 — P1-08
  10. GPIO15 — P1-10
  11. GPIO17 — P1-11
  12. GPIO18 — P1-12
  13. GPIO22 — P1-15
  14. GPIO23 — P1-16
  15. GPIO24 — P1-18
  16. GPIO25 — P1-22
  17. GPIO27 — P1-13
  18. GPIO28 — P5-03
  19. GPIO29 — P5-04
  20. GPIO30 — P5-05
  21. GPIO31 — P5-06

Каждый битовый порт способен работать в режиме ввода или вывода. Кроме того, в режиме ввода может быть дополнительно включен подтягивающий резистор, что поможет максимально упростить способ подключения выключателей — их достаточно подключить между соответствующим выводом GPIO и общим проводом (если включен резистор pull up) или между GPIO и источником питания +3,3 В (если выход сконфигурирован в режиме pull down).

За более детальными продробностями о внутреннем устройстве портов GPIO я отсылаю читателя к шестой главе «General Purpose I/O (GPIO)» мануала по процессору BCM2835.

Регистры для работы с GPIO

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

Процессор BCM2835 имеет 41 32-разрядный регистр, которые полностью определяют режим и состояние портов GPIO. В частности, для установки единичного значения на выводе, запрограммированном на работу как выход, необходимо записать единичный бит в соответствующий разряд одного из двух регистров установки битов GPIO Pin Output Set Registers (GPSETn). Чтобы установить выход в ноль, следует выставить единичный бит в регистрах сброса битов GPIO Pin Output Clear Registers (GPCLRn).

Такая на первый взгляд странная схема позволяет независимо устанавливать и сбрасывать любой бит GPIO без необходимости чтения текущего состояния выводов.

Аналогично, когда разряды GPIO работают на чтение, то узнать уровень входного сигнала можно, прочитав значение одного из двух портов GPIO Pin Level Registers (GPLEVn), каждый бит которого отображает текущее состояние входного разряда.

Программирование портов ввода-вывода

Регистры, отвечающие за работу с GPIO, расположены по адресам 0x7E200000—0x7E2000B0, которые отображаются на физическую память с адресами, начинающимися с 0x20200000. В принципе, в этом месте уже можно было бы начать управлять портами, программируя чтение и запись нужных битов в эти регистры (на перле это вполне возможно, если воспользоваться мапингом переменных на области памяти, используя модуль Sys::Mmap).

Но более практично еще немного усложнить систему, чтобы программировать стало легче.

Модуль Device::BCM2835

Для управления портами ввода-вывода на перле удобно воспользоваться модулем Device::BCM2835. Он является Perl-оберткой над C-библиотекой того же автора bcm2835 и один в один повторяет все ее функции (поэтому документацию может оказаться полезнее почитать в оригинале).

Установка библиотеки bcm2835 не вызывает сложностей:

Равно как и модуль со CPAN:

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

Все дальнейшие действия необходимо выполнять от имени суперпользователя.

Перед началом работы следует вызвать функцию :

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

Вызов теоретически может завершиться неудачой, хотя наиболее вероятная причина отказа — запуск скрипта не от рута:

Примечание ко всем примерам кода из документации.

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

записывать:

Вывод

Чтобы переключить один из разрядов порта GPIO для работы в режиме вывода, надо вызвать функцию установки режима и передать ей номер вывода (константу, соответствующую номеру физического вывода нужного разъема) и режим (другую определенную константу). Например, чтобы перевести выход P1-12 в режим вывода, следует выполнить следующее:

Запись нуля или единицы выполняют, либо вызывая функцию :

Либо используя пару функций и , которым достаточно передать номер вывода:

Обратите внимание, что в обоих примерах физический вывод P1-12 () является логическим выходом GPIO18. А еще обратите внимание на наличие в именах констант. Для первой версии Raspberry Pi следует использовать константы типа , которые за парой исключений совпадают с вариантами с . Но следует иметь в виду, что порт P5 доступен только во второй версии, например: для GPIO29.

Ввод

Чтение данных с портов ввода-вывода также прост, как и запись в них. Прежде всего, необходимо перевести соответствующие разряды GPIO в режим чтения (BCM2835_GPIO_FSEL_INPT):

По желанию и необходимости можно подключить один из подтягивающих резисторов:

В случае, если к выводу порта подключена кнопка, замыкающая вывод на землю, то будет полезен резистор, подключенный к источнику питания +3,3 В (BCM2835_GPIO_PUD_UP), что обеспечит на входе уровень логической единицы, когда кнопка не нажата. При нажатой кнопке на входе окажется логический нуль.

Чтобы прочитать значение со входа, достаточно вызвать функцию , передав ей номер нужного входа:

Функция возвращает либо нуль, либо единицу.

Примеры

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

Код из первого примера раз в секунду включает и выключает светодиод, подключенный (через резистор сопротивлением 300…1000 Ом) к выводу GPIO03 (контакт P1-05).

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

Второй пример включает тот же светодиод при нажатии на кнопку, подключенную ко входу GPIO15 (P1-10).

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

Андрей Шитов


← Асинхронный ввод/вывод с IO::AIO | Содержание | Обзор CPAN за июнь 2014 г. →

Комментарии к статье

The Raspberry Pi Internet of Things Toolkit — Now in two flavors

Cayenne — The Spicy one

  • Bundled WebIOPi as core component
  • Raspberry Pi 2 & 3 support
  • Quick Setup, including 1 TAP install from Mobile
  • Customizable Drag & Drop Dashboard
  • Mobile Application
  • Alert & Trigger
  • Scheduler
  • History

WebIOPi — The Original one

  • Control, debug, and use your Pi's GPIO, sensors and converters from a web browser or any app
  • WebIOPi is the perfect Swiss-knife to make connected things
  • Developed and provided by Eric PTAK (trouch)
  • Runs on Raspberry Pi

Features

  • Written in Python, with facilities to load and execute custom script, using a comprehensive structure with setup and loop functions
  • Unified Serial/SPI/I2C support with a complete and consistent set of functions to control more than 30 devices, including most used analog converters, I/O expander and sensors
  • Javascript/HTML client library to make Web UI
  • Python/Java clients, to make Pi-to-Pi systems or Android applications
  • CoAP support brings the best Internet of Things protocol on the Pi, as a future proof of Pi possibilities
  • Includes simple web apps, to debug GPIO, devices and Serial interface

The GPIO header web application is included to quickly debug and controls GPIO.

Device monitor web app

The device monitor allows to debug and controls converters or sensors plugged in the GPIO/SPI/I2C…

В данной статье вы узнаете как развернуть на RaspberryPi полноценный веб сервер доступный по сети с PHP и MySQL. RPi отлично подходит для сервера через который не будет проходить много трафика, он использует около 5Вт и абсолютно безшумный.

Необходимо:

1) Блок питания (Micro USB)
2) Сетевой кабель
3) SSH клиент для подключения с компьютера к RPi
4) Примерно час времени

Итак, как устанавливать ОС я описывал ранее Raspberry Pi: Первый запуск. Сейчас предполагается что в нашей Raspberry все установлено и включен SSH.

Подключение по SSH:

Запускаем SSH клиент. я использую PuTTY.

В хосте указываем IP адрес Raspberry. В логине указываем pi пароль тот который указывали при установке ОС (по умолчанию raspberry
) порт 22.
По желанию можно менять пароль используя команду:

sudo -i
passwd pi

затем введите новый пароль и подтвердите нажатием Enter

Установка Apache и PHP:

Запускаем SSH сессию.
Для начала обновим список репозиториев и поиск индексов обновленных версий программ, драйверов, ядра и всего прочего:
sudo apt-get update

Начнем установку Apache и выполним команду:

sudo apt-get install apache2 php5 libapache2-mod-php5

когда спросит хотите ли продолжить нужно нажать Y и подтверждаем [Enter]
Установка займет некоторое время, ждем.
Во время установки можно заметить что произошла ошибка, чтобы ее решить выполним:

sudo groupadd www-data

Перезагружаем Apache:

sudo service apache2 restart

Теперь если набрать адрес Raspberry в браузере откроется стартовая страница.

Если выводится белая страница или ошибка скорее всего нужно исправить права доступа к файлам:
sudo adduser user www-data
chown user:www-data -R public_html
chmod -R 775 public_html
где user в первой строке это логин пользователя под которым авторизован

Чтобы включить Htaccess нужно изменить конфиг файл:

sudo nano /etc/apache2/sites-enabled/000-default

меняем строку AllowOverride None на AllowOverride ALL
Жмем [Ctrl]+[X] затем Y проверяем путь и подтверждаем Enter
Перезагружаем Apache:

sudo service apache2 restart

Установка MySQL:

Набираем команду которая начнет установку MySQL:

sudo apt-get install mysql-server mysql-client php5-mysql

когда спросит хотите ли продолжить нужно нажать Y и подтверждаем Enter
Через некоторое время появится экран с просьбой установить пароль для root пользователя MySQL

Введите пароль и подтверждаем нажатием Enter.

Ждем окончания установки.

Установка FTP сервера:

Установим vsftpd:

sudo chown -R pi /var/www <= обязательно
sudo apt-get install vsftpd

Изменим конфиг файл FTP сервера:

sudo nano /etc/vsftpd.conf

ищим строку anonymous_enable=YES на anonymous_enable=NO
и убираем # в начале строки:
#local_enable=YES меняем на local_enable=YES
#write_enable=YES меняем на write_enable=YES
в конец файла добавляем строку
force_dot_files=YES
Сохраняем [Ctrl]+[X] затем Y проверяем путь и подтверждаем Enter
Перезагружаем FTP:

sudo service vsftpd restart

Выполняем не хитрые действия:

sudo -i
passwd root
Вводим пароль и подтверждаем Enter
exit
exit

Запускаем новую сессию SSH
Логин пользователя: root
Пароль: тот который только что установили

nano /etc/passwd

ищем похожую строку pi:x;1000:1000:Raspberry Pi User,,,:home/pi:/bin/bash и в начале этой строки вставляем #чтобы получилось так #pi:x;1000:1000:Raspberry Pi User,,,:home/pi:/bin/bash
Сохраняем [Ctrl]+[X] затем Y проверяем путь и подтверждаем Enter
Выполняем команду

usermod -d /var/www pi

закрываем эту сессию SSH

Открываем новую и входим под своим пользователем pi
Выполняем:

sudo -i
usermod -L root
exit

Теперь можно подключатся к RaspberryPi через FTP клиент используя такие настройки:
Host: (сетевой IP адрес Малинки)
Username:pi
Password: (паролько который вводился при установке)
Port: 21

Установка phpMyAdmin:

Итак, ставим phpmyadmin:

sudo apt-get install phpmyadmin

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

Перезапускаем Apache2:

sudo service apache2 restart

Открываем файл конфигурации Apache2:

sudo nano /etc/apache2/apache2.conf

В конец файла вставляем строку Include /etc/phpmyadmin/apache.conf
Сохраняем [Ctrl]+[X] затем Y проверяем путь и подтверждаем Enter

Снова перезапускаем Apache2:

sudo service apache2 restart

Пробуем зайти из браузера своего компьютера:
http://ip-raspberry/phpmyadmin ( вместо ip-raspberry нужно ввести IP адрес своей RaspberryPi)

Важно: если при открытии phpMyAdmin возникла ошибка Forbidden You don’t have permission to access / on this server. делаем следующее:

sudo usermod -a -G www-data pi
sudo chgrp -R www-data /var/www
sudo chmod -R g+w /var/www
sudo find /var/www -type d -exec chmod 2775 {} \;
sudo find /var/www -type f -exec chmod ug+rw {} \;

Все, готово! =)

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

Добавить комментарий

Закрыть меню