26 April 2026

Final Controller - Group 9 , Final Fantasy


Final Fantasy 1 - Group 9 


Affordances/Description/Controls

For our final controller, we make a Final Fantasy-inspired tome/book controller to control the original Final Fantasy 1. The controller opens and closes with clasps, and on the front cover, we have a confirm/deconfirm button (we're sorry about the button; you have to do a lot of confirming/deconfirming in the game, and we couldn't find something else that was equally reliable). On the back cover, there's a potentiometer that handles left/right input. Sticking out of the book, we have 2 bookmarks acting as our open/closed circuits. Each bookmark controls either up or down.

On the inside of the book, we have 2 light sensors on opposite sides of the book. One light sensor on the first page, and one towards the back. Revealing the light sensor on the first page opens your party menu, and revealing the second light sensor activates your main menu.


Signifiers

On the front cover, we mapped the red button to confirm, as red is usually "confirm/go/forward" in controllers, with blue traditionally being "back/deselect". 

While one might not know immediately what the bookmarks do without being told/experimenting, the moving of up/down with them translates to the up/down movement of the player. 

The pages on the inside are labeled with which menu the light sensor opens up, telling the player which page opens.

The potentiometer on the back is also not as straightforward, but the left/right turn of the potentiometer will make sense once they've used it.


Feedback

The controller gives feedback with the buttons, the clicking sounds/the resistance of them. The bookmarks have a little "tick" that can be felt when they are moved all the way up. While the light sensors don't make a sound when they're revealed (that would be a good add if we ended up pursuing this further), the player will see the large menu open on screen. 




Controls

Red Button // Confirm

Blue Button // Back

Bookmark 1 // Up

Bookmark 2 // Down

Back Potentiometer // Left/Right

Right Light Sensor // Party Menu

Left Light Sensor // Main menu


Question

How could we have used sound in our design to make the feedback more apparent?




Pictures









Code


#include <Keyboard.h>

#include <Adafruit_CircuitPlayground.h>


// Initializing variables

const int photoRight = A1;

const int photoLeft = A4;

const int potPin = A2;


int potValue = 0;

int lastState = 0;


#define confirmButton 1

#define backButton 6


int upBookmark = A0;

int downBookmark = A7;


int lumoRight;

int lumoLeft;

int lumoThreshold = 200;


// Setup

void setup() {

  Serial.begin(9600);

  CircuitPlayground.begin();

  delay(1000);


  pinMode(confirmButton, INPUT);

  pinMode(backButton, INPUT);

  pinMode(upBookmark, INPUT);

  pinMode(downBookmark, INPUT);


  Keyboard.begin();

}


void loop() {


  SelectInputCheck();

  StartInputCheck();

  confirmButtonInputCheck();

  backButtonInputCheck();

  upInputCheck();

  downInputCheck();


  delay(150);


  potValue = analogRead(potPin);


  if (potValue < 512) {

    if (lastState != 1) {

      Keyboard.release(KEY_RIGHT_ARROW);

      Keyboard.press(KEY_LEFT_ARROW);

      lastState = 1;

    }

  } else {

    if (lastState != 2) {

      Keyboard.release(KEY_LEFT_ARROW);

      Keyboard.press(KEY_RIGHT_ARROW);

      lastState = 2;

    }

  }

}


// Select input

void SelectInputCheck() {

  lumoLeft = analogRead(photoLeft);


  if (lumoLeft < lumoThreshold) {

    Keyboard.write(KEY_LEFT_SHIFT);

    Serial.println("LEFT");

    delay(100);

    Keyboard.releaseAll();

  }

}


// Start input

void StartInputCheck() {

  lumoRight = analogRead(photoRight);


  if (lumoRight < lumoThreshold) {

    Keyboard.write(KEY_RETURN);

    Serial.println("START");

    delay(100);

    Keyboard.releaseAll();

  }

}


// Confirm button

void confirmButtonInputCheck() {

  if (digitalRead(confirmButton) == HIGH) {

    Keyboard.write('A');

    Serial.println("Confirm");

    delay(100);

    Keyboard.releaseAll();

  }

}


// Back button

void backButtonInputCheck() {

  if (digitalRead(backButton) == HIGH) {

    Keyboard.write('B');

    Serial.println("Back");

    delay(100);

    Keyboard.releaseAll();

  }

}


// Up input

void upInputCheck() {

  if (digitalRead(upBookmark) == HIGH) {

    Keyboard.press(KEY_UP_ARROW);

    Serial.println("Up");

    delay(100);

    Keyboard.releaseAll();

  }

}


// Down input

void downInputCheck() {

  if (digitalRead(downBookmark) == HIGH) {

    Keyboard.press(KEY_DOWN_ARROW);

    Serial.println("Down");

    delay(100);

    Keyboard.releaseAll();

  }

}






Schematic






Video



No comments:

Post a Comment

Note: Only a member of this blog may post a comment.