Плата Raspberry Pi находит широкое применение в различных проектах, относящихся к тематике интернета вещей (Internet of Things, IoT), во многом благодаря тому что у нее есть встроенные Wi-Fi и Bluetooth, в настоящее время являющиеся самыми популярными протоколами беспроводной связи. В данной статье мы рассмотрим управление контактами ввода/вывода (GPIO) платы Raspberry Pi через Bluetooth и Android приложение. Ранее на нашем сайте мы рассматривали аналогичный проект для платы Arduino.
В данном проекте мы использовали плату Raspberry 2 Pi Model B, у которой нет встроенного модуля Bluetooth, поэтому для использования в ней возможностей данного протокола мы использовали простой USB Bluetooth адаптера. Для демонстрации возможностей данного проекта мы использовали светодиод, подключенный к плате Raspberry Pi через резистор 220 Ом. В данном проекте для беспроводной связи между смартфоном и платой Raspberry Pi мы использовали протокол RFCOMM Bluetooth.
Программирование Bluetooth в языке Python основано на концепции программирования сокетов (socket programming) и взаимодействие между Bluetooth устройствами в данном случае осуществляется через RFCOMM сокет. RFCOMM (Radio Frequency Communication) представляет собой Bluetooth протокол, который обеспечивает эмуляцию последовательного порта RS-232 и также известен под именем Serial Port Emulation. Профиль последовательного порта Bluetooth основан на этом протоколе. RFCOMM является достаточно популярным приложением Bluetooth поскольку он обеспечивается хорошей поддержкой и имеет свободно доступные инструменты API
Для работы с данным протоколом в нашем проекте мы будем использовать Bluetooth модуль HC-06, на нашем сайте вы можете посмотреть все проекты, в которых он был использован.
Установка необходимых пакетов для работы с Bluetooth в Raspberry Pi
Первым делом нам необходимо установить последние обновления для операционной системы Raspberry Pi OS:
1 2 |
sudo apt-get update sudo apt-get upgrade |
Затем нам необходимо установить последние обновления для работы с Bluetooth:
1 |
sudo apt-get install bluetooth blueman bluez |
После этого необходимо перезагрузить плату Raspberry Pi:
1 |
sudo reboot |
BlueZ – это проект с открытым исходным кодом и официальный стек протоколов Bluetooth для операционной системы Linux. Он поддерживает все ядро протоколов Bluetooth и в настоящее время является официальной частью Linux Kernel (ядра Linux).
Blueman обеспечивает интерфейс рабочего стола для управления Bluetooth устройствами.
Также нам потребуется библиотека Python для работы с протоколом Bluetooth чтобы мы могли в программе передавать и принимать данные через RFCOMM:
1 |
sudo apt-get install python-bluetooth |
Также необходимо установить библиотеку обеспечения работы с контактами ввода/вывода (GPIO) в Raspberry Pi:
1 |
sudo apt-get install python-rpi.gpio |
На этом установка всех необходимых пакетов для работы с Bluetooth в Raspberry Pi будет закончена.
Соединение устройств по Bluetooth
В данном проекте мы будем соединять по Bluetooth смартфон на операционной системе Android с платой Raspberry Pi. Ранее мы уже установили в Raspberry Pi стек протоколов BlueZ, который обеспечивает нам утилиту с командной строкой под названием “bluetoothctl”, с помощью которой можно управлять Bluetooth устройствами. Но перед этим убедитесь в том, что ваш USB Bluetooth адаптер подключен к плате Raspberry Pi (для плат, у которых нет встроенного Bluetooth) и проверьте определяется он системой или нет, с помощью команды:
1 |
lsusb |
После этого запустите утилиту bluetoothctl с помощью команды:
1 |
sudo bluetoothctl |
Вы можете проверить все команды утилиты bluetoothctl, введя команду ‘help’. Поэтому вы можете ввести следующие команды в указанном порядке:
1 2 3 4 5 |
[bluetooth]# power on [bluetooth]# agent on [bluetooth]# discoverable on [bluetooth]# pairable on [bluetooth]# scan on |
Когда вы введете последнюю команду в этом списке (“scan on”), вы в списке устройств должны увидеть смартфон. Убедитесь при этом в том, что Bluetooth на вашем устройстве включен и он видим другим устройствам. После этого скопируйте MAC адрес вашего устройства и подключите его с помощью следующей команды:
1 |
pair <address of your phone> |
После этого вам нужно будет ввести пароль или Pin в вашей терминальной консоли и нажать enter. Затем необходимо ввести этот же самый пароль в вашем смартфоне. После этого ваш смартфон и плата Raspberry Pi будут соединены по протоколу Bluetooth. Более подробно весь этот процесс можно посмотреть на видео, приведенном в конце статьи.
Также вместо описанных действий вы можете использовать интерфейс рабочего стола (Desktop interface) чтобы подключить вашу плату Raspberry Pi к смартфону по Bluetooth. После установки Blueman (мы рассмотрели это ранее в статье) вы увидите иконку Bluetooth на рабочем столе вашей Raspberry Pi OS как показано на следующем рисунке. Таким образом, вы можете использовать Blueman для соединения по Bluetooth вашего смартфона и платы Raspberry Pi.
Схема проекта
Схема проекта для управления контактами ввода/вывода (GPIO) Raspberry Pi через Bluetooth представлена на следующем рисунке.
Как видите, схема крайне проста – необходимо просто подключить светодиод к контакту PIN 40 (GPIO 21) платы Raspberry Pi через резистор 220 Ом.
Управление светодиодом с помощью Android приложения BlueTerm
Теперь, когда мы соединили по Bluetooth смартфон и плату Raspberry Pi, нам необходимо установить приложение для Android, которое будет взаимодействовать с Raspberry Pi через последовательный адаптер Bluetooth (Bluetooth Serial Adapter). Как говорилось ранее, протокол RFCOMM/SPP эмулирует последовательную связь через Bluetooth, поэтому мы установим Android приложение BlueTerm, которое поддерживает данный протокол.
Также в этом проекте вы можете использовать любое другое приложение терминала Bluetooth, которое поддерживает связь через сокет RFCOMM.
После того как вы скачали и установили приложение BlueTerm, запустите на выполнение программу нашего проекта на Raspberry Pi (приведена в конце статьи) и соедините между собой по Bluetooth плату Raspberry Pi и приложение BlueTerm.
После того, как соединение будет успешно установлено, вы увидите надпись connected:raspberrypi в правом верхнем углу приложения BlueTerm как показано на следующем рисунке.
Теперь вы можете вводить в приложении BlueTerm символы ‘1’ или ‘0’ чтобы, соответственно, включать (GPIO pin HIGH) или выключать (GPIO pin LOW) светодиод в схеме проекта. Для выхода из программы нажмите ‘q’. Также в этом проекте вы можете использовать голосовую клавиатуру от гугла (Google Voice Typing Keyboard) для управления контактами платы Raspberry Pi с помощью голоса.
Таким образом, мы рассмотрели, каким образом можно управлять контактами ввода/вывода (GPIO) платы Raspberry Pi через Bluetooth и Android приложение.
Объяснение программы для Raspberry Pi
Полный код программы приведен в конце статьи, здесь же мы кратко рассмотрим его основные фрагменты.
Первым делом в программе нам необходимо подключить библиотеку для работы с сокетами Bluetooth, которая позволит управлять протоколом Bluetooth из программы на Python.
1 |
import Bluetooth |
Далее идет фрагмент кода, ответственный за связь по протоколу Bluetooth.
1 2 3 4 5 6 7 8 9 10 11 |
server_socket=bluetooth.BluetoothSocket( bluetooth.RFCOMM ) port = 1 server_socket.bind(("",port)) server_socket.listen(1) client_socket,address = server_socket.accept() print "Accepted connection from ",address while 1: data = client_socket.recv(1024) |
В этом фрагменте кода мы использовали следующие команды:
- server_socket=bluetooth.BluetoothSocket( bluetooth.RFCOMM ) – создание сокета для связи по Bluetooth RFCOMM;
- server_socket.bind(("", port) – сервер "привязывает" скрипт хоста к порту;
- server_socket.listen(1) – единовременно сервер будет принимать только одно соединение;
- client_socket, address = server_socket.accept() – сервер принимает запрос клиентского соединения и ассоциирует mac адрес с адресом переменной, client_socket – это клиентский сокет;
- data = client_socket.recv(1024) – принимаем данные через клиентский сокет client_socket и сохраняем их в переменной data. Единовременно можно принять максимум 1024 символа.
И, наконец, в конце программы закрываем клиентское и серверное соединение с помощью следующих команд:
1 2 |
client_socket.close() server_socket.close() |
Вы можете модифицировать данный проект, добавив в него, к примеру, реле, с помощью которых можно будет включать/выключать различные домашние устройства. Таким образом, вы можете реализовать проект автоматизации дома с управлением домашними устройствами по Bluetooth со смартфона.
Исходный код программы на Python
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 |
import bluetooth import RPi.GPIO as GPIO # подключение библиотеки для работы с контактами ввода/вывода LED=21 GPIO.setmode(GPIO.BCM) # мы будем программировать контакты GPIO по их функциональным номерам (BCM), то есть мы будем обращаться к PIN40 как ‘GPIO21’ GPIO.setwarnings(False) # отключаем показ любых предупреждений GPIO.setup(LED,GPIO.OUT) # инициализируем GPIO21 в качестве цифрового выхода GPIO.output(LED,0) server_socket=bluetooth.BluetoothSocket( bluetooth.RFCOMM ) port = 1 server_socket.bind(("",port)) server_socket.listen(1) client_socket,address = server_socket.accept() print "Accepted connection from ",address while 1: data = client_socket.recv(1024) print "Received: %s" % data if (data == "0"): # если из Android приложения передается '0', выключаем светодиод print ("GPIO 21 LOW, LED OFF") GPIO.output(LED,0) if (data == "1"): # если из Android приложения передается '1', включаем светодиод print ("GPIO 21 HIGH, LED ON") GPIO.output(LED,1) if (data == "q"): print ("Quit") # выход из программы break client_socket.close() server_socket.close() |