Go Down

Topic: Amplificatore per segnale digitale? (Read 1 time) previous topic - next topic

zeroG

Ciao a tutti  :), sto utilizzando un modulo gprs con Arduino seguendo queste istruzioni:

http://finch.am/projects/arduinogsm/

Dopo aver sbattutto la testa per una notte contro questo circuito perchè non funzionava  :0 (sul serial monitor non ricevevo alcun segno di vita dal modem) ho misurato con il voltmetro il segnale digitale che Arduino doveva leggere: era di circa 3,4 volts!
Sapevo che per Arduino LOW equivale a 0V e HIGH a 5V quindi immagino che non leggerà mai un segnale digitale da 3,4....
C'è qualche soluzione a riguardo? Mi tocca usare una operazionale? O esiste un metodo più veloce?
Grazie
              Jacopo

Federico Vanzati

sopra i 2.5V stai tranquillo che Arduino legge HIGH, non devi per forza dargli 5V. Quindi direi che 3.4V è sicuramente HIGH!  ;)

Se non ti convince allora prova a collegare un potenziometro (10KOhm) al pin digitale e guarda a quale tensione cambia di livello logico.
F

zeroG

Capisco....quindi il problema non è la tensione in uscita...beh a questo punto non saprei che inventarmi, il modem l'ho modificato correttamente, ho anche controllato che non ci fossero cortocircuiti e il programma l'ho semplicemente copiato e incollato! Ho mandato una mail all'autore dell'articolo, vediamo che mi dice!
Grazie comunque per la risposta, ora posso scartare questa ipotesi ;)!

astrobeed

Il livello minimo di tensione per l'1 logico non è 2.5 Volt sugli ATmega 328, da data sheet sezione 26.2 DC Characteristics, risulta essere pari a Vcc * 0.6.
Dato che Vcc vale 5 Volt ne deriva che il livello minimo è 0.6*5= 3 volt, da leggere pure la nota 2 abbinata al campo Vih che cita testualmente :

"2. "Min" means the lowest value where the pin is guaranteed to be read as high"

Cioè quella è la tensione minima per cui è garantita la lettura dell'uno logico.
Nel caso di sistemi con alimentazione a 3.3 Volt è facile che la tensione d'uscita per l'1 logico non raggiunga i 3Volt minimi necessari per l'ATmega.

zeroG

mmm...ora dò un'occhiata pure io al datasheet, non l'avevo mai visto..
Comunque, nel dubbio, direi che trovare una soluzione per passare da 3,4 a 4,5/5 V possa essere utile, almeno per eliminare questa ipotesi di non funzionamento! Se usassi un opamp non arriverei di sicuro a 5V poichè coinciderebbe con la sua alimentazione.
Nella disperazione avevo pure pensato di creare un amplificatore usando un ingresso analogico e due pin digitali dell'Arduino: il segnale a 3,4V generato dal modem va nell'ingresso analogico, e in base al suo valore un pin digitale produce un segnale da 0V (se il segnale è minore di 1V) o da 5V(se il segnale è maggiore di 3,3) da mandare in un altro pin digitale, quello che all'inizio avevo scelto per il circuito illustrato sul sito!

Forse mi sto complicando la vita  :~ ma così dovrebbe funzionare no?

superlol

usare 2 transistor in cascata? un PNP e un NPN collegati NPN con base all'uscita dal modem, collettore a 0 e emettitore alla base del PNP con collettore a 5V e base ad arduino?

(scusate se ho detto blasfemie)
Il nuovo forum italiano sull'elettronica: http://www.electroit.tk/ <--- Nuovamente online!

zeroG

Allora, ho migliorato il circuito:
1)Come ho già detto, il segnale cha va dall'arduino (5v) al modem l'ho abbassato con un partitore resistivo (verificato con il tester);
2)Il segnale che va dal modem (3.3v) all'arduino l'ho amplificato a 5v con un opamp alimentato con una pila da 9v (anche questo verificato col tester).

Così elimino ogni dubbio sulle tensioni....

Tuttavia ancora non funziona nulla...ho contattato il tizio del sito e mi ha detto che non sa come aiutarmi, a lui funge.
Che mi rimane da fare? Ripeto, il codice che utilizzo si trova alla pagina http://finch.am/projects/arduinogsm/ . Vedete per caso qualcosa di errato nel codice? Da quello che ho capito una volta caricato il codice tramite serial monitor posso inviare comandi AT, e il modem risponde, ad esempio, con OK.
....comunico che se continua così lo prendo a martellate!  :0

superlol

hai modificato qualcosa al codice?
hai scaricato la libreria newsoftserial e installata?
Il nuovo forum italiano sull'elettronica: http://www.electroit.tk/ <--- Nuovamente online!

zeroG

Il codice l'ho provato così come sta sul sito. Naturalmente poi visto che non andava l'ho modificato un pò ma non cambiava nulla...la libreria newsoftserial è installata, infatti quando compilo non mi dà nessun errore..
Dò un aggiornamento, magari è utile: Quando dovrebbe apparire sul serial monitor "OK" (inviato dal modem), al suo posto compare "-2". Questo numero appare anche se scollego i cavetti del modem e lascio girare il programma....boh, può servire?

zeroG

Rileggendo, ho trovato questo tra le avvertenze: "The modem seems to misbehave if command echo is disabled (ATE0), so your serial parser may need to handle the commands it sends being echoed back to it." So l'inglese, ma qui parla in maniera un pò troppo tecnica per me..cosa è il comando echo?

marchino65

Ciao,
sotto i comandi dei modem AT Standard, tieni presente che potrebbero variare un pò.


AT   Funzionalità
A   (Answer) Il modem risponde ad una chiamata
B0   Modi ITU-T v.22/v.21 a 1200/300 bps
B1   Modi Bell 212A/103 a 1200/300 bps
B2   Modo v.23 a 1200 bps
Dn   (Dialing) n=0..9 cifre per selezione decadica/multifrequenza
S=n   Seleziona uno dei quattro numeri memorizzati (n=0..3)
W   Attende il secondo tono di selezione
@   Attende 5 secondi di silenzio
E0   Eco comandi disabilitato
E1   Eco comandi abilitato
+++   Commuta dal modo dati al modo comandi
H0   Modem agganciato (on-hook)
H1   Modem sganciato
I0   Codice prodotto
I1   Codice somma di verifiche
I2   Test della ROM
L0   Altoparlante muto
L1   Volume altoparlante medio
L2   Volume altoparlante massimo
M0   Altoparlante sempre disattivato
M1   Altoparlante attivato fino al rilevamento della portante
M2   Altoparlante sempre attivato
M3   Altoparlante disattivato durante la selezione ma attivato al rilevamento della portante
N0   Modo auto disabilitato
N1   Modo auto abilitato
O0   Ritorna al modo trasmissione
O1   Avvia retrain dell'equalizzatore e poi modo trasmissione
P   Selezione multifrequenza
Q0   Codici risultato dell'esito del collegamento abilitati
Q1   Codici risultato disabilitati
Q2   Codice risultato suoneria disabilitato
Sr?   Visualizza il contenuto del registro Sr
Sr =n   Imposta il registro Sr al valore n
T   Selezione decadica
V0   Risposte numeriche
V1   Risposte in testo
X0   Risposte Hayes Smartmodem 300 compatibili/selezione cieca
X1   Come X0 più tutte le risposte connect/selezione cieca
X2   Come X1 più rilevamento tono di selezione
X3   Come X1 più il rilevamento segnale di occupato/selezione cieca
X4   Tutte le risposte e il rilevamento tono selezione e segnale di occupato
Y0   Sconnessione spazio lungo disabilitata
Y1   Sconnessione spazio lungo abilitata
Z0   Ripristino e richiamo profilo utente 0
Z1   Ripristino e richiamo profilo utente 1


Saluti

zeroG

Grazie Marchino65!
Con il programma caricato sull'arduino però, se gli invio AT, non ottengo alcuna risposta :0. In teoria dovrei visualizzare sul serial monitor un OK....
Posto il programma:
Code: [Select]

#include <NewSoftSerial.h>

NewSoftSerial m32_serial(2, 3); // Order is input pin, output pin

void setup() {
  Serial.begin(9600);
  Serial.println("Arduino has booted.");
  m32_serial.begin(9600);
}

void loop() {
  if (m32_serial.available()) {
      Serial.print((char)m32_serial.read());
  }
  if (Serial.available()) {
      m32_serial.print((char)Serial.read());
  }
}


I numeri dei pin sono esatti. Per quanto riguarda il baud rate è giusto anche lui...vedete qualche errore?

jumpjack

Ciao,
vedo che anche tu stai giiochicchiando con questo "gioiellino" (un modem gprs a 18 euro!!) senza successo...
Io per il momento ho scoperto che... lo schema elettrico è sbagliato! Tra i millemila commenti c'e' scritto che la figura è sbagliata, sono stati invertiti TX e RX sul PL2303!
Io pero' ho provato tutte le combinazioni possibili tra invertire i collegamenti e invertire i "2" e "3" nel sorgente, ma non mi funziona lo stesso: il massimo che riesco a ottenere è che quando scrivo AT nel serialmonitor dell'IDE Arduino, mi ricompare anche nel pannello sotto: sembrerebbe la risposta del modem... ma perche' risponderebbe "AT" invece che "OK"? E soprattutto perche' se dopo AT scrivo un altro carattere, invece di comparire quello ne compare un altro a casaccio? Se poi scrivo AAAAAAAAAAAAAAAAAA, mi compaiono tutti caratteri strani e senza senso! Forse ho sbagliato velocità di connessione?!? Pero' allora perche' AT lo leggo?!?

Un'altra cosa che ho notato è che se premo il pulsante DIAGNOSTICA nella finestra del modem (da gestione periferiche) quando lo collego al PC come USB, funziona; ma se mentre resta collegato all'USB lo collego anche all'arduino, la diagnostica non funziona, il modem non risponde. Infatti il led di comunicazione sul modem non lampeggia piu', come invece fa quando il pulsante DIAGNOSTICA funziona.

Mi chiedo se davvero sia un problema di livelli di tensione, anche se il tizio non ne parla...

Queso è il mio sorgente modificato:

Code: [Select]
#include <NewSoftSerial.h>

NewSoftSerial m32_serial(3,2); // Order is input pin, output pin

void setup() {
  Serial.begin(115200);
  Serial.println("Arduino has booted.");
  m32_serial.begin(115200);
}

void loop() {
  if (m32_serial.available()) {
    int modem=m32_serial.read();
      Serial.write((char)modem);
      //Serial.write('\n');
      //Serial.println((char)modem);
  }
  if (Serial.available()) {
   // Serial.print("Invio comando: ");
  int c=Serial.read(); 
    //Serial.println(c);
    m32_serial.print((char)c);
     
  }
}


Con questa versione leggo l'AT di risposta, che quindi deve provenire per forza dal modem, visto che i "print" sotto, di invio, sono commentati via.

Faro' altre prove, vediamo se di due capoccie ne famo una, come si dice a Roma!

jumpjack

P.S.
Astrobeed, se riesco a far funzionare questo coso entro venerdi', forse posso portare a RomeCup un progetto Arduino+GSM! ;-)

jumpjack


Rileggendo, ho trovato questo tra le avvertenze: "The modem seems to misbehave if command echo is disabled (ATE0), so your serial parser may need to handle the commands it sends being echoed back to it." So l'inglese, ma qui parla in maniera un pò troppo tecnica per me..cosa è il comando echo?
Il comando "echo" per i modem (comando ATE, seguito da 0 per disattivarlo e 1 per attivarlo) serve a specificare se il modem deve reinviare al PC (o chi per lui) i comandi che riceve, in modo che chi scriva i comandi possa vedere quello che scrive.

Cioe', se tu in Hyperterminal scrivi il comando AT e invio e l'eco è disattivato, vedrai solo "OK" (in teoria...), cioe' la risposta del modem, mentre se l'eco è attivato, quando premi i tasti A e T vedrai comparire i caratteri sullo schermo, e quando premi INVIO il cursore andrà a capo e vedrai poi la risposta "OK" del modem.

Tornado al voltaggio, il sito dice:
Quote

The TXD signal from the M32 module can be connected directly to an Arduino IO pin as it is greater than the minimum voltage required to register as "high" for the Arduino's pin in input mode.


Quindi inutile stare a sbattersi con gli operatori operazionali, ci dev'essere qualcos'altro che non va.

Go Up