Nesse post veremos como conectar um Arduino para exibir informações em uma televisão através da entrada de vídeo RCA.
Conectar o Arduino na televisão permite com que você exiba as informações do seu projeto em telas maiores de forma simples e barata. Você pode, por exemplo, utilizar o arduino em conjunto com uma televisão para criar um sistema de senhas de atendimento numa sala de espera ou exibir avisos de forma dinâmica.
Materiais Necessários
Os materiais utilizados para confecção desse projeto são:
- Arduino Nano / Uno
- Conector RCA
- 2 Resistores de 1kΩ
- Protoboard
- Jumpers
Montagem do circuito
A montagem desse projeto é bem simples. Primeiro conectamos o GND do Arduino ao anel externo do conector RCA. Depois conectamos os pinos digitais 7 e 9 ao pino interno do conector através de resistores de 1kΩ. Podemos também utilizar um conector RCA macho conectado conforme a imagem abaixo.
Código
Utilizaremos a biblioteca TVout para gerar os sinais que formam a imagem na Televisão. Essa biblioteca pode ser instalada através do Gerenciador de Bibliotecas da IDE do Arduino. Para isso vá em Ferramentas → Gerenciar Bibliotecas, busque por TVout e clique em Instalar.
As principais funções dessa biblioteca, suas atribuições e parâmetros são:
Função | Atribuição | Parâmetros |
begin | Define o sistema NTSC/PAL e a resolução | sistema, resolução x, resolução y |
select_font | Define o tamanho da fonte | fonte |
Escreve na tela | posição x, posição y, texto | |
println | Escreve na tela e pula uma linha | posição x, posição y, texto |
clear_screen | Limpa a tela | – |
draw_circle | Desenha um círculo na tela | posição x, posição y, raio, cor |
draw_rect | Desenha um retângulo na tela | posição x, posição y, largura, altura, cor |
draw_line | Desenha uma linha na tela | posição x do 1º ponto, posição y do 1º, posição x do 2º, posição y do 2º, cor |
bitmap | Exibe a imagem na tela | posição x, posição y, array com a imagem |
Para exibição de imagens, utilizaremos o programa Image2Code para transformar a imagem em um vetor com os códigos hexadecimais que descrevem a imagem. Para isso é necessário que a imagem seja um bitmap preto e branco, com tamanho máximo de 120×96. O programa pode ser baixado nesse link e a imagem pode ser editada com o Paint para atender as especificações de formato e tamanho.
Primeiro abrimos o programa e clicamos em Browse para selecionar o arquivo da imagem.
Depois selecionamos a terceira opção da esquerda para direita – que diz MSB LSB. Então clicamos em Convert e esperamos que o arquivo com o vetor seja aberto no Bloco de Notas.
Depois, utilizamos a ferramenta de substituição para retirar os colchetes { }.
A definição do vetor no código deve ser feito da seguinte forma.
PROGMEM const unsigned char img[] = { tamanho horizontal, tamanho vertical, texto do bloco de notas};
O código abaixo é uma demonstração das funções da biblioteca e a forma como essas informações são exibidas na televisão.
#include <TVout.h> #include <fontALL.h> TVout TV; //Vetor com a definição da Imagem--------------------------- PROGMEM const unsigned char img[] = { 104, 31, 0x00,0x00,0x7F,0xFC,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 , 0x00,0x01,0xFF,0xFC,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 , 0x00,0x03,0xFF,0xFC,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 , 0x00,0x03,0xFF,0xFC,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 , 0x00,0x03,0xE0,0x1C,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 , 0x00,0x03,0xC0,0x1C,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 , 0x00,0x03,0xC0,0x1C,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 , 0x00,0x03,0xC0,0x1C,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 , 0x00,0x03,0xC0,0x1C,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 , 0x00,0x03,0xC0,0x1C,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 , 0x00,0x03,0xC0,0x1C,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 , 0x00,0x03,0xC0,0x1C,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 , 0x00,0x03,0xC0,0x3C,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 , 0x0F,0xFF,0xFF,0xFC,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x18,0x00 , 0x3F,0xFF,0xFF,0xFC,0xFC,0xC7,0x06,0x3E,0x3F,0x1F,0xB0,0x7C,0x7C , 0x3F,0xFF,0xFF,0xFC,0xFC,0xC7,0x06,0x3E,0x7F,0x1F,0xB0,0x7C,0x7E , 0x7F,0xFF,0xFF,0xF8,0xC0,0xC7,0x06,0x36,0x70,0x18,0x30,0x6C,0x6E , 0x7C,0x03,0xC0,0x00,0xC0,0xC7,0x06,0x36,0x60,0x18,0x30,0x6C,0x66 , 0x78,0x03,0xC0,0x00,0xC0,0xC7,0x06,0x36,0x60,0x18,0x30,0x6C,0x66 , 0x78,0x03,0xC0,0x00,0xC0,0xC7,0x06,0x36,0x60,0x18,0x30,0x6C,0x66 , 0x78,0x03,0xC0,0x00,0xC0,0xC7,0x06,0x36,0x60,0x18,0x30,0x6C,0x6E , 0x78,0x03,0xC0,0x00,0xF8,0xC7,0x06,0x3E,0x7C,0x1E,0x30,0x6C,0x7C , 0x78,0x03,0xC0,0x00,0xF8,0xC7,0x06,0x3C,0x7C,0x1E,0x30,0x6C,0x7C , 0x78,0x03,0xC0,0x00,0xC0,0xC7,0x06,0x30,0x60,0x18,0x30,0x6C,0x60 , 0x78,0x03,0xC0,0x00,0xC0,0xC7,0x06,0x30,0x60,0x18,0x30,0x6C,0x60 , 0x78,0x03,0xC0,0x00,0xC0,0xC7,0x06,0x30,0x60,0x18,0x30,0x6C,0x60 , 0x78,0x07,0xC0,0x00,0xC0,0xC7,0x06,0x30,0x60,0x18,0x30,0x6C,0x60 , 0x7F,0xFF,0xC0,0x00,0xC0,0xC7,0x06,0x30,0x60,0x18,0x30,0x6C,0x60 , 0x7F,0xFF,0xC0,0x00,0xC0,0xC7,0xE6,0x30,0x7F,0x18,0x3F,0x7C,0x60 , 0x7F,0xFF,0x80,0x00,0xC0,0xC3,0xE6,0x30,0x3F,0x18,0x3F,0x7C,0x60 , 0x7F,0xFE,0x00,0x00,0xC0,0xC1,0xE6,0x30,0x1F,0x18,0x0F,0x18,0x60 }; void setup() { TV.begin(NTSC,120,96); TV.select_font(font6x8); TV.bitmap(0,60,img); TV.println(10,0,"Biblioteca TV Out\n"); TV.delay(2500); TV.println(30,20,"AV Outout\n"); TV.delay(2500); TV.println(40,40,"Italo"); TV.delay(5000); TV.clear_screen(); } void loop() { //Tipos de Fonte TV.clear_screen(); TV.println( 0, 0, "Tipos de Fonte: \n\n"); // posição X, posição Y, texto TV.select_font(font4x6); TV.println("4x6 font FONT \n"); TV.select_font(font6x8); TV.println("6x8 font FONT \n"); TV.select_font(font8x8); TV.println("8x8 font FONT \n"); TV.select_font(font6x8); TV.delay(2000); //Circulos TV.clear_screen(); TV.println(0,0,"Circulos:"); TV.draw_circle( TV.hres()/2, TV.vres()/2, TV.vres()/6, WHITE); // posição X, posição Y, raio, cor TV.delay(2000); TV.clear_screen(); TV.draw_circle( TV.hres()/2, TV.vres()/2, TV.vres()/2, WHITE, INVERT); // INVERT: circulo preenchido de branco TV.delay(2000); //Retangulos TV.clear_screen(); TV.println( 0, 0, "Retangulos:"); TV.draw_rect( 20, 20, 80, 56, WHITE); // posição X, posição Y, largura, altura, cor TV.delay(2000); TV.clear_screen(); TV.draw_rect( 10, 10, 100, 76, WHITE, INVERT); TV.delay(2000); //Linhas TV.clear_screen(); TV.println( 0, 0, "Linhas:"); TV.draw_line( 60, 20, 60, 76, WHITE); // Coordenadas X ponto 1, Y ponto 1, X ponto 2, Y ponto 2, cor TV.draw_line( 20, 48, 100, 48, WHITE); TV.delay(2000); TV.clear_screen(); TV.draw_line( 10, 10, 110, 86, WHITE); TV.draw_line( 10, 86, 110, 10, WHITE); TV.delay(2000); //BitMap TV.clear_screen(); TV.println(0,0,"Bitmap:"); TV.bitmap(0,10,img); TV.delay(2000); }
Conclusão
Você pode utilizar o que aprendeu nesse post para para substituir um display no seu projeto com Arduino. Um bom exemplo de projeto onde essa técnica pode ser aplicada é “Controlando temperatura e pressão com o BMP180” e “Monitorando Temperatura e Umidade com o sensor DHT11”.
Gostou de aprender a conectar um Arduino na televisão? Não se esqueça de deixar um comentário nos contando o que achou.
Excelente conteúdo!
Parabéns!
Juvenaldo,
Que bom que curtiu!!
Abraços!
Diogo – Equipe MakerHero