LusoRobótica - Robótica em Português
Sistemas específicos => Arduino / AVR => Tópico iniciado por: cstefan em 18 de Março de 2016, 11:44
-
Boas pessoal estou a adaptar um sistema biturbo que funciona da seguinte maneira.
(https://lusorobotica.com/proxy.php?request=http%3A%2F%2Fbioage.typepad.com%2F.shared%2Fimage.html%3F%2Fphotos%2Funcategorized%2Fopel_twinturbo_1.PNG&hash=46218acccc78122ee90737ca722796eb6117b1e8)
]http://bioage.typepad.com/.shared/image.html?/photos/uncategorized/opel_twinturbo_1.PNG[
tenho um problema no codigo, que deve ser uma coisa minima.. ao compilar e queria saber se alguem me pode dar uma ajuda e ja agora outra sugestao para os IF´s, de modo a que funcione mais ou menos como na foto.. a unica diferença é que o meu em vez de funcionar por rotaçao vai funcionar por Pressao atravez de um sensor map. na foto apenas falta a valvula wastegate que fica a saida do turbo grande e é o que faz a descarga quando chega a pressao maxima.
-
A imagem bem inserida:
(https://lusorobotica.com/proxy.php?request=http%3A%2F%2Fbioage.typepad.com%2Fphotos%2Funcategorized%2Fopel_twinturbo_1.PNG&hash=0f800f821b1ac26b1a5d5cccc8e032d37777af84)
O teu código mais legível:
#define sensorPin 0
int comporta = 13;
int admissao = 12;
int wastegate = 11;
void setup() {
Serial.begin(9600);
pinMode(comporta, OUTPUT);
pinMode(admissao, OUTPUT);
pinMode(wastegate, OUTPUT);
}
void loop() {
int boostkPa = map(analogRead(sensorPin), 0, 1023, 50, 400);
int boostMbar = boostkPa * 10 ; //Converts boostkPa to Mbar
Serial.print("kPa :"); Serial.println(boostkPa);
Serial.print("Mbar :"); Serial.println(boostMbar);
delay(1000);
if (boostMbar <2200)
{
// tudo fechado
analogWrite(comporta, 0);
digitalWrite(admissao, LOW);
digitalWrite(wastegate, LOW);
}
if (boostMbar >2200 && <2800)
{
// abre Comporta a meio
analogWrite(comporta, 100);
digitalWrite(admissao, LOW);
digitalWrite(wastegate, LOW);
}
if (pressao > 2800 && < 3000)
{
// abre comporta toda
analogWrite(comporta, 255);
digitalWrite(admissao, HIGH);
digitalWrite(wastegate, LOW);
}
if (pressao >3000)
{
// abre wastegate
analogWrite(comporta, 255);
digitalWrite(admissao, HIGH);
digitalWrite(wastegate, HIGH);
}
}
Tens nesse código vários problemas
- Condições mal escritas.
Nos IFs "if (boostMbar >2200 && <2800)" tens de meter a variável na segunda comparação. "<2800" só por si não significa nada. Tem de ser: "if (boostMbar >2200 && boostMbar<2800)".
O mesmo nos outros Ifs.
- Sendo uma aplicação muito sensível em termos de tempo, usar um delay() no loop vai-te encravar isso tudo. Durante 1 segundo o Arduino vai ficar parado sem fazer nada, nesse género de sistemas não podes dar-te a esse luxo. Pior ainda, meteste esse atraso entre a leitura do sensor MAP e a atuação das válvulas.
- Devias considerar usar "elseif" nesse género de condições, dá-te mais garantias de que não tens sobreposições (entrar em dois ifs para o mesmo valor de entrada)
- Por último, usar um Arduino para esse fim é completamente errado, a menos que se trate apenas de uma brincadeira/demonstração. Usar um arduino num sistema tão crítico num veículo que vá circular é para colocar em risco a tua vida e a de terceiros.
-
A imagem bem inserida:
(https://lusorobotica.com/proxy.php?request=http%3A%2F%2Fbioage.typepad.com%2Fphotos%2Funcategorized%2Fopel_twinturbo_1.PNG&hash=0f800f821b1ac26b1a5d5cccc8e032d37777af84)
O teu código mais legível:
#define sensorPin 0
int comporta = 13;
int admissao = 12;
int wastegate = 11;
void setup() {
Serial.begin(9600);
pinMode(comporta, OUTPUT);
pinMode(admissao, OUTPUT);
pinMode(wastegate, OUTPUT);
}
void loop() {
int boostkPa = map(analogRead(sensorPin), 0, 1023, 50, 400);
int boostMbar = boostkPa * 10 ; //Converts boostkPa to Mbar
Serial.print("kPa :"); Serial.println(boostkPa);
Serial.print("Mbar :"); Serial.println(boostMbar);
delay(1000);
if (boostMbar <2200)
{
// tudo fechado
analogWrite(comporta, 0);
digitalWrite(admissao, LOW);
digitalWrite(wastegate, LOW);
}
if (boostMbar >2200 && <2800)
{
// abre Comporta a meio
analogWrite(comporta, 100);
digitalWrite(admissao, LOW);
digitalWrite(wastegate, LOW);
}
if (pressao > 2800 && < 3000)
{
// abre comporta toda
analogWrite(comporta, 255);
digitalWrite(admissao, HIGH);
digitalWrite(wastegate, LOW);
}
if (pressao >3000)
{
// abre wastegate
analogWrite(comporta, 255);
digitalWrite(admissao, HIGH);
digitalWrite(wastegate, HIGH);
}
}
Tens nesse código vários problemas
- Condições mal escritas.
Nos IFs "if (boostMbar >2200 && <2800)" tens de meter a variável na segunda comparação. "<2800" só por si não significa nada. Tem de ser: "if (boostMbar >2200 && boostMbar<2800)".
O mesmo nos outros Ifs.
- Sendo uma aplicação muito sensível em termos de tempo, usar um delay() no loop vai-te encravar isso tudo. Durante 1 segundo o Arduino vai ficar parado sem fazer nada, nesse género de sistemas não podes dar-te a esse luxo. Pior ainda, meteste esse atraso entre a leitura do sensor MAP e a atuação das válvulas.
- Devias considerar usar "elseif" nesse género de condições, dá-te mais garantias de que não tens sobreposições (entrar em dois ifs para o mesmo valor de entrada)
- Por último, usar um Arduino para esse fim é completamente errado, a menos que se trate apenas de uma brincadeira/demonstração. Usar um arduino num sistema tão crítico num veículo que vá circular é para colocar em risco a tua vida e a de terceiros.
obrigado :)e nesse caso no else if metia o que?o delay vou tirar apenas esta para uso de demostraçao, enquanto a velocidade e facto de ser um arduino nao existe problema nenhum, visto que a parte da "segurança" por assim dizer é programada na propria centralina do carro.
-
obrigado :)e nesse caso no else if metia o que?o delay vou tirar apenas esta para uso de demostraçao, enquanto a velocidade e facto de ser um arduino nao existe problema nenhum, visto que a parte da "segurança" por assim dizer é programada na propria centralina do carro.
Tens muitos tutorials, manuais e vídeos na net que ensinam a programar e explicam os "elseif" e outros conceitos de programação, muito melhor do que eu sou capaz ou tenho paciência. Usa o google, com erros tão básicos que o teu código tem não te fazia mal nenhum perder umas horitas a aprender programação. O Arduino é C / C++ disfarçado, encontras mesmo carradas de material.
O problema do Arduino com a segurança não é a "velocidade". É mesmo que tem montes de código por trás escondido que não sabes o que está a fazer e nada te garante que não encrave, as saídas e entradas não tem qualquer tipo de proteção a todo o tipo de interferências nefastas que encontras num ambientes automóvel, e por aí fora.
"segurança" não são airbags e travões. Estás a mexer diretamente na admissão do motor, e um problemas/erro pode facilmente desligar-te o motor ou tornar irregular o seu funcionamente. Queres arriscar uma falha de motor quando fores numa autoestrada a 140 na faixa da esquerda a ultrapassar um camião? ou uma aceleração súbita a meio de uma curva num ambiente urbano? Não é só a tua vida que arriscas.
Explico-te de forma mais visual:
Conta os componentes aqui:
(https://upload.wikimedia.org/wikipedia/commons/7/71/Arduino-uno-perspective-transparent.png)
E conta os que estão aqui:
(https://lusorobotica.com/proxy.php?request=http%3A%2F%2Fwww.nsxprime.com%2Fphotopost%2Fdata%2F1415%2Fmedium%2FNSX-R_OEM_ECU1.jpg&hash=7d5e13db80a17731eceaade54009ccaa24dd6235)
Porque achas que há uma diferença tão grande? dica: não é por causa de falta otimização de custos, no mundo automóvel tenta-se sempre fazer mais por menos.
-
E conta os que estão aqui:
(https://lusorobotica.com/proxy.php?request=http%3A%2F%2Fwww.nsxprime.com%2Fphotopost%2Fdata%2F1415%2Fmedium%2FNSX-R_OEM_ECU1.jpg&hash=7d5e13db80a17731eceaade54009ccaa24dd6235)
Porque achas que há uma diferença tão grande? dica: não é por causa de falta otimização de custos, no mundo automóvel tenta-se sempre fazer mais por menos.
Ate faltam ali uns componentes pelo meio :P .. eh ir tirando ate isso parar de funcionar :O
-
Quando me referi a segurança estava mesmo a falar da centralina do motor que mesmo não controlando os turbos consigo fazer bem à gestão de safe mods. Quantidade de gasóleo etc.., se funcionar como eu espero evolui se para uma pcb custom made com um arm ou coisa do género.
-
E porque não ir para uma Megasquirt ou algo mais a sério e pensado já de raiz para ambiente automovel?
-
E porque não ir para uma Megasquirt ou algo mais a sério e pensado já de raiz para ambiente automovel?
A megasquirt é só para carros a gasolina, este é um 530d com o sistema biturbo OEM do 535d.. Hardware plug And play.
-
Podes sempre aprender a programar o chip que está na megasquirt.
E a ideia é alterar o ponto de transição, ou fazer isso E fazer mais pressão?
-
Stefan, o que é que acontece se boostMbar = 2200 ou = 2800 ou = 3000?
-
Stefan, o que é que acontece se boostMbar = 2200 ou = 2800 ou = 3000?
a 2200 abre a meio a 2800 toda e a 3000 abre a wastegate, terei que por nesse caso <= ou >= ?
-
Olha isso é assim por steps?
Não tipo uma formula para isso em que depois fazer o controlo?
-
Olha isso é assim por steps?
Não tipo uma formula para isso em que depois fazer o controlo?
boas, sim nesse caso como em vez de funcionar por rpm funciona por pressao pode ser por steps, agora estou na duvida se uso if ou case :/
-
Vais ter um tempo de reacção extremamente lento..
A fazer prints, e com um delay de 1 segundo a cada volta do "loop de controlo", a coisa será algo estranha de se conduzir.
Depois tens zero filtragem e condicionamento de sinal do que sensor que estás a ler, vais ter ruido e montes de oscilações.
Á a parte já referida dos > ou >=, porque tens valores de pressão que não produzem um resultado válido em qualquer um dos if's.
Entre if's e cases a coisa dá no mesmo.
Sim, é possivel usar um Arduino para o que queres fazer.
E se esse sensor de pressão for um extra não ligado a mais lado nenhum dificilmente atrofias assim tanto a centralina, mas podes á mesma ter comportamentos erráticos de tentar abrir e fechar qualquer uma dessas valvulas rapidamente, mas não muito, já que o delay de 1s tambem torna o controlo super lento a responder.
Mas terias de começar do zero, não depender de código de terceiros e adicionar alguma/muita protecção a nivel de hardware.
Dai eu ter falado em Megasquirt, ela trabalha onde tu bem quiseres, não é só para carros a gasolina.
-
tudo dito acima... o arduino "serve" para o que queres (desde que consigas jogar com a centralina a evitar os safes quando a pressão real não for a pedida), mas o código não é o teu forte mesmo. ou passas por um processo de aprendizagem mais lendo ou pede alguém que te faça algo de raiz.
por curiosidade qual é a tua casa?