Display LCD 20x4 seriale + arduino?

Salve a tutti, ho acquistato su ebay questo bellissimo display lcd http://www.sureelectronics.net/goods.php?id=964 che connesso via usb direttamente al pc funziona a meraviglia, ma se mi accontentassi di così poco non sarei quì....
Vorrei interfacciarlo (via seriale ) all'arduino duemilanove, e nonostante non sia proprio fessissimo sull'argomento, ad oggi non ci sono ancora riuscito..
RX e TX incrociati; quando invio dei caratteri , vedo il led dei "dati" lampeggiare ma il display non batte ciglio :-/
Ho anche provato la sequenza di inizializzazione suggerita nel manuale del display che è stata inviata in tutti i modi possibili (ascii, hex , dec, un carattere per volta, in una stringa) ma niente...
Chiedo a chiunque abbia esperienza un piccolo aiuto per venirne a capo.

Link al manuale del display: http://www.sure-electronics.net/download/down.php?name=DE-LD022_Ver1.0_EN.pdf
Grazie

Se il collegamento lo fai attraverso la porta USB non può funzionare perchè l'USB di Arduino è solo slave (e anche il tuo LCD è slave...)
Se hai la possibilità di collegarti come se fosse una normale seriale dovresti riuscire, altrimenti senza "aggiunte" è un problema.

nooo, via seriale ttl dall'apposito connettore, via usb non l'avrei mai neanche postato sul forum.
ho a disposizione 2 connettori (stessi piedini) vcc tx rx gnd, sia sul connettore denominato ttl, sia su quello denominato rs232.
(chiaramente li ho provati entrambi anche sapendo che l'rs232 non avrebbe funzionato).

se non ricordo male, l'rs232 con segnali ttl lavora da -5V a +5V mentre con Arduino lavori da 0V a +5V.. credo sia questo il tuo problema.. se puoi bypassare i segnali ttl dell'LCD dovrebbe funzionarti... se i livelli sono giusti e non ti funziona devi controllare meglio i parametri della seriale!

Giusto, infatti ho provato a connettere il pin tx dell'arduino con l'rx (ttl della seriale) ma anche con un solo canale di comunicazione (anche se 0-5v) ma nulla....
a me in questo momento non importa "parlare" con l'lcd ma solo mandargli roba in comunicazione univoca.
speravo che con 3 fili sarei riuscito a mostrare qualcosa, ma anche no :cry:
provato da 9600bps in sù ma senza risultati....

Non puoi comunicare con un protocollo rs232 (anche con i segnali 0-5V) senza un minimo di handshake... Altrimenti come fanno i due dispositivi a prevenire gli errori di trasmissione/ricezione (non a caso devi impostare il bit di parità oltre alla velocità).
Una comunicazione seriale (rs232) non può funzionare con un solo filo!
Guarda qui: EIA RS-232 - Wikipedia

ma io nel post precedente ho scritto ttl, seriale era riferito al tipo di trasferimento, non al proto (avrei detto rs232) scusami.
Purtroppo sul manuale dell'lcd non specifica il tipo di connessione nella parte che descrive i comandi da inviare e quindi vado al buio...
semplicemente invio tramite i pin rx tx di arduino via ttl i comandi descritti nel manuale, altro non mi viene... :slight_smile:
altre info utili:
L'lcd (dal connettore a 16 pin interno) dovrebbe essere un HD44780 rimarchiato, potrei anche smontarlo e pilotarlo con le apposite librerie a 4 bit, però così facendo vado ad utilizzare altri pin sull'arduino che mi servono per fare altro.. :cry:
L'idea era di usare al massimo 2 pin dell'arduino per l'lcd e nessun level shifter.
La cosa paradossale è che, integrato nella doughterboard c'è pure un convertitore usb-seriale (CP2102)!

sto impazzendo... adesso sò anche che qualcuno c'è riuscito >:(
riesco solo a comandarlo connesso via usb al pc (vb6 +mscomm).
sto provando con questo codice dalla porta ttl:

void setup()
{
Serial.begin(9600);
on();
}

void loop()
{
Serial.print("Ciao Arduino");
delay(2000);
}

void on(){ //dovrebbe inizializzare la comunicazione
Serial.print(0xFE, BYTE);
Serial.print(0x53, BYTE);
Serial.print(0x75, BYTE);
Serial.print(0x72, BYTE);
Serial.print(0x65, BYTE);
}

forse sto dicendo una cavolata(anzi sicuramente) ma visto che questi giorni ho a che fare con un lcd (parecchio rognoso) e un arduino, posso dirti che non devi collegare l'rx dell'arduino(il tx dello schermo) mentre invii il codice l'arduino perchè se no da errori...

scusa se magari non ho capito il tuo problema e ho dato una risposta a caso :wink:

grazie, ma è una cosa che già faccio, mi pareva logico ::slight_smile:

Mi ripeto: secondo me hai solo un problema nella gestione del protocollo..
Controlla i Receiver Error Flags (sez 19.7.4 - pagina 138 del datasheet di ATmega168).
Probabilmente Arduino stesso ti può "dire" dove avviene l'errore :wink:

ho capito cosa vuoi dirmi, però io pensavo che tutta quella roba a quel livello fosse gestita dalle relative interfacce uart.
P.S.
Non sò come "portare a vista" gli error flags per fare un po di debugging :-[

Non mi risulta che il sistema di ctrl del flusso seriale sia trattato dal sistema Arduino...
Ti ci do un'occhiata poi vedo di postare qui un poco di code :slight_smile:

pensavo all'ftdi...
ho provato anche così, ma niente.. :cry:
#include <SoftwareSerial.h>
#define rxPin 6 // software Rx pin (connetto Tx sull' LCD)
#define txPin 7 // software Tx pin (connetto Rx sull' LCD)

// setta la nuova seriale
SoftwareSerial swSerial = SoftwareSerial(rxPin, txPin);

void setup() {
pinMode(rxPin, INPUT);
pinMode(txPin, OUTPUT);
// setta la SoftwareSerial
swSerial.begin(9600);
//setta la seriale
Serial.begin(9600);
delay(100); // (un pò di ritardo)
startLCD();
swSerial.print("Ciao Arduino!");
}

void loop() {
// ritrasmette da pc a lcd
if (Serial.available() > 0) {
byte inchar = Serial.read();
swSerial.print(inchar);
}
}

void startLCD(){

swSerial.print(0xFE, BYTE);
swSerial.print(0x53, BYTE);
swSerial.print(0x75, BYTE);
swSerial.print(0x72, BYTE);
swSerial.print(0x65, BYTE);
}

ho "buttato giù" in fretta questa roba, provala e fammi sapere:

/* serial test by kokiua */

// definizione funzioni utili
#define setBit(var, bitnum)   (var)|=(1<<(bitnum))
#define resBit(var, bitnum)   (var)&=~(1<<(bitnum))
#define testBit(var, bitnum)  (var)&(1<<(bitnum))

//definizione led di stato
#define PIN_err1    9  //acceso se Frame Error
#define PIN_err2   10  //acceso se Data OverRun
#define PIN_err3   11  //acceso se Parity Error
#define PIN_err4   12  //acceso se tutto ok

//variabili globali

int errore = false;

void setup() 
{ 
  pinMode(PIN_err1, OUTPUT);
  pinMode(PIN_err2, OUTPUT);
  pinMode(PIN_err3, OUTPUT);
  pinMode(PIN_err4, OUTPUT);
  Serial.begin(9600); 

  // da modificare se la seriale è usata per altri scopi
  Serial.println("Test protocollo della seriale");
} 

void loop() 
{ 
  if(testBit(UCSR0A, FE0)){ // Frame Error
       digitalWrite(PIN_err1, 1);
       errore = true;
  } else {
      digitalWrite(PIN_err1, 0); 
  }
  
  if(testBit(UCSR0A, DOR0)){ // Data OverRun
       digitalWrite(PIN_err2, 1);
       errore = true;
  } else {
      digitalWrite(PIN_err2, 0); 
  }
  
  if(testBit(UCSR0A, UPE0)){ // Parity Error
       digitalWrite(PIN_err3, 1);
       errore = true;
  } else {
      digitalWrite(PIN_err3, 0); 
  }

  if(errore){
       digitalWrite(PIN_err4, 0);  //spegne led di tutto ok
       errore = true;
  } else {
      digitalWrite(PIN_err4, 1);  //accende led di tutto ok
      errore = false;
  }
}

P.S. la stringa emessa in fase di setup la devi modificare per renderla compatibile con il dispositivo che hai collegato (in questo caso il Display) e vedi di non usare Serial.println() ma solo Serial.print() :wink:

appena vado a casa provo

Dimenticavo: se usi una UART diversa dalla 0 (dove il processore lo consente) ricordati di aggiornare tutte le variabili associate UCSRnA, FEn, DORn, UPEn, dove n è il numero di UART (0,1,...) - sempre chè chi ha scritto l'ambiente Arduino abbia già implementato tali variabili nel sistema, altrimenti fammelo sapere che ti faccio vedere come definirle :stuck_out_tongue:

provato, resta acceso il led tuttoOK, e chiaramente sul display non si smuove nulla :cry:

A questo punto per cercare di capire meglio mi sono riguardato il datasheet ma non sono riuscito a trovare nulla su un collegamento seriale, se non usb...

e pensare che di questo lcd mi piaceva proprio la possibilità di pilotarlo, oltre che via usb, anche via rs232 ttl ecc. ero convinto che l'arduino e il PIC del dispay non avrrebbero avuto problemi a comunicare.(la comunicazione viene tradotta da usb a rs232 per entrambi)
posso anche capire che con l'ingresso rs232 non funzioni a causa dei livelli di tensione attesi, ma cacchio, dalla porta ttl deve funzionare!
i pin sono quelli dell'alimentazione + rx e tx sull'lcd, ed ho a disposizione gli stessi pin sull'arduino, sono sicuro che il display (via usb almeno) funziona, e quindi credo che passerò dal normale accanimento a quello maniacale pur di farlo funzionare ;D