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

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


doc:1602:mgul.160021.002

Различия

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

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

Предыдущая версия справа и слева Предыдущая версия
Следующая версия
Предыдущая версия
doc:1602:mgul.160021.002 [2018/01/25 05:24]
angel_of_death [Разработка необходимой телеметрии]
doc:1602:mgul.160021.002 [2018/04/28 23:47] (текущий)
Строка 6: Строка 6:
 </​hidden>​ </​hidden>​
  
-<hidden Текст программы от 23 января 2018 года (в работе проверялось,​ Inseptima поехала)>​+<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;
   }   }
 } }
Строка 142: Строка 191:
 <hidden Текст программы от 25 января 2018 года(собрано почти всё)> <hidden Текст программы от 25 января 2018 года(собрано почти всё)>
 <code asm> <code asm>
 +#include <​iarduino_Pressure_BMP.h>​
 +#include <​TroykaIMU.h>​
 +#include <​Wire.h>​
 #include <​SparkFunBME280.h>​ // более оптимизированная библиотека для bme280 #include <​SparkFunBME280.h>​ // более оптимизированная библиотека для bme280
 #include <​DHT.h>​ // библиотека dht ,​модель выбиратется константой #include <​DHT.h>​ // библиотека dht ,​модель выбиратется константой
Строка 148: Строка 200:
 #define DHT2PIN 9 #define DHT2PIN 9
 #define DHTTYPE DHT22 #define DHTTYPE DHT22
 +Gyroscope gyro;   // объекты для работы с 10 осевым датчиком от amperka
 +Accelerometer accel;
 +Compass compass;
 +Barometer barometer;
 DHT dht1(DHT1PIN,​ DHTTYPE); DHT dht1(DHT1PIN,​ DHTTYPE);
 DHT dht2(DHT2PIN,​ DHTTYPE); DHT dht2(DHT2PIN,​ DHTTYPE);
 CD74HC4067 Multiplexor_pin(4,​ 5, 6, 7); // подключенные пины мультиплексора CD74HC4067 Multiplexor_pin(4,​ 5, 6, 7); // подключенные пины мультиплексора
 +iarduino_Pressure_BMP BPM180; ​
 const int signal_input = A0; // входной сигнал с мультиплексора на 16  каналов const int signal_input = A0; // входной сигнал с мультиплексора на 16  каналов
 BME280 bme;      // переменная для датчика давления bme280 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() { 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.commInterface = I2C_MODE;
   bme.settings.I2CAddress = 0x76;   bme.settings.I2CAddress = 0x76;
Строка 162: Строка 239:
   bme.settings.pressOverSample = 1;   bme.settings.pressOverSample = 1;
   bme.settings.humidOverSample = 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() { void Scan_Multiplexor() {
Строка 232: Строка 360:
 } }
 void loop() { void loop() {
- +                //P.S. оптимизация и вывод будут позже(после проверки на реальном стенде) 
 +                // ссылки на библиотеки будут после проверки работоспособности скетча на деле :D 
 +             
 } }
 </​code>​ </​code>​
 </​hidden>​ </​hidden>​
-//+\\
 ==== Разработка,​конструирование и отладка системы пневматических стоек ==== ==== Разработка,​конструирование и отладка системы пневматических стоек ====
 <hidden Описание от 14 января 2018 года>​ <hidden Описание от 14 января 2018 года>​
doc/1602/mgul.160021.002.1516847062.txt.gz · Последние изменения: 2018/04/28 23:47 (внешнее изменение)