Assemblaggio automobilina BT 4WD

Ben ritrovati,
per puro scopo ricreativo, ma che diverrà un regalo x mio nipote, sto assemblando la classica automobilina 4x4 con lo chassis a 4 motori . Quelli che si trovano su eBay. L'intendo è quello di pilotarla in manuale, quindi no radar ultrasuoni, ma da app via bluetooth. Ho due dubbi iniziali:

  • i 4 motori hanno una polarità specifica di alimentazione? Sulla documentazione e a bordo dei motori non vi è nulla ...O mi aggiusto via sw?

  • per alimentare i 4 motori che pilotero' tramite un solo L298N + un Arduino pro mini + il modulo BT HC-O5 e qualche led, stavo pensando ad un unica fonte di alimentazione, ovvero un pacco batteria li-on da 12V/ 3000mAH. Può andare bene? O devo cambiare metodo?Ho letto pareri circa la suddivisione dell'alimentazione. Qual'è il metodo migliore?

Grazie

droidprova:
i 4 motori hanno una polarità specifica di alimentazione? Sulla documentazione e a bordo dei motori non vi è nulla ...O mi aggiusto via sw?

I motori DC non hanno una vera e propria polarità, salvo casi molto particolari di motori progettati per girare sempre in un solo verso, l'eventuale polarità indicata serve solo per indicare il vero di rotazione quando si collega l'alimentazione, tieni presene che per invertire il verso di rotazione di un motore DC si inverte la polarità ai suoi capi.

  • per alimentare i 4 motori che pilotero' tramite un solo L298N

Con un solo L298 comandi due motori, max 2A di picco per motore, oppure un singolo motore da 4A max se lo colleghi in parallelo, per quattro motori servono due L298, in tutti i casi tocca vedere di quali motori si tratta perché non è detto che il 298 sia sufficiente.
Come alimentazione una singola batteria può andare a patto che filtri bene il 5V per Arduino, soluzione ideale è usare uno switching step down che abbassa da 12V a 7V e alimenti Arduino dal pin Vin, ovvero passi attraverso il suo regolatore di tensione.

Ok, chiaro. L'unico dato sui motori che ho è che sono alimentabili da 3 a 12V.

Questa è ll macchinina di cui parlo: http://www.ebay.it/itm/4WD-Robot-Smart-Car-Chassis-Kit-DC-Gear-Motor-Wheels-Per-Arduino-/141939685102?hash=item210c43b6ee:g:2ykAAOSwUuFWzbyc

Grazie

Con quei motoriduttori gli L298 vanno bene.

Cioè un solo L298N x 4 motorini?

No, servono due L298, ogni motore deve essere controllabile singolarmente.

Anche se la sterzata va effettuata per lato, quindi entrambi i motori del lato interessato funzionerebbero all'unisono.

Grazie

Leggendo in giro ho appreso che i motoriduttori montati sulla macchinina in esame, assorbono tra i 100 e 200 mA, per cui abbondantemente sotto i limiti del L298N. Ho fatto delle prove, ho montato due motoriduttori in parallelo per uscita al L298N. Ha funzionato tutto bene, quindi con 4 motoriduttori si può usare un solo L298N.

Ho una domanda: per alimentare Arduino il modulo switching Step down, deve essere quello basato sull'integrato L317?
Grazie

Il punto della questione non è la corrente, è che per manovrare in modo decente un rover di quel tipo, senza ruote sterzanti, serve il controllo indipendente dei 4 motori, questo perché devi emulare il differenziale meccanico presente su i veicoli.
Esiste una vasta letteratura su come controllare un rover a 4 ruote motrici, senza sterzo, con tutte le relative formule per determinare la velocità di rotazione degli assi in funzione delle manovre da fare.

Capisco astrobeed, dovrò approfondire l'argomento, per capire specialmente se il controllo singolo di ogni motore poi in effetti mi da un risultato nettamente migliore rispetto a quello discreto che ottengo già. Vorrei farci giocare un bimbo di 6 anni...

Cablando a coppie i motori, le sterzate le ottengo così:

// sinistra

    else if (state == 'S') {
      analogWrite(motorA1, 200);   
      analogWrite(motorA2, 0); 
      analogWrite(motorB1, 0); 
      analogWrite(motorB2, 200); 
    }

// destra

    else if (state == 'D') {
      analogWrite(motorA1, 0);   
      analogWrite(motorA2, 200); 
      analogWrite(motorB1, 200);   
      analogWrite(motorB2, 0);     
    }

Per lo step down cosa può dirmi invece?

Grazie

Se lo scopo è solo fare una specie di macchinina radiocomandata per far giocare il "ragazzino" va bene anche usare un singolo L298, collega ad ogni ponte due motori, in parallelo, dello stesso lato, quindi i due del lato SX su un ponte del 298, quello del lato DX sull'altro ponte, in questo modo simuli una guida in stile cingolato.

Perfetto grazie! Per il modulo switching step down, avrei identificato questo:

https://it.aliexpress.com/item/1PCS-LM317-DC-Linear-Regulator-DC-DC-4-5-40V-Turn-1-2-37V-Step-Down/32677515626.html?spm=2114.13010308.0.0.EpEhqF

che dici lo prendo?

Grazie

Non è uno switching, è un regolatore lineare con tensione regolabile, visto il prezzo, decisamente troppo basso, sicuramente è spazzatura. :slight_smile:
Se ti serve il ponte L298, pronto all'uso, e lo switching li ho io nel cassetto, eventualmente mandami un pm che ci mettiamo d'accordo.

Qualcuno conosce dove acquistare a poco una sorta di connoncino da montare sulla macchinina, mio nipote ha avanzato una richiesta :slight_smile: Deve abbattere i deserpticons mi ha detto

Grazie!

Ragazzi ho bisogno di una dritta:

quando invio via BT da smartphone la lettera F, pigiando su un pulsante sull'app, grazie al millis() faccio lampeggiare le luci d'emergenza:

else if (state == 'F') {

    tempo = millis();

    if (tempo > lampeggio_tempo + 1000)
    {
      digitalWrite(frecce, HIGH);
    }
    if (tempo > lampeggio_tempo + 2000)
    {
      digitalWrite(frecce, LOW);
      lampeggio_tempo = millis();
    }
  }

ed effettivamente le luci lampeggiano ad oltranza.

Ora come faccio, pigiando una seconda volta sullo stesso pulsante che invierà sempre la stessa lettera a far spegnere le luci?

Grazie

dal poco codice che hai postato mi sembra di capire che come arriva un altro comando le luci smettono di lampeggiare, infatti se "state" contiene l'ultimo comando ricevuto fa lampeggiare il led finché è "F", il problema è che quando ricevi un altro comando se il led era acceso rimane acceso, se era spento in rimane spento...

No invece quando mando altri comandi il lampeggio continua. E da questo punto di vista mi va bene, ho usato il millis proprio per non bloccare mai il programma.

In merito al lampeggio, io ho il problema contrario, vorrei farlo smettere a comando, ma sempre utilizzando lo stesso pulsante dall'app che invia sempre la stessa lettera.

1° pressione-> parte il lampeggio - 2° pressione -> il lampeggio si ferma

Ciao e buona domenica a tutti!

dovresti mettere tutto il listato del programma, mi sa di aver capito male come usi la variabile "state" :slight_smile:

Questo è il loop:

void loop() {

  if (Serial.available() > 0) {
    state = Serial.read();
  }


  /***********************Avanti****************************/
  if (state == 'A') {
    analogWrite(motorA1, vSpeed);
    analogWrite(motorA2, 0);
    analogWrite(motorB1, vSpeed);
    analogWrite(motorB2, 0);
    digitalWrite(ledPost, LOW);
  }
  /***********************Dietro****************************/
  else if (state == 'I') {
    analogWrite(motorA1, 0);
    analogWrite(motorA2, vSpeed);
    analogWrite(motorB1, 0);
    analogWrite(motorB2, vSpeed);
    digitalWrite(ledPost, LOW);
  }
  /***************************Sinistra*****************************/
  else if (state == 'S') {
    analogWrite(motorA1, 200);
    analogWrite(motorA2, 0);
    analogWrite(motorB1, 0);
    analogWrite(motorB2, 200);
    digitalWrite(ledPost, LOW);
  }
  /***************************Destra*****************************/
  else if (state == 'D') {
    analogWrite(motorA1, 0);
    analogWrite(motorA2, 200);
    analogWrite(motorB1, 200);
    analogWrite(motorB2, 0);
    digitalWrite(ledPost, LOW);
  }
  /************************Luci Anteriori*****************************/
  else if (state == 'B') {
    if (i == 0) {
      digitalWrite(ledAnt, HIGH);
      i = 1;
    }
    else if (i == 1) {
      digitalWrite(ledAnt, LOW);
      i = 0;
    }
    state = 'n';
  }
  /************************Luci Posteriori*****************************/
  else if (state == 'E') {
    if (i == 0) {
      digitalWrite(ledPost, HIGH);
      i = 1;
    }
    else if (i == 1) {
      digitalWrite(ledPost, LOW);
      i = 0;
    }
    state = 'n';
  }
  /************************Luci di Emergenza*****************************/
  else if (state == 'F') {

    tempo = millis();

    if (tempo > lampeggio_tempo + 1000)
    {
      digitalWrite(frecce, HIGH);
    }
    if (tempo > lampeggio_tempo + 2000)
    {
      digitalWrite(frecce, LOW);
      lampeggio_tempo = millis();
    }
  }

  /**********************Clacson***************************/
  else if (state == 'C') {

    tone(buzzer, 1000);//Speaker on
    delay(200);
    noTone(buzzer);    //Speaker off
    delay(200);
    tone(buzzer, 1000);//Speaker on
    delay(200);
    noTone(buzzer);    //Speaker off

    state = 'n';
  }
  /************************Stop*****************************/
  else if (state == 'P') {
    analogWrite(motorA1, 0);
    analogWrite(motorA2, 0);
    analogWrite(motorB1, 0);
    analogWrite(motorB2, 0);
    digitalWrite(ledPost, HIGH);
    noTone(buzzer);
  }
}

Ripeto il codice gira bene, tutti i comandi state che partono dall'app generano esattamente quello che deve avvenire. Solo nel caso F, quello delle luci d'emergenza, vorrei che alla prima pressione le luci comincino a lampeggiare e alla seconda che si spengano.

Grazie

allora ho capito (spero :o ) intanto invece di tutti quei else if userei meglio i comandi switch e case poi fai una cosa del tipo:

ti crei una variabile booleana

come entri nella routine di F azzeri la variabile "state" e inverti lo stato della variabile booleana con "boolean = !boolean" poi fuori dal ciclo else if o case se utilizzi switch una cosa del tipo

if boolean = true
{
la tua routine di lampeggio
}
else
{
spegni led del lampeggio
}

in questo modo penso dovrebbe funzionare...

[EDIT] ripensandoci non capisco come possa il tuo codice continuare ad eseguire l'else if "F" se poi la variabile state non è più F in quanto hai inviato un altro comando