Skip to content

Conversation

@Gadgetoid
Copy link
Member

@Gadgetoid Gadgetoid commented Nov 17, 2023

TODO

  • - Can we make Python-based soft PWM work for pumps and piezos, or do we need to do something else?
  • - Update tests

PWM

Since Grow assumes we can PWM any pin- because RPi.GPIO had a software kludge to let us do so - we're in a bit of a predicament porting this to Bookworm / gpiod. I've experimented with pure Python PWM and it works, but it's thoroughly irredeemably terrible. When dealing with pumps that involve water- I don't want to invite the risk of a software failure causing a flood.

There's a patch floating about for software PWM at the kernel level, so we should be switching to standard PWM interfaces (see: https://lore.kernel.org/linux-pwm/20240204220851.4783-1-wahrenst@gmx.net/) with the hope that the Pi 5 will eventually get PIO PWM support on arbitrary pins.

Until the PWM issue is resolved, then Pi 5 support for Grow is blocked.

UPDATE: GPIO PWM is now merged into mainline Linux, Kernel 6.11, we're now waiting for it to make it into a Raspberry Pi OS release: torvalds/linux@7f61257

Testing

If you're a Bookworm / Pi 5 user running into virtual environment issues, you can try this library like so:

git clone https://github.com/pimoroni/grow-python -b gpiod
cd grow-python
./install.sh --unstable

The ./install.sh script will create a pimoroni virtual environment that's shared between our products. (or use your existing venv if you've already activated one.)

For the reasons behind these changes and other information, see:

@Gadgetoid Gadgetoid mentioned this pull request Jan 12, 2024
@Gadgetoid Gadgetoid changed the title Port to gpiod/gpiodevice. Bookworm/Pi5 Compatibility: Upgrade to latest boilerplate, port to gpiod Feb 15, 2024
@Gadgetoid Gadgetoid mentioned this pull request Mar 1, 2024
@bsimmo
Copy link

bsimmo commented Apr 7, 2024

How is this going.

Wondering if I should try this, or just use the RPI.GPIO 'shim'.

@Gadgetoid
Copy link
Member Author

As far as I'm aware the RPi.GPIO shim has the same limitations that are currently preventing any progress here- lack of pulse counting and PWM. Feel free to test but, uh, run your pumps dry!

The biggest blocker right now is arbitrary PWM support on pins- I need to wait for the people writing/testing/approving the kernel module. I have a janky software solution that I could roll out, but I'm apprehensive to half bake anything involving water.

@Gadgetoid
Copy link
Member Author

By way of a progress report, I have now migrated Moisture to gpiod. It's not too bad an approach but does need a thread to babysit the edge detection, lest the event buffer completely fills up.

I've opted to sleep for 1s (blocking on Event().wait(1)) and then just count the backlogged edge events. This is - I would venture - far, far more efficient and possibly even more accurate than the old approach which required an event handler to fire for every pulse.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants