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

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


doc:1602:mgul.160021.002

Различия

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

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

Предыдущая версия справа и слева Предыдущая версия
Следующая версия
Предыдущая версия
doc:1602:mgul.160021.002 [2018/01/15 19:39]
angel_of_death
doc:1602:mgul.160021.002 [2018/04/28 23:47] (текущий)
Строка 6: Строка 6:
 </​hidden>​ </​hidden>​
  
-<hidden Текст программы от 14 января 2018 года>​+<hidden Текст программы от 11 апреля 2018 года ​(в работе проверялось,​ Inseptima поехала)>
 <code asm> <code asm>
 #include <​Servo.h>​ #include <​Servo.h>​
-#define Engine ​7 +#define Engine ​2 
-#​define ​RPWM +#​define ​Engine_pwm ​
-#​define ​LPWM 4 +#​define ​
-#define Steering_Pin ​+#​define ​L 4 
-#define Steering_Angle ​5 +int Steering_Angle ​= 15; 
-int Engine_Speed_Now = 50+int Engine_Speed_Now = 30
-int Steering_Pos = 45+int Steering_Pos = 60; 
-Servo Steering_Serv;​  +double flag_st = 0// флаг для сервопривода 
-void Engine_Parking_without_brake() { // отключение питания двигателя,​ остановка за счёт трения+Servo Steering_Serv;​ 
 +void Engine_Parking_without_brake() {                  // отключение питания двигателя,​ остановка за счёт трения
   Serial.println("​Engine_Parking_without_brake"​);​   Serial.println("​Engine_Parking_without_brake"​);​
-  digitalWrite(RPWM, LOW); +  digitalWrite(R, LOW); 
-  digitalWrite(LPWM, LOW);+  digitalWrite(L, LOW); 
 +  digitalWrite(Engine, LOW);
   delay(1000);​   delay(1000);​
 +  digitalWrite(Engine,​ HIGH);
 +  flag_st = 0;
 } }
-void Engine_Forward(){ ​     // прямое вращение двигателя+void Engine_Forward() {                // прямое вращение двигателя
   Serial.println("​En_Forward"​);​   Serial.println("​En_Forward"​);​
-  digitalWrite(RPWM, LOW); +  digitalWrite(L, LOW);X 
-  digitalWrite(LPWM, HIGH); +  digitalWrite(R, HIGH); 
-  for(int i=0;​i<​=Engine_Speed_Now;​i++){ ​ +  analogWrite(Engine_pwm, Engine_Speed_Now);​ 
-  analogWrite(Engine, Engine_Speed_Now);​ +  ​flag_st = 1;
-  ​delay(10); +
-  }+
 } }
-void Engine_Back(){ //  обратное вращение двигателя+void Engine_Back() {                   ​//  обратное вращение двигателя
   Serial.println("​Engine_Back"​);​   Serial.println("​Engine_Back"​);​
-  digitalWrite(LPWMLOW); +  digitalWrite(LHIGH); 
-  digitalWrite(RPWMHIGH); +  digitalWrite(RLOW); 
-  ​for(int i=0;i<=Engine_Speed_Now;i++){ +  ​analogWrite(Engine_pwm, Engine_Speed_Now); 
-  ​analogWrite(Engine, ​Engine_Speed_Now);​ +  flag_st ​1; 
-  delay(10);+
 +void Engine_Speed_Up() { 
 +  ​if (Engine_Speed_Now ​<= 245
 +    Engine_Speed_Now += 15
 +    ​Serial.print(Engine_Speed_Now);​ 
 +    Serial.println(" ​ Engine_Speed_Up ​ ");
   }   }
 +  else
 +    Engine_Speed_Now = 255;
 } }
-void Steering_Forward(){      // рулевая прямо, требуется выравнивание поворотами левво\право,​ если нагрузна большая +void Engine_Speed_Down() { 
-  ​Steering_Pos ​45+  ​if (Engine_Speed_Now > 40) { 
-  Serial.println(" ​Steering_Forward(45) ​"); +    Engine_Speed_Now -15
-  ​Steering_Serv.write(Steering_Pos);+    ​Serial.print(Engine_Speed_Now);​ 
 +    ​Serial.println(" ​ ​Engine_Speed_Down  ​"); 
 +  ​
 +  else 
 +    Engine_Speed_Now = 40;
 } }
-void Steering_Left(){        // при нажатии рулевая немного налево, в зависимости от нагрузки платформы +void Steering_Forward() {                  
-  Serial.print(" ​ ​Steering_Left  ​"); +  if (flag_st == 0) {      ​// флаг 0, выравниваемся способом №1 
-  if(Steering_Pos > 15){ +    Steering_Pos = 60; 
-  Steering_Pos ​-Steering_Angle+    Serial.println("​ Steering_Forward(60) "); 
-  ​Serial.println(Steering_Pos); +    Steering_Serv.write(70);​ 
-  Steering_Serv.write(Steering_Pos);+    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);​ 
 +    } 
 +  }
 } }
 +void Steering_Right() {                   
 +  if (flag_st == 0) { // если стоим, то до упора поворот
 +    Steering_Pos = 0;
 +    Steering_Serv.write(Steering_Pos);​
 +    Serial.println("​MAX R");
 +  }
 +  if (flag_st == 1) {
 +    if (Steering_Pos > 5) { // если едем, то плавно рулим
 +      Steering_Pos -= Steering_Angle;​
 +      Serial.println(Steering_Pos);​
 +      Steering_Serv.write(Steering_Pos);​
 +    }
 +  }
 } }
-void Steering_Right(){      // при нажатии рулевая немного направов зависимости ​от нагрузки платформы +void Steering_Left() {            
-  ​Serial.print(" ​ Steering_Right ​ "​); ​  +  if (flag_st == 0) { // если стоим, то до упора поворот 
-  if(Steering_Pos ​< 75){ +    Steering_Pos = 120
-  Steering_Pos +Steering_Angle+    Steering_Serv.write(Steering_Pos);​ 
-  ​Serial.println(Steering_Pos);​ +    Serial.println("​MAX L"); 
-  ​Steering_Serv.write(Steering_Pos);​ +  
-+  if (flag_st ​== 1) { // если едем, то плавно рулим 
-+    if (Steering_Pos < 120) { 
-void Engine_Speed_Up(){ +      ​Steering_Pos +Steering_Angle
-  if(Engine_Speed_Now<​254){ +      Serial.println(Steering_Pos); 
-  Engine_Speed_Now+=10;​ +      ​Steering_Serv.write(Steering_Pos); 
-  Serial.print(Engine_Speed_Now);​ +    
-  ​Serial.println(" ​ ​Engine_Speed_Up  ​"); +  }
-+
- else +
- ​Engine_Speed_Now=255; +
-+
-void Engine_Speed_Down(){ +
-  if(Engine_Speed_Now>​50){ +
-  ​Engine_Speed_Now-=10+
-  Serial.print(Engine_Speed_Now);  +
-  ​Serial.println(" ​ Engine_Speed_Down ​ "); +
-+
- else +
- ​Engine_Speed_Now=50;​+
 } }
 void setup() { void setup() {
-Serial.begin(38400);​ +  ​Serial.begin(38400);​ 
-Steering_Serv.attach(Steering_Pin); +  ​pinMode(Engine, OUTPUT); 
-pinMode(Engine, OUTPUT); +  pinMode(Engine_pwm, OUTPUT); 
-pinMode(RPWM, OUTPUT); +  pinMode(R, OUTPUT); 
-pinMode(LPWM, OUTPUT);+  pinMode(L, OUTPUT); 
 +  digitalWrite(Engine,​ HIGH); 
 +  Steering_Serv.attach(8);​ 
 +  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_Parking_without_brake();​ +      ​Engine_Forward();​ 
-    ​Engine_Forward();​ +      break;
-    ​break;​ +
-    case '​A':​ +
-    Steering_Left();​ +
-    break; +
-    case '​S':​ +
-    Engine_Parking_without_brake();​ +
-    ​break;+
     case '​D':​     case '​D':​
-    ​Steering_Right();​ +      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_Parking_without_brake();​ +      ​Engine_Back();​ 
-    ​Engine_Back();​ +      break;
-    break;+
     case '​F':​     case '​F':​
-    ​Steering_Forward();​ +      ​Steering_Forward();​ 
-    break;+      break;
   }   }
 } }
Строка 125: Строка 178:
 \\ \\
 ==== Разработка необходимой телеметрии ==== ==== Разработка необходимой телеметрии ====
-<hidden Описание от 14 января 2018 года>​+<hidden Описание от 25 января 2018 года>​
  ​Так как на платформе будут установлено 3 аккумулятора (7.2V 6Ah на всю логику;​ 14.8V 10,8Аh двигатель , пневматика и манипулятор;​ 14,8V 3,4Ah резерв для двигателя,​подключаемый)\\  ​Так как на платформе будут установлено 3 аккумулятора (7.2V 6Ah на всю логику;​ 14.8V 10,8Аh двигатель , пневматика и манипулятор;​ 14,8V 3,4Ah резерв для двигателя,​подключаемый)\\
  - 5 Вольтметров с пиком в 25V \\  - 5 Вольтметров с пиком в 25V \\
Строка 131: Строка 184:
  - 10-осевой датчик от "​Amperka.ru"​ (гироскоп,​акселерометр,​магнитометр,​датчик давления) \\  - 10-осевой датчик от "​Amperka.ru"​ (гироскоп,​акселерометр,​магнитометр,​датчик давления) \\
  - Датчик давления BPM180(внутри воздушного резервуара) \\  - Датчик давления BPM180(внутри воздушного резервуара) \\
- ​- ​10 Датчиков температуры(двигатель,​драйвер двигателя,​сервопривод на рулевой,​3 на аккумуляторы,​ 1 на бортовую эмв, ​на Arduino)\\ + ​- ​Датчик давления и влажности BME280(внешний) \\ 
- - 2 Датчика влажности\\+ - 8 Датчиков температуры(двигатель,​драйвер двигателя,​сервопривод на рулевой,​3 на аккумуляторы,​ 1 на бортовую эмв, ​2 контрольный)\\ 
 + - 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.1516034386.txt.gz · Последние изменения: 2018/04/28 23:47 (внешнее изменение)