Помогите разобраться в проблеме с поднятием и опусканием шасси квадрокоптера

Всем здравия! Прошу не давить т.к. не являюсь специалистом по коду, но хочу помощи в решении проблемы. Есть оригинальный код разработчика поднятия и опускания шасси квадрокоптера по команде с аппаратуры. Принцип работы следующий, управляется все это дело Arduino Nano? есть серво 360 который вращает вал, по валу двигается шток который поднимает или опускает шасси. В верхней и нижней точке имеется концевой выключатель MS-1A-13.5. Не понимаю почему, но данный скетч не работает. Нескольк лет назад, когда я впервые делал подобный проект все работало.

Схема подключения…

Schematic_DJI-Inspire-Clone_2025-11-03

Schematic_DJI-Inspire-Clone_2025-11-031169×828 29.5 KB

Код ниже…

Судя по коду на самой ардуинке долже мигать светодиод, но этого не происходит.

Аппаратура рабочая, если с приемника кидаю сигнальный провод на серво то она вращается и менят направления по переключению с аппаратуры.


// Designed for Skull Quadcopter
// Rev 1.0

#include <Servo.h>
#include <PinChangeInt.h>

// Define RX variables
#define PIN1 2
#define PIN1dataReg PIND
#define pin1state (PIN1dataReg & (1 << PIN1))
volatile long pulseStart1; // pulse start time measured from millies in ISR for pin 1
volatile long pulseTime1;  // pulse width time measured from millies in ISR for pin 1 <-- this is the output we require

Servo myservo;  // create servo object to control a servo
int pos = 0;    // variable to store the servo position

// Define Microswitch pins
const int msdown = 5;
const int msup = 4;
int msdownstate = 0;
int msupstate = 0;

// Define Variables for LEDs
int led1 = 6;                    // output pin for LED 1
int led2 = 7;                    // output pin for LED 2
int led3 = 8;                    // output pin for LED 3
int led4 = 9;                    // output pin for LED 4
int led13 = 13;                  // встроенный светодиодный индикатор на случай, если не подключены другие
unsigned long time;              // holds current time for change of state
int flashtime = 400;             // time to flash LEDs in milliseconds
boolean ledon = false;           // remembers start of LED
boolean movedown = true;         // safety feature
boolean moveup = true;           // safety feature

// The below procedure handles the pulse from the RX input
void handlePin1()
{
  if (pin1state)
    pulseStart1 = micros(); // we got a positive edge
  else
    pulseTime1 = micros() - pulseStart1; // Negative edge: get pulsewidth
}

// LED Control - very basic, can be expanded.
void turnledoff() {
  digitalWrite(led1, LOW);
  digitalWrite(led2, LOW);
  digitalWrite(led3, LOW);
  digitalWrite(led4, LOW);
  digitalWrite(led13, LOW);
}
void turnledon() {
  digitalWrite(led1, HIGH);
  digitalWrite(led2, HIGH);
  digitalWrite(led3, HIGH);
  digitalWrite(led4, HIGH);
  digitalWrite(led13, HIGH);
}
void flashled() {
  // LED Flash
  if (millis() - time > flashtime) {
    time = millis();
    if (ledon) {
      turnledoff();
      ledon = false;
    } else {
      turnledon();
      ledon = true;
    }
  }
}

// Lets set everything up
void setup() {
  // initialize serial communication at 115200 bits per second so we can see whats going on:
  Serial.begin(115200);

  pinMode(PIN1, INPUT);          // Initialize rx input pin
  digitalWrite(PIN1, HIGH);      // Set the rx pin to High to start the counter
  PCintPort::attachInterrupt(PIN1, &handlePin1, CHANGE); // Attach the interrupt

  pinMode(led1, OUTPUT);         // Assign output mode to pin for LED 1
  pinMode(led2, OUTPUT);         // Assign output mode to pin for LED 2
  pinMode(led3, OUTPUT);         // Assign output mode to pin for LED 3
  pinMode(led4, OUTPUT);         // Assign output mode to pin for LED 4
  pinMode(led13, OUTPUT);        // Assign output mode to pin for LED 4
  pinMode(msup, INPUT);
  pinMode(msdown, INPUT);
  msupstate = digitalRead(msup);
  msdownstate = digitalRead(msdown);
  time = millis();               // Save current millis reading (this is a counter that always runs in milliseconds)
  turnledon();
}

void loop() {

  msupstate = digitalRead(msup);
  msdownstate = digitalRead(msdown);
  // read the input channels

  if (pulseTime1 > 900 && pulseTime1 < 1300) { //legs down
    myservo.attach(3);
    pos = 0;
    moveup = true;
    if (msupstate == LOW) {
      if (movedown) {
        myservo.write(pos);
      }
      flashtime = 200;
      flashled();
    } else {
      movedown = false;
      myservo.detach();
      turnledon();
    }
  }
  if (pulseTime1 > 1299 && pulseTime1 < 1701) { //no movement
    myservo.detach();
    pos = 100;
  }

  if (pulseTime1 > 1700) { //legs up
    myservo.attach(3);
    pos = 180;
    movedown = true;
    if (msdownstate == LOW) {
      if (moveup) {
        myservo.write(pos);
      }
      flashtime = 200;
      flashled();
    } else {
      moveup = false;
      turnledon();
      myservo.detach();
    }
  }
}






@Валерий44
Перестаньте создавать дубли своей темы. Одного топика вполне достаточно.

Что касается вопроса, то

пины на приемник и на серво на схеме и в коде перепутаны

1 лайк

Прошу прощения, напутал со схемой. Но в прототипе у меня все верно указано. Серво D3, Приемник D2. В скетче все вроде правильно.

Ну и как помогать тогда? Откуда мы знаем что и где ты ещё «напутал»?

Как только распутаешь, так все и заработает.
Ты думаешь, кто-то будет распутывать вместо тебя?

Так и помогать. Если я не теряю логику мысли то это раздел как раз-ьаки для новичков которые нуждаются в помощи.

Раздел для новичков, это да. Но не обычных новичков, а тех кто хочет сам научиться. Для тех кто постоянно всё путает и «не является специалистом по коду» есть раздел Ищу исполнителя. Но в наше неспокойное время, связываться с квадрокоптерами - такое себе занятие.
Для чего тебе квадрокоптер нужен?

Вы пробовали сами локализовать проблему? “Код не работает.” - это не диагностика.
Приходят ли импульсы на приемник? Какой длительности?

И поясните вот эту часть вашего сообщения:

Какой сигнальный провод? Каким образом этот провод сам, без контроллера, меняет направление сервы?

Тема закрыта! Оказывается в наше неспокойное время ИИ более человечен и готов за 5 минут, без соплей помочь и разобраться в проблеме.)

Именно.

Вот и славно. На будущее советую приходить на форум только после того, как исчерпаете все варианты самостоятельного решения проблемы, включая обращение к ИИ.

Разобрался? В чем косяк оказался? Уйти, ничего не рассказав, будет невежливо.

1 лайк

Думаешь он сам понял? Сомневаюсь. У ИИ спрашивать нужно ))

1 лайк

Не, я думаю он вообще не получил никакой подсказки от ИИ. Но спросить надо.

Вот и чудненько! Удачи Вам в дальнейших разработках!

Не думаю, что сюда вообще стоит возвращаться и чего-либо спрашивать.

Так а что не так? Я вам разве на ошибку в схеме не указал? А дальше решать проблему вы сами не захотели. Чтобы найти ошибку, приходится хорошенько поработать - а вы к этому не готовы, как я вижу. Ожидали готового решения.

А что вас тут с цветами и хлебом-солью не встретили - так извиняйте, это технический форум, а не курорт.