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

Πλακάκια πιάνου που παίζουν ρομπότ βραχίονα: 5 βήματα
Πλακάκια πιάνου που παίζουν ρομπότ βραχίονα: 5 βήματα

Βίντεο: Πλακάκια πιάνου που παίζουν ρομπότ βραχίονα: 5 βήματα

Βίντεο: Πλακάκια πιάνου που παίζουν ρομπότ βραχίονα: 5 βήματα
Βίντεο: Βασίλης Παντελεάκης | Ελλάδα Έχεις Ταλέντο | 06/11/2017 2024, Ιούλιος
Anonim
Πλακάκια πιάνου που παίζουν βραχίονα ρομπότ
Πλακάκια πιάνου που παίζουν βραχίονα ρομπότ

Η ομάδα αποτελείται από 2 Μηχανικούς Αυτοματισμού από το UCN, οι οποίοι έκαναν μια λαμπρή ιδέα που έχουμε κίνητρο να κάνουμε και να αναπτύξουμε. Η ιδέα βασίζεται σε έναν πίνακα Arduino που ελέγχει έναν ρομποτικό βραχίονα. Ο πίνακας Arduino είναι ο εγκέφαλος της λειτουργίας και στη συνέχεια ο ενεργοποιητής της λειτουργίας, ο βραχίονας Robotic, θα κάνει ό, τι χρειάζεται. Η πιο εμπεριστατωμένη εξήγηση θα έρθει αργότερα.

Βήμα 1: Εξοπλισμός

Εξοπλισμός
Εξοπλισμός

Βραχίονας ρομπότ:

Phantomx Pincher Robot Arm Kit Maek II (https://learn.trossenrobotics.com/38-interbotix-ro…)

Λογισμικό για το ρομπότ- https://www.arduino.cc/en/Main/OldSoftwareRelease… Κάμερα ανίχνευσης χρώματος:

CMUcam5 Pixy κάμερα - (https://charmedlabs.com/default/pixy-cmucam5/)

Λογισμικό - PixyMon (https://cmucam.org/projects/cmucam5/wiki/Install_PixyMon_on_Windows_Vista_7_8)

Βήμα 2: Ρύθμιση Arduino

Ρύθμιση Arduino
Ρύθμιση Arduino

Μπορείτε να δείτε τη ρύθμιση στον πίνακα εδώ, η οποία είναι πολύ εύκολη.

Αριστερά είναι το τροφοδοτικό.

Το μεσαίο είναι για το πρώτο σερβο, το οποίο αργότερα συνδέεται με τα άλλα σερβο, σερβο με σερβο.

Το κάτω μέρος είναι όπου ελέγχουμε την πλακέτα από υπολογιστή ή φορητό υπολογιστή, που έχει είσοδο USB στο άλλο άκρο.

Βήμα 3: Τελικό πρόγραμμα

||| ΠΡΟΓΡΑΜΜΑ |||

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

#include #include "poses.h" #include // Pixy Library #include

#define POSECOUNT 5

BioloidController bioloid = BioloidController (1000000);

const int SERVOCOUNT = 5; int id? int pos? boolean IDCheck; boolean RunCheck;

void setup () {pinMode (0, OUTPUT); ax12SetRegister2 (1, 32, 50); // ορίστε τον αριθμό αρμού 1 καταχωρητή 32 σε ταχύτητα 50. ax12SetRegister2 (2, 32, 50); // ρυθμίστε τον αριθμό αρμού 2 καταχωρητή 32 σε ταχύτητα 50. ax12SetRegister2 (3, 32, 50); // ρυθμίστε τον αριθμό αρμού 3 καταχωρητή 32 σε ταχύτητα 50. ax12SetRegister2 (4, 32, 50); // ορίστε τον αριθμό αρμού 4 καταχωρητή 32 σε ταχύτητα 50. ax12SetRegister2 (5, 32, 100); // ορίστε τον αριθμό αρμού 5 μητρώο 32 σε ταχύτητα 100. // αρχικοποίηση μεταβλητών id = 1; pos = 0; IDCheck = 1; RunCheck = 0; // άνοιγμα σειριακής θύρας Serial.begin (9600); καθυστέρηση (500)? Serial.println ("############################"); Serial.println ("Δημιουργήθηκε σειριακή επικοινωνία.");

// Έλεγχος τάσης μπαταρίας Lipo CheckVoltage ();

// Σάρωση Servos, επιστροφή θέσης MoveTest (); MoveHome (); MenuOptions (); RunCheck = 1; }

void loop () {// διαβάστε τον αισθητήρα: int inByte = Serial.read ();

διακόπτης (inByte) {

περίπτωση '1': MovePose1 (); Διακοπή;

περίπτωση '2': MovePose2 (); Διακοπή; περίπτωση '3': MovePose3 (); Διακοπή;

θήκη '4': MovePose4 (); Διακοπή;

θήκη '5': MoveHome (); Διακοπή; περίπτωση '6': Πιάσε (); Διακοπή;

θήκη '7': LEDTest (); Διακοπή;

θήκη '8': RelaxServos (); Διακοπή; }}

void CheckVoltage () {// περιμένετε, στη συνέχεια ελέγξτε την τάση (ασφάλεια LiPO) float voltage = (ax12GetRegister (1, AX_PRESENT_VOLTAGE, 1)) / 10.0; Serial.println ("############################"); Serial.print ("Τάση συστήματος:"); Serial.print (τάση)? Serial.println ("βολτ"); if (τάση 10,0) {Serial.println ("Ονομαστικά επίπεδα τάσης."); } if (RunCheck == 1) {MenuOptions (); } Serial.println ("############################"); }

άκυρο MoveHome () {καθυστέρηση (100); // συνιστώμενη παύση bioloid.loadPose (Αρχική σελίδα); // φορτώστε την πόζα από το FLASH, στο επόμενο προσωρινό buffer bioloid.readPose (); // ανάγνωση σε τρέχουσες θέσεις σερβο στην προσωρινή μνήμη curPose Serial.println ("############################"); Serial.println ("Μετακίνηση servos στην αρχική θέση"); Serial.println ("############################"); καθυστέρηση (1000)? bioloid.interpolateSetup (1000); // ρύθμιση για παρεμβολή από το τρέχον-> επόμενο πάνω από 1/2 του δευτερολέπτου ενώ (bioloid.interpolating> 0) {// κάντε αυτό ενώ δεν έχουμε φτάσει στη νέα μας στάση bioloid.interpolateStep (); // μετακινήστε servos, εάν είναι απαραίτητο. καθυστέρηση (3)? } if (RunCheck == 1) {MenuOptions (); }}

άκυρο MovePose1 () {καθυστέρηση (100); // συνιστώμενη παύση bioloid.loadPose (Pose1); // φορτώστε την πόζα από το FLASH, στο επόμενο προσωρινό buffer bioloid.readPose (); // ανάγνωση σε τρέχουσες θέσεις σερβο στην προσωρινή μνήμη curPose Serial.println ("############################"); Serial.println ("Μετακίνηση servos στην 1η θέση"); Serial.println ("############################"); καθυστέρηση (1000)? bioloid.interpolateSetup (1000); // ρύθμιση για παρεμβολή από το τρέχον-> επόμενο πάνω από 1/2 του δευτερολέπτου ενώ (bioloid.interpolating> 0) {// κάντε αυτό ενώ δεν έχουμε φτάσει στη νέα μας στάση bioloid.interpolateStep (); // μετακινήστε servos, εάν είναι απαραίτητο. καθυστέρηση (3)? } SetPosition (3, 291); // ρυθμίστε τη θέση της άρθρωσης 3 σε καθυστέρηση '0' (100), // περιμένετε να κινηθεί η άρθρωση εάν (RunCheck == 1) {MenuOptions (); }}

άκυρο MovePose2 () {καθυστέρηση (100); // συνιστώμενη παύση bioloid.loadPose (Pose2); // φορτώστε την πόζα από το FLASH, στο επόμενο προσωρινό buffer bioloid.readPose (); // ανάγνωση σε τρέχουσες θέσεις σερβο στην προσωρινή μνήμη curPose Serial.println ("############################"); Serial.println ("Μετακίνηση servos στη 2η θέση"); Serial.println ("############################"); καθυστέρηση (1000)? bioloid.interpolateSetup (1000); // ρύθμιση για παρεμβολή από το τρέχον-> επόμενο πάνω από 1/2 του δευτερολέπτου ενώ (bioloid.interpolating> 0) {// κάντε αυτό ενώ δεν έχουμε φτάσει στη νέα μας στάση bioloid.interpolateStep (); // μετακινήστε servos, εάν είναι απαραίτητο. καθυστέρηση (3)? } SetPosition (3, 291); // ρυθμίστε τη θέση της άρθρωσης 3 σε καθυστέρηση '0' (100), // περιμένετε να κινηθεί η άρθρωση εάν (RunCheck == 1) {MenuOptions (); }} void MovePose3 () {καθυστέρηση (100); // συνιστώμενη παύση bioloid.loadPose (Pose3); // φορτώστε την πόζα από το FLASH, στο επόμενο προσωρινό buffer bioloid.readPose (); // ανάγνωση σε τρέχουσες θέσεις σερβο στην προσωρινή μνήμη curPose Serial.println ("############################"); Serial.println ("Μετακίνηση servos στην 3η θέση"); Serial.println ("############################"); καθυστέρηση (1000)? bioloid.interpolateSetup (1000); // ρύθμιση για παρεμβολή από το τρέχον-> επόμενο πάνω από 1/2 του δευτερολέπτου ενώ (bioloid.interpolating> 0) {// κάντε αυτό ενώ δεν έχουμε φτάσει στη νέα μας στάση bioloid.interpolateStep (); // μετακινήστε servos, εάν είναι απαραίτητο. καθυστέρηση (3)? } SetPosition (3, 291); // ρυθμίστε τη θέση της άρθρωσης 3 σε καθυστέρηση '0' (100), // περιμένετε να κινηθεί η άρθρωση εάν (RunCheck == 1) {MenuOptions (); }}

άκυρο MovePose4 () {καθυστέρηση (100); // συνιστώμενη παύση bioloid.loadPose (Pose4); // φορτώστε την πόζα από το FLASH, στο επόμενο προσωρινό buffer bioloid.readPose (); // ανάγνωση σε τρέχουσες θέσεις σερβο στην προσωρινή μνήμη curPose Serial.println ("############################"); Serial.println ("Μετακίνηση servos στην 4η θέση"); Serial.println ("############################"); καθυστέρηση (1000)? bioloid.interpolateSetup (1000); // ρύθμιση για παρεμβολή από το τρέχον-> επόμενο πάνω από 1/2 του δευτερολέπτου ενώ (bioloid.interpolating> 0) {// κάντε αυτό ενώ δεν έχουμε φτάσει στη νέα μας στάση bioloid.interpolateStep (); // μετακινήστε servos, εάν είναι απαραίτητο. καθυστέρηση (3)? } SetPosition (3, 291); // ρυθμίστε τη θέση της άρθρωσης 3 σε καθυστέρηση '0' (100), // περιμένετε να κινηθεί η άρθρωση εάν (RunCheck == 1) {MenuOptions (); }}

void MoveTest () {Serial.println ("############################"); Serial.println ("Έναρξη δοκιμής σήματος κίνησης"); Serial.println ("############################"); καθυστέρηση (500)? id = 1; pos = 512; while (id <= SERVOCOUNT) {Serial.print ("Μετακίνηση Servo ID:"); Serial.println (id);

while (pos> = 312) {SetPosition (id, pos); pos = pos--; καθυστέρηση (10)? }

while (pos <= 512) {SetPosition (id, pos); pos = pos ++; καθυστέρηση (10)? }

// επανάληψη στο επόμενο σερβο ID id = id ++;

} if (RunCheck == 1) {MenuOptions (); }}

void MenuOptions () {Serial.println ("#############################"); Serial.println ("Εισαγάγετε την επιλογή 1-5 για να εκτελέσετε ξανά μεμονωμένες δοκιμές."); Serial.println ("1) 1η θέση"); Serial.println ("2) 2η θέση"); Serial.println ("3) 3η θέση"); Serial.println ("4) 4η θέση"); Serial.println ("5) Αρχική θέση"); Serial.println ("6) Έλεγχος τάσης συστήματος"); Serial.println ("7) Εκτέλεση δοκιμής LED"); Serial.println ("8) Relax Servos"); Serial.println ("############################"); }

void RelaxServos () {id = 1; Serial.println ("############################"); Serial.println ("Relaxing Servos."); Serial.println ("############################"); while (id <= SERVOCOUNT) {Relax (id); id = (id ++)%SERVOCOUNT; καθυστέρηση (50)? } if (RunCheck == 1) {MenuOptions (); }}

void LEDTest () {id = 1; Serial.println ("############################"); Serial.println ("Running LED Test"); Serial.println ("############################"); while (id <= SERVOCOUNT) {ax12SetRegister (id, 25, 1); Serial.print ("LED ON - Servo ID:"); Serial.println (id); καθυστέρηση (3000)? ax12SetRegister (id, 25, 0); Serial.print ("LED OFF - Servo ID:"); Serial.println (id); καθυστέρηση (3000)? id = id ++; } if (RunCheck == 1) {MenuOptions (); }}

void Grab () {SetPosition (5, 800); // ρυθμίστε τη θέση της άρθρωσης 1 σε καθυστέρηση '0' (100), // περιμένετε να κινηθεί η άρθρωση

}

Έχουμε βασίσει το πρόγραμμά μας στο πρόγραμμα κατασκευαστών PincherTest με μερικές σημαντικές τροποποιήσεις στην περίπτωση της τοποθέτησης. Χρησιμοποιήσαμε τις θέσεις.h για να έχει το ρομπότ τις θέσεις στη μνήμη. Αρχικά προσπαθήσαμε να δημιουργήσουμε το μπράτσο μας με το Pixycam να είναι αυτόματο, αλλά λόγω του φωτός και των μικρών προβλημάτων οθόνης, αυτό δεν θα μπορούσε να συμβεί. Το ρομπότ έχει μια βασική αρχική θέση, αφού ανεβάσει το πρόγραμμα, θα δοκιμάσει όλα τα servos που βρίσκονται στο ρομπότ. Έχουμε ορίσει τις θέσεις για τα κουμπιά 1-4, οπότε θα είναι εύκολο να το θυμάστε. Μη διστάσετε να χρησιμοποιήσετε το πρόγραμμα.

Βήμα 4: Οδηγός βίντεο

Βήμα 5: Συμπέρασμα

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

Συνιστάται: