Objective:
Experience with TVOut library with Arduino.
Software:
- Download library from https://github.com/Avamander/arduino-tvout/
- Note: For some reason, I cannot use the library as is. During compiling, it pop up below error message. I stuck in this step for weeks.
- After I copy all files except README.md from under TVoutfronts folder, and paste them to its upper level folder TVOUT. I can compile this Arduino code now. :) If anyone know why this is happening, please let me know. Thanks.
Copy file from above folder
Paste file to above folder location
Reference website:
- http://playground.arduino.cc/Main/TVout
- http://forum.arduino.cc/index.php?topic=8814.0
- http://tronixstuff.com/2011/05/30/tutorial-video-output-from-your-arduino/
- https://code.google.com/archive/p/arduino-tvout/downloads
Hardware setup:
Arduino Uno Pin 9: Sync
Arduino Uno Pin 7: Video
Simple Hardware Setup
Arduino Code -1:
#include <TVout.h>
#include <fontALL.h>
TVout TV;
int sensorPin = A0;
int sensorValue = 0;
void setup() {
TV.begin(NTSC);
TV.select_font(font6x8);
}
void loop() {
int x, y;
TV.draw_line(0,0,0,95,1);
TV.draw_line(0,0,127,0,1);
TV.draw_line(0,95,127,95,1);
TV.draw_line(127,0,127,95,1);
for(y=0;y<TV.vres();y++){
for(x=0;x<TV.hres();x++){
TV.set_cursor(40,43);TV.print("(");TV.print(x);TV.print(", ");TV.print(y);TV.print(") ");
TV.set_pixel(x,y,2);
}
}
TV.clear_screen();
}
Simple Demo
Arduino Code -2:
- Go to https://code.google.com/archive/p/arduino-tvout/downloads
- Download TVoutBeta1.zip
- Copy its contain to your Arduin/TVOUT folder
- Below code is the demo code from DemoNTSC
- You can find its demo video at https://www.youtube.com/watch?v=MEg_V4YZDh0
#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(NTSC,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);
}
I've download that library, then compiled it and successful.., thanks for your blog page!
ReplyDeleteYou are very welcomed.
Delete