Pedal‑driven hand looms have been the backbone of artisanal textile production for centuries. Their simplicity is a virtue, but it also limits the ability to experiment with complex patterns, repeatability, and data‑driven design. Adding a programmable Bluetooth controller transforms a traditional loom into a hybrid instrument that blends the tactile joy of manual weaving with the precision of digital automation.
In this post you'll get a step‑by‑step guide to designing, building, and deploying a Bluetooth‑enabled controller that can:
- Dynamically drive the harness lift motors (or solenoids) based on a pattern file.
- Stream live telemetry (tension, pedal RPM, harness position) to a mobile or desktop app.
- Allow the weaver to tweak parameters on‑the‑fly without stopping the loom.
The approach works for a wide range of loom sizes---from a small frame loom with two harnesses to a large dobby‑style foot‑loom with eight or more.
System Overview
┌─────────────────────┐ ┌─────────────────────┐
│ https://www.amazon.com/s?k=mobile&tag=organizationtip101-20 / https://www.amazon.com/s?k=desktop&tag=organizationtip101-20 │ │ https://www.amazon.com/s?k=Pedal&tag=organizationtip101-20‑Driven Loom │
│ (Control App) │◀─────▶│ + https://www.amazon.com/s?k=Bluetooth&tag=organizationtip101-20 Module│
│ │ BLE │ + https://www.amazon.com/s?k=motor&tag=organizationtip101-20 https://www.amazon.com/s?k=drivers&tag=organizationtip101-20 │
│ • Pattern https://www.amazon.com/s?k=editor&tag=organizationtip101-20 │ │ • https://www.amazon.com/s?k=harness&tag=organizationtip101-20 Actuators│
│ • Live Telemetry │ │ • https://www.amazon.com/s?k=sensors&tag=organizationtip101-20 (tension│
└─────────────────────┘ │ , https://www.amazon.com/s?k=Pedal&tag=organizationtip101-20 RPM) │
└─────────────────────┘
- Mobile/Desktop App -- UI for loading
.jsonor.csv pattern files, sending commands, and displaying sensor data. - Bluetooth Low Energy (BLE) Module -- Handles wireless link, runs on ≤ 10 mA average current.
- Microcontroller (MCU) -- Executes the pattern, drives motor drivers, reads sensors, and responds to BLE commands.
- Actuators -- Small stepper/servo motors or solenoids that raise/lower each harness.
- Sensors -- Optional Hall‑effect or optical encoders on the pedals, load cells for warp tension, and limit switches for harness bounds.
Choosing the Right Hardware
| Function | Recommended Part | Why It Fits |
|---|---|---|
| MCU + BLE | nRF52840 (Nordic) or ESP32‑C3 | Integrated BLE + ample RAM (256 KB) for pattern storage, low‑power sleep modes. |
| Motor Driver | DRV8833 dual H‑bridge (for stepper/brushless) or TB6600 (for larger stepper) | Handles up to 1.5 A per channel, easy PWM control. |
| Actuator | 26‑mm NEMA‑17 stepper (for medium looms) or 12 V solenoid (for simple on/off) | Provides precise positioning; choose torque based on warp weight. |
| Power | 12 V 5 A DC supply (wall wart) + DC‑DC buck 5 V for MCU | Keeps the loom powered even while the weaver pedals. |
| Sensors | Hall‑effect RPM sensor on pedal shaft, 4‑wire load cell with HX711 amplifier | Gives real‑time feedback for tension regulation. |
| Connectors | 2‑mm pitch JST‑PH or Molex for removable wiring | Easy serviceability. |
Tip: If you already own an ESP32 development board, you can prototype with it and later move to a more compact nRF52840 module for a production‑ready design.
Mechanical Integration
-
Mount the MCU & BLE
-
Couple Actuators to Harnesses
Firmware Architecture
Below is a minimal sketch of the main loop written for the nRF52840 using the nRF Connect SDK . The same logic applies to ESP‑IDF or Arduino‑based environments.
// pseudo‑code -- nRF Connect SDK style
#include <zephyr.h>
#include <https://www.amazon.com/s?k=Bluetooth&tag=organizationtip101-20/https://www.amazon.com/s?k=Bluetooth&tag=organizationtip101-20.h>
#include <https://www.amazon.com/s?k=Bluetooth&tag=organizationtip101-20/gatt.h>
#include "https://www.amazon.com/s?k=motor&tag=organizationtip101-20.h"
#include "https://www.amazon.com/s?k=sensors&tag=organizationtip101-20.h"
#define PATTERN_MAX_STEPS 1024
static uint8_t pattern_buf[PATTERN_MAX_STEPS];
static size_t pattern_len = 0;
static uint16_t step_idx = 0;
static bool running = false;
/* BLE GATT characteristic: write pattern */
static ssize_t write_pattern(struct bt_conn *conn,
const struct bt_gatt_attr *attr,
const void *buf, uint16_t len,
uint16_t offset, uint8_t https://www.amazon.com/s?k=flags&tag=organizationtip101-20)
{
if (len > PATTERN_MAX_STEPS) return BT_GATT_ERR(BT_ATT_ERR_INVALID_ATTRIBUTE_LEN);
memcpy(pattern_buf, buf, len);
pattern_len = len;
step_idx = 0;
return len;
}
/* BLE GATT characteristic: control (start/stop) */
static ssize_t write_control(struct bt_conn *conn,
const struct bt_gatt_attr *attr,
const void *buf, uint16_t len,
uint16_t offset, uint8_t https://www.amazon.com/s?k=flags&tag=organizationtip101-20)
{
if (len != 1) return BT_GATT_ERR(BT_ATT_ERR_WRITE_NOT_PERMITTED);
running = (*(uint8_t *)buf) != 0;
return 1;
}
/* Main loop -- advance pattern */
void main(void)
{
bluetooth_init();
gatt_init();
while (1) {
if (running && step_idx < pattern_len) {
uint8_t harness_mask = pattern_buf[step_idx++];
motor_set_harnesses(harness_mask);
}
sensor_update(); // reads tension, RPM
k_sleep(K_MSEC(10)); // 100 Hz update rate
}
}
Key Points
- Pattern Encoding -- Each byte represents a harness mask; bit 0 = harness 1 up, etc.
- Real‑Time Telemetry -- Use a separate GATT notify characteristic to push sensor data every 100 ms.
- Power Management -- Put the MCU into idle when
running == false; BLE advertisement off to conserve battery if you ever add a rechargeable pack.
Mobile / Desktop App
A lightweight cross‑platform UI can be built with Flutter , React Native , or Electron . The app should provide three core screens:
- Pattern Builder -- Drag‑and‑drop grid; export as raw byte array or JSON.
- Live Control -- "Start", "Pause", "Stop", plus sliders for tension set‑point and pedal RPM limit.
- Telemetry Dashboard -- Real‑time line charts for warp tension, pedal RPM, and harness state.
BLE Interaction Sketch (Flutter)
final uuidService = Guid('0000ff00-0000-1000-8000-00805f9b34fb');
final uuidPattern = Guid('0000ff01-0000-1000-8000-00805f9b34fb');
final uuidControl = Guid('0000ff02-0000-1000-8000-00805f9b34fb');
final uuidTelemetry = Guid('0000ff03-0000-1000-8000-00805f9b34fb');
// write pattern
await characteristicWrite(uuidPattern, patternBytes);
// start loom
await characteristicWrite(uuidControl, Uint8List.fromList([0x01]));
// receive telemetry
await characteristicSetNotify(uuidTelemetry, (value) {
// parse and update UI
});
Calibration & Safety
| Calibration Step | Procedure |
|---|---|
| Harness Zero | Run each motor to its closed limit, record encoder count, store as offset. |
| Tension Set‑Point | Use a calibration strip of known weight; adjust load‑cell gain until reading matches. |
| Pedal RPM Limit | Set a maximum RPM in firmware (e.g., 150 rpm) to prevent excessive foot speed. |
| Emergency Stop | Wire a mechanical push‑button that pulls the BLE module's reset pin low; also expose a "Kill" command in the app. |
Always test with a lightweight warp first. Incrementally increase yarn thickness while monitoring tension spikes.
Testing and Validation
- Unit Tests -- Mock the motor driver API to verify that a given pattern byte results in the correct GPIO sequence.
- Integration Test -- Connect the BLE module to a test harness that logs each GATT write; replay a 10‑step pattern and confirm timing (≤ 20 ms jitter).
- User Test -- Invite a weaver to run a familiar 12‑in‑by‑12‑in sample. Record the number of manual adjustments needed vs. a fully manual loom.
Success Metric: ≤ 5 % deviation in warp length compared to a hand‑tensioned baseline across 30 repetitions.
Extending the Platform
- Multi‑Loom Network -- Use BLE Mesh or a Wi‑Fi gateway to coordinate several looms for large‑scale productions.
- AI‑Assisted Pattern Generation -- Feed sensor data into a lightweight TensorFlow Lite model that suggests tension tweaks on the fly.
- Battery‑Backed Operation -- Add a Li‑FePO₄ pack with a BMS; the MCU can switch to battery mode when the mains is lost, avoiding sudden warp slack.
Conclusion
By marrying the tactile rhythm of a pedal‑driven hand loom with a programmable Bluetooth controller, you unlock a new workflow that respects tradition while embracing modern flexibility. The core steps---selecting a low‑power BLE MCU, mechanically coupling precise actuators, writing deterministic firmware, and providing a responsive app---are straightforward enough for a hobbyist yet robust enough for a small studio.
Give it a try: start with a single harness lift, get the BLE link working, and watch as your loom's "heartbeat" becomes a data stream you can shape, log, and improve. Happy weaving!
Feel free to drop a comment below if you have questions or want to share your own loom‑hack projects.