High-5
Project Description
My project is to build an entertaining automated machine, using the Arduino Uno, that will give the user a high-five. For conciseness, the machine will simply be called High-5. Essentially, it will be a placed upon a base behind the 3D printed object. This object of my design is mounted with two sets of red and green LEDs, an LCD screen, and an ultrasonic sensor. On top of the base, attached to a servo motor, is a hollowed plastic rod in which is running a microswitch wire connected to Arduino and breadboard. Perched on top of the plastic rod is a cut-out foam hand embedded with a microswitch to register if contact was made or not. The motor will rotate towards the user, and that will consequentially move the rod towards him in a minor arc motion. Once contact has been made and the microswitch pressed, the High-5 will light up green LEDs, display a positive message, and play a jingle. If the microswitch is not pressed within a delay of time, High-5 will return in the starting position, and display a negative message while lighting up red LEDs.
Fit a Microswitch Inside a Foam Hand, and Hook It Up to the Arduino.
Take a square foam and cut it to resemble a hand. In the middle, place a microswitch that has been soldered to long wires, which can be placed through a hollowed plastic rod. The idea is that the motor will move once the ultrasonic sensor detects an object in front of the device.
Prepare Two Sets of LED Light
As an amateur, I bunched together a set of red and green LEDs. Each LED has their own pin on the Arduino.
LEDs & LCD in Place for Feedback to Your Face.
Install the LEDs and LCD in such a way that when the microswitch is pressed, green LEDs will light up and display a message. Oppositely, if the microswitch is not pressed, it will light up the red LEDs and display a different message.
Mount the Arm
Rather self-explanatory. Make sure that the arm is fastened to a servo motor, and that the whole is docked well enough that it can take a light tap, or move the arm, without falling over.
Sound Can Be a Feedback Too
Might as well add a Piezo speaker so that when the microswitch is pressed, it will play a nice, encouraging jingle.
Device Schematic
The High-5 sure looks like a mess, but it does work. The following schematic should help in viewing what goes to which pin.
Software Code.
#include <Servo.h>
Servo myServo;
#include <LiquidCrystal.h>
LiquidCrystal lcd(12, 11, 5, 4, 3, 2); // Pins used for the LCD
const int trigPin = 9; // pin detects when to start measurements
const int echoPin = 10; // delivers and receives the sonic pulse
const int handSwitch = 13; // microswitch embedded in the hand
long duration;
int distance;
const int greenLED1 = A0; // green LEDs from pin A0 to A2
const int greenLED2 = A1;
const int greenLED3 = A2;
const int redLED1 = A3; // red LEDs from pin A3 to A5
const int redLED2 = A4;
const int redLED3 = A5;
int handSwitchStatus = 0; // When microswitch is open
long t = 0;
int firstSetup = 0; // High-5 in starting position
int speakerPin = 7; // pin used for Piezo speaker
char notes[] = "azbC"; // this code is sourced by ianklatzco @ www.gist.github.com
int length = sizeof(notes); and plays a four-note jingle.
int beats[] = { 2, 3, 3, 16};
int tempo = 75;
void playTone(int tone, int duration) {
for (long i = 0; i < duration * 1000L; i += tone * 2) {
digitalWrite(speakerPin, HIGH);
delayMicroseconds(tone);
digitalWrite(speakerPin, LOW);
delayMicroseconds(tone);
}
}
void playNote(char note, int duration) {
char names[] = { 'c', 'd', 'e', 'f', 'g', 'x', 'a', 'z', 'b', 'C', 'y', 'D', 'w', 'E', 'F', 'q', 'G', 'i' };
// c=C4, C = C5. These values have been tuned.
int tones[] = { 1898, 1690, 1500, 1420, 1265, 1194, 1126, 1063, 1001, 947, 893, 843, 795, 749, 710, 668, 630, 594 };
// play the tone corresponding to the note name
for (int i = 0; i < 18; i++) {
if (names[i] == note) {
playTone(tones[i], duration);
} // end of referred source code
}
}
void setup() {
pinMode(trigPin, OUTPUT); // setup for the ultrasonic sensor, piezo, servo
pinMode(echoPin, INPUT); motor, LCD, microswitch, and LEDs.
pinMode(speakerPin, OUTPUT);
pinMode(greenLED1, OUTPUT);
pinMode(greenLED2, OUTPUT);
pinMode(greenLED3, OUTPUT);
pinMode(redLED1, OUTPUT);
pinMode(redLED2, OUTPUT);
pinMode(redLED3, OUTPUT);
Serial.begin(9600);
myServo.attach(6); // Servo motor on digital pin 6
lcd.begin(16, 2); // activate LCD
pinMode(handSwitch, INPUT); // setup microswitch as input
myServo.write(0); // initial motor position
}
void loop() {
digitalWrite(trigPin, LOW); // ultrasonic sensor deactivated
delayMicroseconds(2);
digitalWrite(trigPin, HIGH); // ultrasonic sensor activated
delayMicroseconds(10);
digitalWrite(trigPin, LOW);
duration = pulseIn(echoPin, HIGH); // reflected pulse and distance traveled
distance = duration * 0.034 / 2; // distance travelled by speed of sound
lcd.clear(); divided in half for the length in one-way
lcd.print("Hey there!"); // initial greeting on LCD
lcd.setCursor(0, 1);
lcd.print("High five?"); // print message on LCD
if (distance < 30) { // distance perimeter that activates High-5
lcd.clear();
lcd.print("Get some!!"); // changes display message
myServo.write(40); // motor goes from 0° to 40°
t = millis();
while ((t + 6000 > millis()) && (firstSetup == 0)) { // initial loop
handSwitchStatus = digitalRead(handSwitch);
if (handSwitchStatus == HIGH) // switch is pressed
firstSetup = 1; // change loop
}
if (firstSetup == 1 ) { // starts positive feedback
lcd.clear();
lcd.print("Atta Boy!"); // positive message
digitalWrite(greenLED1, HIGH); // light green LEDs
digitalWrite(greenLED2, HIGH);
digitalWrite(greenLED3, HIGH);
for (int i = 0; i < length; i++) { // play jingle
if (notes[i] == ' ') {
delay(beats[i] * tempo); // rest
} else {
playNote(notes[i], beats[i] * tempo);
}
}
delay(3000);
myServo.write(0); // return to standby mode
firstSetup = 0; and close LEDs
digitalWrite(greenLED1, LOW);
digitalWrite(greenLED2, LOW);
digitalWrite(greenLED3, LOW);
}
else { // negative feedback (message + lights)
lcd.clear();
lcd.print("Fine, ingrate.");
digitalWrite(redLED1, HIGH);
digitalWrite(redLED2, HIGH);
digitalWrite(redLED3, HIGH);
myServo.write(0); // return to standby mode and close LEDs
delay(6000);
digitalWrite(redLED1, LOW);
digitalWrite(redLED2, LOW);
digitalWrite(redLED3, LOW);
}
}
}
A Quick Example (minus the Jingle)
Copyrights and all...