Packed in your AdaBox 002 is a little piezo buzzer. This will allow you to make your robot beep and boop.
The spacing of the piezo pins is perfect to put one side in the GND and the other in A1 as shown below. It doesn't matter which side of the buzzer goes into which spot.
The Code
For the fun of it, lets take the code from the previous step and make it play the Super Mario Bros. theme whenever you press button 1 on the controller. First, lets take a look at the code for the music.
We are going to use a variation of Becky's code from the wearable piezo project (Becky's code is a varition of Tiaga Galo's code - yay open source).
#define toneC 1911 #define toneC1 1804 #define toneD 1703 #define toneEb 1607 #define toneE 1517 #define toneF 1432 #define toneF1 1352 #define toneG 1276 #define toneAb 1204 #define toneA 1136 #define toneBb 1073 #define toneB 1012 #define tonec 955 #define tonec1 902 #define toned 851 #define toneeb 803 #define tonee 758 #define tonef 716 #define tonef1 676 #define toneg 638 #define toneab 602 #define tonea 568 #define tonebb 536 #define toneb 506 #define tonep 0 int speaker = A1; long vel = 20000; boolean hasplayed = false; void setup() { pinMode(speaker, OUTPUT); delay(2000); } int melod[] = {tonec, toneG, toneE, toneA, toneB, toneBb, toneA, toneG, tonee, toneg, tonea, tonef, toneg, tonee, tonec, toned, toneB}; int ritmo[] = {18, 18, 18, 12, 12, 6, 12, 8, 8, 8, 12, 6, 12, 12, 6, 6, 6}; void loop() { if (hasplayed == true){ return;} for (int i=0; i<17; i++) { int tom = melod[i]; int tempo = ritmo[i]; long tvalue = tempo * vel; tocar(tom, tvalue); delayMicroseconds(1000); } delay(1000); hasplayed = true; } void tocar(int tom, long tempo_value) { long tempo_gasto = 0; while (tempo_gasto < tempo_value) { digitalWrite(speaker, HIGH); delayMicroseconds(tom / 2); digitalWrite(speaker, LOW); delayMicroseconds(tom/2); tempo_gasto += tom; } }
Now, if we combine that code with the BLE controller code, and have it play the music when you tap button 1 on the controller...
#include <string.h> #include <Arduino.h> #include <SPI.h> #if not defined (_VARIANT_ARDUINO_DUE_X_) #include <SoftwareSerial.h> #endif #include "Adafruit_BLE.h" #include "Adafruit_BluefruitLE_SPI.h" #include "Adafruit_BluefruitLE_UART.h" #include "BluefruitConfig.h" #include <Wire.h> #include <Adafruit_MotorShield.h> // Create the motor shield object with the default I2C address Adafruit_MotorShield AFMS = Adafruit_MotorShield(); // And connect 2 DC motors to port M3 & M4 ! Adafruit_DCMotor *L_MOTOR = AFMS.getMotor(3); Adafruit_DCMotor *R_MOTOR = AFMS.getMotor(4); //Name your RC here String BROADCAST_NAME = "Adafruit Black Robot Rover"; String BROADCAST_CMD = String("AT+GAPDEVNAME=" + BROADCAST_NAME); Adafruit_BluefruitLE_SPI ble(BLUEFRUIT_SPI_CS, BLUEFRUIT_SPI_IRQ, BLUEFRUIT_SPI_RST); #define toneC 1911 #define toneC1 1804 #define toneD 1703 #define toneEb 1607 #define toneE 1517 #define toneF 1432 #define toneF1 1352 #define toneG 1276 #define toneAb 1204 #define toneA 1136 #define toneBb 1073 #define toneB 1012 #define tonec 955 #define tonec1 902 #define toned 851 #define toneeb 803 #define tonee 758 #define tonef 716 #define tonef1 676 #define toneg 638 #define toneab 602 #define tonea 568 #define tonebb 536 #define toneb 506 #define tonep 0 int speaker = A1; long vel = 20000; boolean hasplayed = false; // A small helper void error(const __FlashStringHelper*err) { Serial.println(err); while (1); } // function prototypes over in packetparser.cpp uint8_t readPacket(Adafruit_BLE *ble, uint16_t timeout); float parsefloat(uint8_t *buffer); void printHex(const uint8_t * data, const uint32_t numBytes); // the packet buffer extern uint8_t packetbuffer[]; char buf[60]; /**************************************************************************/ /*! @brief Sets up the HW an the BLE module (this function is called automatically on startup) */ /**************************************************************************/ void setup(void) { Serial.begin(9600); AFMS.begin(); // create with the default frequency 1.6KHz // turn on motors L_MOTOR->setSpeed(0); L_MOTOR->run(RELEASE); R_MOTOR->setSpeed(0); R_MOTOR->run(RELEASE); Serial.begin(115200); Serial.println(F("Adafruit Bluefruit Robot Controller Example")); Serial.println(F("-----------------------------------------")); /* Initialize the module */ BLEsetup(); pinMode(speaker, OUTPUT); L_MOTOR->setSpeed(155); R_MOTOR->setSpeed(155); } int melod[] = {tonec, toneG, toneE, toneA, toneB, toneBb, toneA, toneG, tonee, toneg, tonea, tonef, toneg, tonee, tonec, toned, toneB}; int ritmo[] = {18, 18, 18, 12, 12, 6, 12, 8, 8, 8, 12, 6, 12, 12, 6, 6, 6}; void loop(void) { // read new packet data uint8_t len = readPacket(&ble, BLE_READPACKET_TIMEOUT); readController(); } bool readController(){ // Buttons if (packetbuffer[1] == 'B') { uint8_t buttnum = packetbuffer[2] - '0'; boolean pressed = packetbuffer[3] - '0'; // Serial.println(buttnum); if (pressed) { if(buttnum == 1){ if (hasplayed == true){ return;} for (int i=0; i<17; i++) { int tom = melod[i]; int tempo = ritmo[i]; long tvalue = tempo * vel; tocar(tom, tvalue); delayMicroseconds(1000); } //delay(1000); hasplayed = true; } if(buttnum == 2){ } if(buttnum == 3){ } if(buttnum == 4){ } if(buttnum == 5){ L_MOTOR->run(FORWARD); R_MOTOR->run(FORWARD); } if(buttnum == 6){ L_MOTOR->run(BACKWARD); R_MOTOR->run(BACKWARD); } if(buttnum == 7){ L_MOTOR->run(RELEASE); R_MOTOR->run(FORWARD); } if(buttnum == 8){ L_MOTOR->run(FORWARD); R_MOTOR->run(RELEASE); } } else { L_MOTOR->run(RELEASE); R_MOTOR->run(RELEASE); hasplayed = false; } } } void BLEsetup(){ Serial.print(F("Initialising the Bluefruit LE module: ")); if ( !ble.begin(VERBOSE_MODE) ) { error(F("Couldn't find Bluefruit, make sure it's in CoMmanD mode & check wiring?")); } Serial.println( F("OK!") ); /* Perform a factory reset to make sure everything is in a known state */ Serial.println(F("Performing a factory reset: ")); if (! ble.factoryReset() ){ error(F("Couldn't factory reset")); } //Convert the name change command to a char array BROADCAST_CMD.toCharArray(buf, 60); //Change the broadcast device name here! if(ble.sendCommandCheckOK(buf)){ Serial.println("name changed"); } delay(250); //reset to take effect if(ble.sendCommandCheckOK("ATZ")){ Serial.println("resetting"); } delay(250); //Confirm name change ble.sendCommandCheckOK("AT+GAPDEVNAME"); /* Disable command echo from Bluefruit */ ble.echo(false); Serial.println("Requesting Bluefruit info:"); /* Print Bluefruit information */ ble.info(); Serial.println(F("Please use Adafruit Bluefruit LE app to connect in Controller mode")); Serial.println(F("Then activate/use the sensors, color picker, game controller, etc!")); Serial.println(); ble.verbose(false); // debug info is a little annoying after this point! /* Wait for connection */ while (! ble.isConnected()) { delay(500); } Serial.println(F("*****************")); // Set Bluefruit to DATA mode Serial.println( F("Switching to DATA mode!") ); ble.setMode(BLUEFRUIT_MODE_DATA); Serial.println(F("*****************")); } void tocar(int tom, long tempo_value) { long tempo_gasto = 0; while (tempo_gasto < tempo_value) { digitalWrite(speaker, HIGH); delayMicroseconds(tom / 2); digitalWrite(speaker, LOW); delayMicroseconds(tom/2); tempo_gasto += tom; } }
Text editor powered by tinymce.