Qualche settimana fa un appassionato makers e lettore del blog mi ha chiesto un consiglio per realizzare il suo progetto, Giovanni vuole realizzare qualcosa di simile al motore passo-passo pilotato da interruttori ma con un motore DC ( corrente continua ).
Per il suo progetto mi ha inviato ahce alcuni schemi e sketch realizzati da lui o reperiti on-line ma con ancora qualche difficoltà a ottenere il desiderato.
Ho deciso di sperimentare personalmente le difficoltà incontrate e di scrivere un tutorial per quanti come lui sentono l’esigenza di realizzare un progetto simile.
Il materiale
Come spesso faccio ecco la lista del materiale che ti occorre:
- n. 1 arduino 2009/uno/mega
- n. 1 motore in DC o CC ( corrente continua )
- n.1 pacco batterie da 9v o singola pila da 9v
- n.1 integrato SN754410NE
- n.1 potenziomentro da 10KΩ
- n.2 pulsanti na (normalmente aperti)
- n. 2 resistenze da 330Ω
- n. 1 breadboard
- un po’ di cavetti per breadboard
Lo schema
ecco come collegare il tutto:
Lo sketch
/* * Motori in CC pilotati da pulsanti * * Autore: Mauro Alfieri * Tw: @mauroalfieri * * Web: https://www.mauroalfieri.it */ const int buttonOrario = 4; const int buttonAntior = 5; const int potPin = A5; const int in1Pin = 6; const int in2Pin = 7; const int motorPin = 3; int potVal = 0; int bora = LOW; int bant = LOW; void setup() { pinMode(buttonOrario, INPUT); pinMode(buttonAntior, INPUT); pinMode(potPin, INPUT); pinMode(in1Pin, OUTPUT); pinMode(in2Pin, OUTPUT); pinMode(motorPin, OUTPUT); digitalWrite(in1Pin,bora); digitalWrite(in2Pin,bant); analogWrite(motorPin, 0); } void loop() { bora = digitalRead( buttonOrario); bant = digitalRead( buttonAntior); potVal = map(analogRead(potPin), 0, 1023, 0, 255); analogWrite(motorPin, potVal); if (bora == HIGH && bant == HIGH) { digitalWrite(in1Pin,LOW); digitalWrite(in2Pin,LOW); } digitalWrite(in1Pin,bora); digitalWrite(in2Pin,bant); }
avrai notato da subito che è molto ristretto, ho accorpato alcune funzioni descritte di seguito:
linee 10-15: definisci le variabili relative ai pin di collegamento tra Arduino e lo schema, in particolare i pin buttonOrario e buttonAntior a cui sono connessi i pulsanti o interruttori che definiscono il senso di rotazione e la variabile potPin connessa al pin A5 di Arduino da cui leggi il valore del potenziometro;
linee 17-19: definisci le variabili necessarie al funzionamento dello sketch, variabili in cui memorizzerai i valori letti dal potenziometro e dai pulsanti;
linee 23-28: inizializza la modalità in cui i pin devono essere utilizzati, noti che ho rispettato l’ordine delle righe 10-15 per mantenere coerente il codice, per ciascun pin la funzione pinMode() definisce se si tratta di un pi usato come INPUT o OUTPUT;
linee 30-32: imposta l’inizializzazione del circuito in modo che il motore alla partenza sia fermo, entrambi i segnali inviati all’SN754410NE a LOW e il valore del PWM a 0;
linee 37-38: leggi i valori dei pulsanti, sono connessi a porte digitali per cui il loro valore è normalmente LOW, alla pressione del pulsante passa a HIGH;
linea 39: qui ho accorpato, meglio dire annidato, 2 funzioni la prima, più interna è analogRead() che legge il valore presente sul pin A5 a cui è collegato il potenziometro, per cui legge il valore inviato dal potenziometro. Tale valore oscilla tra 0 e 1023 essendo il convertitore analogico digitale di arduino un 10bit ma il valore in PWM che puoi inviare all’SN754410NE è in scala 0-255 per cui devi adattare l’input all’aoutput, per farlo puoi usare la funzione map() che accetta in input il valore da adattare, il range di input ed il range di output atteso ed ecco che in questo caso diventa map(analogRead(pinPot, 0, 1023, 0, 255);
linea 41: invia la pin PWM il valore letto sul potenziometro ed adattato dalla llinea 39;
linea 43: è un controllo per evitare di fondere il divert SN754410NE, in pratica se premi contemporaneamente i due pulsanti invii un segnale HIGH ad entrambi i pin potenzialmente dannosi per l’SN754410NE, per evitare questa condizione verifica che il valore dei due pulsanti sia a HIGH ed esegue le righe successive;
linee 45-46: imposta a LOW entrambi i pin, questo si traduce in un fermo del motore in quanto l’SH754410NE non riceve segnali sui pin di input e di conseguenza non invia segnali sui pin di output, al motore;
linee 49-50: queste due linee lavorano una al contrario dell’altra per indicare al motore di ruotare in senso orario o antiorario, il primo avviene portando il pin IN1 a HIGH ed il pin IN 2 a LOW. La seconda condizione si verifica invertendo questi valori avrai quindi che premendo il pulsante connesso al pin buttonOrario il motore girerà in un verso e premendo il pulsante connesso al pin buttonAntior il motore girerà nel verso contrario.
Dovresti aver chiaro come funziona questo sketch, ma se hai dubbi commenta l’articolo ed io proverò a darti le risposte che desideri.
intanto puoi guardare il video demo:
Buon divertimento !!!
72 commenti
Vai al modulo dei commenti
L’uso dei motori DC apre molti scenari interessanti. Seguo interessato!
Autore
Ciao Alessandro,
mi fa piacere .. hai già letto gli articoli sui motori DC pilotati dalla motor shield fe?
Mauro
Ciao Mauro
Interessante la tua soluzione
Io avevo provveduto con questo codice:
// Uso L293 con potenziometro e cambio moto avanti-retro con due int. na ok
// setta pin
const int buttonPin1 = 2; // selettore
const int buttonPin2 = 4; // selettore
const int ledPin1 = 8; // LED controllo
const int ledPin2 = 9; // LED controllo
const int potPin = A1; // input potenziometro
const int in1Pin = 5; // L293 pin 2
const int in2Pin = 6; // L293 pin 7
const int motorPin = 3; //L293 pin 1 pwm
int buttonState1 = 0; // variabile per leggere stato degli interruttori
int buttonState2 = 0;
int potVal = 0;
int mapedPotVal = 0;
void setup()
{
// inizializzo il tutto
pinMode(potPin, INPUT);
pinMode(motorPin, OUTPUT);
pinMode(in1Pin, OUTPUT);
pinMode(in2Pin, OUTPUT);
pinMode(ledPin1, OUTPUT);
pinMode(ledPin2, OUTPUT);
pinMode(buttonPin1, INPUT);
pinMode(buttonPin2, INPUT);
}
void loop()
{
buttonState1 = digitalRead(buttonPin1); // Rileva stato sw1
buttonState2 = digitalRead(buttonPin2); // Rileva stato sw2
potVal = analogRead(potPin); // Rileva valore potenziometro
mapedPotVal = map(potVal, 0, 1023, 0, 255); // Scala il risultato della lettura
analogWrite(motorPin, mapedPotVal); // Output del valore rimappato all’integrato
[b]// leggo stato sw1
if (buttonState1 == HIGH) {
// accendo LED avanti:
// spengo LED indietro:
// cambio direzione motore
digitalWrite(ledPin1, HIGH);
digitalWrite(ledPin2, LOW);
digitalWrite(in1Pin,HIGH);
digitalWrite(in2Pin,LOW);
}
else if (buttonState2 == HIGH) {
// accendo LED avanti:
// spengo LED indietro:
// cambio direzione motore
digitalWrite(ledPin1, LOW);
digitalWrite(ledPin2, HIGH);
digitalWrite(in1Pin,LOW);
digitalWrite(in2Pin,HIGH);
}
else {
mapedPotVal = 0; // forzo a zero
analogWrite(motorPin, mapedPotVal); // Output del valore della all’intergrato
}[/b]
}
Tutto funziona; tuttavia non avevo pensato alla possibilità che vengano premuti contemporaneamente i due pulsanti come hai fatto tu molto più saggiamente!
Adesso ho installato due fine corsa (micro a contatto) per evitare di danneggiare il motore alla fine delle due corse. Come devo implementare il sw per gestire i due F.C ?
Devo dichiararli come due interruttori aggiuntivi e leggere lo stato (se sono High, forzare il motore a zero ?
Dovrebbe essere cosi a rigor di logica ma non sono sicuro.
Tutto sommato qualcosa (anche se con mille dubbi) stò imparando anche grazie a Te!
Ciao
Gianni
Autore
Ciao Gianni,
mi sembra tu vada alla grande, continua a sperimentare e leggere articoli, potrai imparare sempre cose nuove, io pubblico tutto quello che imparo anche dai vostri sketch.
Per i tuoi finecorsa collegali come i pulsati 1 e 2 a due pin digitali e leggi il loro valore con la funzione digitalRead(pin) se HIGH imposi a LOW i pin di comando e a 0 il PWM, ricordati ce questa condizione è permanente fio alla pressione di un pulsante che inverta la corsa, non subordinare a nessun IF il controllo dei finecorsa.
Mauro
Scusa Mauro ma la tua frase “ricordati che questa condizione è permanente fio alla pressione di un pulsante che inverta la corsa, non subordinare a nessun IF il controllo dei finecorsa.” non credo di capirla molto…
Come posso testare senza if ? Non vorrei fare danni…….
che istruzioni mi consigli di usare quindi?
Grazie per l’interessamento.
Autore
Ciao Gianni,
forse è un po’ criptica.
Non intendevo elimina gli IF per testare i pulsani o i finecorsa, solo non annidare l’IF di test del finecorsa in quello di test di un pulsate, es.:
IF ( test pulsante avanti)
IF ( test finecorsa 1)
…
O viceversa xchè otterresti che se il pulsante non è in cinduzione il finecorsa è ignorato o viceversa.
Spero di essere stato più chiaro.
Mauro
Tu sei chiaro
sono io che ho ancora molti dubbi !
Mi permetto di farti vedere il codice che ho implementato per i fine corsa (non l’ ho provato perchè non vorrei combinare qualche guaio)
Se e quando hai tempo proveresti a controllare se ti quadra?
Ho introdotto anche il controllo dei due pulsanti se premuti contemporaneamente.
Grazie ancora
// Uso L293 con potenziometro e cambio moto avanti-retro ok
// setta pin
const int buttonPin1 = 2; // pulsante 1
const int buttonPin2 = 4; // pulsante 2
const int buttonPin3 = x; // finecorsa 1 (X sarà sotituito dal numero di un pin digitale libero)
const int buttonPin4 = y; // finecorsa 2 (y sarà sotituito dal numero di un pin digitale libero)
const int ledPin1 = 8; // LED controllo
const int ledPin2 = 9; // LED controllo
const int potPin = A1; // input potenziometro
const int in1Pin = 5; // L293 pin 2
const int in2Pin = 6; // L293 pin 7
const int motorPin = 3; //L293 pin 1 pwm
int buttonState1 = 0; // variabile per leggere stato pulsante 1
int buttonState2 = 0; // variabile per leggere stato pulsante 2
int buttonState3 = 0; // variabile per leggere stato finecorsa 1
int buttonState4 = 0; // variabile per leggere stato finecorsa 2
int potVal = 0;
int mapedPotVal = 0;
void setup()
{
// initializzo
pinMode(potPin, INPUT);
pinMode(motorPin, OUTPUT);
pinMode(in1Pin, OUTPUT);
pinMode(in2Pin, OUTPUT);
pinMode(ledPin1, OUTPUT);
pinMode(ledPin2, OUTPUT);
pinMode(buttonPin1, INPUT);
pinMode(buttonPin2, INPUT);
pinMode(buttonPin3, INPUT);
pinMode(buttonPin4, INPUT);
}
void loop()
{
buttonState1 = digitalRead(buttonPin1); // Rileva stato pulsante 1
buttonState2 = digitalRead(buttonPin2); // Rileva stato pulsante 2
buttonState3 = digitalRead(buttonPin3); // Rileva stato finecorsa 1
buttonState4 = digitalRead(buttonPin4); // Rileva stato finecorsa 2
potVal = analogRead(potPin); // Rileva valore potenziometro
mapedPotVal = map(potVal, 0, 1023, 0, 255); // Scala il risultato della lettura
analogWrite(motorPin, mapedPotVal); // Output del valore della all’intergrato
// leggo stato pulsante 1
if (buttonState1 == HIGH) {
// accendo LED avanti:
// spengo LED indietro:
// cambio direzione motore
digitalWrite(ledPin1, HIGH);
digitalWrite(ledPin2, LOW);
digitalWrite(in1Pin,HIGH);
digitalWrite(in2Pin,LOW);
}
// leggo stato pulsante 2
else if (buttonState2 == HIGH) {
// accendo LED avanti:
// spengo LED indietro:
// cambio direzione motore
digitalWrite(ledPin1, LOW);
digitalWrite(ledPin2, HIGH);
digitalWrite(in1Pin,LOW);
digitalWrite(in2Pin,HIGH);
}
else {
mapedPotVal = 0;
analogWrite(motorPin, mapedPotVal); // Output del valore della all’intergrato
}
// leggo stato finecorsa 1
if (buttonState3 == HIGH) {
digitalWrite(in1Pin,LOW);
digitalWrite(in2Pin,LOW);
mapedPotVal = 0;
analogWrite(motorPin, mapedPotVal); // Output del valore della all’intergrato
}
// leggo stato finecorsa 2
if (buttonState4 == HIGH) {
digitalWrite(in1Pin,LOW);
digitalWrite(in2Pin,LOW);
mapedPotVal = 0;
analogWrite(motorPin, mapedPotVal);
}
if (buttonState1 == HIGH) && (buttonState2 == HIGH) { // controllo che i due pulsanti non siano premuti contemporaneamente
digitalWrite(in1Pin,LOW);
digitalWrite(in2Pin,LOW);
}
Autore
Ciao Gianni,
il codice che mi hai inviato non sembra avere errori.
Se posso darti un suggerimento non chiamare tutti i bottoni: buttonPinX dove X è 1,2,3 o 4 ma usa dei nomi parlanti tipo:
buttonOrario
buttonAntiorario
buttonFineCorsaA
buttonFineCorsaB
…
Il codice diventa più leggibile anche se un domani vorrai fare delle migliorie.
Potrei apportare altre correzioni, ma sarebbero solo stilistiche e per nulla cambierebbero il senso del tuo codice.
Provalo senza problemi e fammi sapere se fa quello che vuoi, ad occhio sembra di si.
Mauro
Ottimo tutorial grazie! =)
Non sarebbe meglio mettere dei diodi di protezione?
Ciao
Autore
Ottima idea, io nel tutorial non li ho segnati ma in un progetto completo è bene che vi siano 🙂
Mauro
Se non ricordo male i diodi di protezione sono già integrati nel chip almeno per :
L293D(DNE) 600mA output current per canale, integra diodi di protezione
SN754410NE 1000mA output current per canale, integra diodi di protezione
Occorrono invece sicuramente per il L293B ( 1000mA output current per canale senza diodi di protezione)
Ora, aggiungere altri diodi ulteriori non farebbe sicuramente male basta tener presente le cadute di tensione introdotte.
Almeno questo è quanto ricordo.
Ciao
Autore
Ciao Gianni,
ricordavo anche io questa differenza, quando ho risposto ho cercato un datasheet in internet non trovando quello della versione NE, con questo integrato non avesti bisogno dei diodi di protezione esterni.
Mauro
Grazie per il commento illuminante, ho provato a fare uno sketch simile con un L293B, credo di aver fatto prendere un paio di ottime scottate al mio arduino.
Aggiungendo i diodi posso comunque usare l’L293B per provare a replicare questo sketch?
Come avrete capito, posso definirmi senza dubbio un principiante, consapevole di aver bruciato un po troppe tappe… prometto di studiare di più in futuro.
Grazie!
P.s. ehm i diodi come vanno messi?
Autore
Ciao Alessandro,
segui un articolo in cui il controllo del motore è fatto con un L293B come il tuo, lo schema sarà adeguato, quello in quest’articolo è tutt’altro integrato.
Ok grazie mille!
Complimenti per il blog
ciao scusami se la domanda è un po stupida:
al rigo 39 hai scritto: potVal = map(analogRead(potPin), 0, 1023, 0, 255);
è la stessa cosa scrivere: potVal =( analogRead(potPin) * 255)/1023;
Autore
Ciao Abramo,
si è simile, la funzione map() esegue la rimappatura tra i primi due valori ed i secondi due rispetto al valore contenuto nel primo parametro.
In questo caso non c’è molta differenza, in altri sketch è meglio utilizzare la funzione map() perché ha ad esempio il controllo dei valori min e max in modo da non inviare segnali errati ai pin.
Mauro
Salve,
per il motore non sarebbe meglio un’alimentazione esterna?
Autore
Ciao Matteo,
giusta osservazione, il chip utilizzato serve proprio a questo, nell’esempio è stato usata l’alimentazione Arduino solo per dimostrare che il circuito funziona.
Mauro
ciao Mauro,
vorrei fare la stessa cosa ma con la motor shield FE, premo un pulsante NA e il motore DC gira in un verso, premo un altro pulsante NA e gira nel verso opposto..la velocità vorrei regolarla con un potenziometro. Ma questo dove lo collego? dove trovo lo sketch?
Autore
Ciao Roberto,
Hai cercato nel blog?
Mi sembra di aver scritto alcuni tutorial sui motori cc sia con pulsanti sia con potenziometri.
Se non li trovi, provo a cercarteli.
Intanto il potenziometro lo colleghi ad un pin analogico e i pulsanti puoi scegliere se collegarli ai pin analogici o digitali con delle resistenze di pull-down da 330ohm.
Mauro
Buonasera Mauro. Per quanto riguarda i motorini in continua io ho provato a collegarne 3 alla scheda arduino uno (senza codice) senza resistenze e nulla. Ho alimentato la scheda con un trasformatore impostato su 7.5 V e ho notato che la scheda ha iniziato a scaldarsi (i motori andavano tutti senza problemi). Essendo ancora poco abile nell’utilizzo di Arduino mi chiedevo come procedere per quanto riguarda il pilotaggio dei tre motori tramite la scheda arduino, in quanto il mio progetto prevede un comando a distanza tramite un telecomando e un ricevitore pir, come quello citato nel suo articolo https://www.mauroalfieri.it/informatica/tutorial-arduino-ir-con-tsop1738.html . In definitiva, come posso evitare che la scheda si scaldi (ho letto qualcosa per quanto riguarda l’utilizzo dei transistor, ma provando ad usare 1 transistor e 1 motore la scheda si è scaldata moltlissimo e il motore non andava). La ringrazio anticipatamente 🙂
Autore
Ciao Davide,
per usare i motori CC con Arduino puoi usare una Motor Shield, sul blog ne ho recensite alcune con caratteristiche differenti, scegli quella più adatta ai tuoi motori.
Mauro
Grazie mille 🙂
Buongiorno Mauro
Inizio con il porgerti i miei complimenti per il tuo Blog in perfetto stile open source dove, si rischia anche di ingrassare per le tue ottime ricette.
Sei riuscito a farmi prendere arduino a 50 anni suonati per via della mia passione per il telescopio e ho usato questo tuo tutorial per crerare un movimento del fuocheggiatore del mio OTA ma, volevo arricchirlo di gadget e dedicarlo Open Source alle community di appassionati come me di esplorazione del Cielo
La mia idea era di usare due motori DC o Passo Passo unipolari nello stesso circuito
Uno per regolare il fuocheggiatore del Telescopio e uno per quello del Telescopio di Guida, regolazione separata della velocità per i due motori e un display per visualizzare quando si usa il motore per la Camera di ripresa o quello della Autoguida per seguire l’oggetto da fotografare
Se per te va bene possiamo unire le forze con impegno da parte mia di approvvigionarti del materiale che serve per il mio progetto e che sicuramente ho già in casa
Si potrebbe poi pensare di integrarlo con il SW Ascom http://ascom-standards.org/ coinvolgendo la loro Community open source
Che ne pensi Mauro ?
Roberto
Autore
Ciao Roberto,
il tuo è un progetto molto interessante anche se io non conosco i telescopi.
Se ti occorrono dei consigli su difficoltà che incontri nella scrittura del software io sono disponibile a darteli.
Non riesco in questo momento a impegnarmi in un altro progetto in quanto tra i miei progetti personali ed i progetti arduino su commissione
mi resta poco tempo che dedico al mio lavoro di tutti i giorni 🙂
Mauro
Volentieri Mauro se per te non è un problema visto che per me risulta difficile appunto il SW, Grazie mille sei gentilissimo 🙂 intanto ti metto questi link cosi magari ti rendi conto della questione
http://astrojolo.blogspot.it/2013/02/ascom-telescope-focuser-with-arduino.html
https://github.com/ejholmes/Arduino-Focuser/blob/master/README.md
La mia idea è quella di integrare al tuo tutorial con il motore passo passo una shield motore DFrobot 1A e un joystick DFRobot che mi permette un avanzamento veloce con i pulsanti e adjust fine del fuocheggiatore e con un display 16×2 che indica numericamente di quanto si è spostato il fuocheggiatore per poterla segnare e ricordare 🙂
Ti inserisco un video per conoscenza di un sistema che costa circa 800 € compreso motore 🙂
http://www.youtube.com/watch?v=ALtk2yZUZJk
Grazie ancora Mauro
Autore
Ciao Roberto,
la mia proposta é di aiutarti ma il codice lo devi scrivere tu, se nella realizzazione trovi qualche difficoltà di sintassi io ti posso suggerire cosa fare.
Cosa differente é un progetto su commissione in cui io mi informo su tutto il metodo di funzionamento e definisco lo schema dello sketch, le funzioni e ti invio sketch e documentazione.
Mauro
ciao Mauro
per prima cosa grazie, sto imparando molto grazie a te.
Ho provato a replicare lo schema che hai proposto ma c’è qlc che non va…
Sto usando questo motore http://www.pololu.com/product/1107/specs (mi serve per uno slider motorizzato), alimento a 12v, il motore funziona se lo attacco direttamente alla batteria, lo sketch è caricato e corretto, i collegamenti pure… ma non funziona…
Ho provato anche con un’altro motore di una vecchia stampante ma niente…
Integrato bruciato o motore non adatto?
Grazie per la disponibilità
M.
Autore
Ciao Marco,
un’analisi a distanza è difficile, posso solo ipotizzare che tu abbia qualche problema al driver di controllo da quello che mi descrivi.
Potresti provare con un tester a verificare che i pin arduino erogino i valori desiderati e che collegando il driver questo si pomporti in modo corretto.
Mauro
Buongiorno,
questo sito è veramente utilissimo per uno che come me sta iniziando ad usare arduino.
Vorrei chiedere un aiuto. Voglio inserire un pulsante che mi permetta di bypassare il potenziometro in modo tale che, regolato il potenziometro sulla velocità minima del motore, premendo questo pulsante normalmente aperto assieme ad un pulsante di direzione, il motore va al massimo della sua velocità.
Vi ringrazio per l’aiuto,
Giulio
Autore
Ciao Giulio,
ciò che vuoi realizzare non è complesso, ti suggerisco di comprendere bene come funzionano i pulsanti e ragionare sulla logica di ciò che vuoi realizzare.
Studiando queste due componenti ti sarà facile realizzare quello che desideri.
Slut et merci pour ce beau travail
j’aimerai savoir s’il est possible de commander un ou plusieurs moteurs sans utiliser la carte Arduino car pour mon projet je veux réaliser une carte de commande pour un petit drone a quatre moteurs. je pense a utiliser un microcontrôleur mais je coince sur l’ensemble et la façon de commander mes moteurs. toute aide sera la bienvenue. merci
Autore
Bonjour Stephane,
Je n’ai aucune expérience sur les drones.
Je sais seulement comment carte ardupilot des drones et est basé sur Arduino.
Ciao Mauro!
Grazie per la risposta. La cosa che ti chiedo é la seguente:
Se volessi aggiungere un’alimentazione esterna per il motore quali sono i contatti nei quali dovrei collegarla? Hai uno schema dove io possa vedere dove collego nel circuito la batteria? Non vorrei fare errori e bruciare l’arduino!
Grazie! Ciao!
Marco Rigamonti
Autore
Ciao Marco,
il chip che ho usato in questo tutorial ha un ingresso a parte per l’alimentazione esterna che io non ho mai usato perchè sono solo articoli dimostrativi con piccoli motori.
Puoi consultare il datasheet, che trovi on-line, per verificare quali siano e quali tensioni puoi applicargli.
Ciao complimenti per i tuoi tutorial sono davvero bellissimi! Io ho provato a rifare il tuo circuito utilizzano il chip L293D invece dell’SN754410NE e quando vado a premere un bottone sento un tic all’interno del motore però non si muove niente. Quale potrebbe essere il problema? Il motorino è uno di queli di un alzacristalli a 12V però alla breadboard gli passo 9 volt da un trasformatore e se gli passo la corrente in diretta il motorino gira però se passo dal circuito con i pulsanti non gira. Fammi sapere grazie mille
Autore
Ciao Alessio,
potrebbero essere molteplici le cause.
Inizia a verificare l’assorbimento del motore, che dubito sia di soli 2A, questo impedirebbe al motore di muoversi con tale driver; successivamente ricontrolla lo schema, quello presente in questo articolo funziona per l’SN754410NE e non per l’L293D.
Salve Mauro, da pochi mesi che combatto con Arduino, e le prime infarinature le ho avute da te. Sto mettendo assieme degli sketch, per far camminare una macchinina fuori uso. Ho creato un radiocomando formato da 2 joystick ed un trasmettitore a 433 Mhz. La macchinina è costituita dal suo motorino dc 12v collegato al modulo L298n (utilizzo solo due fili) ed un Micro Servo 9G ed ovviamente un arduino Nano. Posso dire che il tutto funziona, non perfettamente, ma funziona. Il problema che ti pongo è il seguente. Il motorino DC funziona ad una sola velocità (al max 255) e con valori differenti invece no. Io presumo di aver combinato un pasticcio nel listato, che non so come inviarti, Se vuoi aiutarmi mi spieghi comefare grazie Francesco
spero di fare bene a mandare il listato in questo modo e non occupare spazio…
[[ codice rimosso in automatico ]]
Autore
Ciao Francesco,
non è consentita la pubblicazione di sketch nei commenti, come hai letto nelle 2 semplici regole in fondo ad ogni articolo che leggi.
Autore
Ciao Francesco,
purtroppo non sono in grado di correggere listati senza testarli e per questo motivo evito di farlo.
Posso suggerirti di procedere per passi semplici:
– controlla che il motore possa funzionare con il collegamneto che hai fatto ed un PWM generato da un ciclo, puoi usare anche lo scketch fade degli esempi arduino
– verifica cosa accade nel codice, magari le informazioni che ricevi dal telecomando, e quindi passi al motore.
immaginavo, ma ho visto altri listati sopra e mi sono azzardato. nella compilazione del listato, ho proceduto un pezzettino la volta e mi spiego, ho provato il motorino, con un ciclo for facendolo andare dalla minima alla max velocità e funziona, avanti e indietro e va tranquillamente, al ricevitore arrivano i dati da 0 a 255 e viceversa, ma il motorino va solo alla max velocità. Io presumo che l’errore sia in una impostazione del listato stesso, ma dato che non puoi aiutarmi ti ringrazio comunque. Saluti
Autore
Ciao Francesco,
non ho mai scritto di non poterti aiutare, ma che non correggo il tuo sketch per ragioni di tempo e test necessari.
Stabilito che il motore funziona e che i dati arrivano dal ricevitore in modo corretto potresti farti scrivere sul monitor seriale il valore che passi al motore prima effettuare l’assegnazione con la analogWrite().
Ciao Mauro.. Usi un motore da 9v?
Autore
Ciao Luigi,
quello dell’articolo è un motore di recupero che dovrebbe funzionare a 3v.
Benissimo, ora avrei una domanda:
Ho un motore dc controllato da due pulsanti, il motore va in senso orario e si ferma dopo un tot di secondi, la stessa cosa per il senso antiorario. Il motore quando gira in senso orario tira una cordicella attesandola, dopo che il motore si spegne vorrei che si bloccasse in qualche modo per far si che rimanga ben tesa.
Cosa posso usare? Stavo pensando a un finecorsa di tipo encoder e un motoriduttore al posto del motore dc..
Autore
Ciao Luigi,
io scegliere un motoriduttore, tuttavia anche la soluzione con encoder potrebbe essere valida anche se più complessa.
Grazie dei preziosi consigli.. appena finisco il mio progetto lo pubblico qui se ti fa piacere.
Autore
Ciao Luigi,
sempre disponibile alla pubblicazione di progetti di appassionati come te 🙂
Ciao per curiosità mi stò avvicinando all’arduino e mi piace l’idea di pilotare dei motori.
La mia domanda forse è un pò fuori tema ma ho difficoltà non tanto sulla parte elettronica ma sulla parte meccanica, ovvero come faccio ad agganciare un motore anche piccolo come quello in foto ad esempio ad un asse ? Sapete se ci sono delle componentistiche meccaniche standard che possono aiutare a completare poi i propri progetti ?
Autore
Ciao Antonio,
per ogni motore esiste un ingranaggio/sistema di fissaggio di ingranaggi all’albero.
ciao,ti ringrazio per gli innumerevli tutorial….
io non avendo l’integrato ,ho provato ad usare la schedina L298N usando le uscite per l’integrato (pin 6 7) collegandoli all’ingresso in1 ed in2 ,fatalità in una bread board avevo gia montato dei led e li ho colllegati agli stessi pin per il controllo della schedina L298N
alla pressione del pulsante 1,il motore gira orario,lo rilascio,si ferma,permo l’altro pulsante,e gira nel verso opposto,ma non riesco a variare i giri tramite potenziometro,hai qualche idea ??
ho provato a cambiare ,uno ad uno,i vari pin analogici ma nulla,il motore gira sempre alla stessa velocità…a manetta…..
ciao e grazie mille
Autore
Ciao Teocreo,
se vuoi controllare la velocità del motore devi agire sul PWM e non su in1 ed in2
Ciao Mauro, mi servirebbe poter comandare un motore in entrambi i sensi ma con un pulsante solo..come posso fare? grazie in anticipo
Autore
Ciao Mattia,
penso si aver scritto tanti articoli sui motori che puoi prendere ad esempio.
In generale compreso come funziona un motore e come interagisce con il pulsante non dovresti aver difficoltà a modificare lo sketch come vuoi.
Si ho guardato già tutti i tuoi progetti!
Ma nello sketch non riesco a far capire ad arduino che ogni volta che premo il pulsante deve invertire il senso di marcia
Autore
Ciao Mattia,
tu hai compreso come farlo?
Quando è chiaro a te potrai scriverlo con un semplice if.
avevo pensato di risolverlo con un ciclo, cosicché alla seconda premuta del pulsante mi farebbe l’inversione, per poi azzerare e ricominciare. Altri non mi viene in mente ahahah 🙁
Autore
Ciao Mattia,
io non ho capito come vuoi ferlo, ma se è chiaro a te scrivilo e fallo eseguire ad arduino.
Buongiorno Mauro
spero tutto bene!
Tempo fa mi avevi aiutato a comporre un ide per un motore dc comandato da due interruttori che comandano sia il moto avanti ed indietro del motore sia contemporaneamente il play di due file audio installati su una memoria di una scheda audio lpm che ora si è rotta e purtroppo è fuori produzione. Dato che deve sentirsi l’audio devo trovare una soluzione :
– possiedo un paio di schede sd che potrei usare
-oppure una scheda audio SCHEDA VOCALE ISD1820 MODULO VOCE SUONO MUSICA SENSORE MICROFONO REC PER ARDUINO
Sarei più propenso ad utilizzare una scheda sd con sopra due file audio ma non saprei proprio come adottare il mio programmino (anzi il nostro ..visto che lo abbiamo fatto assieme…)
Per l’altra scheda che ho mi sembra di capire che con essa è gestibile un solo file….ma non sono sicuro.
Mi permetto di mandarti il programma che era perfettamente funzionate con la vecchia scheda ….ormai ko ed insostituibile
Ti ringrazio molto se troverai il tempo per suggerire una soluzione al mio problema.
Troverò il modo per sdebitarmi…
Grazie
eccolo:
[[ codice rimosso in automatico ]]
Autore
Ciao Giovanni,
premetto che purtroppo non ricordo cosa avessimo realizzato, ma non è un problema.
Ti ricordo che non è consentito, come hai letto in ogni articolo, incollare codice nei commenti e quest’ultimo viene rimosso in automatico.
Infine ho acquistato, ma ancora non provato, un modulo play mp3 collegabile e programmabile da Arduino o Genuino che spero di recensire presto e che potresti utilizzare adattandone il codice.
Scusami sono rimasto fermo ai tempi nei quali pubblicavamo il codice nei commenti…….perdonami
Autore
Nessun problema Giovanni.
ciao, ho montato il tutto ma mi manca un alimentatore da 9V da collegare ad arduino, se volessi collegare delle batterie direttamente alla breadboard come potrei fare?
Autore
Ciao Gianmarco,
che tipo di batterie possiedi?
Ciao Mauro
ho una scheda che permette con due interruttori na di cambiare direzione ad un piccolo motore dc per cambiare (velocità con un potenziometro) e direzione in un senso o nell’altro alla pressione dei due pulsanti.
Sono quelle sche che vendono già assemblate ! e me ne hanno regalate tre. Naturalmente vorrei usarle ma vorrei implementare sempre alla presione dei due pulsanti due suoni diversi memorizzati su una scheda estrna che ho già. Volevo chiederti, dato che la scheda è gia assemblata posso collegare in parallelo gli attuali na anche ad arduino per implementare altre funzioni alla pressione dei tasi. Non sono sicuro , temo possano nascere problemi duplicando le attuali connessioni della scheda per portarle ad arduino…e sviluppare altre funzioni!
mi dici cosa ne pensi? è fattibile secondo te senza farmi problemi?
Grazie del tuo aiuto!
Autore
Ciao Giovanni,
non conoscendo le schede evito di azzardare risposte, se sei sicuro dei collegamenti puoi fare un test.
Ciao Mauro , scusami certo non ti avevo mandato nessuna indicazione….pardon.
In realtà non ho molti dati
queste le note
Caratteristiche:
Regolatore di velocità reversibile per motore DC 6V 12V 24V.
Controlla la direzione in avanti o indietro.
Controllare il motore con l’interruttore a pulsante.
Buona fattura e prestazioni stabili.
specifiche tecniche:
Tensione di lavoro: DC 6V ~ 30V
Tensione di uscita: Caricare lineare
Corrente massima: 10A
CW / CCW: Supporto
Gamma di velocità: 0% ~ 100%
Frequenza: 15kHz
Principio di velocità: Regolamento attuale
Dimensione: 74 (L) x 47 (L) x 28 (H) mm / 2,91 x 1,85 x 1,10 pollici
[[ link rimosso da regolamento ]]
Non mi sembra il massimo tuttavia funziona egregiamente e a caval donato…..
vorrei tuttavia prendere i segnali dai due int. na e in parallelo controllarli anche da arduino per implementare un suono quando premuti aggiungere altre funzioni sempre con arduino inserire due finecorsa, e altro!
Ma non so se a livello di segnale è possibile (almento intercettare i due pulsanti e/o aggiungere (se possibile) due finecorsa. Ma non sono certo sia possibile.
Scusami è solo per questo che ti avevo chiesto un consiglio vista la tua esperienza e disponibilità! Secondo te è una prova da intraprendere oppure è meglio lasciar perdere e lasciare la scheda cosi come è ?
Grazie e a presto!
Gianni
Autore
Ciao Gianni,
in primo luogo ti chiedo di rispettare il regolamento che trovi sul blog ed il cui link è presente all’inizio della sezione commenti.
In merito alla scheda è davvero misera spiegazione quella che ti hanno fornito e non resta che sperimentare, magari controlla con un tester i livelli di segnale sugli int per essere certo che non arrivi ad arduino una tensione superiore a quella che può supportare.
Grazie molte! scusami per il link l’ho indicato senza pensarci!
Il segnale lo controllo con il tester, grazie! il livello per non fare danni ad arduino deve essere inferiore ad un voltaggio di 5 volt ?
Grazie ancora e scusami!
Autore
Ciao Gianni,
si sull’Arduino Uno è 5v il livello massimo sui pin I/O