Back doing experiments, now at the School of A.
Rained until 14:00 so spent my time prepping, including running a water house out to the container. Cleaned up all equipment, set up robot, and got reacquainted with the my RBGD PoE camera.


Back doing experiments, now at the School of A.
Rained until 14:00 so spent my time prepping, including running a water house out to the container. Cleaned up all equipment, set up robot, and got reacquainted with the my RBGD PoE camera.










clay_3dp_setup - bdc62a: RAPID code for the IRC5
erratic_TS25_ctrl_firmware - 062ff7b: Cast group input to int8_t (signed) and update minimum RPS to -30.0
clay_3dp_print - b926b20: PrintFrame, set AO for each MoveL
Using the group output/input as an (8 bit) signed integer made everyone a lot simpler. The following (virtual) signals could be removed:
do_extrudeRelSpddo_retractLeaving the following signals on the IRC5:
| Type | (Logical) Range | Notes | |
|---|---|---|---|
ao_TCPSpd |
system analog | 0.0-3.0 | Mapped to TCP run (mm/s) |
ao_flowRate |
virtual analog | 0.0-1.0 | Manual tweaks during run |
ao_printPtSpd |
virtual analog | -1.0 - +1.0 | Set before every move |
do_forceExtrude |
virtual digital | ||
do_forceRetract |
virtual digital | ||
go_TCPSpeed |
physical group output | -127 to 127 | Calculated speed |
The RAPID module has gone through two iterations since it was last
commited. The task is now semi-static, meaning it runs in the
background when the controller starts (semi means it restarts when the
controller restarts).
The ABB IRC5's group outputs can only be set to unsigned integers. You
can still cast it int8_t manually. Map positive numbers to 0-127,
and calculate negative numbers by subtracting it from 255. Meaning
-30 becomes 225. This can then be converted back on the
microcontroller using a simple c++ cast ((int8_t)value).
As described above, a cast is enough to get the correct values.
There were however some earlier problems with using analog in as digital
in, since the digital threshold needs to be set explicitly for the pin
(The Controllino wiring implementation sets it to 0UL.
See erratic_TS25_ctrl_firmware: de38d29).
const uint8_t AI_RESOLUTION = 23;
// Calculate threshold value for 7V in a 0-24V, 7V comes from ABB spec, I think
const uint32_t AI_DIGITAL_THRESHOLD = (7.0 / 24.0) * ((1UL << AI_RESOLUTION) - 1);
setDigitalThreshold(pin, AI_DIGITAL_THRESHOLD); // noop for digital inputs
I might need to raise this with Controllino.
I finally bit the bullet and created my PrintFrame, a variation of
compas_slicer's PrintPoint. It's just a (compas.geometry)
frame with an extrusion_factor property. Thanks to the work on
compas.data this neatly serialises and deserialises from json.
I might have gone too far with PrintLayer, but in my defense it's
just a list with a @classmethod that creates itself out of a list of
frames and a list of float values.
Yes! But I might need to fine tune the SPEED_COEFFICIENT set in the
TX_SPEED task.

Side project with Johanna Jonsson.

Planes generated using grasshopper script: 01offsetting method nonplanar rethink simpler shape blend offsets short scaled.gh
Oriented to scan using:
0.0-1.0 where 0
is one curve and 1 the other. Calculate the factors based on a
nominal layer height, by taking the largest distance between the
curves and dividing it by the height.TX_SPEED is now SEMI-STATICMeaning it is always running, and starts from where it stopped whenever the IRC5 is booted.
This is needed to be able to stop the extruder motor when the robot is in emergency stop (or the program is stopped some other way).
Changed the n_max_speed in TX_SPEED on 0.10. This is a clear hack,
since the speed the variable is referencing is the TCP speed of the
robot. It works however since the TX_SPEED task remaps from
n_min_byte to n_max_byte (0-254) to n_min_speed to n_max_speed
(now 0.10-0.250 (mm/s)).
Might make more sense to change value on Controllino Micro or better yet, base it on a virtual group output on the robot that can be set from the flexpendant.
… it was replaced with a frame with Z axis $[0, 0, -1]$.
This made for some quite extreme re-orientations during run
No rain since print according to SMHI: Weather data

Nearly 5 months between the pictures but just 200 m between me and Under Produktions office in Malmö..


What I’ve learned from jj by Nathan Witmer captures my experience as well. I create much better change history and don’t need to deal with git worktree when I work on multiple branches :).
Huge if true. Might need to re-evaluate py for embedded? GPIO round-trip at 480ns
Python, in hardware. 480ns GPIO. No interpreter. No C. Just PyXL.


🤯
Klas Holger Jönsson stopped by and took some images. He kindly sent along scans of the developed film.










I can’t figure out how R2.CBUS is connected, it should be on XP (customer power) but I can’t make a circuit.. Doesn’t help that I’m not sure which IO option we have. My best guess is the “Multibus, new” as per the circuit diagram for IRB 4600 (requires account).



Edit: apparently public artwork; Meerlicht by Lina Selander.
I was curious to see what issues would be labeled “trivial” in the NixOS/nixpkgs tracker and found one where a user couldn’t fetch rev V 1.9.1 (with a space) from Bitbucket.
The repo with this rev has moved, and I couldn’t find another repo with space-containing tags. The issue author suggested creating my own repo so I dug out my old Bitbucket account from back when compas-rrc was hosted there.
I quickly found that there was no way to get git to create a tag, branch or even note with a space in it. Bitbucket’s REST API did not allow this either. I think the original tag was created with subversion, but I haven’t confirmed that.
However, creating a tag with URL encoded whitespace (%20 for space)—tag%20with%20spaces—was possible, and if you use that in an URL you get a 404. You actually need tag%25%20with%25%20spaces). See this repro repo.
So I did write a fix and a test for that, mostly motivated by the sunk cost fallacy. So feel free to create tags with URL encoded tags, and use fetchFromBitbucket to fetch them ;).










I think every designer should write a love letter to a font at least once in their lifetime.
This is mine: A 150-year-old font you have likely never heard of, and one you probably saw earlier today.
from The hardest working font in Manhattan - Marcin Wichary.
I had my suspicions of its origins but it turned out to be more interesting than I thought.
The text describes a process to convert an Org-mode note into a JSON payload for Micropub and send it as a POST request using Emacs, while also expressing plans for further enhancements.
If an AI application delivers some profound public good, or even if it might, it’s probably okay that its value is rooted in this unprecedented operationalization of the commons.
If an AI application simply replicates Everything, it’s probably not okay.
Is it Okay - Robin Sloan via lobste.rs
Nuanced and balanced argument, but as lobste.rs user minimax writes:
The simple question, “is it OK”, is much too broad, which is why the author ends up with both Yes and No. Better ask when and why are specific instantiations of the scrape-and-trellis pipeline and specific applications of its products morally justifiable, or not.






Preparing for CAN-bus/dreary at Brunnshög



Just automatic fuse turned off in upstream box.

