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

More
3 years 10 months ago - 3 years 9 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.
Last edit: 3 years 9 months ago by alangibson.
The following user(s) said Thank You: tommylight, elovalvo, Donno, DrKnow65, mor, gene_weber, RMS, behai

Please Log in or Create an account 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 or Create an account 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 or Create an account 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 or Create an account 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
The following user(s) said Thank You: tommylight

Please Log in or Create an account to join the conversation.

More
3 years 10 months ago - 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.
Last edit: 3 years 10 months ago by voltaicsca. Reason: Misread the original post, and edited the reply.

Please Log in or Create an account to join the conversation.

Time to create page: 0.440 seconds
Powered by Kunena Forum