Introduction: Car Game for Arduino

About: My name is Simao and I love eletronics ,glass art,metal working,casting,paint ,draw... But above all... Trains

Here we ave one more game for arduino .

this game is inspired on a vintage electronic game ,on this game you need to drive one car on a autoroute full of trucks you can't crash in anyone ,if you do it the games over and show you how many time you drive for a new game you reset the arduino.

Supplies

  1. Arduino
  2. breadboard
  3. Jumpers
  4. 220R resistor
  5. 10k variable resistor
  6. 16x2 LCD screen
  7. piezo buzzer
  8. USB cable to program arduino

Step 1: Shcematic:

Wire the components together.

Step 2: The Code:

Program the Arduino with this code:

/* Simple Car game for a 16x2 LCD display
You can use any Hitachi HD44780 compatible LCD.

Wiring explained at http://www.arduino.cc/en/Tutorial/LiquidCrystal

(I used theLCD Electronic Brick on bus 1:

rs on pin 2, rw on pin 3, enable on pin 4,

data on pins 5,6,7,8)

There's also a "steering wheel" potentiometer on analog input 1,

and a Piezo speaker on pin 9 (PWM).

Enjoy,

*/

#include <LiquidCrystal>

// LiquidCrystal display

// You can use any Hitachi HD44780 compatible. Wiring explained at

// http://www.arduino.cc/en/Tutorial/LiquidCrystal

LiquidCrystal lcd(2, 3, 4, 5, 6, 7, 8);

// Steering wheel potentiometer

const int POTPIN = 1;

const int MAXPOT = 800; // no need to turn the wheel all the way to 1023 :)

// Piezo speaker

const int SPEAKERPIN = 9;

const int RANDSEEDPIN = 0; // an analog pin that isn't connected to anything

const int MAXSTEPDURATION = 300; // Start slowly, each step is 1 millisec shorter.

const int MINSTEPDURATION = 150; // This is as fast as it gets

const int NGLYPHS = 6;

// the glyphs will be defined starting from 1 (not 0),

// to enable lcd.print() of null-terminated strings

byte glyphs[NGLYPHS][8] = {

// 1: car up

{ B00000,

B01110,

B11111,

B01010,

B00000,

B00000,

B00000,

B00000}

// 2: car down

,{B00000,

B00000,

B00000,

B00000,

B01110,

B11111,

B01010,

B00000}

// 3: truck up

,{B00000,

B11110,

B11111,

B01010,

B00000,

B00000,

B00000,

B00000}

// 4: truck down

,{B00000,

B00000,

B00000,

B00000,

B11110,

B11111,

B01010,

B00000}

// 5: crash up

,{B10101,

B01110,

B01110,

B10101,

B00000,

B00000,

B00000,

B00000}

// 6: crash down

,{B00000,

B00000,

B00000,

B10101,

B01110,

B01110,

B10101,

B00000}

};

const int NCARPOSITIONS = 4;

// Each position is mapped to a column of 2 glyphs

// Used to make sense when I had a 5th position

// where car or crash was drawn as 2 glyphs

// (can't do that since 0 terminates strings),

// so it's kinda silly now, but it ain't broke :)

const char BLANK=32;

char car2glyphs[NCARPOSITIONS][2] = {

{1,BLANK},{2,BLANK},{BLANK,1},{BLANK,2}

};

char truck2glyphs[NCARPOSITIONS][2] = {

{3,BLANK},{4,BLANK},{BLANK,3},{BLANK,4}

};

char crash2glyphs[NCARPOSITIONS][2] = {

{5,BLANK},{6,BLANK},{BLANK,5},{BLANK,6}

};

const int ROADLEN = 15; // LCD width (not counting our car)

int road[ROADLEN]; // positions of other cars

char road_buff[2+ROADLEN]; // aux string for drawRoad()

int road_index;

int car_pos;

// Off-the-grid position means empty column, so MAXROADPOS

// determines the probability of a car in a column

// e.g. 3*NCARPOSITIONS gives p=1/3

const int MAXROADPOS = 3*NCARPOSITIONS;

int step_duration;

int crash; // true if crashed

unsigned int crashtime; // millis() when crashed

const int CRASHSOUNDDURATION = 250;

const char *INTRO1="Trucks ahead,";

const char *INTRO2="Drive carefully";

const int INTRODELAY = 2000;

void setup()

{

crash = crashtime = road_index = 0;

step_duration = MAXSTEPDURATION;

road_buff[1+ROADLEN] = '\0'; // null terminate it

randomSeed(analogRead(RANDSEEDPIN));

for (int i=0; i

lcd.createChar(i+1,glyphs[i]);

}

for (int i=0; i

road[i]=-1;

}

pinMode(SPEAKERPIN,OUTPUT);

analogWrite(SPEAKERPIN,0); // to be on the safe side

lcd.begin(16,2);

getSteeringWheel();

drawRoad();

lcd.setCursor(1,0);

lcd.print(INTRO1);

lcd.setCursor(1,1);

lcd.print(INTRO2);

delay(INTRODELAY);

}

void loop() {

unsigned long now = millis()-INTRODELAY;

if (!crash) {

getSteeringWheel();

crash = (car_pos==road[road_index]);

}

if (crash) {

if (!crashtime) {

crashtime=now;

drawRoad();

// Game over text

// (keep first 2 "crash" columns intact)

lcd.setCursor(2,0);

lcd.print("Crashed after");

lcd.setCursor(2,1);

lcd.print(now/1000);

lcd.print(" seconds.");

}

if ((now-crashtime)

analogWrite(SPEAKERPIN,random(255)); // white noise

}

else {

analogWrite(SPEAKERPIN,0); // dramatic post-crush silence :)

}

delay(10); // Wait a bit between writes

}

else {

int prev_pos = road[(road_index-1)%ROADLEN];

int this_pos = random(MAXROADPOS);

while (abs(this_pos-prev_pos)<2) { // don't jam the road

this_pos = random(MAXROADPOS);

}

road[road_index] = this_pos;

road_index = (road_index+1)%ROADLEN;

drawRoad();

delay(step_duration);

if (step_duration>MINSTEPDURATION) {

step_duration--; // go faster

}

}

}

void getSteeringWheel() {

car_pos = map(analogRead(POTPIN),0,1024,0,NCARPOSITIONS);

}

void drawRoad() {

for (int i=0; i<2; i++) {

if (crash) {

road_buff[0]=crash2glyphs[car_pos][i];

}

else {

road_buff[0]=car2glyphs[car_pos][i];

}

for (int j=0; j

int pos = road[(j+road_index)%ROADLEN];

road_buff[j+1] = pos>=0 && pos

}

lcd.setCursor(0,i);

lcd.print(road_buff);

}

}

Step 3: Download:

Games Contest

Participated in the
Games Contest