Pilotare motore dc con l293d

Salve sono un ragazzo di 17 anni che frequenta il terzo anno in un istituto tecnico. Quest’anno alla mia classe è stato assegnato un lavoro a gruppi che consiste nel costruire un proprio progetto di robotica, assieme al mio gruppo abbiamo deciso di realizzare un sistema di differenziamento rifiuti intelligente basato principalmente su un lettore qr e dei motorini pilotati da un driver l293d che sollevano i coperchi dei cestini. Durante la realizzazione del progetto non abbiamo incontrato grandi problemi nella parte software ma arrivati al montaggio ci siamo accorti che i motorini quando vengono montati assieme ai driver iniziano a produrre un ronzio ma il meccanismo non si aziona mentre invece quando montati senza driver funzionano normalmente. Mi chiedevo se qualcuno avesse qualche idea sul motivo per il quale non funzionano quando pilotati dal driver l293d
(il montaggio simulato su tinker cad non da alcun problema) allego schema di montaggio e codice


#include <LiquidCrystal_I2C.h>
#include <SoftwareSerial.h>
const int rxPin=2;
const int txPin=3;
const int inputA = 16;
  const int inputB = 4;
  const int enablePin1 = 6;

const int inputC = 15;
  const int inputD = 8;
  const int enablePin2 = 11;

const int inputE = 14;
  const int inputF = 12;
  const int enablePin3 = 10;
int s;
int pulsante = 7;
LiquidCrystal_I2C lcd(0x27,16,2);
SoftwareSerial QR(2,3);


void setup(){
lcd.init();
lcd.backlight();
lcd.clear();
lcd.setCursor(0,0);
lcd.print("S.I.D.R.");
pinMode(inputA, OUTPUT);
pinMode(inputB, OUTPUT);
pinMode(enablePin1, OUTPUT);
pinMode(inputC, OUTPUT);
pinMode(inputD, OUTPUT);
pinMode(enablePin2, OUTPUT);
pinMode(inputE, OUTPUT);
pinMode(inputF, OUTPUT);
pinMode(enablePin3, OUTPUT);
pinMode(pulsante, INPUT);
  Serial.begin(9600);
  QR.begin(9600);
}

  
    
  
void loop(){
  
  if(QR.available()>0)
  {
  s=QR.read();
    s=s-48;
    Serial.println(s);
    delay(1000);
  } 
  else if(Serial.available()>0)
  {
  s=Serial.read();
    s=s-48;
    Serial.println(s);
  }
   
      
  }
  switch(s){
    
     case 1:
     	analogWrite(enablePin1, 50);
		digitalWrite(inputB, LOW);
		digitalWrite(inputA, HIGH);
		delay(5000);
		digitalWrite(inputB, HIGH);
		digitalWrite(inputA, LOW);
      	delay(5000);
		s=0;
    	lcd.setCursor(0,0);
    	lcd.print("plastica");
    	delay(2000);
        lcd.print("S.I.D.R.");
    	
    break;
    case 2:
    		analogWrite(enablePin2, 50);
			digitalWrite(inputD, LOW);
			digitalWrite(inputC, HIGH);
			delay(5000);
			digitalWrite(inputD, HIGH);
			digitalWrite(inputC, LOW);
			delay(5000);
			s=0;
  		  	lcd.setCursor(0,0);
    		lcd.print("carta");
            delay(2000);
        	lcd.print("S.I.D.R.");
    break;
    case 3:
    			analogWrite(enablePin3, 50);
				digitalWrite(inputF, LOW);
				digitalWrite(inputE, HIGH);
				delay(5000);
				digitalWrite(inputF, HIGH);
				digitalWrite(inputE, LOW);
				delay(5000);
				s=0;
                lcd.setCursor(0,0);
    			lcd.print("vetro");
            	delay(2000);
        		lcd.print("S.I.D.R.");
    break;
    default:
    analogWrite(enablePin1, 0);
    analogWrite(enablePin2, 0); 
    analogWrite(enablePin3, 0);
    break;
  }
if(digitalRead(pulsante)== HIGH)
{
lcd.setCursor(0,0);
lcd.print("tutto aperto");
analogWrite(enablePin1, 50);
analogWrite(enablePin2, 50);
analogWrite(enablePin3, 50);
digitalWrite(inputB, LOW);
digitalWrite(inputA, HIGH);
digitalWrite(inputD, LOW);
digitalWrite(inputC, HIGH);
digitalWrite(inputF, LOW);
digitalWrite(inputE, HIGH);
delay(5000);
digitalWrite(inputB, HIGH);
digitalWrite(inputA, LOW);
digitalWrite(inputD, HIGH);
digitalWrite(inputC, LOW);
  digitalWrite(inputF, HIGH);
digitalWrite(inputE, LOW);
delay(5000);
analogWrite(enablePin1, 0);
analogWrite(enablePin2, 0);
analogWrite(enablePin3, 0);
delay(1000);
lcd.print("S.I.D.R.");
}

}

Buongiorno e benvenuto nella sezione Italiana del forum, :slight_smile:

cortesemente, come prima cosa, leggi attentamente il REGOLAMENTO di detta sezione, (... e, per evitare future possibili discussioni/incomprensioni, prestando molta attenzione al punto 15), dopo di che, come da suddetto regolamento (punto 16.7), fai la tua presentazione NELL'APPOSITA DISCUSSIONE (... quello che vedi in blu è un link, fai click su di esso per raggiungere la discussione) spiegando bene quali esperienze hai in elettronica e programmazione, affinché noi possiamo conoscere la tua esperienza ed esprimerci con termini adeguati.

Grazie,

Guglielmo

P.S.: Ti ricordo che, purtroppo, fino a quando non sarà fatta la presentazione nell’apposita discussione, nel rispetto del succitato regolamento nessuno ti risponderà (eventuali risposte o tuoi ulteriori post, verrebbero temporaneamente nascosti), quindi ti consiglio di farla al più presto. :wink:

Salve, ho provveduto a leggere il regolamento e a presentarmi nella sezione apposita.

1 Like

Come alimentate il tutto?

Guglielmo

Oltre alla domanda di Guglielmo (quando si lavora con motori, il problema di alimentazione è un classico...), aggiungo anche due miei dubbi:

  1. Se ogni L293D può controllare 2 motori DC perché ne usi 3? O meglio ancora perché non usare una shield come questa?
  2. Se serve aprire e chiudere un coperchio, perché usare motori DC invece dei ben più semplici e comodi da gestire servo?

rispondo a gpb01
utilizzo un modulo di alimentazione per breadboard da 12 volt per alimentare i driver che pilotano i motorini

... corrente che è in grado di fornire?

Guglielmo

  1. abbiamo deciso di utilizzare 3 driver semplicemente perché ci siamo trovati più comodamente ad usarne 3 nel montaggio
  2. sinceramente non so quale sia il loro utilizzo e come siano piu comodi per alzare e abbassare un coperchio(provvederò a informarmi sulla loro funzionalità) ma comunque non penso di riuscire ad implementarli nel progetto visto che dovrei presentarlo questo giovedi

5v in output

Quindi rispetto al progetto di tikercad ci sono due sorgenti di alimentazione? Se si ad esempio 5V per alimentare arduino e 12V per i motori allora i GND dei due alimentatori devono essere connessi assieme.

analogWrite(enablePin1, 50);

Per lavorare sotto carico meccanico un PWM di 50 sembra basso.
Prova ad aumentarlo e se anche così non si muove prova ad aiutare il motore alzando il coperchio lentamente.

Ciao.

salve, mi ero sbagliato in realtà i driver che pilotano i motorini sono alimentati da un modulo di alimentazione alimentato a 12v ma in uscita fornisce 5v,mentre arduino è alimentato da un alimentatore da 5v e le masse delle due alimentazioni sono separate sulla breadboard.
per ora sui motorini non è applicato nessuno carico per questo motivo ho messo 50 come velocità.

Per ipotesi puntiamo il dito sulla mancanza del nodo comune di riferimento GND tra i due circuiti. Arduino alza un pin a 5V rispetto al suo nodo GND. Il 293 riceve 5V rispetto al GND di arduino, ma rispetto al GND del 293 non c'è differenza di potenziale. Si risolve rendendo unico il nodo di riferimento, appunto collegando i GND assieme.

Se il problema fosse questo potresti anche farcela.

Ciao.

grazie del consiglio appena potrò proverò col mettere la massa comune e ti faccio sapere.

... perdona, ma io ho chiesto la "corrente" che è in grado di fornire, NON la "tensione" di uscita verso arduino ... :roll_eyes:

Guglielmo

hai ragione scusami mi ero sbagliato, la corrente massima che che riesce a fornire il modulo di alimentazione è di 500mA

Mi sembrano un po' pochini ... sicuro che siano sufficienti per i motori che comandi (specie se devono fisicamente muovere un qualche cosa)?

Guglielmo

non saprei però quando i motori sono collegati a quell’alimentazione girano e anche velocemente(senza nessun carico) ma quando vengono collegati ai L293D(alimentati dalla medesima alimentazione) che li pilotano non girano e producono un rumore simile a un ronzio”

...già, se almeno una delle due alimentazioni provenisse da batteria. Ma se provengono da due alimentatori da rete è ancora peggio, perché tra i circuiti potrebbero instaurarsi decine di volt in alternata provenienti dall'accoppiamento capacitivo interno tra primario e secondario degli alimentatori.

In sostanza la mancanza del riferimento comune non solo non permette al circuito di funzionare, ma lo può anche danneggiare.

Beh direi che con i problemi che già stai riscontrando, la soluzione dei servo sarebbe la più semplice e rapida, perché a parte il GND mancante (il che è dovuto probabilmente alla tua scarsa esperienza) ci sono anche altre cose che sospetto tu non stia considerando. Ad esempio: tu attivi un motorino DC per aprire un coperchio, ok? Bene, e come fai a capire quanti giri devi far fare al motore per aprirlo, e quindi fermare il motore se non hai previsto almeno un paio di switch fine corsa per ogni coperchio? Se lo attivi per un certo tempo non hai la certezza che si sia chiuso o aperto completamente...

Con un semplice servo invece ti basta indicare la posizione e ci pensa lui a fermarsi dove prevedi (a meno che tu non stia alzando un coperchio più pesante di quanto il servo potrebbe gestire). E questo significa tanto tempo in meno per gestire l'hardware, semplificando e velocizzando poi il codice. Per me stai perdendo tempo inutilmente, soprattutto vista la scadenza così vicina...

okokk grazie, farò qualche altro tentativo con i motorini pilotati dai L293D e se proprio non si trova una soluzione vedrò dove procurarmi dei servomotori che effettivamente sembrano la soluzione migliore visto che il peso dei coperchi è molto poco, gia all’inizio del progetto avevo valutato di utilizzarli ma avevo sentito dire che si bruciano molto facilmente quindi ho optato per dei motori dc per creare delle carrucole con filo attaccate nella parte posteriore che sollevino i coperchi.
Mentre per quanto riguarda la questione dei secchi che non si chiudono completamente non disponendo dei fine corsa avevo pensato semplicemente di contare quanti giri impiega il filo per arrotolarsi tutto attorno alla carrucola e impostare la velocità dei motorini corrispondente al numero di giri nel tempo.