А подключаешь питание двумя проводами(VIN, GND)?
Вид для печати
А подключаешь питание двумя проводами(VIN, GND)?
К разъему VIN, да двумя проводами: питание и земля, вернее "+" и "-".
Тогда можно предположить что в цепи питания что то неисправно.
Возможно что это диод D1. Можно попробовать его закоротить
Вложение 14771
Как безопаснее подключить эту кнопку? К земле (масса) или к +5В?
Если учесть, что скетч в котором внутренняя подтяжка цифрового порта оговорена еще не залит в плату, а провода уже подключены.
http://big-e.ru/files/button.jpg
Не спалю порт? Если внутреннюю подтяжку не сделаю?
Лучше подключить к GND и включить подтяжку
Сегодня провел предварительные испытания робота.
Установил в гараже на автомобиль.
На данном этапе можно считать эксперимент удачным.
Проверил - усилия ШД хватает даже при питании от АКБ.
Нужна небольшая подгонка датчиков холла, ну и скетч нужно продолжать писать...
Конечно капитальная проверка будет при езде, а также при жаре и морозе, где собственно может быть любой казус.
Завтра буду дальше заниматься.
Кстати пропал эффект подтормаживания ардуины, видимо был виноват источник питания который я дома использую (от старого ПК).
А какой тут может быть алгоритм на данном этапе? Из первых постов видно, как это всё работает и ничем не отличается от переключений на обычной механике, только намного легче всё это делается. И зачем "компьютеризировать" педаль газа на данном этапе реализации - это же не автомат пока?
СОвсем не видно как работает на машине. Смысл, насколько я понимаю, не в двигании рычагов моторами, а в переключении передач на реальной коробке при вращающихся валах.
Даже если это и не автомат предусматривается, то переключение передач не есть просто процесс передвижения рычагов. Просто потому, что в любой абстрактный момент нельзя ими двигать: либо синхронизаторы не дадут, либо будут поломаны и полетят зубья. Вот и спрашиваю про алгоритм, заложенный в основу этого устройства: про сцепление же сразу вопрос возник...
Ну вот уже и алгоритм :) А говорите - нету. Дальше - газом будем ногой работать при переключении? Обычно газ сбрасывают слегка, а потом, С УЧЁТОМ скорости отпускания сцепления и скорости и момента работы РУЧКОЙ кпп, газ добавляют. Как это может быть реализовано в данном "механизме", в котором нельзя ни силу "переключения", ни скорость "переключения" изменить? Как будет учтено банальное время работы синхронизатора и его усилие?
Извините, но совсем не понятно, что такое "сила переключения" и "скорость переключения", а по описанию автора этого механизма сама система ничем не отличается от обычной механики и алгоритм работы такой же, как и переключение МКПП. Только тут рычаг двигается легче + индикация включённой передачи. Или мы говорим о разных вещах? :)
Согласен с Murkur.
Мое понимание функции проекта на этом этапе сводится именно к облегчению переключения передач. Т.е. переключать можно буквально одним пальцем. Или даже нажатием на кнопки, либо кнопку повышения передачи, либо понижения. Также можно предусмотреть возможность непосредственного выбора передачи, подключив необходимое количество кнопок.
Для развития проекта в сторону полной автоматизации, нужен привод сцепления. Управлять им нужно в зависимости от скорости авто, и количества оборотов мотора.
Педалью газа управлять не надо, надо управлять дросселем. Тут уже нужно использовать "электронную педаль газа".
Работы в этом направлении ведутся на Kazus.ru, в теме про самодельный круиз контроль.
Ну вот теперь и я выскажу:
Задумка в том, чтобы передачи включать не только с шифтера и не только по классической H-схеме, а именно:
1. Переключение в спортивном режиме "+" "-", при этом учитывается с какой скоростью едет авто (датчик скорости и тахометр считываются) и подбирается передача, т.е. если еду 40км/ч, то смогу включить только или 3ю (-) или 4ую(+) передачу. Стою на светофоре "+" - включилась 1ая. Шифтер, кстати, от игрового руля Logitech G25.
2. Переключение с мультируля, одной кнопкой - "подбор скорости". Кроме того на руле планирую использовать кнопки "нейтраль", "вход в поворот" - читай 2ая скорость. Переключение с руля использовать только на прямой и перед поворотом.
При всем при этом, на первом этапе сцепление остается как есть, газ тоже.
Про уменьшение усилия и хода на рычаге вообще молчу.
Тут есть такое "затруднение": наличие 4х (5ти) ступеней в мкпп как-то располагает считать процесс переключения "цифровым" - ну типа такого: "2 смещения влево и одно вперёд - и есть 3я передача". На самом деле процесс переключения мкпп существенно "аналоговый" и в этом причина, по которой приемлемые роботизированные промышленные коробки на автомобилях появились только в последние годы. Думаете все предыдущие 80лет (условно) никому в голову не приходило? Ещё как приходило, но всё упиралось, да и сейчас упирается, именно в СУЩЕСТВЕННУЮ "аналоговость" процесса переключения: нужно не просто передёрнуть рычаг, а сделать это с учётом кучи переменных параметров, которые нужно отслеживать соответствующими датчиками. При переключении мкпп самым важным является не механическое передвижение валов коробки сервомотором, а управление двигателем посредством газа и сцепления, поскольку происходит сброс мощности (момента, оборотов...) с максимума до минимума и снова скачок до максимума. Вместо этой кучи датчиков используется человеческий мозг с немалым опытом переключений. :) И работает это всё на "необъяснимых" изменениях в скорости переключений, игрании газом и сцеплением, выборе моментов и усилий... :)
Только в последние годы из-за появления достаточно быстродействующих "ардуин" и достаточно качественных датчиков и стала развиваться ветвь роботизированных мкпп. Вполне сносные магниты (или рулевые машинки) существуют уже давно. Я с компашкой таких же увлечённых rc-моделистов с десяток лет назад тоже как-то собрались именно на предмет "роботизации" мкпп, пробовали кой-чего, но в основном "прикидывали" на моделях... Нифига не выйдет. :p Хотя может у топикстартера есть какие-то революционные идеи - буду рад, если у него получится.
Вот на многофрикциооной коробке ещё можно пробовать, а на "обычной" автомобильной - дохлый номер.
Можно сделать ещё одну функцию... Например, едем мы на второй передаче и скоро нужно будет переключиться на третью. Рычагом мы можем это сделать раньше, а сам робот переключится только, когда мы выжмем педаль сцепления.
Но, всё таки, будем ждать результатов полевых испытаний топикстартера :)
Согласен с некоторыми замечаниями и возможно правильнее назвать тему "Роботизированная МКПП из обычной МКПП" или даже "механизированная МКПП" (простите за тавтологию)
Murkur
Ты имеешь ввиду отложенное переключение?
Почитай про системку для тазиков, думаю вполне применимо с твоей электронно-управляемой коробкой.
http://33sport.swim-nn.ru/index.php?...7-20&Itemid=97
Весьма интересная ссылочка.
Жаль только на турбо не поставишь.
Да и не продают сию систему.
А их фото не особо ясно, что и как устроено.
Ставится второй вакуумник, управляющая тяга крепится к тросику газа, подсос от ресивера, через электромагнитный калапан.
Грубо где-то так.
Есть еще чисто с электромагнитом и блоком управления - http://megamatik.autoserp.ru/vaz-2110-2112
2 вопроса:
1. как будут себя чувствовать синхронизаторы?
2. а зачем это все?
а если для первоначального этапа оставить только автомат сцепления с логикой. кнопка на руле разрыв добавляем газ включение. скорость менее ??? км разрыв ну и обороты менее 1000 последние два параметра для всех передач кроме первой. если нейтраль то включение сцепления при скорости менее 10 км.
Проект не умер, он продолжается...
Второй вариант привода был собран,протестирован и установлен на машину:
http://big-e.ru/images/Gallery/preview_ex.php?dir=Robot
(см. последние фото)
Более того, удалось проехать на этом приводе два квартала, туда и обратно. После чего привод был снят с определенной долей недовольства.
Причина: привод имеет низкую виброустойчивость.
В результате, от шаговых моторов пришлось отказаться, по случаю приобрел актуаторы от робота короллы, на них собственно и делаю Третий вариант привода (на первой фото его видно).
Он почти готов...
Вот актуатор на основе которого Третий вариант делается:
http://www.toyota-mmt.ru/images/2013...2011.49.42.jpg
Тут вся обвязка и датчики в том числе.
у меня ситроен берлинго он же пежо типпи. на них роботы идут только в европии. сейчас ищу актуатор сцепления к нему. о передачах пока только мечтаю
Тоже делаю роботизированную КПП на основе привода от Яриса (аналог Короллы, как у топикстартера).
Привод представляет из себя исполнительный механизм из двух коллекторных двигателей и датчиков их положений.
Приобрел контроллер для коллекторных двигателей
monster moto shield
http://pacpac.ru/product/dev-10182/
И решил его использовать для управления приводом.
Для каждого из двигателей нужно поймать три положения:
по датчикам это значения 450, 600 и 800
450 и 800 конечные положения с жесткими упорами их поймать проблем нет, а вот среднее положение 600 я или пролетаю или не дохожу.
Двигатели можут вращаться со скоростью 0...1023, линейный ход всего 16мм.
Замутил такой алгоритм: 0,5 пути который нужно пройти приводу он идет со скоростью 1023, дальше идет торможение и останов
Посоветуйте как быть..., вот моя функция из скетча:
int ChangeGear_P_135=450;//380;
int ChangeGear_P_N=600;
int ChangeGear_P_24R=800;//850;
float k1m1min=0.3; // коэф. общего пути до которого использовать полную скорость M1 при малом расстоянии (потеряно например)
float k2m1min=0.5; // коэф. общего пути с которого включать замедляющкю скорость M1
float k1m1=0.3; // коэф. общего пути до которого использовать полную скорость M1
float k2m1=0.5; // коэф. общего пути с которого включать замедляющкю скорость M1
float k1m1max=0.5; // коэф. общего пути до которого использовать полную скорость M1 при большом расстоянии (от линии 12 до 5R)
float k2m1max=0.6; // коэф. общего пути с которого включать замедляющкю скорость M1
// Функция привода переключения передач (2ой привод) M1
// В функцию передаются значения скорости (с любым знаком) и положения к которому нужно прийти (P_N12, P_N34, P_N5R)
byte Select_Gear_Motor_On(int Select_Gear_Start_Speed, int Select_Gear_End_Speed, int to_Position)//, boolean Search=false)
{
byte Rezult=0;
//int CurrentGearPosition=GetCurrentGearPosition();
boolean MotorToDo=false;
ReadSensors();
int znak_speed=1;
// определяемся со знаком скорости (т.е напралением вращения)
if (Select_Gear_Start_Speed<0){Select_Gear_Start_Spee d=-Select_Gear_Start_Speed;} //приводим к положительному знаку
if (Select_Gear_End_Speed<0){Select_Gear_End_Speed=-Select_Gear_End_Speed;} //приводим к положительному знаку
if (to_Position==P_N12)
{
if ((SelectGearSensor1>SelectGear_P_N12)||(SelectGear Sensor2>SelectGear_P_N12)) {znak_speed=1;}
if ((SelectGearSensor1<SelectGear_P_N12)||(SelectGear Sensor2<SelectGear_P_N12)) {znak_speed=-1;}
if ((IsValInRangeEx(SelectGearSensor1,SelectGear_P_N1 2, SensorPositionLimitForWork))||(IsValInRangeEx(Sele ctGearSensor1,SelectGear_P_N12, SensorPositionLimitForWork))) {znak_speed=0;} // дальше крутить не нужно - нужное положение
if (znak_speed!=0) {MotorToDo=true;}
}
if (to_Position==P_N34)
{
if ((SelectGearSensor1>SelectGear_P_N34)||(SelectGear Sensor2>SelectGear_P_N34)) {znak_speed=1;}
if ((SelectGearSensor1<SelectGear_P_N34)||(SelectGear Sensor2<SelectGear_P_N34)) {znak_speed=-1;}
if ((IsValInRangeEx(SelectGearSensor1,SelectGear_P_N3 4, SensorPositionLimitForWork))||(IsValInRangeEx(Sele ctGearSensor1,SelectGear_P_N34, SensorPositionLimitForWork))) {znak_speed=0;} // дальше крутить не нужно - нужное положение
if (znak_speed!=0) {MotorToDo=true;}
}
if (to_Position==P_N5R)
{
if ((SelectGearSensor1>SelectGear_P_N5R)||(SelectGear Sensor2>SelectGear_P_N5R)) {znak_speed=1;}
if ((SelectGearSensor1<SelectGear_P_N5R)||(SelectGear Sensor2<SelectGear_P_N5R)) {znak_speed=-1;}
if ((IsValInRangeEx(SelectGearSensor1,SelectGear_P_N5 R, SensorPositionLimitForWork))||(IsValInRangeEx(Sele ctGearSensor1,SelectGear_P_N5R, SensorPositionLimitForWork))) {znak_speed=0;} // дальше крутить не нужно - нужное положение
if (znak_speed!=0) {MotorToDo=true;}
}
float End_position=0;
float dystance=0;
float full_dystance=0;
boolean started=false;
boolean endingstarted=false;
boolean stopped=false;
float k1=k1m1;
float k2=k2m1;
if (MotorToDo)
{
Select_Gear_Start_Speed=Select_Gear_Start_Speed*zn ak_speed;
Select_Gear_End_Speed=Select_Gear_End_Speed*znak_s peed;
#if DEBUG
//Serial.println("***");
//Serial.println(SelectGear_P_N);
//Serial.println(SelectGearSensor1);
#endif
boolean stopMotor=false;
unsigned long now_timer=0;
unsigned long total_timer=0;
unsigned long control_timer=millis();
int cyclescount=0;
do {
now_timer=millis();
total_timer = now_timer - control_timer;
if (total_timer>=motor_check_timer) {SET_ERROR_MOTOR(ERROR_TOOLONGWORKINGM1); stopMotor=true;break;} // проверка на время длительности работы приводов
ReadSensors();
if (to_Position==P_N12)
{
if (((SelectGearSensor1>SelectGear_P_N12)||(SelectGea rSensor2>SelectGear_P_N12)) && (cyclescount>0)) {stopMotor=true;break;} // дальше крутить в эту сторону нельзя - конечное положение
if ((IsValInRangeEx(SelectGearSensor1,SelectGear_P_N1 2, SensorPositionLimitForRotate))||(IsValInRangeEx(Se lectGearSensor1,SelectGear_P_N12, SensorPositionLimitForRotate))) {stopMotor=true;break;} // дальше крутить не нужно - нужное положение
End_position=SelectGear_P_N12;
}
if (to_Position==P_N34)
{
if ((IsValInRangeEx(SelectGearSensor1,SelectGear_P_N3 4, SensorPositionLimitForRotate))||(IsValInRangeEx(Se lectGearSensor1,SelectGear_P_N34, SensorPositionLimitForRotate))) {stopMotor=true;break;} // дальше крутить не нужно - нужное положение
End_position=SelectGear_P_N34;
}
if (to_Position==P_N5R)
{
if (((SelectGearSensor1<SelectGear_P_N5R)||(SelectGea rSensor2<SelectGear_P_N5R)) && (cyclescount>0)) {stopMotor=true;break;} // дальше крутить в эту сторону нельзя - конечное положение
if ((IsValInRangeEx(SelectGearSensor1,SelectGear_P_N5 R, SensorPositionLimitForRotate))||(IsValInRangeEx(Se lectGearSensor1,SelectGear_P_N5R, SensorPositionLimitForRotate))) {stopMotor=true;break;} // дальше крутить не нужно - нужное положение
End_position=SelectGear_P_N5R;
}
dystance=abs(SelectGearSensor1-End_position);
if (full_dystance==0) {full_dystance=dystance;}
if (full_dystance<100) {Select_Gear_Start_Speed=M1MotorMidSpeed*znak_spee d;}
if (full_dystance<100){k1=k1m1min; k2=k2m1min;}
if (full_dystance>300){k1=k1m1max; k2=k2m1max;}
if (!started)// разгон
{
if (full_dystance-dystance<full_dystance*k1) {
//Pololuqik.setM1Speed(Select_Gear_Start_Speed);
if (znak_speed>0){motorGo(1, CCW, 1023);}
if (znak_speed<0){motorGo(1, CW, 1023);}
started=true;}
}
if (!endingstarted)//малая скорость
{
if ((full_dystance-dystance>=full_dystance*k1) && (full_dystance-dystance<=full_dystance*k2)) {
//Pololuqik.setM1Speed(Select_Gear_End_Speed);
//if (znak_speed>0){motorGo(1, CCW, 512);}
//if (znak_speed<0){motorGo(1, CW, 512);}
endingstarted=true;} //малая скорость
}
if (stopped==false) // торможение
{
if (full_dystance-dystance>full_dystance*k2) {
//Pololuqik.setM1Brake(127);
motorGo(1, BRAKEGND, 1023);
stopped=true;}
}
cyclescount++;
} while (stopMotor==false);
//Pololuqik.setM1Brake(127); //останов
motorGo(1, BRAKEGND, 1023);
motorOff(1);
}
Rezult=GetCurrentGearPosition();
if (Rezult!=0) {SetSuccessGearPosition_to_RAM(Rezult);}
//else {SetNotSuccessGearPosition_to_RAM(Rezult);}
return Rezult;
}
reanon
33960-12010 (33960-12030)
zis100
Ты поднял актуальную тему. Попробовал твой алгоритм, у меня аналогичный контроллер коллекторных двигателей - фигово получилось, действительно плохое позиционирование.
Chip
Может ты нам с zis100 подскажешь как оптимально отпозиционировать привод. В PID регулировании я не совсем понял, что можно подбирать.
Сейчас имеем:
Обратная связь по датчику положения.
В нашей ситуации, можно управлять скоростью и временем. Током и напряжением контроллер сам управляет, не давая возможности их регулировки. Можно управлять частотой, но там градация 20кГц, 10кГц и ниже.
Причем скорость в начальный момент времени нужно сделать максимальной, чтобы стронуть привод (проверено).
По идее можно на короткий промежуток времени (мс) выдать максимальную скорость, затем накат (скорость 0), реверс или торможение, и так в цикле. Но у меня это не получилось, двигатель просто стоит и воет, увеличение времени запуска с максимальной скоростью приводит к банальному пролету двигателя...
Пока оптимальный такой вариант в цикле:
do
{
ReadSensors(); // чтение положения привода SelectGearSensor1
dystance=abs(SelectGearSensor1-End_position); // End_position - к чему стремимся
.... тут проверка на соотвествие позиции
....
и самое главное:
Pololuqik.setM1Speed(127); // макс скорость
delayMicroseconds(500);
Pololuqik.setM1Speed(127/2); // снижение скорости
delayMicroseconds(500);
} while
Точность позиционирования средняя, хотелось бы выше, да и сбои бывают.
Я не вникал в тему но, сам бы сделал так:Цитата:
Может ты нам с zis100 подскажешь как оптимально отпозиционировать привод. В PID регулировании я не совсем понял, что можно подбирать.
Сейчас имеем:
Обратная связь по датчику положения.
В нашей ситуации, можно управлять скоростью и временем. Током и напряжением контроллер сам управляет, не давая возможности их регулировки. Можно управлять частотой, но там градация 20кГц, 10кГц и ниже.
Причем скорость в начальный момент времени нужно сделать максимальной, чтобы стронуть привод (проверено).
По идее можно на короткий промежуток времени (мс) выдать максимальную скорость, затем накат (скорость 0), реверс или торможение, и так в цикле. Но у меня это не получилось, двигатель просто стоит и воет, увеличение времени запуска с максимальной скоростью приводит к банальному пролету двигателя...
Запустил бы на максимальной скорости и читал циклично положение, как только приблизится на минимальное расстояние к цели(Сдесь придется вычислить время), то перевести скорость на минимум и опять читать положение датчика, когда сравняется с требуемым положением (нужно учитывать инертность) включаем торможение.
Если проскакиваем положение, то тормозим и медленно возвращаемся назад и циклично проверяем положение
Спасибо за совет. Немного дополнил и получил.
...
Select_Gear_Speed=map(dystance,0,full_dystance,0,S elect_Gear_Start_Speed);
Pololuqik.setM1Speed(Select_Gear_Speed);
...
full_dystance - весь путь который надо пройти
dystance - остаток пути
Select_Gear_Start_Speed - максимальная скорость
Select_Gear_Speed - подобранная скорость
т.е по мере приближения к границе позиции в которой нужно остановиться скорость падает до 0 линейно.
позиционируется достаточно точно.
От короллы не советую, привод вечно глючит, у кого от мороза, у кого от жары.
Неудачная конструкция, офф сервисы сами это признают.
Так привод или мозги? тут еще вопрос...
Говорят контроллер глючит, а не актуатор.
Мозги делали модернизированные, не помогло.
Там механические проблемы связанные судя по всему с температурным расширением металлов.
Сколько людей покупали короллы с роботом - у всех рано или поздно начинаются проблемы с вылетом в нейтраль, или невозможностью включить передачу.
Езжу 3 года на роботизированном DSG. Алгоритм включения DSG такой: Завел двигатель, на селекторе КПП нажал на кнопку (в недрах КПП сработала блокировка (электромагнитный шток (собачка-стопор шестерни) блокировки КПП)) и одновременно нажал педаль тормоза (на табло горит зеленый значок и пропадает, когда нажата педаль тормоза), далее селектор КПП перевел из P режима в D или S или ручной режим, отпустил педаль тормоза и авто само едет. Двигая селектор КПП последовательно можно переключать передачи вверх, и тормозить двигателем, переключая передачи вниз (но только в ручном режиме). Если авто едет в ручном режиме, передачи автоматом не переключаются. пока селектор КПП не дернешь вверх или вниз. В режиме D и S, когда авто замедляется (нажата педаль тормоза) КПП сама скидывает передачи вниз. Более подробно можно почитать здесь:
http://vwts.ru/page05_0am.html
http://vwts.ru/vw_transmission_0bt.html
http://vwts.ru/page05_02e.html
kadushkin
Попробовал твой вариант.
Действительно лучше позиционирование, но "пролеты" все же есть, если повернуть привод осью вниз, то под действием инерции и силы тяжести пролетаю нужное положение.
Нужно учесть эти факторы, но вот как?
То ли фактическое значение скорости замерить относительно задаваемой и соотнести с пройденным путем, то ли еще как.
Да точно, попробовал наклонить ось актуатора вниз и начались пролеты когда ползун также движется вниз, т.е. действует сила тяжести.
Когда ползун движется вверх этого не происходит.
Chip может выручишь советом.
Время хода ползуна вверх или вниз примерно одинаково 30-40мс.
Ток тоже - пик 12-15А.
Скорость линейно меняется от максимума до нуля.
Для ликвидации пролета пришлось делать отскок назад, но мне это не нравится.
Не датчик же наклона ставить....
Заснял на видео проблему, вот видео:
http://youtu.be/i_qE16TowJY
Рассчитай время перемещения до датчика, в вертикальном положении
Вот как выглядит у меня сигнал на управление двигателем:
http://big-e.ru/images/pololu/MMT1.jpg
http://big-e.ru/images/pololu/MMT3.jpg
Сначала задается максимальная скорость, к моменту приближения к нужному положению скорость подает до нуля, далее останов.
Вот рекомендуемый сигнал: когда я задаю 50 мкс запуск и 50 мкс останов.
http://big-e.ru/images/pololu/50-50.jpg
Почему-то пауза дольше 50 мкс, наверное поэтому движик и стоит все всемя
Цена деления 100 мкс.