# Globo meteorológico - SSTV y APRS Por Fran Acién y David Arias. ## Introducción 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. <div style="text-align:center; margin-bottom:20px"><img src="https://i.imgur.com/WHgbSR4.png" height="200" /></div> 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](https://aprs.fi/#!lat=36.7496&lng=-3.0206). De este modo, desde la *ground station* podremos ver el recorrido del prototipo en el cielo. <div style="text-align:center; margin-bottom:20px"><img src="https://i.imgur.com/cCdA6YM.png" height="200" /></div> ### Origen y fundamento del proyecto Este proyecto se trata de una modificación del trabajo desarrollado por el Laboratorio de Investigación GranaSAT de la Universidad de Granada[^Granasat]. En su trabajo[^tfg_ugr] 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. ### Actividades a realizar: denominación, descripción y metodología Las tareas a desarrollar serán: 1. Estudio del protocolo SSTV 3. Estudio del protocolo APRS 1. Creación de middleware para la tomar imágenes con arduino. 2. Creación de middleware para guardar los valores de los sensores. 3. Crear una librería en C, que dada una imagen emita en banda base con la codificación SSTV. 4. Crear una librería en C, que dados unos valores de posición la emita según el protocolo APRS utilizando PWM. 5. Creación de la librería para la comunicación con el transmisor radio. 6. Programación del dispositivo utilizando las librerias desarrolladas anteriormente. De la parte hardware se hará: 1. Estudio de los módulos que componen el proyecto con sus datasheets. 8. Familiarizarse con todos los módulos. 9. Creación del circuito electrónico que interconecten todos los módulos. 10. Creación de la antena. 11. Creación de una caja para el dispositivo desarrollado. ## Especifiación del protocolo SSTV 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. ### Propiedades de transmisión 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: * **Banda de 80 m**- 3.735 MHz * **Banda de 40 m**- 7.165 MHz * **Banda de 20 m**- 14.230 MHz * **Banda de 15 m**- 21.340 MHz * **Banda de 10 m**- 28.680 MHz * **Banda de 6 m**- 50.510 MHz * **Banda de 2 m**- 144.500 MHz * **Banda de 70 cm**- 433.400 MHz 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. ### Transmisión de SSTV 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: <div style="text-align:center; margin-bottom:20px"><img src="https://upload.wikimedia.org/wikipedia/commons/thumb/7/7d/SSTV_signal.jpg/300px-SSTV_signal.jpg" height="200" /><br>Espectrograma del inicio de una transmisión SSTV. Mysid 2007 http://wikipedia.com</div> 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. ### Elección del modo, banda y modulación 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. ### Especificación del modo Scottie 1 La especificación del protocolo lo podremos encontrar en [barberdsp.com (Dayton SSTV forum, 20 May 2000)](http://www.barberdsp.com/downloads/Dayton%20Paper.pdf). 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 | ### Secuencia de emisión 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. ### Codificación del color 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: ```c 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) ``` ### Codificador SSTV Scottie 1 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 } } ``` ### Algunas aclaraciones previas a su integración Con todas estas pecularidades del protocolo SSTV tenemos que aclarar algunas cosas antes de integrarlo en nuestro microcontrolador. * La imagen tendrá que estar codificada en 24-bit RGB pixel a pixel. Es decir, se necesitará pasar la imagen entera a binario para codificarla posteriormente con SSTV. * Se necesitará de un sistema robusto que sea muy preciso con la temporización para que la imagen se envie correctamente. * Los accesos a memoria para guardar los pixeles de las lineas de los 3 colores se tendrá que hacer en el **Sync Pulse** porque es el de más duración (9 ms). De otra forma, el acceso a memoria relentizará la emisión y se perderá la sincronización. ## Especificación del protocolo APRS 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. ![](https://i.imgur.com/1oT08EG.png) 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. ![](https://i.imgur.com/VHvNC2p.jpg) 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 ## Elección del Hardware Explicado el objetivo del proyecto los componentes que usaremos serán los siguientes: * **Transceptor DRA818V[^trans_chino]**: Transceptor compacto de VHF de hasta 1 W de potencia, con interfaz UART. Se usará para la emisión del mensaje de SSTV en 144.500 MHz. * **Cámara JPEG TTL de Adafruit[^camara_adafruit]**: La cámara con la que se tomarán las imagenes del cielo, y que posteriormente se transmitan por SSTV. Toma imagenes de 320x256 pixeles que es lo que necesitaremos para transmitirlas con Scottie 1. Se comunica medianto UART con el microcontrolador. * **Sintetizador digital AD9850[^sinte]**: Un sintetizador digital para generar el mensaje SSTV en banda base. Nos dará la precisión suficiente para transmitir los tonos de los diferentes colores. * **GPS Adafruit GPS MTK3339[^gps_adafruit]**: El módulo que tome la información de posición. Se comunicará mediante UART con el microcontrolador. * **Sensor inercial AltIMU-10 v5[^sensor_inercial]**: Sensor de giroscopio/acelerómetro, magnetómetro y barómetro. Se comunicará mediante I2C con el microcontrolador. * **Arduino Due[^due]**: El microcontrolador encargado del proyecto. Será la unidad de computación del experimento. Hemos elegido el Arduino Due, porque la memoria que nos ofrece y las conexiones se adaptan a nuestro dispositivo. Hemos elegido esta placa porque necesitaremos 3 conexiones UART para los diferentes módulos, necesitamos memoria suficiente para decodificar una imagen entera, y que sea solido. Por estos motivos hemos optado por el Arduino Due. * **Batería Lipo 4000mAh / 3.7V[^bateria_lipo]**: La batería utilizada para el proyecto. La tecnología de polímero de liteo es la indonea para nuestro prototipo porque ofrece grandes prestaciones en poco espacio. * **SparkFun LiPo Charger/Booster - 5V/1A[^booster]**: Adaptador de tensión de la bateria para poder alimentar los equipos. ## Elección de Software ### Programación del microcontrolador Para la programación del microcontrolador usaremos [Platform io](https://platformio.org/) con [Atom](https://atom.io/). Hemos optado por este software y no el del fabricante, [Arduino IDE](https://www.arduino.cc/en/main/software), por ser más profesional y más organizado. Con [Platform io](https://platformio.org/) 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. ### Diseño de la PCB Para la creación de la PCB usaremos [KiCAD](https://www.kicad-pcb.org/). Otros software's de competencia pueden ser más profesionales, pero [KiCAD](https://www.kicad-pcb.org/) es bastante potente y es software libre. La principal razón por lo que lo hemos elegido es porque es libre. ## Parte Hardware [HITO INTERMEDIO] El trabajo desarrollado hasta el hito intermedio de la parte hardware ha sido el siguiente: * Creación de todos los componetes y footprints que se van a usar en Kicad. * Creación del esquemático. Aunque todavía hace falta implementar algunas cosas. * Montaje del prototipo en protoboard de la camara, el módulo SD, el sintetizador de audio y la placa Arduino Due. El trabajo desarrollado en Kicad se puede encontrar en el siguiente [repositorio](https://git.radio.clubs.etsit.upm.es/SSTV-Encoder/SSTV-encoder-kicad). El prototipo montado es el siguiente: <div style="text-align:center; margin-bottom:20px"><img src="https://i.imgur.com/EEr9gSe.jpg" height="400" /></div> ## Parte Software [HITO INTERMEDIO] El trabajo desarrollado hasta el hito intermedio de la parte software es el siguiente: * Se han hecho scripts para comprobar el funcionamiento de los módulos que se han interconectado en el prototipo montado. * Se ha hecho un programa que toma una imagen, la guarda en la SD y la decodifica en binario * Se ha hecho un codificador de SSTV para explicar el protocolo en el apartado anterior de "*Especificación del protocolo SSTV*" pero no es funcional. * Se han hecho funciones para acceder a la camara, al sintetizador, y algunas funciones más. * Generación de la **información APRS** con los parámetros que hayamos introducido (GPS en este caso), no se ha comprobado su funcionamiento. * Construcción del **paquete AX.25** que contiene la información APRS previamente creada, no se ha comprobado su funcionamiento. * La generación de una señal **AFSK** vía PWM a 1200 baudios que se transmite al tranceptor, no se ha comprobado su funcionamiento. Todo el código de la parte de SSTV se puede encontrar en [este repositorio](https://git.radio.clubs.etsit.upm.es/acien101/SDG2-Hito-Intermedio). El código desarrollado de la parte de APRS se puede encontrar en [este repositorio](https://github.com/DavidAriCua/Trackuino_Lite) [^Granasat]: Laboratorio de investigación en el área aroespacial de la universidad de Granada. https://granasat.ugr.es [^tfg_ugr]: 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 [^due]: 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](https://store.arduino.cc/arduino-due) [^trans_chino]: Transceptor Radio de VHF/UHF de hasta 1 W de potencia. [Fuente](https://www.google.com/url?sa=t&source=web&rct=j&url=http://www.dorji.com/docs/data/DRA818V.pdf&ved=2ahUKEwjco5q80P7gAhWKgM4BHav7AY0QFjAKegQIBxAB&usg=AOvVaw21PTigH_2YVwcpxfZbeGBQ) [^camara_adafruit]: Cámara con módulo CMOS VGA de OmniVision de alta calidad con soporte de compresión JPEG. [Fuente](https://tienda.bricogeek.com/sensores/292-camara-jpeg-ttl.html?gclid=Cj0KCQjwjpjkBRDRARIsAKv-0O15hxOqcnCRYisbMLxY1D8BLXdRtmZFyVFV0_483MWxWe7eef1MMlkaAt1MEALw_wcB) [^gps_adafruit]: Pequeño GPS con chip MTK3339 de 10Hz y 66 canales. [Fuente](https://tienda.bricogeek.com/modulos-gps/442-adafruit-gps-mtk3339.html?search_query=gps&results=16) [^sensor_inercial]: Sensor que cuenta con giroscopio/acelerómetro LSM6DS33, un magnetómetro LIS3MDL y un barómetro LPS25H. [Fuente](https://tienda.bricogeek.com/medicion-inercial-imu/884-sensor-inercial-altimu-10-v5.html?search_query=sensor+inercial&results=7) [^bateria_lipo]: Batería Lipo 4000mAh / 3.7V con protector de voltaje. [Fuente](https://tienda.bricogeek.com/baterias-lipo/1228-bateria-lipo-4000mah-37v.html) [^booster]: Cargador LiPo con convertidor de voltaje de 5V y 1 Amperio[Fuente](https://tienda.bricogeek.com/convertidores-de-voltaje/1166-sparkfun-lipo-chargerbooster-5v1a.html) [^sinte]: 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](https://www.digikey.es/es/product-highlight/a/analog-devices/ad9850-cmos-complete-direct-digital-synthesizer)