GERARDO MORA - FAB ACADEMY

Final Project

My initial idea for the final project is an RTK-guided ground robot equipped with a camera and an open architecture for modular sensor packages, based on a prototype I developed during the latter half of my master's degree. This prototype employs transforming fin-ray wheel-legs instead of traditional wheels to traverse obstacles more effectively. It supports a wheel-leg mode for climbing rigid obstacles and a compliant mode in which the fin-ray appendages contact the ground for superior terrain traversal. Additionally, it includes a XIAO GNSS module for positioning and a camera for enhanced situational awareness.

The research group I am currently part of focuses on developing Triboelectric Nanogenerators as self-powered sensors for environmental monitoring and precision agriculture. Thus, I aim to provide a robotic platform that serves as a testbed for these sensors in real-world outdoor navigation and data collection scenarios.

Base robot for the project
Current prototype and main idea.
Second image description
Project sketch for Fab Academy.

For this project, what do I plan to do?

Project block diagram

Second image description

Tasks to be completed

1. Electronics Design and Production

2. Mechanical Design and Fabrication

Backsliding
Backsling
Base Wrapping
Buckling

3. Programming and debugging

4. System integration and documentation

Schedule

Week 1: 5/4/2026-5/11/2026

Week 2: 5/11/2026-5/18/2026

Week 3: 5/18/2026-5/25/2026

Week 4: 5/25/2026-6/1/2026

What I have so far...

I have tested my Attiny 1616 and DRV8871 PCBs.


const uint8_t IN1 = PIN_PA1;
const uint8_t IN2 = PIN_PA2;

uint8_t speedValue = 180;  // 0 to 255

void motorStop() {
  digitalWrite(IN1, LOW);
  digitalWrite(IN2, LOW);
}

void motorForward(uint8_t pwm) {
  analogWrite(IN1, pwm);
  digitalWrite(IN2, LOW);
}

void motorReverse(uint8_t pwm) {
  digitalWrite(IN1, LOW);
  analogWrite(IN2, pwm);
}

void setup() {
  pinMode(IN1, OUTPUT);
  pinMode(IN2, OUTPUT);

  motorStop();

  Serial.begin(9600);
  delay(100);

  Serial.println("Ready. F, R, S, 0-9 for speed");
}

void loop() {
  if (Serial.available() > 0) {
    char cmd = Serial.read();

    if (cmd == 'F' || cmd == 'f') {
      motorForward(speedValue);
      Serial.print("Forward, PWM=");
      Serial.println(speedValue);
    }
    else if (cmd == 'R' || cmd == 'r') {
      motorReverse(speedValue);
      Serial.print("Reverse, PWM=");
      Serial.println(speedValue);
    }
    else if (cmd == 'S' || cmd == 's') {
      motorStop();
      Serial.println("Motor stopped");
    }
    else if (cmd >= '0' && cmd <= '9') {
      speedValue = map(cmd - '0', 0, 9, 0, 255);
      Serial.print("New PWM speed=");
      Serial.println(speedValue);
    }
    else if (cmd == '\n' || cmd == '\r') {
      // ignore
    }
    else {
      Serial.print("Invalid command: ");
      Serial.println(cmd);
    }
  }
}
  
Testing the Attiny 1616 and DRV8871 PCB.

Downloads