Arduino Pong

Hi,
I'm working with an Arduino Mega which has a 16mHz Quartz, do you think it will work well, or do I have to change the code?
(Sorry for my bad English, I'm French ;D)

this is awesome!

Interesting Project...

Thank you ;D

Absolutely amazing!!!

Sorry for kicking the project, but it is worth it.

I have made this project and I have used (TIP!) two variable resistors for pin 8 (synch) and instead of the 75 Ohm. That makes it easier to reach those values.

The game works in part:

  • startup is crystal (clear)
  • playing is very bad, the problem is with the updates (they should fall between scanlines but they don't making the screen flicker)
  • between two rounds (after a 'ball' is missed) the screen is nice again.

putting UPDATE_INTERVAL to 100 helps (although it flickers after that), but the games is unplayable then...

I use CLI so that should be ok. I have a duemilanove with an 328 uC.

[UPDATE:]
It was caused by delayMicroseconds(10); around line 558. removing that made my game work at least ;).

Is the 75 Ohm resistor really needed? The linked page that explains signal generation put this resistor INSIDE the TV. The Other arduino TV-library did not recommend this resistor either!

I don't think it's neccesary for most TVs. The 75ohm resistor is implied as being in the TV.
See this thread at AVRFreaks for probably more information than you wanted (note that the resistor values are slightly different because of the inline diodes).

Hope it`s ok to bump this thread again.
I have a small problem. I get the loading image fine, and every time the game pauses I have a clear image, but when the ball moves, the screen jumps alot. I can see the paddle move, so it works aswell.
Anyone have some thoughts?

This is an awesome project, if I can get it to work I`ll make my own cases and PCB, and give as DIY-kits to my 10-12 year old cousins. "This is what we played in the old days" :slight_smile:

I just saw jopiek`s update "It was caused by delayMicroseconds(10); around line 558. removing that made my game work at least ."

It didn`t work when I removed that line. But when I changed the delay to around 75 almost all flickering was gone.

I was inspired by this post to create my own implementation of Pong with my newly acquired Arduino. Though NTSC isn't really my thing, so I made use of this awesome TV out library:

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

It comes complete with fun intro screen with a "ball" that slowly eats away at the title (spoiler alert: it doesn't ever eat the whole thing, it checkerboards it as you might expect if you think hard about the mechanics of it) and a "Game Over" screen. Here are some more little tidbits:

  • The game plays to a score of 7 right now because I didn't feel like implementing multi-digit scores.
  • There's no color at all (just black and white). I have no idea how to make it color, since I don't know anything about how the TV interface works.
  • It can be played using one "controller" or two. I only had one potentiometer at the time, so it's configured for one controller that controls both paddles. But having two controllers should work just fine. Just alter the WHEEL_TWO_PIN setting.
  • Paddle sizes are configurable if you want to mess with that.
  • Most of the #defines can be tinkered with to alter the game experience except for "LEFT" and "RIGHT" which are used exclusively for scoring, so just ignore those.
  • There's a very simple hardware setup. I found that only a couple resistors (a 1K and 330) were required for both TVs I tested on.
    Supposedly, with minor modification, the game should work on PAL TVs. But I haven't tried it and small parts of my code are resolution-dependent, so your mileage may vary.

If you don't care to build your own, you can just check out a video here:

(note that I added the "eats away at the title" feature after making the video, so just use your imagination there).

You can see a picture of my hardware setup, along with complete source code, here:

Imgur

I'm very new to Arduino programming (only been doing in a couple weeks), so be gentle when it comes to commenting on my hardware.

Thats great PlayMoney I was going to mention my library in this thread, then you had created a full pong game on top of it, if I had a pot that did not require a screw driver to operate I would have to try it.

As far as color goes thats beyond the scope of the library, gray scale is possible with some slight modifications to the library but it would require twice as much memory.

PAL is super easy just change _NTSC to _PAL when you call begin.

Great work PlayMoney.
But I did have to insert a 75 Ohm resistor between ground and signal on the RCA connector. On a PAL tv that is.

And the speed was way to slow :D, but I found out that I could modify the "if(frame % 3 == 0)" to get different speeds

@robinh: what was the behavior before you added the 75ohm resistor? I've been trying to figure out what circumstances lead to the need for the 75ohm resisotor. How does one know they need it? Which TVs would require it? Thanks.

The behavior was no picture, only sound (I have added some basic audio out through RCA as well).

I knew it worked with 75 Ohm, cause I had used it when I breadboarded the circuit. But when I moved it over to a protoboard I tried without 75 Ohm since several people here mentioned that it wasn`t needed.

The tv is a Full HD 37"

@nootropic:

in German:
"Ein Abschlusswiderstand hat die Impedanz des Übertragungsmediums und sorgt dafür, dass am Kabelende keine Reflexionen auftreten. Dadurch würden reflektierte Schwingungen und Stehwellen entstehen, die in das Kabel zurücklaufen und das übertragene Signal beeinträchtigen. "

i would try to translate it.

An "End-Resistor" (75Ohm) has the impendancy of the signal-way (wire) to get rid of signalreflections on the singal-way ending. The Resistor is killing signal destroying by eliminating returning singnalwaves and errors.

End-Resistor ist Standard by old professional Pal/BNC Video connections...

Middle down...
http://www.itwissen.info/bilder-klein/bnc-komponenten.png

So, if your Signal is destroyed by returning SignalWaves and the resulting Signalerrors or "Signalcrashes" this resistor eliminates the signalreflection on signal-way-ending to corret the signal.

Result is a working or better signal, which now possibly work on your tv. If there are to much errors the signal maybe unusable for your tv.
So, if you have Signalproblems on Pal, you could try a 75Ohm resistor to enhance the signal by eliminating signal "interferences"?1? errors.

Hope i am understandble, hard to explain with german motherlanguage.

Greetings Chris

Thank you, robinh and danke, ChrisS. It sounds like the 75 ohm resistor is required for at least some TVs. I'm considering making a product that generates video and I'm trying to figure out if I should include the 75 ohm resistor (at least as an optional component) and the diodes. I did experiments with diodes and they degraded picture some, and I was told that they were not strictly required. I'm just trying to design a device that would work on the most TVs possible.

mmh, i am not very experienced in electronics i can't help you much more. I wish you good luck with your new Design... keep on!

Greetings
ChrisS

I tried to upload ArduinoPong to Duemilanove with ATmega168 but I couldn't get vertical synchronization. Then I changed this line:

//number of lines to display
//#define DISPLAY_LINES 240
#define DISPLAY_LINES 250

And - bingo! =)

PS. TVout library doesn't produce any signal on my board, I don't know why.

The 168 does not have enough memory for the default resolution. It will return an error while calling TV.begin()/TV.start_render() (error code 4). The horizontal resolution/8*vertical resolution must be lower than the amount of sram that the device has. I don't know how much memory pong requires so a change in resolution will be required but to what I don't know. The lowest horizontal resolution is 104(must be a multiple of 8) and there is no limit to how small the vertical resolution is.

Thanks, TVout works on ATmega168 with 128x48 resolution. =)
128x56 requires too much SRAM.