Se sei giŕ registrato           oppure    

Orario: 29/03/2024 15:07:03  

 

Energia Alternativa ed Energia Fai Da Te > Arduino

VISUALIZZA L'ALBUM

Pagine: (3)   1   2   [3]    (Ultimo Msg)


Partenza assistita per generatore con arduino
FinePagina

righetz

Avatar
GigaWatt


Gruppo:MODERATORE
Messaggi:4225

Stato:



Inviato il: 08/03/2015 09:55:59


CITAZIONE

Monitorare due fasi contemporaneamente con le sinusoidi sfasate di 60° credo che non si riesce a captare il passaggio per lo zero.


Qui ho detto una fesseria, le sinusoidi sono sfasate di 120°.

Quando una passa per lo zero, l'altra č giŕ in salita.
Googlando gli esempi che ho visto applicati alla linea di rete 220V hanno una fase e un neutro, qui č leggermente diverso.

Ho visto lo schema di NewEolico che mi hai suggerito, la parte riguardante il rilevamento degli rpm la prendo come spunto per una prova.
Per mia grande fortuna un lm358 ne possiedo uno.... inizio giŕ da oggi, donne permettendo



---------------
Chi non si indebita fa la rabbia degli usurai

 

righetz

Avatar
GigaWatt


Gruppo:MODERATORE
Messaggi:4225

Stato:



Inviato il: 08/03/2015 18:48:15

Aggiornato il SW e testato, il circuito č ancora un prototipo, manca la parte con lm358 per il rilevamento RPM.

Piccolo e fastidioso effetto di visualizzazione sul display le velocitŕ rilevate dall'anemometro.

La funzione millis() rende la visualizzazione troppo veloce, c'č un modo per aggirare l'inconveniente pe ravere una lettura piů precisa?

in prima pagina il SW aggiornato alla versione 3.5

http://www.energialternativa.info/public/newforum/ForumEA/D/VID_starter.3gp



---------------
Chi non si indebita fa la rabbia degli usurai

 

righetz

Avatar
GigaWatt


Gruppo:MODERATORE
Messaggi:4225

Stato:



Inviato il: 08/03/2015 18:55:33

Aggiungo anche la foto del visualizzato

http://www.energialternativa.info/public/newforum/ForumEA/D/IMG_20150308_171647.jpg



Modificato da righetz - 08/03/2015, 18:59:48


---------------
Chi non si indebita fa la rabbia degli usurai

 

righetz

Avatar
GigaWatt


Gruppo:MODERATORE
Messaggi:4225

Stato:



Inviato il: 18/03/2015 21:41:25

Sta per arrivare la nuova versione sperimentale del ministarter con funzione lettura anemometrica, attivazione relč per partenza assistita e lettura numero di giri del generatore con integrato lm358.

La parte riguardante la lettura del numero di giri con lm358 eč la replica di una parte del circuito presentato alla pagina 3 in questa discussione.

Tempo di montare i componenti e testarlo con il nuovo firmware in fase di scrittura.



Immagine Allegata: IMG_20150318_211615.jpg
 
ForumEA/D/IMG_20150318_211615.jpg



---------------
Chi non si indebita fa la rabbia degli usurai

 

righetz

Avatar
GigaWatt


Gruppo:MODERATORE
Messaggi:4225

Stato:



Inviato il: 01/05/2015 22:08:55

rieccoci di nuovo all'opera....

La schedina del post precedente a preso la strada del secco non riciclabile (discarica!) a causa di un errore nell'utilizzare eagle, cose che succedono ai principianti.

Ho ripreso la vecchia strada con l'optoisolatore come consigliato da ElettroshockNow.

Ho rivisto il firmware per il controllo dello starter eliminando le pause con il delay() e introducendo tutte le routine temporali con la funzione millis()

La libreria PinChangeInt.h permette di utilizzare piů di un interrupt anche su piedini diversi da quelli standard di arduino uno.
Un problema che da principiante non sono riuscito a risolvere č l'azzeramento degli rpm quando il generatore si ferma.
Segna sempre un valore diverso da zero e a questo punto lo starter non funziona piů perchč non č in grado di capire se effettivamente il generatore gira oppure č fermo.

Ho aggirato il problema forzando dei reset software introducendo delle pause. Il reset fisico della schedina fa attivare il relč per un periodo senza controllo e non č una bella cosa....

Con questi reset forzati funziona tutto senza intoppi. L'unico fastidio che nel controllo tra una valore inferiore alla Soglia minima di partenza "Soglia_Wind" e il valore rpm !=0 anche con il generatore in movimento interviene il reset ed il display rimane spento senza inerferire con il relč fino a quando il valore della Soglia_Wind non torna sopra il valore preimpostato. In tutte le altre condizioni per ora tutto ok.

Metto il codice del firmware per la visione degli esperti che sicuramente mi tireranno le orecchie per le forzature applicate....

Starter_Wind vers. 3.8

//Realizzato da Righetz (righetto.massimo69@gmail.com
// e condiviso su EnergiAlternativa.org
//http://www.energialternativa.info/Public/NewForum/Discussione.php?212265
//
//
//ATTENZIONE:
//
//CC BY-NC-SA 4.0
//Uso non commerciale, modificabile, con obbligo di condivisione-
//http://creativecommons.org/licenses/by-nc-sa/4.0/deed.it

//***********--Librerie utilizzate--****************************************************


#include <LiquidCrystal_I2C.h>//Libreria per gestire LCD
#include <Wire.h>  
#include <PinChangeInt.h>


//***********--Definizione Pin --*****************************************************

LiquidCrystal_I2C lcd(0x27, 16,2);//ASSEGNAZIONE PIN  LCD Righets
#define Sensor 5 //Assegna il Pin 5 come ingresso Anemometro
#define Rele 7 //Assegna il pin 4 come uscita attivazione rele
#define Giri 6 //Assegna il pin 3 come ingresso pulsazioni fasi

//*************** definizione variabili  ***************************

float Soglia_Wind = 1.0;                               //Velocita vento minima per partenza espressa in ms
const float raggio = 60;                               // raggio dell'anemometro in mm in possesso
const float Rflangia = 100;                            // raggio del rotore portamagneti espresso in mm
int Numero_impulsi_giro = 1;                           //Inserire tipo di sensore anemometro
int impulsi_giro = 16;                                 //numero impulsi 1 giro generatore
const float Pi = 3.141593;                             // Pigreco
unsigned long durata,tempo_trascorso,Tempo_Giro,Tempo1;
unsigned long Pausa = 5000;                            // pausa tra una fase di avvio e un'altra sequenza
unsigned long ReleOn = 1800;                           // tempo in cui il relč rimane attivo 
unsigned long Time_Reset = 500;                        // tempo per reset software conteggio rpm
unsigned long Time_ResAll = 600*1000;                  // tempo per reset software loop arduino 
unsigned long Prev_Time1 = 0;
unsigned long Prev_Time = 0;
unsigned long Prev_Time2 = 0;
unsigned long Prev_Time3 = 0;
float Metris,Kmora,rpm,velsec;
void(* RPM_Reset)(void) = 0;                            // funzione reset software rpm
void(* Reset_All)(void) = 0;                            // funzione reset software arduino


void setup() {
 
  Serial.begin(57600);                                   //inizializzazione seriale
  pinMode(Rele, OUTPUT);                                 //dichiarazione Rele come uscita
  digitalWrite(Rele, LOW);                               //dichiarazione Rele non attivato
  pinMode(Sensor, INPUT) ;                               //dichiarazione sensore anemometro come ingresso
  digitalWrite(Sensor, HIGH);                            //dichiarazione sensore anemometro HIGN=anemometro in rotazione
  pinMode(Giri, INPUT);                                  //dichiarazione sensore giri come ingresso
  digitalWrite(Giri, HIGH);  
  PCintPort::attachInterrupt(Sensor, anemometro, RISING); // assegnazione interrupt alla funzione anemometro
  PCintPort::attachInterrupt(Giri, contagiri, RISING);    // assegnazione interrupt alla funzione contagiri
  lcd.init();
  lcd.backlight();
  lcd.clear();
  lcd.setCursor(0, 0);
  

  
    
}


void loop() {
 
  unsigned long curr_Time = millis();                   // tempo tra una fase di start  
  if(curr_Time - Prev_Time > Pausa) {                   // e quella successiva
  Prev_Time = curr_Time;                                // impostata a 7 sec.
 
    start();}                                           // esegue la funzione partenza in base ai valori rilevati dall'anemometro
    
  unsigned long curr_Time1 = millis();                  // tempo per il quale
  if(curr_Time1 - Prev_Time1 > ReleOn) {                // il rele rimane attivato
  Prev_Time1 = curr_Time1;                              // per un totale di 1,2 secondi
 
    stop1();}                                           // esegue il controllo per tenere il relč spento in base alle condizioni rilevate
   
   unsigned long curr_Time2 = millis();                 // funzioni per il calcolo del
   if(curr_Time2 - Prev_Time2 > Time_Reset){            // tempo tra due reset per 
     Prev_Time2 = curr_Time2;                           // azzerare il conteggio degli rpm
     Reset_giri();}                                     // impostato a 0,5 sec 
          
    unsigned long curr_Time3 = millis();                // funzioni per il calcolo del
    if(curr_Time3 - Prev_Time3 > Time_ResAll){          // tempo tra due reset per far
      Prev_Time3 = curr_Time3;                          // ripartire lo starter da zero
      Reset_starter();}                                 // impostato a 10 minuti
    
    lcd.setCursor(0,0);
    lcd.print("ms =        ");
    lcd.setCursor(4, 0);
    lcd.print(Metris);
    lcd.print("                      ");
    lcd.setCursor(0,1);
    lcd.print("Kmh=       "); 
    lcd.setCursor(4, 1);
    lcd.print(Kmora);
    lcd.print("                      ");
    lcd.setCursor(11,0);
    lcd.print("RPM=        ");
    lcd.setCursor(11,1);
    lcd.print(rpm);
    lcd.print("                      ");
  
    
  
}

void anemometro() { 

  durata=millis()-tempo_trascorso;                  //misura il tempo tra due impulsi del sensore
  tempo_trascorso=millis();
  Metris= 2*Pi*raggio/durata*Numero_impulsi_giro;   //calcolo della velocitŕ del vento in metri secondo     
  Kmora = Metris*3.6;                               //calcolo velocitŕ chilometri orari
    
}


  void contagiri() {
  
   Tempo_Giro=millis()-Tempo1;                      // misura il tempo degli impulsi del generatore per un giro
   Tempo1=millis();
   velsec=2*Pi*Rflangia/Tempo_Giro*impulsi_giro;    // calcolo della velocitŕ di rotazione in metri al secondo
   rpm = (velsec/(Rflangia*0.104));                 // trasformazione metri al secondo in RPM    
 
}
 

void start() {
 
  if (Metris>=Soglia_Wind && rpm == 0){digitalWrite(Rele,HIGH);}    // attivazione del relč con soglia vento e generatore fermo
   else {digitalWrite(Rele,LOW);}                                   // se non ci sono le condizioni relč spento
    
}
 
 void stop1() {

   if (Metris <= Soglia_Wind && rpm == 0){digitalWrite(Rele,LOW);}        // se la soglia vento sotto valore stabilito e generatore fermo, relč spento
   else if (Metris <= Soglia_Wind && rpm >= 0){digitalWrite(Rele,LOW);}   // se la soglia vento sotto valore stabilito e generatore gira, relč spento.
   else {digitalWrite(Rele,LOW);}                                         // relč spento 
  
}
 
 void Reset_giri() {                                                      // funzione per il software reset          
                                                                          // nel caso in cui il generatore si ferma
   if (Metris <= Soglia_Wind &&  rpm != 0)RPM_Reset();                    // e vengono ancora visualizzati il numero di rpm
                                                                          // in questo caso senza reset lo starter non riparte
} 
 
 void Reset_starter() {Reset_All();}                                      // funzione per il software reset che azzera tutto il loop dopo 10 minuti
                                                                          // e fa ripartire lo starter in caso di blocco



Modificato da righetz - 01/05/2015, 22:16:18


---------------
Chi non si indebita fa la rabbia degli usurai

 

danye

Avatar
KiloWatt


Gruppo:Utente
Messaggi:258

Stato:



Inviato il: 04/05/2015 13:21:22

Vorrei aiutarti righetz, potresti perň riassumere qual'e' la logica di funzionamento dello sketch?



---------------
1x185Wp poli direzione sud
1xRegolatore MPPT EpSolar Tracer 3015
7x batterie auto da recupero in parallelo 12volt 400 Ah molto teorici
Sistema 12 volt che alimenta le luci a led di tutto l'appartamento
Sito realtime in versione beta... solare.altervista.org

 

righetz

Avatar
GigaWatt


Gruppo:MODERATORE
Messaggi:4225

Stato:



Inviato il: 04/05/2015 21:06:40

L'idea č questa

L'anemometro tramite interrupt legge la velocitŕ del vento e la visualizza sul display.
Sul display vengono anche visualizzati il numero di giri del generatore, rilevati sempre da interrupt.

L'anemometro segnala ad arduino che superata una certa velocitŕ del vento per circa 5 secondi continuativi deve eccitare una coppia di relč che alimenta due fasi del generatore per dargli un "colpo di frusta" in modo tale da rompere l'inerzia, poi il vento fa il resto.

L'eccitazione dei relč dura circa 1,8 sec, il tempo di "caricare" 2 fasi e smuovere il rotore che pesa circa una decina di chili.

se il valore del vento č inferiore al valore impostato ed il generatore č fermo rpm=0 non fa niente.

se il valore del vento č sopra il valore impostato ed il generatore č fermo rpm=0 eccita i relč

se il valore del vento č sotto il valore impostato ed il generatore gira rpm>0 non fa niente

Il problema sorge quando il generatore si ferma, gli rpm risultano sempre > 0 quindi il generatore per arduino crede che sia sempre in rotazione.

Ho risolto con forza bruta creando questa funzione void(* RPM_Reset)(void) = 0; che punta a zero e resetta il ciclo loop.

Diciamo che per ora funziona si tratta ora di tarargli i tempi di attesa tra uno start e l'altro che ho giŕ aumentato a circa 7 secondi.

L'eccitazione relč da 1,2 secondi č stata portata a 1,8 sec.

Per non far si che il display si spenga durante il reset della funzione rpm gli ho dato un timer di 2 sec e non piů 0,5 adesso va meglio.

Volevo sapere se c'era un modo migliore per azzerare l'interrupt dedicato al rilevamento dei rpm. Altrimenti anche cosě mi va piů che benissimo, funziona



---------------
Chi non si indebita fa la rabbia degli usurai

 

righetz

Avatar
GigaWatt


Gruppo:MODERATORE
Messaggi:4225

Stato:



Inviato il: 06/05/2015 21:23:35

Ho fatto una ricerca sul forum di arduino e ho notato che in molti usano questa tecnica per riavviare il loop da zero e "resettare" arduino via software.... per ora il sistema funziona benissimo, manca solo affinare qualche valore nelle funzioni millis() per azzeccare i valori ottimali.



---------------
Chi non si indebita fa la rabbia degli usurai

 

righetz

Avatar
GigaWatt


Gruppo:MODERATORE
Messaggi:4225

Stato:



Inviato il: 25/08/2015 11:20:56

Aggiornamento, dopo mesi di test e ritocchi ai valori preimpostati per la partenza assistita del mio generatore, ho elaborato la schield per arduino uno con relativo firmware.

A livello di programma non ci sono cambiamenti particolari se non nella soglia minima di partenza impostata a 1,3 m/s (4,68 kmh) contro l' 1m/s (3.6 kmh) di prima e al tempo di attivazione relč da 1,8 secondi a 1 secondo.


Immagine per la realizzazione della schedina con la tecnica del press and peel

http://www.energialternativa.info/public/newforum/ForumEA/F/Starter_pcb_A4.png



In allegato la stampa in formato pdf della disposizione dei componenti.

P.S. le piste ramate e i componenti saranno disposti sulla parte superiore della schield per mio errore nell'esecuzione.


Scarica allegato

Starter_A4.pdf ( Numero download: 235 )



Modificato da righetz - 25/08/2015, 11:29:06


---------------
Chi non si indebita fa la rabbia degli usurai

 

righetz

Avatar
GigaWatt


Gruppo:MODERATORE
Messaggi:4225

Stato:



Inviato il: 25/08/2015 11:26:04

questo il codice da caricare su arduino uno:


VERSIONE 3.9 del 24/08/2015




// e condiviso su EnergiAlternativa.org
//http://www.energialternativa.info/Public/NewForum/Discussione.php?212265
//
//
//ATTENZIONE:
//
//CC BY-NC-SA 4.0
//Uso non commerciale, modificabile, con obbligo di condivisione-
//http://creativecommons.org/licenses/by-nc-sa/4.0/deed.it

//***********--Librerie utilizzate--****************************************************


#include <LiquidCrystal_I2C.h>//Libreria per gestire LCD
#include <Wire.h>  
#include <PinChangeInt.h>


//***********--Definizione Pin --*****************************************************

LiquidCrystal_I2C lcd(0x27,16,2);//ASSEGNAZIONE PIN  LCD Righets
#define Sensor 8 //Assegna il Pin 8 come ingresso Anemometro
#define Rele 10 //Assegna il pin 10 come uscita attivazione rele
#define Giri 9 //Assegna il pin 9 come ingresso pulsazioni fasi

//*************** definizione variabili  ***************************

float Soglia_Wind = 1.3;                               //Velocita vento minima per partenza espressa in ms
const float raggio = 60;                               // raggio dell'anemometro in mm in possesso
const float Rflangia = 100;                            // raggio del rotore portamagneti espresso in mm
int Numero_impulsi_giro = 1;                           //Inserire tipo di sensore anemometro
int impulsi_giro = 16;                                 //numero impulsi 1 giro generatore
const float Pi = 3.141593;                             // Pigreco
unsigned long durata,tempo_trascorso,Tempo_Giro,Tempo1;
unsigned long Pausa = 5000;                            // pausa tra una fase di avvio e un'altra sequenza
unsigned long ReleOn = 1000;                           // tempo in cui il relč rimane attivo 
unsigned long Time_Reset = 1200;                        // tempo per reset software conteggio rpm
unsigned long Time_ResAll = 60000;                  // tempo per reset software loop arduino 
unsigned long Prev_Time = 0;
unsigned long Prev_Time1 = 0;
unsigned long Prev_Time2 = 0;
unsigned long Prev_Time3 = 0;
float Metris,Kmora,rpm,velsec;
void(* RPM_Reset)(void) = 0;                            // funzione reset software rpm
void(* Reset_All)(void) = 0;                            // funzione reset software arduino


void setup() {
 
  Serial.begin(57600);                                   //inizializzazione seriale
  pinMode(Rele, OUTPUT);                                 //dichiarazione Rele come uscita
  digitalWrite(Rele, LOW);                               //dichiarazione Rele non attivato
  pinMode(Sensor, INPUT) ;                               //dichiarazione sensore anemometro come ingresso
  digitalWrite(Sensor, HIGH);                            //dichiarazione sensore anemometro HIGN=anemometro in rotazione
  pinMode(Giri, INPUT);                                  //dichiarazione sensore giri come ingresso
  digitalWrite(Giri, HIGH);  
  PCintPort::attachInterrupt(Sensor, anemometro, RISING); // assegnazione interrupt alla funzione anemometro
  PCintPort::attachInterrupt(Giri, contagiri, RISING);    // assegnazione interrupt alla funzione contagiri
  lcd.init();
  lcd.backlight();
  lcd.clear();
  lcd.setCursor(0, 0);
  

  
    
}


void loop() {
 
  unsigned long curr_Time = millis();                   // tempo tra una fase di start  
  if(curr_Time - Prev_Time > Pausa) {                   // e quella successiva
  Prev_Time = curr_Time;                                // impostata a 5 sec.
 
    start();}                                           // esegue la funzione partenza in base ai valori rilevati dall'anemometro
    
  unsigned long curr_Time1 = millis();                  // tempo per il quale
  if(curr_Time1 - Prev_Time1 > ReleOn) {                // il rele rimane attivato
  Prev_Time1 = curr_Time1;                              // per un totale di 1,2 secondi
 
    stop1();}                                           // esegue il controllo per tenere il relč spento in base alle condizioni rilevate
   
   unsigned long curr_Time2 = millis();                 // funzioni per il calcolo del
   if(curr_Time2 - Prev_Time2 > Time_Reset){            // tempo tra due reset per 
     Prev_Time2 = curr_Time2;                           // azzerare il conteggio degli rpm
     Reset_giri();}                                     // impostato a 1 sec 
          
    unsigned long curr_Time3 = millis();                // funzioni per il calcolo del
    if(curr_Time3 - Prev_Time3 > Time_ResAll){          // tempo tra due reset per far
      Prev_Time3 = curr_Time3;                          // ripartire lo starter da zero
      Reset_starter();}                                 // impostato a 10 minuti
    
    lcd.setCursor(0,0);
    lcd.print("ms         ");
    lcd.setCursor(4, 0);
    lcd.print(Metris);
    lcd.print("                      ");
    lcd.setCursor(0, 1);
    lcd.print("Kmh       "); 
    lcd.setCursor(4, 1);
    lcd.print(Kmora);
    lcd.print("                      ");
    lcd.setCursor(11, 0);
    lcd.print("rpm        ");
    lcd.setCursor(11, 1);
    lcd.print(rpm);
    lcd.print("                      ");
  
    
  
}

void anemometro() { 

  durata=millis()-tempo_trascorso;                  //misura il tempo tra due impulsi del sensore
  tempo_trascorso=millis();
  Metris= 2*Pi*raggio/durata*Numero_impulsi_giro;   //calcolo della velocitŕ del vento in metri secondo     
  Kmora = Metris*3.6;                               //calcolo velocitŕ chilometri orari
    
}


  void contagiri() {
  
   Tempo_Giro=millis()-Tempo1;                      // misura il tempo degli impulsi del generatore per un giro
   Tempo1=millis();
   velsec=2*Pi*Rflangia/Tempo_Giro*impulsi_giro;    // calcolo della velocitŕ di rotazione in metri al secondo
   rpm = (velsec/(Rflangia*0.104));                 // trasformazione metri al secondo in RPM con fattore 
 
}
 

void start() {
 
  if (Metris>=Soglia_Wind && rpm == 0){digitalWrite(Rele,HIGH);}    // attivazione del relč con soglia vento e generatore fermo
   else {digitalWrite(Rele,LOW);}                                   // se non ci sono le condizioni relč spento
    
}
 
 void stop1() {

   if (Metris <= Soglia_Wind && rpm == 0){digitalWrite(Rele,LOW);}        // se la soglia vento sotto valore stabilito e generatore fermo, relč spento
   else if (Metris <= Soglia_Wind && rpm >= 0){digitalWrite(Rele,LOW);}   // se la soglia vento sotto valore stabilito e generatore gira, relč spento.
   else {digitalWrite(Rele,LOW);}                                         // relč spento 
  
}
 
 void Reset_giri() {                                                      // funzione per il software reset          
                                                                          // nel caso in cui il generatore si ferma
   if (Metris <= Soglia_Wind &&  rpm != 0)RPM_Reset();                    // e vengono ancora visualizzati il numero di rpm
                                                                          // in questo caso senza reset lo starter non riparte
} 
 
 void Reset_starter() {Reset_All();}                                      // funzione per il software reset che azzera tutto il loop dopo 10 minuti
                                                                          // e fa ripartire lo starter in caso di blocco
  



---------------
Chi non si indebita fa la rabbia degli usurai

 

righetz

Avatar
GigaWatt


Gruppo:MODERATORE
Messaggi:4225

Stato:



Inviato il: 25/08/2015 11:36:41

Il prototipo realizzato su schedina schield preforata:

http://www.energialternativa.info/public/newforum/ForumEA/F/IMG_20150825_113035.jpg



altra vista:

http://www.energialternativa.info/public/newforum/ForumEA/F/IMG_20150825_113059.jpg



---------------
Chi non si indebita fa la rabbia degli usurai

 

righetz

Avatar
GigaWatt


Gruppo:MODERATORE
Messaggi:4225

Stato:



Inviato il: 26/08/2015 09:56:12

Dimenticavo lo schema elettrico, spero sia chiaro č da poco che uso "l'amico Fritz"

http://www.energialternativa.info/public/newforum/ForumEA/F/Starter_schem_1.png

Nell'immagine dello schema l'optoisolatore viene visualizzato come tlp621 in realtŕ č stato utilizzato il TLP620. Il database di Fritzing dispone della versione sbagliata rispetto a quello utilizzato per la realizzazione della schedina



Modificato da righetz - 26/08/2015, 10:00:19


---------------
Chi non si indebita fa la rabbia degli usurai

 
 InizioPagina
 

Pagine: (3)   1   2   [3]    (Ultimo Msg)

Versione Mobile!

Home page       TOP100-SOLAR      Home page forum