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

<source lang="python">

  1. Первое необходимое действие — подключить нужные библиотеки:

import serial import pyor from pyor import testio

  1. За тем открыть последовательный порт (для примера bluetooth com на линуксе — /dev/rfcomm0):

ser = serial.Serial('/dev/rfcomm0', 9600)

  1. для логирования чтения/записи в порт можно воспользоваться LogIO

logio = testio.LogIO(ser)

  1. собственно создание основного элемента системы — объект запросов

req = pyor.Request(logio)

  1. настройка параметров i2c-gate:
  1. 1. установить адрес внутреннего логического устройства на шине I2C
  2. для присвоения будет послан запрос на смену адреса — L40

req.localhost = 0x40

  1. 2. установить частоту тактовых импульсов шины I2C
  2. будет послан запрос на смену частоты — C0064

req.busfreq = 100 # кГц

  1. 3. можно проверить версию протокола

ver = req.protocol_version # -> '1.0'

  1. 4. можно выполнить сброс шины

req.clearbus()

  1. теперь можно оперировать с регистрами и делать I2C запросы
  2. 1. Примеры работы с регистрами:
  1. записать в регистр 42h(PORTC) FFh

req.set_reg(register=0x42, data=0xff)

  1. прочитать состояние регистра 42h(PINC)

port = req.get_reg(register=0x42) # -> [0xff]

  1. прочитать ячейку 01h на устройстве 20h (I2C-It)

range = req.get_reg(0x20, 0x01)

  1. 2. Примеры простых запросов I2C:
  1. запрос на чтение одного байта из устройства 20h

req.i2cread_req(0x21, 1) range = req.response() # -> ['SR', [0x54]]

  1. запрос на запись в устройство 20h

req.i2cwrite_req(0x20, [0x00, 0x01, ]) req.response() # -> ['SW', [True, True]]

  1. 3. Мульти-старт запросы
  1. записать параметры мотора одним махом:

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]]]

  1. прочитать состояния портов за одинзапрос:

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]]]
  1. в конце программы не забудьте освободить ресурсы
  2. иначе на некоторых ОС могут быть проблемы с повторным открытием порта

res.close() </source>

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