Показать сообщение отдельно
23.09.2017, 18:39   #284
ArtLeg

Заглянувший
 
Адрес: Митино
Авто: Legnum VR-4 '01
Имя: Артем
Сообщений: 91




По умолчанию

Подкину вам сюда свою "разработку" на коленке, по пневмоподвеске)) Делал как срочную замену испорченному покупному, т.к. кататься без него не мог физически.

Входные данные:
- 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);


}
ArtLeg вне форума Ответить с цитированием Перейти в начало страницы