OpenEFI (Sistema de inyeccion OpenSource)

Hola a todos! luego de pertenecer un rato largo a este foro, doy mi primer aporte, bueno, mejor dejo de palabrerio y les muestro de que trata.

ADVERTENCIA: este proyecto todavia esta en fase de desarrolo, si intenta usarla en su vehiculo, lo hace bajo su propio riesgo

OpenEFI es basicamente una ecu programable como las megasquirt, Besse, fueltech, etc, solo que esta esta orientada de otra manera, en las demas los sensores y actuadores ya estan definidos (pin 8 es el acelerador por ejemplo).

en cambio, en esta ecu, solo hay X cantidad de entradas analogicas + sensor lambda + sensor ckp, estos dos no entran en el conjunto anterior por necesitar un tratado de señal diferente, pasa lo mismo con los actuadores, hay X cantidad de canales de salida, estos son manejados por mosfet de canal N, por lo que permiten conectar cuantas bobinas o inyectores se necesite.
todo esto se desarrollo para que la ecu sea lo mas "universal" que se pueda, asi ademas de podes adaptar motores de carburador a inyeccion facilmente, se puede adaptar la ecu a una instalacion de inyeccion ya existente

de toda la parte logica se encarga un STM32F, con bootloader de arduino, aunque, tambien se puede usar un arduino nano sin problemas o incluso otro , OpenEFI se centra en presentar un software opensource para crear una ecu, usted puede o no usar el hardware recomendado, yo solo las hice para que no quede "vació" el proyecto

la programación de las tablas y/o algoritmos de la misma, se realiza a través de un programa de pc que estoy diseñando, se llama "OpenEFI || Tunner" que voy a ir mejorando conforme avance el tiempo, no es la interfaz mas linda del mundo, pero anda

este es el diagrama de una entrada analógica cualquiera, es un simple filtro pasa bajos para evitar la interferencia que pueda llegar a tener la señal:

Capture4.PNG
y este es un driver:
Capture3.PNG
se usa un zener de 24v y 1W (1n4004) para protejer el mosfet, aunque también se puede remplazar por dos diodos en flyback, respecto al mosfet en si, se puede usar cualquiera de canal N con una corriente superior a los 10A y con baja resistencia (menos de 1 ohm en lo posible), yo use este porque quería usar mosfet SMD, un mosfet fácil de conseguir y que ya probé como driver es el IRFZ44N
PD: aparece un MJD122 en el plano porque me gustaba mas el footprint de este que el del mosfet que iba a usar, asi que quedo ese componente

dado que los driver sirven indistintivamene para bobinas o inyectores, se pueden armar varias configuraciones como por ejemplo:
  • 6 inyectores independientes, encendido convencional
  • 6 inyectores agrupados ( 3 en un canal, 3 en otro) y encendido electrónico
  • 4 inyectores independientes y encendido electrónico
  • 4 bobinas de encendido electrónico (para un V8 /L8 )
  • 3 bobinas de encendido electrónico (para un V6/L6)
  • 2 bobinas de encendido elelectronico (para un 4L)

si se utiliza un Arduino Mega o DUE se pueden incluso tener un motor V8 / L8 con encendido electrónico e inyección
también se disponen de 5 relay con múltiples funciones (también se pueden reprogramar para hacer otra cosa)
  • Relay de bomba de combustible
  • Relay de ventilador
  • Relay de rampa de inyección y bobina
  • Relay de A/A
  • Relay de GNC/GLP

desde esta ecu tambien se pueden manejar equipos de gnc/glp sin tener que poner emuladores de inyectores ni nada raro

además estoy empezando a implementar DTC's para verificar la integridad de los sensores, para leerlos o borrarlos no hace falta un scanner, solo conectar la ecu por el puerto usb como se usaría para programar.
estos son los PCB para STM32:
Capture.PNG
Capture2.PNG
todo el código se encuentra en GitHub, publicarlo acá haría muy engorroso el actualizarlo, este es el link FDSoftware/OpenEFI

si tienen alguna idea constructiva /destructiva siempre sera bienvenida, en un futuro pienso implementar el bus can en la ecu para poder controlar un odómetro, dejo en adjuntos los planos de eagle
PD: mañana empiezo a explicar el funcionamiento de la ecu, y como administra cada algoritmo de inyeccion, ademas de que voy a responder algunas dudas que tengan. Gracias!
 

Adjuntos

  • OpenEFI(STM32F) rev1.zip
    628.5 KB · Visitas: 122
Última edición:
La primer pregunta que se me genera es, como adaptas la ECU universal a un determinado auto sin conocer su curva de avance? Esta claro que si es perfectamente configurable las entradas (sensores) y salidas (actuadores), pero cada auto trabajo de forma distinta, y su motor tiene características distintas, por lo que sus avances varían de auto a otro. Como también varían las señales del sensor de fase de un vehículo a otro. Como es que abordas está problemática sin conocer dichos parámetros?
Por cierto muy buen aporte e interesante proyecto.
 
Como es que abordas está problemática sin conocer dichos parámetros?
Básicamente con una cantidad gigante de #defines en el código (como aca con los DTC), además que hay tablas de avance y de tiempos base de inyección que el usuario va a tener que llenar mañana temprano subo lo que falta de los planos y tambien muestro como son las tablas de avance / inyeccion, tambien uso algoritimos que utilizan otras ecus, como el BPW o e Alpha Plus en este segmento de codigo se ven, ademas de mas #define para configurar la ecu
 
que bárbaro se me ocurrió hacer una ECU hace como un año pero esto esta muy por encima de lo que había pensado.
que emoción ¿como empezaste el proyecto? y ¿en que protocolos te basaste?
 
el proyecto lo habia empezado hace dos años cuando estaba cursando el secundario, en mi colegio no tenian una ecu programable, por lo que hablando con un profesor termine diciendo que podria desarrollar una pequeña para "safar" mientras conseguian una "enserio" , en ese entonces ya sabia algo de programacion en C++ y tenia algunos proyectos realizados con arduino,
luego de un tiempo dejaron de ayudarme en el colegio cuando se dieron cuanta que iban a tener que gastar dinero para hacerlo de la cooperadora (años despues me entere que todo lo relacionado con la cooperadora estaba bastante corrupto y por eso no compraban nada a pesar de tener un ingreso bastante importante)

pero bueno, no quise dejar todo lo que habia desarrollado juntando mugre, asi que le puse un nombre y lo subi a github, con el tiempo fui mejorando el codigo, ademas de seguir formandome sobre electronica y profundizar mas mis conocimientos de c++ hasta que pude avanzar lo suficiente en el desarrollo como para que merezca la pena publicarlo aca, ahora en un ratito muestro los algoritmos


estas son las tablas de inyeccion (rpm/temp) y avance (rpm/map), las mismas se editan con OpenEFI Tunner , ya que estoy subo un par de capturas del mismo:
tuner2.PNG
esta es la de avance: faltan cargarle datos, pero tiene esta estructura
tuner3.PNG

proximamente quiero terminar de asignarles colores a los rangos de tiempos de inyeccion y avance como se ve en la primer foto, todo este programa esta desarrolado en C#
ahora el software, esta todo programado en C++ con algunos segmentos en C, esta diseñado para compilarse en la mayoria de las placas de arduino, o que puedan usar el bootloader arduino (como el STM32F que uso en el pcb)

como compilador uso el Visual Studio con la extencion "visual micro" pero tambien se podria usar la ide de arduino, aunque es bastante mas complicado el depurar codigo, por eso hice el cambio de IDE basicamente

la configuracion principal esta en el archivo "OpenEFI.ino"

C++:
/*-----( Define's )-----*/
#define test 1  //modo pruebas con placa debug
#define mtr 1   //definir tipo de motor 0 = diesel ; 1 = nafta
#define dev 1   //habilita modo desarollo
#define alpha 1 //Habilita el modo de prubas alpha
#define GNC_MOD 0 //activa el modo de GNC/GLP en la inyeccion
#define uEFI 0 //en 1 si se compila para una placa uEFI
#define OpenEFImode 0 // en 0 si es OpenEFI con Arduino nano, en 1 si utiliza un Node MCU

con el "test" en 1 se anula la verificacion del PMS del motor, lo uso solo para probar el funcionamiento de la ecu con un 555 en la entrada del sensor CKP
en un futuro quiero que la ecu tambien se pueda usar con motores Diesel, pero por ahora mtr siempre tiene que ser 1 , sino se desactiva el encendido electronico


luego la configuracion de los sensores se describe en "pines.h"

C++:
/*-----( PINOUT: (Sensores) )-----*/
#define maraccMode 1
//modo de mariposa de aceleracion, en modo (1) utiliza solo el potenciometro 1
//en modo 0 utiliza los dos

#define uEFI 0

#if defined(ESP8266)
//OpenEFI con NodeMCU
byte A = 3, //pines del MUX analogico
    B = 4,
    C = 5;
byte TPS1 = 2;  //Pin de potenciometro de TPS 1
byte TPS2 = 3;  //Pin de potenciometro de TPS 2
byte TEMP2 = 4;  //pin de sensor de temperatura de agua
byte mar = A0; //pin de mariposa de acelerador
byte LMBA = A0; //pin sonda lambda A
byte LMBB = A0; //pin sonda lambda B
byte vmtP = 1;  //pin de ventialador
#endif // OpenEFImode == 1

#if uEFI == 0
#if defined(__AVR_ATmega328P__)
//OpenEFI con Arduino NANO v3
byte A = A3, //pines del MUX analogico
     B = A2,
     C = A1;
byte TPS1  = 2;  //Pin de potenciometro de TPS 1
byte TPS2  = 3;  //Pin de potenciometro de TPS 2
byte TEMP2 = 4;  //pin de sensor de temperatura de agua
byte mar   = A1; //pin de mariposa de acelerador
byte LMBA  = A4; //pin sonda lambda A
byte LMBB  = A5; //pin sonda lambda B
byte vmtP  = 4;  //pin de ventialador
#endif // OpenEFImode == 0
#endif

#if uEFI == 1
byte TPS1 = 2;  //Pin de potenciometro de TPS 1
byte TPS2 = 3;  //Pin de potenciometro de TPS 2
byte TEMP2 = 4;  //pin de sensor de temperatura de agua
byte mar = A0; //pin de mariposa de acelerador
byte LMBA = A1; //pin sonda lambda A
byte vmtP = 4;  //pin de ventilador
#endif // uEFI == 1

uEFI en una version mas ligera de la ecu, parecida a las Motronic 2X de bosh, mañana explico bien como se diferencia esta del resto

las versiones con STM32, Arduino Uno / Nano / Micro al tener menos pines se utiliza un mux analogico (74hc4067) para poder administrar todas las entradas analogicas

y la de los actuadores en "pines2.h"

C++:
/*-----( PINOUT: (Actuadores) )-----*/
byte pines[] = { 1,5,6 }; //inyectores
byte pinesE[] = { 7,8}; //encendido

aca se define cuantos driver se utilizan para inyectores y cuantos para encendido, otra configuracion para tener 6 salidas de inyectores seria esta:
C++:
/*-----( PINOUT: (Actuadores) )-----*/
byte pines[] = { 1, 5, 6 , 7, 8}; //inyectores
byte pinesE[] = { 0, 0}; //encendido
 
Última edición:
que triste de verdad todos pasamos por la corrupción, yo tengo varias Ecu para 3 cilindros y 3 bobinas 4 cilindros con válvula IAC a motor de pasos , de 4 bobinas y 2 bobinas ahí tiradas y varios sensores CKP y CMP inductivos y tiliches varios.

casi todas usan chips infineon y transistores IGBT para el control de las bobinas casi todas truenan de los drivers de cuerpo de aceleración y de los drivers de control de rele de gasolina o ventilador.
nunca falta un monkiki que hace sus inventos reventando la electrónica de la ECU.
 
La primer pregunta que se me genera es, como adaptas la ECU universal a un determinado auto sin conocer su curva de avance? Esta claro que si es perfectamente configurable las entradas (sensores) y salidas (actuadores), pero cada auto trabajo de forma distinta, y su motor tiene características distintas, por lo que sus avances varían de auto a otro. Como también varían las señales del sensor de fase de un vehículo a otro. Como es que abordas está problemática sin conocer dichos parámetros?
Por cierto muy buen aporte e interesante proyecto.
Esa información es fácilmente conseguible en el ámbito de los que trabajan con Ecus, Hay información de todo lo relacionado a cada modelo, tanto de nacionales como importados.
Utilice parte de esa información para hacer un simulador que nos pidieron para poder trabajar con la Ecu fuera del auto, hay toda la info necesaria, con gráficos y detalles puntuales.
Esa información sirve para cambiar el comportamiento integro del motor y es utilizado por aquellos que venden los llamados chip potenciados para las Ecus.
Por ejemplo esta el regimen máximo del motor en condiciones standard la curvas de rpm y potencia y las de rpm y torque, y los niveles de los distintos sensores existentes para cada uno de los parámetros anteriores, no es juego de niños, requiere conocer muy bien sobre motores de combustión interna de 4T, también el ámbito de sensores disponibles en el mercado.
He participado en la elaboración de una Ecu para autos que no la tenían que permite reemplazar el carburador por un sistema monopunto por ejemplo, se empezó con algo muy sencillo y luego se fue perfeccionando, logrando resultados increíbles, es un mundo apasionante y hay que dedicarle mucho tiempo para obtener resultados, si se trabaja en equipo mucho mejor, también hay que tener elementos de análisis y construirte tu equipamiento para ensayo de sensores, para lo cual hay que estar muy empapado del funcionamiento de c/u, con eso podes obtener las curvas y cualquier otra información que sea necesaria.

Quién no conoce de pleno este mundo mira esto con esceptisismo pero es perfectamente viable.
Ayuda a conocer los componentes típicos que se utilizan en una Ecu, en mi caso he reparado una gran cantidad de ellas.
 
Nunca he diseñado una pero he llegado a reparar computadoras ecu y los sensores me sorprende que son muy simples pero robustos.
Ejemplo el tps es un potenciómetro , el cuerpo de aceleración electrónico es solo 2 potenciómetros, el Sensor de temperatura es un termistor , el Sensor MAP es un termistor y un piezoeléctrico, el ckp y el cmp son inductores y en otros son Sensores Hall.
Las fallas siempre son por algún manotas que le corta o pica los arneses con un alfiler o una navaja por qué no tienen idea de lo que están haciendo.

Y la verdad con todo eso que vi en el taller me salió la curiosidad de si se podía hacer una ECU con un pic o un AVR no se me ocurrió hacer la infraestructura del OBDII.
La verdad es fascinante
 
casi todas usan chips infineon y transistores IGBT para el control de las bobinas casi todas truenan de los drivers de cuerpo de aceleración y de los drivers de control de rele de gasolina o ventilador.
nunca falta un monkiki que hace sus inventos reventando la electrónica de la ECU.

sep, yo en un principio queria usar IGBT de infenion, además de unos chip para los sensores que hace nxp, que agarra todas las señales y las pasa por spi, además que hace el mismo chip la generación de los DTC, pero acá en argentinaworld es medio imposible traer algo de electrónica en cantidad como para probar y quemar tranquilo, asi que me la tuve que arreglar con los componentes que se consiguen acá :LOL:
 
Muy bueno el proyecto felicitaciones, estoy intentando compilar el proyecto para un nano sin éxito. Me tira error con REQ_FUEL no definida, en algún lugar tenes el proyecto actual? vi que hay dos en gitgub. Estaba buscando un CDI con mapa pero esto es superador, abrazo
 
Me tira error con REQ_FUEL no definida, en algún lugar tenes el proyecto actual? vi que hay dos en gitgub. Estaba buscando un CDI con mapa pero esto es superador, abrazo
Hola, fíjate que tiene que ser el branch máster y con el usuario "FDSoftware" que es el mio, ahí se encuentra el código mas actualizado, ahora cuando pueda reviso ese define, pero creo que compilaba ahora
 
Hola, fíjate que tiene que ser el branch máster y con el usuario "FDSoftware" que es el mio, ahí se encuentra el código mas actualizado, ahora cuando pueda reviso ese define, pero creo que compilaba ahora

Ahí puede ver era un problema entre mayúscula y minúscula, después un "=" en una asignación, ahora estoy con la variable de temperatura que me dice que no esta asignada. El proyecto tal cual esta en la carpeta a vos te compila? Le estoy pifiando en algo? Saludos
 
El proyecto tal cual esta en la carpeta a vos te compila? Le estoy pifiando en algo? Saludos
si, cuando descargas todo el codigo tenes que renombrar la carpeta "stable" a "OpenEFI" y lo abris con la IDE de arduino, el codigo que esta en scr le voy agregando cosas continuamente, pero en stable esta el codigo ya funcional, cuando tenga tiempo voy a separarlo en dos ramas asi no hay mucha confusion, avisame cualquier duda. Saludos!
 
Arduino:1.8.5 (Windows 10), Tarjeta:"Arduino Nano, ATmega328P"

C:\Users\FZ\Downloads\OpenEFI-master\stable\OpenEFI\OpenEFI.ino: In function 'void Iny()':

OpenEFI:108: error: 'main' was not declared in this scope

if ( main.Temp() < 45 )

^

OpenEFI:111: error: 'main' was not declared in this scope

if ( main.Temp() > 45 )

^

OpenEFI:113: error: 'main' was not declared in this scope

if ( main.Temp() > 45 && _RPM < 1200 )

^

OpenEFI:115: error: 'main' was not declared in this scope

if (main.Temp() >= 105 && _RPM < 1200) //sobre temperatura

^

exit status 1
'main' was not declared in this scope

Este reporte podría tener más información con
"Mostrar salida detallada durante la compilación"
opción habilitada en Archivo -> Preferencias.
ese es el error que me tira el "stable"
 
Genial ahi pude compilar con exito y cargarlo en el arduino, abri el opentunner scaneo el puerto y me dice que se conecto. Pero despues no puedo entrar a ninguna tabla, ni se mueve nada. Se puede setear en alguna lado el tipo de rueda fonica o esta pensado para una leva con un solo flanco. Saludos
 
Pero despues no puedo entrar a ninguna tabla, ni se mueve nada. Se puede setear en alguna lado el tipo de rueda fonica o esta pensado para una leva con un solo flanco. Saludos
sisi, la parte de edicion de tablas esta y todo, el tema es que como todavia no termine de implementar la comunicacion entre el arduino y la pc no subi el codigo con los menu para la edicion de tablas, apenas termine con eso ya podrias probar grabar y leer tablas (conectandole la memoria i2c, no grabo en la eeprom del arduino)
 
No se de donde ingresa la señal del cigueñal, si es una simple leva o algun tipo de rueda fonica. Si alguno sabe se lo agradecería. Saludos Fz

podes usar una rueda fonica 60-2, con eso vas a tener cambios de a 6 o 3° dependiendo de como configures la ecu, pero si el motor ya tenia ecu podes usar la que tiene, en un futuro queria agregar el soporte para el sensor de arbol de levas, perdon por dejar esto medio abandonado
en teoria para dentro de 2 semanas ya me tienen que llegar los PCB de la primer foto para probar como funcionan los sensores y los driver de inyecctores:geek:
 
Atrás
Arriba