Arduino Ethernet Board: conflitto librerie SoftSerial e SD ?
ciao tutti,
sto sviluppando un progetto che 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 dialogare perfettamente con la camera, dalla quale ottengo senza alcun problema byte della foto jpeg, che faccio scorrere video.
il problema sorge quando includo, oltre softserial.h, anche sd.h, in quanto anche solo inserendo nel codice l'inclusione di questa libreria, non riesco più 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 bytes dell'immagine jpeg).
basta commentare l'inclusione della libreria sd, e le relative istruzioni inserite nel codice dello sketch, perchè tutto torni funzionare.
escludo problemi di codifica o setup del tutto (vedi codice di inizializzazione) come causa del problema.
domanda
chiedo 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...
sto sviluppando un progetto che 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 dialogare perfettamente con la camera, dalla quale ottengo senza alcun problema byte della foto jpeg, che faccio scorrere video.
il problema sorge quando includo, oltre softserial.h, anche sd.h, in quanto anche solo inserendo nel codice l'inclusione di questa libreria, non riesco più 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 bytes dell'immagine jpeg).
basta commentare l'inclusione della libreria sd, e le relative istruzioni inserite nel codice dello sketch, perchè tutto torni funzionare.
escludo problemi di codifica o setup del tutto (vedi codice di inizializzazione) come causa del problema.
domanda
chiedo 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: [select]
// 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 serial ports
/********************************************************************************/
void setup() {
// initialize serial ports
serial.begin(dbgserialbaud);
camsoftserial.begin(camserialbaud);
// preparing pin turn on/off power regulator
pinmode(pinpwr,output);
digitalwrite(pinpwr,high);
delay(2000);
// enabling onboard led flashing status
pinmode(pinled,output);
digitalwrite(pinled,low);
// radio pins
pinmode(radio_space_pin,output);
pinmode(radio_mark_pin,output);
// see if card present , can initialized:
// preparing sd card
pinmode(10, output);
if (!sd.begin(chipselect)) {
serial.println("sd card failed.");
// don't more:
return;
}
serial.println("sd card initialized.");
}
/********************************************************************************/
// main loop
/********************************************************************************/
void loop() {
// let's try synch 3 times, 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 synched can carry on main loop
while (synched) {
//datafile = sd.open("snaptest.jpg", file_write);
cam_snapshot(jpeg,jpg320x240,jpg320x240);
//datafile.close();
delay(snapshotinterval);
}
}
il pin 2 è usato dall'ethernet shield, se non erro
Arduino Forum > International > Italiano > Generale (Moderator: leo72) > Arduino Ethernet Board: conflitto librerie SoftSerial e SD ?
arduino
Comments
Post a Comment