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:
Alle tips zijn welkom!
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
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");
}
}