Инструменты пользователя

Инструменты сайта


doc:1602:mgul.160021.002

Различия

Здесь показаны различия между двумя версиями данной страницы.

Ссылка на это сравнение

Предыдущая версия справа и слева Предыдущая версия
Следующая версия
Предыдущая версия
doc:1602:mgul.160021.002 [2018/01/25 05:13]
angel_of_death [Отработка движения]
doc:1602:mgul.160021.002 [2018/04/28 23:47] (текущий)
Строка 6: Строка 6:
 </​hidden>​ </​hidden>​
  
-<hidden Текст программы от 23 января 2018 года>​+<hidden Текст программы от 11 апреля 2018 года ​(в работе проверялось,​ Inseptima поехала)>
 <code asm> <code asm>
 #include <​Servo.h>​ #include <​Servo.h>​
-#define Engine ​4 +#define Engine ​2 
-#define Engine_pwm ​6 +#define Engine_pwm ​3 
-#define R 7 +#define R 5 
-#define L 8 +#define L 4 
-int Steering_Angle=5+int Steering_Angle = 15
-int Engine_Speed_Now = 200+int Engine_Speed_Now = 30
-int Steering_Pos = 45+int Steering_Pos = 60; 
-Servo Steering_Serv; ​+double flag_st = 0// флаг для сервопривода 
 +Servo Steering_Serv;​
 void Engine_Parking_without_brake() {                  // отключение питания двигателя,​ остановка за счёт трения void Engine_Parking_without_brake() {                  // отключение питания двигателя,​ остановка за счёт трения
   Serial.println("​Engine_Parking_without_brake"​);​   Serial.println("​Engine_Parking_without_brake"​);​
Строка 24: Строка 25:
   delay(1000);​   delay(1000);​
   digitalWrite(Engine,​ HIGH);   digitalWrite(Engine,​ HIGH);
 +  flag_st = 0;
 } }
-void Engine_Forward(){ ​                ​// прямое вращение двигателя+void Engine_Forward() {                // прямое вращение двигателя
   Serial.println("​En_Forward"​);​   Serial.println("​En_Forward"​);​
-  digitalWrite(L,​ LOW);+  digitalWrite(L,​ LOW);X
   digitalWrite(R,​ HIGH);   digitalWrite(R,​ HIGH);
   analogWrite(Engine_pwm,​ Engine_Speed_Now);​   analogWrite(Engine_pwm,​ Engine_Speed_Now);​
 +  flag_st = 1;
 } }
-void Engine_Back(){ ​                   //  обратное вращение двигателя+void Engine_Back() {                   ​//  обратное вращение двигателя
   Serial.println("​Engine_Back"​);​   Serial.println("​Engine_Back"​);​
   digitalWrite(L,​ HIGH);   digitalWrite(L,​ HIGH);
   digitalWrite(R,​ LOW);   digitalWrite(R,​ LOW);
-  analogWrite(Engine_pwm,​ Engine_Speed_Now);  ​+  analogWrite(Engine_pwm,​ Engine_Speed_Now);​ 
 +  flag_st = 1;
 } }
-void Engine_Speed_Up(){ +void Engine_Speed_Up() { 
-  if(Engine_Speed_Now<​=245){ +  if (Engine_Speed_Now <= 245) { 
-  Engine_Speed_Now+=10+    Engine_Speed_Now += 15
-  Serial.print(Engine_Speed_Now);​ +    Serial.print(Engine_Speed_Now);​ 
-  Serial.println(" ​ Engine_Speed_Up ​ ");+    Serial.println(" ​ Engine_Speed_Up ​ ")
 +  } 
 +  else 
 +    Engine_Speed_Now = 255;
 } }
- ​else +void Engine_Speed_Down() { 
- ​Engine_Speed_Now=255;+  if (Engine_Speed_Now > 40) { 
 +    Engine_Speed_Now -= 15; 
 +    Serial.print(Engine_Speed_Now);​ 
 +    Serial.println(" ​ Engine_Speed_Down ​ "); 
 +  } 
 +  ​else 
 +    Engine_Speed_Now = 40;
 } }
-void Engine_Speed_Down(){ +void Steering_Forward() {                 ​ 
-  if(Engine_Speed_Now>​50){ +  if (flag_st == 0) {      // флаг 0, выравниваемся способом №1 
-  ​Engine_Speed_Now-=10+    ​Steering_Pos ​60
-  Serial.print(Engine_Speed_Now);  +    Serial.println("​ Steering_Forward(60) "); 
-  Serial.println(" ​ ​Engine_Speed_Down  ​");+    Steering_Serv.write(70);​ 
 +    delay(200);​ 
 +    Steering_Serv.write(35);​ 
 +    delay(200);​ 
 +    Steering_Serv.write(70);​ 
 +    delay(200);​ 
 +    Steering_Serv.write(35);​ 
 +    delay(200);​ 
 +    Steering_Serv.write(Steering_Pos + 2); 
 +  ​
 +  if (flag_st == 1) {  // флаг 1, выравниваемся способом №2 
 +    if (Steering_Pos > 60 && Steering_Pos < 130) { // программная проверка позиции сервы 
 +      Steering_Pos = 60;                           // выравнивание для правого поворота 
 +      ​Serial.println(" ​Steering_Forward(60) ​"); 
 +      Steering_Serv.write(75);​ 
 +      delay(90);​ 
 +      Steering_Serv.write(33);​ 
 +      delay(90);​ 
 +      Steering_Serv.write(75);​ 
 +      delay(90);​ 
 +      Steering_Serv.write(33);​ 
 +      delay(90);​ 
 +      Steering_Serv.write(45);​ 
 +    } 
 +    if (Steering_Pos < 60 && Steering_Pos > -5) { // программная проверка позиции сервы 
 +      Steering_Pos = 60;                          // выравнивание для левого поворота 
 +      Steering_Serv.write(75);​ 
 +      delay(90);​ 
 +      Steering_Serv.write(33);​ 
 +      delay(90);​ 
 +      Steering_Serv.write(75);​ 
 +      delay(90);​ 
 +      Steering_Serv.write(33);​ 
 +      delay(90);​ 
 +      Steering_Serv.write(60);​ 
 +    } 
 +  }
 } }
- ​else +void Steering_Right() {                    
- ​Engine_Speed_Now=45;​ +  if (flag_st == 0) { // если стоим, то до упора поворот 
-+    Steering_Pos = 0
-void Steering_Forward(){                  // рулевая прямо, требуется выравнивание ​поворотами левво\право,​ если нагрузна большая +    Steering_Serv.write(Steering_Pos); 
-  Steering_Pos = 45+    ​Serial.println("MAX R"); 
-  ​Serial.println("​ Steering_Forward(45) "); +  ​} 
-  ​Steering_Serv.write(60); +  ​if (flag_st == 1{ 
-  delay(100); +    ​if ​(Steering_Pos ​> 5) { // если едем, то плавно рулим 
-  ​Steering_Serv.write(30);​ +      Steering_Pos -= Steering_Angle;​ 
-  ​delay(100); +      Serial.println(Steering_Pos);​ 
-  ​Steering_Serv.write(Steering_Pos); +      Steering_Serv.write(Steering_Pos);​ 
- +    
-Steering_Serv.write(45);​ +  }
-+
-void Steering_Left(){                    // при нажатии рулевая немного налево, в зависимости от нагрузки платформы +
-  ​Serial.print(" ​ Steering_Left ​ "); +
-  if(Steering_Pos > 5){ +
-  ​Steering_Pos -= Steering_Angle;​ +
-  Serial.println(Steering_Pos);​ +
-  Steering_Serv.write(Steering_Pos);​ +
-+
-} +
-void Steering_Right(){ ​                  // при нажатии рулевая немного направо,​ в зависимости от нагрузки платформы +
-  Serial.print(" ​ Steering_Right ​ "​); ​  +
-  if(Steering_Pos < 85){ +
-  Steering_Pos += Steering_Angle;​ +
-  Serial.println(Steering_Pos);​ +
-  Steering_Serv.write(Steering_Pos);​+
 } }
 +void Steering_Left() {           
 +  if (flag_st == 0) { // если стоим, то до упора поворот
 +    Steering_Pos = 120;
 +    Steering_Serv.write(Steering_Pos);​
 +    Serial.println("​MAX L");
 +  }
 +  if (flag_st == 1) { // если едем, то плавно рулим
 +    if (Steering_Pos < 120) {
 +      Steering_Pos += Steering_Angle;​
 +      Serial.println(Steering_Pos);​
 +      Steering_Serv.write(Steering_Pos);​
 +    }
 +  }
 } }
 void setup() { void setup() {
-Serial.begin(115200); +  ​Serial.begin(38400); 
-pinMode(Engine,​ OUTPUT); +  pinMode(Engine,​ OUTPUT); 
-pinMode(Engine_pwm,​ OUTPUT); +  pinMode(Engine_pwm,​ OUTPUT); 
-pinMode(R, OUTPUT); +  pinMode(R, OUTPUT); 
-pinMode(L, OUTPUT); +  pinMode(L, OUTPUT); 
-digitalWrite(Engine,​ HIGH); +  digitalWrite(Engine,​ HIGH); 
-Steering_Serv.attach(5); +  Steering_Serv.attach(8); 
-Steering_Serv.write(45);+  ​Steering_Forward();
 } }
  
 void loop() { void loop() {
  
-char key; +  ​char key; 
-  if (Serial.available()>​ 0) +  if (Serial.available() > 0) 
-  key = Serial.read();​ +    key = Serial.read();​ 
-  switch(key){+  switch (key) {
     case '​W':​     case '​W':​
-    ​Engine_Forward();​ +      ​Engine_Forward();​ 
-    ​break;​ +      break;
-    case '​A':​ +
-    Steering_Right();​ +
-    break; +
-    case '​S':​ +
-    Engine_Parking_without_brake();​ +
-    ​break;+
     case '​D':​     case '​D':​
-    Steering_Left(); +      Serial.print(" ​ Steering_Right ​ ")
-    break;+      Steering_Right();​ 
 +      break
 +    ​case '​S':​ 
 +      Engine_Parking_without_brake();​ 
 +      break; 
 +    case '​A':​ 
 +      Serial.print(" ​ Steering_Left ​ "); 
 +      Steering_Left();​ 
 +      ​break;
     case '​Q':​     case '​Q':​
-    ​Engine_Speed_Down();​ +      ​Engine_Speed_Down();​ 
-    break;+      break;
     case '​E':​     case '​E':​
-    ​Engine_Speed_Up();​ +      ​Engine_Speed_Up();​ 
-    break;+      break;
     case '​X':​     case '​X':​
-    ​Engine_Back();​ +      ​Engine_Back();​ 
-    break;+      break;
     case '​F':​     case '​F':​
-    ​Steering_Forward();​ +      ​Steering_Forward();​ 
-    break;+      break;
   }   }
 } }
Строка 139: Строка 188:
  - 2 Датчика влажности DHT22\\  - 2 Датчика влажности DHT22\\
 Данные будут записываться на постоянной основе в бортовую эвм, а при утере сигнала Wi-fi будут передаваться по запросу оператору с помощью NRF20L01. \\ Данные будут записываться на постоянной основе в бортовую эвм, а при утере сигнала Wi-fi будут передаваться по запросу оператору с помощью NRF20L01. \\
-</​hidden>​\\+</​hidden>​ 
 +<hidden Текст программы от 25 января 2018 года(собрано почти всё)>​ 
 +<code asm> 
 +#include <​iarduino_Pressure_BMP.h>​ 
 +#include <​TroykaIMU.h>​ 
 +#include <​Wire.h>​ 
 +#include <​SparkFunBME280.h>​ // более оптимизированная библиотека для bme280 
 +#include <​DHT.h>​ // библиотека dht ,​модель выбиратется константой 
 +#include <​CD74HC4067.h>​ // библиотека мультиплексора,​ не нужно внутри кода перебирать каналы,​ выбирается нужный 
 +#define DHT1PIN 8 
 +#define DHT2PIN 9 
 +#define DHTTYPE DHT22 
 +Gyroscope gyro;   // объекты для работы с 10 осевым датчиком от amperka 
 +Accelerometer accel; 
 +Compass compass; 
 +Barometer barometer;​ 
 +DHT dht1(DHT1PIN,​ DHTTYPE); 
 +DHT dht2(DHT2PIN,​ DHTTYPE); 
 +CD74HC4067 Multiplexor_pin(4,​ 5, 6, 7); // подключенные пины мультиплексора 
 +iarduino_Pressure_BMP BPM180;  
 +const int signal_input = A0; // входной сигнал с мультиплексора на 16  каналов 
 +BME280 bme;      // переменная для датчика давления bme280 
 +float gx, gy, gz, ax, ay, az, mx, my, mz; 
 + 
 +// полученные в калибровочной матрице из примера «compassCalibrateMatrix» 
 +const double compassCalibrationBias[3] = { 
 +  524.21, 
 +  3352.214, 
 +  -1402.236 
 +}; 
 +const double compassCalibrationMatrix[3][3] = { 
 +  {1.757, 0.04, -0.028}, 
 +  {0.008, 1.767, -0.016}, 
 +  {-0.018, 0.077, 1.782} 
 +}; 
 +void setup() { 
 +  gyro.begin();​ 
 +  accel.begin();​ 
 +  compass.begin();​ 
 +  barometer.begin();​ 
 +  BPM180.begin(); ​  
 +  compass.calibrateMatrix(compassCalibrationMatrix,​ compassCalibrationBias);​ 
 +  compass.setRange(RANGE_4_GAUSS);​ 
 +  bme.settings.commInterface = I2C_MODE; 
 +  bme.settings.I2CAddress = 0x76; 
 +  bme.settings.runMode = 3; 
 +  bme.settings.tStandby = 0; 
 +  bme.settings.filter = 0; 
 +  bme.settings.tempOverSample = 1; 
 +  bme.settings.pressOverSample = 1; 
 +  bme.settings.humidOverSample = 1; 
 +
 +void Scan_BPM180(){ 
 +  float Pressure,​Temp;​ 
 +      if(BPM180.read(1)) ​ { 
 +  Pressure = BPM180.pressure;​ 
 +  Temp = BPM180.temperature;​ 
 +  Serial.print(Pressure);​ 
 +  Serial.print("/​t"​);​ 
 +  Serial.print(Temp);​ 
 +  } 
 +      else{ 
 +  Serial.println("​HET OTBETA OT CEHCOPA"​);​ 
 + } 
 +
 +void Scan_IMU(){ 
 +  // считываем данные с акселерометра в единицах G 
 +  accel.readGXYZ(&​ax,​ &ay, &az); 
 +  // считываем данные с гироскопа в радианах в секунду 
 +  gyro.readRadPerSecXYZ(&​gx,​ &gy, &gz); 
 +  // считываем данные с компаса в Гауссах потому что можем 
 +  compass.readCalibrateGaussXYZ(&​mx,​ &my, &mz); 
 +  // считываем азимут относительно оси Z 
 +  compass.readAzimut();​ 
 +  // вывод угловой скорости в градусах в секунду относительно оси X 
 +  Serial.print(gyro.readDegPerSecX());​ 
 +  Serial.print("​\t"​);​ 
 +  // вывод угловой скорости в градусах в секунду относительно оси Y 
 +  Serial.print(gyro.readDegPerSecY());​ 
 +  Serial.print("​\t"​);​ 
 +  // вывод угловой скорости в градусах в секунду относительно оси Z 
 +  Serial.print(gyro.readDegPerSecZ());​ 
 +  Serial.print("​\t\t"​);​ 
 +  // вывод направления и величины ускорения в м/с² по оси X 
 +  Serial.print(accel.readAX());​ 
 +  Serial.print("​\t"​);​ 
 +  // вывод направления и величины ускорения в м/с² по оси Y 
 +  Serial.print(accel.readAY());​ 
 +  Serial.print("​\t"​);​ 
 +  // вывод направления и величины ускорения в м/с² по оси Z 
 +  Serial.print(accel.readAZ());​ 
 +  Serial.print("​\t\t"​);​ 
 +  // выводим азимут относительно оси Z 
 +  Serial.print(compass.readAzimut());​ 
 +  Serial.print("​ Degrees\t"​);​ 
 +  // вывод значения абсолютного давления 
 +  Serial.print(barometer.readPressureMillibars());​ 
 +  Serial.print("​\t"​);​ 
 +  // вывод значения температуры окружающей среды 
 +  Serial.print(barometer.readTemperatureC());​ 
 +  Serial.print("​\t"​);​ 
 +  Serial.println(""​);​ 
 +
 +void Scan_Multiplexor() { 
 +  float voltage_engine,​ voltage_logic,​ voltage_5v_line,​ voltage_backup_battery,​ voltage5; 
 +  float amper_engine,​ amper_logic,​ amper_manip,​ amper_pump;​ 
 +  float Temp_Engine,​ Temp_logic_battery,​ Temp_engine_battery,​ Temp_driver_engine,​ Temp_backup_battery,​ Temp_serv, Temp_Computer;​ 
 + 
 +     ​Multiplexor_pin.channel(0);​ 
 +  delay(1); 
 +  voltage_engine = analogRead(signal_input) / 40.92; 
 +     ​Multiplexor_pin.channel(1);​ 
 +  delay(1); 
 +  voltage_logic = analogRead(signal_input) / 40.92; 
 +     ​Multiplexor_pin.channel(2);​ 
 +  delay(1); 
 +  voltage_5v_line = analogRead(signal_input) / 40.92; 
 +     ​Multiplexor_pin.channel(3);​ 
 +  delay(1); 
 +  voltage_backup_battery = analogRead(signal_input) / 40.92; 
 +     ​Multiplexor_pin.channel(4);​ 
 +  delay(1); 
 +  voltage5 = analogRead(signal_input) / 40.92; 
 +     ​Multiplexor_pin.channel(5);​ 
 +  delay(1); 
 +  amper_engine = ((((analogRead(signal_input) / 1023) * 5000) - 2500) / 66); 
 +     ​Multiplexor_pin.channel(6);​ 
 +  delay(1); 
 +  amper_logic = ((((analogRead(signal_input) / 1023) * 5000) - 2500) / 66); 
 +     ​Multiplexor_pin.channel(7);​ 
 +  delay(1); 
 +  amper_manip = ((((analogRead(signal_input) / 1023) * 5000) - 2500) / 66); 
 +     ​Multiplexor_pin.channel(8);​ 
 +  delay(1); 
 +  amper_pump = ((((analogRead(signal_input) / 1023) * 5000) - 2500) / 66); 
 +     ​Multiplexor_pin.channel(9);​ 
 +  delay(1); 
 +  Temp_Engine = ((analogRead(signal_input) * 0.004888) - 0.5) * 100; 
 +     ​Multiplexor_pin.channel(10);​ 
 +  delay(1); 
 +  Temp_logic_battery = ((analogRead(signal_input) * 0.004888) - 0.5) * 100; 
 +     ​Multiplexor_pin.channel(11);​ 
 +  delay(1); 
 +  Temp_engine_battery = ((analogRead(signal_input) * 0.004888) - 0.5) * 100; 
 +     ​Multiplexor_pin.channel(12);​ 
 +  delay(1); 
 +  Temp_driver_engine = ((analogRead(signal_input) * 0.004888) - 0.5) * 100; 
 +     ​Multiplexor_pin.channel(13);​ 
 +  delay(1); 
 +  Temp_backup_battery = ((analogRead(signal_input) * 0.004888) - 0.5) * 100; 
 +     ​Multiplexor_pin.channel(14);​ 
 +  delay(1); 
 +  Temp_serv = ((analogRead(signal_input) * 0.004888) - 0.5) * 100; 
 +     ​Multiplexor_pin.channel(15);​ 
 +  delay(1); 
 +  Temp_Computer = ((analogRead(signal_input) * 0.004888) - 0.5) * 100; 
 +
 + 
 +void Scan_DHT22() { 
 +  float h1, h2, t1, t2; 
 +  h1 = dht1.readHumidity(); ​   // влажность с датчика dht22 
 +  t1 = dht1.readTemperature();​ // температура с датчика dht22 
 +  h2 = dht2.readHumidity();​ 
 +  t2 = dht2.readTemperature();​ 
 +
 +void scan_Bme() { 
 +  int Temp, Press, Humidity; 
 +  Temp = bme.readTempC(); ​              // температура с датчика bme280 
 +  Press = bme.readFloatPressure() / 133.3; // давление с датчика bme280 
 +  Humidity = bme.readFloatHumidity(); ​  // влажность с датчика bme280 
 +
 +void loop() { 
 +                //P.S. оптимизация и вывод будут позже(после проверки на реальном стенде) 
 +                // ссылки на библиотеки будут после проверки работоспособности скетча на деле :D 
 +              
 +
 +</​code>​ 
 +</​hidden>​ 
 +\\
 ==== Разработка,​конструирование и отладка системы пневматических стоек ==== ==== Разработка,​конструирование и отладка системы пневматических стоек ====
 <hidden Описание от 14 января 2018 года>​ <hidden Описание от 14 января 2018 года>​
doc/1602/mgul.160021.002.1516846428.txt.gz · Последние изменения: 2018/04/28 23:47 (внешнее изменение)