Всем здравия! Прошу не давить т.к. не являюсь специалистом по коду, но хочу помощи в решении проблемы. Есть оригинальный код разработчика поднятия и опускания шасси квадрокоптера по команде с аппаратуры. Принцип работы следующий, управляется все это дело Arduino Nano? есть серво 360 который вращает вал, по валу двигается шток который поднимает или опускает шасси. В верхней и нижней точке имеется концевой выключатель MS-1A-13.5. Не понимаю почему, но данный скетч не работает. Нескольк лет назад, когда я впервые делал подобный проект все работало.
Схема подключения…
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();
}
}
}
