Контроллер системы двухступеньчатого наддува дизезя (BMW M57)
- Войдите на сайт для отправки комментариев
Втр, 28/06/2016 - 00:05
Всем доброго времяни суток ! Решил выложить свой проэкт сюда, в надежде получить помощь в его дороботке..
Суть проэкта: Управление двумя солиноидами системы двухступенчатого наддува, а так же некоторыми переферийными функциями, как; управление вентилятором системы охлаждения по ШИМ (БМВ е46, е90..), система впрыска спирта в двигатель.
Вот скетч:
/* Двух канальный буст контроллер, для системы двухступенчатого наддува,
с функцией управления вентилятором охлаждения PWM сигналом BMW Е46*/
// Контакты блютус модуля: TXD - 6 , RXD - 2
int RPMin = 13; // Вход датчика оборотов двигателя (датчик фазы)
int BARin = 1; // Вход датчика давления во впускном коллекторе. Распиновка датчика: 1-сигнал , 2-масса, 3- +5v
int FANout = 3; //Выход вентилятора охлаждения
int FANtempin = 4;//Аналоговый вход датчика температуры двиг.
int FANact;
int sensorValue2;
int FANval;
int FANval1;
int FANconin = 0; //Аналоговый вход запроса включения вентилятора кондиционера (выход из ЭБУ двигателя)
int FANconval;
int FANconval1;
int FANconact;
int Wout = 4; // Выход на насос впрыска воды/спирта
int Wval;
int Wval1;
int Wact;
int mact;
int Mval;
int Mval1;
int PWM2out = 10; // Выход солиноида первой(большой)турбины.
int PWM2in = 5; // Аналоговый вход мап-сенсора первой турбины. (Калибровка датчика: 1.5v = 1013mBar 3.5v = 3000mBar 3.6v = 3200mBar)
int PWM2act;
int PWM2val;
int PWM2val1;
int PWMout = 9; //PWM для солиноида второй(маленькой) турбины.
int PWMval;
int mapin = 6; //Аналоговый вход нагрузки двигателя (датчик педали газа)
int mapact;
int rpmin = 7; //Analog input actual Exhaust presure sensor
int rpmact;
int PWMval1;
int PWMval2;
int PWMval3;
int mapact2;
int mapact3;
// Управление скростью насоса подачи спирта.
const int r20 = 0;
const int r21 = 0;
const int r22 = 0;
const int r23 = 0;
const int r24 = 0;
const int r25 = 80;
const int r26 = 100;
const int r27 = 120;
const int r28 = 140;
const int r29 = 160;
const int r30 = 200;
const int r31 = 240;
const int r32 = 240;
const int r33 = 250;
const int r34 = 250;
const int r35 = 250;
const int r36 = 250;
const int r37 = 250;
const int r38 = 250;
const int r39 = 250;
const int r40 = 250;
const int r41 = 250;
const int r42 = 250;
const int r43 = 250;
const int r44 = 250;
const int r45 = 250;
const int r46 = 250;
const int r47 = 250;
const int r48 = 250;
const int r49 = 250;
const int r50 = 250;
const int r51 = 250;
const int r52 = 250;
const int r53 = 250;
const int r54 = 250;
const int r55 = 250;
// Положение клапана WG БОЛЬШОЙ турбины, от датчика давления воздуха певой (большой) турбины.
const int rp20 = 0;
const int rp21 = 0;
const int rp22 = 0;
const int rp23 = 0;
const int rp24 = 0;
const int rp25 = 221;
const int rp26 = 222;
const int rp27 = 223;
const int rp28 = 224;
const int rp29 = 220;
const int rp30 = 220;
const int rp31 = 220;
const int rp32 = 220;
const int rp33 = 240;
const int rp34 = 240;
const int rp35 = 240;
const int rp36 = 240;
const int rp37 = 240;
const int rp38 = 240;
const int rp39 = 240;
const int rp40 = 240;
const int rp41 = 240;
const int rp42 = 220;
const int rp43 = 190;
const int rp44 = 170;
const int rp45 = 150;
const int rp46 = 130;
const int rp47 = 110;
const int rp48 = 90;
const int rp49 = 60;
const int rp50 = 40;
const int rp51 = 20;
const int rp52 = 10;
const int rp53 = 10;
const int rp54 = 10;
const int rp55 = 10;
const int mpc120 = 200; // График скорости вращения вентилятора, по запросу кондиционера (ЭБУ двигателя). Значеня от 0-254
const int mpc107 = 200; // Используется как поправка к графику включения вентилятора двиг.
const int mpc102 = 180;
const int mpc99 = 150;
const int mpc96 = 120;
const int mpc93 = 90;
const int mpc90 = 60;
const int mpc85 = 50;
const int mpc80 = 40;
const int mpc70 = 1;
const int mp120 = 241; // График темпкратуры влючения вентилятора охлаждения двигателя(PWM) Значеня от 0-254
const int mp107 = 240;
const int mp102 = 200;
const int mp99 = 120;
const int mp96 = 60;
const int mp93 = 5;
const int mp90 = 4;
const int mp85 = 3;
const int mp80 = 2;
const int mp70 = 1; // град.цельсия
const int m20 = 0; // Коррекция положения геометрии МАЛЕНЬКОЙ турбины, по давлению большой турбины.
const int m21 = 0;
const int m22 = 0;
const int m23 = 0;
const int m24 = 0;
const int m25 = 0;
const int m26 = 0;
const int m27 = 0;
const int m28 = -1;
const int m29 = -3;
const int m30 = -5;
const int m31 = -7;
const int m32 = -9;
const int m33 = -10;
const int m34 = -10;
const int m35 = -10;
const int m36 = -12;
const int m37 = -15;
const int m38 = -20;
const int m39 = -23;
const int m40 = -26;
const int m41 = -29;
const int m42 = -31;
const int m43 = -34;
const int m44 = -37;
const int m45 = -40;
const int m46 = -40;
const int m47 = -40;
const int m48 = -40;
const int m49 = -40;
const int m50 = -40;
const int m51 = -40;
const int m52 = -40;
const int m53 = -40;
const int m54 = -40;
const int m55 = -40;
const int mpm0 = 0; //0% // Коррекция положения геометрии МАЛЕНЬКОЙ турбины, по положению дросселя %(нагрузке) Значения от -100 до 100)
const int mpm2 = 0;
const int mpm4 = 0;
const int mpm6 = 0;
const int mpm8 = 0;
const int mpm10 = 0;
const int mpm12 = 10;
const int mpm14 = 20;
const int mpm16 = 25;
const int mpm18 = 26;
const int mpm20 = 24;
const int mpm22 = 22;
const int mpm24 = 20;
const int mpm26 = 18;
const int mpm28 = 17;
const int mpm30 = 16;
const int mpm32 = 15;
const int mpm34 = 14;
const int mpm36 = 13;
const int mpm38 = 12;
const int mpm40 = 11;
const int mpm42 = 10;
const int mpm44 = 9;
const int mpm46 = 7;
const int mpm48 = 5;
const int mpm50 = 0; //50%
const int mpm52 = 0;
const int mpm54 = 0;
const int mpm56 = 0;
const int mpm58 = 0;
const int mpm60 = 0;
const int mpm65 = 0;
const int mpm70 = 0;
const int mpm80 = 0;
const int mpm90 = 0;
const int mpm100 = 0; //100%
// Положение геометрии МАЛЕНЬКОЙ турбины, по давлению в выхлопе. Значения от 20 до 250.
//Болшие значения - увеличивают дьюти клапана и повышают давление наддува. )
const int rpm20 = 240;
const int rpm21 = 220;
const int rpm22 = 210;
const int rpm23 = 200;
const int rpm24 = 190;
const int rpm25 = 180;
const int rpm26 = 160;
const int rpm27 = 150;
const int rpm28 = 140;
const int rpm29 = 130;
const int rpm30 = 120;
const int rpm31 = 110;
const int rpm32 = 100;
const int rpm33 = 90;
const int rpm34 = 80;
const int rpm35 = 70;
const int rpm36 = 60;
const int rpm37 = 50;
const int rpm38 = 40;
const int rpm39 = 30;
const int rpm40 = 20;
const int rpm41 = 10;
const int rpm42 = 0;
const int rpm43 = 0;
const int rpm44 = 0;
const int rpm45 = 0;
const int rpm46 = 0;
const int rpm47 = 0;
const int rpm48 = 0;
const int rpm49 = 0;
const int rpm50 = 0;
const int rpm51 = 0;
const int rpm52 = 0;
const int rpm53 = 0;
const int rpm54 = 0;
const int rpm55 = 0;
void setup() {
pinMode (PWM2out, OUTPUT);
pinMode (PWMout, OUTPUT);
pinMode (rpmin, INPUT);
pinMode (FANout, OUTPUT);
pinMode (FANtempin, INPUT);
pinMode (mapin, INPUT);
pinMode (PWM2in, INPUT);
pinMode (FANconin, INPUT);
pinMode (Wout, OUTPUT);
pinMode (RPMin, INPUT);
Serial.begin(115200);
TCCR1B = TCCR1B & 0b11111000 | 0x05;
TCCR2B = TCCR2B & 0b11111000 | 0x05;
}
void loop() {
FANconact = analogRead(FANconin);
FANconact = map(FANconact, 0 , 1023, 0 , 10);
{ switch (FANconact) {
default: FANconval = 0;
break;
case 1: FANconval = mpc120;
break;
case 2: FANconval = mpc107;
break;
case 3: FANconval = mpc102;
break;
case 4: FANconval = mpc99;
break;
case 5: FANconval = mpc96;
break;
case 6: FANconval = mpc93;
break;
case 7: FANconval = mpc90;
break;
case 8: FANconval = mpc85;
break;
case 9: FANconval = mpc80;
break;
case 10: FANconval = mpc70;
break;
} FANconval1 = FANconval;}
{FANact = analogRead(FANtempin);}
FANact = map(FANact, 0 , 323, 0 , 10);
{ switch (FANact) {
default: FANval = 0;
break;
case 1: FANval = mp120;
break;
case 2: FANval = mp107;
break;
case 3: FANval = mp102;
break;
case 4: FANval = mp99;
break;
case 5: FANval = mp96;
break;
case 6: FANval = mp93;
break;
case 7: FANval = mp90;
break;
case 8: FANval = mp85;
break;
case 9: FANval = mp80;
break;
case 10: FANval = mp70;
break;
} FANval1 = FANval + FANconval1;}
if (FANval > 200){ FANconval = 0;}
{ FANval1 = max(FANval1, 10);
FANval1 = min(FANval1, 250);
analogWrite (FANout, FANval1);}
mapact = analogRead(mapin);
mapact = map(mapact, 57 , 390, 0 , 36);
{ switch (mapact) {
default: mapact2 = 0;
break;
case 1: mapact2 = mpm0;
break;
case 2: mapact2 = mpm2;
break;
case 3: mapact2 = mpm4;
break;
case 4: mapact2 = mpm6;
break;
case 5: mapact2 = mpm8;
break;
case 6: mapact2 = mpm10;
break;
case 7: mapact2 = mpm12;
break;
case 8: mapact2 = mpm14;
break;
case 9: mapact2 = mpm16;
break;
case 10: mapact2 = mpm18;
break;
case 11: mapact2 = mpm20;
break;
case 12: mapact2 = mpm22;
break;
case 13: mapact2 = mpm24;
break;
case 14: mapact2 = mpm26;
break;
case 15: mapact2 = mpm28;
break;
case 16: mapact2 = mpm30;
break;
case 17: mapact2 = mpm32;
break;
case 18: mapact2 = mpm34;
break;
case 19: mapact2 = mpm36;
break;
case 20: mapact2 = mpm38;
break;
case 21: mapact2 = mpm40;
break;
case 22: mapact2 = mpm42;
break;
case 23: mapact2 = mpm44;
break;
case 24: mapact2 = mpm46;
break;
case 25: mapact2 = mpm48;
break;
case 26: mapact2 = mpm50;
break;
case 27: mapact2 = mpm52;
break;
case 28: mapact2 = mpm54;
break;
case 29: mapact2 = mpm56;
break;
case 30: mapact2 = mpm58;
break;
case 31: mapact2 = mpm60;
break;
case 32: mapact2 = mpm65;
break;
case 33: mapact2 = mpm70;
break;
case 34: mapact2 = mpm80;
break;
case 35: mapact2 = mpm90;
break;
case 36: mapact2 = mpm100;
break;
} mapact3 = mapact2;}
int sensorValue1 = analogRead(A6); // Датчик положения дросселя
float voltage1 = sensorValue1 * ( 0 , 313 / 1023.0);
// print out the value you read:
int sensorValue2 = analogRead(A4);
// Convert the analog reading (which goes from 0 - 1023) to a voltage (0 - 5V):
float voltage2 = sensorValue2 * ( 0.00 , 5.00 / 1023.0);
int sensorValue = analogRead(A7);
// Convert the analog reading (which goes from 0 - 1023) to a voltage (0 - 5V):
float voltage = sensorValue * ( 0300 , 4800 / 1023.0);
// print out the value you read:
{Serial.print(" Loud value TP% ");
Serial.println(voltage1 - 21.0);
Serial.print(" Exhaust pres. mBar: ");
Serial.println(voltage);
Serial.print(" TP_kor % ");
Serial.println(mapact2 * 0.392);
Serial.print("mBar_kor % ");
Serial.println(PWMval * 0.392 );
Serial.print(" N75 PWM ");
Serial.println(PWMval1 );
Serial.print(" Coll.Temp: ");
Serial.println(sensorValue2);
Serial.print(" FANpwm: ");
Serial.println(FANval1);
Serial.print(" WG: ");
Serial.println(PWM2val1);
Serial.print(" FANcon: ");
Serial.println(FANconval1);}
Wact = analogRead(PWM2in);
Wact = map(Wact, 290 , 823, 20 , 55); //
//
{ switch (Wact) {
default: Wval = 0;
break;
case 20: Wval = r20;
break;
case 21: Wval = r21;
break;
case 22: Wval = r22;
break;
case 23: Wval = r23;
break;
case 24: Wval = r24;
break;
case 25: Wval = r25;
break;
case 26: Wval = r26;
break;
case 27: Wval = r27;
break;
case 28: Wval = r28;
break;
case 29: Wval = r29;
break;
case 30: Wval = r30;
break;
case 31: Wval = r31;
break;
case 32: Wval = r32;
break;
case 33: Wval = r33;
break;
case 34: Wval = r34;
break;
case 35: Wval = r35;
break;
case 36: Wval = r36;
break;
case 37: Wval = r37;
break;
case 38: Wval = r38;
break;
case 39: Wval = r39;
break;
case 40: Wval = r40;
break;
case 41: Wval = r41;
break;
case 42: Wval = r42;
break;
case 43: Wval = r43;
break;
case 44: Wval = r44;
break;
case 45: Wval = r45;
break;
case 46: Wval = r46;
break;
case 47: Wval = r47;
break;
case 48: Wval = r48;
break;
case 49: Wval = r49;
break;
case 50: Wval = r50;
break;
case 51: Wval = r51;
break;
case 52: Wval = r52;
break;
case 53: Wval = r53;
break;
case 54: Wval = r54;
break;
case 55: Wval = r55;
break;
} Wval1 = Wval;
analogWrite (Wout, Wval1);
}
PWM2act = analogRead(PWM2in);
PWM2act = map(PWM2act, 290 , 823, 20 , 55); //
//
{ switch (PWM2act) {
default: PWM2val = 0;
break;
case 20: PWM2val = rp20;
break;
case 21: PWM2val = rp21;
break;
case 22: PWM2val = rp22;
break;
case 23: PWM2val = rp23;
break;
case 24: PWM2val = rp24;
break;
case 25: PWM2val = rp25;
break;
case 26: PWM2val = rp26;
break;
case 27: PWM2val = rp27;
break;
case 28: PWM2val = rp28;
break;
case 29: PWM2val = rp29;
break;
case 30: PWM2val = rp30;
break;
case 31: PWM2val = rp31;
break;
case 32: PWM2val = rp32;
break;
case 33: PWM2val = rp33;
break;
case 34: PWM2val = rp34;
break;
case 35: PWM2val = rp35;
break;
case 36: PWM2val = rp36;
break;
case 37: PWM2val = rp37;
break;
case 38: PWM2val = rp38;
break;
case 39: PWM2val = rp39;
break;
case 40: PWM2val = rp40;
break;
case 41: PWM2val = rp41;
break;
case 42: PWM2val = rp42;
break;
case 43: PWM2val = rp43;
break;
case 44: PWM2val = rp44;
break;
case 45: PWM2val = rp45;
break;
case 46: PWM2val = rp46;
break;
case 47: PWM2val = rp47;
break;
case 48: PWM2val = rp48;
break;
case 49: PWM2val = rp49;
break;
case 50: PWM2val = rp50;
break;
case 51: PWM2val = rp51;
break;
case 52: PWM2val = rp52;
break;
case 53: PWM2val = rp53;
break;
case 54: PWM2val = rp54;
break;
case 55: PWM2val = rp55;
break;
} PWM2val1 = PWM2val;
analogWrite (PWM2out, PWM2val1);
}
mact = analogRead(PWM2in);
mact = map(mact, 290 , 823, 20 , 55); //
//
{ switch (mact) {
default: Mval = 0;
break;
case 20: Mval = m20;
break;
case 21: Mval = m21;
break;
case 22: Mval = m22;
break;
case 23: Mval = m23;
break;
case 24: Mval = m24;
break;
case 25: Mval = m25;
break;
case 26: Mval = m26;
break;
case 27: Mval = m27;
break;
case 28: Mval = m28;
break;
case 29: Mval = m29;
break;
case 30: Mval = m30;
break;
case 31: Mval = m31;
break;
case 32: Mval = m32;
break;
case 33: Mval = m33;
break;
case 34: Mval = m34;
break;
case 35: Mval = m35;
break;
case 36: Mval = m36;
break;
case 37: Mval = m37;
break;
case 38: Mval = m38;
break;
case 39: Mval = m39;
break;
case 40: Mval = m40;
break;
case 41: Mval = m41;
break;
case 42: Mval = m42;
break;
case 43: Mval = m43;
break;
case 44: Mval = m44;
break;
case 45: Mval = m45;
break;
case 46: Mval = m46;
break;
case 47: Mval = m47;
break;
case 48: Mval = m48;
break;
case 49: Mval = m49;
break;
case 50: Mval = m50;
break;
case 51: Mval = m51;
break;
case 52: Mval = m52;
break;
case 53: Mval = m53;
break;
case 54: Mval = m54;
break;
case 55: Mval = m55;
break;
} Mval1 = Mval;}
rpmact = analogRead(rpmin);
rpmact = map(rpmact, 170 , 923, 20 , 55); //
//
{ switch (rpmact) {
default: PWMval = 0;
break;
case 20: PWMval = rpm20;
break;
case 21: PWMval = rpm21;
break;
case 22: PWMval = rpm22;
break;
case 23: PWMval = rpm23;
break;
case 24: PWMval = rpm24;
break;
case 25: PWMval = rpm25;
break;
case 26: PWMval = rpm26;
break;
case 27: PWMval = rpm27;
break;
case 28: PWMval = rpm28;
break;
case 29: PWMval = rpm29;
break;
case 30: PWMval = rpm30;
break;
case 31: PWMval = rpm31;
break;
case 32: PWMval = rpm32;
break;
case 33: PWMval = rpm33;
break;
case 34: PWMval = rpm34;
break;
case 35: PWMval = rpm35;
break;
case 36: PWMval = rpm36;
break;
case 37: PWMval = rpm37;
break;
case 38: PWMval = rpm38;
break;
case 39: PWMval = rpm39;
break;
case 40: PWMval = rpm40;
break;
case 41: PWMval = rpm41;
break;
case 42: PWMval = rpm42;
break;
case 43: PWMval = rpm43;
break;
case 44: PWMval = rpm44;
break;
case 45: PWMval = rpm45;
break;
case 46: PWMval = rpm46;
break;
case 47: PWMval = rpm47;
break;
case 48: PWMval = rpm48;
break;
case 49: PWMval = rpm49;
break;
case 50: PWMval = rpm50;
break;
case 51: PWMval = rpm51;
break;
case 52: PWMval = rpm52;
break;
case 53: PWMval = rpm53;
break;
case 54: PWMval = rpm54;
break;
case 55: PWMval = rpm55;
break;
} PWMval1 = PWMval + mapact3 + Mval1;
}
{PWMval1 = max(PWMval1, 10);
PWMval1 = min(PWMval1, 250);
analogWrite (PWMout, PWMval1);}
}
Основной момент, который меня не устраивает в текущей версии, это дискретное изменение уровней управляющих сигналов (отсутствие интерполяциимежду ячейками данных в "графиках"). В виду отсутствия знаний по ардуино, не знаю как это реализовать.
В текущей версии кода, на верняка есть масса грамоздких и не нужных вещей.. Но в целом, все работает.
Пожалуйста прокоментируйте код, если есть серьезные ошибки. И по поводу интерполяции конечно тоже..
https://youtu.be/CwWRpPwRT_0
https://goo.gl/photos/AwVyNv6GyQNqukaq6
https://goo.gl/photos/dWMH3j5UBDfbjmuHA
ну наверное самая первая оптимизация, которую нужно провести это засунуть все в массивы.
ну наверное самая первая оптимизация, которую нужно провести это засунуть все в массивы.
А вы могли бы на каком нибудь фрагменте кода показать, как это сделать ?
Ну если не вдаваться в подробности выглядеть будет примерно так:
ИСХОДНЫЙ ТЕКСТ:
ЧЕРЕЗ МАССИВ:
В ТЕЛЕ ПРОГРАММЫ:
ИСХОДНЫЙ ТЕКСТ:
ЧЕРЕЗ МАССИВ:
В таком виде можно расширить массив (допустим не 10 значений сделать, а 30) и сделать более плавную регулировку. Для этого в данном виде не нужно дописывать +100500 строчек кода, а просто добавить 20 лишних значений в первой строчке объявления массива.
Да, это классно ! Спасибо за помощь ! Попробую переделать код, испытаю.. И напишу что получилось.
И вот еще следующий вопрос для размышления:
Во многих местах функцией map идет пересчет данных в область начинающуюся не от нуля, а куда-то выше, а далее по коду идет простой {switc case}.
rpmact = map(rpmact, 170 , 923, 20 , 55);
Почему не делается вот так:
rpmact = map(rpmact, 170 , 923, 0 , 35);
И тогда также при инициализации программы также забивается массив данных, только при этом не потребуется вносить первые 20 нулей.
Может в твоем действии и есть сакральный смысл, но вот так вот сходу я смог его понять и считаю, что можно и нужно сделать именно так, как я предлагаю.
Для красоты кода и минимизации использования памяти, все переменные, которыми ты описываешь порты ввода/вывода нужно объявлять не через int
ВОТ ТАК НЕ НУЖНО:
А ВОТ ТАК ХОРОШО:
Для красоты кода и минимизации использования памяти, все переменные, которыми ты описываешь порты ввода/вывода нужно объявлять не через int
ВОТ ТАК НЕ НУЖНО:
Теперь настало время сделать все по феншую..) Пока протестировать возможности нет. Меняю турбины и распылители форсунок, на побольше..
Нет, ни какого сокрального смысла.. Просто в перво источнике было больше ячеек (от 0 до 55) я убрал первые 20.. Потом просто размножил этот "пример" по другим функциям..
Вот исправленная версия.. Еще, для удобства настроики, добавил графический интерфес от remotexy и перевел некоторые "тугрики", в проценты.
Еще есть не решенный вопрос: Сигнал оборотов двигателя. Ни как не могу определиться, как его получить. Есть вариант взять сигнал от датчика хола(датчик распредвала) и счетать импульсы.. Но способа как это сделать, без помех для выполнения остальной части программы, я пока не нашел. Можно просто на аналоговом входе повесить кондер и преобразовывать частоту в напряжение, с последующей калибровкой полученого сигнала. Точность конечно будет не высокая, но думаю для данных нужд достаточня.. И еще есть вариант получать данные из OBD2.., что тоже, для меня пока не изведанно..
А почему не получилось и программировать и работать через один и тот же интерфейс BT? Я подозреваю, что вы все таки имели ввиду то, что вы одновременно в одном программном интерфейсе не можете поочередно выполнять управление и при необходимости калибровку. Правильно ли я понял?
Я делал в одном из проектов следующим образом:
1. Разделил все передаваемые пакеты по классам. Т.е. есть пакет управления, есть пакет калибровки. Каждый из пакетов начинается со своего кодового слова. В самом программном интерфейсе ввел переключатель (калибровка/управление). В зависимости от выбранного положения все пакеты маркируеются сначала своим кодовым словам.
2. На приемной части сначала идет разбор заголовка пакета - это управление или это калибровка. И для каждого из них свой алгоритм выполнения.
В таком виде очень просто и управляется и если нужно калибруются какие-нибудь параметры.
Я имел в виду заливку скетча, через аппаратный порт, и интерфес (данные плюс управление), через софтварный. Все передается через один общий модуль блютус (uart). Без каких либо разделений по пакетам и без конфликтов.
Программы для редактирования скетча и просмотра данных/управления, естественно разные. Поэтому единственным обязательным условием, является необходимость отключиться от одной программы, перед тем как использовать другую.. На практике, получилось очень удобное устройство, для прграмирования которого, не нужен физический контакт. Мечта строителей самоходячих роботов..))
Всем доброго времени суток! Прошел еще год, но мой проект жив и продолжает развиваться. За год удалось достичь серьезных результатов по мощностным показателям двигателя и его отказоустойчивости. Из нововвидений; добавил функчию дата логера и пришлось добавить управление еще одним перепускным клапаном для турбин. Дата логер получился очень прикольный и удобный. Логи сохраняются в виде csv файлов. Для просмотра можно использовть https://www.efianalytics.com/MegaLogViewer/download/ . Но что бы двигаться дальше, необходимо еще лучше дорабатывать систему управления. В настоящий момент я уже практически полностью исчерпал ресурсы Ардуино Нано. Не осталось свободных выводов и памяти. Уже заказана новая плата Мега про мини и вся периферия для нее. Но есть одна большая проблема - это недостаток моих знаний и опыта в программировании. Я знаю, какими должны получиться функции, но я не знаю как это правильно реализовать. В прошлом году мне очень сильно помогли некоторые участники этого форума. Очень надеюсь и в будущем услышать какие то советы.
Ну а сейчас перейду к конкретике: Очень хочется реализовать возможность в онлайне, через последовательный порт, изменять настройки. В сети есть примеры подобных решений, но к сожалению мой уровень знаний пока не позволяет мне понять все ньюансы. По этому прошу помощи. Вот собственно мой актуальный код:
мой проект жив и продолжает развиваться. За год удалось достичь серьезных результатов по мощностным показателям двигателя и его отказоустойчивости.
Из гаража удалось выехать, не заглохнув?
мой проект жив и продолжает развиваться. За год удалось достичь серьезных результатов по мощностным показателям двигателя и его отказоустойчивости.
Из гаража удалось выехать, не заглохнув?
Прагрес.
Прагрес.
Из гаража удалось выехать, не заглохнув?
https://youtu.be/mX8FVFxZQUQ
del