PDA

Επιστροφή στο Forum : arduino + l298n + analog joy



johnkoreli
04-04-20, 11:23
Καλησπέρα,
πρώτο μου ποστ στη κοινότητα, ελπίζω να μη κουράσω.
Μια μικρή εισαγωγή:
Προσπαθώ να φτιάξω ένα folow focus για την κάμερα μου.
Στην ουσία είναι ένα stepper προσαρμοσμενο στον φακό, που το ελέγχω με ένα αναλογικό joystick για να γυρίζω το focus του φακού χωρίς να επεμβαίνω με το χέρι μου και κουνιέται το πλάνο.

Αρχικά είχα κάνει δοκιμαστικά 3 στάδια ταχυτήτων ανάλογα τη θέση του joy. Και δούλευε κανονικά.
Έτσι αποφάσισα για να είναι πιο πρακτικό να το κάνω με map για να επιταχύνει αναλογικά.
και εκεί ήρθε το πρόβλημα.



#include <Stepper.h>


int xMap;
int vrx = A0;
int vrx_data = 0;

int steps = 32; // you can set to different values, 4, 8, 12,16,20,24,28 and 32
Stepper myStepper(steps, 8, 9, 10, 11);

void setup() {
Serial.begin(9600);
}

void loop() {


vrx_data = analogRead(vrx);

if ( (vrx_data > 490) && (vrx_data < 510) ) //τιμες οπου το joy ειναι στην αρχικη θεση
{
Serial.println("Stepper Motor Stopped");
}


if ( (vrx_data > 0) && (vrx_data < 489) ) //τιμες οπου το joy ειναι στην αριστερη θεση
{
xMap = map(vrx_data, 0,489, 450,0);
// myStepper.setSpeed(xMap);
// myStepper.step(+32);
Serial.println(xMap);
}


if ( (vrx_data > 511) && (vrx_data < 1024) ) //τιμες οπου το joy ειναι στην δεξια θεση
{
xMap = map(vrx_data, 511,1023, 0,450);
// myStepper.setSpeed(xMap);
// myStepper.step(-32);
Serial.println(xMap);
}


}


όσο το τσεκάρω στο serial monitor δουλεύουν όλα οκ. Η map φέρνει τιμές 0-450 και στις δυο μεριές του joy.
Μόλις βγάζω τα // για να το δω στη πράξη τι γίνεται, και παίζω με το joy παγώνει το monitor.
Πόσο μάλλον όταν συνδέω τον l298n με το stepper, με τα βίας υπακούει.

Αν βάλω εγώ τιμή για το speed δουλεύει κανονικότατα


if ( (vrx_data > 490) && (vrx_data < 510) )
{
Serial.println("Stepper Motor Stopped");
}

if (vrx_data > 510)
{
myStepper.setSpeed(450);
myStepper.step(+32);
}



Τι μπορεί να μου διαφεύγει? :confused1:
Ευχαριστώ για το χρόνο σας.

SProg
04-04-20, 11:58
Καλημέρα,

αν βάζεις εσύ μια σταθερή τιμή συνέχεια, ουσιαστικά είναι σα να μην την αλλάζεις ποτέ.

Δες μήπως ο ρυθμός ανανέωσης έχει κάποιο όριο.

johnkoreli
04-04-20, 12:17
ναι το είχα κάνει με 3 if δοκιμαστικά με σταθερές ταχύτητες για την κάθε μεριά. άλλα δεν ήταν πολύ πρακτικό.
Πως μπορώ να δω αν έχει όριο ο ρυθμός ανανέωσης? Δοκίμασα να βάλω μια delay μικρή αν εννοείς αυτό άλλα τα ίδια.



if ( (vrx_data > 0) && (vrx_data < 489) ) //τιμες οπου το joy ειναι στην αριστερη θεση
{
xMap = map(vrx_data, 0,489, 450,0);
myStepper.setSpeed(xMap);
myStepper.step(+32);
Serial.println(xMap);
delay(3);
}

Panoss
04-04-20, 12:46
Για δες πώς έχεις ορίσει την xMap και μήπως σε κάποιο σημείο (π.χ. στο myStepper.setSpeed(xMap)) παίρνει λάθος τιμή (λάθος τύπο).
π.χ. την έχεις ορίσει ως int και παίρνει τιμή float.
Η setSpeed τι τύπο 'περιμένει' να της στείλεις;

AΝ είναι αυτή (https://github.com/arduino-libraries/Stepper/blob/master/src/Stepper.h) η βιβλιοθήκη πρέπει να της περάσεις long:

void setSpeed(long whatSpeed);

nkarama
04-04-20, 12:46
Η map επιστέφει long. Ισως αυτό ενοχλεί της μέθοδο setSpeed. δοκίμασε να το κάνεις cast.


xMap = (int) map(vrx_data, 0, 489, 450, 0);

Για καλό και για κακό φτιάξε μια δική σου map για integers


int mymap(int x, int in_min, int in_max, int out_min, int out_max) {
return (x - in_min) * (out_max - out_min) / (in_max - in_min) + out_min;
}

johnkoreli
04-04-20, 13:50
Λοιπόν. αρχικά σας ευχαριστώ όλους για την άμεση απόκριση και τον χρόνο σας.
Έπεσε πατέντα. δε ξέρω πόσο σωστό είναι.
1. Αρχικά όρισα την xMap σε long στην αρχή, εφόσον θέλει long η setspeed.
2. μετά έφτιαξα την mymap με int αντί για long και είδα αρκετά μεγάλη βελτίωση στην απόκριση
3. επίσης κάτι που ξέχασα να αναφέρω είναι πως όταν οι τιμές του joy έπαιζαν 0-510, στην αριστερή θέση δηλαδή, όταν τερμάτιζε το joy για κάποιο λόγο σταματούσε το monitor να δίνει τιμές. Μόλις το άφηνα να επιστρέψει δούλευε κανονικά πάλι.
φαντάστηκα πως ίσως είναι bug(?) των τιμών(?) και όρισα το πεδίο της if απο -100 ως 489 και λύθηκε το πρόβλημα. κουλό?:blink: ναι ή όχι λύθηκε.
παρουσιάστηκε άλλο πρόβλημα όμως. στην δεξιά μεριά από 510 έως 1024 όταν πηγαίνω, ξαφνικά παγώνει το monitor και δε ξεκολλάει πότε.



#include <Stepper.h>


long xMap;
int vrx = A0;
int vrx_data = 0;
int mymap(int x, int in_min, int in_max, int out_min, int out_max) {
return (x - in_min) * (out_max - out_min) / (in_max - in_min) + out_min;}

int steps = 132; // you can set to different values, 4, 8, 12,16,20,24,28 and 32
Stepper myStepper(steps, 8, 9, 10, 11);

void setup() {
Serial.begin(9600);
pinMode(vrx , INPUT);

}

void loop() {


vrx_data = analogRead(vrx);
Serial.println(vrx_data);
if ( (vrx_data > 490) && (vrx_data < 539) ) //τιμες οπου το joy ειναι στην αρχικη θεση
{
Serial.println("Stepper Motor Stopped");
}


if ( (vrx_data >-100) && (vrx_data < 489) ) //τιμες οπου το joy ειναι στην αριστερη θεση
{
xMap = mymap(vrx_data, 0,489, 450,0);
myStepper.setSpeed(xMap);
myStepper.step(+32);
Serial.println(xMap);
}


if ( (vrx_data > 540) && (vrx_data < 1023) ) //τιμες οπου το joy ειναι στην δεξια θεση
{
xMap = mymap(vrx_data, 540,1023, 0,450);
myStepper.setSpeed(xMap);
myStepper.step(-32);
Serial.println(xMap);
}




}

nkarama
04-04-20, 14:06
μήπως σε κάποια απο τις άκρες του joystick βραχυκυκλώνεις κάτι?
Δεν δείχνεις την συνδεσμολογία?

johnkoreli
04-04-20, 14:12
το σκέφτηκα και εγώ, όποτε δοκίμασα να διαβάσω τις τιμές του joy κατευθείαν χωρίς συνθήκες και if.



void loop() {


vrx_data = analogRead(vrx);
Serial.println(vrx_data);

}


και δίνει κανονικά από 0 έως 1023

αν βραχυκύκλωνε κάπου δεν θα έβλεπα κουλά νούμερα? Έχω αρχίσει να καίγομαι

nkarama
04-04-20, 15:30
δεν μπορώ να σκεφτώ τίποτα για το πρόβλημα που έχεις, αλλά όσον αφορά τον κώδικά σου, έχε υπόψιν ότι για τις τιμές 489, 490, 539, 540 και 1023 ο κώδικας δεν θα κάνει τίποτα γιατί δεν περιλαμβάνονται σε κανένα if. Ασχετο με το θέμα που έχεις, αλλά επίκαιρο :)

johnkoreli
04-04-20, 15:58
σωστά θέλει "=", μικρο το κακό. Αλλά παραμένει το άλλο θέμα μυστήριο..
Μου φαίνεται ότι θα γυρίσω στην παλιά μπακάλικη λύση. Με 3 στάδια ταχυτήτων. Η map δε μας βοήθησε.
Ευχαριστώ για το χρόνο σας όλους!!

SProg
04-04-20, 16:26
3. επίσης κάτι που ξέχασα να αναφέρω είναι πως όταν οι τιμές του joy έπαιζαν 0-510, στην αριστερή θέση δηλαδή, όταν τερμάτιζε το joy για κάποιο λόγο σταματούσε το monitor να δίνει τιμές.


Αφου το 0 δε το περιλαμβάνεις στη συνθήκη ελέγχου...

johnkoreli
04-04-20, 16:39
Πολύ σωστά. Μπράβο. Έχω θολώσει κ δεν βλέπω βασικά πράγματα.

johnkoreli
04-04-20, 17:18
ΛΥΘΗΚΕ :thumbup:
Λοιπόν, 2 προβλήματα υπήρχαν τελικά και όχι ένα.
1. αρχικά η αριστερή μεριά που νόμιζα ότι τρέχει κανονικά, στην πράξη δεν άλλαζε την ταχύτητα του stepper ιδιαίτερα. Με μπέρδευαν οι τιμές του μόνιτορ γιατί έβλεπα ταυτόχρονα και το αποτέλεσμα της map και την τιμή του joy.
Στην ουσία η map έφερνε ψιλό κουλές τιμές από 380 μέχρι 450 αντί 0-450.
Το λάθος ήταν στην map. Μιας κ έχει πολλ/μους και διαιρέσεις λέω το out δε μπορεί να είναι ΙΝΤ. το γύρισα σε float και όλα καλά !!



int mymap(int x, int in_min, int in_max, float out_min, float out_max) {
return (x - in_min) * (out_max - out_min) / (in_max - in_min) + out_min;}



2ο. Πρόβλημα, απ ότι κατάλαβα "δυσκολευόταν" να φέρει τιμές κοντά στο 0. κάτι παίζει με μαθηματικά φαντάζομαι στην map.
Οπότε άλλαξα την κατώτερη ταχύτητα σε 80 μιας και είναι αρκετά αργή στην ουσία και πρακτικά κάνω τη δουλειά μου με το παραπάνω.
όποτε..



if ( (vrx_data >= 540) && (vrx_data <= 1023) ) //τιμες οπου το joy ειναι στην δεξια θεση
{
xMap = mymap(vrx_data, 540,1023, 80,450);
myStepper.setSpeed(xMap);
myStepper.step(-32);
Serial.println(xMap);
// Serial.println(vrx_data);


}


Υ.Γ. Ευχαριστώ τους nkarama (https://www.hlektronika.gr/forum/member.php?u=66054) και SProg (https://www.hlektronika.gr/forum/member.php?u=66340) για την διευκρίνηση των τιμών με το "=". Ήταν το έναυσμα να λύσω όλα τα υπόλοιπα. :thumbup1:

SProg
04-04-20, 19:11
Γενικά καλό είναι όπου υπάρχει IF να υπάρχει και ELSE. Ειδικά κατά την ανάπτυξη.