Welcome to Hackster!
Hackster is a community dedicated to learning hardware, from beginner to pro. Join us, it's free!
Tony Batey
Published

TinyDuino Video Games

Create your own Tiny Video Game console using the TinyDuino.

Full instructions provided9,041

Things used in this project

Hardware components

TinyShield Joystick
×1
OLED TinyScreen
×1
TinyDuino Processor
×1
TinyShield USB
×1
TinyScreen Video Game Kit
×1

Story

Read more

Code

Untitled file

Arduino
#include <TinyScreen.h>
#include <SPI.h>
#include <Wire.h>

TinyScreen display = TinyScreen(0);

#define	BLACK           0x00
#define	BLUE            0xE0
#define	RED             0x03
#define	GREEN           0x1C
#define WHITE           0xFF
#define	GREY            0x6D

int RX=0;
int RY=0;
int LX=0;
int LY=0;
byte leftButton=0;
byte rightButton=0;


void setup(void) {
  Wire.begin();
  Serial.begin(9600);
  display.begin();
}

void loop() {
  getJoystick();
  
  byte color;
  byte activeColor;
  
  if(leftButton)activeColor=RED;else activeColor=GREEN;
  if(LY>200)color=activeColor;else color=GREY;
  drawUpArrow(24,8,10,color);
  if(LY<-200)color=activeColor;else color=GREY;
  drawDownArrow(24,56,10,color);
  if(LX>200)color=activeColor;else color=GREY;
  drawRightArrow(47,32,10,color);
  if(LX<-200)color=activeColor;else color=GREY;
  drawLeftArrow(1,32,10,color);
  if(abs(LY)<200 && abs(LX)<200)color=activeColor;else color=GREY;
  drawFilledCircle(24, 32, 8, color);
  
  if(rightButton)activeColor=RED;else activeColor=GREEN;
  if(RY>200)color=activeColor;else color=GREY;
  drawUpArrow(24+48,8,10,color);
  if(RY<-200)color=activeColor;else color=GREY;
  drawDownArrow(24+48,56,10,color);
  if(RX>200)color=activeColor;else color=GREY;
  drawRightArrow(47+48,32,10,color);
  if(RX<-200)color=activeColor;else color=GREY;
  drawLeftArrow(1+48,32,10,color);
  if(abs(RY)<200 && abs(RX)<200)color=activeColor;else color=GREY;
  drawFilledCircle(24+48, 32, 8, color);
  
  delay(50);
  
}

void drawFilledCircle(int x0, int y0, int radius, uint8_t color)
{
  int x = radius;
  int y = 0;
  int radiusError = 1-x;
 
  while(x >= y)
  {
    display.drawLine(x0+x,y0+y,x0-x,y0+y,color);
    display.drawLine(x0+y,y0+x,x0-y,y0+x,color);
    display.drawLine(x0-x,y0-y,x0+x,y0-y,color);
    display.drawLine(x0-y,y0-x,x0+y,y0-x,color);
    y++;
    if (radiusError<0)
    {
      radiusError += 2 * y + 1;
    }
    else
    {
      x--;
      radiusError += 2 * (y - x) + 1;
    }
  }
}

void drawDownArrow(int x, int y, int height, byte color){
  for(int i=0;i<=height;i++){
    display.drawLine(x-i,y-i,x+i,y-i,color);
    delayMicroseconds(100);
  }
}

void drawUpArrow(int x, int y, int height, byte color){
  for(int i=0;i<=height;i++){
    display.drawLine(x-i,y+i,x+i,y+i,color);
    delayMicroseconds(100);
  }
}

void drawRightArrow(int x, int y, int height, byte color){
  for(int i=0;i<=height;i++){
    display.drawLine(x-i,y+i,x-i,y-i,color);
    delayMicroseconds(100);
  }
}

void drawLeftArrow(int x, int y, int height, byte color){
  for(int i=0;i<=height;i++){
    display.drawLine(x+i,y+i,x+i,y-i,color);
    delayMicroseconds(100);
  }
}

void getJoystick(){
  Wire.requestFrom(0x22,6);
  int data[4];
  for(int i=0;i<4;i++){
    data[i]=Wire.read();
  }
  byte lsb=Wire.read();
  byte buttons=~Wire.read();
  leftButton=buttons&4;
  rightButton=buttons&8;
  for(int i=0;i<4;i++){
    data[i]<<=2;
    data[i]|= ((lsb>>(i*2))&3);
    data[i]-=511;
  }
  RX=data[0];
  RY=-data[1];
  LX=-data[2];
  LY=data[3];
}

Joystick Example

Shows what direction each Joystick is being pushed as well as which button.

Mario Jump Demo

Asteroids

Space Invaders

Credits

Tony Batey
10 projects • 75 followers
Student at the University of Akron and Electrical Engineer at TinyCircuits.
Contact

Comments

Please log in or sign up to comment.