MECHANICAL CLOCK
NAME OF TEAM MEMBERS:
NAME ROLL NO.
VARUN 2024005625
JOEL 2024003553
SRI HARSHINI 2024003942
HARSHA 2024007462
SAMPATH 2024004108
JATIN 2024005744
WORKING STILLS:
DESIGN:
ELECTRONIC CIRCUIT IN TINKERCAD :
LIST OF COMPONENTS:
Arduino Uno
DS1302 Clock Module
2 x PCA9685 16Ch Servo Drivers
28 x Micro Servos
Ribbon Cable
Power Supply
MATERIAL OF EACH COMPONENT:
Arduino Uno – Fiberglass (PCB), copper traces, plastic casing, metal pins
(steel/brass)
DS1302 Clock Module – Fiberglass PCB, silicon chip, copper, plastic headers
PCAG685 Servo Driver (x2) – Fiberglass PCB, copper, plastic, electronic
components (resin, silicon)
Micro Servos (x28) – Plastic casing, metal gears (often brass or steel), copper
windings, PCBs inside
Ribbon Cable – Copper (wires), PVC (plastic insulation)
Male– metal-plated brass pins, plastic base
How is the component going to be manufactured (built using tools or 3D printing or buying
ready made parts, or assembling from individual parts)?
components are either 3D printed, assembled from individual parts, or purchased as
ready-made electronics. The segments and digit frames are 3D printed using PLA filament.
Electronics like the Arduino, servos, RTC, and servo drivers are bought pre-made. These
are then assembled and wired together on a custom-built MDF frame, which is cut and
painted manually.
Arduino Uno – Bought Ready Made
DS1302 Clock Module - Bought Ready Made
2 x PCA9685 16Ch Servo Drivers - Bought Ready Made
28 x Micro Servos - Bought Ready Made
CODE:
#include <virtuabotixRTC.h>
#include <Adafruit_PWMServoDriver.h>
Adafruit_PWMServoDriver pwmH = Adafruit_PWMServoDriver(0x40);
Adafruit_PWMServoDriver pwmM = Adafruit_PWMServoDriver(0x41);
int servoFrequency = 50;
int segmentHOn[14] =
{385,375,385,375,382,375,354,367,375,385,375,368,371,375};
int segmentMOn[14] =
{382,395,378,315,375,340,345,380,385,365,290,365,315,365};
int segmentHOff[14] =
{200,200,550,480,200,520,200,200,200,480,550,200,515,200};
int segmentMOff[14] =
{200,200,550,440,200,480,200,200,200,550,450,200,430,200};
int digits[10][7] =
{{1,1,1,1,1,1,0},{0,1,1,0,0,0,0},{1,1,0,1,1,0,1},{1,1,1,1,0,0,1},{0,
1,1,0,0,1,1},
{1,0,1,1,0,1,1},{1,0,1,1,1,1,1},{1,1,1,0,0,0,0},{1,1,1,1,1,1,1},{1,1
,1,1,0,1,1}};
virtuabotixRTC myRTC(6, 7, 8);
int hourTens = 0;
int hourUnits = 0;
int minuteTens = 0;
int minuteUnits = 0;
int prevHourTens = 8;
int prevHourUnits = 8;
int prevMinuteTens = 8;
int prevMinuteUnits = 8;
int midOffset = 100;
void setup()
{ pwmH.begin();
pwmM.begin();
pwmH.setOscillatorFrequency(27000000);
pwmM.setOscillatorFrequency(27000000);
pwmH.setPWMFreq(servoFrequency);
pwmM.setPWMFreq(servoFrequency);
//myRTC.setDS1302Time(00, 10, 16, 5, 8, 4, 2020);
for(int i=0 ; i<=13 ; i++)
pwmH.setPWM(i, 0, segmentHOn[i]);
delay(10);
pwmM.setPWM(i, 0, segmentMOn[i]);
delay(10);
delay(2000);
void loop()
myRTC.updateTime();
int temp = myRTC.hours;
hourTens = temp / 10;
hourUnits = temp % 10; temp = myRTC.minutes;
minuteTens = temp / 10;
minuteUnits = temp % 10;
if(minuteUnits != prevMinuteUnits)
updateDisplay();
prevHourTens = hourTens;
prevHourUnits = hourUnits;
prevMinuteTens = minuteTens;
prevMinuteUnits = minuteUnits;
delay(500);
void updateDisplay ()
updateMid();
for (int i=0 ; i<=5 ; i++)
if(digits[hourTens][i]==1)
pwmH.setPWM(i+7, 0, segmentHOn[i+7]);
Else
pwmH.setPWM(i+7, 0, segmentHOff[i+7]);
delay(10);
if(digits[hourUnits][i]==1)
pwmH.setPWM(i, 0, segmentHOn[i]);
Else
pwmH.setPWM(i, 0, segmentHOff[i]);
delay(10);
if(digits[minuteTens][i]==1)
pwmM.setPWM(i+7, 0, segmentMOn[i+7]);
Else
pwmM.setPWM(i+7, 0, segmentMOff[i+7]);
delay(10);
if(digits[minuteUnits][i]==1)
pwmM.setPWM(i, 0, segmentMOn[i]);
Else
pwmM.setPWM(i, 0, segmentMOff[i]);
delay(10);
void updateMid()
if(digits[minuteUnits][6]!=digits[prevMinuteUnits][6])
if(digits[prevMinuteUnits][1]==1)
pwmM.setPWM(1, 0, segmentMOn[1]-midOffset);
if(digits[prevMinuteUnits][6]==1)
pwmM.setPWM(5, 0, segmentMOn[5]+midOffset);
}
delay(100);
if(digits[minuteUnits][6]==1)
pwmM.setPWM(6, 0, segmentMOn[6]);
Else
pwmM.setPWM(6, 0, segmentMOff[6]);
if(digits[minuteTens][6]!=digits[prevMinuteTens][6])
if(digits[prevMinuteTens][1]==1)
pwmM.setPWM(8, 0, segmentMOn[8]-midOffset);
if(digits[prevMinuteTens][6]==1)
pwmM.setPWM(12, 0, segmentMOn[12]+midOffset);
delay(100);
if(digits[minuteTens][6]==1)
pwmM.setPWM(13, 0, segmentMOn[13]);
Else
pwmM.setPWM(13, 0, segmentMOff[13]);
if(digits[hourUnits][6]!=digits[prevHourUnits][6])
if(digits[prevHourUnits][1]==1)
pwmH.setPWM(1, 0, segmentHOn[1]-midOffset);
if(digits[prevHourUnits][6]==1) pwmH.setPWM(5, 0,
segmentHOn[5]+midOffset); } delay(100);
if(digits[hourUnits][6]==1)
pwmH.setPWM(6, 0, segmentHOn[6]);
Else
pwmH.setPWM(6, 0, segmentHOff[6]);
if(digits[hourTens][6]!=digits[prevHourTens][6])
if(digits[prevHourTens][1]==1)
pwmH.setPWM(8, 0, segmentHOn[8]-midOffset);
if(digits[prevHourTens][6]==1)
pwmH.setPWM(12, 0, segmentHOn[12]+midOffset);
delay(100);
if(digits[hourTens][6]==1)
pwmH.setPWM(13, 0, segmentHOn[13]);
Else
pwmH.setPWM(13, 0, segmentHOff[13]);
}
ROLE OF EACH MEMBER:
NAME ROLE
VARUN Assembling
JOEL Carpenting and wood work
SRI HARSHINI Financial Management
HARSHA Documentation
SAMPATH Circuits connections & Code
JATIN Carpenting and wood work
Total bill :-
· DS1302 Clock Module - 190
· 2 x PCA9685 16Ch Servo Drivers 3 / 10 - 250x2 - 500
· 28 x Micro Servos - 105x28 - 2940
· Jumper wires (30MM,30 MF,30 FF) - 60X3 - 180
· Power Supply - 190
· TOTAL 3810