Προς το περιεχόμενο

Προτεινόμενες αναρτήσεις

Δημοσ.

Καλημέρα σε ολους και χρονια πολλα στους Δημητριους και στις Δημητρες. 

Θελω την βοηθεια σας γιατι απο ηλεκτρονικα καλα παω αλλα απο προγραμματισμο δεν το εχω.

Τι θελω να κανω? θελω να προγραμματισω το arduino να ελενχει την περιστροφη δυο τροχων και σε περιπτωση που βρισκει διαφορα πανω απο 10% να αναβει το led μεχρι η περιστροφη να επανελθει και στα σωστα επιπεδα. Μπορει να γινει αυτο? Η περιστροφη σε καθε τροχο θα ελεγχετε απο hall sensor.

Ευχαριστω για τον χρονο σας.

Δημοσ.

Δεν νομίζω να είναι κάτι δύσκολο? 

Ποιόν hall sensor?  έχεις κάποιο link?

Δεν εχω αποφασισει ακομα ποιον hall sensor θα χρησιμοποιησω. Αυτην τη στιγμη κανω καποιες δοκιμες με ποντεσιομετρα στην θεση των sensors στις αναλογικες εισοδους και εχω καταφερει να ελενξω το led σαν out οταν οι τιμες στα in δεν ειναι ιδια.

Βαζω των κωδικα αλλα δεν ξερω αν ειναι σωστος.

 

int led = 13;

// the setup routine runs once when you press reset:
void setup() {
  // initialize serial communication at 9600 bits per second:
pinMode(led, OUTPUT);  
Serial.begin(9600);
}
 
// the loop routine runs over and over again forever:
void loop() {
  // read the input on analog pin 0:
  // read the input on analog pin 1:
  int sensorValue = analogRead(A0);
  int sensorValue1 = analogRead(A1);
  if (sensorValue == sensorValue1){
  digitalWrite(ledPin, HIGH);
   }

  else { 

  digitalWrite(led, LOW);
    
  
 
  // print out the value you read:
  Serial.println(sensorValue);
  Serial.println(sensorValue1);
  
}
Δημοσ.

Μια χαρά μου φαίνετε ο κώδικάς σου, με μερικές παρατηρήσεις.

Εχε υπόψιν σου ότι το loop αυτό θα τρέξει κοντά στο 1 εκατομμύριο φορές το δευτερόλεπτο (λιγότερες θα τρέξει αλλά μικρή σημασία έχει)

 

Θα πρέπει να σκεφτείς λοιπόν, όταν θα διαβάζεις το output των hall πόσο γρήγοροι είναι και αυτοί. Αν δεν σε ενδιαφέρει τόσο μεγάλη ταχύτητα, τότε καλό (και αρκετά ασφαλές) είναι να βάζεις μια καθυστέριση στο loop. Γλυτώνεις απο πάρα πολλά προβλήματα...

 

Απέφυγε όπως ο διάολος το λιβάνι την χρήση της delay(). Χρησιμοποίησε καλύτερα μια μεταβλητή για να κρατάς των χρόνο που έτρεξε την τελευταία φορά το Loop και να μετράς τον χρόνο που πέρασε. ΠΧ.

int led = 13;
unsigned long lastRunTime = 0;
int sensorValue1 = 0;  //αν δηλώνεις τις μεταβλητές μέσα στο loop κάθε φορά που τρέχει θα μείνεις πολύ 
int sensorValue = 0;   // γρήγορα απο μνήμη λόγω fragmentation.
// the setup routine runs once when you press reset:
void setup() {
  // initialize serial communication at 9600 bits per second:
pinMode(led, OUTPUT);  
Serial.begin(9600);
}
 
// the loop routine runs over and over again forever:
void loop() {
    if (millis() - lastRunTime > 200) {
          // read the input on analog pin 0:
          // read the input on analog pin 1:
          sensorValue = analogRead(A0);
          sensorValue1 = analogRead(A1);
          if (sensorValue > (sensorValue1+(sensorValue1*0.1)) || sensorValue < (sensorValue1-(sensorValue1*0.1)) ) {  //Πολύ quick'n'dirty σίγουρα μπορείς να βρεις καλύτερη λύση
               digitalWrite(ledPin, HIGH); 
          }
          else { 
               digitalWrite(led, LOW);
    
  
 
          // print out the value you read:
          Serial.println(sensorValue);
          Serial.println(sensorValue1);
    lastRunTime = millis();   
    }  //Endif  
}
Δημοσ.

 

Μια χαρά μου φαίνετε ο κώδικάς σου, με μερικές παρατηρήσεις.

Εχε υπόψιν σου ότι το loop αυτό θα τρέξει κοντά στο 1 εκατομμύριο φορές το δευτερόλεπτο (λιγότερες θα τρέξει αλλά μικρή σημασία έχει)

 

Θα πρέπει να σκεφτείς λοιπόν, όταν θα διαβάζεις το output των hall πόσο γρήγοροι είναι και αυτοί. Αν δεν σε ενδιαφέρει τόσο μεγάλη ταχύτητα, τότε καλό (και αρκετά ασφαλές) είναι να βάζεις μια καθυστέριση στο loop. Γλυτώνεις απο πάρα πολλά προβλήματα...

 

Απέφυγε όπως ο διάολος το λιβάνι την χρήση της delay(). Χρησιμοποίησε καλύτερα μια μεταβλητή για να κρατάς των χρόνο που έτρεξε την τελευταία φορά το Loop και να μετράς τον χρόνο που πέρασε. ΠΧ.

int led = 13;
unsigned long lastRunTime = 0;
int sensorValue1 = 0;  //αν δηλώνεις τις μεταβλητές μέσα στο loop κάθε φορά που τρέχει θα μείνεις πολύ 
int sensorValue = 0;   // γρήγορα απο μνήμη λόγω fragmentation.
// the setup routine runs once when you press reset:
void setup() {
  // initialize serial communication at 9600 bits per second:
pinMode(led, OUTPUT);  
Serial.begin(9600);
}
 
// the loop routine runs over and over again forever:
void loop() {
    if (millis() - lastRunTime > 200) {
          // read the input on analog pin 0:
          // read the input on analog pin 1:
          sensorValue = analogRead(A0);
          sensorValue1 = analogRead(A1);
          if (sensorValue > (sensorValue1+(sensorValue1*0.1)) || sensorValue < (sensorValue1-(sensorValue1*0.1)) ) {  //Πολύ quick'n'dirty σίγουρα μπορείς να βρεις καλύτερη λύση
               digitalWrite(ledPin, HIGH); 
          }
          else { 
               digitalWrite(led, LOW);
    
  
 
          // print out the value you read:
          Serial.println(sensorValue);
          Serial.println(sensorValue1);
    lastRunTime = millis();   
    }  //Endif  
}

Ευχαριστω πολυ για την βοηθεια και τις πληροφοριες. Τωρα εχω προβλημα ομως για δυνατους λυτες. Ο καθε τροχος περιστρεφεται και δινει απο 10 εως 1500 παλμους ανα δευτερολεπτο αναλογα με την ταχυτητα της περιστροφης. Αυτο που θελω ειναι εκτος του να μπορω να μετρησω αυτους τους παλμους να μπορω και να τους συγκρινω ωστε να τους σεταρω και να ειναι ιδιοι. Η ανοχες σε αυτην τη φαση πρεπει να ειναι μεχρι +-10%

Ευχαριστω και παλι και περιμενω καθε βοηθεια γιατι στο ηλεκτρομηχανολογικο κομματι ειμαστε καλα αλλα απο κωδικα τζιφος.

Δημοσ.

Η λογική της σύγκρισης των στροφών είναι μέσα στον κώδικα παραπάνω (στο if)

 

Οταν αποφασίσεις τι hall sensor θα χρησιμοποιήσεις, τότε θα μπορούμε να ξέρουμε και πως θα μετρήσεις.

εννοείτε ότι μιλάμε για οτιδήποτε άλλο εκτός απο μεταλικούς δίσκους, σωστά?

 

Επίσης μιλάς για 1500 σαλ. και για 2 δίσκους. Θα πρέπει να είναι σχετικά compact ο κώδικας που μετράει τις στροφές, γιατί δεν θα μένουν και πολλοί κύκλοι στο ενδιάμεσο μεταξύ μιας περιστροφής για τις υπόλοιπες εντολές...

Δημιουργήστε ένα λογαριασμό ή συνδεθείτε για να σχολιάσετε

Πρέπει να είστε μέλος για να αφήσετε σχόλιο

Δημιουργία λογαριασμού

Εγγραφείτε με νέο λογαριασμό στην κοινότητα μας. Είναι πανεύκολο!

Δημιουργία νέου λογαριασμού

Σύνδεση

Έχετε ήδη λογαριασμό; Συνδεθείτε εδώ.

Συνδεθείτε τώρα
  • Δημιουργία νέου...