Installing LinuxCNC 2.9 on Raspberry Pi 4B with Preempt-RT kernel

More
3 years 10 months ago #259347 by alangibson
I've seen a lot of people, including myself, have trouble getting LinuxCNC running on the Raspberry Pi 4. I've just gotten it all working, so I thought I'd share my recipe.

We will be overclocking and disabling power management in order to decrease latency. Make sure your Raspberry Pi has a *very large* heat sink, the kind that basically covers the entire board, before attempting this. A fan wouldn't hurt anything either.

Make sure you are using the fastest SD card you can find. Slow reads and writes will cause latency spikes.

1. On Linux desktop computer

Everything in this section should be run on your Linux desktop computer. These commands were tested on Linux Mint 21, but any reasonably recent Debian distro should work.

1.1 Install Raspberry Pi Imager
Code:
sudo apt install rpi-imager

If that doesn't work, you can manually download and install from www.raspberrypi.com/software/

1.2 Build Rasberry Pi OS image with Realtime-RT kernel
Code:
sudo apt install git git clone --depth 1 https://github.com/remusmp/rpi-rt-kernel cd rpi-rt-kernel make RASPIOS_IMAGE_NAME=raspios_full_arm64

The script will spit out the name of the OS image file at the end of its run.

    adding: 2022-09-22-raspios-bullseye-arm64-full.img (deflated 65%)

1.3 Burn image to SD card with Rasbperry Pi Imager

Insert the SD card into your computer.

Open Raspberry Pi Imager.

Click "Choose OS" button. Select "Use Custom" from the bottom of the menu. Select the '.img' file you just built in the `rpi-rt-kernel` directory.

Click "Choose Storage" button. Select your SD card.

Click the settings sprocket image button. Set your WLAN credentials, enable ssh, hostname, username/password, and timezone in the settings. I use

    hostname = linuxcnc
    enable ssh = checked
    use password authentication = selected
    set username and password = checked
        username = pi
        password = (password of your choice)
    configure wireless lan = checked
        SSID = (your wifi access point name)
        password = (your wifi password)
        wireless lan country = (your country code)
    set locale settings = checked
        timezone = (your timezone)

Click the "Write" button

1.4 Boot Raspberry Pi

Insert the micro SD card in your RPi 4 and power it up. If you correctly set your WLAN credentials, it should be available on your Wifi network in about a minute. You can watch for it to appear by running `ping`.
Code:
ping linuxcnc.local

1.5 Connect to Raspberry Pi

Once the Rasberry Pi is online, `ssh` in to it
Code:
ssh username@linuxcnc.local

Enter your password when prompted.

2. On Rasbperrry Pi

The following instructions are based on gnipsel.com/linuxcnc/debian-11-emc.html

2.1 Fix locale setting

First check if you need to set the locale
Code:
echo $LC_ALL

If you don't get anything back, then run
Code:
echo "export LANGUAGE=$LANG" >> ~/.bashrc echo "export LC_ALL=$LANG" >> ~/.bashrc source ~/.bashrc

2.2 Build LinuxCNC
Code:
sudo apt install build-essential devscripts autoconf automake \ debhelper dh-python libudev-dev bwidget \     intltool libboost-python-dev libepoxy-dev libgl1-mesa-dev \     libglu1-mesa-dev libgtk2.0-dev libgtk-3-dev libmodbus-dev \     libeditreadline-dev libxmu-dev netcat po4a python3-dev \     python3-tk python3-xlib tcl8.6-dev tclx tk8.6-dev yapps2 \     asciidoc docbook-xsl dvipng groff imagemagick \     python3-lxml source-highlight w3c-linkchecker xsltproc \     texlive-extra-utils texlive-font-utils texlive-fonts-recommended \     texlive-lang-cyrillic texlive-lang-french texlive-lang-german \     texlive-lang-polish texlive-lang-spanish texlive-xetex \     texlive-latex-recommended dblatex asciidoc-dblatex \     libusb-1.0-0-dev graphviz inkscape texlive-lang-european git clone -b 2.9 --depth 1 https://github.com/LinuxCNC/linuxcnc.git build cd build ./debian/configure no-docs dpkg-checkbuilddeps debuild -uc -us

2.3 Install LinuxCNC
Code:
sudo apt install libxml2 gir1.2-gtksource-3.0 libxml2-dev libglew2.1 mesa-utils python3-configobj libgtksourceview-3.0-dev tclreadline cd .. sudo dpkg -i linuxcnc-uspace_2.9.0~pre1_arm64.deb

2.4 Configure notification service
Code:
sudo apt install -y notification-daemon cat | sudo tee /usr/share/dbus-1/services/org.freedesktop.Notifications.service <<EOF [D-BUS Service] Name=org.freedesktop.Notifications Exec=/usr/lib/notification-daemon/notification-daemon EOF

2.5 Install Qt Designer
Code:
sudo sed -i 's/x86_64-linux-gnu/aarch64-linux-gnu/' /usr/lib/python3/dist-packages/qtvcp/designer/install_script /usr/lib/python3/dist-packages/qtvcp/designer/install_script

2.6 Install Mesaflash
Code:
git clone https://github.com/LinuxCNC/mesaflash.git sudo apt install libpci-dev libmd-dev pkg-config cd mesaflash sudo make install

2.7 Install Mesa Configuration Tool
Code:
cd ~ sudo apt install python3-packaging curl -L -O https://github.com/jethornton/mesact/raw/master/mesact_1.1.2_arm64.deb sudo dpkg -i mesact_1.1.2_arm64.deb

2.8 Improve latency
Code:
# Stop and disable services we don't need sudo systemctl stop alsa-restore apache2 bluetooth hciuart cron cups-browsed cups triggerhappy upower packagekit sudo systemctl disable alsa-restore apache2 bluetooth hciuart cron cups-browsed cups triggerhappy upower packagekit # Overclock CPU echo 'over_voltage=6' | sudo tee -a /boot/config.txt echo 'arm_freq=2000' | sudo tee -a /boot/config.txt echo -n ' isolcpus=1,2,3 idle=poll processor.max_cstate=1' | sudo tee -a /boot/cmdline.txt echo -n 'performance' | sudo tee /sys/devices/system/cpu/cpu0/cpufreq/scaling_governor # Overclock SD card echo 'dtparam=sd_overclock=100' | sudo tee -a /boot/config.txt # Disable audio sudo sed -i 's/dtparam=audio=on/# dtparam=audio=on/' /boot/config.txt

2.9 Fix virtual keyboard
Code:
sudo apt-get install onboard pip install pygst sudo sed -i 's/stderr=subprocess.PIPE,/stderr=subprocess.PIPE, text=True,/' /usr/lib/python3/dist-packages/gladevcp/hal_filechooser.py

2.10 (Optional) Fix USB ports on Raspberry Pi 4 Compute Module
Code:
echo -n ' dtoverlay=dwc2,dr_mode=host' | sudo tee -a /boot/cmdline.txt

2.11 (Optional) Improve latency by stopping unnecessary networking

This will disable Wifi, automatic IP address assignment, remote shell access, and local DNS naming. Make sure you have a monitor and keyboard connected before doing this.
Code:
sudo systemctl stop avahi-daemon ssh wpa_supplicant dhcpcd ModemManager sudo systemctl disable avahi-daemon ssh wpa_supplicant dhcpcd ModemManager

And that's about it.

With 7 glxgears and a ping flood to my 7i96S running, base thread jitter is 25us. That's good enough for slow-ish software stepping according to the Wiki.

Please Log in to join the conversation.

More
3 years 10 months ago #259348 by tommylight
You should also mention the version of the RPI4, by now there are several versions with different hardware so all this might not work on all of them, as can be noted from complaints about the official image not working on some new RPI4.
Thank you.

Please Log in to join the conversation.

More
3 years 10 months ago #259351 by rodw

You should also mention the version of the RPI4, by now there are several versions with different hardware so all this might not work on all of them, as can be noted from complaints about the official image not working on some new RPI4.
Thank you.
I don't think the version matters as from the git files Pi 1 to Pi 4/4b are supported.

Please Log in to join the conversation.

More
3 years 10 months ago #259359 by tommylight
It does, new versions had issues with the official Raspbian, it did not work several months back.
I do not nor do i intend to use RPI4 in the foreseeable future, but i read everything on this forum and there are several topic with that subject.

Please Log in to join the conversation.

More
3 years 10 months ago #260283 by RMS
Alangibson,
I have tested your recipe on raspberry Pi, compute module CM4108016, 8G RAM + 16G eMMc installed on mother board “Compute Module 4 IO Board” and mesa 7i96S
This is the cleanest OS 64 installation for linuxcnc 2.9 preRT with kernel

uname -a
Linux linuxcnc29 5.15.84-rt54-v8+ #1 SMP PREEMPT_RT Fri Dec 23 20:39:48 CET 2022 aarch64 GNU/Linux

Note: compute module carrier board IO must have
in the file /boot/config.txt

dtoverlay=dwc2,dr_mode=host

to enable usb PORTS.

The only hiccup I have experienced was with setting on the “locale”.

for users experiencing the issue
VERIFY IF YOU HAVE THOSE LINES
export LC_ALL="en_US.UTF-8"
export LC_CTYPE="en_US.UTF-8"

So far i have no issues with other programs residing in raspberrian.

My project is mobile robotic analytical platform with linuxcnc as the backbone for sample collection.
This is my third setup. The other systems were for big CNC 4x6 ft table with encoders in the loop using 7i96 + 7i85 raspberry pi 4M
and Grizzly CNC with Jetson TX1 and 7i95

Thank you and the other contributors.
RMS

Please Log in to join the conversation.

More
3 years 10 months ago #260304 by voltaicsca
Similar problem, but different enough to chime in. My tack was admittedly a bit hacky, but it worked.
My goal was to create a "fresh" rpi image (ie, modify the .img file, BEFORE flashing, rather than after, since after first boot, things change) with the rt preempt kernel, but based on the rpi images supplied by linuxcnc, rather than the vanilla raspbian. This was difficult, because the released images from linuxcnc don't seem to support the RPi 4*B*, which is what I'm running, and the raspbian image with a new kernel didn't seem to want to install linuxcnc. Both sets of software had something I wanted, but neither had everything, hence the deep-dive.

I found a way that worked for me, and have some (poorly documented) code here: github.com/InternetofAwesome/pm-940-cnc/...misc/distro-build.sh

Basically, the script is going to want a "fresh" image of the 2.8.1 build from linuxcnc for rpi, and the files from /boot from a more recent raspbian build.
Those are in the top of the script in a clearly marked config section, and named IMAGE_PATH and BOOTLOADER_PATH, respectively.

Once the script runs, you should have a ready-to-flash base OS image. From there, the apt repos are setup to grab from the mainline linuxcnc sources, and worked fine for me.

I didn't need/want to build LCNC from source, so the mainline releases were fine for me.

Please Log in to join the conversation.

More
3 years 9 months ago #261012 by RMS
Dear All,

With ongoing extensive testing, of this kernel
Linux linuxcnc29 5.15.84-rt54-v8+ #1 SMP PREEMPT_RT Fri Dec 23 20:39:48 CET 2022 aarch64 GNU/Linux

Unfortunately, I have found few problems.
1. the virtual keyboard was not found by gmoccapy.

The solution was the installation of onboard and pygst
$sudo apt-get install onboard
$pip install pygst

Note:
The matchbox-keyboard in this kernel is defective

2. In gmoccapy when loading png the error box pops up:

Found an error!
The following information may be usefull in troubleshooting
File "/usr/lib/python3/dist-packages/gladevcp/hal_filechooser.py", line 56, in update
m=progress_re.match(stderr_line)
TypeError: cannot use a string pattern on bytes-like object

Solution:
TBD , we need to ask developer of gmoccapy.
However, the “axis” imports and processes the png’s and py’s OK

Thanks,
RMS

Please Log in to join the conversation.

More
3 years 9 months ago #261070 by alangibson
Thanks for the report

1. I'll add that to the instructions

2. There may be a quick fix for that. Try this:

- Open file /usr/lib/python3/dist-packages/gladevcp/hal_filechooser.py
- Change this line
    stderr=subprocess.PIPE,
to
    stderr=subprocess.PIPE, text=True,

Please Log in to join the conversation.

More
3 years 9 months ago #261171 by RMS
Alan
it works thanks
RMS

P.S.1.      With the overclocking I suggest being cautious.  I was experiencing stability problem on CM4 and had to revert and clean cmdline.txt and config.txt from overclocking entries.
2.      While loading button macros with custom ‘png” graphics i am getting error. File “/usr/bin/gmoccapy”, line 5728, in <module>  app = gmoccapy(sys.arg)
...
File “/usr/bin/gmocappy”, line 1397, in_check_macro_for_image Image=line.split(“.”)[1] IndexError: list index out of range

Any clues? 

Please Log in to join the conversation.

More
3 years 9 months ago #261249 by alangibson
Good to hear.

1. I've added a note about needing an very large heat sink. I've been thrashing my RPi for a week straight now without problems.

2. I'll take a look and get back to you

Please Log in to join the conversation.

Time to create page: 0.235 seconds
Powered by Kunena Forum