Centralina per motore...forse già vista ma...

Salve a tutti, e da qualche mese che cerco di realizzare una centralina che possa gestire un motore monocilindrico (e in futuro bicilindrico) per quel che riguarda la parte di anticipo scintilla.
Mi sono guardato intorno ma ho capito che non c'è niente di meglio di questo, peccato che io non riesca a farlo funzionare.
http://forum.arduino.cc/index.php?topic=157511.0

Vi racconto un po' le varie fasi della mia esperienza:

Ho realizzato il circuitino che viene riportato in terza pagina, e funziona bene.
http://forum.arduino.cc/index.php?action=dlattach;topic=157511.0;attach=50427

Per provare il sensore ad effetto hall montato sul circuito ho usato un listato che ho pescato in rete e fa il suo dovere.

A seguire ho fatto il test del mosfet sul circuito, pilotandolo con un semplice sketch di quelli che fanno lampeggiare il led al pin 13 dell'Arduino UNO, abbassando drasticamente i delay.

In pratica funziona tutto singolarmente, ma quando carico questo, non mi va nulla. Cosa fare?

#include <StopWatch.h>

const byte led1 = 13;    // cilindri 1 e 4
const byte led2 = 12;    // cilindri 2 e 3
const byte pin2 = 2;     // interrupt startt
const byte pin3 = 3;     // interrupt stopp

volatile int statestartt = HIGH;    // stato normale startt
volatile int statestopp=HIGH;       // stato normale stopp

StopWatch sw_micros(StopWatch::MICROS);    // timer durata dente
StopWatch sw_micros1(StopWatch::MICROS);   // timer attesa 1 e 4
StopWatch sw_micros2(StopWatch::MICROS);   // timer attesa 2 e 3

int time = 0;           //valore durata dente microsecondi
int ritardo = 90;       //gradi ritardo da fine dente
int tritardo1 = 0;      //valore durata ritardo in microsecondi 1 e 4
int tritardo2 = 0;      //valore durata ritardo in microsecondi 2 e 3
int rpm = 0;             //numero giri
int gradidente = 40;     //ampiezza dente in gradi

void setup() {
  Serial.begin(9600);     //comunicazione seriale
  pinMode(led1, OUTPUT);  //bobina 1 e 4
  pinMode(led2, OUTPUT);  //bobina2 e 3
  pinMode(pin2, INPUT_PULLUP);
  pinMode(pin3, INPUT_PULLUP);
  attachInterrupt(0, startt, FALLING);   //interrupt in inizio dente
  attachInterrupt(1, stopp, RISING);     //interrupt fine dente
}

void loop()
{
  //se il dente è iniziato
  if(statestartt == LOW){
    sw_micros.start();//inizia a contare durata dente
    statestartt=HIGH;// reimposta startt
  }

  //se il dente è finito
  if(statestopp == LOW) {
    time=sw_micros.elapsed();                  //memorizza durata dente
    sw_micros1.start();                        //inizia a contare da fine dente per 1 e 4
    sw_micros2.start();                        //inizia a contare da fine dente per 2 e 3
    Serial.println(time);                      //stampa durata dente
    statestopp = HIGH;                         //reimposta stopp
    sw_micros.reset();                         //azzera timer durata dente
    tritardo1=(time/gradidente)*ritardo;       //calcola durata ritardo in microsecondi per 1 e 4
    tritardo2=(time/gradidente)*(ritardo+180); //calcola durata ritardo in microsecondi per 2 e 3
    rpm=60000000/((time/gradidente)*360);      //calcolo rpm
    Serial.println(rpm);                       //stampo rpm
  }

  //se il tempo che è passato dalla fine del dente è maggiore della durata del ritardo
  if(sw_micros1.elapsed() > tritardo1){
    sw_micros1.reset();                        //azzera timer ritardo
    digitalWrite(led1, HIGH);                  //accendi led
    delayMicroseconds(500);
    digitalWrite(led1, LOW);                    //spegni led
  }

  //se il tempo che è passato dalla fine del dente è maggiore della durata del ritardo
  if(sw_micros2.elapsed()>tritardo2){
    sw_micros2.reset();                          //azzera timer ritardo
    digitalWrite(led2, HIGH);                    //accendi led
    delayMicroseconds(500);
    digitalWrite(led2, LOW);                      //spegni led
  } 
} // End Loop

void startt()//interrupt startt
{
  statestartt = !statestartt;  //inverti startt
}

void stopp()//interrupt stopp
{
  statestopp = !statestopp;    //inverti stopp
}

se vuoi sostituire l accensione (ho detto solo accensione) originale della moto con una un po piu sofisticata si puo fare,

se vuoi creare una centralina moderna penso che sia una lavoro immane anche per un monocilindrico

e di solito la centralina viene costruita su i sensori lamda, battito in testa, pressione olio, debimetro, giri , fase, temp aria, temp acqua, etc..

di media una ecu ha un centinaio di ingressi/uscite e quasi tutte servono a qualcosa :o :confused:

Il motore lo ho al banco...si tratta di un monocilindrico 125 4tempi produzione Piaggio usato da Aprilia (scooter habana)
Il motore usa in origine una CDI molto semplice, che pesca la tensione da un avvolgimento dell'alternatore e lo gestisce tramite il pick-up...nulla di più semplice. Mi costerebbe meno (circa 20€) prender il pezzo originale che usare un Arduino, ma sappiamo che le cose semplici non fanno per noi.
Lo step successivo sarebbe usare direttamente il pick-up originale al posto dell'hall, ma questa è una altra storia

AGGIORNAMENTO...ho cambiato il sensore ad effetto hall 3144...e ora sembra fuonzionare (al banco).
Adesso vedo di montarlo sul motore e vediamo...
A breve inizieranno i problemi da risolvere. restare sintonizzati... :slight_smile: