Arduino señales de vídeo para TV PAL o NTSC

Hola:

Quiero hacer un proyecto con Arduino UNO rv3. No se si con él se puede hacer. El proyeco se trata de lograr general señales de vídeo del RCA amarillo, vídeo compuesto a un TV. He encontrado un ejemplo hecho en C++, me parece. No el C que usamos mucho en Arduino y es más complejo.

http://code.google.com/p/arduino-tvout/

Lo que quiero hacer es ser capaz de mostrar textos en pantalla como si fuera un LCD 20x4 del Hitachi 44748. Cuando Arduino detecte una de las 8 entradas digitales o algunas analógicas y las muestre en pantalla. Quiero hacer con el C preparado para Arduino, no complicarme la vida con el C++.

Un saludo.

Hola. Lo que has encontrado es una librería para arduino. Sólo tienes que instalarla en tu ide e incluirla en tu proyecto. Echa un vistazo a los ejemplos que vienen incluidos para ver su uso.
Saludos.

Hola:

Gracias por ayudarme, no tenía ni idea de librerías.

En cuanto el ejemplo es este:

#include <TVout.h>
#include <fontALL.h>
#include "schematic.h"
#include "TVOlogo.h"

TVout TV;

int zOff = 150;
int xOff = 0;
int yOff = 0;
int cSize = 50;
int view_plane = 64;
float angle = PI/60;

float cube3d[8][3] = {
  {xOff - cSize,yOff + cSize,zOff - cSize},
  {xOff + cSize,yOff + cSize,zOff - cSize},
  {xOff - cSize,yOff - cSize,zOff - cSize},
  {xOff + cSize,yOff - cSize,zOff - cSize},
  {xOff - cSize,yOff + cSize,zOff + cSize},
  {xOff + cSize,yOff + cSize,zOff + cSize},
  {xOff - cSize,yOff - cSize,zOff + cSize},
  {xOff + cSize,yOff - cSize,zOff + cSize}
};
unsigned char cube2d[8][2];


void setup() {
  TV.begin(PAL,120,96);
  TV.select_font(font6x8);
  intro();
  TV.println("I am the TVout\nlibrary running on a freeduino\n");
  TV.delay(2500);
  TV.println("I generate a PAL\nor NTSC composite  video using\ninterrupts\n");
  TV.delay(2500);
  TV.println("My schematic:");
  TV.delay(1500);
  TV.bitmap(0,0,schematic);
  TV.delay(10000);
  TV.clear_screen();
  TV.println("Lets see what\nwhat I can do");
  TV.delay(2000);
  
  //fonts
  TV.clear_screen();
  TV.println(0,0,"Multiple fonts:");
  TV.select_font(font4x6);
  TV.println("4x6 font FONT");
  TV.select_font(font6x8);
  TV.println("6x8 font FONT");
  TV.select_font(font8x8);
  TV.println("8x8 font FONT");
  TV.select_font(font6x8);
  TV.delay(2000);
  
  TV.clear_screen();
  TV.print(9,44,"Draw Basic Shapes");
  TV.delay(2000);
  
  //circles
  TV.clear_screen();
  TV.draw_circle(TV.hres()/2,TV.vres()/2,TV.vres()/3,WHITE);
  TV.delay(500);
  TV.draw_circle(TV.hres()/2,TV.vres()/2,TV.vres()/2,WHITE,INVERT);
  TV.delay(2000);
  
  //rectangles and lines
  TV.clear_screen();
  TV.draw_rect(20,20,80,56,WHITE);
  TV.delay(500);
  TV.draw_rect(10,10,100,76,WHITE,INVERT);
  TV.delay(500);
  TV.draw_line(60,20,60,76,INVERT);
  TV.draw_line(20,48,100,48,INVERT);
  TV.delay(500);
  TV.draw_line(10,10,110,86,INVERT);
  TV.draw_line(10,86,110,10,INVERT);
  TV.delay(2000);
  
  //random cube forever.
  TV.clear_screen();
  TV.print(16,40,"Random Cube");
  TV.print(28,48,"Rotation");
  TV.delay(2000);
  
  randomSeed(analogRead(0));
}

void loop() {
  int rsteps = random(10,60);
  switch(random(6)) {
    case 0:
      for (int i = 0; i < rsteps; i++) {
        zrotate(angle);
        printcube();
      }
      break;
    case 1:
      for (int i = 0; i < rsteps; i++) {
        zrotate(2*PI - angle);
        printcube();
      }
      break;
    case 2:
      for (int i = 0; i < rsteps; i++) {
        xrotate(angle);
        printcube();
      }
      break;
    case 3:
      for (int i = 0; i < rsteps; i++) {
        xrotate(2*PI - angle);
        printcube();
      }
      break;
    case 4:
      for (int i = 0; i < rsteps; i++) {
        yrotate(angle);
        printcube();
      }
      break;
    case 5:
      for (int i = 0; i < rsteps; i++) {
        yrotate(2*PI - angle);
        printcube();
      }
      break;
  }
}

void intro() {
unsigned char w,l,wb;
  int index;
  w = pgm_read_byte(TVOlogo);
  l = pgm_read_byte(TVOlogo+1);
  if (w&7)
    wb = w/8 + 1;
  else
    wb = w/8;
  index = wb*(l-1) + 2;
  for ( unsigned char i = 1; i < l; i++ ) {
    TV.bitmap((TV.hres() - w)/2,0,TVOlogo,index,w,i);
    index-= wb;
    TV.delay(50);
  }
  for (unsigned char i = 0; i < (TV.vres() - l)/2; i++) {
    TV.bitmap((TV.hres() - w)/2,i,TVOlogo);
    TV.delay(50);
  }
  TV.delay(3000);
  TV.clear_screen();
}

void printcube() {
  //calculate 2d points
  for(byte i = 0; i < 8; i++) {
    cube2d[i][0] = (unsigned char)((cube3d[i][0] * view_plane / cube3d[i][2]) + (TV.hres()/2));
    cube2d[i][1] = (unsigned char)((cube3d[i][1] * view_plane / cube3d[i][2]) + (TV.vres()/2));
  }
  TV.delay_frame(1);
  TV.clear_screen();
  draw_cube();
}

void zrotate(float q) {
  float tx,ty,temp;
  for(byte i = 0; i < 8; i++) {
    tx = cube3d[i][0] - xOff;
    ty = cube3d[i][1] - yOff;
    temp = tx * cos(q) - ty * sin(q);
    ty = tx * sin(q) + ty * cos(q);
    tx = temp;
    cube3d[i][0] = tx + xOff;
    cube3d[i][1] = ty + yOff;
  }
}

void yrotate(float q) {
  float tx,tz,temp;
  for(byte i = 0; i < 8; i++) {
    tx = cube3d[i][0] - xOff;
    tz = cube3d[i][2] - zOff;
    temp = tz * cos(q) - tx * sin(q);
    tx = tz * sin(q) + tx * cos(q);
    tz = temp;
    cube3d[i][0] = tx + xOff;
    cube3d[i][2] = tz + zOff;
  }
}

void xrotate(float q) {
  float ty,tz,temp;
  for(byte i = 0; i < 8; i++) {
    ty = cube3d[i][1] - yOff;
    tz = cube3d[i][2] - zOff;
    temp = ty * cos(q) - tz * sin(q);
    tz = ty * sin(q) + tz * cos(q);
    ty = temp;
    cube3d[i][1] = ty + yOff;
    cube3d[i][2] = tz + zOff;
  }
}

void draw_cube() {
  TV.draw_line(cube2d[0][0],cube2d[0][1],cube2d[1][0],cube2d[1][1],WHITE);
  TV.draw_line(cube2d[0][0],cube2d[0][1],cube2d[2][0],cube2d[2][1],WHITE);
  TV.draw_line(cube2d[0][0],cube2d[0][1],cube2d[4][0],cube2d[4][1],WHITE);
  TV.draw_line(cube2d[1][0],cube2d[1][1],cube2d[5][0],cube2d[5][1],WHITE);
  TV.draw_line(cube2d[1][0],cube2d[1][1],cube2d[3][0],cube2d[3][1],WHITE);
  TV.draw_line(cube2d[2][0],cube2d[2][1],cube2d[6][0],cube2d[6][1],WHITE);
  TV.draw_line(cube2d[2][0],cube2d[2][1],cube2d[3][0],cube2d[3][1],WHITE);
  TV.draw_line(cube2d[4][0],cube2d[4][1],cube2d[6][0],cube2d[6][1],WHITE);
  TV.draw_line(cube2d[4][0],cube2d[4][1],cube2d[5][0],cube2d[5][1],WHITE);
  TV.draw_line(cube2d[7][0],cube2d[7][1],cube2d[6][0],cube2d[6][1],WHITE);
  TV.draw_line(cube2d[7][0],cube2d[7][1],cube2d[3][0],cube2d[3][1],WHITE);
  TV.draw_line(cube2d[7][0],cube2d[7][1],cube2d[5][0],cube2d[5][1],WHITE);
}

Como no tiene comentarios lo veo difícil de interpretar. Sólo me interesa hacer por mi mismo, meter una letra como la "A" y ponerlo en cualquier parte de la pantalla que yo quiera. Guadraré este ejemplo pequeño. Otro ejemplo, es escribir una frase en la pantalal que diga "¡¡¡Hola mundo!!!" y en la pantalla donde yo quiera.

Es para orientarme como generar letras o como introducirlas. Por ahora un LCD 16x4 me parece mucho más fácil que en la TV, y hablo de ensamblador par PIC16F84A, que estoy medio acostumbrado.

Más tarde quiero hacer como un menú muy simple. Por ejemplo, si pulso A voy a un menú, si pulso B, voy a otro menú. La letras en realidad son pines de los pulsadores de entrada de Arduino UNO rv3.

Si pueden hecharme una mano explicando cada línea de código que generen ustedes, se los agradesco. Por ahora con Arduino estoy empezando a palo seco entenderlo gracias a ustedes.

Saludo.

Si ya sabes cómo va el conexionado, el siguiente paso es instalar tu librería.
Descomprime el archivo.zip con la librería en la carpeta libraries en una carpeta con el mismo nombre que la propia librería. Es decir, Arduino\libraries\TVout\ .... aquí deberían estar ya TVout.h, TVout.cpp y resto de archivos y carpetas (incluida examples).
A continuación abre el ide de Arduino (si ya estaba abierto, ciérralo para que adquiera la librería). Deberá aparecerte en el menu archivo un desplegable con las distintas librerías, y entre ellas TVout con sus ejemplos. Abre el ejemplo deseado y compila a ver. Si funciona el ejemplo que has puesto, verás claramente en qué parte del código se halla en cada momento de la demo. Creo que es muy intuitiva. A botepronto, entiendo que TV.begin(PAL,120,96) inicia la pantalla en modo pal, y resolución 120x96, TV.select_font(font6x8) selecciona la fuente a usar, TV.print ("cadena") imprime la cadena dada, y si se usa TV.print(x,y,"cadena") lo imprime en la posición dada.
Veo que tiene, además unas cuantas funciones más para volcar bitmaps, trazar líneas, rectángulos, círculos. Lo mejor es echar un vistazo a TVout.h y ahí te puedes hacer una idea de su potencial.
Saludos

Hola:

Lo reconoce, al compilar hay muchos errores en naranja. En l aparte de arriba en naranja pone 'TVout does not name a type'.
Los demás son lista de arrores que no puedo copiar para que lo veas aquí.

¿Has colocado la carpeta en la ruta que te dije?
¿El ejemplo lo has cargado directamente en el menú archivo->ejemplos->tvout->demopal?
A mí me compiló a la segunda (a la primera me daban error las líneas que hacen referencia a las fuentes, pero lo pude solventar).

noter:
¿Has colocado la carpeta en la ruta que te dije?

Sí.

¿El ejemplo lo has cargado directamente en el menú archivo->ejemplos->tvout->demopal?

Sí.

A mí me compiló a la segunda (a la primera me daban error las líneas que hacen referencia a las fuentes, pero lo pude solventar).

Lo he vuelto a cargar y nada de nada. Que cosa más rara. Al menos quiero crear un ejemplo simple de textos, no un cubo girando. Así entiendo la base.

Hoy lo acabo de hacer en otro ordenador, y al ir a tiro hecho he compilado a la primera. Te detallo los pasos:
En la página que citabas, en la parte izquierda hay un vínculo para descargar el .zip con la librería. Éste contiene tres subcarpetas: pollserial, tvout y tvoutfonts. Arrastro las carpetas tvout y tvoutfonts a mi carpeta arduino\libraries (pollserial no parece que sea necesaria). Abro el IDE de Arduino (en mi caso es la versión 1.0.3), y pulso en Archivo->Ejemplos->TVout->DemoPAL. Se abre un proyecto con cinco pestañas, compilo y no me da errores (sí que he visto bastantes warnings, ya que tengo activado el resultado detallado durante compilación). Lo que no puedo decirte es si funciona, pues no he montado circuito.
Esto, al menos, bajo windows7 y con IDE Arduino 1.0.3. El error que te aparece creo que se debe a que tu proyecto no localiza correctamente la librería.
La estructura de carpetas que tengo yo es:

Arduino\libraries
|
+---TVout
| | keywords.txt
| | TVout.cpp
| | TVout.h
| | TVoutPrint.cpp
| | version history.txt
| | video_gen.cpp
| | video_gen.h
| |
| +---examples
| | +---DemoNTSC
| | | DemoNTSC.pde
| | | schematic.cpp
| | | schematic.h
| | | TVOlogo.cpp
| | | TVOlogo.h
| | |
| | +---DemoPAL
| | | DemoPAL.pde
| | | schematic.cpp
| | | schematic.h
| | | TVOlogo.cpp
| | | TVOlogo.h
| | |
| | ---NTSCserialTerm
| | NTSCserialTerm.pde
| |
| ---spec
| asm_macros.h
| hardware_setup.h
| video_properties.h
|
+---TVoutfonts
| font4x6.cpp
| font4x6.h
| font6x8.cpp
| font6x8.h
| font8x8.cpp
| font8x8.h
| font8x8ext.cpp
| font8x8ext.h
| fontALL.h
| keywords.txt

Hola disculpen de donde puedo descargar la librería TVfont?

Berina:
Hola disculpen de donde puedo descargar la librería TVfont?

https://code.google.com/archive/p/arduino-tvout/downloads

Los archivos que empiecen con "TVout" son versiones de la librería (en el sentido de actualización).

Ojo, el enlace de Lucario que lo ha puesto con la mejor intención refiere a librerías de 2010.
No sea cosa que pretendas que eso funcione con un IDE ultima versión?
Usa un IDE de la época o estarás dando vueltas sin sentido.

Gente grande reviviendo hilos de casi 3 años!