Pages: [1] 2   Go Down
Author Topic: Arduino ShiftOut tramite porta seriale - Help!  (Read 921 times)
0 Members and 1 Guest are viewing this topic.
Offline Offline
Sr. Member
****
Karma: 0
Posts: 423
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Scusate ragazzi ho un problema con questo codice, praticamente io gli invio una serie tipo "0b00110011" tramite php ad arduino,
però praticamente, quando invio il messaggio, i led si spengono, si accendono 3 led (che non corrispondono al messaggio) e poi si riaccendono tutti i led e rimangono così fin quando non invio dell'altro.
Ma come is fa a fargli cambiare stato solo quando invio qualcosa tramite seriale?
questo è il codice:
Code:
//Pin connected to ST_CP of 74HC595
int latchPin = 8;
//Pin connected to SH_CP of 74HC595
int clockPin = 12;
////Pin connected to DS of 74HC595
int dataPin = 11;

void setup() {
  //set pins to output so you can control the shift register
  pinMode(latchPin, OUTPUT);
  pinMode(clockPin, OUTPUT);
  pinMode(dataPin, OUTPUT);
   Serial.begin(9600);
}

void loop() {
  if (Serial.read())
  {
    digitalWrite(latchPin, LOW);
    // shift out the bits:
    shiftOut(dataPin, clockPin, MSBFIRST, Serial.read()); 
    //take the latch pin high so the LEDs will light up:
    digitalWrite(latchPin, HIGH);
    // pause before next value:
    delay(500);
  }
}
Logged

BZ (I)
Online Online
Brattain Member
*****
Karma: 248
Posts: 21167
+39 349 2158303
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Usi in modo errato la funzione serial read.

1) non controlli se ci sono dati nel buffer della seriale
2) leggi un dato del buffer e poi mandi al shift register un altro dato letto nel secondo serial read.

devi controllare se sono dati disponibili nel buffer (con serial.aviable()) e poi leggere il dato e mandarlo sul 595.
http://arduino.cc/en/Serial/Available

Ciao Uwe


Logged

Global Moderator
Italy
Offline Offline
Brattain Member
*****
Karma: 325
Posts: 22498
Logic is my way
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

In pratica l'errore è qui:
Code:
if (Serial.read())
Questo dice di estrarre un carattere dalla seriale, non di controllare se c'è un carattere e basta. Quindi come ti ha spiegato Uwe il primo carattere che arriva lo perdi per strada perché esso non viene assegnato a nessuna variabile ma usato come test per l'if.
Logged


Offline Offline
Sr. Member
****
Karma: 0
Posts: 423
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

ah non lo sapevo xD Grazie mille smiley
Logged

Offline Offline
Sr. Member
****
Karma: 0
Posts: 423
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Ma cmq vedo un comportamento anomalo smiley-lol
mi spiego,
io invio la serie di bit
ad esempio con 0b10000001 si accendono due led (che non mi sembrano il 1° e l'ultimo) mentre 2 led rimangono accesi sempre, dopo mezzo secondo di delay torna tutto spento tranne i due led perenni, invece senza delay i led che comando si accendono e si spengono così velocemente che quasi non si vedono e i due led perenni continuano ad essere accesi.
Potreste darmi un aiuto? xD
Logged

BZ (I)
Online Online
Brattain Member
*****
Karma: 248
Posts: 21167
+39 349 2158303
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Dacci il Sketch da te modificato.
Ciao Uwe
Logged

Offline Offline
Sr. Member
****
Karma: 0
Posts: 423
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Code:
//Pin connected to ST_CP of 74HC595
int latchPin = 8;
//Pin connected to SH_CP of 74HC595
int clockPin = 12;
////Pin connected to DS of 74HC595
int dataPin = 11;

void setup() {
  //set pins to output so you can control the shift register
  pinMode(latchPin, OUTPUT);
  pinMode(clockPin, OUTPUT);
  pinMode(dataPin, OUTPUT);
   Serial.begin(9600);
}

void loop() {
  if (Serial.available())
  {
    digitalWrite(latchPin, LOW);
    shiftOut(dataPin, clockPin, MSBFIRST, Serial.read()); 
    digitalWrite(latchPin, HIGH);
    // non credo serva il delay, dato che aspetta un altro valore
    // delay(500);
  }
}
Logged

Global Moderator
Italy
Offline Offline
Brattain Member
*****
Karma: 325
Posts: 22498
Logic is my way
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Inizia con un pò di debug altrimenti non riuscirai ad isolare il problema.
Cioè, cerchiamo di capire se il dato arriva corretto ma viene scritto male oppure non arriva per niente.

Quindi modifica il loop() così:
Code:
void loop() {
  if (Serial.available()) {
    digitalWrite(latchPin, LOW);
    byte temp = Serial.read();
    Serial.println(temp); //eco per vedere cos'è stato ricevuto
    shiftOut(dataPin, clockPin, MSBFIRST, temp); 
    digitalWrite(latchPin, HIGH);
  }
}
Logged


Offline Offline
Sr. Member
****
Karma: 0
Posts: 423
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

si penso che sia un problema di come invia la variabile .
io ho inviato "0b10000001" e sul monitor seriale mi ha stampato
Code:
48
98
49
48
48
48
48
48
48
49
è normale? smiley-lol
Inoltre comunque i led 5 e 6 rimangono sempre accesi, sarà un problema di arduino? c'è un modo per spegnerli?
« Last Edit: May 24, 2013, 12:45:26 pm by toti94 » Logged

Global Moderator
Italy
Offline Offline
Brattain Member
*****
Karma: 325
Posts: 22498
Logic is my way
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Se hai spedito "0b10000001" con Serial.print è normale. La Serial ha trattato il dato come stringa per cui l'ha spedita byte per byte, e quelli che vedi sono i codici ASCII dei singoli caratteri che componevano quella stringa.

Devi usare
Code:
Serial.write(0b10000001)
e ti verrà spedito il byte corrispondente a quel valore.
Logged


Offline Offline
Sr. Member
****
Karma: 0
Posts: 423
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

si ora sul monitor esce esattamente ciò che scrito, ovvero "0b10000001", ma arduino non cambia comportamento
Logged

Global Moderator
Italy
Offline Offline
Brattain Member
*****
Karma: 325
Posts: 22498
Logic is my way
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Codice please
Logged


Offline Offline
Sr. Member
****
Karma: 0
Posts: 423
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Code:
//Pin connected to ST_CP of 74HC595
int latchPin = 8;
//Pin connected to SH_CP of 74HC595
int clockPin = 12;
////Pin connected to DS of 74HC595
int dataPin = 11;

void setup() {
  //set pins to output so you can control the shift register
  pinMode(latchPin, OUTPUT);
  pinMode(clockPin, OUTPUT);
  pinMode(dataPin, OUTPUT);
   Serial.begin(9600);
}

void loop() {
  if (Serial.available()) {
    digitalWrite(latchPin, LOW);
    byte temp = Serial.read();
    Serial.write(temp); //eco per vedere cos'è stato ricevuto
    shiftOut(dataPin, clockPin, MSBFIRST, temp); 
    digitalWrite(latchPin, HIGH);
  }
}
Logged

Global Moderator
Italy
Offline Offline
Brattain Member
*****
Karma: 325
Posts: 22498
Logic is my way
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Ma "come" vengono spediti questi dati?
Se non spedisci in formato byte, siamo punto e a capo. smiley-wink
Logged


Offline Offline
Sr. Member
****
Karma: 0
Posts: 423
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

io scrivo 0bxxxxxxxx questo non è il formato byte?
Logged

Pages: [1] 2   Go Up
Jump to: