RobotInputs

Examples > Robot

Inputs

This sketch shows you how to use the control board potentiometer and buttons as a keyboard. It turns the robot into a mobile music machine, have some fun with the music by pressing different buttons.

Hardware Required

  • Arduino Robot

Instruction

  1. Upload the example, you can keep USB plugged in once finished.

  2. After the starting screen, you will hear the music playing.

  3. On the screen, the vertical blue bar indicates the tempo of the music. The horizontal bar in orange shows the pitch. The cross shape in the middle represents the buttons, and the circle on the bottom left corresponds to the knob.

  4. Press different buttons, or try rotating the knob. You should see the interface on the screen change.

Try it out

LottieLemon illustration 780

Test the inputs on the robot

Code


/* Robot Inputs

 This sketch shows you how to use the on-board

 potentiometer and buttons as inputs.

 Turning the potentiometer draws a clock-shaped

 circle. The up and down buttons change the pitch,

 while the left and right buttons change the tempo.

 The middle button resets tempo and pitch.

 Circuit:

 * Arduino Robot

 created 1 May 2013

 by X. Yang

 modified 12 May 2013

 by D. Cuartielles

 This example is in the public domain

 */

#include <ArduinoRobot.h>
#include <Wire.h>

// default tempo and pitch of the music
int tempo = 60;
int pitch = 1000;

void setup() {

  // initialize the Robot, SD card, speaker, and display

  Robot.begin();

  Robot.beginTFT();

  Robot.beginSpeaker();

  Robot.beginSD();

  // draw "lg0.bmp" and "lg1.bmp" on the screen

  Robot.displayLogos();

  // play a sound file

  Robot.playFile("Melody.sqm");
}

void loop() {

  // check the value of the buttons

  keyDown(Robot.keyboardRead());

  // check the value of the pot

  drawKnob(Robot.knobRead());
}

// Draw the basic interface
void renderUI() {

  //fill the buttons blank

  Robot.fill(255, 255, 255);

  Robot.rect(53, 58, 13, 13); // left

  Robot.rect(93, 58, 13, 13); // right

  Robot.rect(73, 38, 13, 13); // up

  Robot.circle(79, 64, 6); // middle

  Robot.rect(73, 78, 13, 13); // down

  //draw the knob

  Robot.noFill();

  Robot.circle(26, 116, 17); // knob

  //draw the vertical bargraph

  int fullPart = map(pitch, 200, 2000, 0, 58); //length of filled bargraph

  Robot.fill(255, 255, 255);

  Robot.rect(21, 30, 13, 58 - fullPart);

  Robot.fill(0, 0, 255);

  Robot.rect(21, 88 - fullPart, 13, fullPart); //58-fullPart+30

  //draw the horizontal bargraph

  fullPart = map(tempo, 20, 100, 0, 58);  // length of filled bargraph

  Robot.fill(255, 190, 0);

  Robot.rect(53, 110, fullPart, 13);

  Robot.fill(255, 255, 255);

  Robot.rect(53 + fullPart, 110, 58 - fullPart, 13);
}

void keyDown(int keyCode) {

  // use a static int so it is persistent over time

  static int oldKey;

  switch (keyCode) {

    case BUTTON_LEFT:

      //left button pressed, reduces tempo

      tempo -= 5;

      if (tempo < 20) {

        tempo = 20;  //lowest tempo 20

      }

      Robot.fill(255, 190, 0);

      Robot.rect(53, 58, 13, 13);

      break;

    case BUTTON_RIGHT:

      //right button pressed, increases tempo

      tempo += 5;

      if (tempo > 100) {

        tempo = 100;  //highest tempo 100

      }

      Robot.fill(255, 190, 0);

      Robot.rect(93, 58, 13, 13);

      break;

    case BUTTON_UP:

      //up button pressed, increases pitch

      pitch += 120;

      if (pitch > 2000) {

        pitch = 2000;

      }

      Robot.fill(0, 0, 255);

      Robot.rect(73, 38, 13, 13);

      break;

    case BUTTON_DOWN:

      //down button pressed, reduces pitch

      pitch -= 120;

      if (pitch < 200) {

        pitch = 200;

      }

      Robot.fill(0, 0, 255);

      Robot.rect(73, 78, 13, 13);

      break;

    case BUTTON_MIDDLE:

      //middle button pressed, resets tempo and pitch

      tempo = 60;

      pitch = 1000;

      Robot.fill(160, 160, 160);

      Robot.circle(79, 64, 6);

      break;

    case BUTTON_NONE:

      //Only when the keys are released(thus BUTTON_NONE is

      //encountered the first time), the interface will be

      //re-drawn.

      if (oldKey != BUTTON_NONE) {

        renderUI();

      }

      break;

  }

  if (oldKey != keyCode) {

    // change the song's tempo

    Robot.tempoWrite(tempo);

    // change the song's pitch

    Robot.tuneWrite(float(pitch / 1000.0));

  }

  oldKey = keyCode;
}

//Draw a circle according to value
//of the knob.
void drawKnob(int val) {

  static int val_old;

  int r = map(val, 0, 1023, 1, 15);

  //Only updates when the

  //value changes.

  if (val_old != r) {

    Robot.noFill();

    //erase the old circle

    Robot.stroke(255, 255, 255);

    Robot.circle(26, 116, r + 1);

    //draw the new circle

    Robot.stroke(255, 0, 255);

    Robot.circle(26, 116, r);

    Robot.stroke(0, 0, 0);

    val_old = r;

  }
}

See Also: