PyOR — различия между версиями

Материал из roboforum.ru Wiki
Перейти к: навигация, поиск
(Создана новая страница размером Категория:Open Robotics PyOR — это библиотека на языке Python для работы с шлюз-ко...)
 
Строка 3: Строка 3:
 
PyOR — это библиотека на языке [[Python]] для работы с шлюз-контроллером [[Open Robotics]] с прошивкой [[i2c-gate]].
 
PyOR — это библиотека на языке [[Python]] для работы с шлюз-контроллером [[Open Robotics]] с прошивкой [[i2c-gate]].
 
Предоставляет простой интерфейс для рпботы с регистрами, поддерживает мульти-старт.
 
Предоставляет простой интерфейс для рпботы с регистрами, поддерживает мульти-старт.
 +
 +
== Системные требования ==
 +
* Интерпретатор python
 +
* Библиотека pyserial
  
 
== Установка ==
 
== Установка ==
Строка 26: Строка 30:
 
   
 
   
 
  python testio.py /dev/or-serial-port
 
  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>

Версия 04:50, 8 мая 2009


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

res.close() </source>