/LinuxCNC-RIO

RealtimeIO for LinuxCNC based on an FPGA

Primary LanguagePythonGNU General Public License v2.0GPL-2.0

LinuxCNC-RIO

RealtimeIO for LinuxCNC based on an FPGA

  • no Soft-Core
  • logic only
  • no jitter
  • fast and small
  • communication via SPI (with Raspberry PI 4) or Ethernet
  • generated verilog-code / setup via json files (free pin-selection)
  • using free FPGA-Toolchain
  • runs on many FPGA's (like ICE40, ECP5, MAX10, Artix7, Gwin, CycloneIV, ...)
  • supports Open and Closed-Loop
  • multiple and mixed joint types (like Stepper, DC-Servo, RC-Servo)
BTW: there is a rewrite of RIO that is slowly getting ready for testing:

https://github.com/multigcs/riocore

https://github.com/multigcs/riogui

Sample-Configs:

Name Description
TangNano9K Tang Nano 9K with 5axis-BOB
Tango-Board Tango-Board with Tang Nano 9K
Olimex-ICE40HX8K-EVB Olimex ICE40HX8K-EVB with 5axis-BOB
TinyFPGA-BX TinyFPGA-BX with 5axis-BOB
ICEBreakerV1.0e ICEBreakerV1.0e tests
Lattice-iCE40HX8K Lattice iCE40HX8K with custom bob
Colorlight5A-75E Colorlight5A-75E tests
Alhambra-II Alhambra II FPGA board with 3 Axis SPI
Altera10M08Eval Altera10M08Eval with Arduino CNC-Shield v3
Arty-a7-35t Arty-a7-35t with Arduino CNC-Shield v3
... and many more

Plugins:

Type Name Description
joint pwmdir PWM Joint Output with DIR-Pin
joint rcservo RCSERVO Joint Output
joint stepper Stepper Joint Output with STEP/DIR/ENABLE(optional) pins
vin frequency Variable-Input for frequency measurement
vin pulsecounter Variable-Input for pulse counting with up to 3 pins (all optional)
vin pwmcounter Variable-Input for pulse width measurement
vin quadencoder Variable-Input for Quad-Encoder (int32_t)
vin quadencoderz Variable-Input for Quad-Encoder with Z-Pin (int32_t)
vin sonar Variable-Input for distance measurement via ultrasonic sonar sensor (HC-SR04)
vin lm75 Variable-Input for temperature measurement via LM75 sensor
vin ds18b20 Variable-Input for temperature measurement via DS18B20 sensor
vout frequency Variable-Output for frequencys
vout pwm Variable-Output for PWM-Signals with optional DIR pin
vout sinepwm Variable-Output for Sine-Waves via PWM-Signal
vout spipoti Variable-Output using digital poti with SPI Interface (like MCP413X/415X/423X/425X)
vout udpoti Variable-Output using digital poti with UpDown/Incr. Interface (like X9C104)
din bit Digital Input Pin (1bit)
dout bit Digital Output Pin (1bit)
expansion shiftreg Expansion to add I/O's via shiftregister's
expansion shiftreg Expansion to add I/O's via pcf8574 over I2C
interface spislave communication interface ( RPI(Master) <-SPI-> FPGA(Slave) )
... ... and many more

overview

FPGA-Toolchain:

https://github.com/YosysHQ/oss-cad-suite-build

for the TangNano9K, you can also using the Gowin-IDE or Gowin-Shell (it's faster)

interfacing with the raspberry

  • Interface: SPI

  • Chipselect: CE_1

  • do not reuse the chipselect pin of your SPI-Flash !!!

interfacing via Ethernet

you can also use UDP2SPI bridge to communicate via Ethernet (UDP)

test-tool

if you want to test the connection without LinuxCNC, you can use the python test-tool:

python3 Output/BOARD_NAME/Gateware/qt_spitest.py [IP]

some hints

at the moment, you need at least configure one item of each of the following sections: vin, vout, din, dout, joints

buildtool

you can select a config via make argument:

make CONFIG=configs/TinyFPGA-BX/config.json build

Structure:

  • buildtool.py plugins: python scripts to generates the verilog files from a configuration

  • configs: here are the config files for a specific setup (Target-FPGA / Pins)

  • Output: the generated files per config

some demo videos

LinuxCNC-Rio on MAX10 with CNC-Shield v3

LinuxCNC-Rio on MAX10 with CNC-Shield v3

LINUXCNC-RIO with W5500 on Max10 via UDP

LINUXCNC-RIO with W5500 on Max10 via UDP

LinuxCNC-RIO with TinyFPGA-BX and 5Axis BOB - ATC-Test

LinuxCNC-RIO with TinyFPGA-BX and 5Axis BOB - ATC-Test

linuxcnc with tinyfpga-bx

linuxcnc with tinyfpga-bx

Mini Closed-Loop DC-Servo on LinuxCNC-RIO

Mini Closed-Loop DC-Servo on LinuxCNC-RIO

Linuxcnc RIO with ICEBreaker FPGA

Linuxcnc RIO with ICEBreaker FPGA

LinuxCNC-RIO mixed joint types (on TangNano9K - FPGA)

LinuxCNC-RIO mixed joint types (on TangNano9K - FPGA)

LinuxCNC-RIO with TinyFPGA-BX and 5Axis BOB

LinuxCNC-RIO with TinyFPGA-BX and 5Axis BOB

LinuxCNC with ICE40 for stepgen

LinuxCNC with ICE40 for stepgen

Linuxcnc RIO with Tang Nano 20k FPGA with esp32 and w5500 Ethernet

Linuxcnc RIO with Tang Nano 20k FPGA with esp32 and w5500 Ethernet

LinuxCNC-RIO mit CoreXY und Laser am PWM

LinuxCNC-RIO mit CoreXY und Laser am PWM


Thanks to the https://github.com/scottalford75/Remora Project, i'm using a modified version of it's Linux-Component

And many thanks for Contributions to: