Ставится второй вакуумник, управляющая тяга крепится к тросику газа, подсос от ресивера, через электромагнитный калапан.
Грубо где-то так.
Есть еще чисто с электромагнитом и блоком управления - http://megamatik.autoserp.ru/vaz-2110-2112
Ставится второй вакуумник, управляющая тяга крепится к тросику газа, подсос от ресивера, через электромагнитный калапан.
Грубо где-то так.
Есть еще чисто с электромагнитом и блоком управления - http://megamatik.autoserp.ru/vaz-2110-2112
Последний раз редактировалось poraboloid; 08.09.2012 в 01:54.
2 вопроса:
1. как будут себя чувствовать синхронизаторы?
2. а зачем это все?
а если для первоначального этапа оставить только автомат сцепления с логикой. кнопка на руле разрыв добавляем газ включение. скорость менее ??? км разрыв ну и обороты менее 1000 последние два параметра для всех передач кроме первой. если нейтраль то включение сцепления при скорости менее 10 км.
Последний раз редактировалось pnp1106; 25.03.2013 в 14:42.
Проект не умер, он продолжается...
Второй вариант привода был собран,протестирован и установлен на машину:
http://big-e.ru/images/Gallery/preview_ex.php?dir=Robot
(см. последние фото)
Более того, удалось проехать на этом приводе два квартала, туда и обратно. После чего привод был снят с определенной долей недовольства.
Причина: привод имеет низкую виброустойчивость.
В результате, от шаговых моторов пришлось отказаться, по случаю приобрел актуаторы от робота короллы, на них собственно и делаю Третий вариант привода (на первой фото его видно).
Он почти готов...
Вот актуатор на основе которого Третий вариант делается:
Тут вся обвязка и датчики в том числе.
Последний раз редактировалось kadushkin; 03.05.2013 в 23:23.
у меня ситроен берлинго он же пежо типпи. на них роботы идут только в европии. сейчас ищу актуатор сцепления к нему. о передачах пока только мечтаю
Тоже делаю роботизированную КПП на основе привода от Яриса (аналог Короллы, как у топикстартера).
Привод представляет из себя исполнительный механизм из двух коллекторных двигателей и датчиков их положений.
Приобрел контроллер для коллекторных двигателей
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
Точность позиционирования средняя, хотелось бы выше, да и сбои бывают.
Последний раз редактировалось kadushkin; 02.07.2013 в 23:51.
Я не вникал в тему но, сам бы сделал так:Может ты нам с zis100 подскажешь как оптимально отпозиционировать привод. В PID регулировании я не совсем понял, что можно подбирать.
Сейчас имеем:
Обратная связь по датчику положения.
В нашей ситуации, можно управлять скоростью и временем. Током и напряжением контроллер сам управляет, не давая возможности их регулировки. Можно управлять частотой, но там градация 20кГц, 10кГц и ниже.
Причем скорость в начальный момент времени нужно сделать максимальной, чтобы стронуть привод (проверено).
По идее можно на короткий промежуток времени (мс) выдать максимальную скорость, затем накат (скорость 0), реверс или торможение, и так в цикле. Но у меня это не получилось, двигатель просто стоит и воет, увеличение времени запуска с максимальной скоростью приводит к банальному пролету двигателя...
Запустил бы на максимальной скорости и читал циклично положение, как только приблизится на минимальное расстояние к цели(Сдесь придется вычислить время), то перевести скорость на минимум и опять читать положение датчика, когда сравняется с требуемым положением (нужно учитывать инертность) включаем торможение.
Если проскакиваем положение, то тормозим и медленно возвращаемся назад и циклично проверяем положение
Последний раз редактировалось Chip; 04.07.2013 в 20:33.
Спасибо за совет. Немного дополнил и получил.
...
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 линейно.
позиционируется достаточно точно.
Эту тему просматривают: 1 (пользователей: 0 , гостей: 1)