Premetto che non sono espertissimo di programmazione, ma dopo ever fatto i progetti del libro dello starter kit ho iniziato ad appassionarmi e a pensare cosa potevo fare ora con il mio arduino uno da poco comprato. Ho pensato così di provare a comandare un motore diesel che possiedo in garage,
Possiedo un motore lombardini 12LD 477
é un motore diesel che vorrei proteggere in caso di mancanza di olio, temperatura elevata e regolatore di tensione non funzionante.
Ho iniziato a scrivere il codice che non fa altro che avviare il motorino per il tempo necessario per la messa in moto (circa 4 sec), se i segnali che vengono dal sensore pressione olio, temperatura motore e regolatore di tensione sono spente.
Purtroppo mi tira fuori il solito errore
motore_lombardini_2.0.ino:6:11: error: expected unqualified-id before numeric constant
Ho ricontrollato il codice lettera per lettera e credo che ci sia altro che sia sbagliato, ma non riesco a capire cosa.
Speravo che qualcuno mi potesse dare qualche dritta e spiegarmi cosa ho sbagliato, passare da esercitazioni già scritte a prove dove devi mettere del tuo al 100% è difficile.
PS. avevo deciso di procedere per step, cioè creare la parte di codice essenziale al funzionamento del motore, e poi piano piano aggiungere magari un display per gli errori, un contaore, fino poi al montaggio sul motore.
Ho provato il codice togliendo la parte iniziale con la dichiarazione delle costanti sostituendo poi le stesse dove venivano richiamate direttamente con il numero del pin, e adesso gira, ma non capisco il motivo.
Premetto che ho seguito le indicazioni del libro "arduino la guida ufficiale" ma evidentemente ho frainteso qualcosa...
Alcuni nomi possono essere utilizzati dalle librerie di Arduino e non possono essete utilizzati.
Per evitare il problema, puoi usare nomi più "complessi": ad esempio usando REGpin al posto di REG.
Per dichiarare queste costanti puoi usare la direttiva per il compilatore #define che sostituisce durante la compilazione il contenuto indicato.
Eviterei l'uso del pin 0 ed 1 perché sono riservate al Serial Monitor.
#define BATpin 2 // segnale regolatore di tensione D+
#define OILpin 3 // segnale pressione olio motore
#define TEMpin 4 // segnale temperatura motore
#define REGpin 5 // segnale per alimentare il regolatore di tensione
#define AVVpin 6 // segnale per avviare il motore
#define SPEpin 7 // segnale per tenere acceso il motore
int VBAT = 0; // variabile che conserva lo stato di D+
int VOIL = 0; // variabile che conserva lo stato dell'olio motore
int VTEM = 0; // variabile che conserva lo stato della temperatura del motore
int VREG = 0; // variabile che conserva lo stato dell'uscita che alimenta il regolatore di tensione
int VSPE = 0; // variabile che conserva lo stato dell'uscita dedicata al mantenimento dell'elettrostop
void setup() {
pinMode(BATpin, INPUT); // pin dello lettura dello stato della spia della batteria
pinMode(OILpin, INPUT); // pin dello lettura dello stato della spia dell'olio
pinMode(TEMpin, INPUT); // pin dello lettura dello stato della spia della temperatura
pinMode(REGpin, OUTPUT); // pin per l'alimentazione del regolatore di tensione
pinMode(AVVpin, OUTPUT); // pin per l'alimentazione delmotorino d'avviamento
pinMode(SPEpin, OUTPUT); // pin per l'alimentazione delmantenimento dell'elettrostop
}
void loop() {
VBAT = digitalRead(BATpin); // legge lo stato della spia della batteria
VOIL = digitalRead(OILpin); // legge lo stato della spia dell'olio
VTEM = digitalRead(TEMpin); // legge lo stato della spia della temperatura motore
VSPE = digitalRead(SPEpin); // leggi lo stato dell'elettrostop
if (VBAT == HIGH && VOIL == HIGH && VTEM == HIGH) { // se lo stato delle spie sono accese
digitalWrite(REGpin, HIGH); // alimentare il regolatore di tensione e l'elettrostop
digitalWrite(SPEpin, HIGH);
}
else { // oppure non alimentare il regolatore e l'elettrostop
digitalWrite(REGpin, LOW);
digitalWrite(SPEpin, LOW);
}
if (VSPE == HIGH) { // se l'elettrostop è elimentato alimenta il motorino d'avviamento per 4 sec
digitalWrite(AVVpin, HIGH);
delay(400);
digitalWrite(AVVpin, LOW);
}
}
Come dicevo è da poco che mi cimento con la programmazione,
Avevi ragione per quel che riguarda l'errore, ho cambiato la costante SPE in SPEA tanto per provare e ora gira....
Grazie per la dritta dell'uso di define che credo proverò ad usare invece delle dichiarazione di costanti.
Sto implementando anche un display per gli eventuali errori e messaggi vari per l'utente e le uscite mi servono tutte, cmq cercherò di mantenere le uscite per il serial monitor.
Ovviamente mi manca l'esperienza per cercare di capire cosa è meglio in anticipo, ad esempio non avevo pensato al serial monitor, ma piano piano riuscirò a fare qualcosa di buono.
Ho solo un dubbio che mi affligge...
Come faccio con arduino a leggere dei segnali che possono essere "nullo" o "negativo" invece di LOW e HIGH in ingresso dei miei sensori??
esempio: il sensore della pressione dell'olio da come segnale una massa in caso di bassa pressione oppure nulla in caso pressione ok, avevo pensato di inserire dei relè per ogni sensore ma la cosa non mi entusiasma alle stelle.
Esiste qualcosa che potrebbe fare al caso mio a livello di software o hardware di semplice?
Grazie
Mariano79:
...
esempio: il sensore della pressione dell'olio da come segnale una massa in caso di bassa pressione oppure nulla in caso pressione ok ...
"Nulla" nel senso di circuito aperto ? ... se si, lo tratti come un qualsiasi altro normale interruttore (usandolo ovviamente su un'ingresso con una resistenza di pullup), in modo che legga HIGH (dato dalla resistenza di pullup) quando e' aperto, e LOW (cioe' a massa) quando e' chiuso ...
l'unica cosa che ti consiglio vivamente, essendo usato su un motore, e' di metterci filtri e protezioni antirimbalzo, un po su tutti gli ingressi, per evitare problemi ... le protezioni antirimbalzo piu comuni, resistenza e condensatore, li colleghi come nell'esempio allegato ... essendo in un'ambiente disturbato, puoi aumentare il condensatore a 100nF, e ridurre la resistenza di pullup da 22K a 10K ...
Si per nulla intendevo aperto, credo che quello che mi hai dato non sia applicabile. I motori funzionano con tensione 12, 6 V circa che in moto, per via del regolatore di tensione, diventano instabilmente circa 14.
Quindi avro un doppio impianto, uno 12 V per il motore e uno a 9V per arduino uno. Che avra il suo alimentatore a parte.
Il problema che i sensori dei motori non sono altro che degli interruttori avvitati sul motore che per contatto stanno a massa, appena l'interruttore si chiude ti da un segnale di massa.
Non riesco a vedere come applicare i filtri con due impianti distinti. Forse non ho capito bene io visto che sono pratico di motori ma poco di elettronica applicata.
Etem, approfitto del tuo intervento per chiederti qualche delucidazione sul circuito anti rimbalzo.
Simulando il circuito con pullup interno o esterno ho ottenuto un ritardo di circa 2.6 ms (con 100nF) prima che il segnale superi il livello di soglia HIGH 3.5V.
Ora 2.6 ms mi sembrano pochi: hai esperienza di quanto mediamente duri il rimbalzo?
il rimbalzo dipemde dal contatto, in genere si consigliano valori sui 50ms, ma ripeto, se il tasto e' vecchio ed usurato magari non basta ugualmente.
Si puo' anche usare metodi di debounce solo sw, oppure abbinare entrambi
ultimamente ho lavorato ad u progettino proprio su motore a scoppio e ti posso dire che il rpoblema vero sono i disturbi, anche via rf, non solo quelli via cavo, come ad esempio quelli che arrivano dalle candele. Sono terribili e bruttissimi da gestire, fanno riavviare il micro, c'e' da schermare ed ogni soluzione e' a se stante.
Sul discorso debounce c'e' anche da tener presente come si fa la rilevazione, esempio se un tasto e' usato su interrupt diventa findamentale un debounce serio, ma se invece il tasto e' in polling magari in una macchina a stati con tempi lunghi, ci sono casi in cui non e' nemmeno necessario farlo. Mettiamo ad esempio un codice che controlla un ingresso ogni 10sec, che il contatto al sec5 si sia attivato con 10rimbalzi non ci frega nulla in quanto al sec10 lo troveremo bello stabile
Quindi avro un doppio impianto, uno 12 V per il motore e uno a 9V per arduino uno. Che avra il suo alimentatore a parte.
Il problema che i sensori dei motori non sono altro che degli interruttori avvitati sul motore che per contatto stanno a massa, appena l'interruttore si chiude ti da un segnale di massa.
Quando è aperto tra GND e l'interruttore cosa misura il tester?
Se le masse dei due circuiti sono in comune, si risolve facilmente ponendo un diodo zener da 4.7V tra pin e GND.
Se i due circuiti devono avere masse separate (quindi circuito galvanico separato), il relè è una soluzione. Un'altra soluzione più sofisticata comporta l'uso di un accoppiatore ottico per ogni sensore (optocoupler).
Circa il debounce, se c'è separazione galvanica si può applicare il debounce hardware al optocoupler lato led.
Come dice Testato:
esempio se un tasto e' usato su interrupt diventa findamentale un debounce serio
C'è anche un altro modo ma va verificato se è usabile. Con un condensatore posto in serie rileviamo un impulso ad ogni cambio di stato ed è possibile tarare il circuito in modo che passi un impulso di durata sufficiente per innescare un interrupt del micro.
Se il Lombardini (fortunato possessore) viene usato come generatore di corrente, nei dintorni del generatore ci saranno sicuramente flussi magnetici dispersi che possono influenzare negativamente il micro, in ogni caso eviterei di pensare ad una collocazione fisica definitiva della scheda.
cyberhs:
... hai esperienza di quanto mediamente duri il rimbalzo?
Be', come ha detto anche Testato, dipende dal contatto ... per pulsanti normalmente usati in elettronica, che di solito sono di buona qualita', 100 ohm in serie e 100nF verso massa sono sufficenti, se si usano micro o pulsanti vecchi o rovinati, potrebbero non bastare, quei valori che uso di solito sono i valori "medi" che impiego in quasi tutti i prototipi, e fin'ora salvo casi molto speciali non mi hanno mai creato problemi ... nel caso, si puo aumentare la resistenza in serie, fino a circa un decimo del valore di quella che si usa di pull-pu o pull-down, se proprio non basta ancora, si aumenta anche il valore del condensatore, ma di solito e' l'ultima cosa da fare ...
Inoltre considera anche il fatto che quel circuito non agisce come un semplice "ritardo", serve anche a "spegnere" verso massa i picchi ed i disturbi molto veloci ... non si limita cioe' a fornire un ritardo di attivazione, come di solito fa' un debounce software, ma elimina a massa la maggior parte dei picchi del rimbalzo, per cui e' piu vantaggioso, in pratica, di un semplice delay software ...
Poniamo che tu abbia un "treno" di rimbalzi con picchi molto veloci (microsecondi, in genere), della durata di 50mS ... per filtrarlo via con un delay software, devi tenere il tutto bloccato per piu di 50mS (anche usando millis per non avere cicli delay bloccanti, bloccheresti comunque quello specifico ingresso per piu di 50mS) ... mentre invece con il condensatore, praticamente tutti i "picchi" ad alta frequenza che compongono il tuo treno di rimbalzi, vengono cortocircuitati a massa, senza bloccare nulla, e l'ingresso si attiva dopo un tempo massimo che e' quello fornito dalla costante di ritardo RC, dopo che il segnale si e' "stabilizzato" ed i picchi sono finiti ...
E' evidente che sarebbe meglio inserire un trigger di Schmitt, ma volevo evitarlo se possibile.
Ma non capisco la necessità del resistore da 100 ohm: con il simulatore ho provato ad eliminarlo ed il risultato sembra lo stesso.
Per la cronaca, il resistore di pullup interno dell'ATmega32U4 può variare tra 20k e 50k e quindi non è molto affidabile riguardo alla temporizzazioni: mi sa che sarebbe meglio rinunciarci a favore di un resistore esterno.
Anch'io i pull-up o i pull-down li preferisco esterni, in effetti quello interno non l'ho mai usato ...
Il resistore da 100 ohm serve solo in parte per il ritardo (solo se lo aumenti, influisce in parte anche sul ritardo), la sua funzione principale e' quella di proteggere il contatto, in caso si tratti di pulsanti o interruttori "estremamente delicati", come ad esempio pulsanti subminiatura o sensori con bassa corrente di uscita ... in pratica, evita che il condensatore, che e' mantenuto carico dalla resistenza di pull-up, si scarichi di colpo sul contatto al momento della chiusura ... dato che, anche se di basso valore, scaricarlo di colpo su un contatto produrrebbe un picco di corrente (come per tutti i condensatori scaricati brutalmente "in corto"), potrebbe danneggiare i contatti se fossero molto delicati (per il pull-down e' lo stesso principio, chiudi il positivo su un condensatore che e' mantenuto scarico dalla resistenza di pull-down, e che e' quindi, per un breve istante, equivalente ad un corto circuito) ... quindi almeno 100 ohm li metto sempre, cosi posso usare anche condensatori di valore piu elevato in caso di necessita', senza che mi rovinimo i contatti a lungo termine ...
Puo darsi ... ma preferisco metterci qualche resistenzina smd in piu prima, che dover smontare un'apparato dopo qualche mese perche' non funziona piu qualcosa ... un'etto di prevenzione e' meglio di un chilo di cura
Ho deciso di montare dei rele almeno per la prima prova, vediamo se il mio lavoro funziona. Non dovrei avere nessun problema di interferenze in quanto il motore è diesel. Speriamo vada tutto bene.
Da qualche giorno possiedo anche un'altro motore, benzina da 20 cv, è quello della mia moto che dopo aver fatto l'incidente la settimana scorsa, è l'unica cosa che si è salvata. Si accettano consigli su cosa poterci fare...
Da qualche giorno possiedo anche un'altro motore, benzina da 20 cv, è quello della mia moto che dopo aver fatto l'incidente la settimana scorsa, è l'unica cosa che si è salvata. Si accettano consigli su cosa poterci fare...
Regalalo a me medesimo, che mi serve proprio un propulsore asse libero per fare esperimenti con un generatore ad in inverter (da Gennaio in poi).
Nel senso che la moto da solo ha fatto un incidente (maledetti aggeggi meccatronici) , oppure ...
Diciamo che il mio sensore di distanza non ha funzionato bene, ho tamponato un fuoristrada da veri cog....e. ho deciso di saldare intanto un telaio dove fissare il motore. Vorrei fare una specie di macchina per la pulizia dei terreni che faccia tutto da sola, eviti ostacoli e magari non esca da un determinato perimetro. Vorrei muovere la macchina dinamicamente con una pompa che la fa muovere e faccia girare anche il trinciatrice davanti.
Mi devo procurare una pompa da circa 12cc un distributore e centro aperto e tre motori idraulici.
La cosa che mi preoccupa è il trincia che deve essere leggero e quindi piccolo. Non ho idea di dove posso trovarlo.