Home Forum Everything Else Skycam/SpiderCam


Viewing 25 posts - 26 through 50 (of 73 total)
  • Author
  • #15253

    Uh…. they shouldn’t all move together.

    option a) Did you wire all the motors to one driver?

    option b) Maybe your setup thinks the machine is 0mm on each side and the math is failing? :S

    option c) it’s a firmware bug and I need to investigate.


    Good ideas! I’d guess its option B. I saw the XYZ system dimensions (in mm?) in the firmware previously. I cant find that now. Is it set using the adjustLimits() function? And what might I send over serial input manually to set for instance, my system to X:500mm Y:500mm Z:400mm ?

    thank you again!


    I see on line 166 of eeprom.h that we check for “MAKELANGELO_HARDWARE_VERSION” value. But that doesn’t appear to be a define elsewhere in the code, so it doesn’t look like adjustDimensions gets called.
    Should this be checking against “MACHINE_HARDWARE_VERSION” instead? Looks like the Skycam would be 6.
    Can’t try until tomorrow, but I will.



    I’ve modified “loadConfig()” in hopes it sets my skycam dimensions up correctly. Will test it asap:
    (are the units in cm or mm?)

    void loadConfig() {
    char versionNumber = loadVersion();
    if( versionNumber != EEPROM_VERSION ) {
    float limits[NUM_AXIES*2];
    limits[0] = 60.0;
    limits[1] = -60.0;
    limits[2] = 60.0;
    limits[3] = -60.0;
    limits[4] = 40.0;
    limits[5] = -40.0;
    //adjustDimensions(60.0,-60.0,-60.0,60.0); //how do these get set?
    adjustDimensions(limits); //ACJ


    no go. hmmm. after trying the above, M102 returns:
    (-0.01, -0.01, -0.01) – (-0.01, -0.01, -0.01)

    Not sure what that means exactly, but are those the machine dimensions?
    If so, my adjustDimensions attempt did not work, nor save to eeprom


    adjustDimensions() there would only happen once, when the EEPROM version changes, which is almost never.

    gcode M101 will adjust limits without changing the firmware.

    M101 Annn Tnnn Bnnn
    Change axis A limits to max T and min B

    axis order is XYZUVW, so to change axis X to limit from -10 to +20

    M101 A0 T20 B-10

    I hope this helps.


    THAT helped a lot actually! THank you! Things are moving in three axes now! Woohoo!

    There seems to be an issue with swapped motors. I’ve wired motors 0,1,2,3 properly to the arduino as in the code.

    I’ve arranged them A, B, C, D (NE, NW, SW, SE) as shown in the original sky cam post.
    Is that right still?

    Lastly, what are the units please? Mm? Cm? My guesses aren’t seeming to arrive at accurate distances or directions.

    Thanks again!


    Everything in the makelangelo code should be in mm. I thought I had documented it better in configure.h that the standard units would be mm and kg… another issue to open in github.

    Thank you for your patience with me. I’m going as fast as I can.


    Dan, I’m absolutely thrilled that you help me out at all! Rare to see responses to forum inquiries these days, so thank you!
    Your site and projects and mission are awesome and inspiring.

    I hope I can contribute in useful ways to the code at some point too. Trying to get there. 🙂
    Thanks again!


    hey dan hows it going.

    looking good your website…things have changed…

    i have now started and run some of your projects i tried the v plotter v2 of yours with ams board…

    and now i want to move up to this one….skycam for lego haha..

    in your link here
    you say to use the
    RUMBA controler or a RAMPS shield
    but i see you use the adafruit motor shield v1 is that what you call a ramps?no?
    can i use a cnc shield like so
    only cause i dont have a rumba or ramps so would need to order but i got a cnc shield so could try…

    i also read people were asking you to try running it on one arduino control board does the firmware do this or is it still a future idea?

    bassically id like to write some loops and let the skycam run and run…so i dont need a computer running the software or and sd card well unless my loop are miles long…
    so i was wondering if you could help me simplify it…to just the raw bassics?

    as is would i be able to just create a sequence of teleport commands flashed to the arduino would that be fine or is it currently only set to be controlled via your software.?

    thanks allot dan hope things your side of the world are marginally good


    The makelangelo firmware has a skycam option.

    in configure.h,


    Not many people have been brave enough to try this, so please report back with your tips & quirks, I will try to assist.


    well im sort of a bit further.
    could you help me with some things.

    im so far trying to start with the pen pos in the center of the center of the square.say the square is 2x2x2meters.
    how would i set the starting values without using the java software so i could run a loop function with teleport here or there?

    im unsure what this limit is ?is it the lenght in mm?could you give me an example if the i start in the center of a 2×2 cube?
    float limit_ax = 0;
    float limit_ay = 0;
    float limit_az = 0;
    is this the home i.e like you explain in the
    is this below c so 0,0,0 start pos?
    float homeX=0;
    float homeY=0;
    float homeZ=0;
    what would this be if again i start with a 2×2 cube?
    float posx, posy, posz;

    and is this end number mm||cm?
    motorStepArray[0] = lround( sqrt(dx*dx+dy*dy+dz*dz) / THREAD_PER_STEP );

    does this function move the skycam in 2d rather than 3d movement?
    void polargraph_line();

    thanks again.


    There are 1000 (one thousand) mm in a meter. so each of your corners would be something like (1000,1000,2000).
    limit_a* is the position of the motor A relative to the origin.


    THREAD_PER_STEP should be mm – the amount of belt moved on each step of each motor. Assumes all motors are the same.
    If you know the pitch of your pulley then you can say thread_per_step = pitch / actualSteps.
    at 1/16 microstepping and 400 steps per turn, with twengty-tooth GT-2 pulleys,

    pitch = 20*2; // GT-2 is 2mm per tooth.
    actualSteps = 16 * 400; // microsteps*full steps per turn
    thread_per_step = pitch / actualSteps;

    M101 will let you adjust teh limit values at run-time so you don’t have to keep rebuilding the code while you figure out the right numbers.
    movement commands like G0 and G1 understand X, Y, and Z.


    alright thanks for the quick reply.

    im going to try tonight so ill get back to you if i get in a pickle.


    hey dan.

    so i ended up having some more problems.

    im not trying to run the skycam from your software instead im trying to get it working with my own stepper interupt routines.

    but i tried setting it up to test lenghts and stuff like you sugested using M101 and such, but i couldn’t get any stepper movement and currently only have one adafruit motor driver.its already installed on my wall running your wall plotter.

    i tried running the software for the skycam on osx serria 10/12/6 .with no luck

    i get these errors.

    when trying to run i get this error.

    Skycam $./
    Error: Unable to access jarfile /Users/hero/Desktop/Skycam-master/src/main/java/com/marginallyclever/Skycam/DrawbotGUI.jar

    so i added the DrawbotGUI.jar to the folder.

    and then got this

    Skycam $./
    Exception in thread “main” java.lang.NoClassDefFoundError: gnu/io/SerialPortEventListener
    at java.base/java.lang.ClassLoader.defineClass1(Native Method)
    at java.base/java.lang.ClassLoader.defineClass(
    at java.base/
    at java.base/
    at java.base/$100(
    at java.base/$
    at java.base/$
    at java.base/ Method)
    at java.base/
    at java.base/java.lang.ClassLoader.loadClass(
    at java.base/java.lang.ClassLoader.loadClass(
    at java.base/java.lang.Class.forName0(Native Method)
    at java.base/java.lang.Class.forName(
    at org.eclipse.jdt.internal.jarinjarloader.JarRsrcLoader.main(
    Caused by: java.lang.ClassNotFoundException:
    at java.base/
    at java.base/java.lang.ClassLoader.loadClass(
    at java.base/java.lang.ClassLoader.loadClass(
    … 14 more

    as i have never ever used java im unsure what to look for.

    i then tried running it from eclipse by importing a maven project and running.
    and i got more errors.

    Description Resource Path Location Type
    The type java.lang.Object cannot be resolved. It is indirectly referenced from required .class files /Skycam/src/main/java/com/marginallyclever/Skycam line 1 Java Problem

    it seems in both cases some im missing some serial files.

    so im a bit stuck.

    can you confirm that this code here
    no runs the skycam on one board and does not need two like before?

    im also still confused about the things i asked last week.

    im now trying to use the kinematics functions and create my own code to get lenghts and telport.

    but i still cant understand how to set limits without have to use software or M101.

    i have no problems recompiling everytime.

    here you say”There are 1000 (one thousand) mm in a meter. so each of your corners would be something like (1000,1000,2000).
    limit_a* is the position of the motor A relative to the origin.”

    could you please give me an example for say like before i want the star/origin to be the center of a square 2x2x2.

    would i do this for each motor?

    float limit_ax = 1000; //1000mm i.e half of 2meters?
    float limit_ay = 1000;
    float limit_az = 1000;

    or would i set this in

    float homeX=1000;
    float homeY=1000;
    float homeZ=1000;

    as id like my home to be the center of the 2x2x2 cube.

    im sorry if im repeating myself i just cant grasp setting the lengths and limits in the firmware.without software.

    here is the code i put together to test the kinematics lenghts.
    it runs steppers and calculates lenghts but when i change x or y pos all lenghts seem to always be equal to each other.which cant be right.


    > The type java.lang.Object cannot be resolved.

    I would Google it and see what stackoverflow says.

    > can you confirm

    code says “Skycam – supports raprapdiscount RUMBA controller”. I don’t have hardware set up to retest it.

    All limits are relative to the origin (0,0,0). In my cube I set the home on the floor in the center at the origin. the corners are 1m away and 2m up, or
    (1000,1000,2000) for limit a,
    (1000,-1000,2000) for limit b,
    (-1000,-1000,2000) for limit c, and
    (-1000,1000,2000) for limit d.

    I hope that helps.


    yea that helped allot dan thanks.
    my step values are now looking right.

    im away from home at the moment but will give it a try with steppers attached soon.

    thanks again


    hey dan i managed to get it working thanks so much for your help.

    i do have a few mini questions tho.

    since i see you are using a pulley and thread and not a pitched belt pulley why are you using the value #define PULLEY_PITCH (4.0) ?
    and where is the value #define PLOTTER_Z (0.5) from?or used?
    is it distance to the center of all thread lenghts where they are tied in the center? and so the 0.5 is because you are not tying them all together?

    thanks again.

    merry christmas


    I assume we’re talking about

    I must have tried to do belt at some point. Probably got distracted and never finished the demo.

    PLOTTER_Z is an offset. Say your plotter head has attachments for the belts that are 5cm above the bottom. then PLOTTER_Z would be 5.

    If I had a pen in the plotter head then I would change the offsets so that they reflected the distance from the belts to the pen tip, so my G0 commands don’t require extra math in my head. Done correctly G0 X0 Y0 Z0 would touch the pen tip to the center of the floor.


    yea its in the configure file here

    so i have understood why i need plotter_z but can i simple change PULLEY_PITCH (4.0) to the classic (d*pi/steps) ?

    #define PLOTTER_RADIUS       (6.0)

    #define PLOTTER_Z (0.5)
    `#define PULLEY_PITCH (4.0) // 20 gt2 teeth = 40mm, or 4cm.

    can i change it to use
    #define SPOOL_CIRC (SPOOL_DIAMETER*PI) // circumference
    #define THREADPERSTEP (SPOOL_CIRC/STEPS_PER_TURN) // thread per step

    it seems PLOTTER_Z and PLOTTER_RADIUS is used in the IK function.
    how would i change it to use a pulley with a 12mm diameter.
    as PLOTTER_RADIUS is already set to 6 it should be fine im just confused how to change the pulley pitch part.



    I believe your change makes no functional difference. If it helps you understand what’s going on, do it. 🙂


    Hi Dan,

    Amazing work. Really appreciate the efforts taken to build a reliable firmware + hardware combination for such diverse applications. I was playing with skycam version for some days now. I have a ramps+mega with 4 drivers in place. Firmware is working almost same, iam using threads, not the pulley-belt mechanism.

    I am considering of adding 4 more steppers to get the 6 dof control. In theory its working, in the sense i made a y connector for each stepper driver and was able to make 8 motors controlling a skycam simultaneously. but for z axis movement to work effectively, i need to reverse the bottom 4 motors alone.

    What could be the best way to do this in firmware ? My options are,

    1. add 4 more stepper drivers in ramps, wire it outside, configure it and make the firmware work in a way to reverse the movements at the time of z axis travel

    2. Or stick to 4 stepper drivers and split wire them with y connectors, put an additional circuit to reverse the z axis moves alone, without making huge changes in firmware.

    Would love to hear your thoughts on this. Thanks i advance. Its a poc kind of work, if it works well, may be i cna go ahead and make a full fledged cdpr fork on it too.


    I built one of these inverted stewart platforms many years ago. Which approach is best? … I’m not sure I have enough experience to judge. … but I am excited to see your results! Please share when you make progress.


    hey dan,
    im re looking at your original post on how to code IK for a spidercam.

    you use these two equations

    T = (EE – A);
    lengthA = sqrt( Tx*Tx + Ty*Ty + Tz*Tz );

    what does the T stand for?

Viewing 25 posts - 26 through 50 (of 73 total)
  • You must be logged in to reply to this topic.