Car Game for Arduino

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

Be the First to Share

    Recommendations

    • Unusual Uses Contest

      Unusual Uses Contest
    • 3D Printed Student Design Challenge

      3D Printed Student Design Challenge
    • Edible Art Challenge

      Edible Art Challenge

    4 Comments

    0
    chickenwang
    chickenwang

    1 year ago

    im from afgoonistan i am looking for the answer to arduino car driver

    0
    simaopintocorreia
    simaopintocorreia

    Reply 1 year ago

    Sory but I do not understain the answer.
    Can you explain more?

    0
    Perrin Lozano
    Perrin Lozano

    Question 1 year ago on Step 3

    the code doesnt workk ontinkercade

    0
    simaopintocorreia
    simaopintocorreia

    Reply 1 year ago

    Yes I know. I think that code just work in the real life. If you can try to run this on a real arduino. Anyaway I go to make sure that is every thing Ok. Thanks to say to me.