I can only think backlash caused by slack belt tension, although that’s a ridiculous amount. Unless some firmware compensation has been incorrectly applied.
Anyone can do this! The X1Plus repo has the tools needed to set up a work environment to do this kind of analysis. If one is resourceful enough I’m sure one could do said analysis without an x1c.
Gcode commands live in the MC firmware and unfortunately it’s not as simple as finding related strings. It’s not impossible, but you can learn quite a bit already from monitoring the services that allow the AP and MC boards to communicate, which is a bit more accessible
How did you do that test? Did you check if the grub screws on the stepper motor pulleys are tight?
Has real potential to change… might have been a better way for me to say that.
That will be interesting to see your results. I don’t have a good sense of how persistent the gantry alignment is yet, only that you can influence it and it’s got some level of angular freedom built into the design. For all I know even though its alignment is “springy” it may have a tendency to settle in the same natural resting place better than I think.
It’s easy to see how the gantry skews, just tug on only one belt at the back of your machine and the X-axis twists relatively easy. I had been initially viewing this as belt tension, but really I think that effect is more belt length (the more the tensioner moves, or in this case you deflect the belt with your fingers, the more you shorten that loop, which twists the gantry). It might be beneficial in some conversations to view that the tensioners are additionally “compensators” that balance the length of the two belt loops in relationship to the gantrys angle.
I’m realizing new things with the tension system. There’s and overall relationship that’s overlooked, you can’t really tension one belt without it also increasing tension on the other to some degree (if you pull one belt like I said above and then twang both - you hear the pitch go up on each of them). There’s is some level of equalization happening between the two belts at the gantry.
Both ends of a guide rail in a linear motion system shouldn’t be tightly constrained. One end should float a bit.
LOL, I don’t really trust AI either.
It’s a valid point, you can’t ensure perfect alignment of the two rails on the Y-axis and something has to have enough clearance to compensate for that fact, but how much movement is allowed and lack of rigidity in the alignment on the side that is constrained gets my attention.
Relative to how stiff the gantry itself is, its angular relationship to the Y-axis can really twist all over the place because that constraint is not very solid. I cant flex one of those x-axis assembly’s (that’s taken out of the machine) with both my hands, but I can fairly easily rack that same assembly in the machine with a couple fingers because its connection to both linear bearings has some degree of movement (I don’t see it flexing the Y axis guide rails)
Maybe in the end that’s normal or ultimately OK for this type of motion system - it’s clearly intentional in the design (but maybe also for different reasons). Other things also reinforce the gantry’s alignment (the belts). My question is to what degree this allows them to create a variance in skew (and… maybe other areas of print quality)
I had, uhm HAD to put some ai in there because we don’t know where or what is being used. WE do know the correct math but we don’t know the incorrect math. Had to go down that rabbit hole and may still explore that.
My next test I have broken out the square. going to be printing what should be ‘correct’ and measure it on all sides. my assumption is one+ side will not have that 90 degrees.
Much more convenient than using the huge syslog. So that was the source of the raw data in your worksheet?
2024-05-02 04:30:02,867 - [x1p] - {"command": "M1005", "param": {"skew": "current", "XY_comp_ang": 0.0}}
2024-05-02 04:30:02,870 - [x1p] - {"command": "M1005", "param": {"skew": "new", "XY_comp_ang": 0.00359}}
Can I modify the regex to also log parameters passed with the M1005
command, as well as logging the response? With r".*M1005:(new|current|M1005)...
? Any reason that won’t work?
Well. … this is a clip of mine.
2024-05-02 04:08:26,149 - [x1p] - {“command”: “M1005”, “param”: {“skew”: “current”, “XY_comp_ang”: 0.0005}}
2024-05-02 04:08:26,153 - [x1p] - {“command”: “M1005”, “param”: {“skew”: “new”, “XY_comp_ang”: 0.0005}}
2024-05-02 04:08:36,223 - [x1p] - {“command”: “z_offset”, “param”: {“z_offset”: 0.0}}
2024-05-02 04:08:48,282 - [x1p] - {“command”: “vc_enable”}
2024-05-02 04:08:48,285 - [x1p] - {“command”: “vc_params”, “param”: {“wn”: 56.0, “ksi”: 0.08, “pk”: 15.0, “l”: 38.0, “h”: 71.0}}
2024-05-02 04:08:48,289 - [x1p] - {“command”: “vc_params”, “param”: {“wn”: 0.0, “ksi”: 0.1, “pk”: 14.0, “l”: 0.0, “h”: 0.0}}
2024-05-02 04:08:48,297 - [x1p] - {“command”: “vc_params”, “param”: {“wn”: 50.0, “ksi”: 0.06, “pk”: 18.0, “l”: 28.0, “h”: 74.0}}
2024-05-02 04:08:48,302 - [x1p] - {“command”: “vc_params”, “param”: {“wn”: 0.0, “ksi”: 0.1, “pk”: 14.0, “l”: 0.0, “h”: 0.0}}
2024-05-02 04:09:40,473 - [x1p] - {“command”: “k_values”, “param”: {“K”: 0.014, “N”: 1.0}}
2024-05-02 04:09:40,480 - [x1p] - {“command”: “k_values”, “param”: {“K”: 0.014, “N”: 1.0}}
2024-05-02 04:10:28,619 - [x1p] - {“command”: “vc_enable”}
2024-05-02 04:10:28,626 - [x1p] - {“command”: “vc_params”, “param”: {“wn”: 56.0, “ksi”: 0.08, “pk”: 15.0, “l”: 38.0, “h”: 71.0}}
2024-05-02 04:10:28,634 - [x1p] - {“command”: “vc_params”, “param”: {“wn”: 0.0, “ksi”: 0.1, “pk”: 14.0, “l”: 0.0, “h”: 0.0}}
2024-05-02 04:10:28,638 - [x1p] - {“command”: “vc_params”, “param”: {“wn”: 50.0, “ksi”: 0.06, “pk”: 18.0, “l”: 28.0, “h”: 74.0}}
2024-05-02 04:10:28,643 - [x1p] - {“command”: “vc_params”, “param”: {“wn”: 0.0, “ksi”: 0.1, “pk”: 14.0, “l”: 0.0, “h”: 0.0}}
2024-05-02 04:10:37,704 - [x1p] - {“command”: “bed_strain”, “param”: {“sensitivity”: 1.0, “p”: 0.001121, “Vs”: -1.642}}
2024-05-02 04:10:37,718 - [x1p] - {“command”: “bed_strain”, “param”: {“sensitivity”: 2.0, “p”: 0.001037, “Vs”: -1.597}}
2024-05-02 04:10:37,724 - [x1p] - {“command”: “bed_strain”, “param”: {“sensitivity”: 3.0, “p”: 0.001185, “Vs”: -1.635}}
2024-05-02 04:12:04,097 - [x1p] - {“command”: “bed_strain”, “param”: {“sensitivity”: 1.0, “p”: 0.001125, “Vs”: -1.592}}
2024-05-02 04:12:04,109 - [x1p] - {“command”: “bed_strain”, “param”: {“sensitivity”: 2.0, “p”: 0.001002, “Vs”: -1.558}}
2024-05-02 04:12:05,119 - [x1p] - {“command”: “bed_strain”, “param”: {“sensitivity”: 3.0, “p”: 0.001178, “Vs”: -1.608}}
2024-05-02 04:12:30,492 - [x1p] - {“command”: “build_plate_id”, “param”: {“id”: 2}}
2024-05-02 04:12:46,542 - [x1p] - {“command”: “bed_strain”, “param”: {“sensitivity”: 1.0, “p”: 0.00112, “Vs”: -1.588}}
2024-05-02 04:12:46,552 - [x1p] - {“command”: “bed_strain”, “param”: {“sensitivity”: 2.0, “p”: 0.000995, “Vs”: -1.555}}
2024-05-02 04:12:46,561 - [x1p] - {“command”: “bed_strain”, “param”: {“sensitivity”: 3.0, “p”: 0.001148, “Vs”: -1.586}}
2024-05-02 04:13:03,704 - [x1p] - {“command”: “mesh_data”, “param”: {“x”: 25.0, “y”: 25.0, “z”: 0.071}}
2024-05-02 04:13:05,711 - [x1p] - {“command”: “mesh_data”, “param”: {“x”: 66.2, “y”: 25.0, “z”: 0.042}}
2024-05-02 04:13:07,730 - [x1p] - {“command”: “mesh_data”, “param”: {“x”: 107.4, “y”: 25.0, “z”: -0.013}}
2024-05-02 04:13:09,752 - [x1p] - {“command”: “mesh_data”, “param”: {“x”: 148.6, “y”: 25.0, “z”: -0.067}}
2024-05-02 04:13:11,764 - [x1p] - {“command”: “mesh_data”, “param”: {“x”: 189.8, “y”: 25.0, “z”: -0.098}}
2024-05-02 04:13:13,777 - [x1p] - {“command”: “mesh_data”, “param”: {“x”: 231.0, “y”: 25.0, “z”: -0.126}}
2024-05-02 04:13:16,790 - [x1p] - {“command”: “mesh_data”, “param”: {“x”: 25.0, “y”: 67.2, “z”: 0.039}}
2024-05-02 04:13:18,800 - [x1p] - {“command”: “mesh_data”, “param”: {“x”: 66.2, “y”: 67.2, “z”: 0.017}}
So yes, you can.
# M1005 skew factor RegexParser( r".*M1005:(new|current)\s*XY_comp_ang\s*=\s*(-?\d+\.?\d*)", lambda match: { "command": "M1005", "param": { "skew": match.group(1), "XY_comp_ang": float(match.group(2)), }, }, ),
exactly. My last PR was adding the very same regex pattern you mentioned: x1plus #218
You can add as many regex patterns as you like, it’s really just a matter of adding a new element to the list syslog_data
If you modify it and test it on the device though, make sure you remember to kill all instances of the script when you’re done. And it’s run via an init.d script so you can start and stop it with /etc/init.d/S93syslog_shim
I’m configuring syslog-ng for x1plus atm which has filtering features like this already built in. So we won’t need to tail a file 24/7 haha
It is in a way, as it’s running a custom kernel and the UI is a series of patches running on bbl_screen. There is still a lot of RE work to do, and it’s still early days for the project. There are instructions in the developer readme on where to find the keys you’d need.
You’re correct about the acronyms. The project is a patch that exists only on the AP firmware currently. It’s a small team still and our only limitation is time. and RAM. We do have access to all of the sensors and controls for the printer, just not direct control over gcode parsing.
I’ll be running the same calibrations and belt tuning this weekend so I’ll report back when done if I find anything wildly out of range.
Also seeking to perform the X1+ FW soon, just haven’t had the time to really turn off the printer and do so lol, ordered [2] A1 mini’s and wondering if this skew factor will persist on those as well…
Yes I will test it with mine. I have a print right now and should be done in about 7 hours.
It would be super nice if the community was told about these things but not the case at all.
Ok, from just M292.2 by itself is not showing up in the logs. Same with M292.2 X0 Y0. I also have an active job as well.
All good. the control we have is on the AP board. The print runs on the MC board. We can using a ‘reboot’ command on the AP board during a print job with zero problems.
Looks like no. So its in the Q and will run when the job finishes it seems. that’s in like 5 hours and should be sleeping at that time.
Is that a typo? kamil.niedzielski on their website specifies:
M292.2 or M290.2 ?