Inhaltsverzeichnis:
2025 Autor: John Day | [email protected]. Zuletzt bearbeitet: 2025-01-13 06:56
Dies ist ein einfaches kleines Arduino- und Servo-Projekt, das etwa zwei Stunden dauert. Es verwendet ein Servo, um ein Ende eines Glasdeckels anzuheben, um eine Stahlkugel um den Innenumfang zu drehen. Es ist selbststartend, kann die Geschwindigkeit ändern und kann zwei (oder mehr?) Bälle gleichzeitig drehen. Es macht Spaß zu bauen und zu arbeiten. Die Timing-Parameter können für wahrscheinlich noch schnellere Geschwindigkeiten gespielt werden. Ein paar Hall-Effekt-Sensoren mit einer magnetischen Kugel könnten verwendet werden, um sie zu einer intelligenteren Maschine zu machen, die die besten Parameter ermitteln kann.
Ich sollte erwähnen, dass jemand hier bei instructables.com eine anspruchsvollere Ballroller-Maschine hat:
Benötigte Materialien:
Arduino Uno (oder ein Arduino)
Servoschild (optional)
9g Servo
Glasdeckel
Stahl Ball
etwas Altholz
Schritt 1: Basis und Klappdeckelhalter herstellen
Die Basis ist nur ein Stück Holz, um das aufklappbare Holzstück zu montieren. Das aufklappbare Holz sollte größer sein als eine Glaskappe, die Sie verwenden werden und genügend Platz für die Scharniere und die Montage des Servos haben.
Ich habe kleine Plastik-RC-Flugzeugscharniere verwendet und sie einfach auf das aufklappbare Holz und die Basis geklebt.
Schritt 2: Machen Sie einen längeren Servoarm und befestigen Sie das Servo
Um einen längeren Servoarm zu machen, habe ich einfach ein 5 Zentimeter großes Stück Holz mit ein paar kleinen Schrauben und Muttern am Servoarm befestigt. Der Servoarm sollte sich in einem Winkel von 90 Grad auf dem Servo befinden, wenn er horizontal zur Basis ist.
Ich habe das Servo nur mit Heißkleber auf den aufklappbaren Holzhalter geklebt, aber ich habe festgestellt, dass das Servo den Heißkleber aufheizt und vom Holz loslässt, wenn Sie es länger als ein paar Minuten laufen lassen. Daher ist eine bessere Befestigungsmethode gewährleistet.
Schritt 3: Skizze laden und ausführen
Ich habe mein Servo mit einem Schild an Pin 7 befestigt, weil es einfach praktisch ist und sie nur ein paar Dollar kosten. Wenn Sie keine Abschirmung haben, befestigen Sie das Servosignalkabel an Pin 7 am Arduino, das rote Kabel an 5V am Arduino und das Massekabel an GND am Arduino. Das Arduino sollte genug Strom liefern, um das Servo zu betreiben. Ich verwende den Schirm, weil es einfach ist, eine externe Spannung nur für das Servo zu verwenden.
Hier ist die Skizze. Ich habe eine Servo-Geschwindigkeitsregler-Routine geschrieben, um die Geschwindigkeit des Servos zu ändern, da es wahrscheinlich bei voller Geschwindigkeit nicht gut funktioniert.
Sie können das TimingDelay ändern, um unterschiedliche Geschwindigkeiten des Ballrollens zu erzielen. Sie können auch den dritten Parameter der myServo()-Funktion ändern, um auch die Geschwindigkeit zu ändern.
//////////////////////////////////////////////// //////////////////////////////////////////////// ////////////// // erstellt von Jim Demello, Shangluo University, 2017
// Sie können diesen Code verwenden, manipulieren, tun, was Sie wollen, mein Name ist nicht erforderlich
// Diese Routine ermöglicht die Interpolation einer beliebigen Anzahl von Servos, fügen Sie einfach neue Zeilen hinzu, wenn die Anzahl der Servos 4. überschreitet
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////
#enthalten
Servo myservo1, myservo2; // Servo-Objekt erstellen, um ein Servo zu steuern
int servoRead (int servoNummer) {
int servoStrom;
if (servoNumber== 1) { ServoCurrent = myservo1.read (); }
if (servoNumber== 2) { ServoCurrent = myservo2.read (); }
Servostrom zurückgeben;
}
void servoWrite(int servoNumber, int offset) {
if (servoNumber==1) { myservo1.write (Offset); }
if (servoNumber==2) { myservo2.write (offset); }
}
void myServo(int newAngle, int angleInc, int incDelay, int servoNum) {
int curAngle;
if (servoNum== 1) {curAngle = myservo1.read(); }
if (servoNum== 2) {curAngle = myservo2.read(); }
if (curAngle < newAngle) {
for(int angle=curAngle;angle < newAngle;angle += angleInc) {
if (servoNum == 1) myservo1.write (Winkel);
if (servoNum == 2) myservo2.write(Winkel);
Verzögerung (incDelay); }
}
else if (curAngle > newAngle) {
for(int angle=curAngle;angle > newAngle;angle -= angleInc) {
if (servoNum == 1) myservo1.write (Winkel);
if (servoNum == 2) myservo2.write(Winkel);
Verzögerung (incDelay); }
}
}
void interpolate2Servos(int servo1, int servo1Position, int servo2, int servo2Position, int numberSteps, int timeDelay){
int servo1Strom, servo2Strom;
servo1Current = servoRead (servo1);
servo2Current = servoRead (servo2);
// Serial.print ("Servo3Pos und Strom"); Serial.print (servo3Position); Serial.print (" "); Serial.println (servo3Current);
// Serial.print ("Servo4Pos und Strom"); Serial.print (servo4Position); Serial.print (" "); Serial.println (servo4Current);
// Serial.print ("Servo5Pos und Strom"); Serial.print (servo5Position); Serial.print (" "); Serial.println (servo5Current);
// Serial.print ("Servo6Pos und Strom"); Serial.print (servo6Position); Serial.print (" "); Serial.println (servo6Current);
// Serial.println (" ");
int cOffset = (servo1Position - servo1Current); cOffset = abs(cOffset)/ZahlSchritte;
int dOffset = (servo2Position - servo2Current); dOffset = abs(dOffset)/ZahlSchritte;
int cOffsetTotal=0, dOffsetTotal=0;
cOffsetTotal = servo1Current;
dOffsetTotal = servo2Current;
für (int x=0; x
if (servo1Position > servo1Current) { cOffsetTotal = cOffsetTotal + cOffset; }
else { cOffsetTotal = cOffsetTotal - cOffset; }
if (servo2Position > servo2Current) { dOffsetTotal = dOffsetTotal + dOffset; }
else { dOffsetTotal = dOffsetTotal - dOffset; }
if (servo1Position != servo1Current) servoWrite(servo1, cOffsetTotal);
if (servo2Position != servo2Current) servoWrite(servo2, dOffsetTotal);
// Serial.print ("a und b Offset"); Serial.print (aOffsetTotal); Serial.print (" "); Serial.println (bOffsetTotal); Verzögerung(10);
Verzögerung (Zeitverzögerung);
} // Ende für
//////////////////////////////////////
// auf Modulo-Reste achten //
/////////////////////////////////////
if (servo1Position != servo1Current) servoWrite(servo1, servo1Position);
if (servo2Position != servo2Current) servoWrite(servo2, servo2Position);
}
int TimingDelay = 100;
int servoDelay = 100;
int degGap = 10;
// Dies ist der Anfangsgrad (muss kleiner als der Endgrad sein)
int degStart = 0;
// Dies ist der Endgrad (muss größer als der Startgrad sein)
int degEnd = 360;
//Dies ist der Kreisradius
int-Radius = 8;
Void-Setup ()
{
Serial.begin (9600);
Verzögerung (100);
myservo1.attach(7); // befestigt das Servo an Pin 7 an das Servoobjekt
myservo1.write(90);
myservo2.attach(8); // befestigt das Servo an Pin 8 an das Servoobjekt
myservo2.write(90);
Verzögerung (1000); // wartet, bis das Servo dort ankommt
interpolieren2Servos(1, 90, 2, 90, 10, 60); // neutral
Verzögerung (1000);
}
Leere Schleife () {
TimingDelay = 15; // arbeitet bei 10
Servoverzögerung = 4;
spin4();
//interpolieren2Servos(1, 90, 2, 90, 1, 60); // neutral
// Verzögerung (1000);
// beenden(0); // Programm pausieren - Reset drücken, um fortzufahren
}
Leere spin3() {
interpolieren2Servos(1, 90, 2, 110, 1, 60); // neutral
Verzögerung (Zeitverzögerung);
interpolieren2Servos(1, 90, 2, 80, 1, 60); // neutral
Verzögerung (Zeitverzögerung);
}
Leere spin2() {
// interpolieren2Servos (1, 80, 2, 90, 1, 50); // neutral
Verzögerung (Zeitverzögerung);
interpolieren2Servos(1, 80, 2, 80, 1, 60); // neutral
Verzögerung (Zeitverzögerung);
interpolieren2Servos(1, 110, 2, 80, 1, 60); // neutral
Verzögerung (Zeitverzögerung);
//interpolieren2Servos(1, 110, 2, 110, 1, 60); // neutral
Verzögerung (Zeitverzögerung);
}
Leere spin1() {
// int deg = (degStart / (180 / 3.14));
float deg = (degStart * 3,141592 / 180); // Grad in Bogenmaß umrechnen
Float xPos = 90 + (cos(Grad) * Radius);
// xPos = rund(xPos);
float yPos = 90 + (sin(deg) * Radius);
// yPos = rund(yPos);
Serial.print("degGap=");Serial.print(degGap);Serial.print("deg=");Serial.print(Grad);Serial.print("cos=");Serial.print(cos(deg));Serial.print(" degStart=");Serial.print(degStart);Serial.print("x=");Serial.print(xPos);Serial.print(" y=");Seriell. println(yPos);
// interpolate2Servos (1, xPos, 2, yPos, 1, servoDelay); // neutral
myservo1.write(xPos);
myservo2.write(yPos);
Verzögerung (Zeitverzögerung);
if (degStart >= degEnd) {
GradStart = 0;
if (GradGap > 180)
degGap = 180;
//GradGap = 0;
anders
degGap = degGap + 2;
degGap = degGap - 2;
// degStart = degStart +degGap;
}
degStart = degStart + degGap;
}
Leere spin4() {
for(int i=0; i<=360; i++){
Gleitkomma j = 20 * (cos ((3,14 * i)/180)) + 90;
Schwimmer k = 20 * (sin ((3.14 * i)/180)) + 90;
myservo1.write(j);
myservo2.write(k);
Serial.print (j);
Serial.print (", ");
Serial.println(k);
Verzögerung (100);
}
}