Making progress…
March 12, 2015 36 Comments
For my friends and family that have been wondering what I’ve been working on these past months.
As we are nearing the roll-out our kick-starter campaign, I’m proud to finally be able to show-off something that my friends & I have been working so very hard to make a reality….
Thanks for your mail, I am trying to locate software that will drive my 3d printer’s Arduino ramps electronics as a CNC stepper controller, my printer is a conversion from it’s original status as an experimental light duty milling machine and now wish to use it in both guises without re-flashing the memory each time. Having written a Gcode program to mill my printing table (5mm aluminium) when it gets distorted by abuse or accident I found that works fine with the printer software using X, Y & Z axis’s with no complicated or special codes, so PCB tracking and drilling can be done at present, some G & M codes are changed in Marlin firmware for printing use so their correct CNC use is out.
My query is about your Emc2 work, can this be used with an Arduino/ramps set-up and does it need re flashing to do so, I have a second Arduino mega so I could flash that and attach the ramps on it to attain the emc2 capability if ramps is compatable. I apologise for disturbing you and hope you can spare the time to answer this trivia. I thank you in anticipation, My best regards. Brian Everett.
Actually, EMC2Arduino is the defunct predecessor of HAL2Arduino.
Both of them only act as breakout interfaces for LinuxCNC. HAL2Arduino is highly modular, supports mods as plugins. Just like the older EMC2Arduino it requires some manual configuration to get it going. Neither are g-code interpreters, they just act as raw IO connections for a PC running Linuxcnc. But you could run 200+ Arduinos (running HAL2Arduino) off of one PC, each Arduino could be customized on a per-task basis.
If you can program, you’ll want HAL2Arduino anyways. It gives room for adaptations; ie: adding a custom set of g/m-codes then internally switch profiles from additive to subtractive machining.
It’s written in such a way that you can opt-in/out whole sections of code to permit you to tailor it to exactly what you need.
Comparing Marlin to HAL2Arduino is like comparing a Ferrari to the whole trucking industry. One is nearly a turn-key solution that is polished, and shines well in 3d-printer racing circles. The other, could use one truck haul a dozen Ferrari’s; while another paves the road, while yet another carries away the construction debris, others could be dressed up as a car haulers, wreckers, Mad Max tankers, Oscar Meyer Weiner mobiles, you name it.
Essentially, while you ‘could’ give HAL2Arduino a split personality and make it do both, the Marlin firmware is much better at the one thing that it does, hands down.
But I digress, probably the best solution would be to write a much simpler python script to handle g-code files and parse them to make LinuxCNC temporarily act as a 3d-printer and/or mill as needed (on the fly). Then use HAL2Arduino (as many as you like) to physically handle the hardware of the machine. That would give you the ability to do hybrid machining with additive AND subtractive machining. Heck, you could throw in a plasma cutter and a mig welder as well if you’re into it enough. 😉
So for Frankenstien-machines, HAL2Arduino is the answer, but you’ll HAVE to hack into it.
PS, one the pins are configured, RAMPs (or any other arduino-compatible) stepper driver setup is compatible with HAL2Arduino, if it’s not, send me one to develop code against and then it will be. 😉
Hi ….
Very nice project your PocketNC , just amazing.
One information (or two 🙂 ) is the module HAL2Arduino 0.5 the last version available ?
Is there a specific hardware module (Arduino xxx + additional custom hardware) that I can try/buy
to test the functionalities.
Regards
Alex
Well thank you for the compliment, I’ll pass them onto Matt & Michelle over at PocketNC.com
They are the one’s that make such well crafted hardware. I’m just helping with a little coding.
The last (beta) version is 0.6 and while it’s faster but very, very touchy about how to configure it.
There is no specific hardware built expressly for HAL2Arduino since by design, it is meant to be edited by the user to meet their own hardware layout.
For example: You could get pretty much any run of the mill stepper drivers for adafruit, sparkfun, pololu, panucatt, even gecko drivers and configure HAL2Arduino to use them. Throw in some momentary switches, and you have a basic controller for converting old shop machinery to cnc machinery.
Thank you so much for the kind answer.
I had the Hal-2-Arduino interface working, but not it doesn’t seem to work any more….connecting directly to the Arduino to issue commands (EX 996 0 0 996) provides no output whatsoever.
I’ve loaded GRBL to the arduino and was able to turn a motor, so it is something specific to the Hal-2-Arduino code on the Arduino.
What sort of troubleshooting hints can you provide?
I’m using 0.6d that you had provided. It was the one that was working for me.
It does give me an ‘ok’ when I connect directly to the Arduino using minicom.
Thanks for any ideas or thoughts on the matter.
What a dork I am!!! I forgot the ; at the end of the command…. 996 0 0 996; is the valid command.
So this is working as expected when talking directly to the Arduino through minicom (motor turns when issuing a command 224 0 10000 10224;)
However, I get the error “linear move in MDI would exceed joint 0’s positive limit” when issuing G0 X13 in the MDI window after homing the axis.
Have any thoughts on things to check?
This did work at one time, and I haven’t modified any of the linuxcnc files since it was working.
Thanks again for your time.
I’m on a dork roll!!!!
After poking around in the .ini file for linuxcnc, I noticed that the max limit was set to 8…so indeed I was issuing a command past the positive limit!!!
All is well.
I’m not sure when or how it got changed…that’s a different problem though.
Where is the best place to find information regarding what to set the unitspersecond, accelpersecond and leadtime values of the modaccelstepper module?
I’m using pololu stepper motors (#1476) if that matters.
Thanks for any thoughts.
For the accellstepper library documentation try: http://www.airspayce.com/mikem/arduino/AccelStepper/classAccelStepper.html for the accellstepper
As for the stepper motors, I can’t do the math for you since I don’t know all the variables involved. Instead checkout the stepper motor calculator at http://www.daycounter.com/Calculators/Stepper-Motor-Calculator.phtml just be sure to change the voltage to your drive voltage you see what perfmormance to expect.
Thanks for the guidance.
It isn’t clear what to do with the numbers that come out of the motor calculator, and how they apply to unitspersecond, accelpersecond and leadtime values.
So the code seems to work, but linuxcnc seems out of sync with the actual motors.
What are the important elements to get linuxcnc and the driver on the arduino board to work together?
For unitspersecond you’ll need to figure out how much travel an axis has per revolution of its stepper motor shaft. Say the calculator spits out 3.72rev/sec and you’ve measured that your x-axis travels 1.35 inches per rev. The math is simply 3.72*1.35= 5.022 inches per second. That’s the bleeding-edge top-speed at full strength you can ever hope to get out of that particular stepper motor at that voltage. While you can go somewhat faster, you won’t get the full torque output stamped on the tin. 😉
accellpersecond depends on two things, A: how hefty your axis is. B: how much torque can you supply to move it. Force/Mass=Acceleration (in units per second) So if your X-axis weighs 12lbs and your motor/leadscrew(and/or belt) combo produces 5lbs of ‘push’ then the math breaks down to 12/5=2.4 units/sec max acceleration.
Now for the leadtime. Er, leadtime? Where are you getting leadtime from?
Leadtime comes just after the settings for accelpersecond in the modAccelStepper code.
Wasn’t sure if it was important.
What if I don’t know the weight and “push” of my axis? Is there a safe acceleration number? How will I know it is too much, or too little?
You must be running the super-beta version 0.6d. I see now. 🙂
I am indeed! 🙂
Too little and it will take forever to reach top speed, causing many rounded corners; too much and it’ll skip steps getting to speed and blow your work-piece dimensions.
Super conservatively you could set it to just 33% of your top speed. That will make it take 3 seconds to reach max velocity. If you set it to your top speed it will take 1 second to go from ‘coffee break’ to ‘break-stuff’ speed. 200% would be 0.5secs to full throttle.
I’d default to 100% and tweak from there for an unknown machine.
200 steps Per revolution – from motor spec
2.6 revolutions per second – from calculator at http://www.daycounter.com/Calculators/Stepper-Motor-Calculator.phtml
X = travels 3.5 inches in one revolution
Y = travels 8 inches in one revolution
X stepsperunit = 200 steps goes 3.5 = 200/3.5 = 57.14
Y stepsperunit = 200 steps goes 8 = 200/8 = 25
X Unitspersecond = 3.5*2.6 = 9.1
Y unitspersecond = 8 * 2.6 = 20.8
X accelpersecond = 9.1 * .33 = 3
Y accelpersecond = 20.8 * .33 = 6.86
Does this look right?
NOTE: I used your conservative value just to be clear that I understand things.
I should have tested it before posting…those numbers did not work…the motors made sounds, but nothing moved…
Obviously I’m misunderstanding something….
Just to be thorough, these are the numbers that do work, but there are still problems with these numbers as well:
x stepsperunit = 909
y stepsperunit = 416
X unitspersecond = 3
Y unitspersecond = 6
X accelpersecond = 2
Y accelpersecond = 4
I don’t remember off the top of my head how I came up with the stepsperunit numbers…but they are an order of magnitude different from the calculations shown in the previous comment.
Also, I’m not sure I’ve matched up these entries with the ones that go into the linuxcnc entries very well….not sure I really understand how the two connect. So any help there would be appreciated as well.
Further contemplation made me realize that the reason the above numbers work is that the shield was set for 1/16 step, so if I use my first numbers above and include that value I get:
X stepsperunit = 200 steps goes 3.5 = 200/3.5 = 57.14 * 16 = 915
Y stepsperunit = 200 steps goes 8 = 200/8 = 25 * 16 = 400
So it may just be the issue of getting these numbers ‘synced up’ with the linuxcnc software…then I’ll be in business.
So again, your thoughts would be appreciated.
Math:
Ah, yeah… don’t feel bad I forgot about stepmode settings as well.
Synced LinuxCNC settings:
Actually, HAL2Arduino doesn’t connect at all to the step settings within linuxcnc’s config files.
The actual stepping is handled entirely by the Arduino. Why is that? Sending every single step/direction pulse for each motor over a serial link is a non-starter. There is just not enough bandwidth, plain and simple. Instead what it does is pay attention to the coordinate variables, much, MUCH less data to send. Bare in mind that linuxcnc has been around for over 20 years. It’s an existing software platform that HAL2Arduino hacks into and eavesdrops on, and maybe taps on the glass now and then. So there is a lot of required but now useless settings in the config files that are there explicitly for making linuxcnc happy enough for you to fire it up and play around with it.
For what it’s worth, linuxcnc assumes that you still have an old school LPT printer port(s) to give it access to for wiring up stepper drivers/switches directly; and that’s why it has stepper settings (that we completely ignore).
BTW, if you find you don’t have enough torque, reduce your microstep mode. A commercial-grade “bridgeport knee mill” won’t hold a 1/1,000th inch tolerance without extreme patience.
OK. I thought I would at least be able to match the drawing of the picture while linuxcnc works with the actual machine….
So then we could just send the G-codes directly to the arduino and it would work the same?
Doesn’t the linuxcnc software handle the trajectory planning?
I was under the impression that it makes calculations based on the settings in the config files, then sends those to the machine.
Or does the software on the arduino do path planning as well?
I’m not sure how I decide if I have enough torque or not, and the micro-step settings were how I got the board.
Are any of the other entries besides stepsperunit affected by the microstep mode? I assume not.
Could you help in the configuration the Arduino to ramps 1.4? Thanks
Hi Duane,
The PocketNC project is very cool. It’s about time someone hit on a subtractive machine that compliments desktop 3D printing. This video and some pieces of documentation have me wondering a couple things I hope you could help me understand.
I’d like to convert my simple GRBL 3 axis mill into a 4 axis with tool changer. One question is whether your call to porting your work over to the Beagle Bone Black came to be. The thread in Machinekit’s Googlegroup is only about a year old. I spent a couple dozen hours last week trying to get some motor movement via Machinekit and HAL2Ard and only came across that Groups thread this morning. So I’m simultaneously wondering if it’s possible to get it working as HAL2Ard currently stands, and why it wouldn’t be just like any other implementation of LinuxCNC on a full fledged desktop.
Second, I also see reference and pics of a 5-axis cape for the BBB on the PocketNC site. That leads me to ask if HAL2Ard was used for their project. Machinekit’s documentation makes it sound like 4 axes on a BBB is possible, but 5 would take some serious wizardry.
Thanks for your time and efforts. I hope 6d is not the last we see of you in this arena.
I think that all you would need to do to get HAL2Arduino to run on a BBB would be to choose which serial port you’d like to use. I have a prototype control panel built for it, logic level’d to a hardware serial port. But I haven’t had time to try and write code yet (two jobs, wife, new fixer-up truck, yada yada).
Secondly,
Actually 5-axis motion on the BBB is cake since it’s main cpu can run the OS and its two mpu cores run at 200mhz. I think I recall the thread and if memory serves, 5-axis motion only requires “serious wizardry” if positioning encoders are involved.
Hi, I really want to run mega 2560+ramps with linuxcnc, there is a .ini .hal base for that? And what about the pins config with mega 2560 and drivers. Thanks for all, but I think is good idea create a forum.
Hi, I’m giving a try to hal2arduino 0.6b because I need to move just one axis other than 4 moved by a parallel port,but it doesn’t have to mill, neither is time critical.
Since I really need to transmit wirelessly to this single motor, my question is: what about your progress with ethernet connection? is there something that I can try out?
thanks, dab.
Well, with all honesty I haven’t written any code for it in nearly two years.
But with that said; I do still have intentions of adding ethernet support. As soon as I can set my lab back up, that is.
It’s been in boxes ever since I moved across country, helped some friends open their doors at PocketNC.com and have been building machines non-stop ever since.
But wireless to serial, hmm…. Shop around, I think there is some wireless serial links out there that would allow you to bypass the ethernet (and wifi) altogether. You’d have to tinker a bit I’m sure, but it would be the least troublesome after it’s all setup.
Thank you very much for reply. I’d like to use a wireless bridge using two 2,4GHz NRF24L01, between two arduino.
Which part of your code should I keep on the pc-side arduino?
I tried yesterday with one axis over hal2arduino, and the movements start with almost 1 second of delay. Do you know if there’s room to enhance?
at the end I should only pass 4 signals, if I understood correctly. axis.A.joint-pos-cmd, axis.N.joint-vel-cmd and then two signals for direction and velocity of XY (mmm, maybe 3).
Do you have any suggestions?
Thank you, dab.
Actually, the axis.N.joint-vel-cmd is optional. You can define a max speed on the arduino and that would cut the required bandwidth by 50%.
As far as the arduino to arduino data goes, I imagine you could have the pc arduino just pipe the data from the usb-link to the wireless-link. Set the remote arduino to use the wireless link like it sounds like you have done already.
Laggy connection? Hmm, take a look at the wireless serial library your using, look for something like wireless.serial_timeout=1000 Try turning it down 25%, then 50%, more if possible. Just be sure to set the same timout on both arduinos.
Interesting project by the way.
Also, just found a speed optimized library for what I think might work for you.
https://tmrh20.github.io/RF24/classRF24.html
Thanks for your suggestions.
By the way, the connecton with arduino happens once every 3-4 times. Is that normal?
Actually, now that I think about it… That WAS a bug. However, a while back another user (Matt W.) ran into the same problem and emailed me a patch to fix it. So I just did. 🙂
Here is a link to the updated HAL2Arduino-0.6d.py file. Hopefully, it should fix the issue for you.
Just make sure you set the file type to be an executable before use.
Enjoy.
Thank you. I’ll try as soon as possible.