Go Down

Topic: Envio de archivos desde arduino (Read 441 times) previous topic - next topic

antoniosanz

Hola, me gustaria saber si se puede enviar un archivo desde arduino (almacenado en una micros SD) a un dispositivo android, y si es posible, como se hace.

un saludo

Lucario448

#1
May 18, 2017, 05:20 pm Last Edit: May 18, 2017, 05:20 pm by Lucario448
Sí y tienes 2 opciones:

  • Bluetooth/Puerto serial mediante USB. Esta última siendo posible solamente si el dispositivo tiene soporte OTG, sin embargo vía Bluetooth es indudable.
  • Vía red (cableada o inalámbrica). Teniendo el hardware necesario, sería crear un servidor web que inicie una descarga una vez sea accesada. Por este lado no creo poder ayudar debido a mi escasa experiencia con módulos ethernet/Wi-Fi.


Debo aclararte que si la transmisión se realiza mediante puerto serial, no esperes recibir música MP3 en cuestión de segundos. Aún a 115200 bps la tasa de transferencia apenas alcanza los 10 KB/s (a menos que el hardware externo pueda mantener un ritmo de 2 Mbps)

antoniosanz

Gracias Lucario por la rapida respuesta, estoy intentando hacerlo por bluetooth (son arhivos de 20 kbytes), pero no se que comandos o libreria utilizar.

un saludo

Lucario448

Será Bluetooth vía serial, porque no conozco si algún módulo soporta el protocolo de archivos (ese donde el dispositivo pregunta que si desea recibir un archivo de cierta fuente; como en aquellos tiempos "pre-WhatsApp" donde la gente se compartía multimedios por Bluetooth).

Respecto al transmisor: es cuestión de saber usar la librería SD y el puerto serial en Arduino.
Por lado receptor, no sé donde pretendes desarrollar la aplicación...

antoniosanz

La APP la he hecho en appinventor, pero el problema es q la libreria SD creo q no dispone de ningun comando para la transferencia de archivos.es decir aun no llegue a plantearme la recepcion en el dispositivo android pq no se enenviarlo desde arduino. la pregunta es si hay alguna libreria especifica o alguna manera para hacerlo?

un saludo y gracias nuevamente

surbyte

#5
May 24, 2017, 02:03 pm Last Edit: May 24, 2017, 02:07 pm by surbyte
Mira como hace Android para transferir una foto via BT. A ver si encuentras una forma de hacerlo desde android.
Luego habrá que encontrar el modo desde arduino.

A titulo de idea te dejo este video que muestra una posible maneara.

Y el enlace del foro en inglés de donde lo conseguí. Leelo a ver si te sirve File transfer via Bluetooth Serial Communication

Otra opción para leer Arduino Android Bluetooth File Transfer

Lucario448

La APP la he hecho en appinventor
¿Ah sí? ¿Y como está implementada?
Recuerda que los HC solo soportan el protocolo de puerto serie (SPP), así que básicamente tendremos que reinventar el protocolo de archivos. ¿Tiene AppInventor alguna forma de obtener un valor con 4 bytes?
Antes de recibir un archivo, el programa debe saber el tamaño y el nombre; una vez obtenidos estos datos, la aplicación da la orden al Arduino de enviar todo el contenido.

De antemano debe saberlo para poder autonombrar el archivo resultante (nombre), y saber hasta dónde terminarlo (tamaño).


pero el problema es q la libreria SD creo q no dispone de ningun comando para la transferencia de archivos
No directamente, pero aún así es posible. En escencia sería algo como:
Code: [Select]
//Asumiendo que el archivo acaba de ser abierto para lectura
unsigned long len = archivo.size();

while (len) {
  Serial.write(archivo.read());
  len--;
}
// Envía el contenido entero del archivo mediante puerto serial, en forma binaria.
// Si el contenido es texto plano, en una terminal verás letras y números propiamente, si es otro como una imagen, solo verás caracteres "sin sentido"

antoniosanz

Perdonar por el retraso de la contestacion y gracias lucario por tu dedicacion y conocimiento ,
ya habia pensado en enviar los datos byte a byte, pero complicaba demasiado el codigo por eso yo buscaba una funcion que me automatizase y facilitase el proceso. y respecto a la pregunta (Tiene AppInventor alguna forma de obtener un valor con 4 bytes?) pues no lo se yo envio byte a byte o una cadena con la funcion sprintf.

un saludo

Lucario448

y respecto a la pregunta (Tiene AppInventor alguna forma de obtener un valor con 4 bytes?) pues no lo se yo envio byte a byte o una cadena con la funcion sprintf
Si es texto plano creo que no estan difícil de responder; pero si un archivo binario (imagen, audio, video), ahí es más delicado porque en un archivo binario el contenido es completamente arbitrario; entones la única forma saber dónde termina, es conociendo su tamaño.
El punto es que ese programa en AppInvertor debe saber en qué momento el archivo termina para finalizarlo por el lado del móvil.


Lo del nombre es para automatizar esa parte...

Go Up