Igor68 0 3 мая, 2016 Опубликовано 3 мая, 2016 (изменено) · Жалоба Уже не знаю что курить! Имеется 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. Изменено 4 мая, 2016 пользователем Paramon Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Igor68 0 9 мая, 2016 Опубликовано 9 мая, 2016 (изменено) · Жалоба Отвечаю сам себе, но может кому интересно Заработало: #!/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 Изменено 9 мая, 2016 пользователем IgorKossak [codebox] для длинного кода, [code] - для короткого!!! Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться