Подкину вам сюда свою "разработку" на коленке, по пневмоподвеске)) Делал как срочную замену испорченному покупному, т.к. кататься без него не мог физически.
Входные данные:
- Arduino UNO
- 4 датчика высоты (Land Rover)
- датчик нажатой педали тормоза (пока не задействован, нужна опторазвяка будет внешняя)
- датчик давления компрессора (пока не задействован)
- 6-7 реле (пока используется базис на 6 реле: ПЛ ПП ЗЛ ЗП колеса, клапан сброса и клапан подъема)
На программке все настройки (амплитуда, желаемая высота и др) - вынесены, их можно специальной функцией переназначать в ходе работы (будет в дальнейших версиях, когда руки дойдут сделать на шине I2C внешнее управление и индикацию)
Ну и собственно сам код, может кому пригодится, в коде стоит много всяких задержек и отладочной информации:
Код:
// Settings for current car level
int targetFL = 50;
int amplitFL = 10;
int delayFL = 100;
int targetFR = 50;
int amplitFR = 10;
int delayFR = 100;
int targetRL = 50;
int amplitRL = 15;
int delayRL = 100;
int targetRR = 50;
int amplitRR = 15;
int delayRR = 100;
int stopdelay = 4000; // ����� ��� ������� �� ������ �������
int maxpress = 12; // �������� � �������� �����������
void setup()
{
// define pinmode for relay:
//Front Suspension valve
pinMode(7, OUTPUT); // (FL - Front Left)
pinMode(8, OUTPUT); // (FR - Front Right)
//Rear Suspension valve
pinMode(9, OUTPUT); // (RL - Rear Left)
pinMode(10, OUTPUT);
// (RR - Rear Right)
//Compressor and waste valve
pinMode (11, OUTPUT); // (UP - Compressor relay)
pinMode (12, OUTPUT); // (DOWN - Waste valve)
pinMode (13, OUTPUT); // (RES - Reciever Valve)
// initialize serial communication at 9600 bits per second:
Serial.begin(9600);
}
// the loop routine runs over and over again forever:
void loop()
{
// read height sensors:
int sensorFL = analogRead(A0);
int sensorFR = analogRead(A1);
int sensorRL = analogRead(A2);
int sensorRR = analogRead(A3);
// read pressure sensor:
int sensorPress = analogRead(A4);
// read stop sensor:
int sensorStop = analogRead(A5);
// Convert the analog reading (which goes from 0 - 1023) to a percent (0 - 100%):
Serial.println("Sensor read complete");
//height sensors
int levelFL = sensorFL * (100 / 1023.0);
int levelFR = sensorFR * (100 / 1023.0);
int levelRL = sensorRL * (100 / 1023.0);
int levelRR = sensorRR * (100 / 1023.0);
/* Serial.print("FL");
Serial.println(levelFL);
Serial.print("FR");
Serial.println(levelFR);
Serial.print("RL");
Serial.println(levelRL);
Serial.print("RR");
Serial.println(levelRR);*/
//pressure sensor
int pressure = sensorPress * (20 / 1023.0);
//brake input
bool brake;
int brakepedal = sensorStop;
//brake status
if(brakepedal<500)
{ brake = false; }
else
{ brake = true; };
// Level Control
// Serial.print("Brake status:");
// Serial.println(brake);
// Delay while brake is pressed
if(brake) { delay(stopdelay);
};
// Front axle level control
do
{
Serial.println("Checking up front axle");
levelFL = analogRead(A0) * (100 / 1023.0);
if((levelFL <= (targetFL-amplitFL)) || (levelFL >= (targetFL+amplitFL)))
{
Serial.println("Front left wheel out of range");
// Setting Compressor or Dump valve
if(levelFL <= (targetFL-amplitFL))
{ digitalWrite(11, HIGH);
Serial.println("Compressor ON");
}
else
{ digitalWrite(12, HIGH);
Serial.println("Dump valve ON");
}
// Continue until Finish
do {digitalWrite(7, HIGH);
levelFL = analogRead(A0) * (100 / 1023.0);
Serial.print("Current valueFL:");
Serial.println(levelFL);
}
while (targetFL!=levelFL);
// Disable valves
digitalWrite(7, LOW);
digitalWrite(11, LOW);
digitalWrite(12, LOW);
Serial.println("FL Level control complete.");
};
levelFR = analogRead(A1) * (100 / 1023.0);
if(levelFR <= (targetFR-amplitFR) || levelFR >= (targetFR+amplitFR))
{
Serial.println("Front right wheel out of range");
// Setting Compressor or Dump valve
if(levelFR <= (targetFR-amplitFR))
{ digitalWrite(11, HIGH);
Serial.println("Compressor ON");
}
else
{ digitalWrite(12, HIGH);
Serial.println("Dump valve ON");
}
// Continue until Finish
do {
digitalWrite(8, HIGH);
levelFR = analogRead(A1) * (100 / 1023.0);
Serial.print("Current valueFR:");
Serial.println(levelFR);
}
while (targetFR!=levelFR);
// Disable valves
digitalWrite(8, LOW);
digitalWrite(11, LOW);
digitalWrite(12, LOW);
Serial.println("FR Level control complete.");
};
delay(2000);
}
while (((levelFL <= (targetFL-amplitFL)) || (levelFL >= (targetFL+amplitFL)))||((levelFL <= (targetFL-amplitFL)) || (levelFL >= (targetFL+amplitFL))));
Serial.println("Checking up front axle - COMPLETE");
// Rear axle level control
do
{
Serial.println("Setting up rear axle");
levelRL = analogRead(A2) * (100 / 1023.0);
if(levelRL <= (targetRL-amplitRL) || levelRL >= (targetRL+amplitRL))
{
Serial.println("Rear left wheel out of range");
// Setting Compressor or Dump valve
if(levelRL <= (targetRL-amplitRL))
{ digitalWrite(11, HIGH);
Serial.println("Compressor ON");
}
else
{ digitalWrite(12, HIGH);
Serial.println("Dump valve ON");
}
// Continue until Finish
do {digitalWrite(9, HIGH);
levelRL = analogRead(A2) * (100 / 1023.0);
Serial.print("Current valueRL:");
Serial.println(levelRL);
}
while (targetRL!=levelRL);
// Disable valves
digitalWrite(9, LOW);
digitalWrite(11, LOW);
digitalWrite(12, LOW);
Serial.println("RL level control complete.");
};
levelRR = analogRead(A3) * (100 / 1023.0);
if((levelRR <= (targetRR-amplitRR)) || (levelRR >= (targetRR+amplitRR)))
{
Serial.println("Rear right wheel out of range");
// Setting Compressor or Dump valve
if(levelRR <= (targetRR-amplitRR))
{ digitalWrite(11, HIGH);
Serial.println("Compressor ON");
}
else
{ digitalWrite(12, HIGH);
Serial.println("Dump valve ON");
}
// Continue until Finish
do {digitalWrite(10, HIGH);
levelRR = analogRead(A3) * (100 / 1023.0);
Serial.print("Current valueRR:");
Serial.println(levelRR);
}
while (targetRR!=levelRR);
// Disable valves
digitalWrite(10, LOW);
digitalWrite(11, LOW);
digitalWrite(12, LOW);
};
Serial.println("Setting up rear axle - COMPLETE");
delay(2000);
}
while ((levelRL <= (targetRL-amplitRL) || levelRL >= (targetRL+amplitRL))&&(levelRR <= (targetRR-amplitRR) || levelRR >= (targetRR+amplitRR)));
// print out data to Serial:
Serial.println("Air suspension status:");
Serial.print("FL");
Serial.print("\t");
Serial.print("FR");
Serial.print("\t");
Serial.print("RL");
Serial.print("\t");
Serial.print("RL");
Serial.print("\t");
Serial.print("PRESS");
Serial.print("\t");
Serial.print("BRAKE");
Serial.println();
// print out current values
Serial.print(levelFL, DEC);
Serial.print("\t");
Serial.print(levelFR, DEC);
Serial.print("\t");
Serial.print(levelRL, DEC);
Serial.print("\t");
Serial.print(levelRR, DEC);
Serial.print("\t");
Serial.print(pressure, DEC);
Serial.print("\t");
Serial.print(brakepedal, DEC);
Serial.println();
// print out desired values
Serial.print(targetFL, DEC);
Serial.print("\t");
Serial.print(targetFR, DEC);
Serial.print("\t");
Serial.print(targetRL, DEC);
Serial.print("\t");
Serial.print(targetRR, DEC);
Serial.print("\t");
Serial.print(maxpress, DEC);
Serial.print("\t");
Serial.print(stopdelay, BIN);
Serial.println();
delay(8000);
}