Πίνακας περιεχομένων:

Αυτοματοποιημένος κύλινδρος μπάλας με Arduino και One Servo: 3 βήματα
Αυτοματοποιημένος κύλινδρος μπάλας με Arduino και One Servo: 3 βήματα

Βίντεο: Αυτοματοποιημένος κύλινδρος μπάλας με Arduino και One Servo: 3 βήματα

Βίντεο: Αυτοματοποιημένος κύλινδρος μπάλας με Arduino και One Servo: 3 βήματα
Βίντεο: Pilates στο σπίτι - Στήριξη με μεγάλο κύλινδρο Pilates at home - Support with foam roller 2024, Ιούλιος
Anonim
Image
Image

Αυτό είναι ένα απλό μικρό έργο Arduino και servo που διαρκεί περίπου δύο ώρες για να ολοκληρωθεί. Χρησιμοποιεί ένα σερβο για να σηκώσει το ένα άκρο του καπακιού ενός βάζου έτσι ώστε να περιστρέψει μια χαλύβδινη μπάλα γύρω από την εσωτερική περιφέρεια. Ξεκινάει μόνος του, μπορεί να αλλάξει ταχύτητα και μπορεί να γυρίσει δύο (ή περισσότερες;) μπάλες ταυτόχρονα. Διασκεδαστικό να χτίζεις και να δουλεύεις. Οι παράμετροι χρονισμού μπορούν να παιχτούν με πιθανώς ακόμη μεγαλύτερες ταχύτητες. Μερικοί αισθητήρες φαινομένου αίθουσας με μαγνητική σφαίρα θα μπορούσαν να χρησιμοποιηθούν για να το κάνουν πιο έξυπνο μηχάνημα που μπορεί να βρει τις καλύτερες παραμέτρους.

Θα πρέπει να αναφέρω ότι κάποιος εδώ στο instructables.com έχει μια πιο εξελιγμένη μηχανή κυλίνδρων:

Χρειαζονται ΥΛΙΚΑ:

Arduino Uno (ή οποιοδήποτε Arduino)

Servo shield (προαιρετικό)

Σερβο 9γρ

καπάκι βάζου

χαλύβδινη μπάλα

λίγο ξύλο παλιοσίδερα

Βήμα 1: Φτιάξτε τη βάση και το μεντεσέ καπάκι

Βάση στήριξης με βάση και αρθρωτό καπάκι
Βάση στήριξης με βάση και αρθρωτό καπάκι

Η βάση είναι μόνο ένα κομμάτι ξύλου για να τοποθετήσετε το αρθρωτό κομμάτι ξύλου. Το μεντεσέ ξύλο πρέπει να είναι μεγαλύτερο από ένα καπάκι βάζου που θα χρησιμοποιήσετε και να έχει αρκετό χώρο για τους μεντεσέδες και για την τοποθέτηση του σερβο.

Χρησιμοποίησα μικρούς πλαστικούς μεντεσέδες rc αεροσκαφών και απλά τους κόλλησα με το μεντεσέ ξύλο και τη βάση.

Βήμα 2: Κάντε μακρύτερο βραχίονα σερβο και συνδέστε το σερβο

Κάντε μακρύτερο βραχίονα σερβο και συνδέστε το σερβο
Κάντε μακρύτερο βραχίονα σερβο και συνδέστε το σερβο
Φτιάξτε μακρύτερο βραχίονα σερβο και συνδέστε το σερβο
Φτιάξτε μακρύτερο βραχίονα σερβο και συνδέστε το σερβο

Για να φτιάξω ένα μακρύτερο σερβοβραχίονα, απλώς στερέωσα ένα κομμάτι ξύλου 5 εκατοστών στον βραχίονα σερβο, με μερικές μικρές βίδες και παξιμάδια. Ο βραχίονας σερβο πρέπει να είναι 90 μοίρες στο σερβο όταν είναι οριζόντιος στη βάση.

Μόλις κόλλησα ζεστά το σερβο στη βάση μεντεσέ ξύλου, αλλά διαπίστωσα ότι αν το αφήσετε να λειτουργήσει για περισσότερο από λίγα λεπτά, το σερβο θα ζεστάνει τη ζεστή κόλλα και θα το αφήσει από το ξύλο. Επομένως, μια καλύτερη μέθοδος προσάρτησης είναι εγγυημένη.

Βήμα 3: Φόρτωση και εκτέλεση σκίτσου

Φόρτωση και εκτέλεση σκίτσου
Φόρτωση και εκτέλεση σκίτσου

Έβαλα το σερβο μου στο pin 7 χρησιμοποιώντας ασπίδα γιατί είναι απλώς βολικό και κοστίζουν μόνο μερικά δολάρια. Εάν δεν έχετε ασπίδα, τότε συνδέστε το καλώδιο σήματος σερβο στην ακίδα 7 του Arduino, το κόκκινο καλώδιο στα 5v στο Arduino και το καλώδιο γείωσης στο GND στο Arduino. Το arduino πρέπει να παρέχει αρκετό ρεύμα για να λειτουργεί το σερβο. Χρησιμοποιώ την ασπίδα επειδή είναι εύκολο να χρησιμοποιήσω μια εξωτερική τάση μόνο για το σερβο.

Εδώ είναι το σκίτσο. Έγραψα μια ρουτίνα ελεγκτή ταχύτητας σερβο για να αλλάξω την ταχύτητα του σερβο γιατί πιθανότατα δεν θα λειτουργήσει καλά σε πλήρη ταχύτητα.

Μπορείτε να αλλάξετε το timingDelay για να έχετε διαφορετικές ταχύτητες κύλισης της μπάλας. Μπορείτε επίσης να αλλάξετε την τρίτη παράμετρο της συνάρτησης myServo () για να αλλάξετε επίσης ταχύτητα.

//////////////////////////////////////////////// //////////////////////////////////////////////// /////////////// // δημιουργήθηκε από τον Jim Demello, Πανεπιστήμιο Shangluo, 2017

// είστε ελεύθεροι να χρησιμοποιείτε, να χειρίζεστε, να κάνετε ό, τι θέλετε με αυτόν τον κωδικό, το όνομά μου δεν απαιτείται

// Αυτή η ρουτίνα επιτρέπει την παρεμβολή οποιουδήποτε αριθμού servos, απλώς προσθέστε νέες γραμμές εάν ο αριθμός των servos υπερβαίνει τα 4

//////////////////////////////////////////////////////////////////////////////////////////////////////////////////

#περιλαμβάνω

Servo myservo1, myservo2; // δημιουργία αντικειμένου σερβο για τον έλεγχο ενός σερβο

int servoRead (int servoNumber) {

int servoCurrent;

if (servoNumber == 1) {servoCurrent = myservo1.read (); }

if (servoNumber == 2) {servoCurrent = myservo2.read (); }

επιστροφή servoCurrent;

}

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 (); }

εάν (curAngle <newAngle) {

για (int angle = curAngle; angle <newAngle; angle += angleInc) {

εάν (servoNum == 1) myservo1.write (γωνία);

εάν (servoNum == 2) myservo2.write (γωνία);

καθυστέρηση (incDelay)? }

}

else if (curAngle> newAngle) {

για (int angle = curAngle; angle> newAngle; angle -= angleInc) {

εάν (servoNum == 1) myservo1.write (γωνία);

εάν (servoNum == 2) myservo2.write (γωνία);

καθυστέρηση (incDelay)? }

}

}

void interpolate2Servos (int servo1, int servo1Position, int servo2, int servo2Position, int numberSteps, int timeDelay) {

int servo1Current, servo2Current;

servo1Current = servoRead (servo1);

servo2Current = servoRead (servo2);

// Serial.print ("Servo3Pos and Current"); Serial.print (servo3Position); Serial.print (""); Serial.println (servo3Current);

// Serial.print ("Servo4Pos and Current"); Serial.print (servo4Position); Serial.print (""); Serial.println (servo4Current);

// Serial.print ("Servo5Pos and Current"); Serial.print (servo5Position); Serial.print (""); Serial.println (servo5Current);

// Serial.print ("Servo6Pos and Current"); Serial.print (servo6Position); Serial.print (""); Serial.println (servo6Current);

// Serial.println ("");

int cOffset = (servo1Position - servo1Current); cOffset = abs (cOffset)/numberSteps;

int dOffset = (servo2Position - servo2Current); dOffset = abs (dOffset)/numberSteps;

int cOffsetTotal = 0, dOffsetTotal = 0;

cOffsetTotal = servo1Current;

dOffsetTotal = servo2Current;

για (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 and b Offset"); Serial.print (aOffsetTotal); Serial.print (""); Serial.println (bOffsetTotal); καθυστέρηση (10)?

καθυστέρηση (timeDelay)?

} // τέλος για

//////////////////////////////////////

// φροντίστε τα υπολείμματα modulo //

/////////////////////////////////////

if (servo1Position! = servo1Current) servoWrite (servo1, servo1Position);

εάν (servo2Position! = servo2Current) servoWrite (servo2, servo2Position);

}

int timingDelay = 100;

int servoDelay = 100;

int degGap = 10;

// Αυτό είναι το πτυχίο εκκίνησης (πρέπει να είναι μικρότερο από το τελικό πτυχίο)

int degStart = 0;

// Αυτοί είναι οι βαθμοί λήξης (πρέπει να είναι μεγαλύτεροι από τον βαθμό εκκίνησης)

int degEnd = 360;

// Αυτή είναι η ακτίνα του κύκλου

int ακτίνα = 8;

void setup ()

{

Serial.begin (9600);

καθυστέρηση (100)?

myservo1.attach (7); // συνδέει το σερβο στο pin 7 στο σερβο αντικείμενο

myservo1.write (90);

myservo2.attach (8); // συνδέει το σερβο στο pin 8 στο σερβο αντικείμενο

myservo2.write (90);

καθυστέρηση (1000)? // περιμένει τον σερβο για να φτάσει εκεί

interpolate2Servos (1, 90, 2, 90, 10, 60); // ουδέτερο

καθυστέρηση (1000)?

}

void loop () {

timingDelay = 15; // λειτουργεί στις 10

servoDelay = 4;

spin4 ();

// interpolate2Servos (1, 90, 2, 90, 1, 60); // ουδέτερο

// καθυστέρηση (1000);

// έξοδος (0); // παύση προγράμματος - πατήστε επαναφορά για να συνεχίσετε

}

void spin3 () {

interpolate2Servos (1, 90, 2, 110, 1, 60); // ουδέτερο

καθυστέρηση (timingDelay)?

interpolate2Servos (1, 90, 2, 80, 1, 60); // ουδέτερο

καθυστέρηση (timingDelay)?

}

void spin2 () {

// interpolate2Servos (1, 80, 2, 90, 1, 50); // ουδέτερο

καθυστέρηση (timingDelay)?

interpolate2Servos (1, 80, 2, 80, 1, 60); // ουδέτερο

καθυστέρηση (timingDelay)?

interpolate2Servos (1, 110, 2, 80, 1, 60); // ουδέτερο

καθυστέρηση (timingDelay)?

// interpolate2Servos (1, 110, 2, 110, 1, 60); // ουδέτερο

καθυστέρηση (timingDelay)?

}

void spin1 () {

// int deg = (degStart / (180 / 3.14));

float deg = (degStart * 3.141592 / 180); // μετατροπή βαθμών σε ακτίνια

float xPos = 90 + (cos (deg) * radius);

// xPos = στρογγυλό (xPos);

float yPos = 90 + (sin (deg) * radius);

// yPos = στρογγυλό (yPos);

Serial.print ("degGap ="); Serial.print (degGap); Serial.print ("deg ="); Serial.print (deg); Serial.print ("cos ="); Serial.print (cos (deg)); Serial.print ("degStart ="); Serial.print (degStart); Serial.print ("x ="); Serial.print (xPos); Serial.print ("y ="); Serial println (yPos);

// interpolate2Servos (1, xPos, 2, yPos, 1, servoDelay); // ουδέτερο

myservo1.write (xPos);

myservo2.write (yPos);

καθυστέρηση (timingDelay)?

εάν (degStart> = degEnd) {

degStart = 0;

εάν (degGap> 180)

degGap = 180;

// degGap = 0;

αλλού

degGap = degGap + 2;

degGap = degGap - 2;

// degStart = degStart +degGap;

}

degStart = degStart + degGap;

}

void spin4 () {

για (int i = 0; i <= 360; i ++) {

float j = 20 * (cos ((3.14 * i)/180)) + 90;

float k = 20 * (sin ((3.14 * i)/180)) + 90;

myservo1.write (j);

myservo2.write (k);

Serial.print (j);

Serial.print (",");

Serial.println (k);

καθυστέρηση (100)?

}

}

Συνιστάται: