NodeMCU-tempi scrittura/lettura Flash per motore stepper

E infati... io questi giorni ho fatto analisi in base a delle prove.
La porta non l'ho ne anche cominciata.
Prima capisco come la devo fare, e poi la faccio:-)

Io non sapevo quanto fosse perfetto uno stepper... magari se ci sto dietro alla fine
lo posso montare anche contanto e salvando il nr. step. Perche ti assicuro la cosa funziona.
Ma dato che non mi da sicurezza, e dato che la cosa dei hall sensor mi piace, ho deciso di cambiare l'analisi.

Grazie
Denis

denisj:
No… non e un fallimento.
Ti ripeto, se conteggi i step che fa il motore scrivendo sulla flash
e facendo la lettura dei step prima di farlo girare, il fermo funziona… semplice informatica.

Che poi ho deciso io di non farlo, e un altra storia…

Rispondere è cortesia ma lasciare l’ultima parola ai … è arte

Standardoil:
Tu assicuri a me?
dopo che hai fallito una prova come non solo io, ma tutti ti abbiamo detto che avresti fallito?

No... non e un fallimento.
Ti ripeto, se conteggi i step che fa il motore scrivendo sulla flash
e facendo la lettura dei step prima di farlo girare, il fermo funziona... semplice informatica.

Che poi ho deciso io di non farlo, e un altra storia...

Bravo…

Standardoil:
Rispondere è cortesia ma lasciare l'ultima parola ai ...... è arte

Lo è anche rispondere alle 19:46 ad un post delle 19:57 :wink:

Diciamo che ci sono talmente tante cose che possono andare storte che anche se l'informatica dice che è possibile la pratica alla fine lo smentirà, prima o poi :stuck_out_tongue:

denisj:
Io non sapevo quanto fosse perfetto uno stepper... magari se ci sto dietro alla fine
lo posso montare anche contanto e salvando il nr. step. Perche ti assicuro la cosa funziona.

mi intrometto perchè credo che non sia passata una cosa..

Gli stepper se ben dimensionati e regolati i passi non li perdono, tuttavia pensare di salvare la posizione in eeprom/flash senza usare finecorsa (meccanici o altro) è un errore di concetto.

Immagina che una qualche causa esterna sposti la porta; a questo punto ti trovi la posizione della porta sfasata rispetto alla posizione memorizzata nella MCU e alla successiva movimentazione alla meno peggio vai a forzare il sistema. L'utilizzo dei finecorsa serve ad identificare in modo preciso dove si trova in questo caso la porta. Senza NON puoi fare, il fatto che funzioni o meno memorizzare la posizione in eeprom non è rilevante.

doppiozero:
mi intrometto perchè credo che non sia passata una cosa…
Immagina che una qualche causa esterna sposti la porta;

Grazie Doppiozero… infatti l’altro giorno pensavo anche io ad uno spostamento accidentale
della porta, e questo mi ha aiutato a passare ai fine corsa via “hall sensor”.

Domani mi arrivano sia i sensori che i magneti,
perche ora ne ho solo uno e ci stavo facendo le prove con un magnete da frigo :slight_smile:

In tanto vi mando una foto del pollaio anche se un po OT, spero male non fa.

Grazie ancora
Denis

denisj:
Ciao a tutti,
sto lavorando ad un progetto per fare un pollaio.

Oppure... esiste altra soluzione per memorizzare la posizione
quando va via la corrente ?
Non so... con le tapparelle come funziona la cosa ?

Grazie a tutti
Denis

mah... se devi solo aprire e chiudere una piccola porta/serranda non metterei nulla :o
semplicemente quando si da alimentazione (o al ritorno della luce in caso di blackout)
forzerei sempre la chiusura (o apertura) della porta con velocità abbastanza bassa da far SCAPPARE GLI ANIMALI CHE SONO SOTTO senza pericolo in caso di chiusura.
unica accortezza regolo la potenza (alimentazione) del motore, che anche se "gira" non gira per un po non fa nessun danno
es:
all'avvio il motore per tot step o secondi apre la serranda
poi il software "parte dalla porta aperta" e fa le azioni che deve fare in base all'orario
ps:
il motore è meglio se gira un secondo in più del necessario dell' apertura/chiusura porta

elrospo:
mah… se devi solo aprire e chiudere una piccola porta/serranda non metterei nulla :o
semplicemente quando si da alimentazione (o al ritorno della luce in caso di blackout)
forzerei sempre la chiusura (o apertura) della porta con velocità abbastanza bassa da far SCAPPARE GLI ANIMALI CHE SONO SOTTO senza pericolo in caso di chiusura.

Grazie Elrospo… sul fatto di chiudere la porta piano piano avevo gia un idea,
per fare a punto in modo che se qualche gallina si trova sotto, scappa dentro.
Ho previsto anche un qualche suono/allarme piu in la…
Spero anche a una certa abitudine da parte loro :slight_smile:

elrospo:
unica accortezza regolo la potenza (alimentazione) del motore, che anche se “gira” non gira per un po non fa nessun danno
es:
all’avvio il motore per tot step o secondi apre la serranda

poi il software “parte dalla porta aperta” e fa le azioni che deve fare in base all’orario
ps:
il motore è meglio se gira un secondo in più del necessario dell’ apertura/chiusura porta

Ho ridotto il voltaggio dall’alimentatore dai 12V a 9V e poi a 7V
…e un alimentatore da 2Amp… ma se lo voglio trattenere (ancora a mano) sembra ancora abbastanza potente.

Per ora ci faccio le prove con i sensori a effetto hall… ma ieri sera avevo poco tempo.
Mi funziona bene sempre solo uno sensore… quando aggiungo l’altro mi da valori sempre diversi.
Ho provato anche a cambiarli fra loro (ne ho acquistati 5) ma sembrano perfettamente uguali
e quindi non e il problema del sensore. Forse i vari pin del NodeMCU non si comportano in maniera uguale.

In pratica normalmente il sensore mi manda il valore 1023 quando non ha il magnete vicino.
Se avvicino il magnete mi da 0.
Se pero aggiungo il secondo sensore il valore 0 e un po aleatorio… mi da 0,20,6,10 etc…
Dovrò fare le “where condition” su qualche valore sotto 100.

Ho l’impressione pero che l’alimentazione via USB dal mio PC non li basta.
Vorrei chiedere… posso alimentare la NodeMCU sia via USB(per poterlo programmare)
sia via VIN port con circa 9V ?.. qualcuno l’ha mai fatto ?
Non vorrei bruciarlo perche ne ho comprato solo uno per ora… ma mi piace un casino :slight_smile:

Stasera faccio altre prove e vedrò come combinarli.
Grazie ancora
Denis

denisj:
Se pero aggiungo il secondo sensore il valore 0 e un po aleatorio... mi da 0,20,6,10 etc...
Dovrò fare le "where condition" su qualche valore sotto 100.

Beh, probabilmente interferiscono tra di loro perchè il campo elettromagnetico non è solo tra le due cariche ma anche tutto attorno.

Non è mai una buona cosa testare per valori esatti tipo 0 o 1023 ma sempre a soglie.

[OT]
Scusa la curiosità, ma se una gallina resta chiusa fuori che succede?
[/OT]

Spiegamela mo bene sta storia che due magneti tra loro lontani una corsa di porta da pollaio si disturbano due misure analogiche di una mcu che ha un solo pin analogico?

Dici che sono troppo lontani per interferire?

No dico che è il caso di capire come fa ad avere due letture e un pin analogico
Servirebbero tre cose
Schema
Programma
Voglia di seguire lo OP
Non ho nessuna delle tre

Standardoil:
…una mcu che ha un solo pin analogico?

Ah casss questo non lo sapevo.
Cioe posso leggere analogicamente su un solo pin ?
Io pensavo che ste GPIOs si possono usare alla pisello come mi pare e piace.

E se devo mettere 2 sensori come posso fare ?

Per rispondere a Maubarzi, le galline si abituano a entrare nel pollaio
quando arriva la sera.
Io dovro chiudere la porta un po dopo… sperando che siano entrate tutte :slight_smile:

Vi posto anche il src di quello che e ora il pgm:

// defines pins numbers
const int stepPin   = 5;   // D1
const int dirPin    = 4;   // D2
const int swPin     = 12;  // D6
const int hallUP    = 16;  // D0
const int hallDOWN  = 14;  // D5

#define LED_BUILTIN 2    // NodeMCU V3 >> D4/GPIO2

//////////////////////////////////////////////////////////////////////////////////
void setup() {
  pinMode(stepPin,OUTPUT); 
  pinMode(dirPin,OUTPUT);
  pinMode(swPin,INPUT);
  pinMode(hallUP,INPUT);
  pinMode(hallDOWN,INPUT);
  pinMode(LED_BUILTIN,OUTPUT);     
  digitalWrite(LED_BUILTIN,HIGH); //off 
  Serial.begin(115200);
  Serial.println();
  Serial.println("Booting Sketch...");
    
  Serial.print("hallUP=");  Serial.println(analogRead(hallUP),DEC);
  Serial.print("hallDOWN=");Serial.println(analogRead(hallDOWN),DEC);
  
  //if the dor is not UP and not DOWN > go UP
  if ( (analogRead(hallUP) > 500) && (analogRead(hallDOWN) > 500) ) { 
    Serial.println("not UP and not DOWN");
    motorUP();
  } 
}

//////////////////////////////////////////////////////////////////////////////////
void loop() {

  //if push switch go from UP to DOWN or viceversa
  if (digitalRead(swPin) == LOW){
    Serial.println("switch pushed");
    Serial.print("hallUP=");  Serial.println(analogRead(hallUP),DEC);
    Serial.print("hallDOWN=");Serial.println(analogRead(hallDOWN),DEC);
    lamp(3); // 3 led lamps
    if (analogRead(hallUP)   < 500){
      Serial.println("swPin > motorDOWN");
      motorDOWN();
    }
    if (analogRead(hallDOWN) < 500){
      Serial.println("swPin > motorUP");
      motorUP();
    }
  }  

  digitalWrite(LED_BUILTIN,HIGH); //off
} //loop
//////////////////////////////////////////////////////////////////////////////////

//// motor UP
void motorUP() {
  Serial.println("motor up");
  digitalWrite(dirPin,LOW); // the motor to move UP direction
  while (analogRead(hallUP) > 500) {
    digitalWrite(LED_BUILTIN,LOW); //on 
    digitalWrite(stepPin,HIGH); 
    delayMicroseconds(1000); 
    digitalWrite(stepPin,LOW); 
    delayMicroseconds(1000);
    //Serial.println(analogRead(hallUP),DEC);
    yield();  // prevent watch dog reset (Soft WDT reset)
  }
  Serial.print("MotorUP hallUP=");  Serial.println(analogRead(hallUP),DEC);
}
//// motor DOWN
void motorDOWN() {
  Serial.println("motor DOWN");
  digitalWrite(dirPin,HIGH); // the motor to move DOWN direction
  while (analogRead(hallDOWN) > 500) {
    digitalWrite(LED_BUILTIN,LOW); //on 
    digitalWrite(stepPin,HIGH); 
    delayMicroseconds(1000); 
    digitalWrite(stepPin,LOW); 
    delayMicroseconds(1000);
    Serial.println(analogRead(hallDOWN),DEC);
    yield();  // prevent watch dog reset (Soft WDT reset)
  }
  Serial.print("motorDOWN hallDOWN=");Serial.println(analogRead(hallDOWN),DEC);
}
//// lamp x times
void lamp(int x) {
  Serial.println("lamp x times");
  for(int y = 0; y < x; y++) {
    digitalWrite(LED_BUILTIN,LOW); //on 
    delay(200);
    digitalWrite(LED_BUILTIN,HIGH); //off
    delay(200);
    Serial.println(y,DEC);
  }
}

Per intenderci la lettura del sensore hallUP funziona sempre bene
invece la lettura del hallDOWN non va sempre a dovere, l’ho provato anche su altri pin
ma fa sempre i fatti suoi.
Ma a questo punto non dovrebbe proprio funzionare ?

Grazie a tutti
Denis

denisj:
Io pensavo che ste GPIOs si possono usare alla pisello come mi pare e piace.

Sono pin digitali non analogici, come analogico dovresti avere solo ADC0
Però puoi usare un sensore analogico bipolare messo sulla porta e due magneti orientati in modo differente uno N e uno S sui due finecorsa.
Oppure usare sensori digitali unipolari o bopolari e allora li usi con i GPIO

maubarzi:
Sono pin digitali non analogici, come analogico dovresti avere solo ADC0
Però puoi usare un sensore analogico bipolare messo sulla porta e due magneti orientati in modo differente uno N e uno S sui due finecorsa.
Oppure usare sensori digitali unipolari o bopolari e allora li usi con i GPIO

io pero devo usare 2 sensori... perche i sensori li metto sul binario (uno in alto e l'altro in basso)
e il magnete (che non necessita essere collegato) lo metto sulla porta.

Ora cerco si sensori digitali unipolari... spero costino sempre poco come quello analogici.

Grazie tante.
Denis

p.s. sto cercando su amazon, ma non trovo ninte di digitale :frowning:

Oppure multiplexer per avere più ingressi che convergono in uno solo e li leggi sequenzialmente, imposti quale vuoi leggere e leggi :wink: la selezione la fai con i pin digitali.

Oppure utilizzo un solo sensore e lo metto circa a meta binario
e da li conteggio verso l'alto o verso il basso.

Perche usare un multiplexer e una bella idea ma diventa troppo complesso poi.
Devo aggiungere ancora il sensore di luce, temperatura e umidità.
Poi dovrò gestire altre cose che mi verranno in mente... tipo un alert per la segnalazione del uovo :slight_smile:

Grazie ancora
Denis

allora vai di digitale, tanto a te non interessa di quanto si avvicina ma se è arrivato o meno quindi dovrebbe bastarti un segnale digitale.
Però io la curiosità di capire cosa succede alla gallina se resta fuori ce l'ho ancora. Va in depressione, prende freddo, rischia di essere mangiata, non succede nulla di grave... ? :wink:

maubarzi:
Però io la curiosità di capire cosa succede alla gallina se resta fuori ce l'ho ancora. Va in depressione, prende freddo, rischia di essere mangiata, non succede nulla di grave... ? :wink:

Be... se non sarò a casa io, a questo punto dormira fuori...
E comunque antro la rete quindi aspettera li fino al mattino dopo quando arriveranno le sue colleghe :slight_smile:

maubarzi:
allora vai di digitale, tanto a te non interessa di quanto si avvicina ma se è arrivato o meno quindi dovrebbe bastarti un segnale digitale.

Non so come fare in digitale... non trovo "hall sensor" digitali... ho trovato solo quelli normali.
Non ho capito bene come sono messi... digitali oppure analogici.
Ho acquistato questi qui

Vorrei chiarire una cosa pero...
Leggo in rete che il pin analogico del mio ModeMCU V3 e il A0/ADC0...
Io pero ho messo il hall sensor (hallUP) sul pin D0/GPIO16
...come cavolo e che funziona benissimo in questo caso ?

Non vedo l'ora di arrivare a casa e provare anche il pin A0
...magari se li metto tutti e 2 insieme, uno su A0 e l'altro su D0, funziona :slight_smile:

Grazie ancora
Denis