Hola programadores. Estoy desarrollando un proyecto con la adquisición de datos, de tensión y corriente mediante una placa de arduino nano y un memoria microSD que me sirve para guardar los datos sensados en un archivo (.txt)
¿Desearía saber como obtener los datos del archivo de texto que se encuentra dentro de la memoria microSD y enviarlos por el puerto serial a matlab sin desconectar la memoria del shield microSD de arduino.
NOTA: el archivo de texto dentro de la microSD contienen los datos sensados durante un día
Leiste ejemplos de como leer una SD? Es fácil realmente.
Si estas guardando datos en la SD, pues haces el proceso inverso que es leer (obvio no) y lo envias por lo Serial usando Serial.print(datos)
Esto es solo uno de los tantos ejemplos que existen.
/*
SD card read/write
This example shows how to read and write data to and from an SD card file
The circuit:
* SD card attached to SPI bus as follows:
** MOSI - pin 11
** MISO - pin 12
** CLK - pin 13
** CS - pin 4
created Nov 2010
by David A. Mellis
modified 9 Apr 2012
by Tom Igoe
This example code is in the public domain.
*/
#include <SD.h>
File myFile;
void setup()
{
// Open serial communications and wait for port to open:
Serial.begin(9600);
while (!Serial) {
; // wait for serial port to connect. Needed for Leonardo only
}
Serial.print("Initializing SD card...");
// On the Ethernet Shield, CS is pin 4. It's set as an output by default.
// Note that even if it's not used as the CS pin, the hardware SS pin
// (10 on most Arduino boards, 53 on the Mega) must be left as an output
// or the SD library functions will not work.
pinMode(10, OUTPUT);
if (!SD.begin(4)) {
Serial.println("initialization failed!");
return;
}
Serial.println("initialization done.");
// open the file. note that only one file can be open at a time,
// so you have to close this one before opening another.
myFile = SD.open("test.txt", FILE_WRITE);
// if the file opened okay, write to it:
if (myFile) {
Serial.print("Writing to test.txt...");
myFile.println("testing 1, 2, 3.");
// close the file:
myFile.close();
Serial.println("done.");
} else {
// if the file didn't open, print an error:
Serial.println("error opening test.txt");
}
// re-open the file for reading:
myFile = SD.open("test.txt");
if (myFile) {
Serial.println("test.txt:");
// read from the file until there's nothing else in it:
while (myFile.available()) {
Serial.write(myFile.read());
}
// close the file:
myFile.close();
} else {
// if the file didn't open, print an error:
Serial.println("error opening test.txt");
}
}
void loop()
{
// nothing happens after setup
}
Tomado del propio playround de arduino
Gracias, el código que utilizo es parecido, pero tengo un problema al utilizar un módulo Xbee pro s1 . Cuando utilizo el cable USB de Arduino puedo adquirir los datos desde Matlab pero cuando conecto el Xbee no puedo adquirir datos, el puerto serial sale como si estuviera vacío, esto sucede al imprimir los datos en el void setup. Pero cuando imprimo los datos en el void loop mi modulo xbee detecta los valores pero imprime por bloques de datos repitiéndose los valores anteriores y al hacer la adquisición de datos desde Matlab salen aleatoriamente los datos es decir por ejemplo cuando deseo los primeros 5 valores que están en la SD en ocasiones salen pero en otras no, se obtienen otros valores según se impriman en el monitor serial de arduino. ¿ Por que sucede esto y como solucionarlo ?
¿No sé si la instrucción Serial.write(myFile.read()); es la adecuada para imprimir los datos de la SD y así obtener los datos mediante el puerto serial?
Veamos el verdadero problema, que es XBEE.
XBee desde arduino se conecta sin problemas.
Desde la PC a menos que diga RS232 tendrias que armar una interfaz con un MAX232 a TTL que convierte RS232 a TTL.
Asi lo tienes conectado?
Como mencionas la comunicación entre el xbee y el arduino está correcta y en cuanto La comunicación del xbee con el pc no creo que este mal, lo estoy conectando mediante un xbee explorer dongle.
Pregunto: has hecho una conexion simple usando Hyperterminar por ejemplo? El arduino enviando información usando simples Serial.print(dato++); donde dato es un entero que arranca en 0 y cada vez que envía algo por el serial se incrementa para la proxima en una unidad.
Verifica si eso funciona. Seteas hyperterminal a la misma velocidad de todo el enlace. Y el arduino a través del enlace XBEE debería salir en el hyperterminal.
No he usado hyperterminal, pero ademas de utilizar el monitor serial del software arduino he utilizado el monitor serial del XCTU con el cual configuro los xbee, y en este cuando enviaba los datos directamente con Serial.print(dato) sin la sd los podia visualizar en el terminal del xctu, pero ahora que imprimo los datos de la SD en el void setup el xctu no los lee......pero si, al imprimir los datos de la sd en el void loop mediante Serial.write(myFile.read());
entonces sin la SD anda todo bien.
pero cuando imprimes datos en el setup luego no imprime datos en el serial.
Como si el proceso de inicialización no se hubiera completado.
Saca esto si no usas Leonardo
while (!Serial) {
; // wait for serial port to connect. Needed for Leonardo only
}
No es un gran cambio pero prueba a ver si esto hace algo
#include <SD.h>
File myFile;
void setup()
{
// Open serial communications and wait for port to open:
Serial.begin(9600);
// Supongo que no usas Leonardo sino debes agregar la prueba del puerto Serie que borre
Serial.print("Initializing SD card...");
// On the Ethernet Shield, CS is pin 4. It's set as an output by default.
// Note that even if it's not used as the CS pin, the hardware SS pin
// (10 on most Arduino boards, 53 on the Mega) must be left as an output
// or the SD library functions will not work.
pinMode(10, OUTPUT);
if (!SD.begin(4)) {
Serial.println("Fallo la inicialización!");
return;
}
Serial.println("inicialización OK.");
// open the file. note that only one file can be open at a time,
// so you have to close this one before opening another.
myFile = SD.open("test.txt", FILE_WRITE);
// if the file opened okay, write to it:
if (myFile) {
Serial.print("Writing to test.txt...");
myFile.println("testing 1, 2, 3.");
// close the file:
myFile.close();
Serial.println("done.");
} else {
// if the file didn't open, print an error:
Serial.println("error opening test.txt");
}
}
void loop()
{
// nothing happens after setup
// re-open the file for reading:
myFile = SD.open("test.txt");
if (myFile) {
Serial.println("test.txt:");
// read from the file until there's nothing else in it:
while (myFile.available()) {
Serial.write(myFile.read());
}
// close the file:
myFile.close();
} else {
// if the file didn't open, print an error:
Serial.println("Error al abrir test.txt");
}
delay(1000);
}
Si funciona.... pero no lo puedo aplicar ya que necesito imprimir en el void setup de arduino por la salida de los datos en el puerto serial..... ya que quiero la lista de datos de la SD cuando abra el puerto serial desde matlab con el xbee.
Bien. Es un avance.
dices que eso funciona pero si lo pones en el setup no.
Entonces prueba
-
agrega un delay entre lo que yo deje en el setup y lo que puse en el loop. Me parece tonto pero....
-
Si no funciona 1. entonces crea un contador y lo inicializas a 0 en el setup o como global.
y en el loop pones
if (contador++ == 0) y detro de las llaves todo lo que puese en el loop.
se ejecutará una vez como setup. Velo como una inicialización.
ya que dijiste que funcionaba esto debería funcionar tambien y no viola lo que quieres hacer.
Gracias por el aporte 2, mediante el contador en el void loop, puedo imprimir los datos de la SD una vez cuando abra el puerto serial, pero todavía el xbee no detecta los datos para la comunicación, como si no enviara nada por el puerto serial, pero con el cable usb si funciona. Para que el xbee funcione necesito enviar los datos por el serial varias veces (void loop), pero no me sirve, porque solo quiero obtener los datos de la lista que hay en la SD una vez.(pero con el contador solucione esta parte)