{"id":15170036,"url":"https://github.com/timhanewich/loralink","last_synced_at":"2026-01-31T12:02:31.765Z","repository":{"id":253552212,"uuid":"842162160","full_name":"TimHanewich/LoRaLink","owner":"TimHanewich","description":"A fully 3D-printed remote controller that uses Long Range (LoRa) radio communications to control an RC car.","archived":false,"fork":false,"pushed_at":"2024-09-26T21:46:31.000Z","size":96,"stargazers_count":2,"open_issues_count":0,"forks_count":1,"subscribers_count":1,"default_branch":"master","last_synced_at":"2025-04-08T14:41:06.016Z","etag":null,"topics":["controller","lora","micropython","pico","raspberry-pi","rc-car","rpi-pico","rylr998","wireless"],"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/TimHanewich.png","metadata":{"files":{"readme":"readme.md","changelog":"changelog.md","contributing":null,"funding":null,"license":"license.md","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2024-08-13T19:51:10.000Z","updated_at":"2025-03-03T12:18:21.000Z","dependencies_parsed_at":"2024-08-17T16:58:21.999Z","dependency_job_id":"266b7b58-5f76-462f-a904-527657cb6cf7","html_url":"https://github.com/TimHanewich/LoRaLink","commit_stats":{"total_commits":119,"total_committers":1,"mean_commits":119.0,"dds":0.0,"last_synced_commit":"cb0eb8932ca7c79b550b1324e0d49cfcf8bfa5dc"},"previous_names":["timhanewich/loralink"],"tags_count":1,"template":false,"template_full_name":null,"purl":"pkg:github/TimHanewich/LoRaLink","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/TimHanewich%2FLoRaLink","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/TimHanewich%2FLoRaLink/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/TimHanewich%2FLoRaLink/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/TimHanewich%2FLoRaLink/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/TimHanewich","download_url":"https://codeload.github.com/TimHanewich/LoRaLink/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/TimHanewich%2FLoRaLink/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":28941924,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-01-31T11:39:38.044Z","status":"ssl_error","status_checked_at":"2026-01-31T11:39:27.765Z","response_time":128,"last_error":"SSL_read: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"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":["controller","lora","micropython","pico","raspberry-pi","rc-car","rpi-pico","rylr998","wireless"],"created_at":"2024-09-27T08:00:24.552Z","updated_at":"2026-01-31T12:02:31.751Z","avatar_url":"https://github.com/TimHanewich.png","language":"Python","funding_links":[],"categories":[],"sub_categories":[],"readme":"# LoRaLink RC Remote Controller\nA fully 3D-printed remote controller that uses Long Range (LoRa) radio communications to control an RC car.\n\n## Onboard Components\nLoRaLink has quite a few physical components that serve various functions, including control input, communication, GUI display, etc.:\n- 1 [SSD-1306 OLED display](https://a.co/d/6dm97JF) (128x64)\n- 3 [16MM Push Buttons](https://a.co/d/9F2s5Ny)\n- 2 [B10K Potentiometers](https://a.co/d/18x64NA) (knobs)\n- 1 [Toggle Power Switch](https://a.co/d/8mkSPU3)\n- 1 Raspberry Pi Pico\n- 1 [REYAX RYLR998 LoRa Module](https://a.co/d/5QcWzvi)\n- 1 [MT3608 Boost Converter](https://a.co/d/7Znw4Il)\n- 1 18650 Lithium-Ion battery\n- 1 [TP4056 Charge Controller](https://a.co/d/eq3EDgR)\n\nIn addition to the components above, you'll also need:\n- 4 M2 screws (about 8 mm in length will work)\n- 1 long M2 screw (16-18mm?) for screwing in the 18650 battery holder to the bottom\n- Some 22-gauge wire (or whatever gauge you have/prefer)\n- A 47K Ohm resistor\n- A 100K Ohm resistor\n- A lot of solder!\n\n## Wiring\nThe wiring diagram for the LoRaLink controller is included below. However, you can open [the schematic file](./schematic.drawio) on [draw.io](https://draw.io) as well (may be a bit easier to read).\n\n![wiring](https://i.imgur.com/AEwbjDC.png)\n\n## Assembly\nI've provided the STL files for this design that you can 3D-print yourself [on Thingiverse here](https://www.thingiverse.com/thing:6729642). Altogether, there are three parts you'll need to print:\n\n- **bottom.stl** - The \"box\" of the controller, that each electronic component will go into.\n    - **bottom_v2.stl** - Raspberry Pi Pico USB is now accessible from the side. TP4056 moved over a bit to make room.\n    - **bottom_v3.stl** - 20mm taller (to better accomodate electronics).\n- **top.stl** - The top plate of the controller that the power switch, SSD-1306, potentiometers, and buttons will be mounted to.\n- **18650_frame.stl** - A frame to hold the 18650 battery. Wrap wires around both ends to touch each terminal. Screw this into the bottom.stl.\n\n## Changelog\nFor a full changelog, view the [changelog.md file](./changelog.md).\n\n## Communication Protocol\nI've designed a minimalistic, lightweight, robust communication protocol to allow communications between the LoRaLink controller and the device that it is being controller.\n\nAll encoding/decoding of these packets into their binary representation is handled by the [bincomms.py](./src/bincomms.py) module, but I further describe the communication protocol below.\n\nThe LoRaLink controller and the device being controlled will use a pre-established protocol for communicating with each message being stored as a *packet*. There for **four** packet types:\n- Packet Type **0** = Operational Command\n- Packet Type **1** = Operational Response\n- Packet Type **2** = Pulse Call\n- Packet Type **3** = Pulse Echo\n\nThese packets are further described below:\n\n### The \"Pulse Call\" Packet\nWhen the LoRaLink controller boots up, it first aims to establish communication with the controlled device via a \"pulse\" check. The LoRaLink controller sends out this packet to the device and then awaits a response, confirming the presence of the controlled device.\n\nThe **Pulse Call** packet is only a single byte:\n\n![pulse call](https://i.imgur.com/afdzPOR.png)\n\n### The \"Pulse Echo\" Packet\nWhen the controlled device (likely an RC car) boots up, it continuously listens for the **Pulse Call** packet above. Once it receives it, it confirms its presence by responding with the **Pulse Echo** packet, only a single byte:\n\n![pulse echo](https://i.imgur.com/DlVSA38.png)\n\n### The \"Operational Command\" Packet\nOnce communicatation is established via the Pulse Call/Echo packets above, The LoRaLink controller then begins continuously sending a stream of control commands to the controlled device using the **Operational Command** packet, consisting of two bytes, and described below:\n\n![operational command](https://i.imgur.com/XDpZQ8i.png)\n\nA value of **1** in the *Throttle Direction* bit means the throttle is positive (forward) while a value of **0** means the throttle is negative (reversing). The same applies to the steering: **0** is a left turn, **1** is a right turn, for the *Steering Direction* bit.\n\nThe throttle value and steering value are encoded as 6-bit values as seen above.\n\n### The \"Operational Response\" Packet\nOccasionally, during normal operation, the controlled device will send this packet back to the controller as a \"I'm still alive\" message, but also to inform it of its battery level (which will be displayed on the LoRaLink controller).\n\n![operational response](https://i.imgur.com/ac1lFlh.png)\n\nAs seen above, the remaining 6 bits not used as a packet identifier are used to carry data about the battery. \n\n## Other Misc. Resources\n- The PowerPoint deck I used to create the visuals above that depict the binary communication protocol can be downloaded [here](https://github.com/TimHanewich/LoRaLink/releases/download/1/comm_protocol.pptx).","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ftimhanewich%2Floralink","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Ftimhanewich%2Floralink","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ftimhanewich%2Floralink/lists"}