Inhaltsverzeichnis:

Automatisierte Ballroller mit Arduino und einem Servo - Gunook
Automatisierte Ballroller mit Arduino und einem Servo - Gunook

Video: Automatisierte Ballroller mit Arduino und einem Servo - Gunook

Video: Automatisierte Ballroller mit Arduino und einem Servo - Gunook
Video: Lego Technic High Speed Jeep JUMP 2 2024, November
Anonim
Image
Image

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

Basis und Klappdeckelhalter herstellen
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

Machen Sie einen längeren Servoarm und befestigen Sie den Servo
Machen Sie einen längeren Servoarm und befestigen Sie den Servo
Machen Sie einen längeren Servoarm und befestigen Sie den Servo
Machen Sie einen längeren Servoarm und befestigen Sie den 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

Skizze laden und ausführen
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);

}

}

Empfohlen: