Robotic Button Masher Clock

Introduction: Robotic Button Masher Clock

About: I am an American teaching English at Shangluo University, Shaanxi. I like making machines that do interesting but fairly useless things - I call them Quixotic Machines.

This is a rather crazy clock: the Arduino reads a real time clock module and then a servo controlled "finger" punches in each number on a Grove 4-digit display. You have to see the video to understand.,

I haven't really show how to build it as I doubt anyone would want such a beast but I have included the code in case anyone is interested in how to hook everything up.

Ciao as this is my final project. LLAP.

Teacher Notes

Teachers! Did you use this instructable in your classroom?
Add a Teacher Note to share how you incorporated it into your lesson.

Step 1: Servos, Switches and Arduino

First photo shows 4 contact push buttons glued into a piece of wood.

Second photo shows finger using 1 servo to push and pull finger up and down.

Third photo shows slider servo that pushes finger left and right.,

Final photo shows 4 digit display and Arduino Uno. I used a RTC clock module to get real time and a GROVE 4-digit display (TM1637) which only needs two wires to control (not 12 wires like some displays).

Step 2: Here Is Arduino Sketch...

#include Wire.h

#include SoftwareSerial.h

//put brackets around library names

#include Suli.h

#include Four_Digit_Display_Arduino.h

#include Wire.h

#include "RTClib.h"

#include Servo.h

#include SoftwareSerial.h

Servo servo1,servo2,servo3;

const int buttonPin4 = 13,buttonPin3=11,buttonPin2=12; int val1,val2,val3,val4; int but1,but2,but3,but4,curMin,oldMin,keyPress; Four_Digit_Display_Arduino disp;

void myServo(int curAngle,int newAngle,int angleInc,int incDelay,int servoNum) { if (curAngle < newAngle) { for(int angle=curAngle;angle < newAngle;angle += angleInc) { if (servoNum == 1) servo1.write(angle); if (servoNum == 2) servo2.write(angle); if (servoNum == 3) servo3.write(angle); delay(incDelay); } } else if (curAngle > newAngle) { for(int angle=curAngle;angle > newAngle;angle -= angleInc) { if (servoNum == 1) servo1.write(angle); if (servoNum == 2) servo2.write(angle); if (servoNum == 3) servo3.write(angle); delay(incDelay); } } } /*-----( Declare objects )-----*/ RTC_DS1307 rtc; // Create a RealTimeClock object void keyDown() { servo1.write(43); delay(250); } void keyUp() { servo1.write(120); delay(100); } void slideFinger(int pos) { servo3.write(pos); delay(1000); } int getKeyPress(int switchNo) { while(1) { int but = digitalRead(switchNo); delay(20); if (but==LOW) { Serial.print("but=low");Serial.println(but); but=HIGH; return 1; } } } void setup() { Serial.begin(9600); // Set up for Serial Monitor to be able to see this work servo1.attach(7); // finger servo delay(10);delay(1000); servo1.write(90); servo3.attach(9); //slider servo delay(10); servo3.write(90); delay(5000);

Wire.begin(); disp.begin(2,3); disp.clear(); disp.pointOn(); pinMode(buttonPin4,INPUT_PULLUP); pinMode(buttonPin3,INPUT_PULLUP); rtc.begin(); // Start the RTC library code

/*----( SET the date and time. Comment OUT these lines after setting )----*/ // Put these "//" in front of the line you do NOT want to use // following line sets the RTC to the date & time this sketch was compiled rtc.adjust(DateTime(F(__DATE__), F(__TIME__))); // This line sets the RTC with an explicit date & time, for example to set // May 21, 2015 at 6pm you would call: (use 24 hour time) // rtc.adjust(DateTime(2015, 5, 21, 18, 0, 0));

}//--(end setup )---

void loop() { ////String testString = "4"; //val4 = testString.toInt(); //val4= testString.charAt(1); //val4=9; //disp.pointOn(); //disp.begin(2,3); //disp.clear(); DateTime now = rtc.now(); // Read data from the RTC Chip curMin = now.minute() % 10; //keyPress = getKeyPress(); if (curMin != oldMin) { disp.clear(); val1 = now.hour() / 10; val2 = now.hour() % 10; val3 = now.minute() / 10; val4 = now.minute() % 10; slideFinger(36); //move slider for (int i=0;i <= val4;i++) { keyDown(); // finger down Serial.print("keypress=");Serial.println(i); if (getKeyPress(13) == 1) { disp.display(3,i); delay(10); keyUp(); //finger up delay(100); } // disp mins } slideFinger(72); //move slider for (int i=0;i <= val3;i++) { keyDown(); // finger down Serial.print("keypress=3.");Serial.println(i); if (getKeyPress(11) == 1) { disp.display(2,i); delay(10); keyUp(); //finger up delay(100); } // disp mins } slideFinger(101); //move slider for (int i=0;i <= val2;i++) { keyDown(); // finger down Serial.print("keypress=");Serial.println(i); if (getKeyPress(12) == 1) { disp.display(1,i); delay(10); keyUp(); //finger up delay(100); } // disp mins } slideFinger(139); //move slider for (int i=0;i <= val1;i++) { keyDown(); // finger down Serial.print("keypress=");Serial.println(i); if (getKeyPress(10) == 1) { disp.display(0,i); delay(10); keyUp(); //finger up delay(100); } // disp mins } //disp.display(0, now.hour() / 10); //disp.display(1, now.hour() % 10); //disp.display(2, now.minute() / 10); //disp.display(3, now.minute() % 10); servo3.write(90); delay(3000); // disp.clear(); //disp.display(0,1); delay(3000); //disp.pointOff(); //disp.pointOn();

Serial.print(now.year(), DEC); // Serial.print('/'); Serial.print(now.month(), DEC); Serial.print('/'); Serial.print(now.day(), DEC); Serial.print(' '); Serial.print(now.hour() % 10 , DEC); Serial.print(':'); Serial.print(now.minute(), DEC); Serial.print(':'); Serial.print(now.second(), DEC); Serial.println(); oldMin = curMin; } // oldMin }

Be the First to Share

    Recommendations

    • Trash to Treasure Contest

      Trash to Treasure Contest
    • Raspberry Pi Contest 2020

      Raspberry Pi Contest 2020
    • Wearables Contest

      Wearables Contest

    Discussions