Ставится второй вакуумник, управляющая тяга крепится к тросику газа, подсос от ресивера, через электромагнитный калапан.
Грубо где-то так.
Есть еще чисто с электромагнитом и блоком управления - http://megamatik.autoserp.ru/vaz-2110-2112
Вид для печати
Ставится второй вакуумник, управляющая тяга крепится к тросику газа, подсос от ресивера, через электромагнитный калапан.
Грубо где-то так.
Есть еще чисто с электромагнитом и блоком управления - 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 линейно.
позиционируется достаточно точно.