{"id":235722,"date":"2020-08-15T14:48:44","date_gmt":"2020-08-15T12:48:44","guid":{"rendered":"https:\/\/emariete.com\/?p=235722"},"modified":"2020-08-15T14:48:44","modified_gmt":"2020-08-15T12:48:44","slug":"control-transmitter-video-vtx-fpv-arduino","status":"publish","type":"post","link":"https:\/\/emariete.com\/en\/control-transmisor-video-vtx-fpv-arduino\/","title":{"rendered":"VTX FPV video transmitter control with Arduino"},"content":{"rendered":"\n<h2 class=\"wp-block-heading\" id=\"h-toc\"><\/h2>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"h-como-controlar-un-vtx-de-fpv-con-arduino\">C\u00f3mo controlar un VTX de FPV con Arduino<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Hace alg\u00fan tiempo se me meti\u00f3 en la cabeza <strong>controlar un video transmisor de 1.2 Ghz con un Arduino<\/strong>.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Concretamente, lo que quer\u00eda conseguir era hacer un <strong>analizador de antenas<\/strong>, tambi\u00e9n basado en Arduino (que est\u00e1 hecho y funciona muy bien, tengo que pendiente describir en el Blog como lo hice y publicar el c\u00f3digo) que fuera capaz de hacer un <strong>barrido de frecuencias<\/strong>, por ejemplo desde 1,1 Ghz hasta 1,4 Ghz, con escalones cada pocos Mhz, midiendo la SWR en cada uno de esos escalones para poder capturar todos los datos en Excel y hacer una <strong>gr\u00e1fica de la resonancia de la antena<\/strong> en ese rango de frecuencias.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Estuve buscan mucho por internet y encontr\u00e9 muy poca informaci\u00f3n, de forma que decid\u00ed partir, casi, de cero y hacer todo el an\u00e1lisis del protocolo que utiliza el microprocesador del VTX para comunicarse con su IC PLL (un MB15E07L, fabricado por Fujitsu, que es el circuito integrado que crea la frecuencia de emisi\u00f3n), para saber c\u00f3mo controlarlo, y escribir el c\u00f3digo de Arduino.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Un poquito de ingenier\u00eda inversa no hace da\u00f1o a nadie.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Afortunadamente el usuario&nbsp;Changosurf ya hab\u00eda descrito el protocolo del PLL, aunque a m\u00ed no me funcion\u00f3 tal y como estaba y tuve que hacer m\u00e1s investigaci\u00f3n (los datos del registro latch de 18 bits no funcionaban con mi VTX, ni con ninguno de los que prob\u00e9).<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Encontr\u00e9 tambi\u00e9n un c\u00f3digo que utilice como base, pero, lo siento, como hace varios a\u00f1os que hice este proyecto, no encuentro el autor original para darle cr\u00e9dito.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Todo el proceso lo hice utilizando un <strong>VTX Partom de 800mw, <\/strong>de los m\u00e1s utilizados en aeromodelismo,&nbsp;pero lo bueno es que casi todos los emisores de video que tienen ese aspecto f\u00edsico, como los VTX FOX (y otros muchos), utilizan este mismo PLL y protocolo. De hecho, he probado con otros transmisores de potencias distintas y otros aspectos f\u00edsicos y todos han funcionado correctamente.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"h-que-utilidad-tiene-el-control-con-arduino\">\u00bfQu\u00e9 utilidad tiene el control con Arduino?<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Las utilidades son much\u00edsimas, y solamente la imaginaci\u00f3n es el l\u00edmite.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Adem\u00e1s del ejemplo comentado anteriormente que nos permite variar la frecuencia de emisi\u00f3n de forma autom\u00e1tica para poder analizar antenas podr\u00edamos utilizarlo para:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Cambiar el canal de video<\/strong> de nuestro avi\u00f3n o dron <strong>remotamente<\/strong> por radiocontrol. \u00bfTenemos interferencias en la frecuencia que estamos usando y nuestro aeromodelo est\u00e1 lejos? Pues cambiamos de frecuencia remotamente (podemos hasta <strong>salvar nuestro aparato o evitar una perdida segura<\/strong>).<\/li>\n\n\n\n<li><strong>Utilizar frecuencias no est\u00e1ndar<\/strong>: Los transmisores suelen tener entre uno y ocho canales que podemos seleccionar, esto quiere decir que todo el mundo est\u00e1 en uno de esos canales, si podemos elegir una frecuencia que no coincide con la de ninguno de esos canales podremos<strong> utilizar esa frecuencia para nosotros solos, en exclusiva, sin interferencias.<\/strong><\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"h-arquitectura-de-un-transmisor-de-video-fpv\">Arquitectura de un transmisor de video FPV<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">La arquitectura de un VTX de los utilizados en FPV es bastante sencilla.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">B\u00e1sicamente consta de cuatro bloques b\u00e1sicos:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Circuito de control: el usuario selecciona un canal de emisi\u00f3n mediante unos interruptores o botones y un microcontrolador comprueba a qu\u00e9 frecuencia corresponde ese canal y la codifica de forma que el PLL pueda entenderlo.<\/li>\n\n\n\n<li>Circuito generador de frecuencia o PLL (Phase-locked Loop): Este circuito integrado recibe unos datos desde el microcontrolador que le indica la frecuencia que debe generar.<\/li>\n\n\n\n<li>Circuito de Radio Frecuencia (RF): Este bloque recibe la frecuencia generada por el PLL (que no tiene por qu\u00e9 ser la frecuencia real de emisi\u00f3n) y utilizando esa frecuencia como base generar\u00e1 la frecuencia final, las subportadoras, y la modular\u00e1 con el audio y el video.<\/li>\n\n\n\n<li>Amplificador de potencia: Todo lo anterior se hace con unas potencias extremadamente bajas, es este circuito final el que coge esa se\u00f1al y la multiplica por miles o millones de veces y manda esa se\u00f1al, de alta potencia, a la antena para su emisi\u00f3n.<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">Lo que vamos a hacer aqu\u00ed es sustituir el&nbsp;\u00abCircuito de control\u00bb por el nuestro propio para poder controlar el PLL como queramos.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"h-analisis-del-protocolo-del-pll\">An\u00e1lisis del protocolo del PLL<\/h2>\n\n\n<div class=\"gb-grid-wrapper gb-grid-wrapper-5d13286e\">\n<div class=\"gb-grid-column gb-grid-column-7400dbf1\"><div class=\"gb-container gb-container-7400dbf1\"><div class=\"gb-inside-container\">\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"640\" height=\"480\" src=\"https:\/\/emariete.com\/wp-content\/uploads\/2020\/12\/PLL-lineas-de-datos.jpg\" alt=\"PLL VTX FOX Partom\" class=\"wp-image-235738\" srcset=\"https:\/\/emariete.com\/wp-content\/uploads\/2020\/12\/PLL-lineas-de-datos.jpg 640w, https:\/\/emariete.com\/wp-content\/uploads\/2020\/12\/PLL-lineas-de-datos-300x225.jpg 300w\" sizes=\"auto, (max-width: 640px) 100vw, 640px\" \/><\/figure>\n\n<\/div><\/div><\/div>\n\n<div class=\"gb-grid-column gb-grid-column-365bda85\"><div class=\"gb-container gb-container-365bda85\"><div class=\"gb-inside-container\">\n\n<p class=\"wp-block-paragraph\">Lo primero que hice fue, antes de realizar ninguna modificaci\u00f3n en el hardware del transmisor, <strong>analizar los datos en las l\u00edneas de comunicaci\u00f3n del PLL<\/strong>,&nbsp;con ayuda de mi <a href=\"https:\/\/amzn.to\/3htXz4y\" target=\"_blank\" rel=\"noreferrer noopener nofollow\">osciloscopio RIGOL DS1054Z&nbsp;<\/a><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">A continuaci\u00f3n, fui cambiando de canal, manualmente, y con el osciloscopio (conectado temporalmente al VTX con unos cablecillos) capturar los datos que el microcontrolador PIC enviaba al VTX.<\/p>\n\n<\/div><\/div><\/div>\n<\/div>\n\n\n<p class=\"wp-block-paragraph\">A continuaci\u00f3n, puedes ver las capturas que hice al cambiar a los diferentes canales:<\/p>\n\n\n\n<figure class=\"wp-block-gallery has-nested-images columns-3 is-cropped wp-block-gallery-2 is-layout-flex wp-block-gallery-is-layout-flex\">\n<figure class=\"wp-block-image size-large\"><a href=\"https:\/\/emariete.com\/wp-content\/uploads\/2020\/08\/CH-7.png\"><img loading=\"lazy\" decoding=\"async\" width=\"800\" height=\"480\" data-id=\"235726\" src=\"https:\/\/emariete.com\/wp-content\/uploads\/2020\/08\/CH-7.png\" alt=\"\" class=\"wp-image-235726\" srcset=\"https:\/\/emariete.com\/wp-content\/uploads\/2020\/08\/CH-7.png 800w, https:\/\/emariete.com\/wp-content\/uploads\/2020\/08\/CH-7-300x180.png 300w, https:\/\/emariete.com\/wp-content\/uploads\/2020\/08\/CH-7-768x461.png 768w\" sizes=\"auto, (max-width: 800px) 100vw, 800px\" \/><\/a><\/figure>\n\n\n\n<figure class=\"wp-block-image size-large\"><a href=\"https:\/\/emariete.com\/wp-content\/uploads\/2020\/08\/CH-9.png\"><img loading=\"lazy\" decoding=\"async\" width=\"800\" height=\"480\" data-id=\"235728\" src=\"https:\/\/emariete.com\/wp-content\/uploads\/2020\/08\/CH-9.png\" alt=\"Captura CH 9 VPX Partom FPV\" class=\"wp-image-235728\" srcset=\"https:\/\/emariete.com\/wp-content\/uploads\/2020\/08\/CH-9.png 800w, https:\/\/emariete.com\/wp-content\/uploads\/2020\/08\/CH-9-300x180.png 300w, https:\/\/emariete.com\/wp-content\/uploads\/2020\/08\/CH-9-768x461.png 768w\" sizes=\"auto, (max-width: 800px) 100vw, 800px\" \/><\/a><\/figure>\n\n\n\n<figure class=\"wp-block-image size-large\"><a href=\"https:\/\/emariete.com\/wp-content\/uploads\/2020\/08\/CH-C.png\"><img loading=\"lazy\" decoding=\"async\" width=\"800\" height=\"480\" data-id=\"235729\" src=\"https:\/\/emariete.com\/wp-content\/uploads\/2020\/08\/CH-C.png\" alt=\"Captura CH C VPX Partom FPV\" class=\"wp-image-235729\" srcset=\"https:\/\/emariete.com\/wp-content\/uploads\/2020\/08\/CH-C.png 800w, https:\/\/emariete.com\/wp-content\/uploads\/2020\/08\/CH-C-300x180.png 300w, https:\/\/emariete.com\/wp-content\/uploads\/2020\/08\/CH-C-768x461.png 768w\" sizes=\"auto, (max-width: 800px) 100vw, 800px\" \/><\/a><\/figure>\n\n\n\n<figure class=\"wp-block-image size-large\"><a href=\"https:\/\/emariete.com\/wp-content\/uploads\/2020\/08\/CH-H.png\"><img loading=\"lazy\" decoding=\"async\" width=\"800\" height=\"480\" data-id=\"235730\" src=\"https:\/\/emariete.com\/wp-content\/uploads\/2020\/08\/CH-H.png\" alt=\"Captura CH H VPX Partom FPV\" class=\"wp-image-235730\" srcset=\"https:\/\/emariete.com\/wp-content\/uploads\/2020\/08\/CH-H.png 800w, https:\/\/emariete.com\/wp-content\/uploads\/2020\/08\/CH-H-300x180.png 300w, https:\/\/emariete.com\/wp-content\/uploads\/2020\/08\/CH-H-768x461.png 768w\" sizes=\"auto, (max-width: 800px) 100vw, 800px\" \/><\/a><\/figure>\n\n\n\n<figure class=\"wp-block-image size-large\"><a href=\"https:\/\/emariete.com\/wp-content\/uploads\/2020\/08\/CH-4.png\"><img loading=\"lazy\" decoding=\"async\" width=\"800\" height=\"480\" data-id=\"235731\" src=\"https:\/\/emariete.com\/wp-content\/uploads\/2020\/08\/CH-4.png\" alt=\"Captura CH 4 VPX Partom FPV\" class=\"wp-image-235731\" srcset=\"https:\/\/emariete.com\/wp-content\/uploads\/2020\/08\/CH-4.png 800w, https:\/\/emariete.com\/wp-content\/uploads\/2020\/08\/CH-4-300x180.png 300w, https:\/\/emariete.com\/wp-content\/uploads\/2020\/08\/CH-4-768x461.png 768w\" sizes=\"auto, (max-width: 800px) 100vw, 800px\" \/><\/a><\/figure>\n\n\n\n<figure class=\"wp-block-image size-large\"><a href=\"https:\/\/emariete.com\/wp-content\/uploads\/2020\/08\/CH-5.png\"><img loading=\"lazy\" decoding=\"async\" width=\"800\" height=\"480\" data-id=\"235732\" src=\"https:\/\/emariete.com\/wp-content\/uploads\/2020\/08\/CH-5.png\" alt=\"Captura CH 5 VPX Partom FPV\" class=\"wp-image-235732\" srcset=\"https:\/\/emariete.com\/wp-content\/uploads\/2020\/08\/CH-5.png 800w, https:\/\/emariete.com\/wp-content\/uploads\/2020\/08\/CH-5-300x180.png 300w, https:\/\/emariete.com\/wp-content\/uploads\/2020\/08\/CH-5-768x461.png 768w\" sizes=\"auto, (max-width: 800px) 100vw, 800px\" \/><\/a><\/figure>\n\n\n\n<figure class=\"wp-block-image size-large\"><a href=\"https:\/\/emariete.com\/wp-content\/uploads\/2020\/08\/CH-6.png\"><img loading=\"lazy\" decoding=\"async\" width=\"800\" height=\"480\" data-id=\"235733\" src=\"https:\/\/emariete.com\/wp-content\/uploads\/2020\/08\/CH-6.png\" alt=\"Captura CH 6 VPX PartoM FPV\" class=\"wp-image-235733\" srcset=\"https:\/\/emariete.com\/wp-content\/uploads\/2020\/08\/CH-6.png 800w, https:\/\/emariete.com\/wp-content\/uploads\/2020\/08\/CH-6-300x180.png 300w, https:\/\/emariete.com\/wp-content\/uploads\/2020\/08\/CH-6-768x461.png 768w\" sizes=\"auto, (max-width: 800px) 100vw, 800px\" \/><\/a><\/figure>\n<\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">Finalmente me ayud\u00e9 de la captura del canal 11 para comprobar si estaba en modo de 18 bits o 19 bits:<\/p>\n\n\n\n<figure class=\"wp-block-gallery has-nested-images columns-2 is-cropped wp-block-gallery-3 is-layout-flex wp-block-gallery-is-layout-flex\">\n<figure class=\"wp-block-image size-large\"><a href=\"https:\/\/emariete.com\/wp-content\/uploads\/2020\/08\/Arduino_CH11_18bits.png\"><img loading=\"lazy\" decoding=\"async\" width=\"800\" height=\"480\" data-id=\"235734\" src=\"https:\/\/emariete.com\/wp-content\/uploads\/2020\/08\/Arduino_CH11_18bits.png\" alt=\"Osciloscopio Arduino_CH11_18bits\" class=\"wp-image-235734\" srcset=\"https:\/\/emariete.com\/wp-content\/uploads\/2020\/08\/Arduino_CH11_18bits.png 800w, https:\/\/emariete.com\/wp-content\/uploads\/2020\/08\/Arduino_CH11_18bits-300x180.png 300w, https:\/\/emariete.com\/wp-content\/uploads\/2020\/08\/Arduino_CH11_18bits-768x461.png 768w\" sizes=\"auto, (max-width: 800px) 100vw, 800px\" \/><\/a><\/figure>\n\n\n\n<figure class=\"wp-block-image size-large\"><a href=\"https:\/\/emariete.com\/wp-content\/uploads\/2020\/08\/Arduino_CH11_19bits.png\"><img loading=\"lazy\" decoding=\"async\" width=\"800\" height=\"480\" data-id=\"235735\" src=\"https:\/\/emariete.com\/wp-content\/uploads\/2020\/08\/Arduino_CH11_19bits.png\" alt=\"Osciloscopio Arduino_CH11_19bits\" class=\"wp-image-235735\" srcset=\"https:\/\/emariete.com\/wp-content\/uploads\/2020\/08\/Arduino_CH11_19bits.png 800w, https:\/\/emariete.com\/wp-content\/uploads\/2020\/08\/Arduino_CH11_19bits-300x180.png 300w, https:\/\/emariete.com\/wp-content\/uploads\/2020\/08\/Arduino_CH11_19bits-768x461.png 768w\" sizes=\"auto, (max-width: 800px) 100vw, 800px\" \/><\/a><\/figure>\n<\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">En esta \u00faltima imagen se puede ver con detalle el an\u00e1lisis del protocolo, ya que lo document\u00e9 sobre la<strong> captura con los bits numerados<\/strong> para que fuera m\u00e1s f\u00e1cil de visualizar:<\/p>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-large\"><a href=\"https:\/\/emariete.com\/wp-content\/uploads\/2020\/08\/Protocol.png\"><img decoding=\"async\" src=\"https:\/\/emariete.com\/wp-content\/uploads\/2020\/08\/Protocol.png\" alt=\"VTX Control Protocol\"\/><\/a><\/figure>\n<\/div>\n\n\n<h2 class=\"wp-block-heading\" id=\"h-codigo-sketch-de-arduino\">C\u00f3digo sketch de Arduino<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">&nbsp;Aqu\u00ed tienes el <strong>c\u00f3digo completo para controlar el VTX con Arduino<\/strong>.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Te recomiendo, si lo vas a usar, que lo cojas de la <a href=\"https:\/\/github.com\/melkati\/VTX_Parton_Test\" target=\"_blank\" rel=\"noreferrer noopener nofollow\">p\u00e1gina de eMariete en Github<\/a>, donde podr\u00e1s encontrar <strong>la \u00faltima versi\u00f3n y otras informaciones interesantes<\/strong>.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Para flashear el Arduino puedes utilizar el Arduino IDE normal. Ten en cuenta que este c\u00f3digo se desarroll\u00f3 con una versi\u00f3n de Arduino IDE de 2017 por lo que con las \u00faltimas versiones podr\u00eda haber incompatibilidades.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">El c\u00f3digo no es una maravilla de la programaci\u00f3n, es algo \u00abr\u00e1pido y sucio\u00bb para comprobar que funcionaba y lo sub\u00ed a Github \u00ab<em>tal cual<\/em>\u00ab. Las pruebas las realic\u00e9 en un&nbsp;Arduino Pro Mini de 3.3 V a 8 Mhz y funcionaba sin problemas.<\/p>\n\n\n\n<pre class=\"wp-block-preformatted hljs\"><span class=\"hljs-comment\" style=\"color: rgba(149, 165, 166, 0.8);\">\/*\n * This sketch controls a Partom or simmilar VTX transmit frequency\n * Copyright (c) 2017 Mariete\n *\/<\/span>\n<span class=\"hljs-comment\" style=\"color: rgba(149, 165, 166, 0.8);\">\/*-----( Declare Constants )-----*\/<\/span>\nstatic const int FREQ[] = {<span class=\"hljs-number\" style=\"color: rgb(138, 123, 82);\">1010<\/span>, <span class=\"hljs-number\" style=\"color: rgb(138, 123, 82);\">1040<\/span>, <span class=\"hljs-number\" style=\"color: rgb(138, 123, 82);\">1060<\/span>, <span class=\"hljs-number\" style=\"color: rgb(138, 123, 82);\">1080<\/span>, <span class=\"hljs-number\" style=\"color: rgb(138, 123, 82);\">1100<\/span>, <span class=\"hljs-number\" style=\"color: rgb(138, 123, 82);\">1120<\/span>, <span class=\"hljs-number\" style=\"color: rgb(138, 123, 82);\">1140<\/span>, <span class=\"hljs-number\" style=\"color: rgb(138, 123, 82);\">1160<\/span>, <span class=\"hljs-number\" style=\"color: rgb(138, 123, 82);\">1180<\/span>, <span class=\"hljs-number\" style=\"color: rgb(138, 123, 82);\">1200<\/span>, <span class=\"hljs-number\" style=\"color: rgb(138, 123, 82);\">1240<\/span>, <span class=\"hljs-number\" style=\"color: rgb(138, 123, 82);\">1258<\/span>, <span class=\"hljs-number\" style=\"color: rgb(138, 123, 82);\">1280<\/span>, <span class=\"hljs-number\" style=\"color: rgb(138, 123, 82);\">1320<\/span>, <span class=\"hljs-number\" style=\"color: rgb(138, 123, 82);\">1360<\/span>};\nstatic unsigned long COUNTER18BIT_OLD[] = {\n  <span class=\"hljs-number\" style=\"color: rgb(138, 123, 82);\">0b010000010010110001<\/span>,\n  <span class=\"hljs-number\" style=\"color: rgb(138, 123, 82);\">0b010000010010110001<\/span>,\n  <span class=\"hljs-number\" style=\"color: rgb(138, 123, 82);\">0b010000010010110001<\/span>,\n  <span class=\"hljs-number\" style=\"color: rgb(138, 123, 82);\">0b010000010010110001<\/span>,\n  <span class=\"hljs-number\" style=\"color: rgb(138, 123, 82);\">0b010000010010110001<\/span>,\n  <span class=\"hljs-number\" style=\"color: rgb(138, 123, 82);\">0b010000010010110001<\/span>,\n  <span class=\"hljs-number\" style=\"color: rgb(138, 123, 82);\">0b010000010010110001<\/span>,\n  <span class=\"hljs-number\" style=\"color: rgb(138, 123, 82);\">0b010000010010110001<\/span>,\n  <span class=\"hljs-number\" style=\"color: rgb(138, 123, 82);\">0b010000010010110001<\/span>,\n  <span class=\"hljs-number\" style=\"color: rgb(138, 123, 82);\">0b010000010010110001<\/span>,\n  <span class=\"hljs-number\" style=\"color: rgb(138, 123, 82);\">0b010000010010110001<\/span>,\n  <span class=\"hljs-number\" style=\"color: rgb(138, 123, 82);\">0b010000010010110001<\/span>, <span class=\"hljs-comment\" style=\"color: rgba(149, 165, 166, 0.8);\">\/* 12 *\/<\/span>\n  <span class=\"hljs-number\" style=\"color: rgb(138, 123, 82);\">0b010000010010110001<\/span>,\n  <span class=\"hljs-number\" style=\"color: rgb(138, 123, 82);\">0b010000010010110001<\/span>, <span class=\"hljs-comment\" style=\"color: rgba(149, 165, 166, 0.8);\">\/* 14 *\/<\/span>\n  <span class=\"hljs-number\" style=\"color: rgb(138, 123, 82);\">0b010000010010110001<\/span>};\nstatic unsigned long COUNTER18BIT[] = { \/\/ Data original PLL <span class=\"hljs-keyword\" style=\"color: rgb(0, 151, 157);\">for<\/span> 1280Mhz\n  <span class=\"hljs-number\" style=\"color: rgb(138, 123, 82);\">0b010000001100100001<\/span>,\n  <span class=\"hljs-number\" style=\"color: rgb(138, 123, 82);\">0b010000001100100001<\/span>,\n  <span class=\"hljs-number\" style=\"color: rgb(138, 123, 82);\">0b010000001100100001<\/span>,\n  <span class=\"hljs-number\" style=\"color: rgb(138, 123, 82);\">0b010000001100100001<\/span>,\n  <span class=\"hljs-number\" style=\"color: rgb(138, 123, 82);\">0b010000001100100001<\/span>,\n  <span class=\"hljs-number\" style=\"color: rgb(138, 123, 82);\">0b010000001100100001<\/span>,\n  <span class=\"hljs-number\" style=\"color: rgb(138, 123, 82);\">0b010000001100100001<\/span>,\n  <span class=\"hljs-number\" style=\"color: rgb(138, 123, 82);\">0b010000001100100001<\/span>,\n  <span class=\"hljs-number\" style=\"color: rgb(138, 123, 82);\">0b010000001100100001<\/span>,\n  <span class=\"hljs-number\" style=\"color: rgb(138, 123, 82);\">0b010000001100100001<\/span>,\n  <span class=\"hljs-number\" style=\"color: rgb(138, 123, 82);\">0b010000001100100001<\/span>,\n  <span class=\"hljs-number\" style=\"color: rgb(138, 123, 82);\">0b010000001100100001<\/span>, <span class=\"hljs-comment\" style=\"color: rgba(149, 165, 166, 0.8);\">\/* 12 *\/<\/span>\n  <span class=\"hljs-number\" style=\"color: rgb(138, 123, 82);\">0b010000001100100001<\/span>,\n  <span class=\"hljs-number\" style=\"color: rgb(138, 123, 82);\">0b010000001100100001<\/span>, <span class=\"hljs-comment\" style=\"color: rgba(149, 165, 166, 0.8);\">\/* 14 *\/<\/span>\n  <span class=\"hljs-number\" style=\"color: rgb(138, 123, 82);\">0b010000001100100001<\/span>};\nstatic unsigned long COUNTER19BIT[] = {\n  <span class=\"hljs-number\" style=\"color: rgb(138, 123, 82);\">0b0110001010100001000<\/span>,\n  <span class=\"hljs-number\" style=\"color: rgb(138, 123, 82);\">0b0110010110001000000<\/span>,\n  <span class=\"hljs-number\" style=\"color: rgb(138, 123, 82);\">0b0110011110000010000<\/span>,\n  <span class=\"hljs-number\" style=\"color: rgb(138, 123, 82);\">0b0110100101101100000<\/span>,\n  <span class=\"hljs-number\" style=\"color: rgb(138, 123, 82);\">0b0110101101100110000<\/span>,\n  <span class=\"hljs-number\" style=\"color: rgb(138, 123, 82);\">0b0110110101100000000<\/span>,\n  <span class=\"hljs-number\" style=\"color: rgb(138, 123, 82);\">0b0110111101001010000<\/span>,\n  <span class=\"hljs-number\" style=\"color: rgb(138, 123, 82);\">0b0111000101000100000<\/span>,\n  <span class=\"hljs-number\" style=\"color: rgb(138, 123, 82);\">0b0111001100101110000<\/span>,\n  <span class=\"hljs-number\" style=\"color: rgb(138, 123, 82);\">0b0111010100101000000<\/span>,\n  <span class=\"hljs-number\" style=\"color: rgb(138, 123, 82);\">0b0111100100001100000<\/span>,\n  <span class=\"hljs-number\" style=\"color: rgb(138, 123, 82);\">0b0111101011001101000<\/span>, <span class=\"hljs-comment\" style=\"color: rgba(149, 165, 166, 0.8);\">\/* 12 *\/<\/span>\n  <span class=\"hljs-number\" style=\"color: rgb(138, 123, 82);\">0b0111110100000001010<\/span>,\n  <span class=\"hljs-number\" style=\"color: rgb(138, 123, 82);\">0b1000000011100100000<\/span>, <span class=\"hljs-comment\" style=\"color: rgba(149, 165, 166, 0.8);\">\/* 14 *\/<\/span>\n  <span class=\"hljs-number\" style=\"color: rgb(138, 123, 82);\">0b1000010011001000000<\/span>};\n#<span class=\"hljs-built_in\" style=\"color: rgb(211, 84, 0);\">define<\/span> VTXDataPin <span class=\"hljs-number\" style=\"color: rgb(138, 123, 82);\">7<\/span>\n#<span class=\"hljs-built_in\" style=\"color: rgb(211, 84, 0);\">define<\/span> VTXClockPin <span class=\"hljs-number\" style=\"color: rgb(138, 123, 82);\">8<\/span>\n#<span class=\"hljs-built_in\" style=\"color: rgb(211, 84, 0);\">define<\/span> VTXLatchEnablePin <span class=\"hljs-number\" style=\"color: rgb(138, 123, 82);\">9<\/span>\n#<span class=\"hljs-built_in\" style=\"color: rgb(211, 84, 0);\">define<\/span> VTXChannelChangePin <span class=\"hljs-number\" style=\"color: rgb(138, 123, 82);\">3<\/span>\n<span class=\"hljs-comment\" style=\"color: rgba(149, 165, 166, 0.8);\">\/*-----( Declare Variables )-----*\/<\/span>\nbyte VTXChannelOld = <span class=\"hljs-number\" style=\"color: rgb(138, 123, 82);\">0<\/span>;\nbyte VTXChannel = <span class=\"hljs-number\" style=\"color: rgb(138, 123, 82);\">13<\/span>;\nvoid setup()\n{\n  Serial.begin(<span class=\"hljs-number\" style=\"color: rgb(138, 123, 82);\">9600<\/span>);\n  pinMode(LED_BUILTIN, OUTPUT);\n  pinMode(VTXDataPin, OUTPUT);\n  pinMode(VTXClockPin, OUTPUT);\n  pinMode(VTXLatchEnablePin, OUTPUT);\n  pinMode(VTXChannelChangePin, INPUT_PULLUP);\n  digitalWrite(VTXChannelChangePin, HIGH);\n  digitalWrite(VTXDataPin, LOW);\n  digitalWrite(VTXClockPin, LOW);\n  digitalWrite(VTXLatchEnablePin, LOW);\n}\nvoid loop()\n{\n  <span class=\"hljs-keyword\" style=\"color: rgb(0, 151, 157);\">if<\/span> (!digitalRead(VTXChannelChangePin))\n  {\n    <span class=\"hljs-keyword\" style=\"color: rgb(0, 151, 157);\">while<\/span> (!digitalRead(VTXChannelChangePin)) {\n      \/\/\n    }\n    VTXChannel++;\n    Serial.println(<span class=\"hljs-string\" style=\"color: rgb(0, 92, 95);\">\"Button pressed...\"<\/span>);\n  }\n  <span class=\"hljs-keyword\" style=\"color: rgb(0, 151, 157);\">if<\/span> (VTXChannel != VTXChannelOld)\n  {\n    Serial.println(<span class=\"hljs-string\" style=\"color: rgb(0, 92, 95);\">\"Changing channel...\"<\/span>);\n    ChangeChannel();\n  }\n\/\/  <span class=\"hljs-built_in\" style=\"color: rgb(211, 84, 0);\">delay<\/span>(<span class=\"hljs-number\" style=\"color: rgb(138, 123, 82);\">9500<\/span>);\n\/\/  digitalWrite(LED_BUILTIN, HIGH);\n\/\/  <span class=\"hljs-built_in\" style=\"color: rgb(211, 84, 0);\">delay<\/span>(<span class=\"hljs-number\" style=\"color: rgb(138, 123, 82);\">500<\/span>);\n\/\/  digitalWrite(LED_BUILTIN, LOW);\n\/\/  VTXChannel = <span class=\"hljs-number\" style=\"color: rgb(138, 123, 82);\">13<\/span>;\n\/\/  ChangeChannel(VTXChannel);\n\/\/  <span class=\"hljs-built_in\" style=\"color: rgb(211, 84, 0);\">delay<\/span>(<span class=\"hljs-number\" style=\"color: rgb(138, 123, 82);\">9500<\/span>);\n\/\/  digitalWrite(LED_BUILTIN, HIGH);\n\/\/  <span class=\"hljs-built_in\" style=\"color: rgb(211, 84, 0);\">delay<\/span>(<span class=\"hljs-number\" style=\"color: rgb(138, 123, 82);\">500<\/span>);\n\/\/  digitalWrite(LED_BUILTIN, LOW);\n\/\/  VTXChannel = <span class=\"hljs-number\" style=\"color: rgb(138, 123, 82);\">11<\/span>;\n\/\/  ChangeChannel(VTXChannel);\n}\nvoid bitBang(unsigned long pattern, byte numBits)  \/\/ This function <span class=\"hljs-built_in\" style=\"color: rgb(211, 84, 0);\">is<\/span> what bitbangs the data\n{\n\/\/  digitalWriteFast(VTXDataPin, LOW);\n\/\/  digitalWriteFast(VTXClockPin, LOW);\n\/\/  <span class=\"hljs-built_in\" style=\"color: rgb(211, 84, 0);\">delay<\/span>(<span class=\"hljs-number\" style=\"color: rgb(138, 123, 82);\">1<\/span>);\n  <span class=\"hljs-keyword\" style=\"color: rgb(0, 151, 157);\">for<\/span>(int i=numBits-<span class=\"hljs-number\" style=\"color: rgb(138, 123, 82);\">1<\/span>; i&gt;-<span class=\"hljs-number\" style=\"color: rgb(138, 123, 82);\">1<\/span>; i--)\n  {\n    digitalWriteFast(VTXDataPin, bitRead(pattern, i));\n    delayMicroseconds(<span class=\"hljs-number\" style=\"color: rgb(138, 123, 82);\">300<\/span>);\n    digitalWriteFast(VTXClockPin, HIGH);\n    delayMicroseconds(<span class=\"hljs-number\" style=\"color: rgb(138, 123, 82);\">350<\/span>);\n    digitalWriteFast(VTXClockPin, LOW);\n    Serial.<span class=\"hljs-built_in\" style=\"color: rgb(211, 84, 0);\">print<\/span>(bitRead(pattern, i));\n    delayMicroseconds(<span class=\"hljs-number\" style=\"color: rgb(138, 123, 82);\">50<\/span>);\n  }\n  digitalWriteFast(VTXLatchEnablePin, HIGH);\n  delayMicroseconds(<span class=\"hljs-number\" style=\"color: rgb(138, 123, 82);\">500<\/span>);\n  digitalWriteFast(VTXLatchEnablePin, LOW);\n  Serial.println(<span class=\"hljs-string\" style=\"color: rgb(0, 92, 95);\">\"\"<\/span>);\n  digitalWrite(VTXDataPin, LOW);\n}\nvoid ChangeChannel()\n{\n  Serial.<span class=\"hljs-built_in\" style=\"color: rgb(211, 84, 0);\">print<\/span>(<span class=\"hljs-string\" style=\"color: rgb(0, 92, 95);\">\"VTXChannel: \"<\/span>);\n  Serial.println(VTXChannel);\n  Serial.<span class=\"hljs-built_in\" style=\"color: rgb(211, 84, 0);\">print<\/span>(<span class=\"hljs-string\" style=\"color: rgb(0, 92, 95);\">\"VTXChannelOld: \"<\/span>);\n  Serial.println(VTXChannelOld);\n  <span class=\"hljs-keyword\" style=\"color: rgb(0, 151, 157);\">if<\/span> (VTXChannel &lt; <span class=\"hljs-number\" style=\"color: rgb(138, 123, 82);\">1<\/span>) {\n    VTXChannel = <span class=\"hljs-number\" style=\"color: rgb(138, 123, 82);\">15<\/span>;\n  }\n  <span class=\"hljs-keyword\" style=\"color: rgb(0, 151, 157);\">if<\/span> (VTXChannel &gt; <span class=\"hljs-number\" style=\"color: rgb(138, 123, 82);\">15<\/span>) {\n    VTXChannel = <span class=\"hljs-number\" style=\"color: rgb(138, 123, 82);\">1<\/span>;\n  }\n  switch (VTXChannel) {\n    case <span class=\"hljs-number\" style=\"color: rgb(138, 123, 82);\">1<\/span>:\n    case <span class=\"hljs-number\" style=\"color: rgb(138, 123, 82);\">2<\/span>:\n    case <span class=\"hljs-number\" style=\"color: rgb(138, 123, 82);\">3<\/span>:\n    case <span class=\"hljs-number\" style=\"color: rgb(138, 123, 82);\">4<\/span>:\n    case <span class=\"hljs-number\" style=\"color: rgb(138, 123, 82);\">5<\/span>:\n    case <span class=\"hljs-number\" style=\"color: rgb(138, 123, 82);\">6<\/span>:\n    case <span class=\"hljs-number\" style=\"color: rgb(138, 123, 82);\">7<\/span>:\n    case <span class=\"hljs-number\" style=\"color: rgb(138, 123, 82);\">8<\/span>:\n    case <span class=\"hljs-number\" style=\"color: rgb(138, 123, 82);\">9<\/span>:\n    case <span class=\"hljs-number\" style=\"color: rgb(138, 123, 82);\">10<\/span>:\n    case <span class=\"hljs-number\" style=\"color: rgb(138, 123, 82);\">11<\/span>:\n    case <span class=\"hljs-number\" style=\"color: rgb(138, 123, 82);\">12<\/span>:\n    case <span class=\"hljs-number\" style=\"color: rgb(138, 123, 82);\">13<\/span>:\n    case <span class=\"hljs-number\" style=\"color: rgb(138, 123, 82);\">14<\/span>:\n    case <span class=\"hljs-number\" style=\"color: rgb(138, 123, 82);\">15<\/span>:\n      Serial.<span class=\"hljs-built_in\" style=\"color: rgb(211, 84, 0);\">print<\/span>(<span class=\"hljs-string\" style=\"color: rgb(0, 92, 95);\">\"Change to channel: \"<\/span>);\n      Serial.println(VTXChannel);\n      bitBang(COUNTER18BIT[VTXChannel-<span class=\"hljs-number\" style=\"color: rgb(138, 123, 82);\">1<\/span>], <span class=\"hljs-number\" style=\"color: rgb(138, 123, 82);\">18<\/span>);\n      bitBang(COUNTER19BIT[VTXChannel-<span class=\"hljs-number\" style=\"color: rgb(138, 123, 82);\">1<\/span>], <span class=\"hljs-number\" style=\"color: rgb(138, 123, 82);\">19<\/span>);\n      VTXChannelOld = VTXChannel;\n      <span class=\"hljs-built_in\" style=\"color: rgb(211, 84, 0);\">break<\/span>;\n  }\n}\nvoid digitalWriteFast(uint8_t pin, uint8_t x) {\n  <span class=\"hljs-keyword\" style=\"color: rgb(0, 151, 157);\">if<\/span> (pin \/ <span class=\"hljs-number\" style=\"color: rgb(138, 123, 82);\">8<\/span>) { \/\/ pin &gt;= <span class=\"hljs-number\" style=\"color: rgb(138, 123, 82);\">8<\/span>\n    PORTB ^= (-x ^ PORTB) &amp; (<span class=\"hljs-number\" style=\"color: rgb(138, 123, 82);\">1<\/span> &lt;&lt; (pin <span class=\"hljs-symbol\" style=\"color: rgb(0, 151, 157);\">%<\/span> <span class=\"hljs-number\" style=\"color: rgb(138, 123, 82);\">8<\/span>));\n  }\n  <span class=\"hljs-keyword\" style=\"color: rgb(0, 151, 157);\">else<\/span> {\n    PORTD ^= (-x ^ PORTD) &amp; (<span class=\"hljs-number\" style=\"color: rgb(138, 123, 82);\">1<\/span> &lt;&lt; (pin <span class=\"hljs-symbol\" style=\"color: rgb(0, 151, 157);\">%<\/span> <span class=\"hljs-number\" style=\"color: rgb(138, 123, 82);\">8<\/span>));\n  }\n}\n=======\n<span class=\"hljs-comment\" style=\"color: rgba(149, 165, 166, 0.8);\">\/*\n * This sketch controls a Partom or simmilar VTX transmit frequency\n * Copyright (c) 2017 Mario Elkati (Mariete)\n * melkati@gmail.com\n *\/<\/span>\n<span class=\"hljs-comment\" style=\"color: rgba(149, 165, 166, 0.8);\">\/*-----( Declare Constants )-----*\/<\/span>\nstatic const int FREQ[] = {<span class=\"hljs-number\" style=\"color: rgb(138, 123, 82);\">1010<\/span>, <span class=\"hljs-number\" style=\"color: rgb(138, 123, 82);\">1040<\/span>, <span class=\"hljs-number\" style=\"color: rgb(138, 123, 82);\">1060<\/span>, <span class=\"hljs-number\" style=\"color: rgb(138, 123, 82);\">1080<\/span>, <span class=\"hljs-number\" style=\"color: rgb(138, 123, 82);\">1100<\/span>, <span class=\"hljs-number\" style=\"color: rgb(138, 123, 82);\">1120<\/span>, <span class=\"hljs-number\" style=\"color: rgb(138, 123, 82);\">1140<\/span>, <span class=\"hljs-number\" style=\"color: rgb(138, 123, 82);\">1160<\/span>, <span class=\"hljs-number\" style=\"color: rgb(138, 123, 82);\">1180<\/span>, <span class=\"hljs-number\" style=\"color: rgb(138, 123, 82);\">1200<\/span>, <span class=\"hljs-number\" style=\"color: rgb(138, 123, 82);\">1240<\/span>, <span class=\"hljs-number\" style=\"color: rgb(138, 123, 82);\">1258<\/span>, <span class=\"hljs-number\" style=\"color: rgb(138, 123, 82);\">1280<\/span>, <span class=\"hljs-number\" style=\"color: rgb(138, 123, 82);\">1320<\/span>, <span class=\"hljs-number\" style=\"color: rgb(138, 123, 82);\">1360<\/span>};\nstatic unsigned long COUNTER18BIT_OLD[] = {\n  <span class=\"hljs-number\" style=\"color: rgb(138, 123, 82);\">0b010000010010110001<\/span>,\n  <span class=\"hljs-number\" style=\"color: rgb(138, 123, 82);\">0b010000010010110001<\/span>,\n  <span class=\"hljs-number\" style=\"color: rgb(138, 123, 82);\">0b010000010010110001<\/span>,\n  <span class=\"hljs-number\" style=\"color: rgb(138, 123, 82);\">0b010000010010110001<\/span>,\n  <span class=\"hljs-number\" style=\"color: rgb(138, 123, 82);\">0b010000010010110001<\/span>,\n  <span class=\"hljs-number\" style=\"color: rgb(138, 123, 82);\">0b010000010010110001<\/span>,\n  <span class=\"hljs-number\" style=\"color: rgb(138, 123, 82);\">0b010000010010110001<\/span>,\n  <span class=\"hljs-number\" style=\"color: rgb(138, 123, 82);\">0b010000010010110001<\/span>,\n  <span class=\"hljs-number\" style=\"color: rgb(138, 123, 82);\">0b010000010010110001<\/span>,\n  <span class=\"hljs-number\" style=\"color: rgb(138, 123, 82);\">0b010000010010110001<\/span>,\n  <span class=\"hljs-number\" style=\"color: rgb(138, 123, 82);\">0b010000010010110001<\/span>,\n  <span class=\"hljs-number\" style=\"color: rgb(138, 123, 82);\">0b010000010010110001<\/span>, <span class=\"hljs-comment\" style=\"color: rgba(149, 165, 166, 0.8);\">\/* 12 *\/<\/span>\n  <span class=\"hljs-number\" style=\"color: rgb(138, 123, 82);\">0b010000010010110001<\/span>,\n  <span class=\"hljs-number\" style=\"color: rgb(138, 123, 82);\">0b010000010010110001<\/span>, <span class=\"hljs-comment\" style=\"color: rgba(149, 165, 166, 0.8);\">\/* 14 *\/<\/span>\n  <span class=\"hljs-number\" style=\"color: rgb(138, 123, 82);\">0b010000010010110001<\/span>};\nstatic unsigned long COUNTER18BIT[] = { \/\/ Data original PLL <span class=\"hljs-keyword\" style=\"color: rgb(0, 151, 157);\">for<\/span> 1280Mhz\n  <span class=\"hljs-number\" style=\"color: rgb(138, 123, 82);\">0b010000001100100001<\/span>,\n  <span class=\"hljs-number\" style=\"color: rgb(138, 123, 82);\">0b010000001100100001<\/span>,\n  <span class=\"hljs-number\" style=\"color: rgb(138, 123, 82);\">0b010000001100100001<\/span>,\n  <span class=\"hljs-number\" style=\"color: rgb(138, 123, 82);\">0b010000001100100001<\/span>,\n  <span class=\"hljs-number\" style=\"color: rgb(138, 123, 82);\">0b010000001100100001<\/span>,\n  <span class=\"hljs-number\" style=\"color: rgb(138, 123, 82);\">0b010000001100100001<\/span>,\n  <span class=\"hljs-number\" style=\"color: rgb(138, 123, 82);\">0b010000001100100001<\/span>,\n  <span class=\"hljs-number\" style=\"color: rgb(138, 123, 82);\">0b010000001100100001<\/span>,\n  <span class=\"hljs-number\" style=\"color: rgb(138, 123, 82);\">0b010000001100100001<\/span>,\n  <span class=\"hljs-number\" style=\"color: rgb(138, 123, 82);\">0b010000001100100001<\/span>,\n  <span class=\"hljs-number\" style=\"color: rgb(138, 123, 82);\">0b010000001100100001<\/span>,\n  <span class=\"hljs-number\" style=\"color: rgb(138, 123, 82);\">0b010000001100100001<\/span>, <span class=\"hljs-comment\" style=\"color: rgba(149, 165, 166, 0.8);\">\/* 12 *\/<\/span>\n  <span class=\"hljs-number\" style=\"color: rgb(138, 123, 82);\">0b010000001100100001<\/span>,\n  <span class=\"hljs-number\" style=\"color: rgb(138, 123, 82);\">0b010000001100100001<\/span>, <span class=\"hljs-comment\" style=\"color: rgba(149, 165, 166, 0.8);\">\/* 14 *\/<\/span>\n  <span class=\"hljs-number\" style=\"color: rgb(138, 123, 82);\">0b010000001100100001<\/span>};\nstatic unsigned long COUNTER19BIT[] = {\n  <span class=\"hljs-number\" style=\"color: rgb(138, 123, 82);\">0b0110001010100001000<\/span>,\n  <span class=\"hljs-number\" style=\"color: rgb(138, 123, 82);\">0b0110010110001000000<\/span>,\n  <span class=\"hljs-number\" style=\"color: rgb(138, 123, 82);\">0b0110011110000010000<\/span>,\n  <span class=\"hljs-number\" style=\"color: rgb(138, 123, 82);\">0b0110100101101100000<\/span>,\n  <span class=\"hljs-number\" style=\"color: rgb(138, 123, 82);\">0b0110101101100110000<\/span>,\n  <span class=\"hljs-number\" style=\"color: rgb(138, 123, 82);\">0b0110110101100000000<\/span>,\n  <span class=\"hljs-number\" style=\"color: rgb(138, 123, 82);\">0b0110111101001010000<\/span>,\n  <span class=\"hljs-number\" style=\"color: rgb(138, 123, 82);\">0b0111000101000100000<\/span>,\n  <span class=\"hljs-number\" style=\"color: rgb(138, 123, 82);\">0b0111001100101110000<\/span>,\n  <span class=\"hljs-number\" style=\"color: rgb(138, 123, 82);\">0b0111010100101000000<\/span>,\n  <span class=\"hljs-number\" style=\"color: rgb(138, 123, 82);\">0b0111100100001100000<\/span>,\n  <span class=\"hljs-number\" style=\"color: rgb(138, 123, 82);\">0b0111101011001101000<\/span>, <span class=\"hljs-comment\" style=\"color: rgba(149, 165, 166, 0.8);\">\/* 12 *\/<\/span>\n  <span class=\"hljs-number\" style=\"color: rgb(138, 123, 82);\">0b0111110100000001010<\/span>,\n  <span class=\"hljs-number\" style=\"color: rgb(138, 123, 82);\">0b1000000011100100000<\/span>, <span class=\"hljs-comment\" style=\"color: rgba(149, 165, 166, 0.8);\">\/* 14 *\/<\/span>\n  <span class=\"hljs-number\" style=\"color: rgb(138, 123, 82);\">0b1000010011001000000<\/span>};\n#<span class=\"hljs-built_in\" style=\"color: rgb(211, 84, 0);\">define<\/span> VTXDataPin <span class=\"hljs-number\" style=\"color: rgb(138, 123, 82);\">7<\/span>\n#<span class=\"hljs-built_in\" style=\"color: rgb(211, 84, 0);\">define<\/span> VTXClockPin <span class=\"hljs-number\" style=\"color: rgb(138, 123, 82);\">8<\/span>\n#<span class=\"hljs-built_in\" style=\"color: rgb(211, 84, 0);\">define<\/span> VTXLatchEnablePin <span class=\"hljs-number\" style=\"color: rgb(138, 123, 82);\">9<\/span>\n#<span class=\"hljs-built_in\" style=\"color: rgb(211, 84, 0);\">define<\/span> VTXChannelChangePin <span class=\"hljs-number\" style=\"color: rgb(138, 123, 82);\">3<\/span>\n<span class=\"hljs-comment\" style=\"color: rgba(149, 165, 166, 0.8);\">\/*-----( Declare Variables )-----*\/<\/span>\nbyte VTXChannelOld = <span class=\"hljs-number\" style=\"color: rgb(138, 123, 82);\">0<\/span>;\nbyte VTXChannel = <span class=\"hljs-number\" style=\"color: rgb(138, 123, 82);\">13<\/span>;\nvoid setup()\n{\n  Serial.begin(<span class=\"hljs-number\" style=\"color: rgb(138, 123, 82);\">9600<\/span>);\n  pinMode(LED_BUILTIN, OUTPUT);\n  pinMode(VTXDataPin, OUTPUT);\n  pinMode(VTXClockPin, OUTPUT);\n  pinMode(VTXLatchEnablePin, OUTPUT);\n  pinMode(VTXChannelChangePin, INPUT_PULLUP);\n  digitalWrite(VTXChannelChangePin, HIGH);\n  digitalWrite(VTXDataPin, LOW);\n  digitalWrite(VTXClockPin, LOW);\n  digitalWrite(VTXLatchEnablePin, LOW);\n}\nvoid loop()\n{\n  <span class=\"hljs-keyword\" style=\"color: rgb(0, 151, 157);\">if<\/span> (!digitalRead(VTXChannelChangePin))\n  {\n    <span class=\"hljs-keyword\" style=\"color: rgb(0, 151, 157);\">while<\/span> (!digitalRead(VTXChannelChangePin)) {\n      \/\/\n    }\n    VTXChannel++;\n    Serial.println(<span class=\"hljs-string\" style=\"color: rgb(0, 92, 95);\">\"Button pressed...\"<\/span>);\n  }\n  <span class=\"hljs-keyword\" style=\"color: rgb(0, 151, 157);\">if<\/span> (VTXChannel != VTXChannelOld)\n  {\n    Serial.println(<span class=\"hljs-string\" style=\"color: rgb(0, 92, 95);\">\"Changing channel...\"<\/span>);\n    ChangeChannel();\n  }\n\/\/  <span class=\"hljs-built_in\" style=\"color: rgb(211, 84, 0);\">delay<\/span>(<span class=\"hljs-number\" style=\"color: rgb(138, 123, 82);\">9500<\/span>);\n\/\/  digitalWrite(LED_BUILTIN, HIGH);\n\/\/  <span class=\"hljs-built_in\" style=\"color: rgb(211, 84, 0);\">delay<\/span>(<span class=\"hljs-number\" style=\"color: rgb(138, 123, 82);\">500<\/span>);\n\/\/  digitalWrite(LED_BUILTIN, LOW);\n\/\/  VTXChannel = <span class=\"hljs-number\" style=\"color: rgb(138, 123, 82);\">13<\/span>;\n\/\/  ChangeChannel(VTXChannel);\n\/\/  <span class=\"hljs-built_in\" style=\"color: rgb(211, 84, 0);\">delay<\/span>(<span class=\"hljs-number\" style=\"color: rgb(138, 123, 82);\">9500<\/span>);\n\/\/  digitalWrite(LED_BUILTIN, HIGH);\n\/\/  <span class=\"hljs-built_in\" style=\"color: rgb(211, 84, 0);\">delay<\/span>(<span class=\"hljs-number\" style=\"color: rgb(138, 123, 82);\">500<\/span>);\n\/\/  digitalWrite(LED_BUILTIN, LOW);\n\/\/  VTXChannel = <span class=\"hljs-number\" style=\"color: rgb(138, 123, 82);\">11<\/span>;\n\/\/  ChangeChannel(VTXChannel);\n}\nvoid bitBang(unsigned long pattern, byte numBits)  \/\/ This function <span class=\"hljs-built_in\" style=\"color: rgb(211, 84, 0);\">is<\/span> what bitbangs the data\n{\n\/\/  digitalWriteFast(VTXDataPin, LOW);\n\/\/  digitalWriteFast(VTXClockPin, LOW);\n\/\/  <span class=\"hljs-built_in\" style=\"color: rgb(211, 84, 0);\">delay<\/span>(<span class=\"hljs-number\" style=\"color: rgb(138, 123, 82);\">1<\/span>);\n  <span class=\"hljs-keyword\" style=\"color: rgb(0, 151, 157);\">for<\/span>(int i=numBits-<span class=\"hljs-number\" style=\"color: rgb(138, 123, 82);\">1<\/span>; i&gt;-<span class=\"hljs-number\" style=\"color: rgb(138, 123, 82);\">1<\/span>; i--)\n  {\n    digitalWriteFast(VTXDataPin, bitRead(pattern, i));\n    delayMicroseconds(<span class=\"hljs-number\" style=\"color: rgb(138, 123, 82);\">300<\/span>);\n    digitalWriteFast(VTXClockPin, HIGH);\n    delayMicroseconds(<span class=\"hljs-number\" style=\"color: rgb(138, 123, 82);\">350<\/span>);\n    digitalWriteFast(VTXClockPin, LOW);\n    Serial.<span class=\"hljs-built_in\" style=\"color: rgb(211, 84, 0);\">print<\/span>(bitRead(pattern, i));\n    delayMicroseconds(<span class=\"hljs-number\" style=\"color: rgb(138, 123, 82);\">50<\/span>);\n  }\n  digitalWriteFast(VTXLatchEnablePin, HIGH);\n  delayMicroseconds(<span class=\"hljs-number\" style=\"color: rgb(138, 123, 82);\">500<\/span>);\n  digitalWriteFast(VTXLatchEnablePin, LOW);\n  Serial.println(<span class=\"hljs-string\" style=\"color: rgb(0, 92, 95);\">\"\"<\/span>);\n  digitalWrite(VTXDataPin, LOW);\n}\nvoid ChangeChannel()\n{\n  Serial.<span class=\"hljs-built_in\" style=\"color: rgb(211, 84, 0);\">print<\/span>(<span class=\"hljs-string\" style=\"color: rgb(0, 92, 95);\">\"VTXChannel: \"<\/span>);\n  Serial.println(VTXChannel);\n  Serial.<span class=\"hljs-built_in\" style=\"color: rgb(211, 84, 0);\">print<\/span>(<span class=\"hljs-string\" style=\"color: rgb(0, 92, 95);\">\"VTXChannelOld: \"<\/span>);\n  Serial.println(VTXChannelOld);\n  <span class=\"hljs-keyword\" style=\"color: rgb(0, 151, 157);\">if<\/span> (VTXChannel &lt; <span class=\"hljs-number\" style=\"color: rgb(138, 123, 82);\">1<\/span>) {\n    VTXChannel = <span class=\"hljs-number\" style=\"color: rgb(138, 123, 82);\">15<\/span>;\n  }\n  <span class=\"hljs-keyword\" style=\"color: rgb(0, 151, 157);\">if<\/span> (VTXChannel &gt; <span class=\"hljs-number\" style=\"color: rgb(138, 123, 82);\">15<\/span>) {\n    VTXChannel = <span class=\"hljs-number\" style=\"color: rgb(138, 123, 82);\">1<\/span>;\n  }\n  switch (VTXChannel) {\n    case <span class=\"hljs-number\" style=\"color: rgb(138, 123, 82);\">1<\/span>:\n    case <span class=\"hljs-number\" style=\"color: rgb(138, 123, 82);\">2<\/span>:\n    case <span class=\"hljs-number\" style=\"color: rgb(138, 123, 82);\">3<\/span>:\n    case <span class=\"hljs-number\" style=\"color: rgb(138, 123, 82);\">4<\/span>:\n    case <span class=\"hljs-number\" style=\"color: rgb(138, 123, 82);\">5<\/span>:\n    case <span class=\"hljs-number\" style=\"color: rgb(138, 123, 82);\">6<\/span>:\n    case <span class=\"hljs-number\" style=\"color: rgb(138, 123, 82);\">7<\/span>:\n    case <span class=\"hljs-number\" style=\"color: rgb(138, 123, 82);\">8<\/span>:\n    case <span class=\"hljs-number\" style=\"color: rgb(138, 123, 82);\">9<\/span>:\n    case <span class=\"hljs-number\" style=\"color: rgb(138, 123, 82);\">10<\/span>:\n    case <span class=\"hljs-number\" style=\"color: rgb(138, 123, 82);\">11<\/span>:\n    case <span class=\"hljs-number\" style=\"color: rgb(138, 123, 82);\">12<\/span>:\n    case <span class=\"hljs-number\" style=\"color: rgb(138, 123, 82);\">13<\/span>:\n    case <span class=\"hljs-number\" style=\"color: rgb(138, 123, 82);\">14<\/span>:\n    case <span class=\"hljs-number\" style=\"color: rgb(138, 123, 82);\">15<\/span>:\n      Serial.<span class=\"hljs-built_in\" style=\"color: rgb(211, 84, 0);\">print<\/span>(<span class=\"hljs-string\" style=\"color: rgb(0, 92, 95);\">\"Change to channel: \"<\/span>);\n      Serial.println(VTXChannel);\n      bitBang(COUNTER18BIT[VTXChannel-<span class=\"hljs-number\" style=\"color: rgb(138, 123, 82);\">1<\/span>], <span class=\"hljs-number\" style=\"color: rgb(138, 123, 82);\">18<\/span>);\n      bitBang(COUNTER19BIT[VTXChannel-<span class=\"hljs-number\" style=\"color: rgb(138, 123, 82);\">1<\/span>], <span class=\"hljs-number\" style=\"color: rgb(138, 123, 82);\">19<\/span>);\n      VTXChannelOld = VTXChannel;\n      <span class=\"hljs-built_in\" style=\"color: rgb(211, 84, 0);\">break<\/span>;\n  }\n}\nvoid digitalWriteFast(uint8_t pin, uint8_t x) {\n  <span class=\"hljs-keyword\" style=\"color: rgb(0, 151, 157);\">if<\/span> (pin \/ <span class=\"hljs-number\" style=\"color: rgb(138, 123, 82);\">8<\/span>) { \/\/ pin &gt;= <span class=\"hljs-number\" style=\"color: rgb(138, 123, 82);\">8<\/span>\n    PORTB ^= (-x ^ PORTB) &amp; (<span class=\"hljs-number\" style=\"color: rgb(138, 123, 82);\">1<\/span> &lt;&lt; (pin <span class=\"hljs-symbol\" style=\"color: rgb(0, 151, 157);\">%<\/span> <span class=\"hljs-number\" style=\"color: rgb(138, 123, 82);\">8<\/span>));\n  }\n  <span class=\"hljs-keyword\" style=\"color: rgb(0, 151, 157);\">else<\/span> {\n    PORTD ^= (-x ^ PORTD) &amp; (<span class=\"hljs-number\" style=\"color: rgb(138, 123, 82);\">1<\/span> &lt;&lt; (pin <span class=\"hljs-symbol\" style=\"color: rgb(0, 151, 157);\">%<\/span> <span class=\"hljs-number\" style=\"color: rgb(138, 123, 82);\">8<\/span>));\n  }\n}<\/pre>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"h-modificacion-del-vtx-y-conexion-al-arduino\">Modificaci\u00f3n del VTX y conexi\u00f3n al Arduino<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">La modificaci\u00f3n consiste en <strong>sustituir el&nbsp;microcontrolador PIC del transmisor por nuestro Arduino<\/strong>, programado con el c\u00f3digo del punto anterior.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Para ello tendremos que desoldar, con cuidado el PIC (integrado de 14 patas) de la placa y soldar tres cables&nbsp;<span style=\"background-color: #ffffff; font-size: 18px;\">(para las l\u00edneas DATA, CLOCK y LATCH ENABLE)<\/span><span style=\"background-color: #ffffff; font-size: 18px;\">&nbsp;<\/span><span style=\"font-size: 18px;\">que ir\u00e1n a los a los pines Arduino 7, 8 y 9. Tendr\u00e1s que conectar tambi\u00e9n la tierra entre ellos (usar un cable de negativo com\u00fan, por ejemplo).<\/span><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Pienso que en las siguientes fotograf\u00edas se puede ver bastante bien.<span style=\"font-size: 18px;\">&nbsp;<\/span><\/p>\n\n\n<div class=\"gb-grid-wrapper gb-grid-wrapper-d796ae9e\">\n<div class=\"gb-grid-column gb-grid-column-1268e339\"><div class=\"gb-container gb-container-1268e339\"><div class=\"gb-inside-container\">\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-medium\"><a href=\"https:\/\/emariete.com\/wp-content\/uploads\/2020\/08\/Connection-Partom-VTX-to-Arduino-scaled-1.jpg\"><img loading=\"lazy\" decoding=\"async\" width=\"300\" height=\"224\" src=\"https:\/\/emariete.com\/wp-content\/uploads\/2020\/08\/Connection-Partom-VTX-to-Arduino-scaled-1-300x224.jpg\" alt=\"Connection Partom VTX to Arduino\" class=\"wp-image-235739\" srcset=\"https:\/\/emariete.com\/wp-content\/uploads\/2020\/08\/Connection-Partom-VTX-to-Arduino-scaled-1-300x224.jpg 300w, https:\/\/emariete.com\/wp-content\/uploads\/2020\/08\/Connection-Partom-VTX-to-Arduino-scaled-1-1024x765.jpg 1024w, https:\/\/emariete.com\/wp-content\/uploads\/2020\/08\/Connection-Partom-VTX-to-Arduino-scaled-1-768x574.jpg 768w, https:\/\/emariete.com\/wp-content\/uploads\/2020\/08\/Connection-Partom-VTX-to-Arduino-scaled-1-1536x1147.jpg 1536w, https:\/\/emariete.com\/wp-content\/uploads\/2020\/08\/Connection-Partom-VTX-to-Arduino-scaled-1-2048x1530.jpg 2048w\" sizes=\"auto, (max-width: 300px) 100vw, 300px\" \/><\/a><\/figure>\n<\/div>\n<\/div><\/div><\/div>\n\n<div class=\"gb-grid-column gb-grid-column-58dad1af\"><div class=\"gb-container gb-container-58dad1af\"><div class=\"gb-inside-container\">\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-medium\"><a href=\"https:\/\/emariete.com\/wp-content\/uploads\/2020\/08\/Connect-Partom-VTX-to-Arduino-scaled-1.jpg\"><img loading=\"lazy\" decoding=\"async\" width=\"300\" height=\"224\" src=\"https:\/\/emariete.com\/wp-content\/uploads\/2020\/08\/Connect-Partom-VTX-to-Arduino-scaled-1-300x224.jpg\" alt=\"\" class=\"wp-image-235737\" srcset=\"https:\/\/emariete.com\/wp-content\/uploads\/2020\/08\/Connect-Partom-VTX-to-Arduino-scaled-1-300x224.jpg 300w, https:\/\/emariete.com\/wp-content\/uploads\/2020\/08\/Connect-Partom-VTX-to-Arduino-scaled-1-1024x765.jpg 1024w, https:\/\/emariete.com\/wp-content\/uploads\/2020\/08\/Connect-Partom-VTX-to-Arduino-scaled-1-768x574.jpg 768w, https:\/\/emariete.com\/wp-content\/uploads\/2020\/08\/Connect-Partom-VTX-to-Arduino-scaled-1-1536x1147.jpg 1536w, https:\/\/emariete.com\/wp-content\/uploads\/2020\/08\/Connect-Partom-VTX-to-Arduino-scaled-1-2048x1530.jpg 2048w\" sizes=\"auto, (max-width: 300px) 100vw, 300px\" \/><\/a><\/figure>\n<\/div>\n<\/div><\/div><\/div>\n<\/div>\n\n\n<h2 class=\"wp-block-heading\" id=\"h-analizador-de-antenas-comprobador-de-swr-con-arduino\">Analizador de antenas comprobador de SWR con Arduino<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Bas\u00e1ndome en este desarrollo, realic\u00e9 el primer proyecto interesante: un <strong>medidor de estacionarias y analizador de antena<\/strong>. Este proyecto permite caracterizar la antena mediante un barrido de frecuencias, haciendo gr\u00e1ficas de la frecuencia de resonancia de la antena, para encontrar la frecuencia en la que mejor funciona o ajustarla para que de su m\u00e1ximo rendimiento en el canal que nos interesa.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Tengo pendiente documentar bien y publicar este proyecto. Si te interesa conocerlo <strong>suscr\u00edbete a la newsletter<\/strong> de eMariete para no perd\u00e9rtelo y enterarte cuanto antes.<\/p>\n<div class=\"essb_break_scroll\"><\/div>","protected":false},"excerpt":{"rendered":"<p>Do you want to control a VTX video transmitter with an Arduino? Here's how to do it.<\/p>","protected":false},"author":1,"featured_media":243001,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"_uag_custom_page_level_css":"","_lmt_disableupdate":"yes","_lmt_disable":"no","footnotes":""},"categories":[9,17],"tags":[19,20,31,43],"class_list":["post-235722","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-aeromodelismo-fpv","category-proyectos-arduino","tag-aeromodelismo","tag-arduino","tag-fpv","tag-proyectos-arduino"],"modified_by":"Mariete","uagb_featured_image_src":{"full":["https:\/\/emariete.com\/wp-content\/uploads\/2020\/08\/Control-transmisor-de-video-VTX-FPV-con-Arduino.jpg",1376,768,false],"thumbnail":["https:\/\/emariete.com\/wp-content\/uploads\/2020\/08\/Control-transmisor-de-video-VTX-FPV-con-Arduino-150x150.jpg",150,150,true],"medium":["https:\/\/emariete.com\/wp-content\/uploads\/2020\/08\/Control-transmisor-de-video-VTX-FPV-con-Arduino-300x167.jpg",300,167,true],"medium_large":["https:\/\/emariete.com\/wp-content\/uploads\/2020\/08\/Control-transmisor-de-video-VTX-FPV-con-Arduino-768x429.jpg",768,429,true],"large":["https:\/\/emariete.com\/wp-content\/uploads\/2020\/08\/Control-transmisor-de-video-VTX-FPV-con-Arduino-1024x572.jpg",1024,572,true],"1536x1536":["https:\/\/emariete.com\/wp-content\/uploads\/2020\/08\/Control-transmisor-de-video-VTX-FPV-con-Arduino.jpg",1376,768,false],"2048x2048":["https:\/\/emariete.com\/wp-content\/uploads\/2020\/08\/Control-transmisor-de-video-VTX-FPV-con-Arduino.jpg",1376,768,false],"trp-custom-language-flag":["https:\/\/emariete.com\/wp-content\/uploads\/2020\/08\/Control-transmisor-de-video-VTX-FPV-con-Arduino-18x10.jpg",18,10,true]},"uagb_author_info":{"display_name":"Mariete","author_link":"https:\/\/emariete.com\/en\/author\/admin_xlyz052h\/"},"uagb_comment_info":0,"uagb_excerpt":"Quieres controlar un transmisor de video VTX con un Arduino? Aqu\u00ed te explico como hacerlo.","_links":{"self":[{"href":"https:\/\/emariete.com\/en\/wp-json\/wp\/v2\/posts\/235722","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/emariete.com\/en\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/emariete.com\/en\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/emariete.com\/en\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/emariete.com\/en\/wp-json\/wp\/v2\/comments?post=235722"}],"version-history":[{"count":3,"href":"https:\/\/emariete.com\/en\/wp-json\/wp\/v2\/posts\/235722\/revisions"}],"predecessor-version":[{"id":240872,"href":"https:\/\/emariete.com\/en\/wp-json\/wp\/v2\/posts\/235722\/revisions\/240872"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/emariete.com\/en\/wp-json\/wp\/v2\/media\/243001"}],"wp:attachment":[{"href":"https:\/\/emariete.com\/en\/wp-json\/wp\/v2\/media?parent=235722"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/emariete.com\/en\/wp-json\/wp\/v2\/categories?post=235722"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/emariete.com\/en\/wp-json\/wp\/v2\/tags?post=235722"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}