PyOR
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
<source lang="python">
- Первое необходимое действие — подключить нужные библиотеки:
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(l, 0x40) req.i2cread(l) req.i2cwrite(l, 0x41) req.i2cread(l) req.i2cwrite(l, 0x42) req.i2cread(l) req.i2cwrite(l, 0x43) req.i2cread(l)
req.response() # -> [['SW', [True]], ['SR', [0x00]], ['SW', [True]], ['SR', [0x00]],
# ['SW', [True]], ['SR', [0x00]], ['SW', [True]], ['SR', [0x00]]]
- в конце программы не забудьте освободить ресурсы
- иначе на некоторых ОС могут быть проблемы с повторным открытием порта
res.close() </source>