This instructable was created in fulfillment of the project requirements of the Makecourse at the University of South Florida (www.makecourse.com). 3D printing, laser-cutting, and engraving were done at the Design for X (DFX) Laboratory at the University of South Florida (http://www.eng.usf.edu/dfx/).


It is a creative project that is based on my mother’s love for flowers, need for a pencil holder in her office, and the fact that I miss her while I am in college. It will be given to her as a surprise on Mother’s Day. This project is a revolving flower that serves as a pencil holder, specifically using its pedals as the pencil holder. The flower is 3D printed while the base is a black box. I used Autodesk Inventor to create the design of this project and more specifically the flower itself. An infrared remote is programmed to control which pedal is placed in-front of the user while a servo motor controls the rotation of the entire flower. A LCD Screen will display which pedal is chosen when it was selected on the infrared remote. On the back side, there is a wood engraving of a photo of my family, in which I created using the laser-cutter.


1x Black Box

1x MicroServo

1x Arduino Uno

1x Breadboard

A bunch of Wires and Jumper Wires

1x Infrared Remote

1x Infrared Remote Sensor

1x LCD Screen

1x USB Cord

1x USB 5V Adapter

1x Gold Glitter Duct Tape

1x Acrylic Paint (choose the colors you desire)

1x Wood (choose the type you desire)

1x Hot-Glue Gun

Step 1: Arduino Code

/*Created By: Jonielle McDonnough

Purpose: "Spring is in the Holder"

Date Created: April 5th, 2015

This code is to function a flower using a servo motor, LCD Screen, and IR Remote. */

#include <IRremote.h>

#include <LiquidCrystal_I2C.h>

#include <Wire.h>

#include <Servo.h>

//since I am using an infrared remote I need to define the values of each button on the remote

#define BUTTON_0 0xFF6897 // your remote's values.

#define BUTTON_1 0xFF30CF // another button on your remote

#define BUTTON_2 0xFF18E7 // another button on your remote

#define BUTTON_3 0xFF7A85 // another button on your remote

#define BUTTON_4 0xFF10EF // another button on your remote

#define BUTTON_5 0xFF38C7 // another button on your remote

#define BUTTON_6 0xFF5AA5 // another button on your remote

#define BUTTON_7 0xFF42BD // another button on your remote

#define BUTTON_8 0xFF4AB5 // another button on your remote

#define BUTTON_9 0xFF52AD // another button on your remote

#define POWER 0xFFA25D // another button on your remote

#define MODE 0xFF // another button on your remote

#define MUTE 0xFFE21D // another button on your remote

#define PREV 0xFF22DD // another button on your remote

#define NEXT 0xFF02FD // another button on your remote

#define PLAY/PAUSE 0xFFC23D // another button on your remote

#define VOL_DWN 0xFFE01F // another button on your remote

#define VOL_UP 0xFFA857 // another button on your remote

#define EQ 0xFF9067 // another button on your remote

#define HUNDRED_PLUS 0xFF9867 // another button on your remote

#define BACK 0xF0C41643 // another button on your remote

LiquidCrystal_I2C lcd(0x27, 16, 2); //initialize the library with the numbers of the interface pins

int RECV_PIN = 11; //the receiver will be using pin 11

IRrecv irrecv(RECV_PIN);

decode_results results;

Servo myservo1; //name the servo

int pos = 0; //initial position

//the following variables are being defined to a specific rotation

int post1 = pos;

int post2 = pos + 30;

int post3 = pos + 60;

int post4 = pos + 90;

int post5 = pos + 120;

int post6 = pos + 150;

int post7 = pos + 180;

// the setup routine runs once when you press reset:

void setup()



irrecv.enableIRIn(); // Start the receiver

myservo1.attach(9); // attack servo to digital pin 9

lcd.init(); //initializes the lcd

lcd.backlight(); //turns the backlight on


void loop() // the loop routine runs over and over again forever:


if (irrecv.decode(&results))


Serial.println(results.value, HEX);

irrecv.resume(); // Receive the next value


if (results.value == BUTTON_0)




lcd.print("Hi Mom!");


if (results.value == BUTTON_1)




lcd.print("Pencil/Pen #1");


if (results.value == BUTTON_2)




lcd.print("Pencil/Pen #2");


if (results.value == BUTTON_3)




lcd.print("Pencil/Pen #3");


if (results.value == BUTTON_4)




lcd.print("Pencil/Pen #4");


if (results.value == BUTTON_5)




lcd.print("Pencil/Pen #5");


if (results.value == BUTTON_6)




lcd.print("Pencil/Pen #6");


if (results.value == BUTTON_7)




lcd.print("Pencil/Pen #7");


if (results.value == BUTTON_8)




lcd.print("I LOVE YOU MUMMI");


if (results.value == BUTTON_9)




lcd.print("ENJOY YOUR DAY!");


lcd.setCursor(0, 1);


The above code provides all of the things you need to define before you go into the set-up and loop. Each necessary library must be included as well as initiated and the pins must be defined. The remote buttons must be defined in order to use it. You can see the output of each button by opening the serial port reader. The outputs that i have in this code are for the black remote that comes with the Arduino Kit. As you work your way down to the set-up, you will notice that this is where the serial port and receiver are initiated. The servo motor is set to digital pin 9 while the lcd screen initializes and its backlight turns on. In the loop, to me, this is where the action happens. The values of the results (output) from the remote are placed in if-then statements. In the statements, the servo motor moves to a certain amount of degrees that it is told to turn to (these degrees are already defined at the top of the code). The LCD Screen then clears its screen and prints out the appropriate phrase. At the end of the loop the cursor of the LCD Screen is set to (0,1). It will basically only print one line.

Step 2: Circuit Schematic

In the Block Diagram of this project's control system, the infrared (IR) Remote sends a signal to the IR Sensor once a button is pressed. The IR Sensor then signals the Arduino Uno and tells it what to do based on which button was pressed. The Arduino Uno then transmits the certain code to the servo, which executes the action and rotates the entire flower to a specified degree. The LCD Screen then displays which pedals has been chosen. All of this is then displayed in the actuality circuitry in the next picture. On the breadboard, there is a section that is only for positive and ground wires respectively.

Step 3: 3D Modeling

I used Autodesk Inventor to create the 3D model of this project as well as animations and simulations. I recommend anyone who wants to create 3D modeling to use this software due to its user-friendly capabilities.

3D Parts (.stl files):


Step 4: 3D Printing, Laser-cutting, & Engraving

Once the model was ready for 3D printing, they were imported to Makebot's Makerware in the DFX Lab. 3D printing was done on the Makerbot Replicator 2 (4th generation) in PLA. The wood engraving was done using a laser-cutter. I first laser-cut it into the dimensions I needed and then proceed with the engraving. Doing multiple passings is the better way to go when using a laser-cutter since it provides better quality. I also created a wood platform that snugged the LCD Screen. I used the laser-cutter to do this too.

Step 5: Assembly

I hot-glued the servo motor head to the bottom of the flower. This way it is detachable. I cut a rectangle on the top of the box using a dremel so that the servo motor will be able to be placed in it and screwed on. I then used the dremel again to soften the tips of the screws. A hot-glue gun was used to secure the LCD Screen onto its wood platform and paste the platform and wood engraving onto two of the sides of the box. A hole at the top right corner of the wood platform was made so that the IR Sensor would be visible to the remote. Once I confirmed that everything is nice and secure, then the decorations began. I used Gold Glitter Duct Tape to decorate the sides of the box and Acrylic Paint to paint the flower.

<p>I like the picture on the front! How fast does it spin?</p>

About This Instructable




More by joniellemcdo:Spring is in the Pencil Holder 
Add instructable to: