CircuitPython Wi-Fi Server
==========================
This section describes how to set up a Wi-Fi server to exchange data with the NML Hand Exoskeleton. The server supports multiple TCP clients and enables real-time communication with a serially connected exoskeleton.
.. note::
This server is designed for microcontrollers with Wi-Fi support, such as the Raspberry Pi Pico W. It was tested with Adafruit CircuitPython 9.2.4 (2025-01-29) on the Raspberry Pi Pico 2 W (RP2040).
Software Setup
----------------
1. **Install CircuitPython** on your Raspberry Pi Pico W.
Visit the `CircuitPython downloads page `_ to download the latest UF2 file. To enter bootloader mode, hold the **BOOTSEL** button while plugging the board into USB. The board will mount as a USB drive (e.g., `RPI-RP2`, `CIRCUITPY`, or `BOOT`).
2. **Flash the board** by dragging and dropping the downloaded `.uf2` file onto the mounted drive. The board will automatically reboot into CircuitPython.
3. **Install the required libraries** by either copying the `lib/` folder to the `CIRCUITPY` drive or downloading the latest CircuitPython library bundle from the `library bundle page `_. Minimum libraries include:
- `adafruit_ticks.py`
- `simpleio.py`
- **adafruit_httpserver**
- **asyncio**
- `rgbled.py` # Custom
- `usbserialreader.py` # Custom
- `webpage.py` # Custom
4. **Configure Wi-Fi settings** in the `settings.toml` file at the root of the `CIRCUITPY` drive:
.. code-block:: toml
CIRCUITPYTHON_WIFI_SSID = "your_wifi_ssid"
CIRCUITPYTHON_WIFI_PASSWORD = "your_wifi_password"
5. **(Optional) Set a static IP address** by adding the following lines to `settings.toml`:
.. code-block:: toml
CIRCUITPYTHON_WIFI_IP = "192.168.1.200"
CIRCUITPYTHON_WIFI_HTTP_PORT = 5000 # Currently hardcoded in the codebase
CIRCUITPYTHON_WIFI_TCP_PORT = 5001
.. note::
If no static IP is specified, the Pico W will attempt to use DHCP. However, a static IP is recommended for stability in multi-client applications.
Hardware Setup
----------------
The exoskeleton communicates with the Pico W via UART (or USB). Below are the recommended wiring connections between the **Raspberry Pi Pico W** and **OpenRB-150**:
**UART Serial Connection:**
+------------+----------------+---------------------+
| Pico Pin | OpenRB-150 Pin | Function |
+============+================+=====================+
| GP16 | RX | Serial Receive (RX) |
+------------+----------------+---------------------+
| GP17 | TX | Serial Transmit (TX)|
+------------+----------------+---------------------+
| GND | GND | Common Ground |
+------------+----------------+---------------------+
| VBUS | V | 5V Power Supply |
+------------+----------------+---------------------+
**RGB LED Status Indicator:**
+------------+----------+----------------------+
| Pico Pin | LED Pin | Function |
+============+==========+======================+
| GP10 | CATH | RGB Common Cathode |
+------------+----------+----------------------+
| GP11 | R | Red Channel |
+------------+----------+----------------------+
| GP12 | G | Green Channel |
+------------+----------+----------------------+
| GP13 | B | Blue Channel |
+------------+----------+----------------------+
The RGB LED provides server status feedback:
- **Green**: Wi-Fi connected
- **Red**: Disconnected or error
- **Blue**: Client activity (optional)
HTTP Webpage
-----------------
The server hosts a simple HTTP webpage that allows users to control the exoskeleton and view its status. The webpage is served at the root URL (`/`) and provides buttons for enabling/disabling motors, toggling LEDs, and viewing the current state of the exoskeleton.
.. image:: pico_server_gui.jpg
:width: 600px
:align: center