Transmitir imagenes con Arduino por RF

Buenas, estoy realizando un proyecto y tengo un par de inconvenientes (principalmente en la programación), pido ayuda o comentarios por favor si alguien sabe mas de este tema.
Lo que estoy tratando de hacer es utilizar estos módulos de radiofrecuencia 1543297222835.png para enviar fotografías tomadas con la cámara web de una laptop por medio del transmisor RF, hacia otra computadora donde estará el receptor de RF en donde tratare de procesar la imagen aplicándole un filtro.Para realizar esto estoy haciendo uso de los módulos de RF y dos arduinos.
El problema que tengo en este momento es que no se como programar para poder enviar una imagen jpg por medio del puerto serial de arduino. Estoy haciendo uso además del programa processing que es donde tomo la imagen y de ahí se la tengo que pasar a arduino para que la transmita por el puerto serial.
Alguna persona que me pueda ayudar o que sepa mas de este tema, se lo agradecería, saludos y gracias.
 

Adjuntos

  • 1543297222835.png
    1543297222835.png
    842.8 KB · Visitas: 9
No veo que es lo que pintan unos arduinos ahí enmedio. No van a aportar nada bueno y si muchísimos problemas, pero muchos muchos.

Algo así lo veo mas lógico:
Módulos RF Wireless APC220 w / Antenas / convertidor USB para Arduino

En ese kit lleva un solo adaptador USB pero lo lógico sería usar dos directamente uno en cada PC sin usar arduinos.
Seguramente exista eso mismo mas comercial en caja ya cerrado para conectar y listo.
Los usé hace tiempo para comunicar un arduino y un PC pero se pueden usar entre dos PCs directamente, los módulos ya montan una "red"

Tampoco entiendo el motivo de usar dos PCs ni el motivo de comunicarlos por RF al precio que están las tarifas 3G hoy en día, creo que yo solo usaría un PC y de ahí ya a internet por 3G, o XG
Eso o comprar tarjetas WIFI con una antena direccional y conectarlos directamente, menos inventos, los USBs wifi con antena conectable están baratos. Por ejemplo:
150Mbps adaptador inalámbrico USB WiFi 802.11n red Lan tarjeta w / Antena
 
Estas hablando de convertir señales digitales a analógicas... Luego enviarlo por medio de RF y decodificarlo por datos seriales a una PC...

Primero necesitas saber como e procesa una imagen, RAW, JPG, entre otros, Esto requiere conocimientos avanzados, yo partiría primero en tratar de "comprimirla" o "encapsular" la imagen, luego ya despues intentas enviarla.
 

Dr. Zoidberg

Well-known-Papá Pitufo
El problema que tengo en este momento es que no se como programar para poder enviar una imagen jpg por medio del puerto serial de arduino.
Una imagen jpg no es mas que gran paquete de datos binarios, asi que no hay mas que hacer que enviar byte x byte de cada fila por el puerto serie y listo, tal vez agregando algunos delimitadores para la imagen completa y para cada fila, aunque si conocés la resolución esto es completamente innecesario.
 
Última edición:
Muchas gracias por las respuestas, el motivo de hacerlo con radio frecuencias es por que llevo una materia en la escuela donde estamos viendo estos temas, para presentarlo como proyecto final, además que ya contamos con el material y no nos gustaría gastar mas dinero.
 
Hola...Lo que intentas hacer hace muchos años los radioficionados lo hacen en el modo SSTV(Slow Scan TV), es lento ya que se va emitiendo punto por punto y linea por linea de la imagen( mas resolución, mas lerdo) pero permite emitir por radio y de forma serie una imagen y recibirla aun estando a mucha distancia(obviamente no con esos módulos).

Mas antiguamente el FAX que actualmente aun usan algunos satélites meteorológicos para enviar a la tierra las imágenes tomadas desde el espacio.

Ambos método usan la modulación AFSK (Audio Frequency Shift Keying)donde un tono de frecuencia corresponde a la marca y otro distinto pero menor al doble del segundo al espacio o si quieres al 1 lógico o al 0 lógico.

Hay poco para inventar al respecto que ya no se hubiera experimentado en ese u otros ámbitos.

Saludos.

Ric.
 
Muchas gracias por las respuestas, el motivo de hacerlo con radio frecuencias es por que llevo una materia en la escuela donde estamos viendo estos temas, para presentarlo como proyecto final, además que ya contamos con el material y no nos gustaría gastar mas dinero.
Pues precisamente por eso tiene menos sentido aún hacer un proyecto para demostrar como no se hacen las cosas y enseñar a tomar decisiones erróneas.
Tomar un archivo digital y pasarlo por ahí es absurdo.
Simplemente haz un interruptor remoto por decir algo o un timbre de puerta inalámbrico...
 
Que te parece este artículo:
Enviar una imagen o un archivo de Texto por el puerto serie, y programandolo por C#

Claro... no es lo que buscas pero el método explicado, te puede funcionar:

Enviar y recibir .txt y .jpg por puerto serie con C#

Este otro trata del mismo pero aplicado a un Microcontrolador PIC
Enviar y recibir .txt y .jpg por puerto serie con C# - Foros Club Delphi

Y un video:

Y aqui hablan de un proyecto exitoso el cul pudieron enviar una imagen por puerto serial, con ejemplos:

Transmisión de imágenes de Matlab a Arduino vía puerto serial
 
M

Miembro eliminado 356005

El problema que tienes es el de definir un protocolo.

Estamos partiendo del supuesto que tienes dos Arduinos con módulos RF que son capaces de comunicarse. El problema es cómo transmitir vía serie un archivo binario que tenemos en uno de los ordenadores, al otro.

Si simplemente envías el flujo de bytes que componen la imagen, ¿cómo sabría el Arduino destino cuánto de esos bytes corresponden al propio archivo binario, o se trata de otra información, como el nombre, fecha de adquisición... o un comando, como: repetir el envío, cortar la transmisión, dormir durante X tiempo...

Lo más sencillo es hacer que se intercambien bytes ¿de acuerdo? Te has leído la documentación de los dispositivos RF y sabes cómo Arduino tiene que hablar con ellos para que se conecten y se intercambien información. A partir de ahí, debes crear un protocolo de comunicación entre ellos.

Se podría usar alguno de los estándares, como MQTT, pero para algo sencillo como lo que pides, que es transmitir un archivo, puedes inventarte una serie de comandos, como estos

HELO from #1 (saludo desde el emisor)
HELO from #2 (saludo desde el receptor)
PUT imagen.jpg 20181130034111 98654 (el emisor envía los datos de un archivo a enviar, con el nombre, tiempo y tamaño en bytes)
OK (respuesta del receptor)
... (transmisión en binario de 98654 bytes)
MD5 58496548f75a274adc47626d93fded5f (el receptor envía la suma md5 del archivo para comprobar que se ha enviado bien)
OK (respuesta del emisor confirmando que el md5 es correcto)

Se parece un poco al protocolo FTP. No tienes por qué usar algo como MD5 para saber si una transmisión es incorrecta: si no llega la cifra exacta de bytes, es debido a un corte en la transmisión, por lo que solicitarás el reenvío.

Debes pensar en los peores casos. ¿Qué hacer si se corta la transmisión a la mitad? El Arduino que recibe debe marcarse un tiempo máximo de espera sin recibir nada. Si pasa ese tiempo, vuelve al modo de comando, y espera el saludo del emisor. Todo lo que llegue antes de ese saludo, se descarta. ¿Qué hacer si la suma md5 no es correcta? Mandar un mensaje BADCHK. El emisor deberá volver a hacer el PUT.
 
Pues precisamente por eso tiene menos sentido aún hacer un proyecto para demostrar como no se hacen las cosas y enseñar a tomar decisiones erróneas.
Tomar un archivo digital y pasarlo por ahí es absurdo.
Simplemente haz un interruptor remoto por decir algo o un timbre de puerta inalámbrico...
No estoy de acuerdo que no tenga sentido, en especial si lo vemos desde el punto de vista del aprendizaje involucrado. Que no sea la manera mas correcta de hacerlo es otra cosa, pero definitivamente prefiero cometer errores y aprender de ellos (tal y como esta pasando en este momento hahah) a conformarme con un simple proyecto que no me dejara los mismos conocimientos.
 
Yo igual, Si así es como se aprende... Pues que mejor experiencia. Además no sabemos si haciendo esto, él descubra algo y lo implemente, Recordemos que por error sucedieron muchas cosas.

Desde Mtlab, a Arduino, la explicación que encontré me interesó mucho, es por eso que se lo compartí.
 
Esos módulos te van a traer muchos problemas a la hora de de establecer una comunicación "larga" y estable. Como dijieron arriba, están pensados para comunicaciones simples de poca información.

Como experiencia si te sirve, con ese tipo de módulos implementé un protocolo de unos pocos bytes (20 como mucho) con retransmisión y la cantidad de paquetes que se perdían eran muy altos a medida que te alejabas (15/30 mts indoor).

Los APC220 que se mencionan arriba son muy buenos módulos, pero creo que para ese tipo de aplicaciones te conviene algo más estándar, por ej. un módulo WiFi tipo ESP.
 
Yo la verdad no lo veo imposible de hecho hice algo parecido cuando estudiaba.
Bueno enviar un BMP de una PC a una memoria RAM vía rs232.

Lo que tienes que hacer es simple:
Tienes que escribir un programa en visual C que abra un .BMP y tienes que leer pixel por pixel el rojo verde y azul y los vaz enviado hasta EOF
Para eso necesitas que el programa reconozca ancho y largo de imagen y que valide la profundidad de bits

También se puede hacer en Turbo C pero es más complicado ya lo hice.

Para poder usar esos módulos RF no es usar RS232 así de crudo.
Va a fallar por qué fallara no estan hechos para envías baudios.

Tienes que basarte en una trama de datos parecido al de un control remoto de TV.

Un start bit de N milisegundos de ancho debe ser más ancho que un cero o un uno.
El uno debe medir de ancho diferente al cero y deben ser menos anchos que start bit y usar un código de línea
Puede ser NRZ o Manchester .

Y después haces un envío de bits pueden ser 8 o los que necesites.

Después el receptor debe leer al menos 4 veces el dato enviado y si el dato enviado no se parece al que se envió se descarta.

En resumen una transmisión súper lenta.

Pero no imposible

Y después el receptor debe reconstruir el binario y fabricar byte a byte el BMP.

Debes hacer un BMP chiquito y de preferencia blanco y negro te ahorras enviar de a 3 bytes.

Yo que tú :
Lloraría, reprobaria , me pondría a estudiar repostería ó cambiaría a enviar audio .

De un ADC lees audio lo envías por rs232 y el receptor Lee los datos por rs232 y con un DAC r2r volvería a reconstruir el audio.

Suena más fácil.
 
M

Miembro eliminado 356005

Si el protocolo que te he recomendado antes no es capaz de transmitir grandes volúmenes de información, prueba a dividir el archivo a enviar en paquetes más pequeños.

Un estudiante de por aquí se le ocurrió hacer una división binaria según la calidad de la transmisión. Lo explico:

Partiendo de la premisa de que el origen ha conseguido comunicar al destino el nombre, tamaño y MD5 del archivo original, intentará enviarlo de una sola vez y esperar respuesta. Irá precedido de un comando que informe a destino del formato de transmisión:

SENDING #1/1

Si al enviarlo ha ocurrido un fallo (no coincide el MD5, se ha perdido la conexión, se ha recibido menos...) el destino y el origen se intercambian los mensajes de error, y el origen envía otro comando

SENDING #1/2

indicando que se va a enviar el primer paquete de 2, siendo estos la mitad de tamaño del original. En caso de ser un archivo de tamaño impar, se considera que en la transmisión es de tamaño igual al tamaño original más 1, por lo que el segundo paquete envía un byte 0 más de relleno, pero que el destino no lo tiene en cuenta a la hora de grabarlo en memoria o disco. Entre cada paquete se pone un breve pausa.

Lo mismo que antes, si se produce un error, se repite pero volviendo a dividir por 4:

SENDING #1/4

De esta forma los paquetes se van reduciendo muy rápidamente de tamaño, hasta que "encajan" con el nivel de ruido del ambiente y el destino es capaz de recibir todo el archivo.

Este método puede funcionar muy bien, pero... tiene un inconveniente: si las perturbaciones que han obligado a reducir el tamaño del paquete son momentáneas, lo ideal sería que en mitad de la transmisión se volviese a aumentar. Esto es una mejora que se propuso y salió bien. Un ejemplo sería la siguiente secuencia:

SENDING #1/4
...
SENDING #2/4
...
SENDING #2/2
...

Es un caso simplificado, desde luego. Muestra que después de enviar el segundo paquete de un total de cuatro, se decide enviar la segunda mitad del archivo de una sola vez.

Otro caso que sería una mejora mucho mayor sería que el destino solicitase el reenvío de un solo paquete en lugar del archivo entero.

Esto se puede añadir a la posibilidad de cambiar la velocidad de transmisión, si con una velocidad menor la transmisión mejora.
 
Yo opino que envíe audio en banda base.
Nada de formatos por qué es meterse en programación, así crudo el audio no se nota cuando se pierden unos cuantos bits.

Eso lo hice una vez que un cuate se fue a examen a título y me dijo ayúdame a pasar y lo que se me ocurrió fue enviar por RS232 audio crudo a otro pic y por puerto B y R2R hacer un DAC y reconstruir el audio.

Obviamente el ADC debe estar en modo 8 bits y muestrear por teorema Nyquist y calcular la tasa de baudrate para enviar
Cómo 232 funciona envíando 8 bits queda muy bien.
El audio es un tanto cuanto nítido obviamente hay que amplificar el DAC con un lm386 y una bocinita

Yo creo que con los módulos RF se perderían datos y muchos pero no sé notaría tanto
 
Yo igual, Si así es como se aprende... Pues que mejor experiencia. Además no sabemos si haciendo esto, él descubra algo y lo implemente, Recordemos que por error sucedieron muchas cosas.

Desde Mtlab, a Arduino, la explicación que encontré me interesó mucho, es por eso que se lo compartí.
Me base en este mismo trabajo, me parecio mas sencillo con matlab despues de verlo.
Hasta ahora e logrado transmitir los datos de la imagen y recibirlos Dat.jpeg obteniendo lo siguiente:
Imagen original enviada:En.jpeg
Imagen recibida : Re.jpeg
Ahora me pude percatar por mi mismo de todos los problemas relacionados, desde la velocidad de transmisión, la cantidad de datos , el error generado por los módulos, etc, todos los problemas que me habían mencionado anteriormente se hicieron presentes jajaj.
El mas notorio fue el que se comento mas arriba de la comunicación larga y estable, pude notar que conforme mas pasaba tiempo en la transmisión existía mayor error en la recepción de los datos.
Estoy conciente que la mayoria de esos errores no se corregiran a menos que cambie de modulos , intente de otra manera,etc. aun asi buscare implementar un protocolo como los que me sugirieron para ver que tanto se puede mejorar la fiabilidad de la comunicación.
 

Adjuntos

  • Dat.jpeg
    Dat.jpeg
    140.5 KB · Visitas: 15
  • En.jpeg
    En.jpeg
    27 KB · Visitas: 17
  • Re.jpeg
    Re.jpeg
    32.1 KB · Visitas: 15
Última edición:
En verdad no creo que sea imposible por qué no hay imposibles.
Más bien pienso que debes conocer perfectamente bien el ancho de banda de los módulos y en base a ese ancho de banda puedes sacar el baudrate de transmisión de datos.
Y en base a eso puedes saber a qué velocidad puedes enviar datos .
No creo que puedas enviar rs232 por qué esos módulos no están preparados para tal fidelidad más bien debes hacer una transmisión para un medio ruidoso como un código de línea NRZ o basarte en una trama como las que usan los controles IR de TV.

Lo demas es programación
 
Arriba