Перейти к содержанию
    

RPi + multiservo(amperka)

Уже не знаю что курить!

Имеется 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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

Заработало:

 

#!/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
[codebox] для длинного кода, [code] - для короткого!!!

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...