Εμφάνιση αποτελεσμάτων : 1 έως 3 από 3

Θέμα: Arduino + MPU6050

  1. #1
    Μέλος
    Όνομα
    ΝΙΚΟΣ
    Εγγραφή
    May 2011
    Περιοχή
    ΛΙΒΑΔΕΙΑ
    Μηνύματα
    128

    Προεπιλογή Arduino + MPU6050

    Καλησπέρα και καλό μήνα σε όλους!

    Θα ήθελα χρησιμοποιώντας τον αισθητήρα MPU6050 να κάνω το εξής:
    Ο αισθητήρας είναι τοποθετημένος εξ αρχής οριζόντια. Μόλις περιστραφεί στους άξονες Χ ή Υ πάνω από 60 ή -60 περίπου μοίρες, να δώσει εντολή να περιστραφούν κατά 90 μοίρες δύο σερβο (ανάλογα σε ποιόν άξονα έχουμε περιστροφή) και να παραμείνουν σε αυτή τη θέση τα σερβο.

    Βρήκα τον παρακάτω κώδικα σε ένα βίντεο του YouTube για την κατασκευή gimbal (τον πιο απλό που κατάφερα να βρω) και τον τροποποίησα. Επειδή δεν είμαι και πολύ σχετικός με τον προγραμματισμό μπορεί κάποιος να μου πει αν θα δουλέψει για το σκοπό που το θέλω; (δεν έχω ακόμα και το MPU6050 για να κάνω πειραματισμούς)

    Ευχαριστώ!

    gimbal code: https://gist.github.com/emretezcan/8...26345b484196f6

    Τροποποίηση:

    #include <SPI.h>
    #include <MPU6050.h>
    #include <Servo.h>


    MPU6050 ACC_GYR;
    int16_t accx, accy, accz;
    int16_t gyrx, gyry, gyrz;
    int deger ,deger2;
    int a=0;
    Servo s1,s2;


    void setup() {
    ACC_GYR.initialize();
    Serial.begin(9600);
    s1.attach(3);
    s2.attach(4);
    s1.write(a);
    s2.write(a);
    }


    void loop() {

    ACC_GYR.getMotion6(&accx, &accy, &accz, &gyrx, &gyry ,&gyrz);
    deger=map(accx,-17000,17000,0,179);
    deger2=map(accy,-17000,17000,0,179);
    if(deger>160){
    s1.write(90);
    }
    if(deger<30){
    s1.write(90);
    }
    if(deger2>160){
    s2.write(90);
    }
    if(deger2<30){
    s2.write(90);
    }
    }

    0 Not allowed! Not allowed!

  2. #2
    Μέλος
    Όνομα
    Ανδρέας
    Εγγραφή
    Oct 2008
    Περιοχή
    Πάτρα
    Μηνύματα
    518

    Προεπιλογή

    Εχεις παραλειψει να του πεις τι να κανει οταν οι μοιρες ειναι αναμεσσα απο 30 και 160... Τα σερβο δεν τα εχεις αρχικοποιησει στο setup σε καποια θεση οποτε ή θα παρουν καποια τυχαια θεση στην αρχη του προγραμματος ή θα συμπεριφερονται λες και τους εχεις κοψει το ρευμα (coasting) μεχρι το MPU να γυρισει πανω απο 160 ή κατω απο 90 μοιρες. Επίσης σε αυτη την βιβλιοθηκη του MPU που χρησιμοποιεις δεν ξερω αν η συνάρτηση ACC_GYR.getMotion6(&accx, &accy, &accz, &gyrx, &gyry ,&gyrz); που χρησιμοποιεις σου επιστρεφει οντως γωνίες ή επιταχυνσης της βαρυτητας που ειναι αλλο πραγμα. Ισως χρειαστει να "σμιξεις" με καποια μαθηματικά ή καποια ετοιμη βιβλιοθηκη τις μετρησεις του αξελερομετρου μαζι με του γυροσκοπιου για να παρεις γωνια σε μοιρες. Ψαξε λιγο για "Sensor fusion" Μπορεις να μπλεχτεις και αρκετα παραπανω με φιλτρα kalman και τετοιες ιστορίες αλλα το πιο πιθανο ειναι ολα αυτα να τα εχει ενσωματωμενα καπου η βιβλιοθηκη του χρησιμοποιεις και να στα δινει ετοιμα. Ψαξε λιγο το documentation για τη βιβλιοθηκη (#include <MPU6050.h>) που χρησιμοποιεις. Τα σχόλια μου καλοπροαιρετα παντα μην παρεξηγηθω

    0 Not allowed! Not allowed!

  3. #3
    Μέλος
    Όνομα
    ΝΙΚΟΣ
    Εγγραφή
    May 2011
    Περιοχή
    ΛΙΒΑΔΕΙΑ
    Μηνύματα
    128

    Προεπιλογή

    Παράθεση Αρχικό μήνυμα από andrewsweet4 Εμφάνιση μηνυμάτων
    Εχεις παραλειψει να του πεις τι να κανει οταν οι μοιρες ειναι αναμεσσα απο 30 και 160... Τα σερβο δεν τα εχεις αρχικοποιησει στο setup σε καποια θεση οποτε ή θα παρουν καποια τυχαια θεση στην αρχη του προγραμματος ή θα συμπεριφερονται λες και τους εχεις κοψει το ρευμα (coasting) μεχρι το MPU να γυρισει πανω απο 160 ή κατω απο 90 μοιρες. Επίσης σε αυτη την βιβλιοθηκη του MPU που χρησιμοποιεις δεν ξερω αν η συνάρτηση ACC_GYR.getMotion6(&accx, &accy, &accz, &gyrx, &gyry ,&gyrz); που χρησιμοποιεις σου επιστρεφει οντως γωνίες ή επιταχυνσης της βαρυτητας που ειναι αλλο πραγμα. Ισως χρειαστει να "σμιξεις" με καποια μαθηματικά ή καποια ετοιμη βιβλιοθηκη τις μετρησεις του αξελερομετρου μαζι με του γυροσκοπιου για να παρεις γωνια σε μοιρες. Ψαξε λιγο για "Sensor fusion" Μπορεις να μπλεχτεις και αρκετα παραπανω με φιλτρα kalman και τετοιες ιστορίες αλλα το πιο πιθανο ειναι ολα αυτα να τα εχει ενσωματωμενα καπου η βιβλιοθηκη του χρησιμοποιεις και να στα δινει ετοιμα. Ψαξε λιγο το documentation για τη βιβλιοθηκη (#include <MPU6050.h>) που χρησιμοποιεις. Τα σχόλια μου καλοπροαιρετα παντα μην παρεξηγηθω
    Σ ευχαριστώ για την απάντηση Ανδρέα!
    Σχετικά με την αρχικοποίηση των σερβο, τους δίνω τις μηδέν μοίρες στο void setup:
    s1.write(a);
    s2.write(a);
    Το a είναι int a=0

    Τα σερβο θέλω να περιστραφούν μόνο όταν υπάρξει γωνία εκτός των δύο ορίων (πχ πάνω από 60 ή κάτω από -60 μοίρες), τα 30 και 160 που δίνω σε σχέση με το map μάλλον δεν δίνουν τις 60 και -60 μοίρες τώρα που το βλέπω αλλά δεν με απασχολεί αυτό, αν δουλεύει ο κώδικας θα το ρυθμίσω στην πράξη.

    Στο ενδιάμεσο εύρος θέλω να είναι στην αρχική τους θέση που είναι 0 μοίρες. Αν αφήσω έτσι τον κώδικα και δεν χρησιμοποιήσω την else if , δεν θα παραμείνουν στις μηδέν μοίρες που του έδωσα στην αρχή;
    Αυτό για την συνάρτηση ACC_GYR.getMotion6(&accx, &accy, &accz, &gyrx, &gyry ,&gyrz); και μένα με προβλημάτισε. Θα το ψάξω.

    0 Not allowed! Not allowed!

Παρόμοια Θέματα

  1. Arduino help
    By alex17 in forum Μικροελεγκτές
    Απαντήσεις: 6
    Τελευταίο Μήνυμα: 07-03-17, 23:20
  2. arduino + sd
    By kostasmantzios in forum Μικροελεγκτές
    Απαντήσεις: 31
    Τελευταίο Μήνυμα: 26-03-16, 21:36
  3. Arduino
    By nickaris1 in forum Κυκλώματα για Η/Υ
    Απαντήσεις: 16
    Τελευταίο Μήνυμα: 30-10-14, 09:02
  4. arduino
    By chrisn in forum Μικροελεγκτές
    Απαντήσεις: 2
    Τελευταίο Μήνυμα: 27-06-12, 01:44
  5. Arduino
    By rch in forum Μικροελεγκτές
    Απαντήσεις: 11
    Τελευταίο Μήνυμα: 10-02-11, 17:50

Tags for this Thread

Δικαιώματα - Επιλογές

  • Δημιουργία θεμάτων: Όχι
  • Υποβολή μηνυμάτων: Όχι
  • Σύναψη αρχείων: Όχι
  • Επεξεργασία μηνυμάτων: Όχι
  •  
  • BB code: σε λειτουργία
  • Smilies: σε λειτουργία
  • [IMG]: σε λειτουργία
  • [VIDEO] code is σε λειτουργία
  • HTML: εκτός λειτουργίας