Problema di connessione tra motori DC e modulo bluetooth HC-05

Salve a tutti, sto costruendo una piccola macchina comandata da un modulo HC-05 ma non riesco ad attivare i due motor tramite bluetooth , ho fatto molte prove e sono sicuro che il modulo funzioni e che riesce a ricevere dati in quanto posizionando un Led sull'arduino e dando il comando di accenderlo tramite bluetooth via SoftwareSerial questo si accende. Se vado invece a ripetere la procedura chiedendo di accendere i due motori non succede nulla. Per il controllo della potenza dei motori utilizzo un app che simula un joystick e ad un determinato range di valori corrisponde una configurazione dei motori, ma come già detto in precedenza, questi non accennano a muoversi. Vi allego il codice.

[tt]Grazie. buona serata.[/tt]

sketch_Macchina_BT.ino (2.72 KB)

Ti abbiamo già chiesto di presentarti qui:
https://forum.arduino.cc/index.php?topic=732808.msg4930201#msg4930201

siamo ancora in attesa...

Chiedo scusa, non mi era arrivata la notifica della risposta al mio primo post quindi non sapevo come comportarmi, ho rimediato subito e spero sia sufficiente, per qualsiasi cosa sono disponibile (ho attivato le notifiche alle risposte).
Ancora scusa, Jacopo.

Non dici come è la spedizione, ma questo mi pare molto errato in ricezione:

if (Serial.available() > 0) Serial.write(Serial.read());
 while(Serial.read() >=2) {
   int x = Serial.read();
   delay(10);
   int y = Serial.read();
...

Tutte le Serial.read() leggono ed eliminano dal buffer di ricezione i dati.
Di solito assegni il dato letto a variabile e poi eventualmente la testi
int c=Serial.read(); // se -1 errore in lettura
if( c >=2) ....

Poi cosa vuol dire quel test Serial.read() >= 2 ? Se hai 2 byte ? Serial.available() ti dice quanti byte ci sono in attesa, NON Serial.read()

Ha ragione evidentemente scrivendo il codice mi sono confuso, anche perché ho preso spunto da alcuni presenti su internet. Ho sostituito con Serial.available() >=2 ma ancora nulla... ovviamente i due byte che dovrebbero essere in attesa sono i valori di x e y corrispondenti al joystick virtuale che si trova sull'applicazione. Nel primo messaggio ho omesso che sto usando un modulo H Bridge L298N ma penso che si capisse dal codice perché senno non sarei in grado di muovere i due motori a piacimento, non so però se questo comporta particolari complicazioni dal punto di vista dei collegamenti. Inoltre, sempre se può tornare utile, ho già provato la macchina con un joystick analogico e devo dire che funziona molto bene; l'unico problema sembra quindi la comunicazione motori-Bluetooth infatti anche se la seriale legge dei caratteri i motori non si azionano. Chiedo scusa per il disturbo ( e un po per l'ignoranza :smiley: ), Grazie a tutti.

Nel caso qualcuno sapesse qualcosa gentilmente me lo può far sapere visto che desidererei portare a termine il progetto il prima possibile dato che è un lavoro scolastico. :wink:
Grazie a tutti.

Hai postato un codice con errori, Posta quello corretto.
Inoltre non dai info a sufficienza. Noi non siamo li con te e quindi no possiamo vedere cosa usi/fai.
Servono più informazioni, che app usi ? Cosa spedisce di preciso la app ? Come hai collegato il modulo BT ad Arduino ? Che Arduino ? Uno, Mega ?
Scrivi che usi SoftwareSerial ma poi nel codice usi Serial.begin, quindi non si capisce come colloquiano

La cosa migliore è usare la SoftwareSerial per il collegamento BT e tenere libera la seriale usb collegata al PC e mandare al serial monitor delle info che ti facciano capire cosa riceve veramente l'Arduino.

Ok allora provo a spiegare tutto al meglio, utilizzo un Arduino UNO, se il codice ha errori la prego di dirmelo in quanto non avendo moltissima esperienza potrei non accorgermene. L'app l'ho creata con MIT app inventor e dovrebbe mandare due numeri di un byte tramite il modulo bluetooth del telefono al modulo HC-05, comunque lascio il link per scaricarla in modo che la può provare( Il link vale solo 2 ore comunque allego una foto dei blocchi, penso sia molto intuitivo e anche se uno non conosce la piattaforma si capisce). Ho detto che ho usato la SoftwareSerial perché pensavo che il problema fosse la seriale di Arduino visto che ho letto qui sul forum che spesso da molti problemi. Utilizzando la seriale di Arduino non ricevo numeri ma caratteri del genere: dLfGlC⸮B⸮D⸮I⸮P⸮\⸮h⸮w⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮⸮u⸮^⸮O⸮B⸮;⸮5⸮7v<iD]PQeEt@⸮?⸮A⸮D⸮H⸮I⸮J⸮L⸮N⸮PiUX]QcLjD}B⸮D⸮H⸮N⸮Z⸮s⸮}ljˏ̒˗˙ˌ⸮h⸮h⸮h⸮h⸮i⸮i⸮h{ddcVdLfGlC. Cerco di allegare pure uno schema con i collegamenti (preso da internet perché è quello che ho seguito).
Grazie mille per l'attenzione, spero di non aver omesso nulla.
link: http://ai2.appinventor.mit.edu/b/47j7

>jacopoplg: per evitare un fastidioso "bug" del forum ti prego di leggere e di tenere conto, per il futuro, di quanto scritto QUI. Grazie :slight_smile:

Guglielmo

P.S.: L'ho fatto io nei post qui sopra

  1. dammi pure del tu

  2. SoftwareSerial vuol dire che NON usi la seriale fisica (usb) dei pin 0 e 1 ma una libreria che ti permette di "emulare" una seriale ed usare altri due pin a scelta. Questo si fa di solito per avere libera la usb e poter vedere su serial monitor dei messaggi di debug.
    Tu stai usando la seriale fisica.

  3. non conosco app.inventor, sei sicuro che in quel codice la seriale sia impostata alla velocità di 38400 ?

  4. sembra che da app.inventor mandi dei byte veri e propri, quindi è normale che se spedisci il valore 140 come byte, stampato a video vedi il carattere con valore ascii 140, quindi un carattere "strano"
    Di solito per avere un invio più leggibile si spedisce in modalità testo, se spedisci 140 in realtà mandi il carattere '1' poi '4' e poi '0' che a video sarebbero chiari

  5. usa CTRL+T nell'ide che ti sistema il codice rendendolo più leggibile

Ci sono tanti di quegli errori che è difficile da correggere.
A. Quel ciclo while e la sua if subito sopra NON ha senso
di base nella loop() dovrebbe esserci una cosa del tipo

void loop() 
{   // Reading data from bluetooth module
  if (Serial.available() >= 2) 
  { x = Serial.read();
    y = Serial.read();
    ... tutto il resto del programma che adesso è fuori dalle graffe, alla cavolo
  }
}

B. questo pezzo non ha senso:

if(x > 0 && x < 270)
{ int xAxis = map(x, 270, 0, 1023, 0);
}

Hai dichiarato già una volta int xAxis, se lo ridichiari qui, nasce una nuova variabile xAxis, che NON è quella che hai dichiarato ad inizio loop() e questa muore quando c'e' quella graffa chiusa. Ovvero la variabile ha vita ed è visibile solo dentro a quelle parentesi graffe.
Quindi devi spostare:
int xAxis = 510; // X Default values
int yAxis = 510; // Y Default values
FUORI dalla loop(), ad inizio programma assieme alle altre variabili e poi NON mettere più la parola int davanti a dove usi quelle variabili e fai assegnazioni, quindi:

if(x > 0 && x < 270)
{ xAxis = map(x, 270, 0, 1023, 0);
}

sketch_Macchina_BT.ino (2.63 KB)

Rispondo per punti
2. Ho sostituito la seriale fisica con quella soffiare se mi dici che può avere dei vantaggi.
3. Ora le due seriali sono impostate entrambe a 9600 ma ho provato pure 38400 e non avevo alcun cambiamento, i dati vengono comunque ricevuti dal modulo solo che i motori non partono.
4. successivamente ho fatto delle prove chiedendo all'app di inviare caratteri me leggibili come ad esempio "a" e mettendo un if che alla ricezione di "a " avrebbe fatto accendere un Led (quello sul pin 13) e partire il motore, ma mentre il Led si è acceso il motore non si è mosso.
Per quanto riguarda il secondo messaggio l'if l'avevo aggiunto solo per vedere proiettati sulla seriale i valori che arrivavano dal cellulare, non mi serviva per altro. E per quanto riguarda il pezzo che tu dici non aver senso io lo avevo pensato cosi: se il valore di x è compreso tra 0 e 270 che sono i valori inviati dall'app allora lo mappo come se fosse da 0 a 1023 (questo perché come ho già detto ho usato già questo codice con un joystick analogico, che è fatto da due potenziometri che hanno valori da 0 a 1023, e quindi pur di non riscrivere un codice nuovo l'ho rimappato cosi e poi successivamente viene convertito da 0 a 255, spero si sia capito).
Per tutto il resto che mi hai detto adesso eseguo tutte le modifiche.
Grazie

Rileggi bene il mio pist, punto B
Non ho detto che non ha senso il calcolo (non ho nessuna idea deo calcoli che fai in generale) ma di come hai gestito le variabili.
Cerca un testo di linguaggio C, sezione scope e visibilita/vita variabili.

Grazie mille, bastava non ridefinire le variabili ora funziona tutto bene, scusate l'ignoranza, il resto del codice pare funzionare quindi mi ritengo soddisfatto. Ancora grazie mille, Jacopo

This topic was automatically closed 120 days after the last reply. New replies are no longer allowed.