XMLRPC Client — управление внешними устройствами

GnuRadio — мощная вещь, и сейчас мы в этом убедимся еще раз. До этого момента мы взаимодейстововали только с между схемами созданными GnuRadio. Но настало время сделать что-то более интересное. В данной статье мы будем управлять светодиодом при помощи GnuRadio.
Нырнем поглубже.
Для начала задумаемся, что происходит когда мы нажимаем кнопку «Run»? GnuRadio в этот момент генерирует Python скрипт, и запускает его на исполнение. Для того чтобы запустить наш граф на другом компьютере, нам не требуется grc файл, а только сгенерированный Python скрипт. Но если наш граф всего лишь скрипт на Питоне, то давате взглянем на его внутренности.
Откроем код скрипта, сгенерированного для сервера из нашего старого примера.
Обратим внимание на секцию импорта

import SimpleXMLRPCServer

и строки кода чуть ниже

        self.xmlrpc_server_0 = SimpleXMLRPCServer.SimpleXMLRPCServer(("localhost", 8080), allow_none=True)
        self.xmlrpc_server_0.register_instance(self)

Погуглив немного по ключевому слову «SimpleXMLRPCServer» мы обнаруживаем что это, штатный модуль Питона. Хм… Но раз это штатный модуль, и он есть везде где установлен Питон, то можно написать скрипт который будет без всяких проблем взаимодействовать с клиентом созданым GnuRadio.
Чем бы нам поуправлять? Конечно же, классическая задача, поморгать светодиодиком!
Итак, нам потребуется устройство, к которому можно подключить светодиод, и которое способно выполнять скрипты на Питоне. Вы наверно уже догадались что речь идет о Raspberry Pi.
У меня завалялся RGB светодиод. Подключим его по следующей простой схеме.
sheme

Набросаем интерфейс управления
Добавим на граф три блока WX GUI Chooser, и настроим их как двухпозиционные кнопки. Подробно о настройке Chooser’а я рассказывал в предыдущей статье. Значения для каждого состояния кнопки будут «0» и «1», False и True соответственно.
ledcontrol1Добавляем блоки XMLRPC Client. Про них я тоже уже рассказывал ранее
Настраиваем  их как показано на рисунке.
ledcontrol2
В итоге мы должны получить следующий граф.
ledcontrol3

Теперь займемся написанием кода для Raspberry Pi.

#!/usr/bin/python
import RPi.GPIO as GPIO
import timefrom SimpleXMLRPCServer import SimpleXMLRPCServer
from SimpleXMLRPCServer import SimpleXMLRPCRequestHandler
GPIO.setmode(GPIO.BOARD)
GPIO.setwarnings(False)
# Подключем ножки светодиодов к пинам 22, 24, 26
RED = 24
BLUE = 22
GREEN = 26
#Настраваем пины на выход
GPIO.setup(RED, GPIO.OUT)
GPIO.setup(BLUE, GPIO.OUT)
GPIO.setup(GREEN, GPIO.OUT)
#Устанавливаем низкий уровень на пинах
GPIO.output(RED, False)
GPIO.output(BLUE, False)
GPIO.output(GREEN, False)


class RequestHandler(SimpleXMLRPCRequestHandler):
            rpc_paths = ('/RPC2',)
#Создаем сервер, и запускаем его на порту 8088
# 10.21.32.9 - IP адрес Raspberry Pi в моей сети
server = SimpleXMLRPCServer(("10.21.32.9", 8088),
                requestHandler=RequestHandler,
                logRequests = False,
                 allow_none=True)
server.register_introspection_functions()
#Регистрируем три наши функции, которые мы задали в клиентах
#Как только на клиенте будет нажата соответствующая кнопка,
# сервер вызовет соответствующую callback функцию передав ей параметр 1 или 0 (включен или выключен)
class ControlFunctions:
        def set_red_led(self, x):
                GPIO.output(RED, x)
        def set_blue_led(self, x):
                GPIO.output(BLUE, x)
        def set_green_led(self, x):
                GPIO.output(GREEN, x)
#Запускаем наш сервер
server.register_instance(ControlFunctions())
server.serve_forever()

Ну что, настало время проверки.
Запускаем наш скрипт на Raspberry Pi от рута
sudo ./rgb_gnurad.py

И запускаем наш граф в GnuRadio

Смотрим что получилось.

ledcontrol.grc
led_control.py
rgb_gnurad.py

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

Ваш адрес email не будет опубликован. Обязательные поля помечены *