Teknic motors and MachineKit

82 views
Skip to first unread message

John Allwine

unread,
Feb 21, 2020, 5:30:07 PM2/21/20
to Machinekit
I'm looking into using Teknic SDSK servo motors with MachineKit. The SDSK models accept step and direction pulses like a stepper motor, so using hal_pru_generic's stepgen is straight forward. The major issue I see is attempting to use Teknic's precision homing routines, as it doesn't fit into MachineKit's limit switch routines. I'd really like to use their homing routine because it is accurate to less than 1/10,000 of an inch in my setup, which could be difficult to achieve using my own limit switch setup. It seems to me that in order to do so would require either a custom homing routine implemented in C++ (so a custom build of MachineKit). Any thoughts on this would be appreciated!

The Teknic motors have 3 control pins and 1 feedback pin:

Control Pins:
Enable - Used to enable/disable the motor and plays a part in initiating the precision homing (see below).
Step - Same as for a stepper motor
Direction - Same as for a stepper motor

Feedback - They refer to this as the HLFB (high level feedback) pin. Can be set to a number of different options, but the relevant one for homing would be ASG (all systems go) Position, which is high when the motor is in the commanded position, low while moving.

The precision homing sequence is initiated as follows:

1) Put the motor into homing mode by toggling the enable pin on (if it's already on, then turn it off, then back on).
2) Command the motor with step and direction to move the joint to a hard stop.
3) The motor will detect the hard stop and stop accepting step pulses until it is commanded to go the opposite direction.
4) After the hard stop is detected the motor will back off to a precise location a configured number of internal encoder counts away.
5) After a configured number of milliseconds (default is 10), the HLFB pin asserts indicating that homing is complete.

The hard stop detection and precision homing is fantastic. After the first homing sequence, the motor will return to a very precise location as long as the hard stop stays within ~2mm. I can physically put a shim (less than 2mm thick) in front of the hard stop and it still goes to a precise location that properly ignores the shim (so wearing on the hard stop over time doesn't affect the precision of the homing sequence).

So, does anyone have recommendations for how to perform this sequence properly in MachineKit? Preferably, I'd avoid needing a custom build of MachineKit, but if it's required to make homing a simple click of a button then I'll have to go that route.

Bas de Bruijn

unread,
Feb 22, 2020, 3:04:04 AM2/22/20
to John Allwine, Machinekit


On 21 Feb 2020, at 23:30, John Allwine <jo...@allwinedesigns.com> wrote:



Hi John,

So if I understand correctly your homing sequence is started on the rising edge of the enable pin.

Then you need to move to your chosen homing side.
Your homing is done when the special pin rises.

Maybe all parts are already there.
Have you tried configuring as ‘immediate’ homing? So rising special pin sets the position?

Even if you decide you need a special component, you do not have to rebuild MK, just write the comp in C and install with instcomp.


Best,
Bas


--
website: http://www.machinekit.io blog: http://blog.machinekit.io github: https://github.com/machinekit
---
You received this message because you are subscribed to the Google Groups "Machinekit" group.
To unsubscribe from this group and stop receiving emails from it, send an email to machinekit+...@googlegroups.com.
To view this discussion on the web visit https://groups.google.com/d/msgid/machinekit/6b01a405-251f-4633-af72-abbcd6c78ab0%40googlegroups.com.

John Allwine

unread,
Feb 22, 2020, 9:25:50 AM2/22/20
to Bas de Bruijn, Machinekit
Hi Bas,

Thanks for your suggestion! I’ll definitely look into writing a custom component rather than a custom MachineKit build.

I’m afraid, though, that I don’t completely follow the rest of your suggestion. Could you please expand a little? I have used immediate mode before. Let’s say a user clicks a home button in the Axis GUI. How could I tie into that event to start the process? Alternatively, if I created my own button to trigger something in Hal, how would I trigger immediate homing? How would you recommend setting the position on the rising edge?

I believe I have a good grasp on how Hal works, but my knowledge of the built in components is limited.

Thanks again for the help!

John Allwine
Owner of Allwine Designs

On Feb 22, 2020, at 1:04 AM, Bas de Bruijn <b...@basdebruijn.com> wrote:



Bas de Bruijn

unread,
Feb 22, 2020, 2:25:07 PM2/22/20
to John Allwine, machi...@googlegroups.com
The google group fell off the reply.
For completeness done manually :)

On 22 Feb 2020, at 17:44, Bas de Bruijn <b...@basdebruijn.com> wrote:




On 22 Feb 2020, at 15:25, John Allwine <jo...@allwinedesigns.com> wrote:

Hi Bas,

Thanks for your suggestion! I’ll definitely look into writing a custom component rather than a custom MachineKit build.

I’m afraid, though, that I don’t completely follow the rest of your suggestion. Could you please expand a little? I have used immediate mode before. Let’s say a user clicks a home button in the Axis GUI. How could I tie into that event to start the process? Alternatively, if I created my own button to trigger something in Hal, how would I trigger immediate homing? How would you recommend setting the position on the rising edge?

You might not have to do anything. I’m not an expert on the cnc stack.
If you have wired the enable pin of the motor physically and in HAL to the enable pin of the motion component, then pressing the home button in the GUI should start homing. Thus moving towards the end of your guide/motor.
Make sure you wire the smart pin to the home Hal pin.
Would that not work out of the box?
Does the special pin stay high after homing?

John Allwine

unread,
Feb 23, 2020, 12:31:42 PM2/23/20
to Bas de Bruijn, machi...@googlegroups.com
The main reason why I’m not able to get it working out of the box is the Teknic motor stops being in homing mode if the machine is jogged at all after the enable pin is asserted. So I would like the enable pin to be a part of the homing sequence itself, to avoid any issues arising from that.

I left out that I’ll need a homing sequence for a continuous rotary axis, as well. The Teknic motors can also very accurately home to a specific angle when enabled. We’ll have a 50:1 reducer on the motor, so it could feasibly home to 50 different locations without first moving to a limit switch. Because of that the motor must be enabled twice during the sequence (the first in order to command it until the limit switch is found, the second to accurately home to an angle once found). I plan on starting with the linear axes to see if I can learn anything helpful prior to starting on this more involved routine.

It seems that in order to avoid a custom build of MachineKit, that I need a way to either trigger immediate homing or the ability to detect that a user initiated immediate homing from within HAL. Any ideas?


John Allwine
Owner of Allwine Designs

On Feb 22, 2020, at 11:25 AM, Bas de Bruijn <b...@basdebruijn.com> wrote:



Damien Dando

unread,
Feb 24, 2020, 5:55:39 AM2/24/20
to Machinekit
Hi John,

It seems that in order to avoid a custom build of MachineKit, that I need a way to either trigger immediate homing or the ability to detect that a user initiated immediate homing from within HAL. Any ideas?
You can write a custom ".icomp" component to handle your homing logic: http://www.machinekit.io/docs/hal/instcomp_writing_a_component/
I did something similar because I wanted to handle 2 home switches. In my case, it goes "high" speed to touch the first home switch (with low accuracy) and "low" speed to the second home switch (the expensive switch with micrometer accuracy).
This allow you to make custom homing sequence without doing any custom build of machinekit.

Here is the component I did:
Filename "second_home_switch.icomp":
component second_home_switch "use a second home switch for homing";
pin in s32 #.home-state[pincount] "connect to the home-state of the join";
pin in bit #.home-sw1-in[pincount] "connect to the first home switch input pin";
pin in bit #.home-sw2-in[pincount] "connect to the second home switch input pin";
pin out bit #.home-sw-out[pincount] "connect to the home switch input of the join";
instanceparam int pincount = 4;
option MAXCOUNT 16;
function _;
license "GPL";
author "Damien Dando";
;;
FUNCTION(_) {
hal_s32_t n;
for (n = 0; n < local_pincount; n++) {
/*
* 12 corresponds to the HOME_RISE_SEARCH_WAIT state of the homing sequence
* where the home switch is detected with lower speed (HOME_LATCH_VEL) for a second time.
*/
if (_home_state(n) == 12) {
_home_sw_out(n) = _home_sw2_in(n);
} else {
_home_sw_out(n) = _home_sw1_in(n);
}
}
return 0;
}

The code basically select between one of the 2 home switches depending of the internal state in the homing sequence. (For your case it would be obviously different code&signals).

To detect the state of the homing sequence (or to know if there is a homing sequence going on at all), I have used the signal "axis.N.home-state". This signal has a different value depending of the current state in the homing sequence (see home_state_t enum in motion.h and do_homing() in homing.c). If you don't feel digging into the source code you can also use the hal meter and directly look at the values "axis.N.home-state" go through during the homing sequence.
Note: Even if it might be unlikely, it is not guarantee that the signal "axis.N.home-state" will keep same value in the homing sequence in future versions of Machinekit so you should keep that in mind if your homing stuff stop working after upgrading your Machinekit.

To unsubscribe from this group and stop receiving emails from it, send an email to machi...@googlegroups.com.

--
website: http://www.machinekit.io blog: http://blog.machinekit.io github: https://github.com/machinekit
---
You received this message because you are subscribed to the Google Groups "Machinekit" group.
To unsubscribe from this group and stop receiving emails from it, send an email to machi...@googlegroups.com.

Damien Dando

unread,
Feb 24, 2020, 6:10:29 AM2/24/20
to Machinekit
And this is how I load&connect my custom component in my HAL file:

loadrt home_index_switch
newinst second_home_switch home-sw2 pincount=2
## micrometric&super accurate "second" home switch
net home-sw2-x <= bb_gpio.p8.in-12
## Max limit switch use as "first" home switch
net limit-x-max <= bb_gpio.p8.in-08
## connect signals between my custom component and Machinekit regular signals
net limit-x-max => home-sw2.0.home-sw1-in
net home-sw2-x => home-sw2.0.home-sw2-in
net home-sw-x home-sw2.0.home-sw-out => axis.0.home-sw-in
net home-state-x home-sw2.0.home-state <= axis.0.home-state
... 
## I also have similar config for another axis (home-sw2.1...) but there is no really added value to show it here...

John Allwine

unread,
Feb 24, 2020, 10:52:28 AM2/24/20
to Damien Dando, Machinekit
Thank you, Damien! This is really helpful. I’ll give something like this a shot.

On Feb 24, 2020, at 3:10 AM, Damien Dando <damie...@gmail.com> wrote:


You received this message because you are subscribed to a topic in the Google Groups "Machinekit" group.
To unsubscribe from this topic, visit https://groups.google.com/d/topic/machinekit/tovKUzpAlwo/unsubscribe.
To unsubscribe from this group and all its topics, send an email to machinekit+...@googlegroups.com.
To view this discussion on the web visit https://groups.google.com/d/msgid/machinekit/b1eeaaa8-3f3f-4716-9dd7-b375acc1b342%40googlegroups.com.
Reply all
Reply to author
Forward
0 new messages