Здесь показаны различия между двумя версиями данной страницы.
Предыдущая версия справа и слева Предыдущая версия Следующая версия | Предыдущая версия | ||
doc:1602:mgul.160021.002 [2018/01/15 01:46] 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> | + | <code asm> |
#include <Servo.h> | #include <Servo.h> | ||
- | #define Engine 7 | + | #define Engine 2 |
- | #define RPWM 3 | + | #define Engine_pwm 3 |
- | #define LPWM 4 | + | #define R 5 |
- | #define Steering_Pin 5 | + | #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(LPWM, LOW); | + | digitalWrite(L, HIGH); |
- | digitalWrite(RPWM, HIGH); | + | digitalWrite(R, LOW); |
- | 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 на всю логику; 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 \\ | ||
- 4 Амперметра ACS712-30A \\ | - 4 Амперметра ACS712-30A \\ | ||
- 10-осевой датчик от "Amperka.ru" (гироскоп,акселерометр,магнитометр,датчик давления) \\ | - 10-осевой датчик от "Amperka.ru" (гироскоп,акселерометр,магнитометр,датчик давления) \\ | ||
- Датчик давления BPM180(внутри воздушного резервуара) \\ | - Датчик давления BPM180(внутри воздушного резервуара) \\ | ||
- | - 10 Датчиков температуры(двигатель,драйвер двигателя,сервопривод на рулевой,3 на аккумуляторы, 1 на бортовую эмв, 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 года> | ||
Строка 151: | Строка 383: | ||
<hidden Текст программы от 15 января 2018 года(наброски)> | <hidden Текст программы от 15 января 2018 года(наброски)> | ||
- | <code> | + | <code asm> |
#define Pump_Engine 24 // насос | #define Pump_Engine 24 // насос | ||
#define Valve_Out 25 // впускной клапан обратный ход | #define Valve_Out 25 // впускной клапан обратный ход |