T.H,M.W
Published © GPL3+

Ardu-Man 2024

The Ardu-Man console is a small arcade machine where you can play a simplified version of Pac-Man with sound and light effects.

IntermediateShowcase (no instructions)10 hours423
Ardu-Man 2024

Things used in this project

Hardware components

Arduino Nano R3
Arduino Nano R3
×3
I2C 16x2 Arduino LCD Display Module
DFRobot I2C 16x2 Arduino LCD Display Module
×1
KY-023 Joystick
×1
DFPlayer - A Mini MP3 Player
DFRobot DFPlayer - A Mini MP3 Player
×1
speaker
×1
LED Strip, NeoPixel Digital RGB
LED Strip, NeoPixel Digital RGB
×1
Machine Screw, M2.5
Machine Screw, M2.5
×20
Machine Screw, M3
Machine Screw, M3
×4
resistor SMD 1206
×2
resistor SMD 1K
×1
Rocker Switch, Non Illuminated
Rocker Switch, Non Illuminated
×1
18650 Samsung
×2
Jumper wires (generic)
Jumper wires (generic)
×1
superglue
×1
6-pin Header & Gender Changer (5-pack)
Digilent 6-pin Header & Gender Changer (5-pack)
×1
socket strips
×8
washers and nuts
×1
PLA
×1
18650 battery holder
×1
Flash Memory Card, SD Card
Flash Memory Card, SD Card
×1

Software apps and online services

Fusion
Autodesk Fusion
For designing the 3D model of the case
Autodesk EAGLE
Autodesk EAGLE
To create the file for the board milling machine
Meshmixer
To edit the audio files for the Pacman sounds
Arduino IDE
Arduino IDE
To edit and write the code

Hand tools and fabrication machines

Soldering iron (generic)
Soldering iron (generic)
3D Printer (generic)
3D Printer (generic)
Board milling machine
Mini Side Cutter, 120mm Length with 25mm Jaw Capacity
Mini Side Cutter, 120mm Length with 25mm Jaw Capacity
Digilent Screwdriver
Digilent Screwdriver
Solder Wire, Lead Free
Solder Wire, Lead Free
Mastech MS8217 Autorange Digital Multimeter
Digilent Mastech MS8217 Autorange Digital Multimeter
tweezer

Story

Read more

Custom parts and enclosures

complete console

Sketchfab still processing.

basic body

Sketchfab still processing.

Led stripe left

Sketchfab still processing.

LED stripe right

Sketchfab still processing.

left sidepanel

Sketchfab still processing.

right sidepanel

Sketchfab still processing.

Roof

Sketchfab still processing.

0001pacman_sound.mp3

0002waka_waka_pacman.mp3

0003pacman_death_sound.mp3

0004pacman_new_level.mp3

video from running light

Schematics

circuit diagram

circuit board layout

Code

03_Game_Arduino.ino

C/C++
// THE POOR'S MAN CONSOLE
// ARDU-MAN
// wwww.bleepbit.com
// (C) 2018

// LIBRAY
#include <Wire.h>
#include <VirtualWire.h>
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x27,16,2);





// VARIABLES DECLARATION
int game = 0;
int cc = 2;
int mov = 0;
int gameover = 0;
int le = 0;
int randomNumber = 0;
int labirinth[11][2];
int ay = 0;
int ax = 0;
int x = 0;
int y = 0;
int incx = 0;
int incy = 0;
int key = LOW;
int timegame = 1111;
int pills = 16;
char LED ;

// CHARS DECLARATION
byte left[8] = {
  B11111,
  B00001,
  B10000,
  B11000,
  B10000,
  B00001,
  B11111,
  B11111,
};
  byte right[8] = {
  B11111,
  B10000,
  B00001,
  B00011,
  B00001,
  B10000,
  B11111,
  B11111,
};
  byte circle[8] = {
  B11111,
  B10001,
  B00000,
  B00000,
  B00000,
  B10001,
  B11111,
  B11111,
};
  byte lab[8] = {
  B00000,
  B00000,
  B00000,
  B00000,
  B00000,
  B00000,
  B00000,
  B00000,
};
  byte pin[8] = {
  B11111,
  B11111,
  B11111,
  B11011,
  B11111,
  B11111,
  B11111,
  B11111,
};
  byte nothing[8] = {
  B11111,
  B11111,
  B11111,
  B11111,
  B11111,
  B11111,
  B11111,
  B11111,
};
 byte crash[8] = {
B10001,
B01000,
B10001,
B01000,
B00010,
B10001,
B00100,
B01001,
};
 byte happy[8] = {
B10001,
B00000,
B01010,
B00000,
B01110,
B00100,
B10001,
B11111,
};


 
void setup(){
  lcd.init();
  lcd.backlight();
  lcd.home();
  lcd.clear();
  lcd.createChar(1, left);
  lcd.createChar(2, right);
  lcd.createChar(3, circle);  
  lcd.createChar(4, lab);
  lcd.createChar(5, pin);
  lcd.createChar(6, nothing);
  lcd.createChar(7, crash);
  lcd.createChar(8, happy);
  pinMode(13, INPUT_PULLUP);
  
  Serial.begin(9600);
  Wire.begin();
  for(int i = 0; i<1; i++){
   Wire.beginTransmission(5);
   Wire.write(1);
   Wire.endTransmission();
   Serial.println("Verbindug Hergestellt");
  }
}

  
void loop(){
  if (game == 0)
  {
    if (gameover == 0)
      {
      // SPLASH SCREEN
        Wire.beginTransmission(5 && 6); 
        Wire.write('K');      
        Wire.endTransmission();
        delay(10);
        lcd.home();
        lcd.setCursor(0, 0);
        lcd.print("    ARDU-MAN");
        lcd.setCursor(0, 1);
        lcd.print("      2024"); 
        // lcd.print("poor man's game"); 
        key = digitalRead(13);
        if (key == LOW)
        {
        Serial.println ("Taster gedrckt");
        // START GAME
        lcd.clear();
        lcd.home();
        delay (500);
        le = 0;
        gameover = 1;
        } 
       }
     else
       {
           // NEW SCREEN
            ay = 0;
            ax = 0;
            x = 0;
            y = 0;
            incx = 0;
            incy = 0;
            game = 1;
            key = LOW;
            cc = 2;
            le = le + 1;
            pills = 16;
           randomSeed(analogRead(0));
           for(int i=0;i<2;i++)
           {
             for(int s=0;s<11;s++)
             {
             lcd.setCursor(s, i);
             labirinth[s][i] = 0;
             lcd.write(byte(5));         
             }
           }
          
          for(int s=2;s<11;s=s+2)
             {
             randomNumber = int(random(0, 2));
             lcd.setCursor(s, randomNumber);
             labirinth[s][randomNumber] = 2;
             lcd.write(byte(4));  
                 
            }
            
           lcd.setCursor(0, 1);
           labirinth[0][1] = 2;
           lcd.write(byte(4));
           lcd.setCursor(12, 0);
           lcd.print("L 00");
           lcd.setCursor(16-String(le).length(), 0);
           lcd.print(le);
           lcd.setCursor(12, 1);
           lcd.print("0000");
           timegame = 1111;
     }
  }
  else
  {
    
  // GAME LOOP
  lcd.home();
  lcd.setCursor(x, y);
  lcd.write(byte(6)); 
  x = x + incx;
  y = y + incy;
  incx = 0;
  incy = 0;

  // CHECK LIVE OR DIE
  if ((labirinth[x][y] < 2) && (timegame > 1))
  {

  if (labirinth[x][y] == 0)
      {
      pills = pills - 1;
      labirinth[x][y] = 1;
      }
      
  lcd.setCursor(x, y);
  if (mov == 1)
  {
    lcd.write(byte(cc));
    mov = 0;
  }
  else
  {
  lcd.write(byte(3));
  mov = 1;
  }
  ay = analogRead(1);   
  ax = analogRead(0);
  if ((ax >600)  && (x<10))
  {
    incx = 1;
    incy = 0;
    cc = 2;
    WakaWaka ();
  }
  
  if ((ax < 400) && (x>0))
  {
    incx = -1;
    incy = 0;
    cc = 1;
    WakaWaka ();
  }
  
  if ((ay <400) && (y == 1))
  {
    incx = 0;
    incy = -1;
    WakaWaka ();
  }
  
  if ((ay > 600) && (y == 0))
  {
    incx = 0;
    incy = 1;
    WakaWaka ();
  }

 timegame = timegame - le*10;
  lcd.setCursor(12, 1);
  lcd.print("0000");
  lcd.setCursor(16-String(timegame).length(), 1);
  lcd.print(timegame);
  delay(200);

  // CHECK LEVEL CLEAR
      if (pills == 0)
      {
      // LEVEL CLEAR
        lcd.setCursor(x, y);
  lcd.write(byte(8)); 
      lcd.setCursor(12, 0);
      lcd.print("NEXT");
      lcd.setCursor(12, 1);
      lcd.print("LEVL");
      LED = 'G';
      for(int h = 0; h<1; h++){
      if(LED == 'G') {
      Wire.beginTransmission(5); 
      Wire.write('G');
      //delay (100);
      Wire.endTransmission();
      Serial.println("Transmission complete");
      Wire.beginTransmission(6); 
      Wire.write('N');      
      Wire.endTransmission();
      delay(10);
    }
      delay(4660);
      lcd.clear();    
      game = 0;
      gameover = 1;
      }
      }
  
    // END GAME LOOP
  }
  else
  {
  //  GAME OVER
  if (timegame>0)
  {
   lcd.setCursor(x, y);
  lcd.write(byte(7)); 
  }
  lcd.setCursor(12, 0);
  lcd.print("GAME");
  lcd.setCursor(12, 1);
  lcd.print("OVER");
  for (int g = 0; g<1; g++){ 
      Wire.beginTransmission(5);
      Wire.write('R');
      Wire.endTransmission();
      //delay(10);
      Wire.beginTransmission(6);
      Wire.write('G');
      Wire.endTransmission();
      Serial.println("Transmission complete");
      delay(10);
  }
  delay(2000);
  lcd.clear();  
  lcd.setCursor (6,0);
  lcd.print("TRY-");
  lcd.setCursor (5,1);
  lcd.print("AGAIN!"); 
  delay (2000);
  lcd.clear ();
  game = 0;
  gameover =0;
  }


  }
}
   
void WakaWaka (){
   for ( int w =0; w<1; w++){
    Wire.beginTransmission(6);
      Wire.write('W');
      Wire.endTransmission();
      delay(10); 
      Serial.println ("WakaWaka"); 
   }
}
  




  

04_LED_Arduino.ino

C/C++
#include <Wire.h>
#include <Adafruit_NeoPixel.h>

#define PIN            13  // Der Pin, an dem der Datenanschluss der LEDs angeschlossen ist
#define NUMPIXELS      37 // Anzahl der LEDs im Streifen
#define ACTIVE_PIXELS  15 // Anzahl der LEDs, die gleichzeitig leuchten sollen
#define PIXELS_PER_COLOR 3 // Anzahl der LEDs pro Farbe (in diesem Fall 12 LEDs, 3 Farben)
Adafruit_NeoPixel strip = Adafruit_NeoPixel(NUMPIXELS, PIN, NEO_GRB + NEO_KHZ800);
volatile char ledStatus = 'K';

void setup(){ 
  Wire.begin(5);
  Wire.onReceive(receiveEvent);
  Serial.begin(9600);
  strip.begin();
  strip.show();
}

void receiveEvent (int bytes){
    while(Wire.available()){
    char information = Wire.read();
    
    switch (information){
      case 'G':
        Serial.println("Grn" );
        ledStatus = 'G';
        delay (20);
        break;
      case 'R':
        Serial.println("Rot");
        ledStatus = 'R';
        delay (20);
        break;
      case 'K': 
        Serial.println("Normal Betrieb");
        ledStatus = 'K';
        delay (20);
        break;
      
    }
  }
}


void loop(){
  switch (ledStatus){
    case 'G': 
      strip.clear();
      for(int h=0; h<NUMPIXELS; h++){
        strip.setPixelColor(h, strip.Color(0,180,0));
        strip.show();
      }
      delay (3000);
      ledStatus = 'K';
      break;
    case 'R':
      strip.clear();
      for(int h=0; h<NUMPIXELS; h++){
        strip.setPixelColor(h, strip.Color(255,0,0));
        strip.show();
      }
      delay (3000);
      ledStatus = 'K' ;
      break;
    case 'K':
      for (int start = 0; start < NUMPIXELS; start++) {
        for (int i = 0; i < NUMPIXELS; i++) {
          strip.setPixelColor(i, strip.Color(0, 0, 0));
        }
        for (int i = 0; i < ACTIVE_PIXELS; i++) {
          int ledIndex = (start + i) % NUMPIXELS; 
          int colorIndex = (i / (ACTIVE_PIXELS / 5)) % 5; 
          uint32_t color;
          switch (colorIndex) {
            case 0: color = strip.Color(255, 140, 0); break; 
            case 1: color = strip.Color(140, 0, 0); break; 
            case 2: color = strip.Color(150, 12, 20); break;
            case 3: color = strip.Color(255, 50, 0 ); break; 
            case 4: color = strip.Color(20, 55, 255); break; 
          }
        strip.setPixelColor(ledIndex, color);
      }
      strip.show(); 
      delay(50); 
    }
      break;
  
  }    
}




  

08_MP3_Arduino.ino

C/C++
#include "SoftwareSerial.h"
#include "DFRobotDFPlayerMini.h"
#include <Wire.h>

// Initialize software serial on pins 10 and 11
SoftwareSerial mySoftwareSerial(10, 11);  // RX, TX
DFRobotDFPlayerMini myDFPlayer;

// Command variables
volatile char Mp3Status = 'K'; // Default state

void setup() {
  delay(1000);
  Wire.begin(6);
  Wire.onReceive(receiveEvent);
  
  mySoftwareSerial.begin(9600);
  Serial.begin(9600);
  Serial.println(F("DFRobot DFPlayer Mini"));
  Serial.println(F("Initializing DFPlayer module... Wait!"));

  if (!myDFPlayer.begin(mySoftwareSerial)) {
    Serial.println(F("Initialization failed!"));
    while (true); // Stay here forever
  }
  
  Serial.println(F("DFPlayer Mini module initialized!"));
  myDFPlayer.setTimeOut(500);
  myDFPlayer.volume(20);        
  myDFPlayer.EQ(0);
}

void receiveEvent(int bytes) {
  while (Wire.available()) {
    char information = Wire.read();
    
    switch (information) {
      case 'W':
        Serial.println("Waka Waka");
        Mp3Status = 'W';
        break;
      case 'G':
        Serial.println("Game Over");
        Mp3Status = 'G';
        break;
      case 'N':
        Serial.println("Next Level");
        Mp3Status = 'N';
        break;
      case 'K':
        Serial.println("Normal Betrieb");
        Mp3Status = 'K';
        break;
    }
  }
}

void loop() {
  switch (Mp3Status) {
    case 'W':
      Serial.println("Playing Waka Waka");
      myDFPlayer.play(2);
      Mp3Status = 'A';
      delay (665);
      break;
    case 'G':
      Serial.println("Playing Game Over");
      myDFPlayer.play(3);
      Mp3Status = 'K';
      delay(1671);
      break;
    case 'N':
      Serial.println("Playing Next Level");
      myDFPlayer.play(4);
      Mp3Status = 'A';
      delay(4660);
      break;
    case 'K':
      Serial.println("Playing Menu");
      myDFPlayer.play(1);
      delay (4336);
      break;
  }
  delay(1); 
}

Credits

T.H,M.W
1 project • 2 followers
Thanks to bleepit.

Comments