Pages: 1 2 3 [4] 5   Go Down
Author Topic: Motori con arduino!!!  (Read 5542 times)
0 Members and 1 Guest are viewing this topic.
Global Moderator
Italy
Offline Offline
Brattain Member
*****
Karma: 327
Posts: 22651
Logic is my way
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Questo può esserti d'aiuto?
http://itp.nyu.edu/physcomp/Labs/DCMotorControl
Logged


Offline Offline
Newbie
*
Karma: 0
Posts: 25
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

non so se hai letto i post di prima comunque io ce lho fatta a far partire il motore con il ponte h, il problema è che non riesco a programmarlo cioe spegnerlo o accenderlo quando voglio io... piu o meno quello che cera nella tua guida cera anche nella guida sul sito di arduino comunque grazie per la segnalazione... Anzi controllando meglio sono proprio identici probabilmente un sito ha copiato dall altro smiley-grin
Logged

Offline Offline
Newbie
*
Karma: 0
Posts: 25
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Non ce nessuno che mi possa aiutare... So che non è una cosa difficile per molti di voi... so anche che è difficile che mi aiutate senza averlo davanti pero dai aiutatemi  :smiley-roll-blue:a
Logged

Offline Offline
Newbie
*
Karma: 0
Posts: 25
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Non ce proprio nessuno che mi puo aiutare... è da tre giorni che mi sto scervellando  smiley-cry
Logged

0
Offline Offline
Shannon Member
****
Karma: 130
Posts: 10466
:(){:|:&};:
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

allora, se riesci ad accenderlo e spegnerlo col ponte H, dovrebbe accendersi anche se colleghi direttamente il + e il - alla batteria giusto?
a questo punto, basta capire a cosa serve il 3 cavetto più sottile. Con un voltmetro prova a misurare la su tensione, se vedi sempre  allora prova a vedere con arduino se invia un impulso ogni tanto (giri del motore), se ancora sesta semrpe a 0 (o a 1), prova a collegarlo una una resistenza più grande che hai (direi non più di 10k?) a gnd o vcc (lo stato contrario a quello del pin) e vedi cosa succede.
Logged

sei nuovo? non sai da dove partire? leggi qui: http://playground.arduino.cc/Italiano/Newbie

Offline Offline
Newbie
*
Karma: 0
Posts: 25
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Allora: se attacco la batteria al motore, questultimo parte... da li in poi non ho capito un emerita minchia comunque vedro di fare in un altro modo oppure mi compro un motore passo passo da qualche parte, cosi sono sicuro di non fare casini...

Mi sapreste cosigliare un sito on line su cui comprare motori passo passo (a basso costo) per i miei esperimenti???

Grazie in anticipo smiley-grin
Logged

Offline Offline
Newbie
*
Karma: 0
Posts: 7
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Ciao a tutti sono nuovo di Arduino e sto remando su un problema ...
Ho realizzato un circuito trovato su rete per pilotare un motorino in continua con un deviatore per il cambio direzione ed un pot. per variare la velocità il codice è questo :

// Uso L293 con potenziometro e cambio moto avanti-retro 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 selettore
int buttonState2 = 0;         
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);     

}
void loop()
{
  buttonState1 = digitalRead(buttonPin1);               // Rileva stato selettore
  buttonState2 = digitalRead(buttonPin2);
  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 selettore
  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 {
    // accendo LED indietro:   
    // spengo LED avanti:   
    // cambio direzione motore
    digitalWrite(ledPin1, LOW);
    digitalWrite(ledPin2, HIGH); 
    digitalWrite(in1Pin,LOW);
    digitalWrite(in2Pin,HIGH);

  }
}

Quando arduino esegue il motore gira,  cambia velocità con pot ma se premo (ho sostituito il selettore con due interruttori NA) cambia la direzione ma non ho il controllo.
Il motore alla partenza è sempre attivo e riesco a comandare la direzione solo con un interruttore off avanti on indietro l'altro int. è come non ci fosse. Ho controllato più volte ma evidentemente sbaglio qualcosa che non riesco a capire...
Allego schema originare reperito in rete.

Vi prego di aiutarmi a risolvere questo inconveniente é il software che non è perfettamente corretto o qualcosa nei collegamenti ?


Grazie infinite a tutti
Allego schema
Gianni


* download.jpg (357.83 KB, 1218x951 - viewed 43 times.)
Logged

0
Offline Offline
Shannon Member
****
Karma: 130
Posts: 10466
:(){:|:&};:
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

usa i tag code, se no è illeggibile, sono il simbolino # sopra le facine, oppure a mano sono
Code:
[code]
[/code]

comunque il vedo il codice per gestire un pulsante e basta. Tra l'altro non ho capito nemmano che dovrebbe fare
Logged

sei nuovo? non sai da dove partire? leggi qui: http://playground.arduino.cc/Italiano/Newbie

Offline Offline
Newbie
*
Karma: 0
Posts: 7
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Code:
// Uso L293 con potenziometro e cambio moto avanti-retro 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 selettore
int buttonState2 = 0;         
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);     

}
void loop()
{
  buttonState1 = digitalRead(buttonPin1);               // Rileva stato selettore
  buttonState2 = digitalRead(buttonPin2);
  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 selettore
  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 {
    // accendo LED indietro:   
    // spengo LED avanti:   
    // cambio direzione motore
    digitalWrite(ledPin1, LOW);
    digitalWrite(ledPin2, HIGH); 
    digitalWrite(in1Pin,LOW);
    digitalWrite(in2Pin,HIGH);

  }
}

Ecco il codice spero di aver inserito i tag correttamente...sono un po imbranato!

Cercherò di spiegarmi per l'utilizzo che vorrei fare del circuito :

Usando due interruttori (na) vorrei pilotare il motore (che è collegato ad un meccanismo che trasforma il moto da rotatorio a lineare)
per comandare attraverso la pressione dei due interruttori l'avanzamento del mot su e giù.
Quindi in sostanza dovrei ottenere :
- alla partenza del programma il motore deve essere "spento" poi agendo sugli interruttori dovrei far salire e scendere il motore collegato al meccanismo lineare (il carico da far salire scendere è ridicolo ed il dimensionamento del motore è più che sufficiente.
- dallo schema dal quale sono partito ho tentato di implementare l'uso di due interruttori ma non sono riuscito a raggiungere lo scopo (essendo un novizio che vorrebbe formarsi...)

A, dimenticavo il motore dovrebbe azionarsi fino a quando tengo premuto l'interruttore e poi fermarsi...(questo dovrebbe valere per entrambe le direzioni ed entrambi gli interruttori) . Se riesco ad ottenere questo risultato vorrei poi installare due finecorsa per l'inizio e la fine della corsa utile (ma questo è ancora prematuro..)
Spero di essermi spiegato. Ecco non riesco a capire come implementare tutto questo partendo dallo schema che ho allegato nel post iniziale adeguando opportunamente il codice...

Se esiste anche un'altra ipotesi per ottenere lo stesso risultato ti prego di indicarmela!

Ti ringrazio infinitamente per l'aiuto molto apprezzato !!!


* download.jpg (357.83 KB, 1218x951 - viewed 11 times.)
Logged

0
Offline Offline
Shannon Member
****
Karma: 130
Posts: 10466
:(){:|:&};:
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

allora tu dici che:
Code:
if (buttonState1 == HIGH) {
se il pulsante1 è premunto muovi il motore in una direzione
Quote
else
altrimenti muovi il motore nell'altra direzione.

bene, direi che bisogna lavorare proprio su questi else mettendo la condizioneesattamente come sopra ma riguardante il bottone 2. dovrai dire che se è premuto, muovi il motore nell'altra direzione, altrimenti spegni il motore, andado a sovrascrivere il valore del potenziometro con un bel 0. ovviemente la analogWrite, che serve per dare la velocità al motore, andrà fatta DOPO aver fatto questi controlli, altrimenti avresti dei micro salti del motore, magari meccanicamente non avvengono perchè l'accensione e lo spegnimento son velocissimi, parliamo di microsecondi se non nanosecondi, però di certo non fanno bene all'integrato che pilota il motore
Logged

sei nuovo? non sai da dove partire? leggi qui: http://playground.arduino.cc/Italiano/Newbie

Offline Offline
Newbie
*
Karma: 0
Posts: 7
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Ciao ho provato a fare le modifiche che mi hai suggerito(a modo mio perchè non ho mai programmato in c e dovrò imparare).
Ti invio il cod, mi guardi per cortesia se ok o potevo , come penso, far di meglio ?
Cosi comunque tutto sembra funzionare come volevo!
GRAZIE infinite per la tua notevole cortesia e competenza!

Code:
// 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]
}

Proverò con i fine corsa e ti faro sapere se avrò bisogno di aiuto

Grazie
Gianni
Logged

0
Offline Offline
Shannon Member
****
Karma: 130
Posts: 10466
:(){:|:&};:
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

ok, il codice così va bene, tranne per il fatto che fai due volte

analogWrite(motorPin, mapedPotVal);

all'interno del codice;

fallo solo una volta a fine loop() e sei a posto. Per migliorare puoi fare ben poco, a parte ricreare una macchina a stati finiti (avanti, indietro e ferma nel tuo caso): http://www.swappa.it/wiki/Uni/LPSFSM
Logged

sei nuovo? non sai da dove partire? leggi qui: http://playground.arduino.cc/Italiano/Newbie

Offline Offline
Newbie
*
Karma: 0
Posts: 7
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Decisamente interessante il link. Mi prometto di analizzarlo con la dovuta tranquillità.
Un ultima cosa cosa intendi per (nel mio caso ) macchina ferma ?
Secondo i concetti di macchina a stati finiti dovrei gestire la opzione "ferma" ma in che modo concreto.
Nel mio esempio dopo i tuoi suggerimenti la "maccchina" si può definire ferma perchè rimane in attesa (motore fermo) fino a quando non premo un bottone (avanti o indietro), tuttavia nella realtà intendi dire che lo stato di fermo si potrebbe gestire ricreandola in altro modo o ho capito male il concetto? Non vorrei banalizzare ma lo stato di fermo (apparente) della macchina (il mio progettino) dal punto di vista dei componenti elettronici potrebbe non essere efficace ? (con tutte le precauzioni del caso: scheda pilota per motori dc ad hoc e sovradimensionata, sistemi di sicurezza come fusibili, fine corsa, controllo temperatura ed eventuali altri monitoraggi ...ect).
Ti chiedo questo perchè normalmente la (mia) macchina sarebbe in fase di standby (come avviene già adesso nel prototipo, in attesa che qualcuno decida di agire sui pulsanti....
Non mi è molto chiaro anche come potrebbe via sw essere gestito il fermo "assoluto".
Ma probabilmente non ho inteso bene e mi riprometterò di analizzare con attenzione il link che mi hai postato!
Grazie ancora
Logged

0
Offline Offline
Shannon Member
****
Karma: 130
Posts: 10466
:(){:|:&};:
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

la macchina a stati è un sistema di programmazione. Invece che agire sui digitalWrite direttamente, crei una struttura in modo tale che tu agisci su una variabile apposista (detta stato), e gli scrivi dei valori che vogliono dire avanti, indietro, ferma. poi ad ogni fine loop il codice analizza lo stato e prende le decisioni sul motore.
Il sistema è comodo perchè dividi la logica delle operazioni che vuoi fare tu dalla logica del motore, ma onestamente in questo caso è una complicazione inutile
Logged

sei nuovo? non sai da dove partire? leggi qui: http://playground.arduino.cc/Italiano/Newbie

Offline Offline
Newbie
*
Karma: 0
Posts: 7
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Ho capito...
cercherò di approfondire.
Molte grazie
Logged

Pages: 1 2 3 [4] 5   Go Up
Jump to: