PDA

Επιστροφή στο Forum : Arduino + MPU6050



ΝΙΚ7
01-12-18, 17:34
Καλησπέρα και καλό μήνα σε όλους!

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

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

Ευχαριστώ!

gimbal code: https://gist.github.com/emretezcan/8c699b570d7b104f6d26345b484196f6

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

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

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

ΝΙΚ7
02-12-18, 12:11
Εχεις παραλειψει να του πεις τι να κανει οταν οι μοιρες ειναι αναμεσσα απο 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); και μένα με προβλημάτισε. Θα το ψάξω.