Arduino Diy Drone

I am trying to build a diy Arduino drone with nrf transmitter and receiver. and i used Brushless bldc 1000kv motors and mpu6050 as accelerometer and multiwii code for the flight controller (Arduino nano)as all is set, finally my drone is not arming.i am not sure is there any problem in Min and Max throttle values.
can any one help me

Maybe there's a problem with the code and schematic you didn't post in the wrong forum section .

I referred the code and the schematics from the link below
https://create.arduino.cc/projecthub/akarsh98/diy-arduino-based-quadcopter-drone-948153

What testing did you do as you built the drone?

The reciever test is done in order to check whether the transmitter is paired with the receiver or not, but I got the values and the transmitter and receiver is paired. And I have done the esc calibration test too and a accelometer calibration in multiwii gui

How the Hell is this a tutorial?

Can I know what's wrong with that..??

Can I answer with a question? (Well, two, now)

What makes you think this is a tutorial?

We still can't see your code or schematic.

Your topic was MOVED to its current forum category as it is more suitable than the original

As I am a newbie some things may go wrong, hope someone can help me

I referred the below link for Radio Controller setup

https://create.arduino.cc/projecthub/akarsh98/diy-radio-controller-for-drone-nrf24l01-fd7867

And the below link for flight controller part

https://create.arduino.cc/projecthub/akarsh98/flight-controller-tutorial-arduino-based-quadcopter-drone-8d752e

One last time:
We still can't see your code or schematic.

(or your debug output...)

Below is the Reciever code

https://raw.githubusercontent.com/akarsh98/DIY-Radio-Controller-for-Drone-Arduino-Based-Quadcopter/main/Drone_receiver.ino

And below is the transmitter code i used

https://raw.githubusercontent.com/akarsh98/DIY-Radio-Controller-for-Drone-Arduino-Based-Quadcopter/main/Drone_transmitter.ino

Welcome to the forum

Please make it easier on those who are trying to help you and follow the advice given in the link below when posting code, in particular the section entitled 'Posting code and common code problems'

Use code tags (the </> icon above the compose window) to make it easier to read and copy for examination

here is the reciever code


#include <SPI.h>
#include <nRF24L01.h>
#include <RF24.h>

////////////////////// PPM CONFIGURATION//////////////////////////
#define channel_number 6  //set the number of channels
#define sigPin 2  //set PPM signal output pin on the arduino
#define PPM_FrLen 27000  //set the PPM frame length in microseconds (1ms = 1000µs)
#define PPM_PulseLen 400  //set the pulse length
//////////////////////////////////////////////////////////////////

int ppm[channel_number];

const uint64_t pipeIn =  0xE8E8F0F0E1LL;

RF24 radio(7, 10);

// The sizeof this struct should not exceed 32 bytes
struct MyData {
  byte throttle;
  byte yaw;
  byte pitch;
  byte roll;
  byte AUX1;
  byte AUX2;
};

MyData data;

void resetData() 
{
  // 'safe' values to use when no radio input is detected
  data.throttle = 0;
  data.yaw = 127;
  data.pitch = 127;
  data.roll = 127;
  data.AUX1 = 0;
  data.AUX2= 0;
  
  setPPMValuesFromData();
}

void setPPMValuesFromData()
{
  ppm[0] = map(data.throttle, 0, 255, 1000, 2000);
  ppm[1] = map(data.yaw,      0, 255, 1000, 2000);
  ppm[2] = map(data.pitch,    0, 255, 1000, 2000);
  ppm[3] = map(data.roll,     0, 255, 1000, 2000);
  ppm[4] = map(data.AUX1,     0, 1, 1000, 2000);
  ppm[5] = map(data.AUX2,     0, 1, 1000, 2000);  
  }

/**************************************************/

void setupPPM() {
  pinMode(sigPin, OUTPUT);
  digitalWrite(sigPin, 0);  //set the PPM signal pin to the default state (off)

  cli();
  TCCR1A = 0; // set entire TCCR1 register to 0
  TCCR1B = 0;

  OCR1A = 100;  // compare match register (not very important, sets the timeout for the first interrupt)
  TCCR1B |= (1 << WGM12);  // turn on CTC mode
  TCCR1B |= (1 << CS11);  // 8 prescaler: 0,5 microseconds at 16mhz
  TIMSK1 |= (1 << OCIE1A); // enable timer compare interrupt
  sei();
}

void setup()
{  
  resetData();
  setupPPM();
  
  // Set up radio module
  radio.begin();
  radio.setDataRate(RF24_250KBPS); // Both endpoints must have this set the same
  radio.setAutoAck(false);

  radio.openReadingPipe(1,pipeIn);
  radio.startListening();
}

/**************************************************/

unsigned long lastRecvTime = 0;

void recvData()
{  
  while ( radio.available() ) {        
    radio.read(&data, sizeof(MyData));
    lastRecvTime = millis();
  }
}

/**************************************************/

void loop()
{
  recvData();

  unsigned long now = millis();
  if ( now - lastRecvTime > 1000 ) {
    // signal lost?
    resetData();
  }
  
  setPPMValuesFromData();
}

/**************************************************/

//#error Delete this line befor you cahnge the value (clockMultiplier) below
#define clockMultiplier 2 // set this to 2 if you are using a 16MHz arduino, leave as 1 for an 8MHz arduino

ISR(TIMER1_COMPA_vect){
  static boolean state = true;

  TCNT1 = 0;

  if ( state ) {
    //end pulse
    PORTD = PORTD & ~B00000100; // turn pin 2 off. Could also use: digitalWrite(sigPin,0)
    OCR1A = PPM_PulseLen * clockMultiplier;
    state = false;
  }
  else {
    //start pulse
    static byte cur_chan_numb;
    static unsigned int calc_rest;

    PORTD = PORTD | B00000100; // turn pin 2 on. Could also use: digitalWrite(sigPin,1)
    state = true;

    if(cur_chan_numb >= channel_number) {
      cur_chan_numb = 0;
      calc_rest += PPM_PulseLen;
      OCR1A = (PPM_FrLen - calc_rest) * clockMultiplier;
      calc_rest = 0;
    }
    else {
      OCR1A = (ppm[cur_chan_numb] - PPM_PulseLen) * clockMultiplier;
      calc_rest += ppm[cur_chan_numb];
      cur_chan_numb++;
    }     
  }
}

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.