Сервопривод не двигается, если я отсоединяю его ПОСЛЕ записи

Так что это немного странно, и я ничего не понимаю. По сути, я просто играю со своим сервоприводом. Я написал небольшую программу, которую можно найти по этой ссылке: https://pastebin.pl/view/8e9c9573 (Примечание: Это три файла, я оставил там несколько комментариев, а функция idk — это мое последнее средство, пытающееся отделить себя от loop, я действительно не знаю :/ ) .

Поэтому я запускаю controller.Setup() в функции setup, а затем в цикле просто перемещаю его на 180 и отсоединяю, после чего сталкиваюсь с бесконечным петля. Примечание. Я знаю, что это не очень хороший код, но сейчас меня это не волнует.

Проблема в том, что когда я добавляю вызов для отсоединения (строка 22), предыдущий ход не выполняется! Я думаю, что схожу с ума, потому что, как только я удаляю строку и перекомпилирую, она на самом деле перемещается.

Я попытался снять блокировку (Controller::m_Attached), но она все еще не работает. Пожалуйста, дайте мне знать, если я чего-то не заметил, но я действительно не понимаю.

Примечания:

  • Я использую arduino-cli, вот мой не очень идеальный Makefile: https://pastebin .pl/view/daa852ff
  • Я использую библиотеку Servo: https://www.arduino.cc/reference/en/libraries/ серво/
  • Я использую Arduino Uno

ИЗМЕНИТЬ: Кто-то сказал мне опубликовать код в вопросе, так что вот:

//Main.ino
#include <Servo.h>
#include "Controller.h"

Controller controller(3);


void idk();

void setup() {
    Serial.begin(9600);
    controller.Setup();
}

void loop() {
    idk();
    while(true);
}

void idk() {
    controller.Move(180);
    controller.Unlock();
}



// Controller.h
#pragma once
#include <Servo.h>

class Controller
{
public:
    Controller(int servoPin) 
        : m_ServoPin(servoPin), m_Attached(false) {}

    void Setup();
    void Move(int angle);

    void Lock();
    void Unlock();

private:
    Servo m_Servo;
    bool m_Attached;
    const int m_ServoPin = 3;
};


// Controller.ino
#include "Controller.h"

void Controller::Setup()
{
    m_Servo.attach(m_ServoPin);
    m_Attached = true;
    Serial.print("[CONTROLLER] Attached Servo\n");
}

void Controller::Move(int angle)
{
    if (m_Attached)
        m_Servo.write(angle);
}

void Controller::Lock() {
    m_Servo.attach(m_ServoPin);
    m_Attached = true;
}

void Controller::Unlock() {
    m_Servo.detach();
    m_Attached = false;
}

, 👍2

Обсуждение

функция detach (), вероятно, останавливает вывод данных от вывода сигнала управления сервоприводом ... вы отключаете сигнал управления через несколько микросекунд после его включения, поэтому он никогда не генерируется ... кроме того, сервопривод требует, чтобы сигнал был присутствовать во все времена, @jsotola

@jsotola Большое спасибо. Когда я добавляю задержку между вызовами функций, она работает. Вы должны сделать это ответом, чтобы я мог его принять., @stfn


1 ответ


Лучший ответ:

2

Функция detach(), вероятно, не позволяет выводу данных выводить сигнал управления сервоприводом.

Ваш код отключает управляющий сигнал через несколько микросекунд после его включения.

Сигнал управления никогда не генерируется.

Кроме того, сервопривод требует постоянного присутствия сигнала, чтобы он сохранял свое положение.

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

Представьте, что программа может выполнить 100 000 циклов, прежде чем сервопривод завершит движение.

,