In this post, I’ll show you how to add sound to a wheeled robot.
Shout out to the late Gordon McComb for this project idea. He is the author of an excellent book that I recommend buying if you’re getting started with robotics: How to Make a Robot.
Requirements
Here are the requirements:
- Build a wheeled robot that makes sound before it backs up.
You Will Need
The following components are used in this project. You will need:
Directions
Get the Piezo Transducer.
Stick the positive lead of the transducer into cell j26. Stick the other lead of the transducer into cell j29.
Connect digital pin 5 of the Arduino board to cell f26 of the breadboard.
Connect f29 to e29 with a male to male jumper wire, or just make sure that j29 is electrically connected to Ground.

Upload the following sketch to the Arduino breadboard to test the Piezo transducer.
#define SPKR 5 /** * Test the piezo transducer * connected to pin 5 * * @author Addison Sears-Collins * @version 1.0 2019-05-15 */ void setup() { } // Play sounds over and // over again void loop() { tone(SPKR, 247, 300); //247 Hz, 300ms delay(200); tone(SPKR, 131, 300); delay(200); tone(SPKR, 1175, 300); delay(200); tone(SPKR, 262, 300); delay(200); tone(SPKR, 1175, 300); delay(200); tone(SPKR, 131, 300); delay(200); tone(SPKR, 262, 300); delay(200); tone(SPKR, 1175, 300); delay(200); tone(SPKR, 247, 300); //247 Hz, 300ms delay(200); }
Upload the following sketch to the Arduino breadboard in order to cause the robot to make sound just before it backs up.
#include <Servo.h> /** * This robot will move around a room and when it * bumps into an object, it will turn around and * go in another direction. It will make a noise * just before it backs up. * * @author Addison Sears-Collins * @version 1.0 2019-05-12 */ #define SPKR 5 // Create two servo objects, one for each wheel Servo right_servo; Servo left_servo; // Volatile keyword is used because these variables // can change at any time without any action having been // taken by the compiled code. volatile int left_switch = LOW; // Left switch flag volatile int right_switch = LOW; // Right switch flag boolean already_started = false; /* * This setup code is run only once, when Arudino is * supplied with power. */ void setup() { // Set the pin modes for the switches pinMode(2, INPUT); // Right switch is input pinMode(3, INPUT); // Left switch is input pinMode(4, OUTPUT); // Pin 4 is ground // Turn on the internal pull up resistors for the switches // Keeps input from floating when the switches are not // pressed digitalWrite(2, HIGH); // Right switch default to high digitalWrite(3, HIGH); // Left switch default to high digitalWrite(4, LOW); // Pin 4 default is ground right_servo.attach(9); // Right servo is pin 9 left_servo.attach(10); // Left servo is pin 10 // Declare the interrupts // attachInterrupt(digitalPinToInterrupt(pin), ISR, mode) // Interrupt when go from high to low attachInterrupt(digitalPinToInterrupt(2), hit_right, FALLING); attachInterrupt(digitalPinToInterrupt(3), hit_left, FALLING); already_started = true; // Bot can now move } void loop() { if (left_switch == HIGH) { // If the left switch is hit go_backwards(); // Go backwards for one second delay(1000); go_right(); // Turn to the right for one second delay(1000); go_forward(); // Move forward left_switch = LOW; // Reset the flag } if (right_switch == HIGH) { // If the right switch is hit go_backwards(); // Go backwards for one second delay(1000); go_left(); // Turn left for one second delay(1000); go_forward(); // Move forward right_switch = LOW; // Reset the flag } } // Interrupt routine for left switch bumping into an object void hit_left() { if (already_started) // Valid if the program has begun left_switch = HIGH; } // Interrupt routine for right switch bumping into an object void hit_right() { if (already_started) // Valid if the program has begun right_switch = HIGH; } /* * Forwards, backwards, right, left, stop. */ void go_forward() { right_servo.write(0); left_servo.write(180); } void go_backwards() { // Make a noise before you go backwards tone(SPKR, 247, 300); //247 Hz, 300ms delay(200); tone(SPKR, 131, 300); delay(200); tone(SPKR, 1175, 300); delay(200); right_servo.write(180); left_servo.write(0); } void go_right() { right_servo.write(180); left_servo.write(180); } void go_left() { right_servo.write(0); left_servo.write(0); } /* void stop_all() { right_servo.write(90); // Tweak the 90 left_servo.write(90); // Tweak the 90 } */