Всем привет. Задумался над переделкой ручного управления печкой на электронный с дальнейшим вкорячиванием туда климата. Действо сие назрело уже давно, поскольку при установке дисплея в Фокус I пришлось переносить все крутилки под руль и стало очень неудобно туда тянуться.Информацию по переделке нашёл здесь - http://forum.2112.ru/showthread.php?t=18165 и на форуме где-то была инфа про леокар. В итоге купил два фокусовских сервопривода и установил их вместо ручного регулятора.Силовая схема для регулятора воздушных потоков и температуры выполнена на L293E с допустимым током 1А, для вентилятора пока не определился, скорее всего будет ШИМ с драйвером IR2121 + IRF1405.
Уровни положения заслонки откалибровал через ардуино, который выводил значения напрямую в ком-порт.Соответственно при повторе конструкции калибровка должна быть заново.
Код для ардуино :
PHP код:
#define m1_l 5
#define m1_r 6
#define m2_l 8
#define m2_r 9
#define chip1 4
#define chip2 7
int pos[5] = {560, 630, 720, 810, 910}; //значения получены с переменных резисторов обратной связи двигателя
#define tMIN 220 //-----
#define tMAX 560 //-----
int t_center = (tMAX-tMIN)/2+tMIN;
int pwm[5] = {51, 102, 153, 204, 255};
int data = 0;
#define sensor1 1
#define sensor2 2
#define pwm 10
void rigth (int posit);
void left (int posit);
void setup()
{
Serial.begin(9600);
pinMode(m1_l,OUTPUT);
pinMode(m1_r,OUTPUT);
pinMode(m2_l,OUTPUT);
pinMode(m2_r,OUTPUT);
pinMode(chip1,OUTPUT);
pinMode(chip2,OUTPUT);
pinMode(sensor1,INPUT);
pinMode(sensor2,INPUT);
pinMode(pwm,OUTPUT);
}
void loop()
{
if (Serial.available() > 1)
{
switch (Serial.read())
{
case 0x01:
flowloop();
break;
case 0x02:
temploop();
break;
case 0x03:
pwmloop();
break;
}
}
}
void left (int posit) //левый двигатель цикл
{
digitalWrite(m1_l,HIGH);
digitalWrite(m1_r,LOW);
while (analogRead(sensor1)> pos[posit-1])
{}
digitalWrite(m1_l,LOW);
}
void rigth (int posit) //правый двигатель цикл
{
digitalWrite(m1_r,HIGH);
digitalWrite(m1_l,LOW);
while (analogRead(sensor1)< pos[posit-1])
{}
digitalWrite(m1_r,LOW);
}
void flowloop() //цикл заслонки регулировки направления потоков
{
data=Serial.read(); //получаем данные с порта
digitalWrite(chip1,HIGH); //разрешаем управление двигателем 1
{
if (data == 0x01) //принимаем с ком порта команду на положение заслонки 1 (ноги)
{
if (analogRead(sensor1) > pos[0])
{
left(data);
}
}
if (data == 0x02) //принимаем с ком порта команду на положение заслонки 1 (ноги-салон)
{
if (analogRead(sensor1) > pos[1])
{
left(data);
}
else
{
rigth(data);
}
}
if (data == 0x03) //принимаем с ком порта команду на положение заслонки 1 (салон)
{
if (analogRead(sensor1) > pos[2])
{
left(data);
}
else
{
rigth(data);
}
}
if (data == 0x04) //принимаем с ком порта команду на положение заслонки 1 (салон-лобовое стекло)
{
if (analogRead(sensor1) < pos[3])
{
rigth(data);
}
else
{
left(data);
}
}
if (data == 0x05) //принимаем с ком порта команду на положение заслонки 1 (лобовое стекло)
{
if (analogRead(sensor1) < pos[4])
{
rigth(data);
}
}
delay(100); //задержка для АЦП
}
}
void temploop() //цикл управления заслонкой регулировки температуры
{
data=(Serial.read())*4; //т.к температурой управляем с трекбара (диапазон значений 0-255) приводим данные в диапазон значений с сопротивления обратной связи двигателя
digitalWrite(chip2,HIGH); //разрешаем управление двигателем 2
if (analogRead(sensor2)> data)
{
digitalWrite(m2_l,HIGH);
digitalWrite(m2_r,LOW);
while (analogRead(sensor2)> data)
{}
digitalWrite(m2_l,LOW);
}
if (analogRead(sensor2)< data)
{
digitalWrite(m2_r,HIGH);
digitalWrite(m2_l,LOW);
while (analogRead(sensor2)< data)
{}
digitalWrite(m2_r,LOW);
}
delay(100);
}
void pwmloop() //цикл управления скоростью вентилятора
{
data=Serial.read();
analogWrite(pwm, data);
}
реализовано пока управление заслонкой распределения потоков на 5 положений, управляться будет в итоге с ПК через ком-порт + отдельный пульт(резистивные копки)на случай неисправности компьютера.
принимаю вопросы, советы и альтернативые решения