Machsupport Forum
Third party software and hardware support forums. => Modbus => Topic started by: ejjenkins on September 11, 2016, 10:40:39 PM
-
I am making a pendant to use with my CNC machine. The pendant is using an Arduino Due for the brains with a 5" touchscreen. I have a 16 button keypad and 2 small joysticks (each with a center button) connected as inputs. I am connecting to Mach3 with the modbus protocol.
I have programmed the touchscreen to allow selecting an axis, changing Jog Mode, cycling through the Jog Increment steps, zeroing selected axis, and zeroing all.
I need to add the spindle speed on the screen as I plan to move to a spindle with vfd and of course make an enclosure.
I actually have more inputs then I know what to do with. I am open to suggestions :D
My question is...how can I, with the pendant, have Mach3 go to a specific Axis' zero position (not machine zero).
-
Some information to add...I have created brain files to get the DRO info from mach 3 and to pass the button presses and joystick movements. Everything works great...I just need to have the machine go to a single axis zero location.
Any help would be appreciated.
Thank you.
Erik
-
Excellent work Erik, that looks like it is going to be a really nice pendant.
Tweakie.
-
Thanks Tweakie.
-
I had to write a macro and use OEM triggers to get the "Go To Selected Axis Zero" to work.
All is good now :)
-
I made an enclosure for my new pendant out of some thin (0.5" x 2") aluminum extrusion. The faceplate was a test in 1/8" hardboard, I plan to make the final one out of either aluminum or black ABS...I have both, but I am leaning towards the ABS. I think the black will look better with the aluminum framing.
Everything is working well now. I switched to a different keypad with removable plastic covers for each button and a new label can be printed easily and the function of each button can also be changed quickly. I have added the ability for user-defined macros as well. I have three brain files setup to handle button presses as well as update the DROs on the screen.
-
Great job ejjenkins.
Will you share more info about your project.
Thanks
-
Here are my notes at the top of the Arduino Sketch, it gives a bit of the info which makes this pendant function. If you would like more info, please ask.
// This is for a CNC Pendant to interact with my heavily modified 1000mm x 1000mm Inventables X-Carve using Mach 3 to control the machine.
// I am using the Arduino Due for the brains of the pendant. All Communication with Mach3 is accomplished
// through the serial protocol modbus. In Mach3 I have set up brains to handle the input and output to
// the arduino. One brain to handle output to the Pendant and two to handle button presses. I have also configured
// several OEMtriggers to handle the execution of macros in the M1000.m1s file. The macro can execute the Probe Zero
// Z Axis, probe Zero All Axes, Got to Zero on X, Y, Z or A axis as well as user defined macros.
//
// I have the following hardware attached to the Arduino Due:
// 5" GLCD display and LCD Shield with a 800 x 480 resolution from SainSmart (using the UTFT libraries)
// 16 button keypad attched as an analog keypad using only 1 analog pin on the Arduino as well as ground and 5v.
// 2 joysticks, each attached to 2 analog pins and 1 digital pin for the center button.
//
// Current keypad button functions are defined as:
//
// 1: Reset 2: Cycle Start 3: Cycle Pause 4: Cycle Stop
// 5: Home All 6: Rewind Program 7: Edit G-Code 8: Close G-Code
// 9: Probe Z Axis 10: Spindle On/Off 11: Jog On/Off 12: Toolpath On/Off
// 13: Select X Axis 14: Select Y Axis 15: Select Z Axis 16: Select A Axis
//
//
// Here is a list of all the send and receive bits and what they are set for. These are set within the Mach3
// brain files.
//
// bitSet(rcd[0],0) RefAll bitSet(rcd[1],0) Cycle Start bitSet(rcd[2],0) Jog Increment Cycle
// bitSet(rcd[0],1) Rewind File bitSet(rcd[1],1) Cycle Stop bitSet(rcd[2],1) Jog STEP
// bitSet(rcd[0],2) Edit File bitSet(rcd[1],2) Reset bitSet(rcd[2],2) Jog CONT
// bitSet(rcd[0],3) Jog X-Positive bitSet(rcd[1],3) Zero All bitSet(rcd[2],3) Probe Zero Z (OEMtrigger1)
// bitSet(rcd[0],4) Jog X-Negative bitSet(rcd[1],4) Zero X bitSet(rcd[2],4) Goto X Zero (OEMtrigger2)
// bitSet(rcd[0],5) Jog Y-Positive bitSet(rcd[1],5) Zero Y bitSet(rcd[2],5) Goto Y Zero (OEMtrigger3)
// bitSet(rcd[0],6) Jog Y-Negative bitSet(rcd[1],6) Zero Z bitSet(rcd[2],6) Goto Z Zero (OEMtrigger4)
// bitSet(rcd[0],7) Jog Z-Positive bitSet(rcd[1],7) Zero A bitSet(rcd[2],7) Goto A Zero (OEMtrigger5)
// bitSet(rcd[0],8) Jog Z-Negative bitSet(rcd[1],8) Jog Z-Right/Off bitSet(rcd[2],8) Zero X Axis
// bitSet(rcd[0],9) Jog A-Positive bitSet(rcd[1],9) Jog Z-Left/Off bitSet(rcd[2],9) Zero y Axis
// bitSet(rcd[0],10) Jog A-Negative bitSet(rcd[1],10) Jog A-Right/Off bitSet(rcd[2],10) Zero Z Axis
// bitSet(rcd[0],11) Jog Y-Right/Off bitSet(rcd[1],11) Jog A-Left/Off bitSet(rcd[2],11) Zero A Axis
// bitSet(rcd[0],12) Jog Y-Left/Off bitSet(rcd[1],12) Feedhold bitSet(rcd[2],12)
// bitSet(rcd[0],13) Jog X-Right/Off bitSet(rcd[1],13) Jog Off/On bitSet(rcd[2],13)
// bitSet(rcd[0],14) Jog X-Left/Off bitSet(rcd[1],14) Toolpath On/Off bitSet(rcd[2],14)
// bitSet(rcd[0],15) Close File bitSet(rcd[1],15) Spindle On/Off bitSet(rcd[2],15)
//
// bits rcd[3-12], 0-15 are currently unused...there are a ton of unused bits still available.
//
// Variables received from Mach3:
//
// mcd[0] + mcd[1] X-Axis location - receiving one side of the decimal point in each data element. Each one is
// mcd[2] + mcd[3] Y-Axis location converted to a signed float and displayed on the GLCD
// mcd[4] + mcd[5] Z-Axis location
// mcd[6] + mcd[7] A-Axis location
// mcd[8] + mcd[9] Jog Increment
// mcd[10],0 Reset Status - A simple toggle bit
// mcd[10],1 Jog Mode - A simple toggle bit
// mcd[10],2-15 are currently unused
// mcd[11] Feedrate Overide - An integer
// mcd[12] Feedrate - An integer
//
// Currently there are 13 x 16 bit data elements to send and receive from Mach 3. I am using all of the data
// elements received from Mach 3 to update the DROs and Reset, Jog, Feedrate Overide and Feedrate. If I want to
// receive more information I will need to add more data elements. to add Spindle Speed, I will need one more data
// element as it will simply be an integer.
-
I have had a few questions on how I am communicating with mach 3. I am using the simple modbus slave library from here: https://github.com/charlesbaynham/simple-modbus
In mach 3 I am using serial modbus non-plugin.
To pass the Axis coordinate DRO values to the LCD, I am using 2 Data elements...one for each side of the decimal point.
The brain to send the values are like this:
X-Position --- No Operation, Pass Signal --- MOD: 13 This is the Left side of the decimal point
X-Position --- Formula, (A*1000)-(int(A)*1000) --- MOD: 14 This is the Right side of the decimal point
Then I print to the LCD and format the results.
Make sense?
-
Thanks ejjenkins
-
Nice pendant
-
Thank you!
Erik
-
@ejjenkins
I'm trying to build everything using a pendant with modbus based on an Arduino Mega 2560 or a smaller one, but I do not understand the brain programming or how the data come to the display in the Arduino.
I would be very happy if I would get the files from you.
Thank you
-
I can help with brans but I need arduino code...
-
I use the corrected Arduino Code from Schilling, because there bugs in it. With the right one i test Buttons and Signal-output but no LCD on it. A second example code for a pedant gives me no connection to Mach3, but it is not for Modbus. I think it's for LinuxCNC. I can test it with a Terminal-program.
-
How you is conected lcd to arduino.is it i2c or serial or parallel lcd
-
It is i2c with a 20x4 LCD and a 4x5 keyboard matrix also connected. Is it possible to wire it with Mach3 serial bus?
-
SEND MY YOUR MAIL
-
// Modbus:
#include <SimpleModbusSlave.h> //http://code.google.com/p/simple-modbus/
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x3f, 2, 1, 0, 4, 5, 6, 7, 3, POSITIVE); // Set the LCD I2C address
const int HOLDING_REGS_SIZE = 22; // I use 22 registers, first 11 for sendidng info to Mach3
//and next 11 registers for receiving info from Mach3
unsigned int holdingRegs[HOLDING_REGS_SIZE]; // function 3 and 16 register array
int rcd[11]; //holds sending info
int mcd[11]; //holds received info
void setup(){
pinMode(13, OUTPUT); //indicator LED
modbus_configure(&Serial, 115200, SERIAL_8N2, 2, 13, HOLDING_REGS_SIZE, holdingRegs);
//2 is slave address, 13 is indicator led pin (useless)
lcd.begin(20,4); // initialize the lcd for 20 chars 4 lines, turn on backlight
lcd.print("Hello, ARDUINO ");
lcd.setCursor ( 0, 1 ); // go to the next line
lcd.print (" FORUM - fm ");
delay ( 1000 );
}
void loop(){
//Reads buttons:
if(digitalRead(4) == 1) bitSet(rcd[0],0);
else bitClear(rcd[0],0);
if(digitalRead(5) == 1) bitSet(rcd[0],1);
else bitClear(rcd[0],1);
if(digitalRead(6) == 1) bitSet(rcd[0],2); //can be up to 15
else bitClear(rcd[0],2);
//Potens´iometers:
rcd[3] = analogRead(A0);
rcd[4] = analogRead(A1);
//Other variables:
rcd[1] = 0x1111;
rcd[2] = 0x2222;
rcd[5] = 0x3333;
rcd[6] = 32767;
rcd[7] = 12345;
rcd[8] = 54321;
rcd[9] = 0;
rcd[10] = 1;
//Sending and receiving info:
for (int i=0; i < 11; i++)
holdingRegs[i] = rcd[i];
modbus_update();
for (int i=0; i < 11; i++)
mcd[i] = holdingRegs[i+11];
// Writes cordinates to LCD:
float Xpos = mcd[0]+(mcd[1]/100.00);
float Ypos = mcd[2]+(mcd[3]/100.00);
float Zpos = mcd[4]+(mcd[5]/100.00);
lcd.setCursor( 0,0 );
lcd.print(" ");
lcd.setCursor( 0, 0 );
lcd.print("X");
lcd.setCursor( 1, 0 );
lcd.print(Xpos);
lcd.setCursor( 0, 1 );
lcd.print(" ");
lcd.setCursor( 0, 1 );
lcd.print("Y");
lcd.setCursor( 1, 1 );
lcd.print(Ypos);
lcd.setCursor( 0, 2 );
lcd.print(" ");
lcd.setCursor( 0, 2 );
lcd.print("Z");
lcd.setCursor( 1, 2 );
lcd.print(Zpos);
lcd.setCursor(0, 3);
lcd.print(" ");
lcd.setCursor(0, 3);
lcd.print("A");
}
-
I send you per IM
-
POSTED..Remember to change your i2c address for lcd
-
Okay now it works. Correct display all four axis, positive and negative values shown on right position. I use a i2c-LCD and for this moment a Arduino Pro. The next step is a keyboard matrix.
-
Keyboard matrix is best to one analog pin ..
Din lcd dro format ...is it 0.00 or 0.0000
-
It is correct 0.0000 and -0.0000
All on the right place.
I can send you the code and the right brain.
-
Send code og brain to me..thanks