Loading
Hey! This thing is still a Work in Progress. Files, instructions, and other stuff might change!

Plotclock

by joo, published

Plotclock by joo Feb 12, 2014

Featured Thing!

Description

A clock that plots time. Designed with makeability in a fablab/makerspace/hackerspace in mind.

You need:

  • Laser cutter or 3D printer
  • 1 Arduino
  • 3 servos
  • 1 dry wipe pen
  • M3 nuts, bolts, thread tap

Update to V1.01:
added calibration routine and documentation to arduino code

see the instruction tab above for building instructions

http://wiki.fablab-nuernberg.de/w/Ding:Plotclock (german)
http://www.youtube.com/watch?v=iOLFP90DneY
https://github.com/9a/plotclock

Recent Comments

view all
have you tried compiling with arduino 1.0.6? If you have to use version 1.5.8 you may have to try different time.h libraries since some won't work, sorry I can't help any further since i hadn't had these problems. It may help to compile and run the time examples form the arduino IDE, to see if they run at all.
I am fighting the arduino sketch. I have the time.h library imported into the Arduino IDE and it can find the file time.h .. but it throws all these erros I am unsure how to resolve:

Arduino: 1.5.8 (Windows 8), Board: "Arduino Uno"

In file included from C:UsersPawUserDocumentsArduinolibrari esTimeDateStrings.cpp:10:0:
C:UsersPawUserDocumentsArduinolibrari esTimeDateStrings.cpp:18:18: error: variable 'monthStr1' must be const in order to be put into read-only section by means of '__attribute__((progmem))'
char monthStr1[] PROGMEM = "January";
^
C:UsersPawUserDocumentsArduinolibrari esTimeDateStrings.cpp:19:18: error: variable 'monthStr2' must be const in order to be put into read-only section by means of '__attribute__((progmem))'
char monthStr2[] PROGMEM = "February";
^
C:UsersPawUserDocumentsArduinolibrari esTimeDateStrings.cpp:20:18: error: variable 'monthStr3' must be const in order to be put into read-only section by means of '__attribute__((progmem))'
char monthStr3[] PROGMEM = "March";
^
C:UsersPawUserDocumentsArduinolibrari esTimeDateStrings.cpp:21:18: error: variable 'monthStr4' must be const in order to be put into read-only section by means of '__attribute__((progmem))'
char monthStr4[] PROGMEM = "April";
^
C:UsersPawUserDocumentsArduinolibrari esTimeDateStrings.cpp:22:18: error: variable 'monthStr5' must be const in order to be put into read-only section by means of '__attribute__((progmem))'
char monthStr5[] PROGMEM = "May";
^
C:UsersPawUserDocumentsArduinolibrari esTimeDateStrings.cpp:23:18: error: variable 'monthStr6' must be const in order to be put into read-only section by means of '__attribute__((progmem))'
char monthStr6[] PROGMEM = "June";
^
C:UsersPawUserDocumentsArduinolibrari esTimeDateStrings.cpp:24:18: error: variable 'monthStr7' must be const in order to be put into read-only section by means of '__attribute__((progmem))'
char monthStr7[] PROGMEM = "July";
^
C:UsersPawUserDocumentsArduinolibrari esTimeDateStrings.cpp:25:18: error: variable 'monthStr8' must be const in order to be put into read-only section by means of '__attribute__((progmem))'
char monthStr8[] PROGMEM = "August";
^
C:UsersPawUserDocumentsArduinolibrari esTimeDateStrings.cpp:26:18: error: variable 'monthStr9' must be const in order to be put into read-only section by means of '__attribute__((progmem))'
char monthStr9[] PROGMEM = "September";
^
C:UsersPawUserDocumentsArduinolibrari esTimeDateStrings.cpp:27:19: error: variable 'monthStr10' must be const in order to be put into read-only section by means of '__attribute__((progmem))'
char monthStr10[] PROGMEM = "October";
^
C:UsersPawUserDocumentsArduinolibrari esTimeDateStrings.cpp:28:19: error: variable 'monthStr11' must be const in order to be put into read-only section by means of '__attribute__((progmem))'
char monthStr11[] PROGMEM = "November";
^
C:UsersPawUserDocumentsArduinolibrari esTimeDateStrings.cpp:29:19: error: variable 'monthStr12' must be const in order to be put into read-only section by means of '__attribute__((progmem))'
char monthStr12[] PROGMEM = "December";
^
C:UsersPawUserDocumentsArduinolibrari esTimeDateStrings.cpp:31:22: error: variable 'monthNames_P' must be const in order to be put into read-only section by means of '__attribute__((progmem))'
PGM_P monthNames_P[] PROGMEM =
^
C:UsersPawUserDocumentsArduinolibrari esTimeDateStrings.cpp:37:26: error: variable 'monthShortNames_P' must be const in order to be put into read-only section by means of '__attribute__((progmem))'
char monthShortNames_P[] PROGMEM = "ErrJanFebMarAprMayJunJulAugSepOctNo vDec";
^
C:UsersPawUserDocumentsArduinolibrari esTimeDateStrings.cpp:39:16: error: variable 'dayStr0' must be const in order to be put into read-only section by means of '__attribute__((progmem))'
char dayStr0[] PROGMEM = "Err";
^
C:UsersPawUserDocumentsArduinolibrari esTimeDateStrings.cpp:40:16: error: variable 'dayStr1' must be const in order to be put into read-only section by means of '__attribute__((progmem))'
char dayStr1[] PROGMEM = "Sunday";
^
C:UsersPawUserDocumentsArduinolibrari esTimeDateStrings.cpp:41:16: error: variable 'dayStr2' must be const in order to be put into read-only section by means of '__attribute__((progmem))'
char dayStr2[] PROGMEM = "Monday";
^
C:UsersPawUserDocumentsArduinolibrari esTimeDateStrings.cpp:42:16: error: variable 'dayStr3' must be const in order to be put into read-only section by means of '__attribute__((progmem))'
char dayStr3[] PROGMEM = "Tuesday";
^
C:UsersPawUserDocumentsArduinolibrari esTimeDateStrings.cpp:43:16: error: variable 'dayStr4' must be const in order to be put into read-only section by means of '__attribute__((progmem))'
char dayStr4[] PROGMEM = "Wednesday";
^
C:UsersPawUserDocumentsArduinolibrari esTimeDateStrings.cpp:44:16: error: variable 'dayStr5' must be const in order to be put into read-only section by means of '__attribute__((progmem))'
char dayStr5[] PROGMEM = "Thursday";
^
C:UsersPawUserDocumentsArduinolibrari esTimeDateStrings.cpp:45:16: error: variable 'dayStr6' must be const in order to be put into read-only section by means of '__attribute__((progmem))'
char dayStr6[] PROGMEM = "Friday";
^
C:UsersPawUserDocumentsArduinolibrari esTimeDateStrings.cpp:46:16: error: variable 'dayStr7' must be const in order to be put into read-only section by means of '__attribute__((progmem))'
char dayStr7[] PROGMEM = "Saturday";
^
C:UsersPawUserDocumentsArduinolibrari esTimeDateStrings.cpp:48:20: error: variable 'dayNames_P' must be const in order to be put into read-only section by means of '__attribute__((progmem))'
PGM_P dayNames_P[] PROGMEM = { dayStr0,dayStr1,dayStr2,dayStr3,dayStr4,dayStr5,dayStr6,dayStr7};
^
C:UsersPawUserDocumentsArduinolibrari esTimeDateStrings.cpp:49:24: error: variable 'dayShortNames_P' must be const in order to be put into read-only section by means of '__attribute__((progmem))'
char dayShortNames_P[] PROGMEM = "ErrSunMonTueWedThrFriSat";
^
Error compiling.

This report would have more information with
"Show verbose output during compilation"
enabled in File > Preferences.
we try to make product like you at 3dmaker.vn

More from DIY

view more

Liked By

view all

Tags

License

Plotclock by joo is licensed under the Creative Commons - Attribution license.

Give a Shout Out

If you print this Thing and display it in public proudly give attribution by printing and displaying this tag. Print Thing Tag

Instructions

Materials I used:

  • Arduino uno
  • Tower Pro 9g servos (those cheap ones from ebay)
  • WB SL DRYWIPE MARKER, bullet tip
  • A small custom servo adapter, there are shields or servo-arduinos that also can be used. You can also just use jumper wires: 5V to red servo wire, GND to brown or black servo wire and the arduino servopins connected to the yellow or orange servo wire

Building instructions:
(for version 1.01!)

  1. Lasercut plotclock_beta1.pdf from 3mm material or 3D print plotclock_SUP7.skp

    • the black areas in the pdf on the servo arms should be used to engrave some material away, so the servohorns settle in
    • use http://www.thingiverse.com/thing:250204 for single STL files if you 3D print the clock (Thanks corben33!)
  2. 3D print swee.stl or reuse some other cylindrical part for the sweeper

  3. Tap 2.5mm holes with M3 thread

  4. Assemble arms with M3 screws, gently adjust the counternuts so that the joints under the screw heads just have enough play for smooth movement (see joint picture).

  5. load Arduino sketch plotclock_V1, see code comments for further information

  6. Add some sort of cloth with double sided tape to sweeper

  7. Attach servos to digital pin 2, 3 and 4, according to arduino sketch, test them without anything attached by plugging in the arduino (the photos show it being connected to 1, 2 and 3, which isn't optimal since 1 is also the TX pin, so during arduino startup the lifting servo jumps around)

  8. Put everything together

    • You may have to redrill the holes that are used for securing the servos, since some servo screws are a tight fit.
      Acrylic is brittle and easily breaks wen the mounting holes are to small. Only push the servo arms onto their hubs, don't secure them with screws! For initial calibration do not mount the resting clip for the wiper (danger of collision with the pen). Glue or screw the servo arms to the acrylic parts.
  9. When attaching the servo arms, make sure they can turn enough to reach every point on the drawing surface by manually turning them

  10. Power the arduino, it should start a calibration cycle where every second the position of both servos changes by rotating exactly 90 degrees (see last image in gallery)

  11. Change the SERVOFAKTOR, SERVOLEFTNULL and SERVORIGHTNULL values until everything matches up (see code for more information)

  12. Attach the pen and the sweeper holder only after testing everything else

This description is still a bit of a WIP, so comment if you have any questions!

I am fighting the arduino sketch. I have the time.h library imported into the Arduino IDE and it can find the file time.h .. but it throws all these erros I am unsure how to resolve:

Arduino: 1.5.8 (Windows 8), Board: "Arduino Uno"

In file included from C:UsersPawUserDocumentsArduinolibrari esTimeDateStrings.cpp:10:0:
C:UsersPawUserDocumentsArduinolibrari esTimeDateStrings.cpp:18:18: error: variable 'monthStr1' must be const in order to be put into read-only section by means of '__attribute__((progmem))'
char monthStr1[] PROGMEM = "January";
^
C:UsersPawUserDocumentsArduinolibrari esTimeDateStrings.cpp:19:18: error: variable 'monthStr2' must be const in order to be put into read-only section by means of '__attribute__((progmem))'
char monthStr2[] PROGMEM = "February";
^
C:UsersPawUserDocumentsArduinolibrari esTimeDateStrings.cpp:20:18: error: variable 'monthStr3' must be const in order to be put into read-only section by means of '__attribute__((progmem))'
char monthStr3[] PROGMEM = "March";
^
C:UsersPawUserDocumentsArduinolibrari esTimeDateStrings.cpp:21:18: error: variable 'monthStr4' must be const in order to be put into read-only section by means of '__attribute__((progmem))'
char monthStr4[] PROGMEM = "April";
^
C:UsersPawUserDocumentsArduinolibrari esTimeDateStrings.cpp:22:18: error: variable 'monthStr5' must be const in order to be put into read-only section by means of '__attribute__((progmem))'
char monthStr5[] PROGMEM = "May";
^
C:UsersPawUserDocumentsArduinolibrari esTimeDateStrings.cpp:23:18: error: variable 'monthStr6' must be const in order to be put into read-only section by means of '__attribute__((progmem))'
char monthStr6[] PROGMEM = "June";
^
C:UsersPawUserDocumentsArduinolibrari esTimeDateStrings.cpp:24:18: error: variable 'monthStr7' must be const in order to be put into read-only section by means of '__attribute__((progmem))'
char monthStr7[] PROGMEM = "July";
^
C:UsersPawUserDocumentsArduinolibrari esTimeDateStrings.cpp:25:18: error: variable 'monthStr8' must be const in order to be put into read-only section by means of '__attribute__((progmem))'
char monthStr8[] PROGMEM = "August";
^
C:UsersPawUserDocumentsArduinolibrari esTimeDateStrings.cpp:26:18: error: variable 'monthStr9' must be const in order to be put into read-only section by means of '__attribute__((progmem))'
char monthStr9[] PROGMEM = "September";
^
C:UsersPawUserDocumentsArduinolibrari esTimeDateStrings.cpp:27:19: error: variable 'monthStr10' must be const in order to be put into read-only section by means of '__attribute__((progmem))'
char monthStr10[] PROGMEM = "October";
^
C:UsersPawUserDocumentsArduinolibrari esTimeDateStrings.cpp:28:19: error: variable 'monthStr11' must be const in order to be put into read-only section by means of '__attribute__((progmem))'
char monthStr11[] PROGMEM = "November";
^
C:UsersPawUserDocumentsArduinolibrari esTimeDateStrings.cpp:29:19: error: variable 'monthStr12' must be const in order to be put into read-only section by means of '__attribute__((progmem))'
char monthStr12[] PROGMEM = "December";
^
C:UsersPawUserDocumentsArduinolibrari esTimeDateStrings.cpp:31:22: error: variable 'monthNames_P' must be const in order to be put into read-only section by means of '__attribute__((progmem))'
PGM_P monthNames_P[] PROGMEM =
^
C:UsersPawUserDocumentsArduinolibrari esTimeDateStrings.cpp:37:26: error: variable 'monthShortNames_P' must be const in order to be put into read-only section by means of '__attribute__((progmem))'
char monthShortNames_P[] PROGMEM = "ErrJanFebMarAprMayJunJulAugSepOctNo vDec";
^
C:UsersPawUserDocumentsArduinolibrari esTimeDateStrings.cpp:39:16: error: variable 'dayStr0' must be const in order to be put into read-only section by means of '__attribute__((progmem))'
char dayStr0[] PROGMEM = "Err";
^
C:UsersPawUserDocumentsArduinolibrari esTimeDateStrings.cpp:40:16: error: variable 'dayStr1' must be const in order to be put into read-only section by means of '__attribute__((progmem))'
char dayStr1[] PROGMEM = "Sunday";
^
C:UsersPawUserDocumentsArduinolibrari esTimeDateStrings.cpp:41:16: error: variable 'dayStr2' must be const in order to be put into read-only section by means of '__attribute__((progmem))'
char dayStr2[] PROGMEM = "Monday";
^
C:UsersPawUserDocumentsArduinolibrari esTimeDateStrings.cpp:42:16: error: variable 'dayStr3' must be const in order to be put into read-only section by means of '__attribute__((progmem))'
char dayStr3[] PROGMEM = "Tuesday";
^
C:UsersPawUserDocumentsArduinolibrari esTimeDateStrings.cpp:43:16: error: variable 'dayStr4' must be const in order to be put into read-only section by means of '__attribute__((progmem))'
char dayStr4[] PROGMEM = "Wednesday";
^
C:UsersPawUserDocumentsArduinolibrari esTimeDateStrings.cpp:44:16: error: variable 'dayStr5' must be const in order to be put into read-only section by means of '__attribute__((progmem))'
char dayStr5[] PROGMEM = "Thursday";
^
C:UsersPawUserDocumentsArduinolibrari esTimeDateStrings.cpp:45:16: error: variable 'dayStr6' must be const in order to be put into read-only section by means of '__attribute__((progmem))'
char dayStr6[] PROGMEM = "Friday";
^
C:UsersPawUserDocumentsArduinolibrari esTimeDateStrings.cpp:46:16: error: variable 'dayStr7' must be const in order to be put into read-only section by means of '__attribute__((progmem))'
char dayStr7[] PROGMEM = "Saturday";
^
C:UsersPawUserDocumentsArduinolibrari esTimeDateStrings.cpp:48:20: error: variable 'dayNames_P' must be const in order to be put into read-only section by means of '__attribute__((progmem))'
PGM_P dayNames_P[] PROGMEM = { dayStr0,dayStr1,dayStr2,dayStr3,dayStr4,dayStr5,dayStr6,dayStr7};
^
C:UsersPawUserDocumentsArduinolibrari esTimeDateStrings.cpp:49:24: error: variable 'dayShortNames_P' must be const in order to be put into read-only section by means of '__attribute__((progmem))'
char dayShortNames_P[] PROGMEM = "ErrSunMonTueWedThrFriSat";
^
Error compiling.

This report would have more information with
"Show verbose output during compilation"
enabled in File > Preferences.
have you tried compiling with arduino 1.0.6? If you have to use version 1.5.8 you may have to try different time.h libraries since some won't work, sorry I can't help any further since i hadn't had these problems. It may help to compile and run the time examples form the arduino IDE, to see if they run at all.
we try to make product like you at 3dmaker.vn
Hi all,
I'm having rather a lot of trouble getting the marker to "land" in the eraser holder. It appears that my servos aren't quite linear or the same, so I split SERVOFAKTOR into a "left" and "right" in order to get both servos to get turn 90 degrees in cal. Still no luck, though; there is some clear distortion in my coordinate system (very obvious during "erase"). Does anyone have any ideas for me to get this working? Thanks to joo for such a cool design, and to the community for support.
Here's image of the distortion. Any thoughts as to what constants to work on would be appreciated. imgur.com/Yh7IiNf
Figured it out. I had the arm with the pen gripper attached to the right servo, instead of the left one. Oops. All's well, now...
Sep 20, 2014 - Modified Sep 20, 2014
Hi,
In the version 1 of the code, there is part which is commented
//length of arms
L1= a value,
L2= a value,
L3= a value
Two of my arms are 35mm from centre to centre; the others are 55mm and 45mm. My thinking is that the length of the arms affects the position of the pen; From memory as I don't have the code to hand, 35mm is mentioned in the code but values for the others are diffident as noted above. I also done the calibration so that the servo moves 90 degrees. Could you explain the last diagram in relation to the box or the white board? As I currently have the machine thinking that the pen is on the opposite side and the pen holder is too far down from the top.
Maybe update the instructions with the correct lengths of the arms needed?
I'm also going to download another set of arms from this version as the arms I have, must be too long for this to work correctly.
I believe the way the code works is that L1 is the length of the arms closer to the servo (center to center), L2 is the length between the center of the far side of the L1 linkage and the *pen center*, and L3 is half the distance between the servo axes. Your "L2 arms" have different lengths because the pen is 10mm from the end of the pivot point, but the geometry is what's important, and the pen is 55mm away.
what's the distance between the 2 gears of the servos?
this is awesome can someone share where they got the marker with the eraser cap pls?
If you take a look at thingiverse.com/thing:346784, I made an arm specific to These markers:
http://www.amazon.com/Expo-Erase-Markers-Black-86001/dp/B0006HXJFK/ref=sr_1_8?ie=UTF8&qid=1401373557&sr=8-8&keywords=expo+markers+dry+erase
PlotClock Upgrade
disqus.com/thingiverse-ea9b6cd30546ce1e20bd2f6df7e82e64/ please check thingiverse.com/thing:371248. I added some functionality to your plotclock_v1.02.ino but have no glue about github. It should be still backward compatible, so if your want to integrate them as v1.03 please feel free to do so or let me know what I have to do on github
plot thermometer / clock for 3D printers
by smily77
joo - in reply to smily77
thanks a lot! eeprom/serial calibration integration was on my todo list :) don't know when i find the time to update the code the next time but will definitely integrate your code
Hi Joo, This is great project, my model is working well. Thank you for sharing.
I have some questions for you.
Can you share information how to make a equation to draw number?
I tried to figure out the equation using your code, it is not easy to figure out equation for writing number.
And I would like to make it writes an alphabets (A,a,B,b,....) Please help me to figure out how to program to do.If I want to make a bigger version to using same code parameters, can I just scale all parameters up, parts and code parameters ?Please give some advises for me.
joo - in reply to pwoong
void number(...) draws the numbers with drawTo (for lines) and bogen (for arcs) functions:
Example for number 1:
drawTo(bx + 3 * scale, by + 15 * scale); // Move pen to point x:3 y:15 (left in the middle)
lift(0); // Move pen down to surface
drawTo(bx + 10 * scale, by + 20 * scale); // draw diagonally to x:10 y:20 (on the top right)
drawTo(bx + 10 * scale, by + 0 * scale); // draw straight down to y:0
// bx/by are the originpoints for this particular number on the printing surface, with scale you can make it bigger/smallerNumber 3 is just 2 bogen functions for the upper and lower arc.
I have written the code using .netmf and remixed some of the parts, will upload soon
Can anyone tell me what screws they used? Where they completely threaded or partially ?
joo - in reply to asedhai
just normal M3 screws, fully threaded
Hai ,Can you draw a smiley with the plotclock , is it possible
Who wants to write a source code to do thisKind Regards
Hi, I'm newbie to the 3D and 2D printing, and I would like to start with your design.
I'm finding quite a lot of problems in trying to upload the PDF design to services like PONOKO or SHAPEWAYS. They ask for SVG files, not PDF.
If I convert it to SVG with INKSCAPE, then the updloading fails because it ask for blue lines for cutting and red for engraving...
I'm sure that I can end up finding a way to do it, but I suspect that this is too much workaround for a simple task as uploading a design.
Could you please give some direction for doing this in Laser-cutting style?
THanks
the PDF is meant to directly work on epilog laser-cutters (most common type in fablabs/hackerspaces), so lines to cut are 0.01mm and areas to engrave are in black without an outline. Using inkscape you sould be able to adapt it for commercial services, but i have no experience in doing so.
bubbo: being inverted means the servos work inverted, so the "3000-" trick should work. You may have to change the SERVOLEFT/RIGHTNULL values quite a bit. Sadly all servos I used havn't had that problem, so I couldn't replicate the problem
bubbo - in reply to joo
Hi Joo,

thanks for your answer. In calibration-mode i adjusted the SERVOLEFT/RIGHTNULL values

so that they are in 90 degrees, like in the picture. Then this happens without the "3000-" trick (sorry, this terminology you get when a complete noob like me tries to build this thing)
wiping from bottom to top. Writing is from left to right, but it looks upside down (he puts the dots bottom one first) and the parking position is bottom right.
Then with the '3000-' trick:
wiping from top left to bottom, writing from right to left, but not upside down. parking position is top left.
so now i'm a bit confused
joo - in reply to bubbo
nice :) It are always the little things that make big problems ;)
Looking at the code to try and reverse out the kinematics: is L1 = arm attached to servo, L2 = arm from "elbow" to pen, L3 = ? (distance between servo pins?)
i think L3=from the joint where the arms come together to the center of the pen
awesome can't wait till i make 1
After waiting for 25 days for my servos to arrive from China, finally made one for myself! Thanks a lot joo!
I converted the code to C# for use with the Netduino...It prints, but everything is skewed pretty badly. Trying to figure out how things are supposed to be layed out so I can debug a bit better. Is the below correct?

Drawto(0,0) = top left
Drawto(50,0) = top right (by the eraser)
Drawto(50,50) = bottom right
Drawto(0,50) = bottom left

Also, during calibration, is it supposed to be drawing a diagonal line from top left to bottom right?
I'm stuck with ardinuo and getting it working. I have downloaded everything from github but has anyone done a turorial on it or can help please? The plotclock is made, i'm just stuck on the ardinuo software.
have you read the instructions tab or the comments in the arduino sketch? where are you stuck?
Hi yes i have downloaded the files from github. I have opened plotclock.ino in ardinuo, then downloaded time, timealarm and DS1307RTC from the links. Put these in a folder together so ardinuo see's them when I open plotclock.ino. Plotclock.h then is looking for wire.h and servo.h. Where or how do I get these from? Am I going in the right direction so far?
wire and servo headerfiles come as standard with the arduino softwrare, you may try the arduino-software examples -> servo sketches to verify your arduino and arduino software is working correctly
Hi, I have tried but i don't understand how to get the arduino working. Is there a tutorial online I can follow which anyone knows about please?
I have added the libraries and when I verify it says 'time_t' does not name a type.
Hi,

No one made lasercut & 3D pieces on a selling kit ?

No laser cut machine and 3D printer here :-(

Peter (EuroZone)
Is there anyway to set it up to be a 12hr clock instead of a 24hr one 'cause I don't like 24hr clocks I know it's in the programing but I don't know how
HI Joo,

I just remix it to hold stylus pen on Note 2 to plots time(http://www.thingiverse.com/thing:268065),
But seems I did not do correctly Initial calibration,

According to your code comments,
To CALIBRATION :

1) adjust the "SERVOFAKTOR" until the servos move exactly 90 degrees,
need move like you last upload image?
I'm trying to adjust but it move more or less around 5 degrees (I will upload video tonight)
This will affect the text crooked yet?

2) Zero-position of left and right servo
What does it mean "Zero-position"?

3) origin points of left and right servo
I do need to adjust in order to calibrate

Thanks for your help and sorry for my English (thanks google translate)
Plotclock on Note 2
by dTom
joo - in reply to dTom
Nice work with the capacitive touch pen :)
yes, it should move to the positions as seen in the last image. The zero-variable sets the initial angle, the servofaktor then defines how much "steps" the servo needs in order to turn 90°, you shouldn't need to change the origin points. In your video it looks like the servoholder is a bit loose, since there is much movement by the servomount, but nut by the pen.
Hello again, I managed to solve the problem! Was bad and also the USB cable adapter 9v, very weird because he used the USB cable to print: S and adapter worked well also! the point is to change cables and everything ok.

Thanks for your help and sorry for my English (thanks google translate)
this would be great with a push button to write the time.. that way the pen should last much longer
I have also thought of this idea however the time will be displayed wrong after the minute is up. Perhaps it could write the time when the button is pushed and then after 60sec it erases the time and waits for the next button push? It would be great if there was a feature that could be commented out in the arduino code that would enable this.
that sounds like a good idea.. or it updates for five minutes? then finishes on an erase and waits for a button push (or wire it up to a motion sensor and it will update the time when someone enters the room??)
Joo,

Once again, thank you for the help. I did do the intial calibration and it did draw the time, however it was upside down. Will this give me the figure eight on the x-axis? Why are the start and finish points slightly different? So your going 269 degrees and finishing at -91 degrees?

number(30, 35, 8, 1);

case 8:

drawTo(bx + 5 * scale, by + 10 * scale);
lift(0);
bogenUZS(bx * scale, by * scale, 10 * scale,4.7,-1.6, 1);
bogenGZS(bx + 20 * scale, by * scale, 10 * scale, -4.7, 2, 1);
lift(0);
break;
joo - in reply to xenonion
i actually don't know the exact reason, but i think it had to do with the circles not closing because of the play in the hinges... it also could be that the functions are a bit off and faulty
Thank You for the help! What are the XY maximums? Are the angles in radians? Firstly, I should mention that the plot clock is actually working backwards, it does not draw as in your videos, but upside down. Secondly, I have been playing with the settings and the servos will travel full deflection off of the board if the values are too extreme.

This is very helpful.
joo - in reply to xenonion
angle is in radians, have you used the v1.01 with calibration routine? also if your servos are inverted there is a discussion down the comments about it, a quick fix seems to be the following:

change all
.writeMicroseconds(servoLift)
to
.writeMicroseconds(3000-servoLift)

and change
writeMicroseconds(floor(((a2 + a1 - M_PI) * SERVOFAKTOR) + SERVOLEFTNULL));
writeMicroseconds(floor(((a1 - a2) * SERVOFAKTOR) + SERVORIGHTNULL));
to
writeMicroseconds(3000-floor(((a2 + a1 - M_PI) * SERVOFAKTOR) + SERVOLEFTNULL));
writeMicroseconds(3000-floor(((a1 - a2) * SERVOFAKTOR) + SERVORIGHTNULL));
to reverse the servos
Hello, How would I modify the code to draw a single figure 8 horizontally? Is this possible?

Thank You!
joo - in reply to xenonion
use
bogenUZS(float bx, float by, float radius, int start, int ende, float sqee)
to draw clockwise arcs (or circles) bx/by = center, radius = radius, start = starting angle, ende = ending angle, squee = sqish or flatten circle
bogenGZS is the counter clockwise version
Amazing robot Joo great work! Had an idea from that robot. If i had time and the resources I would replace the marker with a stylus and and for the surface I would put an galaxy note where it could draw the time. Well it could even be used to automate other apps from the device for example Calculator, Angry Birds etc.
Hi Joo - I've added a pull request on github to merge in a couple of small changes into the code:
- support for DS1307, DS1337 and DS3231 real time clock chips so plotclock tells the right time
- ability to calibrate servofaktor separately for left and right servos

For anyone interested:

- the github code is at github.com/Dave1001/plotclock (hopefully will be merged into the next release by Joo)
- you can pick up DS1307 real time clock modules on ebay for under $2 incl postage
- instructions to connect the RTC to your arduino are here pjrc.com/teensy/td_libs_DS1307RTC.html
already have a DS1304 module lying around, gonna test it later that week and then merge it, also will update the lasercut parts for a first revison
cain666 - in reply to joo
arre you able to include instructions on how to wire up the RTC to the plot clock??
Would someone be kind enough to comment this code? I think I understand how it works but I dont get how it knows how to plot each number.
Thx
can someone video the start and then the cycle it goes through without editing to show home locations and the sequence it goes through, servo with arms is in the home position, I cannot seen to get the arm orientated correctly. It looks like to me that everything is reversed, writing in air (up) and working from right to left.
Thank you HarlanDMii that is exactly what I needed.
Thank you to HalanDMii, everything works fine
See previous comments

Kind Regards
I also tried to copy and paste the code from the git hub, but when it is compiling, it says

"

setTime(19,38,0,0,0,0);

'setTime' wasnot declared in this scope.

sketch_feb24a.ino: In function 'void setup()':

sketch_feb24a:66: error: 'setTime' was not declared in this scope

"

Any ideas?
Thanks in advance
Hi, I am having the same problem, I have the time library imported (downloaded - imported the zip file) then I (i dowloaded the files from GIT and opened the sketch) yet when I go to verify it still gives the same error. Any Suggestions? Have I missed a step somewhere? Cheers
Figured it out after some more googling...Problem was when you install the time library automatically it puts time.h file within a folder called time...within the time library: Libraries-Time--Time---Time.h. It needs to be Libraries-Time--time.h instead (aka it has an extra time folder)...if that makes sense.
Ok i figured this one out, i just needed to download the time library :)

I copied and pasted the code from github, and it works, but the left and right motors just sweep back and forth with the lift motor up??
Just ended up with some new servos.. Having the same problem with sweeping back and forth.. Apparently, they are over powering the arduino causing it to reset each time it tries to lift.
The mini servos I purchased from radio shack didn't have that problem.
delete the line that says
#define CALIBRATION
Then upload the sketch to the arduino again
Hello,

I have a question, i cannot seem to be able to open the .ino or arduino sketches?? does anyone have an answer? i just want to load it into the arduino.
Hello again, I have tested with a 9V charger router - 1A and servos only turn left continuously.

I have tried since revision 3 firmware with the same results, the servos turn right and do not stop, I have to stop it to prevent burning.

The connections seem fine :S

Anyway I recorded a video that you may see.

(it's in HD)

youtube.com/watch?v=HHfq7AAUwBY

I'm sad :( I work them all and my no!
I noticed that the LED's on the arduino are red... Are they red like that without the servos connected?
Also in the vid, your wires are connected to pins 1,2 and 3.. The code default is pins 2,3 and 4
Thanks for responding, and I replied to that before it, that the pins are 2, 3 and 4 ... I set myself to try others.

Finally I tried the examples arduino servo and still have the same problem, but do not connect the yellow wire servo data always move and not stop.

The lights are always red when recording unless the firmware.

I do not understand that can happen, the arduino is new and seems to work well, but only Aque sevor connect the arduino to the current, this does not stop moving ...
I was curious if you ever solved the problem. I wonder if it might still be a power problem.
I fixed a slightly different issue on mine by using a 5 volt regulator and an external power supply.
youtu.be/PLDOygEsHCk
No friend, I still have the same problem :(
joo - in reply to Aivan
hm, have you changed the servo pins in your arduino sketch because you use 1 2 and 3 instead of 2 3 and 4? also i would recommend you to use the current version 1.01 of the program
Aivan - in reply to joo
Hello! I've tried all versions and with the pins 2,3 and 4, also tried aconfigurar other pins with the same results.

For safety I returned to comporobar the latest version and pins 2, 3 and 4 but still the same: (
joo - in reply to Aivan
well, everything else looks right, the servos are connected correctly and everything. have you tried the arduino example sketches for servos? they are fairly simple and should definitly work
Aivan - in reply to joo
I did some more tests, the servos do not stop riding because they always have current probe to put the servos without data cable and did not stop.

I do not understand why this can happen, the Arduino is new :S
Aivan - in reply to joo
nope, I'll try ... Thanks!
What were the dimensions of the piece which you laser cut (height and length)?
don't know exactly, but its a bit smaller than A5-paper, so on the typical A3 laser cutter you can cut four on the same sheet
Hai

I've read that you have quite a few elko in the supply line puts zodicht possible to the servo connections
I use 2x 470?F dietary offs (peak flows)
An excellent work!

I have a small problem, first excuse my English (thanks google translator).

I'm using:

Arduino UNO R3
Servos Hextronik hxt900 9g
(http://articulo.mercadolibre.cl/MLC-416197377-micro-servo-motor-sg90-_JM)
USB Connection

The problem is that Arduino connects and disconnects the USB.

Arduino working properly, load firmware and running, but when I connect the servos are disconnected and reconnected the USB.

I've checked all connections and everything seems fine, I also tried to configure other data pins getting the same results even desperate've tried 3 different computers.

Any idea?
Anyone has this happened?
Can the problem be the servos?

I want to see the time on my plotclock: (
I had the same problem.. Use a 6-12 volt adaptor to power the arduino.
joo - in reply to Aivan
i had this problem only when the servos needed too much force to move at all, say having a joint too tight or having a mechanical error where the pen is stuck. So first I would check if every joint and connection runs freely, if there still are problems try adding a big capacitor, or using a smartphone/tablet charger for the 5V supply (PC-USB only handles 500mA). Also try connecting the servohorns one at a time to see when the arduino starts resetting.
Aivan - in reply to joo
Thanks for the replies!

I try to use external power.

I have checked all the servos one to one presenting the same problem, if it is true that every time you connect the servos and arduino increasingly less power move.

Not if I explain or understand me well.
So inspiring I actually built one... but I had the same problems as Sembot. I wanted to ask for some info on the code. What are the max/min values? What do you mean by parallel (I don't think it's possible) with reguard to the arms? What do bigger/smaller numbers do? etc. I've been added comments to the code as I figure things out, but I'm still a ways off before it come close to working. I spent a fair bit of time tweaking the files to work with 5mm acrylic so I can use uv/black lights and wet erase markers. I'll follow up if I get it fix. And I'll follow up sooner if I don't ;)
Hai Acklenx,

May I ask if you've already found a solution to the problem of mirror movement
I still have not found what reason can be
The type of my servos = Micro Servo 9G ?????

Can anyone help with the calibrate

with kind regards
hai,

The movements of my plot clock are mirrored what can I do
Erasing from top left to bottom right
Writing from top right to bottom left
The elevator servo is up (writing in the air)
If he stops the pen stand top left, right servo arm outstretched
So everything is reversed (mirrored)
What can I do, can someone help me
I use pin 8,9 and 10 of the Arduino (got the pins 2,3,4 in the program changed)
Pin 8 is the lifting servo
Pin 9 is the right servo ( highest )
Pin 10 is the left servo with the double support

Kind regards
Can't believe I made such a simple mistake.. I originally said 2000-
That should have been 3000-
Sorry
change all
.writeMicroseconds(servoLift)
to
.writeMicroseconds(2000-servoLift)

and change
writeMicroseconds(floor(((a2 + a1 - M_PI) * SERVOFAKTOR) + SERVOLEFTNULL));
writeMicroseconds(floor(((a1 - a2) * SERVOFAKTOR) + SERVORIGHTNULL));
to
writeMicroseconds(2000-floor(((a2 + a1 - M_PI) * SERVOFAKTOR) + SERVOLEFTNULL));
writeMicroseconds(2000-floor(((a1 - a2) * SERVOFAKTOR) + SERVORIGHTNULL));
to reverse the servos
joo - in reply to Sembot
it seems your servos are inverted, you may try setting the servofaktor negative, say -620 instead of 620 and also play with the values of LIFT0 / 1 / 2
Where can I buy one?
This thing is so cool and funny i can´t stop to laugh :-D
I love it!
How do I download the .stl files for the plotclock?
I am so exciting to make one today and it works good but still need to calibration.Lots of my friends in shenzhen want me to host a workshop.I would like to talk with you about my ideas.Would you share with me ur contacts?Thanks!
Excellent level of effort in creativity and execution. :)
But the important question is: Does it keep printing and erasing 00:00 when you haven't set the time after a power failure? :-).
Man - this is the coolest thing I have seen on here is a while - what a delightful little thing, :)
Incredible project! Admittedly, I am a complete noob when it comes to arduino, but this inspires me to give it a try. Can you give me further detail on what you listed in your instructions: "A small custom servo adapter, there are shields or servo-arduinos that also can be used". I think I'm pretty clear on all the other parts, but not sure what exactly this is. Thanks!
Something similar to this: adafruit.com/products/1411
although you don't need as many channels only one per servo I think.
laird - in reply to nkizz
To elaborate slightly, you can control the servo directly from the Arduino, up to the number of pins on the Arduino (12+, depending on the model), but the Arduino doesn't have enough power to drive very many servos, so you have to wire the control to the Arduino, and the power and ground lines to a power supply. For a few servos you can do this on a small breadboard, or solder everything directly. The board that is linked above does this, and adds a multiplexer, so you can control many more servo's.

For this build, you *might* be able to power three servos from the Arduino directly, depending on how much current the servos draw. But it'd be safer/cleaner to power the servos separately from the Arduino, so that (for example) you can't have interactions like (for an example I've run into) you move all three servos at once, drawing too much current and resetting the Arduino. :-)
That's super-helpful info. Thanks!
what a great example for object-oriented ontology! it's so darn cute.
Das hätte Karl Valentin noch erleben sollen!
One might be able to "write" on glow in the dark painted surfaces with a
blue laser too. No need to clean that. It would take some very good
paint with a nice slow half life. The light would have to be blue or
possibly green. Red is too low energy to excite glow in the dark
paint. UV lasers or focused LED's would be best. :-) The machine could repeat the pattern over and over within each minute to keep the image refreshed. Enough of my rambling. Very cool creation as it is right now. :-)
Which time.h library did you use?
This could easily become a milling machine.
This is a great project, I have all the parts printed in PLA with my Prusa Mentel 3D robot and everything was perfect
I am confused how to place before the start of the arms from the servos
Is the starting position right above??
Anyway, I am happy with this project
Hey my friend, you are really mad :D THIS THING IS AWSOME! ! ! I have great respect for you! Greets from Bremen
Great fun project.
This will be my son's first arduino project on the board I geve him. I will start printing the parts for him :-)

He already proposed to build one additional one... next to it..... writing the date :-)
And a third writing names of people having birthday that day :-)

Thomas
Dude! This is so cool!
I converted the whole thing to .stl files and i am printing it now. Now i just need to order the servos and the Arduino. This is a GREAT little project! Thanks for sharing it!
Someone needs to add a head above the servos so it looks like its a little guy drawing the time holding onto the market with two hands
I was thinking the same thing and i am already working on it :)
are this the right ones:
http://www.benl.ebay.be/itm/Servo-Tower-Pro-SG90-9g-Micro-3-servos-/131104760078?pt=FR_YO_Jeux_RadioComRobots_VehiculesRadiocommandes&hash=item1e8673e10e&_uhb=1
joo - in reply to aaronR
should be the right ones, tower pro 9g, mine were about 16€ for 8 servos from china
aaronR - in reply to joo
can you give me the link?
Nicely done. The world is filled with people who are inclined to tell you what to do, but I just can't help myself in this case. With this setup I'd want to see it running on and on and on... , but the pen will get used up and I presume the eraser part will get saturated. If anyone out there has the time, it would be great to modify this design to draw around in tiny sandbox. You'd never use up the sand and it would still be just as cool. It would then be practical to leave running 24/7 for everyone's enjoyment. That just my 2 cents worth. (or should i have said microBTC ?)

Further ideas: If the sandbox had a vibrator attached, the writings could just fade away. If there were 2 different densities of "sand" they would automatically form layers and if they are different colors, the drawing would be more pronounced. (airsoft bb's?) I do it myself If I wasn't so busy. :-) I may do it anyway, but I challenge anyone to beat me to it. :-)
ohhh, that's a good idea. I'd try it if I didn't already have plans for projects. :) go for it
or you could us a litle brush i replace of the gum for the sand :)
Was just thinking about sand also! Though the original idea is still marvelous :)
Or perhaps draw using water on Zen Board (http://blog.freepeople.com/2013/03/living-zen-board/ or buddhaboard.com/)? If you could make a marker from some felt and tubing, you could draw with water "forever". I guess you'd have to refill it over time. So then your Aduino could be relaxed and meditate on the nature of time for you!
I don't think you can do zen meditation vicariously through robotics. :-) (but one could try) When I suggested sand, the thoughts zen sand/gravel raking came to mind for me too.
could i use the raspberry pi?
Thats was a really cool project! I just love it!
I had some extra time so I broke down the SketchUp file and created the STL files. They are located here thingiverse.com/thing:250204 as a remix.
Plot Clock STL Files
Holy COW!!! I've seen amazing 3D printed stuff.. and this has gone to the top of my list! AMAZING.. gonna try an make one
Is there any way you could post all of the parts as STL files? I would really like to make this for my High School programming class. Great work by the way, super cool!
you can export this as an .obj from sketchup sketchup.com/ and most 3D printers like the Replicator can use that file type
I really like this and want to build one. It will go nice beside my useless machine. But I dont have sketchup and cannot afford it- Im a retired guy so I cant get the student version. Can you post the parts files as dfx? I could them cut the parts on my CNC router.
I believe that sketchup make is available for non-commercial use. You can go to this link and download it for "Personal Projects".

sketchup.com/download
i had done this 2 years ago..... hackaday.com/?s=doodle+clock
More shaky but I like it even better, esp the way it wipes the number and counts the seconds (a human-like wrist movement). Would you re-make it specifically for 3D printing? thumbs up!
currently developing one which is elegant 3d printed and works without a pen so that it lasts forever and uses micro steppers to get more accuracy... will show it in a month or so......
Will definitely try to get back to it :)
Good for you. Now someone has done it again.
Klasse. tolles Projekt !!!
Alle Daumen hoch vom Hackerspace Bremen. ;-)
I gave a talk today at the NY 3D Print Show and as part of it showed some of the cool things that have been uploaded to Thingiverse recently. The plotclock was the hit of the show. Congrats on a fantastic project.
You bet! But please tell me you gave the author proper credit! creativecommons.org/licenses/by/3.0/ ;-)
I screensnapped the thing page, so credit was front and center!
This comment has been deleted.
joo - in reply to bre
Thanks a lot!
That's a clever design! I would like to make a derivative for an analog wall clock.
Very Very Cool ... Thanks for sharing! Went to the top of my list of things to make.
it's the same AVR, so it shouldn't be a problem
THIS IS SO BEAUTIFUL I COULD CRY!!!! I must make one immediately!
first of all: great design!
So now i made one myself, but also with mine it's writing backwards and the parking is top left instead of topright.
Now in tried the '3000-' trick, but that doesn't seem to solve the problem. Is there maybe something else i can try? Perhaps switch pin 3 and 4?
hope you can help me out, because i would love this thing to work.

thanks,

Bubbo
Top