Fun with robot arms

The Plan

I'm planning on building a large robot arm using stepper motors.
It shall execute G-Code with absolute, cartesian coordinates.
The job it so assist with some repetitive tasks in the workshop when casting small batches of parts that for quality, material or number can't be 3D printed individually.

As with all my blog postings, I'll keep updating this one.
It documents one, single project in all (public) details and all findings as I progress.

Start Small

To start small, I got myself a laser cut hobby-servo driven robot arm and attached it to an Arduino Uno with my usual LCD+Keypad Shield.

The objective is to get my inverse kinematic calculations right and to see how much can be acomplished with this much simpler setup already.
I also wish to experiment with absolute posistion feedback by attaching and ADC channel of the Arduino to the potentiometers of the hobby servos (maybe using a multiplexer to get all of them).

Hobby Servo issues

So far I identified a number of issues with hobby servos, that I want to document here:

Power supply

Running the Arduino from USB you only have enough power for 1 servo.
Adding a 12V 1.5A power supply for the passive step-down DC-DC-converter of the Arduino Uno is enough for 2 service. Only the 12V supply works for 1 servo only.
The path to go seems to be a 5V supply powering the servos only, pulled to a common ground with the Arduino (so the PWM control signal has the right right voltage level).

If the display gets dark, the servo motion jerky, the software resets of ommits steps, then you are lacking power.

Jerky movement

The default servo.h that comes with the Arduino SDK allows for an integer of 0-90 (degrees).
This isn't a very fine control.
I found in this blog posting that:
It also assumes minimum and maximum PWM timings that are beyond the range of many servos.
You should set minimum and maximum milliseconds in the attach() call and use the servo.writeMicroseconds(int milliseconds) call with 1000-2000 ms. This allows for a much finer control and stays within the allowed range for your servos.

Next steps 

Next I'll
  • convert my test-code to use writeMicroseconds()
  • map the servo-locations to angles
  • implement my inverse kinematic code.

Designing the Real Thing [TM]





The last update for the Tapatalk forum reader software now needs the ACCESS_COARSE_LOCATION permission.
Obviously for reading web-forums there is absolutely no need for this information.

No Android except CyanogenMod with special privacy settings for this one app or Android 6 with as-of-yet unknown required settings would even ask the user.
Let alone allow the user to disable location access in the first place.
So almost all users out there will just have their coarse location inquired and handled without even knowing about it, without their consent and with no requirement to provide this information for the functioning of the app whatsoever.

Aparently it requests the location every time the app starts, a fragment becomes visible and when the app ends without any visible feature using the information.

Here is the answer from Tapatalk support:

Thanks for contacting us.  Location data is not required, and you have the option to not provide location data.

You can also change your location permission by going to Settings>Scroll to bottom to the apps and select Tapatalk>Location.  You can change the setting to Never.
(Remark: This only exists in CyanogenMod)

All information collected is non-Personally Identifiable Information. 


The perfect messenger

There are so many messengers around but none of them seems to meet the criteria I have for a reasonably secure messenger.
Since this gets discussed over and over again, here are:

My Requirements for a messenger service 


  • If there are one or many central operators/brokers/hubs, they can not read ANY messages past, present or future
  • encryption is always end to end.
  • I can change between my different devices and continue a chat (key exchange between my devices)
  • end to end encrypted group chats (this basically means changing keys and distributing them to all participants whenever someone joins or parts) 


  • I can have multiple full identities (not just usernames as aliases that share a profile image+text+contacts-list)
  • I can receive and send messages as all my identities at the same time (no logout+login)
  • Nobody can find out IF I am using this type of messenger at all by knowing my phone number 
  • Neither my phone number nor any other information about my real world identity are stored with the operator (exception for temporary storage of IPv6/IPv4 addresses)
  • optional: If there are one or many central operators/brokers/hubs, they can not know the identities that communicate with each other
  • optional: I can set up my own server/hub/broker


  • texts, images and locations can be shared
  • one to one and group chat 
  • there is a chat history that I can access from all my devices (my be stored encrypted with my own key on a server or local on the client)
  • optional: videos can be shared
  • optional: voice and/or video -chat
  • optional: voice and/or video group-chat


Nexus 7 repairs

The USB port on my generation 1 Nexus 7 tablet (with GSM SIM card) was getting wonky and more often then not it refused to charge.
Luckily the replacement part is cheap.

...while at it I got myself a very nice set of phone-opening tools with scratch-free plastic hooks, spatulas, suction cups, wedges, cleaning tools, scalpels, metric <2mm a="" and="" full="" nbsp="" of="" p="" screwdrivers="" set="" tiny="" torxes="">...I just can't resist a good set of tools.


    Ciclop 3D scanner

    old and busted:  FabScan

    I have a FabScan Cube (build from the kit sold at Wattenrott) for quite some time now. However I'm massively disappointed by the software. The last software (100.9) that supports MacOS is neolithic and can no longer be used since MacOS 10.9 "Mavericks".
    There is a processing script to use the scanner but calibrating it is a game of guessing and source code manipulation. If I got a scan out of it at all (very touchy about environmental light), it was all ball shaped and incomplete.
    A new software (that requires a Raspberry Pi) was promised to be released half a year ago...it never happened.

    new: Ciclop



     So being fed up with the FabScan, I got myself a completely new Ciclop scanner as a factory made kit. The parts are 3D printed very well and everything more or less fits.
    You can 3D print the parts yourself and just get an electronics kit and a number of nuts, bolts and (metric) threaded rods.
    • The scanner is not  stable against torsion forces. So it must rest on a perfectly flat surface.
    • The stepper movement is not very gentle. So any flexible object will move around during scanning.
    • It does require 2 USB ports and 1 power socket (to power the stepper motor).


    Horus is the software that is supposed to operate with the Ciclop.
    It looks very easy to use but seems to still have some practival issues in doing the automatic calibration. Notable one but where it will constantly tell you that the stepper direction is wrong.

    I haven't gotten it to scan using 2 (or more) lasers yet as this results in 2 scans that don't match up at all. With a single laser it has a very limited scan volume and your object should contain all parts of the axis of rotation inside itself but it does work.
    I haven't gotten around to check if the physical dimensions as replicated precisely yet and that there are no distortions.


    Debugging Android Wear support for K-9 Mail

    I started a branch to develop proper Android Wear support for the popular K-9 mail client.
    The last few weeks I was grinding on a strange error.
    It would create PendingIntents for the different actions for each individual message.
    Because on Wear the messages are shown as a stack and you can act on each of them.

    What I found was that it would issue the right action...on the wrong message.
    Always the firt message of the notificaiton.

    I think I found it.
    PendingIntents are not created. They are requested.
    If the same PendingIntent already exists, it is returned.
    The "same" means same Action, same Data, ...  But not same Extras.
    The message ID was transmitted as an Extra.

    This was no problem up to now, because most people you would only ever have one notification.
    But even in the existing code this bug would have hit (and hit hard inc ase of the  "delete" action) if you have multiple accounts configured and choose an action on the second notification, you would get it with the parameters of the same action on the first notification.

    I'm considering the Android Wear branch of K-9 to be BETA-quality now
    and am using it myself daily to find bugs.


    printing working threads on an Ultimaker II extended

    Even at 20 micron and less layer height, most theads have too many threads-per-millimeter/threads-per-inch to be reasonably 3D printed.
    I'm regularly using a thread cutter on 3D printed parts to do this instead.

    Now I have some  solenoid valves with a very strange NPT1/2 thread.
    This is a very rare imperial sized, trapezoidal (getting smaller, not staying at one diameter)
    thread with only 1,814mm per thread instead of 1mm.
    (BTW NPT1/2 isn't even near 1/2" in size. )
    So it looks like a perfect test to 3D print the thread without cutting.

    Due to the extreme heat recently, I had some issues with my Ultimaker II extended at first.

    But int he end it worked out.
    Here is the same thread printed in normal quality,  high quality(at 200% speed) and ulti quality (40 micron).
    The (at first) strange result it, that the thread printed at normal quality was far more clean then the other ones.
    ...that is until you think about a thread as one giant overhang. A thicker layer-height seems to work better for overhangs as it's not as compressed by the next layer. This is no problem in solid areas bu when there is air below the layer...you can guess.

    Fits perfectly!