Kraftmessendes Servo?
Hallo allerseits!
Ich habe angefangen ein Servo so zu modifizieren, dass es den Strom, den der Motor derzeit verbraucht misst, und so feststellen kann, ob es gerade aufgehalten wird oder sich frei drehen kann. Dafür habe ich die Elektronik des Servos durch einen Motortreiber, einen Stromsensor und einen Arduino Nano ersetzt. Alle Komponenten funktionieren einwandfrei. Nur beim Code bin ich mir noch nicht ganz sicher....
Ich möchte das Programm so schreiben, dass es während der Motor Läuft, abfragt, ob der Strom auf ein Gewisses Level Steigt. Das habe ich soweit schon hinbekommen. Mit einer While Schleife in der jeden Durchgang der Strom gemessen wird und in einer Variablen gespeichert wird. Diese wird dann mit Dem Wert aus dem Vorherigen Durchgang subtrahieet und die Differenz Daraus kann ich dann begrenzen, sodass sie erkennt wenn der Strom schlagartig steigt. Das Problem ist nur, dass ich den I put des Sensors irgendwie glätten müsste, daher so Spitzenwerte im dem neuen Wert entstehen, die dann das Programm stoppen, wie kann ich so eine Glättung des Wertes Vornehmen?
Vielen Dank schon mal im Vorhinein!
2 Antworten
Du musst den Sensor Tiefpassfiltern. Also zB das Signal über einen Besselfilter oder dergleichen schicken dann wirds dadurch geglättet. Eine andere Möglichkeit wäre ein gleitender Mittelwert.
Wenns besonders schnell gehen soll kannst du auch immer über 16 Werte mitteln allerdings verlierst du dadurch Abtastfrequenz.
Einfaches Differenzieren wie bei dir ist aber meist sehr Fehleranfällig. Um das zu lösen gibts unterschiedliche Methoden so kann man zB die Daten in einem Bereich durch ein allgemeines Polynom approximieren und darüber die Ableitung berechnen, solche Methoden sind allerdings mehr oder weniger komplex liefern aber idR bessere Lösungen.
Dazu musst du nicht die merken wenn der Strom ansteigt sondern du kannst einen Grenzwert für den Strom festlegen.
Da der Strom mit der Kraft korreliert bedeutet ein Stromgrenzwert gleichzeitig auch einen Kraftgrenzwert.
Im wesentlichen reicht es dann zu erkennen dass man zB 10ms lang über diesem Grenzwert ist und kann damit erkennen ob man ein Objekt gegriffen hat oder nicht.
Wenn die Kraft genau sein muss geht man im übrigen den Weg den Strom des Motors mit der Elektronik zu begrenzen. Wenn nun der Motor im Stromgrenzwert hängt und nicht weiter dreht kann man so erkennen dass er etwas gegriffen hat.
Berechne den Durchschnitt der letzten 10 Inputs und nimm diesen Wert dann. Dann sind einzelne Ausreißer geglättet.
Oder akzeptiere nur einen Wert der in einem Bereich um den Durchschnittswert liegt. Bei einem Ausreißer nimmst du dann den letzten gemessenen Wert, der gültig war.
In dem Fall wäre die Implementierung über mit 16 Werten etwas Effizienter sofern man mit Ganzzahlwerten rechnet.
Ja, das ist leider das Problem, ich bin erst 13 Jahre alt und kenne solche komplizierten berechnungsartem nicht, wenn ich eine Erklärung dafür finden könnte, werde ich das mal probieren, aber Danke!