реклама на сайте
подробности

 
 
 
Reply to this topicStart new topic
> RPi + multiservo(amperka), как работать по i2c
Paramon
сообщение May 3 2016, 14:41
Сообщение #1


Частый гость
**

Группа: Участник
Сообщений: 128
Регистрация: 5-10-06
Пользователь №: 20 997



Уже не знаю что курить!
Имеется Raspberry Pi с Raspbian с установленным Python и утилитами i2c.
Собственно вопрос - как заставить работать сервомашины от этой платы, по командам от RPi по i2c.
Связь по i2c есть, плата при сбросе и подаче питания дёргает сервомашинки, но перебором передавааемых байт реакции нет.
Выполнение команды:
www-data@raspberrypi ~ $ i2cdetect -y 1
0 1 2 3 4 5 6 7 8 9 a b c d e f
00: -- -- -- 06 07 -- -- -- -- -- -- -- --
10: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
20: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
30: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
40: -- -- -- -- -- -- -- 47 -- -- -- -- -- -- -- --
50: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
60: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
70: -- -- -- -- -- -- -- --
где 0x47 - адрес платы на i2c.

мной испытано:
в Python:
bus.write_byte_data(addr, saddr, p0)
bus.write_byte_data(addr, saddr + 1, p1)
bus.write_byte_data(addr, saddr + 2, p2)
bus.write_byte_data(addr, saddr + 3, p3)
проходит нормально.
где p0-p2 параметры:
p0 - номер выхода (было испытано 0 -17; затем значения адресов из исходников)
p1 - старший байт заполнения ШИМ
p2 - младший байт заполнения ШИМ
p3 -всякие варианты (и без p3 тоже)
! по смыслу из исходников (для Arduino) делается:
Wire.write(I2Caddr);
Wire.write(Pin); - понимаю, что номер выхода
Wire.write(Vol >> 8); - понимаю как старший байт значения
Wire.write(Vol & 0xFF); - соответственно младший байт
далее команда передачи
Адрес I2C я и так указываю, ну и три параметра.

вот отрывок:
Код
do {
Wire.beginTransmission(twiAddress);
Wire.write(pin);
Wire.write(pulseWidth >> 8);
Wire.write(pulseWidth & 0xFF);
errorCode = (Error)Wire.endTransmission();
} while (errorCode && --retryAttempts);



Испробован и блочный режим посылки.
уже курил обрывки из Arduino, для чего плата и предназначена (но по i2c)
понять не могу в какой последовательности что и куда передавать, хотя пытаюсь исходя из некоторых исходников. вторые сутки пошли уже.

кстати адреса 0x06 и 0x07 платы ComMotion motor driver на работу с ней только один деь потребовался.

простите если не в тот раздел написал, но всётаки буду применять Raspberry а не Arduino.

Сообщение отредактировал Paramon - May 4 2016, 06:15
Go to the top of the page
 
+Quote Post
Paramon
сообщение May 9 2016, 05:57
Сообщение #2


Частый гость
**

Группа: Участник
Сообщений: 128
Регистрация: 5-10-06
Пользователь №: 20 997



Отвечаю сам себе, но может кому интересно
Заработало:

CODE
#!/usr/bin/python
# coding: utf-8

import smbus
import time

print("=====test multiservo=====")

addr = 0x47

bus = smbus.SMBus(1)

pin = 1
res = 0

set = 700

def wrmultiservo(addr, _pin, val):
global res
res = 0
tm = 0.05
te = 1
p0 = (val >> 8)
p1 = val & 0xff
cmd = _pin
try:
print(addr, cmd, p0, p1)
bus.write_i2c_block_data(addr, cmd, [p0, p1])
time.sleep™
res = 1;
except:
print("--error--")
time.sleep™

def sup(pin):
global set
global addr
global res
while(set < 1700):
wrmultiservo(addr, pin, set)
if(res > 0):
res = 0
set = set + 10
#
def sdown(pin):
global set
global addr
global res
while(set > 700):
wrmultiservo(addr, pin, set)
if(res > 0):
res = 0
set = set - 10
#
nums=10
while(nums > 0):
sup(pin)
sdown(pin)
nums = nums - 1


Сообщение отредактировал IgorKossak - May 9 2016, 09:09
Причина редактирования: [codebox] для длинного кода, [code] - для короткого!!!
Go to the top of the page
 
+Quote Post

Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 18th April 2024 - 23:05
Рейтинг@Mail.ru


Страница сгенерированна за 0.01457 секунд с 7
ELECTRONIX ©2004-2016