Pages: [1]   Go Down
Author Topic: Arduino Ethernet Board: conflitto librerie SoftSerial e SD ?  (Read 496 times)
0 Members and 1 Guest are viewing this topic.
Offline Offline
Newbie
*
Karma: 0
Posts: 4
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Ciao a tutti,
sto sviluppando un progetto che a sommi capi posso riassumere così:

BOARD
Arduino Ethernet

AMBIENTE SVILUPPO
Ide Arduino 1.0 per Ubuntu

SCOPO
Leggere un'immagine JPEG dalla minicam seriale, immagazzinare tale immagine sulla scheda SD di bordo, riaprire il file JPEG appena salvato su SD e trasmetterlo tramite un modulino radio.

SETUP
1) Minicamera seriale TTL collegata alle porte digitali 2 (RX) e 3 (TX)
2) Convertitore USB/Seriale collegato alla classica porta seriale on board, usato per output di debug e per upload degli sketch
3) Modulo radio RadioMetrix (e un pugno di resistenze) collegato alle porte digitali 7 e 8 per trasmissione immagine.

PROBLEMA
Per poter collegare la minicam seriale TTL alla board senza usare l'unica porta seriale UART hw disponibile sulla board, utilizzo con successo la libreria SoftSerial, con la quale riesco a dialogare perfettamente con la camera, dalla quale ottengo senza alcun problema i byte della foto JPEG, che faccio scorrere a video.
Il problema sorge quando includo, oltre a softserial.h, anche sd.h, in quanto anche solo inserendo nel codice l'inclusione di questa libreria, non riesco più a dialogare con la minicamera dalla quale non ottengo più risposte, o ottengo solo risposte parziali (interrogo la cam inviando comandi via seriale, e la cam normalmente risponde con degli ACK variamente codificati o con i bytes dell'immagine JPEG).
Basta commentare l'inclusione della libreria SD, e le relative istruzioni inserite nel codice dello sketch, perchè tutto torni a funzionare.
Escludo problemi di codifica o setup del tutto (vedi codice di inizializzazione) come causa del problema.

DOMANDA
Chiedo a voi esperti se:
a) Esiste un conflitto tra le librerie SoftSerial e SD?
b) Se sì, sarebbe possibile ovviare in qualche modo?
c) Se rinunciassi ad usare la seriale SoftSerial per usare invece la porta UART integrata per il dialogo con la telecamerina, perderei la possibilità di caricare nuovi sketches tramite il classico adattatore USB/Seriale? Sono moltorestio ad usare questa alternativa anche perchè non saprei come fare debugging facilmente...

Code:
// INCLUDES
#include <util/crc16.h>
#include <SD.h>
#include <SoftwareSerial.h>

// GLOBAL VARIABLES
const unsigned long camSerialBaud = 14400;
const unsigned long dbgSerialBaud = 9600;
const unsigned long radSerialBaud = 50;
const unsigned long snapshotInterval = (1000 * 60 * 5); // Default value 5 minutes

// RADIO PINS
const uint8_t RADIO_SPACE_PIN  = 7;
const uint8_t RADIO_MARK_PIN   = 8;

// SOFT SERIAL PINS
const uint8_t SS_RX  = 2;
const uint8_t SS_TX  = 3;
SoftwareSerial camSoftSerial(SS_RX,SS_TX); // RX, TX

// UTILITY PINS
const uint8_t pinLED = 9;
const uint8_t chipSelect = 4;
const uint8_t pinPWR = 5;

File dataFile;

// ... omissis di varie dichiarazioni di variabili qui non significative                                                                                                                   

/********************************************************************************/
// SETTING UP SERIAL PORTS
/********************************************************************************/
void setup() {
 
  // initialize serial ports
  Serial.begin(dbgSerialBaud);
  camSoftSerial.begin(camSerialBaud);
 
  // Preparing pin for turn on/off the power regulator
  pinMode(pinPWR,OUTPUT);
  digitalWrite(pinPWR,HIGH);
  delay(2000);
 
  // Enabling onboard LED for flashing status
  pinMode(pinLED,OUTPUT);
  digitalWrite(pinLED,LOW);

  // RADIO PINS
  pinMode(RADIO_SPACE_PIN,OUTPUT);
  pinMode(RADIO_MARK_PIN,OUTPUT);
 
  // see if the card is present and can be initialized:
  // Preparing for SD card
  pinMode(10, OUTPUT);
 
  if (!SD.begin(chipSelect)) {
    Serial.println("SD Card failed.");
    // don't do anything more:
    return;
  }
  Serial.println("SD Card initialized."); 
 
}

/********************************************************************************/
// MAIN LOOP
/********************************************************************************/
void loop() {
 
  // Let's try to synch for 3 times, then we give up
  while (num < 3) {
   
    // Please, synch :)
    // camSoftSerial.listen();
   
    synched = cam_Sync();
    num++;
   
    if (synched) {
      digitalWrite(pinLED,HIGH);
      break;
    } else {
      delay(1000);
    }
  }
 
  if (num >= 3) {
    Serial.println("Turning off device");
    digitalWrite(pinPWR,LOW);
    delay(5000);
   
    Serial.println("Turning on device");
    digitalWrite(pinPWR,HIGH);
    delay(5000);
   
    num = 0;
  }
 
  // If we synched we can carry on the main loop
  while (synched) {
    //dataFile = SD.open("snaptest.jpg", FILE_WRITE);
    cam_SnapShot(JPEG,JPG320x240,JPG320x240);
    //dataFile.close();
    delay(snapshotInterval);
  }
 
}

Logged

0
Offline Offline
Shannon Member
****
Karma: 131
Posts: 10468
:(){:|:&};:
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

il pin 2 è usato dall'ethernet shield, se non erro
Logged

sei nuovo? non sai da dove partire? leggi qui: http://playground.arduino.cc/Italiano/Newbie

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

c) Se rinunciassi ad usare la seriale SoftSerial per usare invece la porta UART integrata per il dialogo con la telecamerina, perderei la possibilità di caricare nuovi sketches tramite il classico adattatore USB/Seriale? Sono moltorestio ad usare questa alternativa anche perchè non saprei come fare debugging facilmente...
Luigino 328 insegna:
Puoi collegare un circuito esterno che commuta la UART al Computer quando devi programmare, poi passa alla telecamerina.

Il circuito potresti pilotarlo con un PIN dell' Atmel: quando questo sta su LOW (default) la UART e' collegata al computer, quando lo metti su HIGH dialoghi con la telecamerina.


Mandaci le specifiche della telecamerina e anche del modulo radio.
Logged

Offline Offline
Newbie
*
Karma: 0
Posts: 4
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

il pin 2 è usato dall'ethernet shield, se non erro
Ciao, innanzitutto grazie per la risposta.
No, il pin usato dalla SD è il 4.
Logged

Offline Offline
Newbie
*
Karma: 0
Posts: 4
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Mandaci le specifiche della telecamerina e anche del modulo radio.

Telecamerina: http://www.4dsystems.com.au/prod.php?id=75
Modulo Radio: http://www.radiometrix.com/content/ntx2

Ho omesso di dire che tra telecamerina e pin 2 e 3 c'è un regolatore di livello che adatta il voltaggio dai 3.3V della minicamera ai 5V delle porte digitali di Arduino, e vice versa. Il regolatore funziona perfettamente, e escludo sia parte del problema in quanto ripeto che il problema si presenta semplicemente inserendo codice di include della libreria SD insieme a quella softserial.
Logged

Pages: [1]   Go Up
Jump to: