Collegamento lettore QR

Salve, sto lavorando a un progetto con arduino che consiste in un sistema di differenziamento rifiuti tramite un lettore di codice QR che quando legge il QR(un GM805 Series UART USB DC5V). Per comodità abbiamo deciso di usare codici qr che contengono numeri( 1 che corrisponde alla plastica, 2 alla carta e 3 al vetro), quello che dovrebbe fare il programma è leggere il qr assegnare il valore letto alla variabile (s) e con uno switch decidere quale dei 3 servomotori azionare.

con le mie conoscenze di programmazione abbastanza scarse e grazie ad alcuni video su internet, sono riuscito a fare il codice per questo progetto ma quando sono passato alla parte pratica ho riscontrato un problema con la lettura dei codici QR non ho idea se il problema stia nel codice o nel montaggio del lettore QR.

Questo lettore QR ha un adattatore uart con dei cavi ( il GND, il 5V, RX, TX, D+, D-)
non so cosa siano il D+ e il D- quindi ho collegato soltanto gli altri pin( anche perche in quei due video che ho trovato su youtube con lettori QR simili non erano presenti quei pin)
il gnd e la 5v sulla breadboard collegati alla gnd e alla 5V di arduino il TX e il RX ai pin 2 e 3 di arduino. con questo collegamento il lettore QR si accende e se si inquadra un qr lo legge(non penso questo indichi che il montaggio o il codice siano corretti ma fa quelle azioni di default) ma non invia i dati ad arduino
allego lo sketch che ho utilizzato e delle immagini del lettore QR.
Spero qualcuno riesca ad aiutarmi a trovare il problema per il quale il lettore non comunica i dati letti ad arduino.


#include <Servo.h>
#include <SoftwareSerial.h>
const int rxPin=2;
const int txPin=3;
int s;
int pulsante = 7;
Servo s1;
Servo s2;
Servo s3;
SoftwareSerial QR(2,3);


void setup(){
  s1.attach(5);
  s2.attach(6);
  s3.attach(9);
  s1.write(90);
  s2.write(90);
  s3.write(90);
  Serial.begin(9600);
  QR.begin(9600);
}

  
    
  
void loop(){
  
  if(QR.available()>0)
  {
  s=QR.read();
    s=s-48;
    Serial.println(s);
    delay(1000);
  } 
  else if(Serial.available()>0)
  {
  s=Serial.read();
    s=s-48;
    Serial.println(s);
  }
   
      
  
  switch(s){
    
     case 1:
     s1.write(0);
        
		delay(5000);
		
        s1.write(90);
      	delay(5000);
		s=0;
    	
    break;
    case 2:
    s2.write(0);
        
		delay(5000);
		
        s2.write(90);
      	delay(5000);
		s=0;
    case 3:
    s3.write(0);
        
		delay(5000);
		s3.write(90);
      	delay(5000);
		s=0;
    	
  
  }
  if(digitalRead(pulsante)== HIGH)
  {
   s1.write(0);
   s2.write(0);
   s3.write(0);
   delay(5000);
   s1.write(90);
   s2.write(90);
   s3.write(90);
   
}
}



Controlla che i collegamenti siano corretti, il pin TX del modulo deve andare al pin 2 di Arduino (RX), l'RX del modulo al 3 di Arduino. Stando a quanto dice il manuale la comunicazione seriale dovrebbe già essere attiva con quei parametri, quindi dovrebbe funzionare, prova ad inquadrare questo QR e vedi se cambia qualcosa:

Ciao, Ale.

grazie del consiglio appena posso provo e ti faccio sapere.

Ma se da seriale scrivi 1 cosa ottieni?
E cosa vedi in seriale?

Sono i pin che si usano per un collegamento via USB

Intanto occorre verificare alcune cose ... per cominciare lo standard ...
... la comunicazione seriale TTL standard prevede che ha riposo il pin TX stia a livello HIGH ... il manuale di quell'oggetto definisce la comunicazione come TTL-232 (ricordo che la RS-323, oltre alle divverenze nei livelli di tensione, a riposo ha il pin TX LOW) quindi, come prima cosa, verificherei a che livello è il pin TX di quell'oggetto quando NON c'è trasmissione; se è a livello HIGH può tranquillamente comunicare con Arduino, se a livello LOW (come una RS-232) va invertito.

Fatto questo non capisco bene se quell'oggetto, sulla seriale, trasmetta semplicemente dei codici che legge o ... se abbia un suo protocollo molto più complesso (guardando il manuale sembra usi un protocollo che prevede anche il calcolo di un CRC per la comunicazione).

Insomma, tocca fare alcune verifiche e dedicare un po' di tempo a studiarsi bene il manuale per capire come richiedere e ricevere i dati :roll_eyes:

Guglielmo

Usando la SoftwareSerial basta aggiungere il terzo parametro (true), anche questa sarebbe una cosa da provare.

Ciao, Ale.

... certo, dopo vare verificato, come suggerito, il livello del pin TX.

Comunque, quello che mi preoccupa di più, è il protocollo ... quell'oggetto mi sembra voglia specifici comandi per funzionare ... :roll_eyes:

Guglielmo

Scusami l’ignoranza per leggere il pin TX del lettore bisogna farlo tramite monitor seriale leggendo il pin RX di arduino oppure basta leggere se c’è tensione sul pin TX del lettore attraverso un multimetro?

Dato che devi capire il "livello" a riposo, puoi farlo semplicemente solo alimentando il modulo e misurando a che valore è il pin TX (rispetto al GND) con un multimetro.

Certo ... avendo a disposizione un oscilloscopio, si potrebbe anche capire se, da solo, inizia comunque a trasmettere qualche cosa in attesa di comandi ... :roll_eyes:

Guglielmo

okokk grazie mille

Comunque nelle specifiche del dispositivo c'è scritto in modo chiaro che è TTL :joy:

https://it.aliexpress.com/item/1005004002956342.html

... quello è il "livello" di tensione, ovvero 0..5V, ma non ti dice nulla sulle specifiche di come usa la UART.

Normalmente se specifichi solo seriale TTL allora hai la fase di "idle" messa ad HIGH, ma se mi specifici TTL-232 mi fai venire il dubbio che tu usi si i livelli 0..5V, ma magari in "idle" sei LOW, come la classica 232. Ecco perché fare una semplice verifica che non costa nulla, ma può risparmiare ore di insuccessi ... :wink:

Guglielmo

P.S.: Su AliExpress in realtà specifica due cose:

  1. Interface Type: USB, RS232
  2. Interface: TTL-232/USB

che vuol dire tutto e niente :roll_eyes:

Salve ho seguito il consiglio e il lettore è riuscito a comunicare con arduino :grin:
Grazie mille mi hai veramente salvato visto che devo presentare il progetto giovedì.

Bene, mi fa piacere, anche se in realtà non ci deponevo molta fiducia! :smiley:

Ciao, Ale.

1 Like

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