• F0RMaTC
  • Registratie: Mei 2002
  • Laatst online: 00:07
Hoi allemaal,

Ik ben bezig met een klein project waarbij ik een buisafsluiter open en dicht wil sturen met een 433 MHz afstandsbediening en een servo motor. Ik gebruik hiervoor een 20 kg 3218 Pro servo.

Het probleem is dat de servo soms een brommend geluid maakt wanneer hij in de sluitstand staat. Dit gebeurt niet altijd. Zodra ik de servo weer naar de open stand stuur, is het geluid weg.

Ik heb mijn code, een filmpje van het geluid en het schema toegevoegd.

Wat ik al geprobeerd heb:
  • Buck converter ingesteld op 5 V en 6 V
  • Andere buck converter geprobeerd, 5 A
  • Meerdere servo’s geprobeerd, allemaal 3218 Pro
Heeft iemand een idee waar dit door kan komen?

Alle tips zijn welkom!
#include <Servo.h>
#include <RCSwitch.h>

Servo myservo;
RCSwitch myreceiver;

// =========================
// GATEWAY CONFIG
// =========================
const int GATEWAY_ID = 3;

// Remote button codes
const unsigned long REMOTE1_CODES[4] = {
  4397880,
  4397876,
  4397884,
  4397874
};

const unsigned long REMOTE2_CODES[4] = {
  4776648,
  4776644,
  4776652,
  4776642
};

// =========================
// SERVO SETTINGS
// =========================
const int OPEN_POS = 90;
const int CLOSED_POS = 0;

const int SERVO_MIN_US = 500;
const int SERVO_MAX_US = 2500;

// =========================
// PINS
// =========================
constexpr uint8_t GREEN_LED = 3;
constexpr uint8_t RED_LED = 6;
constexpr uint8_t RC_RECEIVER = 2;
constexpr uint8_t SERVO_PIN = 9;
constexpr uint8_t BUTTON_PIN = 5;

// =========================
// TIMING
// =========================
const unsigned long DEBOUNCE_MS = 40;
const unsigned long BUTTON_LOCKOUT_MS = 500;
const unsigned long RF_LOCKOUT_MS = 500;

bool isOpen = false;
int currentServoPos = CLOSED_POS;

void moveServo(int targetPosition)
{
  myservo.attach(SERVO_PIN, SERVO_MIN_US, SERVO_MAX_US);
  myservo.write(targetPosition);
  delay(300);
  currentServoPos = targetPosition;
  myservo.detach();
}

void setStateOpen()
{
  if(isOpen) return;

  moveServo(OPEN_POS);

  digitalWrite(GREEN_LED, HIGH);
  digitalWrite(RED_LED, LOW);

  isOpen = true;

  Serial.println("Gate state: OPEN");
}

void setStateClosed()
{
  if(!isOpen) return;

  moveServo(CLOSED_POS);

  digitalWrite(GREEN_LED, LOW);
  digitalWrite(RED_LED, HIGH);

  isOpen = false;

  Serial.println("Gate state: CLOSED");
}

bool isMyButton(unsigned long code)
{
  return (
    code == REMOTE1_CODES[GATEWAY_ID - 1] ||
    code == REMOTE2_CODES[GATEWAY_ID - 1]
  );
}

bool isAnyKnownButton(unsigned long code)
{
  for(int i = 0; i < 4; i++)
  {
    if(code == REMOTE1_CODES[i]) return true;
    if(code == REMOTE2_CODES[i]) return true;
  }

  return false;
}

void setup()
{
  Serial.begin(9600);

  myreceiver.enableReceive(digitalPinToInterrupt(RC_RECEIVER));

  pinMode(GREEN_LED, OUTPUT);
  pinMode(RED_LED, OUTPUT);
  pinMode(BUTTON_PIN, INPUT_PULLUP);

  currentServoPos = CLOSED_POS;

  digitalWrite(GREEN_LED, LOW);
  digitalWrite(RED_LED, HIGH);

  moveServo(CLOSED_POS);

  Serial.print("Gateway ");
  Serial.print(GATEWAY_ID);
  Serial.println(" started");
}

void loop()
{
  static bool lastReading = HIGH;
  static bool stableState = HIGH;
  static unsigned long lastChangeMs = 0;
  static unsigned long lastButtonMs = 0;

  bool reading = digitalRead(BUTTON_PIN);

  if(reading != lastReading)
  {
    lastChangeMs = millis();
    lastReading = reading;
  }

  if((millis() - lastChangeMs) > DEBOUNCE_MS &&
     reading != stableState)
  {
    stableState = reading;

    if(stableState == LOW)
    {
      if(millis() - lastButtonMs > BUTTON_LOCKOUT_MS)
      {
        if(isOpen)
        {
          setStateClosed();
        }
        else
        {
          setStateOpen();
        }

        lastButtonMs = millis();
      }
    }
  }

  static unsigned long lastRfMs = 0;

  if(!myreceiver.available())
  {
    return;
  }

  unsigned long received_value = myreceiver.getReceivedValue();

  myreceiver.resetAvailable();

  Serial.print("RF received: ");
  Serial.println(received_value);

  if(millis() - lastRfMs < RF_LOCKOUT_MS)
  {
    return;
  }

  lastRfMs = millis();

  if(isMyButton(received_value))
  {
    Serial.println("My gateway button pressed");

    if(isOpen)
    {
      setStateClosed();
    }
    else
    {
      setStateOpen();
    }
  }
  else if(isAnyKnownButton(received_value))
  {
    Serial.println("Another gateway selected -> CLOSE");
    setStateClosed();
  }
  else
  {
    Serial.println("Unknown RF code");
  }
}
Afbeeldingslocatie: https://tweakers.net/i/U-1L-_z_VKxbO5V_dQqSH9hANnA=/x800/filters:strip_icc():strip_exif()/f/image/PCnhH0OUjNd8PxCvHkiJBVzh.jpg?f=fotoalbum_large

  • memphis
  • Registratie: Oktober 2000
  • Laatst online: 01:07

memphis

48k was toen meer dan genoeg.

Het brommen/piepen van een servo bij stilstand is normaal. De servo probeert positie te houden, als er een kleine tegenkracht is vanuit de mechaniek reageert de servo hier direct op om de ervoor te zorgen dat de positie behouden wordt. Wil je er vanaf zou je na beweging de puls uit moeten zetten, een truuk dat je bij oudere LNB's van satelietschotels hebt waar de servo de antenne horizontaal/verticaal en alles er tussen doet positioneren

Er zijn mensen die mij een GOD vinden


  • F0RMaTC
  • Registratie: Mei 2002
  • Laatst online: 00:07
Maar op het filmpje zie je dat hij helemaal geen tegenkracht krijgt.
Het motortje is even los aangesloten

Pulse uitzetten doe je toch met:
myservo.detach();

  • memphis
  • Registratie: Oktober 2000
  • Laatst online: 01:07

memphis

48k was toen meer dan genoeg.

Nee, er hoeft ook geen heuse fysieke tegenkract te zijn, als er al iets stroef loopt in het mechanisme kan je het al verwachten. Savox servo's als voorbeeld kunnen flink piepen. Duw maar met je vinger tegen de servohevel en het het geluid zal erger worden.

Hoe je de puls uitzet weet ik niet, hoewel ik veel van elektronica en RC weet ben ik geen programmeur.

Er zijn mensen die mij een GOD vinden