Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: RPi + multiservo(amperka)
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > Отладочные платы > Raspberry Pi
Paramon
Уже не знаю что курить!
Имеется 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
Отвечаю сам себе, но может кому интересно
Заработало:

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
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2024 Invision Power Services, Inc.