11. Open Source Hardware - From Fibers to Fabric¶
Research & Ideation¶
The class explores how obsolete textile machines can be updated or repurposed, and how new open-source machines for knitting, weaving, more or new techniques can be developed.
Tools and machines traditionally used to create fabrics are rethought in innovative ways, encouraging experimentation with materials, processes and mechanical systems.
Open source hardware¶
The term refers to physical devices whose design files, schematics and instructions are openly shared, allowing anyone to study, modify, reproduce or improve them.
The goal is to foster collaboration, accessibility and innovation, enabling communities to build and adapt their own technology.
Felting¶
Credit to Sarah Diaz
Felting Techniques:
-
Wet Felting: Wool is layered, soaked with warm soapy water, and rubbed or rolled until the fibers lock together.
Process tested in the lab and explained here. -
Needle Felting: barbed needles repeatedly punch the fibers, tangling them into shape by mechanical action.
-
Industrial Felting: Heat, pressure and vibration compact large amounts of fibers into uniform or technical felt.
Credit to Sarah Diaz
Felting gun
It is a recent innovation: a mechanical device that fuses wool fibers together, similar to traditional needle felting but much faster and more efficient. Equipped with barbed needles and a motorized mechanism, it can penetrate thick layers of wool or fabric, interlocking fibers to create dense surfaces and felted forms.
Sketching by Anna Cain, former Fabricademy alumna
Alumni pages that inspired me¶
Arm robot: Audrey Kalic - Le Textile Lab
-
OS Loom: Kae Nagano - Fab Lab Kamakura
-
Felting gun: Barbara Rakovska - IAAC Fab Lab Barcelona
-
Hacking machine as final project: Pauline Gamore - Le Textile Lab
References & Inspiration¶
- Fiber Spray by Ali Yerdel and Anastasia Pistofidou is an experimental project using a "gun” to shoot and felt wool fibers directly onto a mannequin, creating garments without weaving or sewing. It merges traditional felting with a mechanical, open-hardware approach.
Image credit to Sarah Diaz
- Wool tools is an ongoing research project by Atelier Luma in collaboration with AATB Group. It intends to examine the needle felting technology by combining it with the benefits of robotic manufacturing. I discovered this project only after starting my work this week and I find it remarkably aligned with our own experiments.
- Wool Mood is a workshop based in Chambéry (France), which I had the pleasure of visiting last Friday thanks to EU Woolshed. Jennifer, the owner, creates beautiful home decor pieces using both needle felting and wet felting techniques.
Credit to Jennifer Pol Colin
- Kat McClelland is a fiber artist who blends needle felting, felting gun and wet felting to create figurative wool portraits and textile artworks, working in layered wool as if painting with fibers.
Details of Kat McClelland's artpieces
Final results¶
This week's assignments required to rethink a machine for textile purpose or to replicate an existing OS machine, documenting well your testing.
As an outcome, we used a robotic arm to grip a felting-needle tool and automate its up-and-down movement.
Our initial idea was to convert a floor-cleaning robot into a wool-felting machine, mimicking the motion of our hands. Unfortunately, this approach didn’t work as expected as explained here. The section below explains both tests in chronological order.
Process¶
Diana and I worked together and focused on the felting process, a key pillar of the EU Woolshed project. Felting is one of the most cost-effective ways to transform raw wool into a durable material, as it avoids the more intensive washing, spinning and processing steps. However, it still requires significant manual work and time. Last Friday, we visited several facilities and workshops working with local felting practices, and this week’s experiment explored how some of that manual effort might be reduced.
First Test: Robot vacuum cleaner for wet felting¶
BoM - Bill of Materials¶
| Qty | Description | Price | Link | Notes |
|---|---|---|---|---|
| 1 | Roidmi Eva | 760,0 € | FR store | available in Pauline's house |
| 40ml | Marseille soap | 9,6 € | Leroy Merlin | available in the lab |
| 1L | Tap water | 0 € | ||
| 0.5kg | Thônes et Marthod carded wool | N/A | from Alpes | provided through EU Woolshed |
Our experiment¶
You can operate the vacuum-cleaning robot using the physical buttons on the device or through the Xiaomi Home App. Ideally, the robot should map the area before starting, but in our case the app repeatedly returned errors and the mapping process did not complete correctly.
Steps performed:
-
Delimited the working area to prevent the robot from escaping: in our case, using metal legs and two wooden boards on the sides.
-
Added two layers of carded wool and sprayed them with hot water mixed with Marseille soap.
-
Covered the wool with bubble wrap.
-
Secured the layers with tape to keep the surface as tight as possible.
-
Activated the robot via the app or the physical button and let it repeat the cleaning process a few times.
-
(Additional) Opened the bubble wrap to let the vacuum brushes touch the wool directly. Note: the wool fibers started tangling in the mechanism, so we had to stop it.
Video credit to Diana Castillo
Why it did not work
-
The robot’s rotation is designed for sweeping, not for the pressured and circular friction needed in felting.
-
No pressure on top: without weight, the fibers can’t lock together.
-
The robot also performs suction, but this function was not needed for the felting process and did not contribute to fiber interlocking.
-
The brushes trapped the wool, causing tangling.
-
There was a high risk of damage, as wool began jamming into the bristles and mechanism.
What would have been needed
-
Replacing the brush module with felting-friendly surfaces.
-
Adding weight to create vertical compression.
-
Adjusting the movement to slower circular friction.
-
Protecting the mechanism from fiber ingress.
-
(Advanced) Reprogramming speed, motion parameters and cleaning operations (e.g. disabling suction) via app.
Given the cost of the device, the risk of damaging it and the complexity of the required modifications (which we were not fully familiar with), we chose not to proceed.
Second test: Robotic arm for Needle felting¶
BoM - Bill of Materials¶
| Qty | Description | Price | Link | Notes |
|---|---|---|---|---|
| 1 | Tinkerkit Braccio robot | 291,0€ | Arduino store | Available in the lab |
| 1 | Arduino Uno Rev3 | 29,30€ (discounted now at 19,03€) | Arduino store | available in the lab |
| 1 | USB cable | 10,90€ | Arduino store | available in the lab |
| 1 | Dry needles felting kit (needles used: 38) | 12,99€ | FR store | available in the lab |
| 1 | Foam felt base | 10€ | FR store | available in the lab |
TinkerKit Braccio¶
It is a robotic arm controlled via Arduino, in our case already assembled in the lab (thanks to Audrey and Diane). The arm is composed of six servo motors that enable a wide range of movements, each identified by the acronym MX, where X corresponds to a number from 1 to 6. Their movements are defined by angles, and the table below illustrates the logic behind them.
| Servo | Function | Low vs High Values |
|---|---|---|
| M1: Base | Horizontal rotation left/right | 0 = one side, 90 = center, 180 = opposite side |
| M2: Shoulder | Raises or lowers the arm | Higher = arm raised more (depends on mounting) |
| M3: Elbow | Bends the arm | Higher = elbow bent upward, lower = arm extended forward/downward |
| M4: Wrist vertical | Wrist up/down | 0 = wrist down, 180 = wrist up (depends on mounting) |
| M5: Wrist rotation | Wrist rotates around the arm | 0 = one side, 90 = neutral, 180 = opposite side |
| M6: Gripper | Open/close gripper | 10 = open, 73 = closed |
Important: Pay attention to robot initialization: leave space around it when uploading a program.
Setup: the robotic arm comes with an internal board designed to connect to your Arduino UNO (not included) and handle movement control.
Movements: To control the servo motors, the main Arduino function is:
Braccio.ServoMovement(delayXX, M1, M2, M3, M4, M5, M6);
- delayXX: time delay between movements
- M1, M2, …, M6: target angles (degrees) for each servo motor.
Arduino sketches for testing:
- 90 degrees (code)
- Simple movements (code)
- Take the sponge (code)
Video credits to Diana Castillo.
Our experiment in details¶
We inserted four size-38 needles into the needle-felting tool and wrapped some soft fabric around it with tape to help the robotic arm grip it more easily.
We studied the movement of the robotic arm, the logic of its servos and the corresponding angles.
After tests and improvements in the code, we were able to have the Braccio robot arm to:
1. grab the needle feelting tool
2. perform a repeated up-and-down motion that mimics a needle felting tool. In our case 20 times.
3. Adjust its position to cover a new area, after each cycle and repeat the felting operation.
4. Stop after a defined number of iterations.
Note: the robot currently moves within a small area unless the foam mat is manually repositioned. The goal is to cover a larger area with bigger movements, vertical adjustments or patterns by improving the code.
Additionally, tests with more needles (up to 8) were performed, but the optimal results were achieved with 4 needles.
Note: This video was recorded during an early test. I’ve since added the auto-grabbing and the other functions. I’ll upload an updated video soon.
By customizing the parameters and manually guiding the wool, I was able to create a folded thicker piece.
Final code
Note: Some variables were defined at the beginning of the code to allow easy customization later.
#include <Braccio.h>
#include <Servo.h>
Servo base;
Servo shoulder;
Servo elbow;
Servo wrist_rot;
Servo wrist_ver;
Servo gripper;
int baseN = 0;
const int maxBase = 20; // Maximum lateral offset - this value can be customized
const int stepBase = 5; // Step increment - this value can be customized
int totalCycles = 0; // Counts how many times the felting cycle has been executed
const int maxCycles = 10; // maximum number of felting cycles; the arm stops after reaching this
// Initialize the Braccio arm and prepare the gripper to hold the felting tool
void setup() {
Braccio.begin(); //Initialization functions: "safety" position (M1:90 - M2:45 - M3:180 - M4: 180 - M5:90 - M6:10 degrees)
Braccio.ServoMovement(30, 0, 0, 100, 90, 90, 10); // gripper open
delay(500);
Braccio.ServoMovement(30, 0, 0, 90, 90, 90, 73); // grip closed, the tool can be held
delay(500);
}
// Performs the up-and-down felting movement at the current position and move to the new position before closing the loop
void feltingCycle(int repetitions){
for (int i = 0; i < repetitions; i++) {
// Move up (lift)
Braccio.ServoMovement(8, baseN, 30, 110, 70, 90, 73); // up
delay(35); // short pause at top
// Move down (stab)
Braccio.ServoMovement(8, baseN, 10, 90, 72, 90, 73); // deeper stab
delay(40); // short pause at bottom
}
// Lift arm at the end of the cycle
Braccio.ServoMovement(12, baseN, 30, 110, 70, 90, 73);
delay(50); // short pause at top
// Move to next lateral position
baseN += stepBase; //angle to increase (+X each iteration)
if (baseN > maxBase) baseN = 0; // safety check, the angle will be max X degrees but this can be changed
// move the arm in the new position
Braccio.ServoMovement(20, baseN, 20, 80, 120, 90, 73);
delay(500);
}
// Main loop: execute felting cycles until the maximum number is reached
void loop() {
if (totalCycles < maxCycles) {
feltingCycle(20); // number of repetitions per felting position
totalCycles++; // counting each completed cycle
} else {
// Stop the arm permanently after reaching maxCycles
while(true);
}
}
What's next: more to explore¶
Regarding the test with the vacuum-cleaning robot, it would be interesting to identify an open-source tool, ideally one with a customizable app, that can be hacked to achieve more precise and programmable movements. With Diane, we found this page as a useful starting point.
For the robotic-arm test, it would be interesting to explore new configurations and positions. For example, to allow for 3D felting, not just along the plane.
Additionally, I found a 3D model of a needle-felting tool. It could serve as a starting point to design a proper attachment for the arm to grip more effectively.
Finally, the lab has purchased a felting gun, which is currently awaiting delivery. Once available, the plan is to test it with the Arduino robotic arm and explore new ways to enhance and scale the felting process.
Images: Martina Muroni unless otherwise stated.
Tools¶
Arduino Codes¶
/*
testBraccio90.ino
testBraccio90 is a setup sketch to check the alignment of all the servo motors
This is the first sketch you need to run on Braccio
When you start this sketch Braccio will be positioned perpendicular to the base
If you can't see the Braccio in this exact position you need to reallign the servo motors position
Created on 18 Nov 2015
by Andrea Martino
This example is in the public domain.
*/
#include <Braccio.h>
#include <Servo.h>
Servo base;
Servo shoulder;
Servo elbow;
Servo wrist_rot;
Servo wrist_ver;
Servo gripper;
void setup() {
//Initialization functions and set up the initial position for Braccio
//All the servo motors will be positioned in the "safety" position:
//Base (M1):90 degrees
//Shoulder (M2): 45 degrees
//Elbow (M3): 180 degrees
//Wrist vertical (M4): 180 degrees
//Wrist rotation (M5): 90 degrees
//gripper (M6): 10 degrees
Braccio.begin();
}
void loop() {
/*
Step Delay: a milliseconds delay between the movement of each servo. Allowed values from 10 to 30 msec.
M1=base degrees. Allowed values from 0 to 180 degrees
M2=shoulder degrees. Allowed values from 15 to 165 degrees
M3=elbow degrees. Allowed values from 0 to 180 degrees
M4=wrist vertical degrees. Allowed values from 0 to 180 degrees
M5=wrist rotation degrees. Allowed values from 0 to 180 degrees
M6=gripper degrees. Allowed values from 10 to 73 degrees. 10: the toungue is open, 73: the gripper is closed.
*/
// the arm is aligned upwards and the gripper is closed
//(step delay, M1, M2, M3, M4, M5, M6);
Braccio.ServoMovement(20, 90, 90, 90, 90, 90, 73);
}
/*
simpleMovements.ino
This sketch simpleMovements shows how they move each servo motor of Braccio
Created on 18 Nov 2015
by Andrea Martino
This example is in the public domain.
*/
#include <Braccio.h>
#include <Servo.h>
Servo base;
Servo shoulder;
Servo elbow;
Servo wrist_rot;
Servo wrist_ver;
Servo gripper;
void setup() {
//Initialization functions and set up the initial position for Braccio
//All the servo motors will be positioned in the "safety" position:
//Base (M1):90 degrees
//Shoulder (M2): 45 degrees
//Elbow (M3): 180 degrees
//Wrist vertical (M4): 180 degrees
//Wrist rotation (M5): 90 degrees
//gripper (M6): 10 degrees
Braccio.begin();
}
void loop() {
/*
Step Delay: a milliseconds delay between the movement of each servo. Allowed values from 10 to 30 msec.
M1=base degrees. Allowed values from 0 to 180 degrees
M2=shoulder degrees. Allowed values from 15 to 165 degrees
M3=elbow degrees. Allowed values from 0 to 180 degrees
M4=wrist vertical degrees. Allowed values from 0 to 180 degrees
M5=wrist rotation degrees. Allowed values from 0 to 180 degrees
M6=gripper degrees. Allowed values from 10 to 73 degrees. 10: the toungue is open, 73: the gripper is closed.
*/
//(step delay, M1, M2, M3, M4, M5, M6);
Braccio.ServoMovement(20, 0, 15, 180, 170, 0, 73);
//Wait 1 second
delay(1000);
Braccio.ServoMovement(20, 180, 165, 0, 0, 180, 10);
//Wait 1 second
delay(1000);
}
/*
takethesponge.ino
This example commands to the Braccio to take a sponge from the table and it shows to the user
Created on 18 Nov 2015
by Andrea Martino
This example is in the public domain.
*/
#include <Braccio.h>
#include <Servo.h>
Servo base;
Servo shoulder;
Servo elbow;
Servo wrist_rot;
Servo wrist_ver;
Servo gripper;
void setup() {
//Initialization functions and set up the initial position for Braccio
//All the servo motors will be positioned in the "safety" position:
//Base (M1):90 degrees
//Shoulder (M2): 45 degrees
//Elbow (M3): 180 degrees
//Wrist vertical (M4): 180 degrees
//Wrist rotation (M5): 90 degrees
//gripper (M6): 10 degrees
Braccio.begin();
}
void loop() {
/*
Step Delay: a milliseconds delay between the movement of each servo. Allowed values from 10 to 30 msec.
M1=base degrees. Allowed values from 0 to 180 degrees
M2=shoulder degrees. Allowed values from 15 to 165 degrees
M3=elbow degrees. Allowed values from 0 to 180 degrees
M4=wrist vertical degrees. Allowed values from 0 to 180 degrees
M5=wrist rotation degrees. Allowed values from 0 to 180 degrees
M6=gripper degrees. Allowed values from 10 to 73 degrees. 10: the toungue is open, 73: the gripper is closed.
*/
//Starting position
//(step delay M1 , M2 , M3 , M4 , M5 , M6);
Braccio.ServoMovement(20, 0, 45, 180, 180, 90, 10);
//Wait 1 second
delay(1000);
//The braccio moves to the sponge. Only the M2 servo will moves
Braccio.ServoMovement(20, 0, 90, 180, 180, 90, 10);
//Close the gripper to take the sponge. Only the M6 servo will moves
Braccio.ServoMovement(10, 0, 90, 180, 180, 90, 60 );
//Brings the sponge upwards.
Braccio.ServoMovement(20, 0, 45, 180, 45, 0, 60);
//Show the sponge. Only the M1 servo will moves
Braccio.ServoMovement(20, 180, 45, 180, 45, 0, 60);
//Return to the start position.
Braccio.ServoMovement(20, 0, 90, 180, 180, 90, 60);
//Open the gripper
Braccio.ServoMovement(20, 0, 90, 180, 180, 90, 10 );
}
Note: ChatGPT used for suggestions/checks in the code.






