Holiday Special 20

Enter Your Holiday Project for a chance to win a tool kit bundle, shopping cart, and gifts to give to other members!

Submit an EntrySubmit an Entry  Back to homepage
Project14 Home
Monthly Themes
Monthly Theme Poll

 

 

Hello Everyone, My name is Harji Nagi. I am currently a third year student studying electronics and communication engineering from Pranveer Singh Institute Of Technology, Kanpur(UP).I have a keen interest in robotics,arduino,Artificial Intelligence and Analog electronics.

Today I made a greeting card specially for Holiday Special 20 which consist of  MPU-6050MPU-6050 for controlling 3 LEDs on the card. The gyroscope is programmed to detect the tilt in the card and then turn on the respective tilted LED and ISD1820 a small Voice Recorder and Playback module that can do the multi-segment recording.application with the adjustment of the on-board resistor.

re:

1) Arduino UNO R3

2) MPU-6050MPU-6050

3) 3*LED's

4) ISD1820 Voice record and play chip

5) 3*100 ohm resistors

6) Thermocol

7) Female and male headers

8) Wires

9) On/Off Switch

10) 3.7V Battery for ISD1820 chip

11) 8V,1.5 Amp Battery for Arduino

12) Chart Papers

13) Double Sider Tape

14) Fevicol

15) Stickers

Connection Diagram for controlling Leds:

LEDs :-const int frontLed = 3;const int bottomLed = 5;const int rightLed = 6;const int leftLed = 9;

And for the MPU-6050MPU-6050. The MPU-6050MPU-6050 must be connected to ground and 5V+, after that connect SDA to A4 (analog 4), SCL to A5(analog 5).

You are done with the connections now.

Before uploading the code you would require to download 2 libraries.

1. https://www.i2cdevlib.com/usage

2. https://playground.arduino.cc/Main/MPU-6050

Upload the code after doing the required connections.

Code :

#define SIMPLE_IMPLEMENTATION false


const int frontLed = 3;
const int bottomLed = 5;
const int rightLed = 6;
const int leftLed = 9;
long int lastPrintTime;


typedef struct
{
byte pin;
byte positionInsideGroup;
char thePosition; // Left, Right, Up, Down
byte minAngle;
byte maxAngle;
} ledConfig;


ledConfig leds[] = {
{3, 1, ‘u’, 31, 45},
{12, 2, ‘u’, 16, 30},
{11, 3, ‘u’, 5, 15},
{5, 1, ‘d’, 5, 15},
{6, 2, ‘d’, 16, 30},
{7, 3, ‘d’, 31, 45},
{8 , 1, ‘r’, 5, 23},
{9, 2, ‘r’, 24, 45},
{10, 1, ‘l’, 5, 23},
{4, 2, ‘l’, 24, 45},
};


#include “I2Cdev.h”
#include “MPU6050_6Axis_MotionApps20.h”
#if I2CDEV_IMPLEMENTATION == I2CDEV_ARDUINO_WIRE
#include “Wire.h”
#endif


MPU6050 mpu;


bool dmpReady = false; // set true if DMP init was successful
uint8_t mpuIntStatus; // holds actual interrupt status byte from MPU
uint8_t devStatus; // return status after each device operation (0 = success, !0 = error)
uint16_t packetSize; // expected DMP packet size (default is 42 bytes)
uint16_t fifoCount; // count of all bytes currently in FIFO
uint8_t fifoBuffer[64]; // FIFO storage buffer


// orientation/motion vars
Quaternion q; // [w, x, y, z] quaternion container
VectorInt16 aa; // [x, y, z] accel sensor measurements
VectorInt16 aaReal; // [x, y, z] gravity-free accel sensor measurements
VectorInt16 aaWorld; // [x, y, z] world-frame accel sensor measurements
VectorFloat gravity; // [x, y, z] gravity vector
float euler[3]; // [psi, theta, phi] Euler angle container
float ypr[3]; // [yaw, pitch, roll] yaw/pitch/roll container and gravity vector
volatile bool mpuInterrupt = false; // indicates whether MPU interrupt pin has gone high


void setup()
{
#if I2CDEV_IMPLEMENTATION == I2CDEV_ARDUINO_WIRE
Wire.begin();
TWBR = 24; // 400kHz I2C clock (200kHz if CPU is 8MHz)
#elif I2CDEV_IMPLEMENTATION == I2CDEV_BUILTIN_FASTWIRE
Fastwire::setup(400, true);
#endif


Serial.begin(9600);
while (!Serial); // wait for Leonardo enumeration, others continue immediately
Serial.println(F(“Initializing I2C devices…”));
mpu.initialize();
Serial.println(F(“Testing device connections…”));
Serial.println(mpu.testConnection() ? F(“MPU6050 connection successful”) : F(“MPU6050 connection failed”));
Serial.println(F(“Initializing DMP…”));
devStatus = mpu.dmpInitialize();
mpu.setXGyroOffset(220);
mpu.setYGyroOffset(76);
mpu.setZGyroOffset(-85);
mpu.setZAccelOffset(1788); // 1688 factory default for my test chip
if (devStatus == 0) {
// turn on the DMP, now that it’s ready
Serial.println(F(“Enabling DMP…”));
mpu.setDMPEnabled(true);
Serial.println(F(“Enabling interrupt detection (Arduino external interrupt 0)…”));
attachInterrupt(0, dmpDataReady, RISING);
mpuIntStatus = mpu.getIntStatus();
Serial.println(F(“DMP ready! Waiting for first interrupt…”));
dmpReady = true;
packetSize = mpu.dmpGetFIFOPacketSize();
} else {
Serial.print(F(“DMP Initialization failed (code “));
Serial.print(devStatus);
Serial.println(F(“)”));
}
if (SIMPLE_IMPLEMENTATION) {
initializeLEDsSimple();
} else {
initializeLEDsMultiple();
}
lastPrintTime = millis();
}


void loop()
{
if (!dmpReady) return;
mpuInterrupt = false;
mpuIntStatus = mpu.getIntStatus();
fifoCount = mpu.getFIFOCount();
if ((mpuIntStatus & 0x10) || fifoCount == 1024) {
mpu.resetFIFO();
Serial.println(F(“FIFO overflow!”));
} else if (mpuIntStatus & 0x02) {
while (fifoCount < packetSize) {
fifoCount = mpu.getFIFOCount();
}
mpu.getFIFOBytes(fifoBuffer, packetSize);
fifoCount -= packetSize;
mpu.dmpGetQuaternion(&q, fifoBuffer);
mpu.dmpGetGravity(&gravity, &q);
mpu.dmpGetYawPitchRoll(ypr, &q, &gravity);
int x = ypr[0] * 180/M_PI;
int y = ypr[1] * 180/M_PI;
int z = ypr[2] * 180/M_PI;
Serial.print(y);Serial.print(“\t”);Serial.println(z);
if (SIMPLE_IMPLEMENTATION) {
flashLEDsSimple(x, y, z);
} else {
flashLEDsMultiple(x, y, z);
}
}
}


void initializeLEDsSimple()
{
pinMode(frontLed, OUTPUT);
pinMode(bottomLed, OUTPUT);
pinMode(rightLed, OUTPUT);
pinMode(leftLed, OUTPUT);
}


void initializeLEDsMultiple()
{
for (int i=0; i<10; i++) {
Serial.println(leds[i].pin);
pinMode(leds[i].pin, OUTPUT);
}
delay(3000);
}


void flashLEDsSimple(int x, int y, int z)
{
if (y > 0) {
analogWrite(rightLed, y*4);
analogWrite(leftLed, 0);
} else {
analogWrite(leftLed, y*4*-1);
analogWrite(rightLed, 0);
}
if (z > 0) {
analogWrite(bottomLed, z*4);
analogWrite(frontLed, 0);
} else {
analogWrite(frontLed, z*4*-1);
analogWrite(bottomLed, 0);
}
}


void flashLEDsMultiple(int x, int y, int z)
{
for (int i=0; i<10; i++) {
//Serial.print(z);Serial.print(“,”);Serial.print(leds[i].thePosition);Serial.print(“,”);Serial.println(leds[i].minAngle);
bool modified = false;
if (z < 0 && leds[i].thePosition == ‘u’ && abs(z) > leds[i].minAngle) {
digitalWrite(leds[i].pin, HIGH);
modified = true;
}
if (z > 0 && leds[i].thePosition == ‘d’ && abs(z) > leds[i].minAngle) {
digitalWrite(leds[i].pin, HIGH);
modified = true;
}
if (y < 0 && leds[i].thePosition == ‘l’ && abs(y) > leds[i].minAngle) {
digitalWrite(leds[i].pin, HIGH);
modified = true;
}
if (y > 0 && leds[i].thePosition == ‘r’ && abs(y) > leds[i].minAngle) {
digitalWrite(leds[i].pin, HIGH);
modified = true;
}
if (!modified) {
digitalWrite(leds[i].pin, LOW);
}
}
}


void dmpDataReady()
{
mpuInterrupt = true;
}

 

Connections for ISD1820:

ISD1820 must be connected to ground and its operating voltage is 2.2V to 5V.And connect the speaker at sp+ and sp- .

Press the red button(rec) to start recording the song,voice or any greeting message.It will record not more than 20 seconds.

After recording press Playback to play the recorded message.

                                                        Assembling:

                                                                                Step 1:

                                                                                                        

Take two thermocol Sheets and slice it according to size of the components to be placed on it.

                                                            Step 2:

After slicing thermocol it will look similar to it.

                                                                                                        

                                                            Step 3:

Now placed the thermocol on each other and stick it either with glue or with double sider tape.

                                                                                                             

                                                            Step 4:

Now place all the electronic components and do the connection according to given schematic diagram.And apply cello tape so that the components remain fixed in their position.     

          

                                                              Step 5:

Now cover  these components with the help of colorful chart papers and decorate it to make it more attractive.

                                                                

                                                                      Step 6:

Now the card is ready .On switching on the power button the gyroscope detects the tilt in the card and then turn on the respective tilted LED and on pressing the playback button of ISD182 ,it plays a melodious song .Please watch this vedio for more information.I hope you enjoyed this tutorial.

 

WISH YOU HAPPY NEW YEAR