FAB ACADEMY 2026
Final project presentation


WEEK 20

Final project requirements

1) What does it do?

The Hexamodular Kinetic System is a modular, responsive facade panel that dynamically adjusts to regulate solar radiation and improve thermal comfort in architectural envelopes. Each hexagonal module contains a kinetic mechanism controlled by light sensors and embedded electronics. When exposed to sunlight, the mechanism rotates to create variable shading patterns, reducing solar heat gain while creating dynamic visual effects on the facade. The system is designed to be replicable, scalable, and locally fabricated using digital fabrication techniques.

SOLES

Interactive web interface: The image below shows the web interface developed for the Hexamodular system using ESP-NOW communication. This interface allows the user to open and close the panel, activate or deactivate the light sensor, and configure kinetic movement patterns such as wave-like motion.

APP interactive panel

2) Who's done what beforehand?

This project builds upon several key references in kinetic architecture and digital fabrication:

3) What did you design?

Mechanical Design: A hexagonal modular cell with an internal kinetic mechanism consisting of CNC-routed MDF frame pieces and 3D-printed linkages that create rotating motion, with parametric design and CNC toolpath optimization.

3D Design & Fabrication: 3D-printed components for mounting, gearing, and actuation supports, developed through prototype iteration and additive manufacturing techniques.

Custom Electronics: A hexagonal PCB board with a DFRobot Light Sensor Module, Seeed Studio XIAO ESP32-C3 microcontroller, servo driver, and power distribution, including schematic development and board fabrication.

Software & Control: Embedded C firmware for sensor reading and servo control, plus a web interface for real-time monitoring and interaction.

System Integration: Assembly of all mechanical, electrical, and software components into a functional module with prototype validation.

4) What sources did you use?

5) What materials and components were used?

Materials include CNC-routed MDF structural support, PLA/PETG printed parts, custom PCB, mirror acrylic and polycarbonate panels, and electronic components (TowerPro SG90 micro servo, Seeed Studio XIAO ESP32-C3, DFRobot Light Sensor Module, USB-C connector, and 5V power supply). The complete Bill of Materials (BOM) and cost breakdown are documented in the project records.

Collage of materials and electronic components used in the HEXAMODULAR project

6) Where did they come from? How much did they cost?

Components were sourced from local suppliers in Lima (structural materials, electronics retailers) and international distributors (specialized electronics). The single module cost is approximately $41.53 USD, with a 10-module panel estimated at $421.63 USD. Material sourcing and cost analysis are detailed in the project documentation.

BOM - Single HEXAMODULAR Module

Item Qty Source Unit Cost (USD) Subtotal (USD)
Seeed Studio XIAO ESP32-C31Seeed Studio / Fab Lab8.008.00
HEXAMODULAR Custom PCB1Fab Lab5.005.00
TowerPro SG90 Micro Servo1Electronics Store2.782.78
DFRobot Light Sensor Module1DFRobot5.005.00
Capacitors (Ceramic + Electrolytic)1 setElectronics Store0.500.50
Neodymium Magnetic Connectors O15x3 mm12Hardware Supplier0.8310.00
USB-C Connector1Electronics Store3.003.00
Cables, Connectors and Solder Materials1 setElectronics Store0.250.25
PLA Printed Structure1 setFab Lab4.504.50
Mirror Acrylic Panel1Local Market1.941.94
Polycarbonate Panel1Local Market0.560.56
Total Cost per Module41.53 USD

BOM - Complete HEXAMODULAR Panel (10 Modules)

Item Qty Source Unit Cost (USD) Subtotal (USD)
Seeed Studio XIAO ESP32-C310Seeed Studio / Fab Lab8.0080.00
HEXAMODULAR Custom PCB10Fab Lab5.0050.00
TowerPro SG90 Micro Servo10Electronics Store2.7827.80
DFRobot Light Sensor Module10DFRobot5.0050.00
Capacitors (Ceramic + Electrolytic)10 setsElectronics Store0.505.00
Neodymium Magnetic Connectors O15x3 mm120Hardware Supplier0.83100.00
USB-C Connector1Electronics Store3.003.00
5V 20A Power Supply1Electronics Store8.338.33
Cables, Connectors and Solder Materials1 setElectronics Store2.502.50
PLA Printed Structures10 setsFab Lab4.5045.00
Mirror Acrylic Panels10Local Market1.9419.44
Polycarbonate Panels10Local Market0.565.56
MDF Structural Support Frame (Laser Cut)1Fab Lab25.0025.00
Total Cost for 10-Module Panel421.63 USD

7) What parts and systems were made?

8) What processes were used?

9) What questions were answered?

10) What worked? What didn't?

Working:

Challenges:

11) How was it evaluated?

12) What are the implications?

Architectural implications: The system demonstrates that responsive, thermally-adaptive facades can be designed, fabricated, and controlled at a domestic scale using digital fabrication tools available in Fab Labs. This opens possibilities for retrofitting existing buildings with dynamic shading systems and exploring bioclimatic architecture in urban Lima.

Fabrication implications: The project validates the feasibility of creating modular, replicable systems by integrating multiple fabrication disciplines (CNC routing, 3D printing, electronics, embedded systems) within a single coherent design.

Scaling implications: While the current prototype demonstrates proof of concept, scaling to full architectural installations requires optimization in durability, cost reduction, and multi-module synchronization. Future work should focus on testing in real building conditions and developing a validated architectural demonstrator.

License: This project is documented under the Creative Commons Attribution-NonCommercial-ShareAlike 4.0 International (CC BY-NC-SA 4.0) license. This allows others to study, replicate, and adapt the work for educational and non-commercial purposes with proper attribution and the same license terms, while commercial use requires prior permission from the author.

HEXAMODULAR PROJECT TIMELINE (20 WEEKS)

Planned development of the Hexamodular Kinetic System across the 20 Fab Academy weeks. Week 20 is reserved for final delivery and presentation.

Task / Milestone W1 W2 W3 W4 W5 W6 W7 W8 W9 W10 W11 W12 W13 W14 W15 W16 W17 W18 W19 W20
Concept definition, references, and system requirements
Hexamodular geometry and parametric CAD development
Mechanical prototyping (laser cut and 3D printed iterations)
Kinematic mechanism and interlocking optimization
Electronics architecture and custom PCB implementation
Embedded control for motors, servo behavior, and sensing
Networking, communication, and interface testing
Full mechanical-electronic integration of the modular panel
Validation, calibration, and documentation refinement
Final assembly, final edits, and delivery presentation
Legend: Phase 1 - Concept and Design Phase 2 - Prototyping and Fabrication Phase 3 - Integration and Control Phase 4 - Validation and Final Delivery

CONCEPT

P R O J E C T V I S I O N

HEXAMODULAR concept

The HEXAMODULAR system is conceived as a responsive architectural skin composed of independent hexagonal modules that can be connected to create panels of different sizes and configurations. The hexagonal geometry allows the units to repeat efficiently, share their edges, and generate continuous patterns suitable for facades, windows, or shading installations.

The concept combines modularity, environmental responsiveness, and distributed control. Through ESP-NOW communication and the web interface, the modules can operate individually or coordinate movements such as opening, closing, and wave patterns. This makes HEXAMODULAR a scalable system in which digital fabrication, embedded electronics, and kinetic design work together to improve solar control while giving the architectural envelope an expressive and constantly changing appearance.

HEXAMODULAR master-slave connection using positive and negative poles

The image illustrates how several HEXAMODULAR units can be assembled as a single panel through the positive and negative connection poles distributed around each chassis. These poles use neodymium magnets as both mechanical connectors and electrical contacts: magnetic attraction aligns and holds neighboring modules together, while the conductive contact between the magnets transmits electrical power from one hexagon to the next. Their alternating polarity preserves the correct positive and negative connections throughout the panel. One module operates as the master, coordinating commands and communication, while the remaining slave modules reproduce the requested movements. This configuration simplifies assembly, testing, maintenance, and future expansion because individual modules can be connected, removed, or replaced without redesigning the complete panel.

HEXAMODULAR panel installed within a residential window frame

The complete HEXAMODULAR panel is contained within a structural perimeter frame that organizes, supports, and protects the connected modules as a single architectural element. For this prototype, the frame was conceived specifically for installation in a residential window, allowing the kinetic panel to operate as an adaptive shading device between the exterior environment and the interior space. The frame maintains the position of the modules, facilitates mounting on the existing opening, and enables the system to regulate direct sunlight while preserving its modular and removable construction.

PROCESS

DESIGN AND FABRICATION DEVELOPMENT

Computer-Aided Design

The knowledge gained in WEEK02 was used to develop a scalable model. Parametric design in Solidworks was used to build the chassis and create a 3D integration assembly of all mechanical and electronic components. 2D design was also used as a base in Corel Draw to define the panel frame and modular blades.

3D Design
2D Design

Computer-Controlled Cutting / Machining

For the fabrication of some secondary components, laser cutting was required for the reflective golden blades, optimizing both material use and cutting time based on WEEK03 experience. The same laser machine was used with RDWorks, with the following parameters for cutting 2 mm acrylic: Speed 28 mm/s, Power 85%.

3D Design

WEEK07 knowledge was also applied to machine the 18 mm MDF assembly frame using a CNC router. The toolpaths were prepared in Aspire with the following parameters: RPM 16000, feed rate 2500 mm/min, depth per pass 7 mm, using a 6 mm compression bit.

3D Design

3D Printing

3D printing was used to fabricate the module chassis, following the WEEK05 workflow, using matte gray PLA filament. One challenge was that on one printer the chassis could not fit in a horizontal orientation, so it had to be printed vertically. On the Creality K2, printing time was reduced, with an approximate print time of 6 hours per modular chassis at a 0.2 mm layer height.

3D Design

Electronics Design

The electronic board design was developed starting in WEEK06 using KiCad. The layout was adapted to be as compact as possible while respecting trace spacing, resulting in an approximate board size of 29 mm x 66 mm. The final manufacturing files were then generated.

3D Design
3D Design

Electronics Production

The electronic boards were fabricated using the process learned in WEEK08, specifically fiber laser engraving. EzCad was used with the same engraving parameters: speed 500 mm/s, power 70%, and frequency 45 kHz over 2 passes.

3D Design

Input and Output devices

Input and output device installation and testing were performed first, using the light sensor and servo motor. A test code was developed to validate operation: the light sensor measures light intensity, and the servo rotates according to that intensity. WEEK09 and WEEK10.

3D Design
Code: SENSOR TEST - CODE: GENERATED IN GEMINI AI
#include <ESP32Servo.h>

const int PIN_SERVO = D0;
const int PIN_LIGHT = D1;

Servo myServo;

void setup() {
    Serial.begin(115200);

    myServo.attach(PIN_SERVO);
    pinMode(PIN_LIGHT, INPUT);
}

void loop() {

    int light = analogRead(PIN_LIGHT);

    // Map 4095 -> 0 deg and 2400 -> 90 deg
    int angle = map(light, 4095, 2400, 0, 90);

    // Limit range
    angle = constrain(angle, 0, 90);

    // Round to 10 deg steps
    angle = ((angle + 5) / 10) * 10;

    myServo.write(angle);

    Serial.print("Light: ");
    Serial.print(light);
    Serial.print("  ->  Angle: ");
    Serial.println(angle);

    delay(100);
}

Programming and interface

A remote interface was developed to control the system using Wi-Fi communication and a web server integrated into the master module. The interface has 5 action buttons: the first opens the panel, the second closes the panel, the third activates a left-to-right wave mode, the fourth activates a right-to-left wave mode, and the fifth toggles the light sensor on or off. WEEK11

System integration photo 1
System integration photo 2

The code used for system programming was developed in the Arduino IDE environment, using the required libraries for Wi-Fi communication, servo control, and light sensor handling. The master code receives light sensor signals and sends commands to the slave modules so they can perform the corresponding movement. For this, the MAC address of each slave module was required. WEEK04

3D Design

MASTER CODE

Code: MASTER MODULE - ESP-NOW COMMUNICATION
#include <WiFi.h>
#include <WebServer.h>
#include <esp_now.h>
#include <ESP32Servo.h>

#define PIN_SERVO D0
#define PIN_SENSOR D1

bool sensorEnabled = false;
int lastAngle = -1;

Servo myServo;
WebServer server(80);

typedef struct {
    int angle;
} ServoData;

ServoData dataToSend;

// MAC addresses of slave modules
uint8_t HEX1[]  = {0xE8, 0xF6, 0x0A, 0x13, 0xFC, 0x64};
uint8_t HEX3[]  = {0x80, 0xF1, 0xB2, 0x60, 0x2B, 0xE8};
uint8_t HEX4[]  = {0x1C, 0xDB, 0xD4, 0xEC, 0xFB, 0x8C};
uint8_t HEX5[]  = {0x1C, 0xDB, 0xD4, 0xEA, 0xBF, 0x74};
uint8_t HEX6[]  = {0xE8, 0xF6, 0x0A, 0x14, 0x9F, 0x10};
uint8_t HEX7[]  = {0x80, 0xF1, 0xB2, 0x60, 0x67, 0x68};
uint8_t HEX8[]  = {0x1C, 0xDB, 0xD4, 0xEA, 0xC3, 0x08};
uint8_t HEX9[]  = {0x1C, 0xDB, 0xD4, 0xEA, 0xC0, 0xBC};
uint8_t HEX10[] = {0x80, 0xF1, 0xB2, 0x60, 0x44, 0x60};

uint8_t* peers[] = {
  HEX1, HEX3, HEX4, HEX5, HEX6, HEX7, HEX8, HEX9, HEX10
};

const int NUM_PEERS = sizeof(peers) / sizeof(peers[0]);

void addPeer(uint8_t *mac) {
  esp_now_peer_info_t peerInfo = {};
  memcpy(peerInfo.peer_addr, mac, 6);
  peerInfo.channel = 1;
  peerInfo.encrypt = false;
  if (esp_now_add_peer(&peerInfo) == ESP_OK) {
        Serial.println("Peer added");
  } else {
        Serial.println("Error adding peer");
  }
}

void sendToPeer(uint8_t *mac, int angle) {
    dataToSend.angle = angle;
    esp_now_send(mac, (uint8_t *)&dataToSend, sizeof(dataToSend));
}

void sendToAll(int angle) {
    myServo.write(angle);
    dataToSend.angle = angle;
  for (int i = 0; i < NUM_PEERS; i++) {
        esp_now_send(peers[i], (uint8_t *)&dataToSend, sizeof(dataToSend));
  }
    Serial.print("Sent angle: ");
    Serial.println(angle);
}

void openAll() {
    sendToAll(90);
  server.sendHeader("Location", "/");
  server.send(303);
}

void closeAll() {
    sendToAll(0);
  server.sendHeader("Location", "/");
  server.send(303);
}

void waveRightToLeft() {
    int waitTime = 150;
    sendToPeer(HEX10, 90); delay(waitTime); sendToPeer(HEX10, 0);
    sendToPeer(HEX9, 90); delay(waitTime); sendToPeer(HEX9, 0);
    sendToPeer(HEX8, 90); delay(waitTime); sendToPeer(HEX8, 0);
    sendToPeer(HEX7, 90); delay(waitTime); sendToPeer(HEX7, 0);
    sendToPeer(HEX6, 90); delay(waitTime); sendToPeer(HEX6, 0);
    sendToPeer(HEX5, 90); delay(waitTime); sendToPeer(HEX5, 0);
    sendToPeer(HEX4, 90); delay(waitTime); sendToPeer(HEX4, 0);
    sendToPeer(HEX3, 90); delay(waitTime); sendToPeer(HEX3, 0);
    myServo.write(90); delay(waitTime); myServo.write(0);
    sendToPeer(HEX1, 90); delay(waitTime); sendToPeer(HEX1, 0);
}

void startWaveRightToLeft() {
    waveRightToLeft();
  server.sendHeader("Location", "/");
  server.send(303);
}

void waveLeftToRight() {
    int waitTime = 150;
    sendToPeer(HEX1, 90); delay(waitTime); sendToPeer(HEX1, 0);
    myServo.write(90); delay(waitTime); myServo.write(0);
    sendToPeer(HEX3, 90); delay(waitTime); sendToPeer(HEX3, 0);
    sendToPeer(HEX4, 90); delay(waitTime); sendToPeer(HEX4, 0);
    sendToPeer(HEX5, 90); delay(waitTime); sendToPeer(HEX5, 0);
    sendToPeer(HEX6, 90); delay(waitTime); sendToPeer(HEX6, 0);
    sendToPeer(HEX7, 90); delay(waitTime); sendToPeer(HEX7, 0);
    sendToPeer(HEX8, 90); delay(waitTime); sendToPeer(HEX8, 0);
    sendToPeer(HEX9, 90); delay(waitTime); sendToPeer(HEX9, 0);
    sendToPeer(HEX10, 90); delay(waitTime); sendToPeer(HEX10, 0);
}

void startWave() {
    waveLeftToRight();
  server.sendHeader("Location", "/");
  server.send(303);
}

void toggleSensor() {
    sensorEnabled = !sensorEnabled;
  server.sendHeader("Location", "/");
  server.send(303);
}

void mainPage() {
  String html = "<html><head>";
  html += "<meta name='viewport' content='width=device-width, initial-scale=1'>";
  html += "</head><body><h1>HEXAMODULAR</h1>";
    html += "<p><a href='/open'><button style='width:250px;height:80px;font-size:24px'>";
    html += "OPEN ALL</button></a></p>";
    html += "<p><a href='/close'><button style='width:250px;height:80px;font-size:24px'>";
    html += "CLOSE ALL</button></a></p>";
    html += "<p><a href='/wave'><button style='width:250px;height:80px;font-size:24px'>";
    html += "WAVE LEFT -> RIGHT</button></a></p>";
    html += "<p><a href='/wave2'><button style='width:250px;height:80px;font-size:24px'>";
    html += "WAVE RIGHT -> LEFT</button></a></p>";
  html += "<p><a href='/sensor'><button style='width:250px;height:80px;font-size:24px'>";
    html += (sensorEnabled ? "SENSOR: ON" : "SENSOR: OFF");
  html += "</button></a></p></body></html>";
  server.send(200, "text/html", html);
}

void setup() {
  Serial.begin(115200);
    myServo.attach(PIN_SERVO);
  pinMode(PIN_SENSOR, INPUT);
  WiFi.mode(WIFI_AP_STA);
  WiFi.softAP("HexaPanel", "12345678", 1);
  Serial.println();
  Serial.print("IP: ");
  Serial.println(WiFi.softAPIP());
  if (esp_now_init() != ESP_OK) {
    Serial.println("Error ESP-NOW");
    while (true) delay(1000);
  }
  for (int i = 0; i < NUM_PEERS; i++) {
        addPeer(peers[i]);
  }
    server.on("/", mainPage);
    server.on("/open", openAll);
    server.on("/close", closeAll);
    server.on("/wave", startWave);
    server.on("/wave2", startWaveRightToLeft);
    server.on("/sensor", toggleSensor);
  server.begin();
    Serial.println("Server started");
}

void loop() {
  server.handleClient();
    if(sensorEnabled) {
        int light = analogRead(PIN_SENSOR);
        int angle = map(light, 4095, 1800, 0, 90);
        angle = ((angle + 5) / 10) * 10;
        angle = constrain(angle, 0, 90);
        if(angle != lastAngle) {
            sendToAll(angle);
            Serial.print("Light: ");
            Serial.print(light);
            Serial.print("  Angle: ");
            Serial.println(angle);
            lastAngle = angle;
    }
  }
  delay(100);
}

SLAVE CODE

Code: SLAVE MODULE - ESP-NOW COMMUNICATION
#include <WiFi.h>
#include <esp_now.h>
#include <ESP32Servo.h>

#define PIN_SERVO D0

Servo myServo;

typedef struct {
    int angle;
} ServoData;

ServoData receivedData;

void OnDataRecv(const esp_now_recv_info_t *info,
                const uint8_t *incomingData,
                int len) {
    memcpy(&receivedData, incomingData, sizeof(receivedData));
    myServo.write(receivedData.angle);
    Serial.print("Received angle: ");
    Serial.println(receivedData.angle);
}

void setup() {
  Serial.begin(115200);
    myServo.attach(PIN_SERVO);
  WiFi.mode(WIFI_STA);
  
  if (esp_now_init() != ESP_OK) {
    Serial.println("Error ESP-NOW");
    return;
  }
  
  esp_now_register_recv_cb(OnDataRecv);
    Serial.println("SLAVE READY");
}

void loop() {
}

System integration

System integration was carried out by combining all mechanical, electronic, and software components into one complete functional module. Each part was validated individually before being integrated into the full HEXAMODULAR unit, ensuring proper fit, electrical continuity, and responsive behavior under different lighting conditions. The complete chassis was also integrated and the corresponding tests were performed. WEEK16

3D Design

FINAL RESULT

HEXAMODULAR KINETIC SYSTEM COMPLETE

An initial final result was achieved with one base module and one slave module. The base module receives the light sensor signal and sends commands to the slave modules so they can perform the corresponding movement. Tests were performed under direct sunlight and indoor shadow conditions in the house.

The first full assembly of the HEXAMODULAR system was completed by integrating all modules and verifying their combined operation. Opening and closing tests were performed, along with wave mode activation and light sensor response. The system proved to be functional and capable of adapting to lighting conditions, providing dynamic control over solar radiation on the facade.

As a final step, the system was installed in the real setting of a residential window. The installation was straightforward; the panel is lightweight and easy to mount. Functional tests were carried out at different times of day, verifying the system response to direct sunlight and shade, as well as mobile phone control.

DOWNLOAD FILES

HEXAMODULAR KICAD ZIP Download
GERBER HEXAMODULAR Download
PCB HEXAMODULAR CNC Download
HEXAMODULAR SVG Download
FULL CHASSIS Download
2D DESIGN Download