Messgerät zum Erfassen der max. Stromaufnahme von Servos
Verfasst: So 10. Jul 2022, 17:09
Ich habe gestern mal ein Gerät aufgebaut, mit dem man die Maximale Stromaufnahme eines Servos messen kann. Das Problem ist ja, dass so ein Servo sich nur kurz bewegt, so dass ich den aufgenommen Strom mit einem normalen Messgerät unmöglich sehen kann. Das sieht man gleich auch im Video, den ich hier reingestellt habe. Als ich die Spannung für den Servo eingeschalten habe, zeigte das Labornetzteil gerade mal 200-300mA. Also gar keine Chance den wahren Strom zu erfassen. Gerade der Anfahrstrom ist ja sehr hoch, ähnlich wie der Strom wenn der Servo stark belastet wird.
Also habe ich mir einen Arduino Mega geschnappt, ein Display 4x20 Zeichen, einen StromMessungsSensor bis 20 Ampere, ein Netzteil 5 Volt / 5 Ampere, einen Taster Schließer, und einen Servo für 20 kg, den ich gerade da liegen hatte. Das alles zusammengebaut, das Programm dazu geschrieben. Und fertig ist die Laube.
Der Arduino bewegt werend der Messungen laufend den Servo hin und her, und der Arduino misst die Stromstärke die der Servo über den Stromsensor aufnimmt. Der Strom wird alle paar Millisekunden gemessen, und wenn der neue gemessene Strom höher ist, wie der letzte gespeicherte und angezeigt, wird die Neue Messung gespeichert und angezeigt. Der Anlauf-Strom bei dem von mir verwendeten Servo ist offenbar so hoch, dass ich durch mechanische Belastung des Servos, den Strom kaum noch erhöhen kann.
Wenn ich mir das Gerät in ein Gehäuse einbaue, und somit als fertiges Gerät benutze, nehme ich dafür einen Arduino Uno. Für den Testaufbau habe ich einen Mega verwendet, weil gerade nur ein Mega auf den Testkonsolen frei war.
Hier ist mal der Video, den ich gestern dazu gemacht habe.
ACHTUNG !! Die GND/VCC Drähte vom Netzteil über den Sromsensor zum Servo in ausreichender Stärke für 5 Ampere auslegen!!
Hier habe ich noch die Schaltung, die dafür aufgebaut habe:
. Und das Programm dazu:
Also habe ich mir einen Arduino Mega geschnappt, ein Display 4x20 Zeichen, einen StromMessungsSensor bis 20 Ampere, ein Netzteil 5 Volt / 5 Ampere, einen Taster Schließer, und einen Servo für 20 kg, den ich gerade da liegen hatte. Das alles zusammengebaut, das Programm dazu geschrieben. Und fertig ist die Laube.
Der Arduino bewegt werend der Messungen laufend den Servo hin und her, und der Arduino misst die Stromstärke die der Servo über den Stromsensor aufnimmt. Der Strom wird alle paar Millisekunden gemessen, und wenn der neue gemessene Strom höher ist, wie der letzte gespeicherte und angezeigt, wird die Neue Messung gespeichert und angezeigt. Der Anlauf-Strom bei dem von mir verwendeten Servo ist offenbar so hoch, dass ich durch mechanische Belastung des Servos, den Strom kaum noch erhöhen kann.
Wenn ich mir das Gerät in ein Gehäuse einbaue, und somit als fertiges Gerät benutze, nehme ich dafür einen Arduino Uno. Für den Testaufbau habe ich einen Mega verwendet, weil gerade nur ein Mega auf den Testkonsolen frei war.
Hier ist mal der Video, den ich gestern dazu gemacht habe.
ACHTUNG !! Die GND/VCC Drähte vom Netzteil über den Sromsensor zum Servo in ausreichender Stärke für 5 Ampere auslegen!!
Hier habe ich noch die Schaltung, die dafür aufgebaut habe:
. Und das Programm dazu:
Code: Alles auswählen
/* Programm zum Servostrom messen
So kann man die max. Stromanforderung eines Servos rausfinden
Der Servo sollte eine eigene, genügend starke Spannungsversorgung haben,
dass er auch wirklich den Strom ziehen kann, den er benötigt.
Die Neustart Taste setzt slle Werte zurück,
und die Messung startet neu.
*/
#include <LiquidCrystal_I2C.h> // LCD Display
LiquidCrystal_I2C lcd(0x27, 20, 4);
#include <MobaTools.h>
MoToServo meinServo;
byte servo_pos0 = 0;
byte servo_pos1 = 180;
const byte ANALOG_PIN = A0; // Hier wird der Name vom Messeingang festgelegt
const int servoPin = 4; // Anschluß für den Servo
const byte Neustart = 5; // Taster um Messung neu zu starten
byte Neustartstatus = 1;
byte PWM0_1 = 1;
float max1 = 0; // Der Speicher für den ausgelesenen Analogwert vom Messbuchse
byte maxaktuell = 0;
float max2 = 0; // Der Speicher für den ausgelesenen Max-Analogwert vom ADC
float max2alt = 0; // Vergleichspeicher ob es neue Max-Werte gibt
float max3 = 0; // Anzeigewert
byte zaehler = 0;
unsigned long startzeit = 0;
unsigned long endzeit = 0;
unsigned long Sekundenablauf01 = 0; // Servo-Drehrichtung nach 1,5 Sek. ändern
const unsigned long Pausezeit01 = 1500;
//====================================================================================
void setup(void)
{
Serial.begin(115200);
lcd.begin();
lcd.backlight();
lcd.clear();
lcd.setCursor (0, 0);
lcd.print (F("Strom ="));
lcd.setCursor (14, 0);
lcd.print (F("Ampere"));
pinMode(Neustart, INPUT_PULLUP);
meinServo.attach(servoPin); //Servo an Pin 4
meinServo.setSpeed( 0 ); // Verfahrgeschwindigkeit einstellen
}
//===================================================================================
void loop(void) {
// ----------------------------Neustart prüfen-------------------------------------
Neustartstatus = digitalRead(Neustart); // Neistarttaste gedrückt?
if (Neustartstatus == 0) // Wenn ja, alle Messwerte auf Null
{
max1 = 0;
max2 = 0;
max2alt = 0;
max3 = 0;
zaehler = 0;
Neustartstatus = 1;
}
//--------------------------Zeit für die Durchlaufmessung------------------------------------------------
startzeit = micros();
max1 = analogRead (ANALOG_PIN); // Analogen Eingang A0 auslesen
zaehler = zaehler + 1;
max2 = max2 + max1;
if (zaehler == 50)
{
max2 = max2 / 50;
max2 = max2 - 510.50;
if (max2 > max2alt)
{
max3 = max2 * 0.05;
max2alt = max2;
lcd.setCursor (8, 0);
lcd.print (F(" "));
lcd.setCursor (8, 0);
lcd.print (max3);
}
zaehler = 0;
max2 = 0;
}
//--------------------------Nach einer Sekunde PWM Wert ändern-----------------------------------------
if (millis() - Sekundenablauf01 >= Pausezeit01)
{
if (PWM0_1 == 1)
{
meinServo.write(servo_pos1); //wird langsam drehen
}
if (PWM0_1 == 0)
{
meinServo.write(servo_pos0); //wird langsam drehen
}
PWM0_1 = !PWM0_1;
Sekundenablauf01 = millis();
}
// -----------------------------------Laufzeittest-------------------------------------------------------
endzeit = micros();
Serial.println(endzeit - startzeit);
}