Por Fran Acién y David Arias.
El proyecto que se propone realizar es la creación de un dispositivo portable que tome imagenes y las transmita por radio con la codificación SSTV. En la imagen tendrá que tener el indicativo con el que se transmite, y diferentes variables como la posición GPS y la altura.
El dispositivo tendría diferentes usos, el más interesante sería el de globo meteorológico. La posibilidad de tomar imágenes en tiempo real se podía utilizar para tomar imágenes de la atmósfera y recibirlas al instante vía radio.
Se trata de un proyecto transversal que une todas las ramas estudiadas en nuestro grado universitario de Ingeniería de Telecomunicaciones. Las áreas de desarrollo del proyecto son la programación en C, el estudio de los protocolos en los distintos niveles, la creación de sistemas de transmisión, modulaciones analógicas, codificaciones digitales, electrónica en sistemas radio y las comunicaciones por radio.
Adicionamente se hará un segundo transmisor, como mejora, que emitirá radiopaquetes, con el protocolo APRS, con la posición GPS para poder hacer un seguimiento utilizando APRS.fi. De este modo, desde la ground station podremos ver el recorrido del prototipo en el cielo.
Este proyecto se trata de una modificación del trabajo desarrollado por el Laboratorio de Investigación GranaSAT de la Universidad de Granada[1]. En su trabajo[2] desarrollaron un emisor APRS para el envío de información de temperatura, sensores magnéticos, etc.
El enfoque en los dos proyectos es similar, porque utilizan tecnología muy parecida, aunque la información enviada en los dos sistemas es totalmente distinta.
La transmisión de imagenes mediante SSTV y la emisión de radiopaquetes APRS es ampliamente usada en la radioafición. Hacer un prototipo de este estilo sería interesante para la comunidad española. Se podría plantear en el futuro un concurso de recepción de imagenes del cielo tomadas por este prototipo.
Las tareas a desarrollar serán:
De la parte hardware se hará:
Slow-scan television (SSTV) es un método de transmision utilizado por los operadores de radiafición para transmitir y recibir imagenes. Permite transmitir imágenes en blanco y negro o en color a través de radio.
No se necesita de un gran ancho de banda, normalemente solo se utiliza un máximo de 3 kHz. La transmisión de imágenes depende del modo usado, pero oscila entre 8 segundos y 2 minutos.
En las bandas del espectro radioeléctrico asignadas para el servicio de radioafición podemos encontrar frecuencias asignadas para la transmisión de SSTV.En las diferentes bandas podremos encontrar SSTV en las siguientes frecuencias:
Se puede utilizar cualquier modulación, pero lo más común es que para LF y HF se utilice BLU, y para VHF/UHF se utilice FM.
Hay diferentes modos para emitir imágenes usando SSTV. Entre ellos comparten muchas propiedades de codificación, y se diferencian mayormente en los tiempos de sincronización, frecuencias usadas y calidad de imagen. Esto hace que algunos modos sean más rápidos transmitiendo imagenes que otros.
Por lo general la emisión tendrá el siguiente espectro:
Al incio de la transmision se envía un tono de 1900 Hz durante 300 ms que se utiliza para la calibrar. Se llama Calibration Header o Leader tone.
Después se transmite el VIS Code. Un código digital, único para cada modo, que identifica el modo de recepción del sistema.
Acto seguido se incia la transmisón que consiste en la emisión de las lineas horizontales de derecha a izquierda. La codificación de los colores puede cambiar entre los modos, pero normalemente se emite la intensidad del color verde de la linea pixel a pixel horizontalmente, luego con el color azul y finalmente con el rojo. Al cambiar de color se emite un tono de de sincronización, Sync Pulse, y otro entre salto de lineas Sync Porch.
También hay que destacar que se suele emitir una melodía antes de emitir SSTV, que es comúnmente llamado VOX tone, pero este no pertenece al protocolo.
Para la realización de este proyecto hemos elegido el modo Scottie 1. Es un modo que transmite en color y es ampliamente usado en el mundo de la radioafición. Su desventaja es el tiempo de emisión que es de 109.6 segundos.
La banda de radioafición que vamos a utilizar será VHF por las dimensiones que tendrán las antenas. Y la modulación que usaremos será FM.
La especificación del protocolo lo podremos encontrar en barberdsp.com (Dayton SSTV forum, 20 May 2000). Pero explicaré en este documento de una forma más liviana cómo se transmite.
Con el protocolo Scottie 1 tenemos algunas limitaciones, como puede ser la dimesión de la imagen (320x256 px). A diferencia que otros modos la secuencia de escaneo por colores es verde, azul y rojo, emitiendose el Sync Porch al finalizar la transmisión del color azul.
Propiedad | Valor |
---|---|
VIS CODE | 60d (0111100) |
Modo de color | RGB(1500-2300Hz) |
Secuencia de escaneo | Gren, Blue, Red |
Número de lineas | 256 |
Dimensiones de la imagen | 320x256 px |
Tiempo de transmisión | 109.6 s |
Tiempo de escaneo por linea | 138.2440 ms |
Tiempo de escaneo por pixel | 0.4320 ms |
En el caso de Scottie 1 tendremos los siguientes valores de temporización:
Variable | Valor |
---|---|
Tiempo de emisión de un pixel | 0.4320 ms/pixel |
Tiempo de emisión de una linea | 138.240 ms (0.4320 ms/pixel @ 320 pixels/line) |
Separator pulse | 1.5 ms / 1500 Hz |
Sync pulse | 9.0 ms / 1200 Hz |
Sync porch | 1.5 ms / 1500 Hz |
La secuencia de emisión será de la siguiente forma.
(1) "Starting" Sync pulse 9.0 ms 1200 Hz
(2) Separator pulse 1.5 ms 1500 Hz
(3) Green scan 138.240 ms (0.4320ms/pixel @ 320 pixels/line)
(4) Separator pulse 1.5 ms 1500 Hz
(5) Blue scan 138.240 ms (0.4320ms/pixel @ 320 pixels/line)
(6) Sync pulse 9.0 ms 1200 Hz
(7) Sync porch 1.5 ms 1500 Hz
(8) Red scan 138.240 ms (0.4320ms/pixel @ 320 pixels/line)
Después de la primera linea, se repiten los pasos 2-8 para la emisión de las siguientes lineas.
La emisión del color de cada pixel se hará transmitiendo una frecuencia indicando el brillo de la imagen. Esto es, los colores se codificarán en 24-bit RGB.
El color blanco (el máximo valor) codificado en 24-bit RGB será #FFFFFF
o RGB(255, 255, 255)
. El rojo se codificaría como #FF0000
o RGB(255, 0, 0)
. Para extraer los componentes de brillo de cada color ser haría:
RedByte = colorval & 0x0000FF;
GreenByte = colorval & 0x00FF00 >> 8;
BlueByte = colorval & 0xFF0000 >> 16;
Los modos de SSTV transmiten los colores en las frecuencias 1500-2300 Hz, representando el brillo de cada componente de color. Para transmitir los colores los tonos tomarán las frecuencias del siguiente modo:
Frecuencia = 1500 + (3.1372549 * ColorByte)
Con todo lo expuesto anteriormente somos capaces de crear un codificador SSTV. Se adjunta el código de lo que sería un codificador SSTV Scottie 1 utilizando un psuedo-C para que sea más explicativo. En este ejemplo se supone que myFile
es un stream en los que los pixeles están guardados en binario de la forma RedByteGreenByteBlueByte sucesivamente.
//Methods prototypes
void transmit(int freq, int duration); // Generate a sinus signal with the given freq and time
void myFile.read(); // Return the next byte of a stream (myFile)
/** VOX TONE (OPTIONAL) **/
transmit(1900, 100);
transmit(1500, 100);
transmit(1900, 100);
transmit(1500, 100);
transmit(2300, 100);
transmit(1500, 100);
transmit(2300, 100);
transmit(1500, 100);
/** CALIBRATION HEADER **/
transmit(1900, 300);
transmit(1200, 10);
transmit(1900, 300);
transmit(1200, 30);
transmit(1300, 30); // 0
transmit(1300, 30); // 0
transmit(1100, 30); // 1
transmit(1100, 30); // 1
transmit(1100, 30); // 1
transmit(1100, 30); // 1
transmit(1300, 30); // 0
transmit(1300, 30); // Even parity
transmit(1200, 30); // VIS stop bit
/** STARTING SYNC PULSE (FIRST LINE ONLY) **/
transmit(1200, 9);
/** TRANSMIT EACH LINE **/
while(myFile.available()){
// Read line and store color values in the buffer
for(uint16_t i = 0; i < 320; i++){
buffR[i] = myFile.read(); // Read Next Byte
buffG[i] = myFile.read();
buffB[i] = myFile.read();
}
// Separator pulse
transmit(1500, 1.5);
// Green Scan
for(uint16_t i = 0; i < 320; i++){
transmit(1500 + 3.1372549 * buffG[i], 0.4320); // .4320ms/pixel
}
// Separator Pulse
transmit(1500, 1.5);
// Blue Scan
for(uint16_t i = 0; i < 320; i++){
transmit(1500 + 3.1372549 * buffB[i], 0.4320); // .4320ms/pixel
}
// Sync Pulse
transmit(1200, 9);
// Sync porch
transmit(1500, 1.5);
// Red Scan
for(uint16_t i = 0; i < 320; i++){
transmit(1500 + 3.1372549 * buffR[i], 0.4320); // .4320ms/pixel
}
}
Con todas estas pecularidades del protocolo SSTV tenemos que aclarar algunas cosas antes de integrarlo en nuestro microcontrolador.
El Sistema Automático de Reporte de Paquetes, o por sus siglas en inglés, APRS es un protocolo para la comunicación en tiempo real vía radio. Su uso más frecuente es el de la transmisión de datos GPS, pero su utilidad se extiende a cualquier otro tipo de información como puede ser mensajes de texto, así como distintos parámetros sensoriales como la temperatura, o la humedad. En resumen, APRS es un protocolo muy útil para la transmisión amateur de pequeñas cantidades de datos.
APRS es un protocolo no orientado a la conexión, es decir, permite la comunicación sin ser precisa la conexión previa entre dos estaciones, de esta manera los paquetes no reciben su correspondiente ACK y no son retransmitidos en caso de pérdida. Es importante aclarar que APRS funciona en formato broadcast, haciendo su uso incompatible con la información más sensible, ya que cualquier usuario puede leer los paquetes.
Los paquetes APRS son posteriormente modulados y convertidos en tonos de audio y viceversa a través del Terminal Node Controler (TNC). Para ello utiliza el protocolo de nivel de enlace AX.25 en la modulación AFSK, con una velocidad de transmisión muy modesta, de 1200 baudios. Esto puede provocar la congestión de tráfico APRS en el canal de radio en el caso de haber muchas estaciones transmitiendo, es por ello que es altamente aconsejable que dichas estaciones transmitan la señal de identificación (BEACON) el menor número de veces necesarias. Para operar en Europa es necesario un receptor con una frecuencia de 144.800 MHz.
Dado que el alcance es limitado, entre la comunidad de usuarios de APRS acabó popularizándose la plataforma aprs.fi, de esta manera todas las estaciones bases pueden compartir en internet todos los paquetes que reciben.
Más información se puede encontrar en la descripción del propio protocolo de APRS: http://www.aprs.org/doc/APRS101.PDF
Explicado el objetivo del proyecto los componentes que usaremos serán los siguientes:
Para la programación del microcontrolador usaremos Platform io con Atom. Hemos optado por este software y no el del fabricante, Arduino IDE, por ser más profesional y más organizado. Con Platform io podremos desarrollar el proyecto especificando las versiones que estamos usando de las librerías. Esto luego será importante de cara a publicar el proyecto para que esté bien documentado y organizado.
El lenguaje de programación será C++, usando el framework de Arduino.
Para la creación de la PCB usaremos KiCAD. Otros software's de competencia pueden ser más profesionales, pero KiCAD es bastante potente y es software libre. La principal razón por lo que lo hemos elegido es porque es libre.
El trabajo desarrollado hasta el hito intermedio de la parte hardware ha sido el siguiente:
El trabajo desarrollado en Kicad se puede encontrar en el siguiente repositorio.
El prototipo montado es el siguiente:
El trabajo desarrollado hasta el hito intermedio de la parte software es el siguiente:
Todo el código de la parte de SSTV se puede encontrar en este repositorio.
El código desarrollado de la parte de APRS se puede encontrar en este repositorio
Laboratorio de investigación en el área aroespacial de la universidad de Granada. https://granasat.ugr.es ↩︎
Sánchez Velasco, L. (2017). Design of an embedded camera with an AX. 25 transmitter. Source: http://digibug.ugr.es/bitstream/10481/48017/1/SanchezVelasco_TFG_AX.25.pdf ↩︎
Transceptor Radio de VHF/UHF de hasta 1 W de potencia. Fuente ↩︎
Cámara con módulo CMOS VGA de OmniVision de alta calidad con soporte de compresión JPEG. Fuente ↩︎
Sintetizador AD9850 de Analog Devices que utiliza una avanzada tecnología DDS unida con un convertidor D/A interno, de alta velocidad y alto rendimiento, y un comparador para formar un sintetizador de frecuencia completa, programable digitalmente y función de generador de reloj. Fuente ↩︎
Pequeño GPS con chip MTK3339 de 10Hz y 66 canales. Fuente ↩︎
Sensor que cuenta con giroscopio/acelerómetro LSM6DS33, un magnetómetro LIS3MDL y un barómetro LPS25H. Fuente ↩︎
Placa Arduino basada en ARM de 32-bit. Cuenta con 54 pines digitales de entrada y salida, y 12 pines de entrada analógica. Fuente ↩︎
Batería Lipo 4000mAh / 3.7V con protector de voltaje. Fuente ↩︎
Cargador LiPo con convertidor de voltaje de 5V y 1 AmperioFuente ↩︎