Hallo, ich versuche gerade eine Pendelleuchte zu bauen. Leider bin ich ganz neu beim Umgang mit Ardunio. Ich möchte gern das Pendel, jeweils 3 oder 4 Sekunden langsam nach vorn und hinten pendelt. Aktuell habe ich die Sweep Vorlage genommen, es zappelt aber so ein wenig. Hat jemand eine Idee wie ich das ändern kann und die Schritte langsamer machen kann?
/* Sweep
by BARRAGAN <http://barraganstudio.com>
This example code is in the public domain.
modified 8 Nov 2013
by Scott Fitzgerald
https://www.arduino.cc/en/Tutorial/LibraryExamples/Sweep
*/
#include <Servo.h>
Servo myservo; // create servo object to control a servo
// twelve servo objects can be created on most boards
int pos = 0; // variable to store the servo position
void setup() {
myservo.attach(9); // attaches the servo on pin 9 to the servo object
}
void loop() {
for (pos = 0; pos <= 30; pos += 1) { // goes from 0 degrees to 180 degrees
// in steps of 1 degree
myservo.write(pos); // tell servo to go to position in variable 'pos'
delay(200); // waits 15 ms for the servo to reach the position
}
for (pos = 30; pos >= 0; pos -= 1) { // goes from 180 degrees to 0 degrees
myservo.write(pos); // tell servo to go to position in variable 'pos'
delay(200); // waits 15 ms for the servo to reach the position
}
}
Das einfachste wäre das Pendel frei mit seiner Resonazfrequenz schwingen zu lassen. Um eine Schwingungsdauer von 3 bis 4 Sekunden zu erhalten (0,3 bis 0,25 Hz) muß das Pendel aber etwas länger sein ( ca 2,2m bzw 4m) https://www.leifiphysik.de/mechanik/mechanische-schwingungen/grundwissen/fadenpendel
Andere Frequenzen müssen erzwungen werden und mittels Kraft realisiert werden.
Ein Servo ist da nicht optimal da die Auflösung zu gering ist und auch der sehr limitiert ist.
Vieleicht könnte ein Exzenter (Kurbelwelle) der mittels Hebel das Pendel bewegt die Lösung sein. Der Exzenter kann nach belieben in der Geschwindigkeit variert werden. Es genügt dann ein langsamer Gleichstrommotor oder gar ein 28byj-48.
Der physikalische Begriff "Pendel" mit seiner eigenen Resonanzfrequenz passt wohl nicht ganz.
Im Video sind an einer Achse zwei ausbalancierte (?) Dinger, die also mit relativ wenig Kraft bewegt werden können, wenn die Beschleunigung sich in Grenzen hält.
Dein Servo ist zu stark, die Übersetzung zwischen Servo-Winkel und Achsenwinkel zu direkt und die Pausen sind zu groß. Daher ruckelt es unschön.
Bei einem Servo kannst du mit der Standard-Library und der Methode writeMicroseconds Werte zwischen 1000 und 2000 vorgeben, wobei 1500 der Mittelstellung entspricht. Probiert mal, wieviel der +- 500 Schritte dein Servo kann. Dann, wie schnell die Schritte sein müssen, damit es nicht ruckelig aussieht, und -vor allem- wie du diese Bewegung auf dein "Pendel" überträgst, damit das weniger als 180° macht, was vermutlich dein Ziel ist.
Such mal nach Mobatools. Die sind ursprünglich für Modellbahn erfunden worden (daher der Name), können aber Schrittmotoren und Servos ansteuern mit vorgebbaren Beschleunigungsrampen.
Vielleicht ist das was für dich.
Das gilt für ein Fadenpendel. Das Zusammenspiel der trägen Masse mit der Gravitation bei einem Schwerpunkt des Ganzen ziemlich nah am Drehpunkt, hatten wir in der Schule aber auch nicht.
wie kann ich den die beiden Library kombinieren? Ein Mobatools Beispiel habe ich geöffnet und das braucht einen Taster. Am liebsten würde ich dem Script nur die Grad angeben. Da ich noch nicht viel in Richtung Programmierung gemacht habe, verstehe ich auch nur Grob was er macht.
#include <MobaTools.h>
/* Demo zum langsamen Bewegen eines Servos
* Die aktuelle Version der MoBatools erlaubt bis zu 16 Servos nur an beliebigen Pins
* Eine gleichzeitige Verwendung mit der Standard Servo Library des Arduino
* ist nicht möglich, da die gleichen HW-Komponenten verwendet werden.
* Die Aufrufe sind kompatibel zur Standard-Servo Library.
* zusätzliche Aufrufe:
* Servo2.setSpeed( wert ); Vorgabe der Geschwindigkeit. Je größer die Zahl, umso
* größer ist die Geschwindigkeit. Bei 0 (defaultwert)
* verhält das Servo sich wie bei der Standard Bibliothek
* byte = Servo2.moving(); gibt den noch verbleibenden Fahrweg in % vom gesamten
* Verfahrweg an. Bei 0 hat das Servo die Zielposition
* erreicht und steht.
* fehlende Aufrufe:
* writeMicroseconds() auch beim normalen write Aufruf können Microsekunden übergeben
* werden. Die Unterscheidung Winkel (0..180) und Mikrosekunden
* ( 700...2300 )ergibt sich aus dem Zahlenwert.
*
*/
// Die Taster müssen so angeschlossen sein, dass der Eingang bei gedrücktem
// Taster auf LOW (=0) geht.
const int tasterPin1 = 2; //Taster1 Pin 2
const int tasterPin2 = 3; //Taster2 Pin 3
const int servoPin = 9; // Anschluß für den Servo
// bei Werten, die sich im Programm nie verändern, sollte immer 'const' vorangestellt
// werden
bool tasterStatus1, tasterStatus2;
MoToServo meinServo;
void setup() {
pinMode(tasterPin1, INPUT_PULLUP); // so ist kein externer pullup Widerstand am
pinMode(tasterPin2, INPUT_PULLUP); // Taster erforderlich
meinServo.attach(servoPin); //Servo an Pin 9
meinServo.setSpeed( 5 ); // Verfahrgeschwindigkeit einstellen
}
void loop() {
tasterStatus1 = digitalRead(tasterPin1);
tasterStatus2 = digitalRead(tasterPin2);
if (tasterStatus1 == LOW) {
meinServo.write(40); //wird langsam drehen
delay(100);
}
if (tasterStatus2 == LOW) {
meinServo.write(120); //wird langsam drehen
delay(100);
}
delay(20);
}
Klar, aber die Abhängigkeit der Frequenz allein von der Pendel-Länge T = 2pi * sqrt(l/g) (Deine 4sec bei 4m) gilt halt nur, wenn die Masse unten am Pendel hängt und dieses nur eine kleine Auslenkung macht.
Probiere mal das Beispiel aus.
Hier muss noch ein Feinschliff für die Parameter Periodendauer, Amplitude und Bias für dein Pendelleuchten Projekt vorgenommen werden.
#include <Servo.h>
Servo myservo; // create servo object to control a servo
constexpr int ServoPin {7};
void setup()
{
myservo.attach(ServoPin);
}
void loop()
{
myservo.writeMicroseconds(1500 + 250.0 * sin(2.0 * 3.14 * (float)millis() / 3000.0));
}
Ich wünsche einen geschmeidigen Tag und viel Spass beim Programmieren in C++.