Un saluto a tutto il forum, dovrei realizzare con Arduino il controllo di un motore bipolare passo passo, attraverso un Rotary Encoder KY-040, o con il classico potenziometro e i pulsanti avanti, indietro. Ancora non ho tutta la dimestichezza e conoscenza necessaria con Arduino per mettere mano al codice e predisporre i collegamenti. Spiego a che cosa mi serve un motore passo passo controllato da Arduino. Ho in fase di realizzazione un'antenna Loop Magnetica per radioamatori, vi è un condensatore variabile sotto vuoto con capacità da 15pF a 350 pF per l'accordo dell'antenna, con l’asse del condensatore variabile collegato al motorino passo passo. Il condensatore variabile per la sua regolazione compie 40 giri e quindi è necessario avere step piccoli per avere un controllo preciso della frequenza di lavoro dell’antenna. Le difficoltà nascono anche per il controllo del fine corsa in avanti e all'indietro quando il condensatore ha finito i giri in un verso o nell'altro, e non so se è possibile a livello software dire ad esempio, vai in avanti e dopo 1250 step ti devi fermare e lo stesso all'indietro. Questo eviterebbe di montare un alberino che ruota insieme all’asse del condensatore per azionare degli interruttori a fine corsa. Il motorino è in esterno vicino all’antenna e deve essere controllato da remoto a circa 20/25 mt dall'antenna che sta sul tetto. Sarei grato a chi mi aiuterebbe relativamente al codice Arduino e su come collegare i controlli Avanti, Indietro, controllo velocità con il potenziometro. In verità avevo avuto un’altra idea in merito al controllo del motorino. Sul mio ricevitore Yaesu FT-450 la sintonia è controllata da un Rotary Encoder che permette girando in un verso o nell’altro di sintonizzare il ricevitore. Io volevo applicare ad Arduino un Rotary Encoder KY-040 che facesse eseguire esattamente lo stesso movimento al motore passo passo. Un giro completo del Rotary Encoder, un giro completo del motorino, o in avanti o all’indietro, sempre con il controllo degli step da fare per il fine corsa in un senso o nell’altro. Ringraziando anticipatamente, resto in attesa di vostro aiuto e suggerimenti. L’hardware a diposizione è, un Arduino Leonardo un driver per il motore L298D, un Rotary Encoder KY-040, due diversi motori bipolari, Modello motore: 42BYGHW208, n° di fili: 4, Angolo di step: 1,8°, Passi per giro: 200, Tensione: 12V, Corrente: 0,4° e il secondo Modello: 42BYGHW804, Phase: 2, Step angle: 1,8+-5%°/step, Voltage: 3,84V, Currect: 1,2A/phase. Inoltre e i soliti componenti del kit Arduino. Un saluto da radiomatore a tutti, 73 – IU8CRI
Ciao,
di solito non scriviamo codice, ma se tu butti giù qualcosa poi noi lo possiamo correggere e migliorare.
Una domanda: ma il condensatore è già dotato di pulsanti di fine-corsa o volevi metterli esterni?
Il condensatore variabile di produzione militare russo, non ha interruttori di fine corsa, il perno centrale del condensatore a fine corsa si blocca, pensavo di poter contare gli step del motore bipolare, visto che deve fare circa 40 giri il condensatore variabile, dalla capacità minima, a quella massima. Altro problema legato all'isolamento elettrico, quando l'antenna riceve il segnale a radiofrequenza dal trasmettitore, ai capi del condensatore sotto vuoto vi possono essere fino a 17.000 volts (il condensatore ne supporta fino a 27.000 volts), quindi non vi possono essere collegamenti elettrici in prossimità del condensatore e lo stesso motorino va collegato con un raccordo in teflon, in modo tale da tenere isolato elettricamente il motorino dal condensatore. La figura allegata mostra un condensatore sotto vuoto con tensione massima di 5.000 volts ed un motorino passo passo per il controllo, a cui è stato collegato un trimmer multigiri con demoltiplica per sapere in che posizione si trovail condensatore. Io volevo invece che nella scatola dove vi è il condentaore arrivassero solo i quattro fili del motore bipolare (tramite cavo schermato CAT5 quattro coppie ritorte, cavo di rete L.A.N.) senza complicare la realizzazione pratica del controllo dello stesso motorino. La foto dov'è presente il righello è quella del condensatore che utilizzero, alto 28 cm largo circa 18 cm.
Molto bello. Però il motorino nella foto sembra un DC non uno stepper, quindi l'encoder è d'obbligo per sapere dove si è.
Per la realizzazione secondo me puoi seguire lo stesso schema. Ti puoi fare stampare le flange e i supporti in ABS con una stampante 3D.
Anche con lo stepper poi includere l'endocer ma non è strettamente necessario; infatti i fine corsa non ti servono perché sono di difficile implementazione. Puoi invece capire quando il condensatore arriva alla fine monitorando le correnti che circolano nello stepper stesso. (http://edn.com/design/analog/4368829/Back-EMF-method-detects-stepper-motor-stall)
Per la gestione è necessario avere vicino la scheda di controllo, non so se puoi raggiungere i 20 metri con i fili per lo stepper.
La foto è solo di esempio sicuramente il motore in foto è un DC, ma la soluzione mia è quella di usare uno stepper motor.
L’hardware a diposizione è, un Arduino Leonardo un driver per il motore L298D, un Rotary Encoder KY-040, due diversi motori bipolari, Modello motore: 42BYGHW208, n° di fili: 4, Angolo di step: 1,8°, Passi per giro: 200, Tensione: 12V, Corrente: 0,4 Ampere e il secondo Modello: 42BYGHW804, Phase: 2, Step angle: 1,8+-5%°/step, Voltage: 3,84V, Currect: 1,2A/phase. Inoltre e i soliti componenti del kit Arduino. Visto che hai le idee molto chiare relativamente alle soluzioni da adottare anche all'utilizzo del codice per implementare i fine corsa del motore bipolare, ti propongo un codice che mi hanno suggerito per il controllo del motore stepper con il driver L298D e il motore bipolare 200 passi per giro, 12V 0,4 Ampere, ma gli manca il codice per il Rotory Encoder che potrebbe essere il seguente. Come integrarli cosa suggerisci?
Codice Rotary Encoder
/* Read Quadrature Encoder
- Connect Encoder to Pins encoder0PinA, encoder0PinB, and +5V.
- Sketch by max wolf / www.meso.net
- v. 0.1 - very basic functions - mw 20061220
*/
int val;
int encoder0PinA = 3;
int encoder0PinB = 4;
int encoder0Pos = 0;
int encoder0PinALast = LOW;
int n = LOW;
void setup() {
pinMode (encoder0PinA,INPUT);
pinMode (encoder0PinB,INPUT);
Serial.begin (9600);
}
void loop() {
n = digitalRead(encoder0PinA);
if ((encoder0PinALast == LOW) && (n == HIGH)) {
if (digitalRead(encoder0PinB) == LOW) {
encoder0Pos--;
} else {
encoder0Pos++;
}
Serial.print (encoder0Pos);
Serial.print ("/");
}
encoder0PinALast = n;
}
Codice controllo stepper motor:
// Initialize
int PWM1 = 6; // PWM Pin Motor 1
int PoM1 = 7; // Polarity Pin Motor 1
int PWM2 = 5; // PWM Pin Motor 2
int PoM2 = 4; // Polarity Pin Motor 2
int ValM1 = 0; // Initial Value for PWM Motor 1
int ValM2 = 0; // Initial Value for PWM Motor 2
int i = 25; // increment
boolean goUp = true ; // Used to detect acceleration or deceleration
void setup()
{
pinMode(PWM1, OUTPUT);
pinMode(PoM1, OUTPUT);
pinMode(PWM2, OUTPUT);
pinMode(PoM2, OUTPUT);
digitalWrite(PoM1, LOW) ; // Both motor with same polarity
digitalWrite(PoM2, LOW) ;
analogWrite(PWM1, ValM1); // Stop both motors => ValMx = 0
analogWrite(PWM2, ValM2);
Serial.begin(9600); // Used to check value
}
// Main program
void loop()
{
delay (500) ; // give some time to the motor to adapt to new value
if ((ValM1 < 250) && goUp) // First phase of acceleration
{
ValM1 = ValM1 + i ; // increase PWM value => Acceleration
ValM2 = ValM2 + i ;
}
else
{
goUp = false ; // Acceleration completed
ValM1 = ValM1 - i ; // Decrease PWM => deceleration
ValM2 = ValM2 - i ;
if (ValM1 < 75) // My motor made fanzy noise below 70
{ // One below 75, I set to 0 = STOP
ValM1 = 0 ;
ValM2 = 0 ;
goUp = true ; // deceleration completed
}
}
if ((ValM1 > 75) && (ValM1< 255)) // If PWM values are OK, I send to motor controller
{
analogWrite(PWM1, ValM1);
analogWrite(PWM2, ValM2);
}
Serial.print(ValM1); // Debug. Print Value Motor 1
Serial.print("\t"); // Print tab
Serial.println(ValM2); // Print Value Motor 2 to Serial
}
// End.
Prima di tutto quale scheda con L298 hai ?
La prima che hai postato o l'ultima dove c'e' il collegamento con la UNO ?
Sono schede diverse che si comandano in modo diverso
Per l'Encoder ti consiglio di usarlo sotto Interrupt, quello sketch che hai indicato non lo e'.. e quindi rischi di perdere impulsi.
Anche se forse non ti importa, visto che lo usi solo girandolo a mano e per pilotare il motore.
Diverso sarebbe se fosse stato un encoder per il rilevamento di una posizione.
Comunque c'e' una simpatica libreria per la gestione dell'encoder Encoder Library, for Measuring Quadarature Encoded Position or Rotation Signals
Mi sono divertito a fare uno schemettino dei collegamenti.
Le linee che vedi tratteggiate sono :
O il collegamento dei fine corsa
O il controllo della corrente assorbita dal motore ( e' lapalissiamo che il motore quando il condensatore arriva a fine corsa sforzi, quindi aumenta il consumo di corrente . Va' pero' anche visto se a finecorsa non si possa, sforzando, danneggiare il condensatore)
Comunque c'e' un grosso problema, la distanza. Non puoi mettere o solo il motore o il motore piu' driver a 20 metri.
Nel primo caso rischi di danneggiare il Driver, nel secondo c'e' il problema che non riesci a fare delle misure attendibili della corrente assorbita
Le opzioni sono due.
-
Usare una scheda Arduino come ad esempio la Mini o la Micro ( ce ne sono di economiche ) a cui e' collegato il Driver L298 e il tutto montato vicino al condensatore. E comunicare via Seriale con la Leonardo in cui hai l'Encoder
-
Montare solo il Driver L298 vicino al Condensatore e bufferizzando le uscite pilotarlo a distanza. Pero' Servono i fine corsa e non ti basta una cavo UTP per segnali e alimentazioni.
Poi , se pensi di provare a collegare solo il motore con i suoi 4 cavetti, liberissimo di farlo. Le correnti in gioco sono basse e potrebbe pure funzionare. Audentes fortuna iuvat.
E' difficile usare i finecorsa su un rotore multigiro. E' per quello che ho chiesto se ci fossero già nel condensatore.
Il modulo L298 è quello della foto allegato a questo post. Grazie per lo schema che hai allegato. La soluzione per me resta quello dei quattro fili che arrivano al motore vicino all'antenna, le tensioni elettriche in gioco sono elevatissime 17.000 volts, oltre alla radiofrequenza di diversi centinaia di watt che arrivano al condensatore. Nella mia premessa spiegavo che ancora non ho tutta la dimestichezza con il codice arduino per cui chiedevo una mano per predisporre il codice necessario a far funzionare lo schema che mi hai inviato, te ne sarei molto grato. Il progetto prevede un anello di rame con tubo da 18mm del diametro di circa 80 cm collegato al condensatore variabile il cui alberino sara' collegato direttamente a motorino bipolare, per accordare l'antenna.
Ti ringrazio ancora per l'aiuto che mi potrai dare. Se hai del codice già pronto che secondo te puo' andare me lo fai avere e io lo testo. Ti invio anche dei video dove hanno realizzato quello che mi serve per il progetto. Saluti e 73 IU8CRI






