element14 Community
element14 Community
    Register Log In
  • Site
  • Search
  • Log In Register
  • About Us
  • Community Hub
    Community Hub
    • What's New on element14
    • Feedback and Support
    • Benefits of Membership
    • Personal Blogs
    • Members Area
    • Achievement Levels
  • Learn
    Learn
    • Ask an Expert
    • eBooks
    • element14 presents
    • Learning Center
    • Tech Spotlight
    • STEM Academy
    • Webinars, Training and Events
    • Learning Groups
  • Technologies
    Technologies
    • 3D Printing
    • FPGA
    • Industrial Automation
    • Internet of Things
    • Power & Energy
    • Sensors
    • Technology Groups
  • Challenges & Projects
    Challenges & Projects
    • Design Challenges
    • element14 presents Projects
    • Project14
    • Arduino Projects
    • Raspberry Pi Projects
    • Project Groups
  • Products
    Products
    • Arduino
    • Avnet Boards Community
    • Dev Tools
    • Manufacturers
    • Multicomp Pro
    • Product Groups
    • Raspberry Pi
    • RoadTests & Reviews
  • Store
    Store
    • Visit Your Store
    • Choose another store...
      • Europe
      •  Austria (German)
      •  Belgium (Dutch, French)
      •  Bulgaria (Bulgarian)
      •  Czech Republic (Czech)
      •  Denmark (Danish)
      •  Estonia (Estonian)
      •  Finland (Finnish)
      •  France (French)
      •  Germany (German)
      •  Hungary (Hungarian)
      •  Ireland
      •  Israel
      •  Italy (Italian)
      •  Latvia (Latvian)
      •  
      •  Lithuania (Lithuanian)
      •  Netherlands (Dutch)
      •  Norway (Norwegian)
      •  Poland (Polish)
      •  Portugal (Portuguese)
      •  Romania (Romanian)
      •  Russia (Russian)
      •  Slovakia (Slovak)
      •  Slovenia (Slovenian)
      •  Spain (Spanish)
      •  Sweden (Swedish)
      •  Switzerland(German, French)
      •  Turkey (Turkish)
      •  United Kingdom
      • Asia Pacific
      •  Australia
      •  China
      •  Hong Kong
      •  India
      •  Korea (Korean)
      •  Malaysia
      •  New Zealand
      •  Philippines
      •  Singapore
      •  Taiwan
      •  Thailand (Thai)
      • Americas
      •  Brazil (Portuguese)
      •  Canada
      •  Mexico (Spanish)
      •  United States
      Can't find the country/region you're looking for? Visit our export site or find a local distributor.
  • Translate
  • Profile
  • Settings
Cheer Us Up
  • Challenges & Projects
  • Project14
  • Cheer Us Up
  • More
  • Cancel
Cheer Us Up
Blog Smart Musical Greeting Card
  • Blog
  • Forum
  • Documents
  • Events
  • Polls
  • Files
  • Members
  • Mentions
  • Sub-Groups
  • Tags
  • More
  • Cancel
  • New
Join Cheer Us Up to participate - click to join for free!
  • Share
  • More
  • Cancel
Group Actions
  • Group RSS
  • More
  • Cancel
Engagement
  • Author Author: harjinagi
  • Date Created: 20 May 2021 12:58 PM Date Created
  • Views 979 views
  • Likes 8 likes
  • Comments 0 comments
  • cheerusupch
  • greeting_card_technology
  • isd1820
  • mpu6050
  • arduino nano project
Related
Recommended

Smart Musical Greeting Card

harjinagi
harjinagi
20 May 2021

imageimage

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(Uttar Pradesh, India).I have a keen interest in robotics, Arduino, Embedded system, internet of things, FPGA and Analog electronics.

 

Today I made a diy smart greeting card  for Element 14 which consist of three unique features in just one card .First feature is based on  ISD1820 a small Voice Recorder and Playback module that can do the multi-segment recording application with the adjustment of the on-board resistor. Second feature consist of MPU-6050MPU-6050 for controlling 4 LEDs on the card. The gyroscope is programmed to detect the tilt in the card and then turn on the respective tilted LED and third feature is based on a two clap servo control, whenever the user clap two times, sensor detect sound, it make the servo rotate at about an degree of 150. This in turns turn on a LED to make the user sure about the direction of the servo. When a similar sound is produced again, then, it brings the servo to its original place, turning the LED off.

 

These three features makes the card unique, the user will definitely have a fun smile on using this card. 

 

Components Required are:

1) 2 *Arduino Nano

2) MPU-6050MPU-6050

3) ISD 1820 voice record and playback module

4) 8 ohm speaker

5) 100 ohm resistors

6) 3* 18500 lithium battery 3.7 V

7) Battery Holder

8) Some LED's

9) Sound Sensor

10) Perf Boards

11) 4* 1.5 inch window hinges

12) Some 1 inches screws

13) Mg995 Servo motor

14) 2* Popsicle Sticks

15) small L bracket

16) Cello Tape, double sider tape, insulation tape

17) Glue Gun

18) Wires

19) Thermocol

20) Colorful Chart Papers

21) Plastic Zip Ties

 

Connection Diagram for controlling Leds:

image

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

And for the https://www.element14.com/community/view-product.jspa?fsku=1864742&nsku=37T8113&COM=noscriptMPU-6050. The https://www.element14.com/community/view-product.jspa?fsku=1864742&nsku=37T8113&COM=noscriptMPU-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 for gyro control LED's :

/**
 * Simple implementation false 
 * 
 * means that for  pitch/yaw there only be 
 * a single led for each direction. The led will get more bright 
 * as the direction increases
 * 
 * Simple implementation true
 * means that for pitch/yaw there will be multiple led's that light up one by one 
 * 
 * The accelerometer/gyro is a MPU6050, it should be wired to the SDA and SCL pins
 */
#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.

image

Circuit diagram for 2 Clap Servo Control:

image

Code for 2 Clap Servo Control:

#include <Servo.h>
Servo myservo;
int pos = 10; 
int Sensor = A0;
int clap = 0;
long detection_range_start = 0;
long detection_range = 0;
boolean status_lights = false;
void setup() {
  myservo.attach(9);
pinMode(Sensor, INPUT);
pinMode(10,OUTPUT);


}
void loop() {
int status_sensor = digitalRead(Sensor);
if (status_sensor == 0)
{
if (clap == 0)
{
detection_range_start = detection_range = millis();
clap++;
}
else if (clap > 0 && millis()-detection_range >= 50)
{
detection_range = millis();
clap++;
}
}
if (millis()-detection_range_start >= 400)
{
if (clap == 2)
{
if (!status_lights)
{
status_lights = true;
digitalWrite(10, HIGH);
for (pos = 10; pos <= 150; pos += 1) 
{ 
    myservo.write(pos);
    delay(15);
}
  }
else if (status_lights)
{
status_lights = false;
digitalWrite(10, LOW);
for (pos = 150; pos >= 0; pos -= 1) { // goes from 90 degrees to 0 degrees
    myservo.write(pos);              // tell servo to go to position in variable 'pos'
    delay(15);   
}
}
clap = 0;
}
}
}

 

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

                        imageimage

Now cut the perf board according to the size of the thermocol and mount  the servo motor on it with the help of plastic zip ties.

Make the movable joint with help of popsicle sticks and apply glue gun to stick it with servo horns.

image

After mounting servo motor and movable joints place the thermocol sheet as per the picture given below and cover it with chart papers.

imageimage

 

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

imageimageimageimage

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 Whenever the user the user clap two times, sensor hears any sound under its range, it make the servo rotate at about an degree of 150. This in turns turn on a LED to make the user sure about the direction of the servo. When a similar sound is produced again, then, it brings the servo to its original place, turning the LED off. and on pressing the playback button of ISD1820, it plays a melodious song. Please watch this video for more information. I hope you enjoyed this tutorial.

 

You don't have permission to edit metadata of this video.
Edit media
x
image
Upload Preview
image

  • Sign in to reply
element14 Community

element14 is the first online community specifically for engineers. Connect with your peers and get expert answers to your questions.

  • Members
  • Learn
  • Technologies
  • Challenges & Projects
  • Products
  • Store
  • About Us
  • Feedback & Support
  • FAQs
  • Terms of Use
  • Privacy Policy
  • Legal and Copyright Notices
  • Sitemap
  • Cookies

An Avnet Company © 2025 Premier Farnell Limited. All Rights Reserved.

Premier Farnell Ltd, registered in England and Wales (no 00876412), registered office: Farnell House, Forge Lane, Leeds LS12 2NE.

ICP 备案号 10220084.

Follow element14

  • X
  • Facebook
  • linkedin
  • YouTube