Modifiche varie Progetto 09 Girandola motorizzata Arduino UNO StarterKit

Salve a tutti mi chiamo Stefano ho 28 anni, sono nuovissimo e di conseguenza molto ignorante (speriamo per il momento :D) su questo nuovo giocattolino..

Il motivo per cui ricorro al vostro aiuto dopo svariate prove e ricerche sul web di esito negativo è su come poter piazzare un banalissimo per voi potenziometro ad un ingresso analogico, ed usarlo come modulatore di larghezza di impulso (PWM) del piedino che mi controlla il transistor Mosfet che mi comanda il motorino, come da "consigli prove" che riporta in fondo al progetto 09 il libro dei progetti di Arduino. Non sto a riportare tutte le prove che ho fatto anche perché non me le ricordo, chiedo semplicemente se qualcuno addirittura ha già riportato questa piccola guida in qualche posto a me non raggiungibile e nascosto.
Grazie anticipatamente cicchettatemi pure se sbaglio qualcosa. Ciao Ciao

Ciao,
se dai un occhiata QUI, ed in particolare alla scheda No. 1 per il potenziometro ed alla scheda No. 5 per il collegamento del motore, probabilmente troverai quello che cerchi. Le schede sono scaricabili in alta risoluzione seguendo il link che è in alto ad ogni gruppo di schede :wink:

Guglielmo

P.S. : ... normalmente, al primo post, ci si presenta nell'apposita sezione ... e ... dai una letta al regolamento QUI :wink:

Salve gpb01 ! e piacere di conoscerla! Mi scusi e scusatemi se ho infranto la regola base di tutti i forum (la presentazione), comunque mi sono appena presentato e il regolamento lo avevo già letto prima di postare la domanda ;).
Vedere che mi rispondete in maniera veloce mi da lo stimolo di continuare ad infognarmi sempre di più in queste cose.

Ho visto le schede che mi ha gentilmente postato e devo dire che come dal manuale contenuto nello starterkit le parti fisiche che mi sono sperimentato fino al progetto preso in questione le so collegare. Il problema sorge sul come collegarle e sul come modificare il programma, perciò chiedevo se qualcuno aveva già provato a fare tutto ciò. Potrei anche mettermi con calma a disegnare lo schema e copiare il programma che ho tentato di fare, però aspettatevi uno sfondone da parte mia vergognoso su ambedue le cose, e più che altro questa sezione è solo per l'hw, posso caricare tutto su questo post? Grazie mille anticipatamente.

Ciao Stefano e ... per carità ... dammi del tu ... XD

Mmm ... si, direi che per capirci e "parlare la stessa lingua" sarebbe bene che postassi lo schema di collegamento che hai fatto ed anche il programma.

Mi raccomando, il codice del programma racchiudilo tra i tag CODE (il bottone # quando sei in edit) così non viene alterato e non occupa una infinità di spazio.

Così si può dare un occhiata all'insieme ... :wink:

Guglielmo

P.S. : e naturalemnte ... benvenuto !!!

Al momento il sito di Pighixxx è sospeso per superamento della banda mensile.
Speriamo intervenga presto altrimenti bisognerà aspettare il primo novembre che scatta il nuovo mese e quindi un nuovo conteggio.

Comunque senza molti giri, il potenziometro lo colleghi così:


Un pin a GND, il pin centrale all'ingresso analogico, l'ultimo a 5V.
Essendo una resistenza variabile non hai bisogno di mettere altre resistenze tra il potenziometro e i pin.

Da codice leggi l'ingresso con la funzione analogRead(...) e con la funzione map() imposti l'uscita del pwm che andrai a utilizzare con la funzione analogWrite(...).

Allora allora... grazie mille anche a lei PaoloP, iniziando da capo ho fatto questo:

const int potPin = A0; 
const int motorPin =  9; 

int potVal;  

void setup() {
  pinMode(motorPin, OUTPUT);      
  pinMode(potPin, INPUT);     
}

void loop(){
  potVal=analogRead(potPin);
  map(potVal,0,1023,0,1023);
  analogWrite(motorPin, potVal);
}

e lo schema è questo:

Il tutto "funziona" tranne che molto probabilmente ho fatto un'errore nel map perché aumentando il trimmer mi fa 4 step 0-max.. o boh...(sono duro dite la verità) :astonished:

Nel caso qualche santo mi risolve il problema del trimmer sopra elencato, il mio problema principale è di inserire ciò in questo, cioè il pulsante mi fa partire il motore ma con i giri che mi dovrebbe legge dal trimmer.

Programma da modificare:

const int switchPin = 2; // the number of the switch pin
const int motorPin =  9; // the number of the motor pin

int switchState = 0;  // variable for reading the switch's status

void setup() {
  // initialize the motor pin as an output:
  pinMode(motorPin, OUTPUT);      
  // initialize the switch pin as an input:
  pinMode(switchPin, INPUT);     
}

void loop(){
  // read the state of the switch value:
  switchState = digitalRead(switchPin);

  // check if the switch is pressed.
  if (switchState == HIGH) {     
    // turn motor on:    
    digitalWrite(motorPin, HIGH);  
  } 
  else {
    // turn motor off:
    digitalWrite(motorPin, LOW); 
  }
}

Ho postato correttamente? Saluti e grazie di nuovo. Stefano

Stefano, allora, la map() la devi usare per rimappare il valore da 0 a 1023 in un valore accettabile dall' analogWrite cioè da 0 a 255 e non da 0 a 1023 di nuovo ! Inoltre questa ti ritorna un valore che è quello che devi usare Quindi :

potVal = map(potVal, 0, 1023, 0, 255);

... e intanto risolvi questo, poi passiamo al bottone :wink:

Guglielmo

Grazie Guglielmo da buon smanettone avevo già provato a cambiare l'ultimo valore non proprio in 255 ma avevo provato. Comunque adesso anche se è 255 mi fa la stessa cosa, aumentando il trimm mi fa 4 volte 0-max in maniera dolce/lineare, diminuendo il trimm mi fa l'inverso ma in maniera scattosa.

Guarda questa lezione --> Arduino – lezione 03: controlliamo un led con un pulsante | Michele Maffucci
al posto dei comandi per i led dovrai mettere analogWrite(motorPin, potVal); quando lo accendi e analogWrite(motorPin, 0); quando lo vuoi spegnere.

celestefano:
Grazie Guglielmo da buon smanettone avevo già provato a cambiare l'ultimo valore non proprio in 255 ma avevo provato. Comunque adesso anche se è 255 mi fa la stessa cosa, aumentando il trimm mi fa 4 volte 0-max in maniera dolce/lineare, diminuendo il trimm mi fa l'inverso ma in maniera scattosa.

Mmm ... cortesemente posti il nuovo codice ... perché mi sembra strano ... :roll_eyes:

Guglielmo

Eccolo!

const int potPin = A0; 
const int motorPin =  9; 

int potVal;  

void setup() {
  pinMode(motorPin, OUTPUT);      
  pinMode(potPin, INPUT);     
}

void loop(){
  potVal=analogRead(potPin);
  map(potVal,0,1023,0,255);
  analogWrite(motorPin, potVal);
}

Appunto, come sospettavo ... NON hai letto con attenzione quello che ti ho scritto al post precedente eh ? ]:smiley:

La sintassi della map è

nuovoValore = map(valoreDiPartenza, minInizio, maxInizio, minFine, maxFine)

... e tu il valore convertito NON lo stai usando, per cui continui a passare alla analogWrite un valore che va da 0 a 1023.

Cambia in :

potVal = map(potVal, 0, 1023, 0, 255);

e vedrai che il problema scompare :slight_smile:

Guglielmo

Approfondendo, map è una funzione, e come le funzioni matematiche essa restituisce un valore. Se tale valore restituito non lo memorizzi da qualche parte (leggi: variabile), lo perdi. Non è che il programma si "ricorda" di questo numero.

Nel tuo codice tu scrivi:

map(potVal,0,1023,0,255);

La map viene eseguita ma il risultato che da viene perso perché non viene salvato.
Volendo non usare una variabile temporanea, puoi usare map direttamente dentro all'analogWrite:

analogWrite(motorPin, map(potVal,0,1023,0,255));

In questo modo il valore restituito da map diventa il secondo parametro del comando analogWrite.

gpb01:
Appunto, come sospettavo ... NON hai letto con attenzione quello che ti ho scritto al post precedente eh ? ]:smiley:

La sintassi della map è

nuovoValore = map(valoreDiPartenza, minInizio, maxInizio, minFine, maxFine)

... e tu il valore convertito NON lo stai usando, per cui continui a passare alla analogWrite un valore che va da 0 a 1023.

Cambia in :

potVal = map(potVal, 0, 1023, 0, 255);

e vedrai che il problema scompare :slight_smile:

Guglielmo

E' vero cavolo, e pensa che l'ho letto almeno 3-4 volte, molto probabilmente ero un po cotto.

Ok leo72! grazie mille e piacere di conoscerla. Buon giorno a tutti.

celestefano:
...
Nel caso qualche santo mi risolve il problema del trimmer sopra elencato, il mio problema principale è di inserire ciò in questo, cioè il pulsante mi fa partire il motore ma con i giri che mi dovrebbe legge dal trimmer.
...

Ok, ora che hai capito come leggere il valore dal potenziometro e applicarlo alla velocità del motore ... applica la stessa tecnica nel codice con il pulsante.

Quando è premuto, leggi il potenziometro e regoli la velocità. Quando è rilasciato, semplicemente metti la velocità a 0 e fermi il motore ...

E' questo che vuoi fare giusto ?

Guglielmo

celestefano:
Ok leo72! grazie mille e piacere di conoscerla. Buon giorno a tutti.

"Conoscerla"? Dammi del tu, per piacere. Sui forum è d'uso parlarsi confidenzialmente :wink:

Si , appena torno a casa all'ora di pranzo mi ci metto subito. Grazie per ora, e se mi ci rincricco vi faccio sapere!

Salve a tutti! Grazie a voi mi sento molto realizzato (qualcuno dirà che mi accontento di poco ma per me ogni cosa riuscita è sempre un traguardo) 8)
Caro Guglielmo sono riuscito addirittura a fare questo:

const int switchPin = 2; 
const int motorPin =  9; 
const int potPin = A0; 

int switchState = 0;  
int potVal; 

void setup() {
  
  pinMode(motorPin, OUTPUT);      
  
  pinMode(switchPin, INPUT);  
 
  pinMode(potPin, INPUT);   
}

void loop(){
  
  
  switchState = digitalRead(switchPin);

 
  if (switchState == HIGH) {     
    digitalRead(potPin);
analogWrite(motorPin, potVal);    
    potVal=analogRead(potPin);
  potVal=map(potVal,0,1023,0,255);
  
  } 
  else {
    
    digitalWrite(motorPin, LOW);    
  }
}

ma ora sto ammattendo per capire come programmare il bottone in modo che mi funzioni come interruttore acceso alla prima pressione e spento alla seconda.. la mia curiosità mi sta portando ad andare troppo velocemente avanti? Se così fosse ditemelo pure che passo al prossimo progetto del librino e per un po almeno non vi rompo.. Grazie anticipatamente. Stefano

celestefano:
...
ma ora sto ammattendo per capire come programmare il bottone in modo che mi funzioni come interruttore acceso alla prima pressione e spento alla seconda.. la mia curiosità mi sta portando ad andare troppo velocemente avanti? Se così fosse ditemelo pure che passo al prossimo progetto del librino e per un po almeno non vi rompo.. Grazie anticipatamente. Stefano

No, no, tranquillo, con un po' d'applicazione e ragionandoci, vedrai che ci riesci senza problemi.

Allora, suddividi la cosa in due parti ...

  1. una prima parte che fa una lettura, affidabile (... quindi, questa volta, obbligatoriamente con debouncing), del bottone e riconosce esattamente quando lo premi.

  2. una seconda che, in funzione di una variabile che alternativamente metterai a LOW/HIGH nel punto 1., quando ti accorgerai della pressione del bottone, fa girare o meno il motore.

Ti dico che il debouncing qui è obbligatorio perché, altrimenti, ad ogni pressione, seguita dai rimbalzi che ogni pulsante meccanico ha, tu ti ritrovi come se avessi premuto e lasciato più volte il bottone e quindi, la logica FLIP/FLOP che andiamo ad implementare, ... se ne va a donnine di facili costumi ... :wink:

Prova a lavorarci ... :slight_smile:

Guglielmo

Buona domenica a tutti... dopo giorni di ricerche e approfondimenti :sweat_smile: sono riuscito a inserire la funzione debounce sul pulsante on/off in questa maniera:

const int buttonPin = 2;    
const int motorPin = 9;     
const int potPin = A0;


int motorState = LOW;         
int buttonState = 0;             
int lastButtonState = LOW;   
int potVal;


long lastDebounceTime = 0;  
long debounceDelay = 50;   

void setup() {
  pinMode(buttonPin, INPUT);
  pinMode(motorPin, OUTPUT);
  pinMode(potPin, INPUT);   
  
  digitalWrite(motorPin, motorState);
}

void loop() {
  
  
  int reading = digitalRead(buttonPin);
 
  

  if (reading != lastButtonState) {
    
    lastDebounceTime = millis();
  } 
  
  if ((millis() - lastDebounceTime) > debounceDelay) {
    
    if (reading != buttonState) {
      buttonState = reading;

      
      if (buttonState == HIGH) {
        motorState = !motorState;
      }
      
    }
  }
  
  
  digitalWrite(motorPin, motorState);
  

 
  lastButtonState = reading;
}

l'unica cosa che non sono riuscito a fare anche dopo svariate prove è ad inserirci le lettura del potenziometro :

if (switchState == HIGH) {     
    digitalRead(potPin);
analogWrite(motorPin, potVal);    
    potVal=analogRead(potPin);
  potVal=map(potVal,0,1023,0,255);

.. è l'ultima prova che volevo fare su questo progetto prima di passare al successivo, e non so più dove sbattere la testa.. Saluti Stefano