Amplificatore per segnale digitale?

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

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.

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 ;)!

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.

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?

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)

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

hai modificato qualcosa al codice? hai scaricato la libreria newsoftserial e installata?

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?

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?

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

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:

#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?

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:

#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!

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

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?

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:

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.

@zeroG : a prima vista l'unica differenza nel programma è la velocità della seriale.

@jumpjack: a questo punto dovresti riuscire a inviare i comandi, ma c'è un piccolo problema: il terminale di arduino IDE se non erro NON invia il carattere '\n' (a capo) quindi l'unica è provare ad inviare un paio di comandi direttamente da arduino e limitarsi a vedere la risposta con arduino, oppure usi un carattere, tipo - che se viene letto dalla seriale con il pc viene inviato \n, così dovresti riuscire a comunicare perfettamente