Visualizzazione post con etichetta Robot. Mostra tutti i post
Visualizzazione post con etichetta Robot. Mostra tutti i post

lunedì 16 maggio 2022

Arduino N° 113 - Servomotori: pilotaggio corretto & favole metropolitane

 

Arduino N° 112

 Achille De Santis

Arduino N°  114



Servomotori. 

Parliamo prima delle "favole metropolitane". 

Molti pensano che si possa alimentare un servomotore, anche piccolo, direttamente da Arduino. 
Non c'è niente di più sbagliato!
Il singolo servo assorbe già di suo più di quanto possa fornire il povero Arduino.
Lo schema tipico errato è questo: 

Fig. 1: Servomotori: circuiteria ERRATA;


Ho esagerato a mettere quattro servo ma anche soltanto uno esce dai limiti di alimentazione di Arduino.

Risultato: 

comportamento molto instabile e rischio di bruciare lo stabilizzatore interno di Arduino.
L'aggiunta del gruppo di condensatori non basta alla bisogna (v. fig. 1). 

 
Fig. 2: Servo con alimentazione IDONEA;


Pilotaggio corretto: 

Una soluzione alle favole metropolitane potrebbe essere quella di fig. 2, dove si evidenzia il fatto che l'alimentazione dei servo è diversa (v. nota 1) da quella della scheda di controllo. In questo caso i gruppi di condensatori fanno egregiamente il loro lavoro; il funzionamento è corretto ed esente da incertezze, sempre che il firmware sia adatto.

A questo punto, se notate ancora piccolissimi movimenti indesiderati dei servo, modificate il 'firmware' introducendo, ove necessario, piccole "isteresi". Basta una isteresi di uno o due step. Il funzionamento sarà sicuro e preciso e i motori resteranno fermi, una volta raggiunto il "set-point".

Buona sperimentazione!


nota 1: 
non si tratta di alimentazione "galvanicamente separata" ma di semplice alimentazione "diversa" da quella dell'Arduino e con possibilità di erogare maggiore potenza. Una soluzione alternativa consiste nel prelevare l'alimentazione per Arduino direttamente dal robusto alimentatore aggiuntivo, massa comune.

venerdì 6 maggio 2022

Arduino N° 112 - Proximity Bot V2

Arduino N° 111

 Achille De Santis

Arduino N°  113



Base di lavoro per realizzare un piccolo robot con due servomotori in DC(v. Fig. 1).

Sono state impostate delle routines per la movimentazione dei motori.

Ognuno potrà adattarle alle proprie necessità.

Fig. 1: Layout del dispositivo;

In particolare, è possibile adattare le routines per la movimentazione destra e sinistra e richiamarle opportunamente nel programma.


 

mercoledì 5 agosto 2020

Arduino N° 61 - Modulo MP3 per Riproduzione Audio

Arduino N° 60   

 Achille De Santis

 Arduino N° 62







Sketch per la gestione di un modulo MP3 di riproduzione audio.

   
   L'esempio può essere completato per realizzare un sistema più complesso di riproduzione audio, analogamente a quanto avveniva per i  Juke-Box di buona memoria.







/* ------------------------------ Inizio programma --------------------------------------------------------------------------------------------


*/ 

#include <SoftwareSerial.h>
#include <MP3.h>

MP3 mp3;                // Definisco un oggetto di tipo MP3

void setup()
{
  mp3.begin(MP3_SOFTWARE_SERIAL);   // Dichiaro attraverso SoftwareSerial l'istanza mp3                 
  mp3.volume(0x1F);                 // Definisco il volume (0x00 - 0x1F)
  mp3.set_mode(0x002);              // Definisco la modalità (0x002 per la ripetizione di tutti i file)
  mp3.play_sd(0x0002);              // Inizio la riproduzione dalla seconda canzone
}


void loop()
{
// Se voglio posso fare il salto di canzone in maniera manuale
        // mp3.next();

}


// ------------------------ Fine programma --------------------------------------------------------------------------



Simulazione: 


Argomenti correlati:



mercoledì 18 dicembre 2019

Arduino N° 28 - Azionamento relay per motoriduttori avanti / indietro

Arduino N° 27

 Achille De Santis

Arduino N° 29





Routine da utilizzare nel corpo del programma.
Nel programma vanno definiti i parametri di ingresso alla routine:   R1, L1, R2,
Rele1  è il comando per il primo relé;
Rele2  è il comando per il secondo relé;
LED1  è una 'spia di equilibrio'.


 /* -------------- Inizio Programma -----------------------------------------------------------------
 *  Azionamento relay per motoriduttori avanti / indietro
 *  Un potenziometro stabilisce la posizione angolare del motoriduttore;
 *  un sensore di posizione (a  potenziometro),  collegato "a ponte" con il primo, rivela il
 *  raggiunto equilibrio.
 */
// ------- I/O ---------------------------------------
#define rele1       11
#define rele2       12
#define Ledpin3  13
// ---------------------------------------------------

void titolo()
{
  Serial.println(" -          Tecnatron Creation                    - ");
  Serial.println(" -          tecnatron@gmail.com               - ");
  Serial.println(" - Azionamento relay per motoriduttori   ");
  Serial.println(" -  Avanti / Indietro                                 - ");
  Serial.println(" ----------------------------------------------- ");
}

void azionamento(bool R1, bool L1, bool R2) // routine ausiliaria non richiamata direttamente.
     {
       digitalWrite(rele1, R1);
       digitalWrite(Ledpin3, L1);         // Led equilibrio
       digitalWrite(rele2, R2);
     }     
 void fermo()       { azionamento (HIGH, HIGH, HIGH); }
 void sinistra()    { azionamento (HIGH, LOW, LOW);   }
 void destra()      { azionamento (LOW, LOW, HIGH);   }

void setup()
{
  Serial.begin(9600);             // velocità di comunicazione
  titolo();
  pinMode (rele1, OUTPUT);
  pinMode (rele2, OUTPUT);
  pinMode (Ledpin3, OUTPUT);
}

void loop()
{
               // inserire qui il programma
}

// ------------------ Fine Programma --------------------------------------------


Nota:
Se non volete caricare troppo l'uscita di Arduino o del microcontrollore potete inserire uno stadio buffer a BJT sul piedino di uscita del canale di comando.



Simulazione: 

mercoledì 11 dicembre 2019

Arduino N° 27 - Pilotaggio di 2 motori con ponte ad H

Arduino N° 26

 Achille De Santis

Arduino N° 28




Utili sottoprogrammi per la gestione ed il controllo di motori in continua da utilizzare per la movimentazione  di robot, veicoli ecc...


/* ---------------------------- Inizio Programma -----------------------------
 *  Achille De Santis
 * Pilotaggio di 2 motori con ponte H
 * V5 del 09-07-2019
 * In questo modo è facile pilotare anche tre o più motori.
 * Base di lavoro per la gestione di ROBOT, veicoli telecomandati ed altro.
*/

// ---------- pin dell'asse X dei motori --------------
#define MOTOR_XA      13  // motore polo XA
#define MOTOR_XB      12  // motore polo XB
// ---------- pin dell'asse Y dei motori --------------
#define MOTOR_YA      11  // motore polo YA
#define MOTOR_YB      10  // motore polo YB
// --------------------------------------------------------

void motore(int MA,bool A, int MB, bool B)       // motore generico
{
  digitalWrite(MA, A);  // motore, pin A
  digitalWrite(MB, B);  // motore, pin B
}

// --------------------------------------------------------------------------
void avantiSX()   {motore(MOTOR_XA, 1, MOTOR_XB, 0);}
void avantiDX()   {motore(MOTOR_YA, 1, MOTOR_YB, 0);}
void avanti()     {avantiSX(); avantiDX();}
// --------------------------------------------------------------------------
void indietroSX() {motore(MOTOR_XA, 0, MOTOR_XB, 1);}
void indietroDX() {motore(MOTOR_YA, 0, MOTOR_YB, 1);}
void indietro()   {indietroSX(); indietroDX();}
// --------------------------------------------------------------------------
void fermoSX()    {motore(MOTOR_XA,0,MOTOR_XB,0); }
void fermoDX()    {motore(MOTOR_YA,0,MOTOR_YB,0); }
void fermo()      {fermoSX(); fermoDX();  }
// -----------------------------------------------------------------------------
void DXavanti() { fermoDX(); avantiSX(); delay(300); avanti(); }
void SXavanti() { fermoSX(); avantiDX(); delay(300); avanti();  }
// -----------------------------------------------------------------------------
void DXindietro() { fermo(); indietroSX(); delay(300); fermo(); }
void SXindietro() { fermo(); indietroDX(); delay(300); fermo(); }
// ----------------------------------------------------------------------------- 

void setup()
{
  pinMode (MOTOR_XA, OUTPUT);
  pinMode (MOTOR_XB, OUTPUT);
  pinMode (MOTOR_YA, OUTPUT);
  pinMode (MOTOR_YB, OUTPUT);
}

void loop()
{
    // inserire qui il programma
}

// --------------------------- Fine programma ---------------------------