Welcome to Hackster!
Hackster is a community dedicated to learning hardware, from beginner to pro. Join us, it's free!
Jonathan Loong
Published © GPL3+

Custom Plywood UAV

Quadrotor made out of laser cut 3mm plywood as a test aerial platform

IntermediateWork in progress819
Custom Plywood UAV

Things used in this project

Hardware components

Omnibus Airbot F4 v6
×1
Matek Systems FCHUB A5 PMB
×1
Emax XA2212 12V DC 1400KV
×4
DYS DS20A 20amp BLHeli_S 2-4S ESC
×4
6040 Plastic propellers CW/CCW Set x 2
×1
FlySky X6B
×1
RFD900
×2
FlySky i6 Transmitter
×1
Teensy USB 3.2 Development Board
Teensy USB 3.2 Development Board
×2

Software apps and online services

BetaFlight

Hand tools and fabrication machines

Soldering iron (generic)
Soldering iron (generic)
Solder Wire, Lead Free
Solder Wire, Lead Free
Cable Tie

Story

Read more

Custom parts and enclosures

CAD of Drone Laser Cut Parts

Files are DXF files and STEP files (To convert to DXF) which are loaded into a machine for laser cutting

Full Assembly STEP File

Component assembly of entire prototype drone frame for visualisation and size reference

Schematics

Drone Block Diagram - POWER

System diagram of drone power setup

Drone Block Diagram - Flight Controller/IO

Peripherals and Flight Controller component connections

Code

Failsafe - Air

Arduino
Airside radio setup to deploy a parachute (once parachute is chosen and installed)
// Teensy + RFD Failsafe (Ground Side)

#include <PulsePosition.h>
#include <PulsePositionIMXRT.h>
#include <Bounce.h>

#define BUTTON 12
#define PPM_OUT_PIN 9
#define LED 13

// Instantiate a Bounce object with a 30 millisecond debounce time
Bounce bouncer = Bounce( BUTTON,30); 

char channelArray[48];
PulsePositionOutput ppm_out(RISING);

void setup() {

  Serial.begin(115200);
  
  ppm_out.begin(PPM_OUT_PIN);

  pinMode(BUTTON,INPUT);
  
  pinMode(LED,OUTPUT);
  digitalWrite(LED,HIGH);

  delay(1000);
}

void loop() {  

  // Update the debouncer
  bouncer.update();
   
  // Get the update value
  int value = bouncer.read();
   
  // Turn on or off the LED
  if (value == HIGH) {
    digitalWrite(LED, HIGH );    
    ppm_out.write(1,2000);
    delay(500);  
  } else {
    digitalWrite(LED, LOW );
    ppm_out.write(1,1000);
  }
  
  delay(50);  
}

Failsafe - Ground

Arduino
A momentary button is monitored and once the button is pressed, a PPM channel 1 message is sent to the air-side Servo to release the parachute
// Teensy + RFD Failsafe (Air Side)

#include <PulsePosition.h>
#include <PulsePositionIMXRT.h>

char channelArray[112];
PulsePositionInput ppm_in(RISING);

#define PPM_IN_PIN 9
#define LED 13
#define SERVO_PIN 3
#define RESOLUTION_ADC 1024
#define PWM_FREQUENCY   (50.00) 
#define PWM_PERIOD      (1000000.0 / PWM_FREQUENCY)
#define PWM_RESOLUTION  (1024)

void sendPWM(float pwmMicroseconds)
{
  float outVal = (pwmMicroseconds / PWM_PERIOD) * PWM_RESOLUTION;
  analogWrite(SERVO_PIN, round(outVal)); // regular PWM
}

void setup() {

  Serial.begin(115200);

  ppm_in.begin(PPM_IN_PIN);

  analogWriteResolution(10); //2^10 = 1024
  analogWriteFrequency(SERVO_PIN, PWM_FREQUENCY);  
    
  pinMode(LED,OUTPUT);
  digitalWrite(LED,HIGH);

  delay(1000);
}

void loop() {     

  if (ppm_in.read(1) >= 1900 && ppm_in.available() > -1)
  { 
    sendPWM(2000.0);
    delay(500);
  }
  else
  {
    sendPWM(1000.0);
  }
  
  sprintf(channelArray,"CH Avail: %d, PPM CH1: %0.2f\n",ppm_in.available(),ppm_in.read(1));  
  Serial.print(channelArray);
  delay(50);
  
}

Credits

Jonathan Loong
2 projects • 3 followers
Mechatronics Engineer | UAV Enthusiast
Contact

Comments

Please log in or sign up to comment.