Здесь показаны различия между двумя версиями данной страницы.
Предыдущая версия справа и слева Предыдущая версия Следующая версия | Предыдущая версия | ||
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 года> |