{"id":15177303,"url":"https://github.com/todbot/circuitpython_ruhrohrotaryio","last_synced_at":"2026-01-29T21:31:42.936Z","repository":{"id":200198674,"uuid":"705303714","full_name":"todbot/CircuitPython_RuhRohRotaryIO","owner":"todbot","description":"pretend to be 'rotaryio' for boards that need non-sequential pins","archived":false,"fork":false,"pushed_at":"2023-10-15T20:03:37.000Z","size":36,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":3,"default_branch":"main","last_synced_at":"2025-02-16T12:08:00.800Z","etag":null,"topics":["circuitpython","encoder","incrementalencoder","non-sequential","pico","raspberrypipico","rotary","rotaryio","rp2040"],"latest_commit_sha":null,"homepage":"","language":"Python","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/todbot.png","metadata":{"files":{"readme":"README.rst","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":"CODE_OF_CONDUCT.md","threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null}},"created_at":"2023-10-15T16:36:00.000Z","updated_at":"2023-10-15T20:08:06.000Z","dependencies_parsed_at":"2023-10-16T03:34:32.097Z","dependency_job_id":null,"html_url":"https://github.com/todbot/CircuitPython_RuhRohRotaryIO","commit_stats":null,"previous_names":["todbot/circuitpython_ruhrohrotaryio"],"tags_count":2,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/todbot%2FCircuitPython_RuhRohRotaryIO","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/todbot%2FCircuitPython_RuhRohRotaryIO/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/todbot%2FCircuitPython_RuhRohRotaryIO/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/todbot%2FCircuitPython_RuhRohRotaryIO/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/todbot","download_url":"https://codeload.github.com/todbot/CircuitPython_RuhRohRotaryIO/tar.gz/refs/heads/main","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":240298400,"owners_count":19779280,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["circuitpython","encoder","incrementalencoder","non-sequential","pico","raspberrypipico","rotary","rotaryio","rp2040"],"created_at":"2024-09-27T14:20:43.091Z","updated_at":"2026-01-29T21:31:42.923Z","avatar_url":"https://github.com/todbot.png","language":"Python","funding_links":[],"categories":[],"sub_categories":[],"readme":"Introduction\n============\n\n\n.. image:: https://readthedocs.org/projects/circuitpython-ruhrohrotaryio/badge/?version=latest\n    :target: https://circuitpython-ruhrohrotaryio.readthedocs.io/\n    :alt: Documentation Status\n\n\n\n.. image:: https://img.shields.io/discord/327254708534116352.svg\n    :target: https://adafru.it/discord\n    :alt: Discord\n\n\n.. image:: https://github.com/todbot/CircuitPython_RuhRohRotaryIO/workflows/Build%20CI/badge.svg\n    :target: https://github.com/todbot/CircuitPython_RuhRohRotaryIO/actions\n    :alt: Build Status\n\n\n.. image:: https://img.shields.io/badge/code%20style-black-000000.svg\n    :target: https://github.com/psf/black\n    :alt: Code Style: Black\n\nPretend to be ``rotaryio`` for boards that need non-sequential pins.\n\nOn RP2040-based boards like the Raspberry Pi Pico and QTPy RP2040,\nif you try to use \"`rotaryio \u003chttps://docs.circuitpython.org/en/latest/shared-bindings/rotaryio/index.html\u003e`_\"\non pins whose GPIO numbers are not sequential, you will get a\n``RuntimeError: Pins must be sequential GPIO pins``.\n\n\nThis package acts just like ``rotaryio`` but uses ``keypad`` and some logic to read a rotary encoder.\nIt is not as fast or efficient as ``rotaryio`` but it will work on RP2040 boards.\n\n\nDependencies\n=============\nThis driver depends on:\n\n* `Adafruit CircuitPython \u003chttps://github.com/adafruit/circuitpython\u003e`_\n\nPlease ensure all dependencies are available on the CircuitPython filesystem.\nThis is easily achieved by downloading\n`the Adafruit library and driver bundle \u003chttps://circuitpython.org/libraries\u003e`_\nor individual libraries can be installed using\n`circup \u003chttps://github.com/adafruit/circup\u003e`_.\n\n\nInstalling to a Connected CircuitPython Device with Circup\n==========================================================\n\nMake sure that you have ``circup`` installed in your Python environment.\nInstall it with the following command if necessary:\n\n.. code-block:: shell\n\n    pip3 install circup\n\nWith ``circup`` installed and your CircuitPython device connected use the\nfollowing command to install:\n\n.. code-block:: shell\n\n    circup install ruhrohrotaryio\n\nOr the following command to update an existing version:\n\n.. code-block:: shell\n\n    circup update\n\nInstalling from PyPI\n=====================\n\nOn supported GNU/Linux systems like the Raspberry Pi, you can install the driver locally `from\nPyPI \u003chttps://pypi.org/project/circuitpython-ruhrohrotaryio/\u003e`_.\nTo install for current user:\n\n.. code-block:: shell\n\n    pip3 install circuitpython-ruhrohrotaryio\n\nTo install system-wide (this may be required in some cases):\n\n.. code-block:: shell\n\n    sudo pip3 install circuitpython-ruhrohrotaryio\n\nTo install in a virtual environment in your current project:\n\n.. code-block:: shell\n\n    mkdir project-name \u0026\u0026 cd project-name\n    python3 -m venv .venv\n    source .env/bin/activate\n    pip3 install circuitpython-ruhrohrotaryio\n\nUsage Example\n=============\n\n.. code-block:: python\n\n    import os\n    import time\n    import board\n\n    # works on both QTPY M0 and QTPY RP2040\n\n    if os.uname().machine.find(\"rp2040\") \u003e 0:  # RP2040\n        from ruhrohrotaryio import IncrementalEncoder\n    else:\n        from rotaryio import IncrementalEncoder\n\n    encoder = IncrementalEncoder( board.A3, board.A1 )\n\n    while True:\n        print(encoder.position)\n        time.sleep(0.1)\n\n\nDocumentation\n=============\nAPI documentation for this library can be found on `Read the Docs \u003chttps://circuitpython-ruhrohrotaryio.readthedocs.io/\u003e`_.\n\nFor information on building library documentation, please check out\n`this guide \u003chttps://learn.adafruit.com/creating-and-sharing-a-circuitpython-library/sharing-our-docs-on-readthedocs#sphinx-5-1\u003e`_.\n\nContributing\n============\n\nContributions are welcome! Please read our `Code of Conduct\n\u003chttps://github.com/todbot/CircuitPython_RuhRohRotaryIO/blob/HEAD/CODE_OF_CONDUCT.md\u003e`_\nbefore contributing to help this project stay welcoming.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ftodbot%2Fcircuitpython_ruhrohrotaryio","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Ftodbot%2Fcircuitpython_ruhrohrotaryio","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ftodbot%2Fcircuitpython_ruhrohrotaryio/lists"}