diff --git a/docs/software/device/remote-hardware-service.md b/docs/software/device/remote-hardware-service.md index 9d0d41fe..a5fe6960 100644 --- a/docs/software/device/remote-hardware-service.md +++ b/docs/software/device/remote-hardware-service.md @@ -23,27 +23,113 @@ You can get the latest python tool/library with `pip3 install --upgrade meshtast ## Setup - To prevent access from untrusted users, you must first make a `gpio` channel that is used for authenticated access to this feature. You'll need to install this channel on both the local and remote node. The procedure using the python command line tool is: 1. Connect local device via USB + 2. Create a gpio channel ```bash meshtastic --ch-add gpio ``` + +:::tip +If doing local testing, may want to change the speed of the channel at this time, too. (ex: "meshtastic --ch-mediumfast") +::: + 3. Check the channel has been created and copy the long "Complete URL" that contains all the channels on that device ```bash meshtastic --info ``` + 4. Connect the remote device via USB (or use the [remote admin](device-remote-admin) feature to reach it through the mesh) + 5. Set it to join the gpio channel you created ```bash meshtastic --seturl theurlyoucopiedinstep3 ``` -Now both devices can talk over the `gpio` channel. + +Now both devices should be able to talk over the `gpio` channel. Send a text message from one the other other verify. Also run "--nodes" to verify the second node shows up. + +## A little bit of information about masks + +To determine the appropriate mask for the pin(s) that you want to know. The python program (and output) below might help: + +``` +>>> for i in range(1,45): +... print(f'GPIO:{i} mask:{hex(2**i)}') +... +GPIO:1 mask:0x2 +GPIO:2 mask:0x4 +GPIO:3 mask:0x8 +GPIO:4 mask:0x10 +GPIO:5 mask:0x20 +GPIO:6 mask:0x40 +GPIO:7 mask:0x80 +GPIO:8 mask:0x100 +GPIO:9 mask:0x200 +GPIO:10 mask:0x400 +GPIO:11 mask:0x800 +GPIO:12 mask:0x1000 +GPIO:13 mask:0x2000 +GPIO:14 mask:0x4000 +GPIO:15 mask:0x8000 +GPIO:16 mask:0x10000 +GPIO:17 mask:0x20000 +GPIO:18 mask:0x40000 +GPIO:19 mask:0x80000 +GPIO:20 mask:0x100000 +GPIO:21 mask:0x200000 +GPIO:22 mask:0x400000 +GPIO:23 mask:0x800000 +GPIO:24 mask:0x1000000 +GPIO:25 mask:0x2000000 +GPIO:26 mask:0x4000000 +GPIO:27 mask:0x8000000 +GPIO:28 mask:0x10000000 +GPIO:29 mask:0x20000000 +GPIO:30 mask:0x40000000 +GPIO:31 mask:0x80000000 +GPIO:32 mask:0x100000000 +GPIO:33 mask:0x200000000 +GPIO:34 mask:0x400000000 +GPIO:35 mask:0x800000000 +GPIO:36 mask:0x1000000000 +GPIO:37 mask:0x2000000000 +GPIO:38 mask:0x4000000000 +GPIO:39 mask:0x8000000000 +GPIO:40 mask:0x10000000000 +GPIO:41 mask:0x20000000000 +GPIO:42 mask:0x40000000000 +GPIO:43 mask:0x80000000000 +GPIO:44 mask:0x100000000000 +``` + +## How to easily test GPIO operations? + +You can add a simple LED and resistor to validate that the GPIO operations work as expected. Used the tutorial at https://www.instructables.com/Slide-Switch-With-Arduino-Uno-R3/ as a guide. + +Need: +* 2 Meshtastic devices (one device could be on a local computer, and the other one just has to be powered and is the one with the LED to be connected to it) +* 2 wires (black and yellow; they can be any color but typically black is used for ground) +* breadboard (optional) +* 1 LED +* 1 220Ω resistor (somewhat optional, but recommended) + +Prep: +* disconnect the remote device from power (battery/usb) +* add a resistor from yellow wire to the one end of the LED (either end of the resistor is ok, either end of the LED is ok) +* add the yellow wire from a GPIO pin that will not cause any issues (ex: for TLoraV1, we can use GPIO21) +* add the black "ground" wire from the ground pin on the device (ex: for TLoraV1 it is the end pin next to the RST button) to the other end of the LED +* power on the device + +Validation: +By default, the pin may be "off" or "on". (It will most likely "off".) See the steps below for running commands. In the example of GPIO21, the mask would be 0x200000. + +[T-Lora v1 with LED on GPIO 21](/img/LED_on_TLoraV1.jpg) + ## Doing GPIO operations @@ -51,14 +137,14 @@ You can programmatically do operations from your own python code by using the Me ## Using GPIOs from the python CLI -Writing a GPIO: +Writing a GPIO (ex: turn "on" GPIO4): ```bash title="Expected output" $ meshtastic --port /dev/ttyUSB0 --gpio-wrb 4 1 --dest \!28979058 Connected to radio Writing GPIO mask 0x10 with value 0x10 to !28979058 ``` -Reading a GPIO: +Reading a GPIO (ex: read GPIO4): ```bash title="Expected output" $ meshtastic --port /dev/ttyUSB0 --gpio-rd 0x10 --dest \!28979058 Connected to radio @@ -66,7 +152,11 @@ Reading GPIO mask 0x10 from !28979058 GPIO read response gpio_value=16 ``` -Watching for GPIO changes: +:::note +If the mask and the gpio_value match, then the value is "on". If the gpio_value is 0, then the value is "off". +::: + +Watching for GPIO changes (ex: watching GPIO4 for changes): ```bash title="Expected output" $ meshtastic --port /dev/ttyUSB0 --gpio-watch 0x10 --dest \!28979058 Connected to radio diff --git a/static/img/LED_on_TLoraV1.jpg b/static/img/LED_on_TLoraV1.jpg new file mode 100644 index 00000000..35a8121d Binary files /dev/null and b/static/img/LED_on_TLoraV1.jpg differ