roboforum.ru

Технический форум по робототехнике.

Драйвер двух двигателей управляемый по I2C, UART

Резисторы, транзисторы, конденсаторы, микросборки, чип компоненты ...
Вопросы согласования управляющих модулей с периферией.

Re: Драйвер двух двигателей управляемый по I2C, UART

Сообщение Michael_K » 17 мар 2011, 12:21

dccharacter писал(а):но так и не смог реализовать i2c slave

Ага. Геморрой тот еще.

Добавлено спустя 2 минуты 29 секунд:
Имхо НАСТОЛЬКО аналоговый ШИМ в реальной жизни нафиг не нужен. Потому что все равно не угадаешь, как в реальности крутится мотор. Там трех-четырех бит за глаза хватит... Имхо, конечно.
Аватара пользователя
Michael_K
 
Сообщения: 6028
Зарегистрирован: 07 окт 2009, 00:29
Откуда: СПб

Re: Драйвер двух двигателей управляемый по I2C, UART

Сообщение dccharacter » 17 мар 2011, 12:23

у меня если честно ноль понимания и практики работы с движками, мне пока и одного бита хватает :-). Но нехай пока будет. Убрать потом проще чем добавить :-)
Мой волшебник это я сам. Всю архитектуру программы придумал лично, а ребята помогли воплотить её. Я бы и сам мог написать, но лень учить язык и его конструкции.
Аватара пользователя
dccharacter
 
Сообщения: 4995
Зарегистрирован: 10 дек 2010, 13:16
Откуда: Красногорск МО
прог. языки: C, Python, wiring/processing
ФИО: Андрей

Re: Драйвер двух двигателей управляемый по I2C, UART

Сообщение =DeaD= » 17 мар 2011, 12:24

dccharacter писал(а):например, у меня резолюция шима 10 бит и мне не западло два байта передать вместо одного для того, чтобы этот резолюшн (впрок) сохранить

Вам куда такая точность? Это ж не героин :ROFL:
Проект [[Open Robotics]] - Универсальные модули для построения роботов
Аватара пользователя
=DeaD=
 
Сообщения: 24218
Зарегистрирован: 06 окт 2004, 18:01
Откуда: Ебург
прог. языки: C++ / PHP / 1C
ФИО: Антон Ботов

Re: Драйвер двух двигателей управляемый по I2C, UART

Сообщение dccharacter » 17 мар 2011, 13:16

вот что б ты понимал в точности! (шучу, шучу). Блин, надо сделать подпись как у кого-то уже есть - за выканье буду бить по морде :-)

Добавлено спустя 31 минуту 13 секунд:
=DeaD= писал(а):Вам куда такая точность? Это ж не героин :ROFL:

Вот всегда ты не на тот вопрос отвечаешь, который задан :(

Добавлено спустя 10 минут 31 секунду:
Проштудировал еще раз микрочиповский АН, сегодня заборю этот чертов i2c.
Мой волшебник это я сам. Всю архитектуру программы придумал лично, а ребята помогли воплотить её. Я бы и сам мог написать, но лень учить язык и его конструкции.
Аватара пользователя
dccharacter
 
Сообщения: 4995
Зарегистрирован: 10 дек 2010, 13:16
Откуда: Красногорск МО
прог. языки: C, Python, wiring/processing
ФИО: Андрей

Re: Драйвер двух двигателей управляемый по I2C, UART

Сообщение Vooon » 17 мар 2011, 23:04

Да не надо имитировать регистры как у орфы.
Там далеко не самый удобный интерфейс получился.

Здесь у меня гораздо проще получилось: http://hg.vehq.ru/or-linesens-fw/file/5 ... c/regmap.h

Первые 4-е регистра как у опенсерво.
Код: Выделить всёРазвернуть
    28    REG_DEVICE_TYPE = 0x00,
    29    REG_DEVICE_SUBTYPE = 0x01,
    30    REG_VERSION_MAJOR = 0x02,
    31    REG_VERSION_MINOR = 0x03,


Дальше я разместил бы:

MOTOR1_MODE (u8)
MOTOR2_MODE (u8)
ENCODER1 (s16 or s32)
ENCODER2 (s16 or s32)
MOTOR1_PWM (s16)
MOTOR2_PWM (s16)
...

Добавлено спустя 3 минуты 54 секунды:
Или лучше регистры каждого канала сгруппировать в структуру.

{
CHANNELx_MODE
ENCODERx
PWMx
SPEEDx
P,I,D,MAX_ACCEL,MAX_VEL (etc)
}
Linux user | Firefox user
Аватара пользователя
Vooon
Site Admin
 
Сообщения: 3339
Зарегистрирован: 09 фев 2006, 15:36
Откуда: Москва
Skype: vooon341
прог. языки: Python, C, Bash, JavaScript, C++, PHP
ФИО: Владимир Ермаков

Re: Драйвер двух двигателей управляемый по I2C, UART

Сообщение dccharacter » 18 мар 2011, 03:24

ок, подумаю...

ох ё-ж ты мое, ну не выходит каменный цветок никак. не пашет i2c и все. Сейчас вроде запись срабатывает, но в какие регистры - непонятно. Чтение не фурычит. Иногда по непонятным причинам происходит цикл чтения, но после этого - ни ни. Воспроизвести не удается, происходит это во время прошивки (наверное перед верификацией), но повторить не удается... Черти что. Примеров нет, единственный пример в аппноуте на асме, я уже по ходу асм выучил - толку ноль.

Добавлено спустя 1 минуту 39 секунд:
Еще геморрой в том, что мастером у меня ардуина. В том, что она корректно работает, уверенным быть не могу. Шнурок USB-UART на микрухе pl..., дрова под которой в х64 винде улетают в синий экран. Вот невозможно работать без нормального и надежного инструментария.

Добавлено спустя 3 часа 13 минут 44 секунды:
ЭТО КАКОЙ-ТО АД

Добавлено спустя 9 минут 46 секунд:
Что бы я не высылал из ПИКа ардуина принимает следующую последовательность байт: 162 68 136 16 32 64 128
И вот хоть ты разбейся - либо НИЧЕГО, либо ВОТ ЭТО

Добавлено спустя 8 минут 43 секунды:
Вот читаю и волосы везде шевелется где они есть: http://www.microchip.com/forums/tm.aspx ... =i2c+slave. Оглядываясь на эти почти два года, что я связался с МК и конкретно ПИКами, ничто не доставляло мне столько геммороя, как i2c (будь это сам протокол или конкретно его реализация в ПИКовом железе).

Добавлено спустя 21 минуту 45 секунд:
Так, начал получать свои байты. Только после первой посылки линия вешается....

Добавлено спустя 13 минут 59 секунд:
ХА ХА ХА, БРУТФОРС ЕЩЕ НИКТО НЕ ОТМЕНЯЛ!!!!!!!!!!!!!!

Я еще не рассказывал, как я вообще во все это дело влип? Я нашел принтер НР на помойке, притащил домой. Выцарапал из него экранчик. Долго искал в интернете, пришел к выводу, что это HD44778, или уж не помню как там бишь его. Ну прочитал, что нужна микросхема. Съездил в чип-и-дип, купил за 500 рублей pic16f628a, привез домой, сделал плату, спаял. Не работает. Стал копать. Через пару дней выяснилось, что ПИК надо прошивать... Стал изучать Hi Tech C. Купил у Михаила программатор... Не работает. Короче, через неделю или две мытарств, я заметил, что если беспорядочно подергать ногами контроллера, на дисплее появляется мусор. Еще через две недели у меня была распиновка (ни с одной из опубликованных в инете, а их там только около 15-ти, не совпадает). А тут какой-то i2c... Этому i2c еще повезло, что я его в софте на 1МГц не исполнил...

Добавлено спустя 1 минуту 30 секунд:
гы гы гы, сегодня я пойду пораньше спать :-)
Мой волшебник это я сам. Всю архитектуру программы придумал лично, а ребята помогли воплотить её. Я бы и сам мог написать, но лень учить язык и его конструкции.
Аватара пользователя
dccharacter
 
Сообщения: 4995
Зарегистрирован: 10 дек 2010, 13:16
Откуда: Красногорск МО
прог. языки: C, Python, wiring/processing
ФИО: Андрей

Re: Драйвер двух двигателей управляемый по I2C, UART

Сообщение Vooon » 18 мар 2011, 09:17

Съездил в чип-и-дип, купил за 500 рублей pic16f628a,

Сколько сколько!?

Добавлено спустя 2 минуты 29 секунд:
Меня бы просто жаба задушила платить в 10 раз больше ее стоимости.
http://www.terraelectronica.ru/catalog. ... =2&PageS=1
Linux user | Firefox user
Аватара пользователя
Vooon
Site Admin
 
Сообщения: 3339
Зарегистрирован: 09 фев 2006, 15:36
Откуда: Москва
Skype: vooon341
прог. языки: Python, C, Bash, JavaScript, C++, PHP
ФИО: Владимир Ермаков

Re: Драйвер двух двигателей управляемый по I2C, UART

Сообщение dccharacter » 18 мар 2011, 12:08

да знаю я все уже, спустя два года :-)
твои мозги бы мне тому, на два года моложе...

Добавлено спустя 17 минут 24 секунды:
Единственное, что не получается сделать - это адрес регистра, в который надо писать/читать. Как-то не могу поймать уверенно STOP CONDITION. Т.е. должно происходить следующее (как в акселях или часах типа ds1307):

СТАРТ
адрес устройства (запись) + внутренний адрес регистра
РЕСТАРТ
адрес устройства (чтение) + пакет байт
СТОП.

На РЕСТАРТЕ не должен обнуляться индекс буффера, а на СТОПе должен. Так вот у меня либо и там и там не обнуляется либо и там и там обнуляется. Пытался отдельно сделать условие опрашивая СТОП-бит в статусе, чего-то не фурычит, а ведь этот бит не должен выставляться на рестарте. Никто с этим не мучился?

А может вообще не мучиться и весь буфер туда-сюда гонять? но что-то как-то неидеально, я так не люблю. С другой стороны любому мастеру значительно проще работать с простыми операциями чтения или записи, а вот это старт-рестарт и т.д. - это дополнительный гемморой для того, кто мастера пишет.
Мой волшебник это я сам. Всю архитектуру программы придумал лично, а ребята помогли воплотить её. Я бы и сам мог написать, но лень учить язык и его конструкции.
Аватара пользователя
dccharacter
 
Сообщения: 4995
Зарегистрирован: 10 дек 2010, 13:16
Откуда: Красногорск МО
прог. языки: C, Python, wiring/processing
ФИО: Андрей

Re: Драйвер двух двигателей управляемый по I2C, UART

Сообщение dccharacter » 19 мар 2011, 02:39

Все, сделал чтение нужного количества байт начиная с нужного адреса. Единственное - ВСЕГДА первым в пачке прилетает байт А2 - что и откуда, вообще не понятно, никто его по логике даже втихаря отослать не может. Решил, что глюк ардуиновской проги и замазал его :-) Потом как-нить другим пиком проверю.... Уже не могу эти i2c статус-биты видеть, ассемблер знаю ваще круто, сам фигею, полностью портировал прогу из аппнота, походу исправив ошибки, основываясь на скомпилированной информации с форумов и даташита.

Добавлено спустя 4 минуты 53 секунды:
Vooon писал(а):{
CHANNELx_MODE
ENCODERx
PWMx
SPEEDx
P,I,D,MAX_ACCEL,MAX_VEL (etc)
}

Черт, у меня единственный робот - это лазерные часы. Поэтому вопросы:
Что такое Channel Mode?
Что именно мы читаем с энкодера? Количество срабатываний с прошлого опроса?
Чем PWM отличается от SPEED?

Правильно ли я понимаю, что чисто из человеколюбия вместо схемы "посмотри в описание, найди нужный тебе регистр и прочитай/запиши информацию, при этом не забудь ее правильно сформировать или интерпретировать", лучше сделать тупо в лоб прием команды "set MAX_ACCEL to 154", и распихать ее уже на ПИКЕ по нужным регистрам?

Добавлено спустя 4 минуты 56 секунд:
Vooon писал(а):Здесь у меня гораздо проще получилось: http://hg.vehq.ru/or-linesens-fw/file/5 ... c/regmap.h

Все, это меня окончательно добило. Временно прекращаю трехдневный марафон и иду играть в CRYSIS-2. Я так думаю, что пока я пару действующих роботов не сделаю, все равно ничего толкового не состряпаю. Всему свое время. Я, с...а, терпеливый.

Добавлено спустя 1 час 31 минуту 40 секунд:
Супер! Поиграл часок, вернулся, а оно опять не работает. Жесть как она есть.
Мой волшебник это я сам. Всю архитектуру программы придумал лично, а ребята помогли воплотить её. Я бы и сам мог написать, но лень учить язык и его конструкции.
Аватара пользователя
dccharacter
 
Сообщения: 4995
Зарегистрирован: 10 дек 2010, 13:16
Откуда: Красногорск МО
прог. языки: C, Python, wiring/processing
ФИО: Андрей

Re: Драйвер двух двигателей управляемый по I2C, UART

Сообщение dccharacter » 20 мар 2011, 06:04

Решил отдохнуть от i2c. Через это:

1. Сварганил USB->UART переходничек
2. Повесил карниз на кухне
3. Написал протокол для UART. Выглядит так:

Командой считается строка, оканчивающаяся одним из: '\r', '\n', ''P', 'p'
Дальше в строке ищутся ключевые байты. Следующие два байта после ключевого s(set) считаются адресом и значением соответственно, следующий байт после ключевого g(get) - адресом, по которому надо прочитать значение. s12 - дает команду установить значение значение 32 по адресу 31, команда G5 говорит прочитать значение по адресу 35.
Если адрес вылетает за область адресов управляющих регистров, выдается сообщение E, например на команду sqw будет дан ответ eqw в случае, если адреса q нет.

Добавлено спустя 2 часа 55 минут 36 секунд:
Вот же ж ржака. qextserialport не умеет с FTDI-кой работать. На их сайте висит свежий баг от 10-го марта :-)))
Вложения
IMG_3276[1].JPG
Мой волшебник это я сам. Всю архитектуру программы придумал лично, а ребята помогли воплотить её. Я бы и сам мог написать, но лень учить язык и его конструкции.
Аватара пользователя
dccharacter
 
Сообщения: 4995
Зарегистрирован: 10 дек 2010, 13:16
Откуда: Красногорск МО
прог. языки: C, Python, wiring/processing
ФИО: Андрей

Re: Драйвер двух двигателей управляемый по I2C, UART

Сообщение dccharacter » 21 мар 2011, 01:07

Еще одни неожиданные грабли - при смене направления двигателя очень сильно отличаются обороты. Смотрю осциллом, в одну сторону DC 69%, в другую - 43%. Т.е. в сумме 110 примерно :-)

Что у меня с ПВМ-ом:
1. LSB равны 00 при вращении в обе стороны. Но что-то я считал - не могут они дать такой большой разницы.
2. DC устанавливаю CCPRxL = abs(VALUE - DIRECTION*255), direction соответственно 0 или 1.
3. Пробовал предыдущее делать и через условия и принудительно говорить в одном случае VALUE, в другом 0xFF-VALUE
4. Сейчас попробую поиграться с ECCP, там есть смена полярности, но на такой вывод у меня только один движок выведен.

Добавлено спустя 28 минут 39 секунд:
мда, простой сменой полярности отлично работает :-(((

Добавлено спустя 17 минут 7 секунд:
Прикольно, опыт показывает, что дьюти сайкл шима пика связан со значением регистра CCPRxL нелинейно. Это единственное объяснение, которое я придумал.

Добавлено спустя 27 минут 51 секунду:
или линейно, но с непонятным сдвигом. сделал поправку, т.е. не 255-VALUE, а 200-VALUE. Вроде теперь ОК все. Но этого замечательного приема, грозящего геммороем в будущем, когда на МК сядет PID, можно избежать...
Мой волшебник это я сам. Всю архитектуру программы придумал лично, а ребята помогли воплотить её. Я бы и сам мог написать, но лень учить язык и его конструкции.
Аватара пользователя
dccharacter
 
Сообщения: 4995
Зарегистрирован: 10 дек 2010, 13:16
Откуда: Красногорск МО
прог. языки: C, Python, wiring/processing
ФИО: Андрей

Re: Драйвер двух двигателей управляемый по I2C, UART

Сообщение Duhas » 21 мар 2011, 08:00

эххх пики-пики... почти что грабли ))) только не будем холиварить )))

вапще странна то что вы пишите.. ну или там мудаки камень разрабатывали или ошибочка где-то ) скорее второй вариант )

вапще пробовали просто в прошивке крутить несколько секунд вперед потом несколько назад... и с разной скважностью ?
«Как сердцу выразить себя? … Мысль изреченная есть ложь!»
В этом мире меня подводит доброта и порядочность...
"двое смотрят в лужу, один видит лужу, другой отраженные в ней звезды"
Аватара пользователя
Duhas
 
Сообщения: 6338
Зарегистрирован: 15 сен 2007, 13:03
Откуда: Красноярск
прог. языки: ASM(МК), C(PC)
ФИО: Гагарский Андрей Александрович

Re: Драйвер двух двигателей управляемый по I2C, UART

Сообщение dccharacter » 21 мар 2011, 12:52

Duhas писал(а):вапще пробовали просто в прошивке крутить несколько секунд вперед потом несколько назад... и с разной скважностью ?

Канэшна! Реализован протокол управления по UART, сижу как в консоли команды отправляю команды, драйвер движочки туда-сюда....
Сделал приложение не QT, но, к сожалению, не могу сделать корректную работу с ком-портом. орфа-терминал тоже не фурычит... Нету в КьюТи нормальных библиотек для работы с компортом...
Мой волшебник это я сам. Всю архитектуру программы придумал лично, а ребята помогли воплотить её. Я бы и сам мог написать, но лень учить язык и его конструкции.
Аватара пользователя
dccharacter
 
Сообщения: 4995
Зарегистрирован: 10 дек 2010, 13:16
Откуда: Красногорск МО
прог. языки: C, Python, wiring/processing
ФИО: Андрей

Re: Драйвер двух двигателей управляемый по I2C, UART

Сообщение dccharacter » 21 мар 2011, 21:16

Внимание!!! Отойдем от традиций, вместо потока мыслей нужна помощь в диагностике заболевания:

1. При использовании orfa-terminal (ну и другого самопального приложения на QT) завешивается либо МК контроллера, либо его UART-порт. Выглядит это как сбрасывание в порт байта 0xFE.
2. При использовании PUTTY все ОК, но в putty, я набираю команды по одному символу. Приложение же пихает туда сразу строку.
3. Что делаю в putty: "s1ap", по 'p' стартует анализатор команды. Вместо 'p' можно нажать ввод - результат тот же.
4. Что отсылаю из orfa-terminal: "s1A\n" или "s1Ap", неважно. Модуль не реагирует. Я закрываю орфу, стартую putty, фижу там сыпящийся мусор.
Мой волшебник это я сам. Всю архитектуру программы придумал лично, а ребята помогли воплотить её. Я бы и сам мог написать, но лень учить язык и его конструкции.
Аватара пользователя
dccharacter
 
Сообщения: 4995
Зарегистрирован: 10 дек 2010, 13:16
Откуда: Красногорск МО
прог. языки: C, Python, wiring/processing
ФИО: Андрей

Re: Драйвер двух двигателей управляемый по I2C, UART

Сообщение Duhas » 21 мар 2011, 22:12

совет один - написать нормально обработчики прерываний или работу с флагами.. смотря как там у вас.. чтобы все успевало сработать...
«Как сердцу выразить себя? … Мысль изреченная есть ложь!»
В этом мире меня подводит доброта и порядочность...
"двое смотрят в лужу, один видит лужу, другой отраженные в ней звезды"
Аватара пользователя
Duhas
 
Сообщения: 6338
Зарегистрирован: 15 сен 2007, 13:03
Откуда: Красноярск
прог. языки: ASM(МК), C(PC)
ФИО: Гагарский Андрей Александрович

Пред.След.

Вернуться в Электроника, электротехника

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 21