Add a README
This commit is contained in:
parent
c4a16810d5
commit
60f64deb35
4 changed files with 160 additions and 0 deletions
160
README.md
Normal file
160
README.md
Normal file
|
|
@ -0,0 +1,160 @@
|
||||||
|
Load Cycle Test Jig
|
||||||
|
===================
|
||||||
|

|
||||||
|
|
||||||
|
This is the control software for a machine that runs repeated rotational load
|
||||||
|
cycles on (3d-printed) mechanical parts, until they fail. I was originally
|
||||||
|
motivated to build this to test ISO 5211 valve adapters (related to [ISO 5211
|
||||||
|
Adapter for PVC Ball Valve][iso-5211-pvc]). But it can be used to test any
|
||||||
|
mechanical joint.
|
||||||
|
|
||||||
|
You can use this codebase as an example for the
|
||||||
|
[`profirust`](https://github.com/rahix/profirust) PROFIBUS DP master stack
|
||||||
|
running on a Raspberry Pi.
|
||||||
|
|
||||||
|
[iso-5211-pvc]: https://www.printables.com/model/605515-iso-5211-adapter-for-pvc-ball-valve
|
||||||
|
|
||||||
|
## How it works
|
||||||
|
A pneumatic vane cylinder twists the part back and forth at a torque set by
|
||||||
|
the pressure regulator. The software counts each reversal and stops the run
|
||||||
|
as soon as one of the two end-stop sensors trips, which means the part has
|
||||||
|
given way and the cylinder is free to rotate past its normal travel.
|
||||||
|
|
||||||
|
#### Main hardware components
|
||||||
|
- pneumatic vane cylinder (FESTO [DSRL-40-180P-FW][festo-30658])
|
||||||
|
* 5/3-way solenoid valve to control the cylinder
|
||||||
|
* two inductive end-stop sensors on the cylinder (detect part failure)
|
||||||
|
- filter-regulator maintenance unit (regulator controls the maximum torque)
|
||||||
|
* pressure switch (detect low air pressure)
|
||||||
|
- stack light (white, blue, orange) - see [Stack Lights][stack-light-post] on my blog
|
||||||
|
- HD44780 LCD (20×4 characters) as the operator display
|
||||||
|
- WAGO [750-303][wago-750-303] PROFIBUS fieldbus coupler for I/O signals
|
||||||
|
- Raspberry Pi as the PROFIBUS master, with a MAX485 transceiver (See
|
||||||
|
[Running RS-485 with a MAX485 on a Raspberry Pi](#running-rs-485-with-a-max485-on-a-raspberry-pi)
|
||||||
|
below)
|
||||||
|
|
||||||
|
[festo-30658]: https://www.festo.com/de/en/a/30658/
|
||||||
|
[stack-light-post]: https://blog.rahix.de/stack-lights/
|
||||||
|
[wago-750-303]: https://www.wago.com/de-en/io-systems/fieldbus-coupler-profibus-dp/p/750-303
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
## Operating modes
|
||||||
|
There are two switches which control the machine:
|
||||||
|
- Mode selector (continuous or single)
|
||||||
|
- Start/stop button
|
||||||
|
|
||||||
|
The modes do the following:
|
||||||
|
|
||||||
|
- **Continuous**: The cylinder alternates left and right every 5 seconds, the
|
||||||
|
counter increments on each reversal, and the run ends when a limit switch
|
||||||
|
trips. This is the standard "how many cycles until it breaks" test.
|
||||||
|
- **Single**: One short preparation move, then a timed swing toward the opposite
|
||||||
|
end stop. This is used to measure time to failure for a single event.
|
||||||
|
|
||||||
|
Once failure occurs, the buzzer on the stack light pulses to let you know it's done.
|
||||||
|
|
||||||
|
The LCD shows the current state together with either the cycle counter
|
||||||
|
(continuous mode) or the elapsed cycle time (single mode).
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
## Software architecture
|
||||||
|
This is a pattern that I find to work well for control system software on
|
||||||
|
hosted systems (the Linux on the Raspberry Pi in this case). It is not
|
||||||
|
particularly efficient, but very simple and robust.
|
||||||
|
|
||||||
|
There are three threads:
|
||||||
|
|
||||||
|
- The main thread runs the 20 ms control loop that computes the control system
|
||||||
|
logic (`Logic::run()`). Before and after, it copies I/O data to and from the
|
||||||
|
fieldbus process image and display.
|
||||||
|
|
||||||
|
- A background thread runs the PROFIBUS DP master and the cyclic data exchange
|
||||||
|
with the WAGO coupler ([`fieldbus.rs`]). The cycle time is adjusted
|
||||||
|
to be optimal for the selected bus speed.
|
||||||
|
|
||||||
|
- A third thread drives the HD44780 LCD over I2C ([`display.rs`]). It is woken
|
||||||
|
from a condvar whenever a line changes.
|
||||||
|
|
||||||
|
For any further I/O channels, you'd add more threads. Data is shared through
|
||||||
|
mutexes which are only locked briefly to read or update data. This is very
|
||||||
|
important to ensure no thread is ever blocked for long periods of time.
|
||||||
|
|
||||||
|
You can find another example of this pattern in the
|
||||||
|
[crab-control-center](https://github.com/muccc-rs/crab-control-center) code.
|
||||||
|
|
||||||
|
#### Source layout
|
||||||
|
- [`main.rs`] runs the control loop and does the data plumbing.
|
||||||
|
- [`logic.rs`] contains the actual control logic: machine mode state machine,
|
||||||
|
cylinder sequencing, status reporting.
|
||||||
|
- [`fieldbus.rs`] contains the PROFIBUS communication, and peripheral configuration.
|
||||||
|
- [`display.rs`] is the HD44780 over I2C driver thread.
|
||||||
|
- [`util.rs`] contains small helpers that mirror the ones found in industrial PLC
|
||||||
|
programming (e.g. `TimerOn`, `TimerOff`, `PulseTimer`).
|
||||||
|
|
||||||
|
## PROFIBUS
|
||||||
|
The fieldbus module ([`fieldbus.rs`]) contains everything related to PROFIBUS
|
||||||
|
communication:
|
||||||
|
- Setup a DP peripheral with `profirust` using the Linux RS-485 PHY implementation
|
||||||
|
- Peripheral parameters from a vendor GSD file (this was autogenerated with profirust's [`gsdtool`](https://github.com/rahix/profirust/tree/main/gsdtool))
|
||||||
|
- Exposing the process image to the rest of the application via Mutex
|
||||||
|
|
||||||
|
#### Running RS-485 with a MAX485 on a Raspberry Pi
|
||||||
|
PROFIBUS uses an 11-bit character frame with even parity. The Pi's default
|
||||||
|
"mini UART" (`/dev/ttyS0`) does not accept `PARENB` (=even parity bit) and is
|
||||||
|
therefore not usable. The proper PL011 UART has to be enabled instead, and the
|
||||||
|
MAX485's DE/RE driver-enable line has to be tied to the UART's RTS pin so the
|
||||||
|
kernel can switch the transceiver in step with each frame.
|
||||||
|
|
||||||
|
Switch the primary UART to the PL011 by adding the following to
|
||||||
|
`/boot/firmware/config.txt` and disabling the Bluetooth HCI service:
|
||||||
|
|
||||||
|
```
|
||||||
|
dtoverlay=disable-bt
|
||||||
|
```
|
||||||
|
|
||||||
|
```bash
|
||||||
|
sudo systemctl disable --now hciuart
|
||||||
|
```
|
||||||
|
|
||||||
|
After a reboot the PL011 is available as `/dev/ttyAMA0`, which is the device
|
||||||
|
the code opens in [`fieldbus.rs`].
|
||||||
|
|
||||||
|
Hardware flow control on the primary UART is not exposed by the stock
|
||||||
|
overlays, so a small device tree overlay is needed that routes RTS (and
|
||||||
|
optionally CTS) to a GPIO.
|
||||||
|
|
||||||
|
This overlay source can be used as is: <https://github.com/HiassofT/AtariSIO/blob/master/contrib/rpi/uart-ctsrts.dts>
|
||||||
|
|
||||||
|
Compile and install the overlay with:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
dtc -@ -Hepapr -I dts -O dtb -o uart0-ctsrts.dtbo uart-ctsrts.dts
|
||||||
|
sudo cp uart0-ctsrts.dtbo /boot/firmware/overlays/
|
||||||
|
```
|
||||||
|
|
||||||
|
Then append the following line to `/boot/firmware/config.txt` and reboot:
|
||||||
|
|
||||||
|
```
|
||||||
|
dtoverlay=uart0-ctsrts
|
||||||
|
```
|
||||||
|
|
||||||
|
Wire the MAX485 so that
|
||||||
|
- DI to Pi's TXD (GPIO 14)
|
||||||
|
- RO to Pi's RXD (GPIO 15)
|
||||||
|
- combined DE and RE pins to the RTS GPIO chosen in the overlay (GPIO 17)
|
||||||
|
|
||||||
|
Add the usual 120 ohm termination at both physical ends of the bus.
|
||||||
|
|
||||||
|
## References
|
||||||
|
- [`profirust`](https://github.com/rahix/profirust)
|
||||||
|
* [Blog post about `profirust`](https://blog.rahix.de/profirust/)
|
||||||
|
* [Blog post generally explaining PROFIBUS](https://blog.rahix.de/profibus-primer/)
|
||||||
|
- [`hd44780-driver`](https://github.com/JohnDoneth/hd44780-driver) LCD display driver
|
||||||
|
|
||||||
|
[`main.rs`]: ./src/main.rs
|
||||||
|
[`logic.rs`]: ./src/logic.rs
|
||||||
|
[`fieldbus.rs`]: ./src/fieldbus.rs
|
||||||
|
[`display.rs`]: ./src/display.rs
|
||||||
|
[`util.rs`]: ./src/util.rs
|
||||||
BIN
img/test-jig-controls.jpg
Normal file
BIN
img/test-jig-controls.jpg
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 757 KiB |
BIN
img/test-jig-display.jpg
Normal file
BIN
img/test-jig-display.jpg
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 424 KiB |
BIN
img/test-jig-front.jpg
Normal file
BIN
img/test-jig-front.jpg
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 900 KiB |
Loading…
Add table
Add a link
Reference in a new issue