Circuito accordatore antenna motorizzato con Arduino

Questo circuito per accordatore antenna motorizzato con Arduino, tornerà utile?
Approfittando dei componenti già montati per il recente articolo “Circuito per slitta motorizzata con Arduino” ho voluto soddisfare l’esigenza prospettata da Giuseppe in uno degli ultimi commenti.

…Il movimento del motore passo passo dovrebbe avvenire solo alla pressione del pulsante e dovrebbe fermarsi solo al rilascio del pulsante.
Il motivo di questa modifica sarebbe utilissimo per un mio piccolo progetto di una antenna chiamata Loop Magnetico per uso radioamatoriale per far girare un condensatore variabile per “accordare” il sistema di antenna alla frequenza che occorre in quel momento….

In sostanza lo scopo del circuito è quello di comandare un motore passo passo tramite due pulsanti. Con uno faremo muovere il motore in una direzione e con l’altro lo faremo girare nel senso opposto.
I movimenti avverranno soltanto alla pressione dei bottoni.

Come di consueto, ho deciso di utilizzare le comode librerie AccelStepper e Bounce2 per gestire il motore e la pressione dei tasti. Grazie ad esse infatti, intercettare lo stato dei pulsanti e determinare i movimenti dello stepper è davvero semplice.

Quindi

Non sono un radioamatore, ma da quel che ho capito, l’operazione di accordatura della frequenza di questo progetto dovrà avvenire lentamente, quindi ho fatto in modo che il motore giri ad una risoluzione di 1/16 di STEP. Per fare questo, come visto nei precedenti articoli in cui parlo di motori passo passo pilotati tramite driver A4988, ho agito sui pin MS1, MS2 e MS3.

Lo schema dei collegamenti è abbastanza semplice. Utilizzo un’unica fonte di alimentazione a 12V con la quale alimento sia l’Arduino che il motore passo passo. Per l’alimentazione logica del driver A4988 sfrutto l’uscita a 5V di Arduino. Per evitare di mantenere alimentato e sotto tensione lo stepper motor, sfrutto il pin ENABLE del driver per rilasciare il rotore quando non richiesto. Due pulsanti con relative resistenze a massa decreteranno i movimenti nei due sensi di marcia, mentre per una maggiore risoluzione del motore, come già detto, ho posto i pin MS1, MS2 e MS3 a +5V. Per modificare queste condizioni è possibile fare riferimento a questa tabella:

MS1 MS2 MS3 Risoluzione Motore
Low Low Low 1 – Full step
High Low Low 1/2 – Half step
Low High Low 1/4 – Quarter step
High High Low 1/8 – Eighth step
High High High 1/16 – Sixteenth step

Il circuito


Ho caricato anche lo schema elettrico visto che per qualcuno risulta essere più chiaro rispetto alla versione dei collegamenti 😉

Il codice

Come sempre il codice è ampiamente commentato ed abbastanza semplice, ma per qualsiasi dubbio o chiarimento, usa pure la sezione commenti a fondo pagina.

// Inclusione delle librerie
#include <AccelStepper.h>
#include <Bounce2.h>

// Velocità di movimento.
// Da modificare secondo le proprie esigenze
const int SPEED_DIREZIONE = 100;

// Definizione costanti relative ai PIN
const int PIN_SW_AVANTI = 4;
const int PIN_SW_DIETRO = 5;

const int PIN_DR_DIR = 6;
const int PIN_DR_STEP = 7;
const int PIN_DR_EN = 8;

// Il delay in ms di debounce applicato agli switch
const unsigned long DEBOUNCE_DELAY = 5;

// Istanzia il motore
AccelStepper motore(AccelStepper::DRIVER, PIN_DR_STEP, PIN_DR_DIR);

// Istanzia i bottoni
Bounce btnSwAvanti = Bounce();  //Pulsante per andare avanti
Bounce btnSwDietro = Bounce();  //Pulsante per andare in dietro

int direzione = 0;
boolean muovi = false;

void setup() {

  // Definizione della modalità dei PIN
  pinMode(PIN_SW_AVANTI, INPUT_PULLUP);
  pinMode(PIN_SW_DIETRO, INPUT_PULLUP);
  pinMode(PIN_DR_EN, OUTPUT);

  // Associa i PIN degli switch alle istanze dei bottoni (Bounce)
  btnSwAvanti.attach(PIN_SW_AVANTI);
  btnSwAvanti.interval(DEBOUNCE_DELAY);
  btnSwDietro.attach(PIN_SW_DIETRO);
  btnSwDietro.interval(DEBOUNCE_DELAY);

  // Disabilito di default il driver
  digitalWrite(PIN_DR_EN, HIGH);

  // Definizione parametri motore
  motore.setMaxSpeed(1000);
}

void loop() {

  // Tieni d'occhio gli switch "Avanti" e "Dietro"
  handleSwStatus();

  // Aziona il motore
  if (muovi) {
    digitalWrite(PIN_DR_EN, LOW);
    motore.setSpeed(direzione);
    motore.runSpeed();
  } else {
    digitalWrite(PIN_DR_EN, HIGH);
    motore.stop();
  }

}

void handleSwStatus() {
  btnSwAvanti.update();
  btnSwDietro.update();

  boolean btnAvantiPressed = btnSwAvanti.read();
  boolean btnDietroPressed = btnSwDietro.read();

  // Se vengono premuti entrambi i bottoni non fare niente
  if (btnAvantiPressed && btnDietroPressed) {
    direzione = 0;
    muovi = false;
    return;
  }

  if (btnAvantiPressed) {
    direzione = SPEED_DIREZIONE;
    muovi = true;
  } else if (btnDietroPressed) {
    direzione = -SPEED_DIREZIONE;
    muovi = true;
  } else {
    direzione = 0;
    muovi = false;
  }

}

Come sempre

  • Importa le librerie necessarie;
  • Assicurati che tutti i collegamenti siano corretti;
  • Ricordati di impostare la porta COM del tuo Arduino;
  • Utilizza le tensioni corrette;
  • E ricorda che io non mi assumo nessuna responsabilità per eventuali danni o disastri che causi 😀

Spero che questo post ti sia stato utile! Per qualsiasi domanda o chiarimento, fai riferimento alla sezione commenti.
Sono ben accetti, birre, caffè e donazioni 😉

Niente video?

Questa volta non ho avuto tempo per realizzare un video del montaggio, ma data la banalità dei collegamenti e del funzionamento credo non ce ne sia bisogno. Se avrò tempo, realizzerò una GIF del funzionamento 😉

Trovi su Amazon





Approfondimenti

%d blogger hanno fatto clic su Mi Piace per questo: