PyOR

Материал из roboforum.ru Wiki

Перейти к: навигация, поиск


PyOR — это библиотека на языке Python для работы с шлюз-контроллером Open Robotics с прошивкой i2c-gate. Предоставляет простой интерфейс для рпботы с регистрами, поддерживает мульти-старт.

Системные требования

  • Интерпретатор python
  • Библиотека pyserial

Установка

Скачайте архив http://hg.vehq.ru/pyor/archive/0.1.0.tar.gz Распакуйте куда угодно, в директории pyor-0.1.0 запустите в консоли:

python setup.py install

При этом вы должны обладать правами на запись в системные каталоги питона.

Shell:

cd /tmp
wget http://hg.vehq.ru/pyor/archive/0.1.0.tar.gz
tar xf pyor-0.1.0.tar.gz
cd pyor-0.1.0
sudo python setup.py install

Примеры

В качестве примера можно посмотреть testio.py или даже запустить

python testio.py /dev/or-serial-port
# Первое необходимое действие — подключить нужные библиотеки:
import serial
import pyor
from pyor import testio
 
# За тем открыть последовательный порт (для примера bluetooth com на линуксе — /dev/rfcomm0):
ser = serial.Serial('/dev/rfcomm0', 9600)
 
# для логирования чтения/записи в порт можно воспользоваться LogIO
logio = testio.LogIO(ser)
 
# собственно создание основного элемента системы — объект запросов
req = pyor.Request(logio)
 
# настройка параметров i2c-gate:
 
# 1. установить адрес внутреннего логического устройства на шине I2C
#    для присвоения будет послан запрос на смену адреса — L40
req.localhost = 0x40
 
# 2. установить частоту тактовых импульсов шины I2C
#    будет послан запрос на смену частоты — C0064
req.busfreq = 100 # кГц
 
# 3. можно проверить версию протокола
ver = req.protocol_version # -> '1.0'
 
# 4. можно выполнить сброс шины
req.clearbus()
 
# теперь можно оперировать с регистрами и делать I2C запросы
# 1. Примеры работы с регистрами:
 
# записать в регистр 42h(PORTC) FFh
req.set_reg(register=0x42, data=0xff)
 
# прочитать состояние регистра 42h(PINC)
port = req.get_reg(register=0x42) # -> [0xff]
 
# прочитать ячейку 01h на устройстве 20h (I2C-It)
range = req.get_reg(0x20, 0x01)
 
# 2. Примеры простых запросов I2C:
 
# запрос на чтение одного байта из устройства 20h
req.i2cread_req(0x21, 1)
range = req.response() # -> ['SR', [0x54]]
 
# запрос на запись в устройство 20h
req.i2cwrite_req(0x20, [0x00, 0x01, ])
req.response() # -> ['SW', [True, True]]
 
# 3. Мульти-старт запросы
 
# записать параметры мотора одним махом:
l = req.localhost
with req.transaction():
    req.i2cwrite_req(l, [0x62, 0])
    req.i2cwrite_req(l, [0x63, 0])
    req.i2cwrite_req(l, [0x60, 0x50])
    req.i2cwrite_req(l, [0x61, 0x50])
req.response() # -> [['SW', [True, True]], ['SW', [True, True]], ['SW', [True, True]], ['SW', [True, True]]]
 
# прочитать состояния портов за одинзапрос:
l = req.localhost
with req.transaction():
    req.i2cwrite_req(l, 0x40)
    req.i2cread_req(l)
    req.i2cwrite_req(l, 0x41)
    req.i2cread_req(l)
    req.i2cwrite_req(l, 0x42)
    req.i2cread_req(l)
    req.i2cwrite_req(l, 0x43)
    req.i2cread_req(l)
req.response() # -> [['SW', [True]], ['SR', [0x00]], ['SW', [True]], ['SR', [0x00]], 
               #     ['SW', [True]], ['SR', [0x00]], ['SW', [True]], ['SR', [0x00]]]
 
# в конце программы не забудьте освободить ресурсы
# иначе на некоторых ОС могут быть проблемы с повторным открытием порта
res.close()

Пример оконной программы можно получить тут: qtiger.py

Источник — «http://roboforum.ru/wiki/PyOR»