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

Βοήθεια με ένα μικρό Project Arduino και processing


NIKOsVAIO

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

Καλησπέρα σε όλους. Πριν μπω στο ψητό, να πω ότι είμαι τέρμα noob και παλεύω τώρα να κάνω αυτό που θα περιγράψω χωρίς γνώσεις κώδικα. Το λοιπόν. Έχω ένα Arduino Uno στο οποίο έχω πάνω ένα Sonar (HC-SR04). Αυτό που πρέπει να κάνω είναι να συνδέσω την processing με το Arduino ώστε να διαβάζει από το serial port του την τιμή σε centimeters (cm), και όταν κάποιος πλησιάσει το Sonar σε μια απόσταση που θα έχω ορίσει, να αρχίσει να παίζει ένα βίντεο που βρίσκεται στο pc μου. Αυτά που έχω καταφέρει μέχρι τώρα είναι τα εξής. 1) Το Sketch του Arduino που τρέχει το Sonar δείχνει οκ. Τρέχει κανονικά και μου δίνει τιμές ανάλογα με την απόσταση που κάτι βρίσκεται κοντά στο Sonar. 2) Κατέβασα μια library με codecs για την processing, και το sketch που ανοίγει μέσα στην processing έναν player και τρέχει το video από το path που θέλω τρέχει κανονικά. 3) Έχω ακόμα ένα sketch με το οποίο κατάφερα να βλέπω στο console της processing τις τιμές του serial port που δίνει το Arduino. Οπότε, θεωρητικά, αυτό που μου μένει είναι μπορέσω να πω στην processing να τρέξει το sketch με το video player όταν θα παίρνει τιμές από το Arduino μικρότερες των 100cm ας πούμε. Δηλαδή, όταν κάποιος πλησιάσει το sonar σε απόσταση ενός μέτρου, να αρχίσει να παίζει το video. Υπάρχει κάποιος να μου δώσει τα φώτα του ή να μου πει αν βλέπει κάτι λάθος στη λογική μου; Ευχαριστώ εκ των προτέρων για τον χρόνο σας.

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Δηλαδή, να έχεις σκάσει λεφτά να πάρειςArduino, το shield και τα καλώδια χωρίς να το έχεις ψάξει καθόλου και να έχεις ακριβώς αυτή την ιδέα; Έτσι;

Σόρρυ μπρο. Θα ήταν πιο έντιμο από μέρους σου να πεις: "Έχω μία εργασία, ποιος ψήνεται να μου την κάνει;"

1 λεπτό πριν, NIKOsVAIO είπε

Ακριβώς αυτό είναι. :-D

Δηλαδή, έχεις δει ότι τρώνε ψιλο-κράξιμο όσοι ζητάνε έτοιμες λύσεις και είπες να το αποκρύψεις.

Τι να πω...;

Καλή τύχη.

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Δημοσ. (επεξεργασμένο)
14 λεπτά πριν, Fortistis είπε

Δηλαδή, να έχεις σκάσει λεφτά να πάρειςArduino, το shield και τα καλώδια χωρίς να το έχεις ψάξει καθόλου και να έχεις ακριβώς αυτή την ιδέα; Έτσι;

Σόρρυ μπρο. Θα ήταν πιο έντιμο από μέρους σου να πεις: "Έχω μία εργασία, ποιος ψήνεται να μου την κάνει;"

Δηλαδή, έχεις δει ότι τρώνε ψιλο-κράξιμο όσοι ζητάνε έτοιμες λύσεις και είπες να το αποκρύψεις.

Τι να πω...;

Καλή τύχη.

Δεν είναι καθόλου έτσι. Δε ζήτησα σε κάποιον να μου κάνει κάτι έτοιμο. Αν είναι δυνατόν. Ο εξοπλισμός που χρησιμοποιώ παρέχεται από τη σχολή μου και η ιδέα αυτή βασίζεται σε προτροπή του καθηγητή μου. Γνωρίζει ότι δεν ξέρουμε κώδικα και προσπαθούμε να φέρουμε εις πέρας το project ψάχνοντας και μαθαίνοντας. Δεν είπα σε κανέναν να μου δώσει κάτι έτοιμο. Έχω δουλέψει όπως έγραψα στο να κάνω το arduino να τρέχει, να βρω τρόπο επικοινωνίας με την processing και να παίξω το video. Ζητώ τη βοήθεια όποιου είναι πρόθυμου να του δείξω τα scripts και να με βοηθήσει να καταλάβω αν η λογική που ακολουθώ είναι σωστή ώστε συνεργαστούν όλα αυτά. Δεν είμαι πληροφορική, ούτε είδα περί κραξίματος όπως λες. Πρώτη φορά μπαίνω σε αυτό το section του forum. Δε νομίζω ότι γράφω πουθενά να μου δώσει κανείς μια έτοιμη λύση. Δεν έχω ποστάρει καν τα scripts, πως θα γίνει αυτό; Δε γνωρίζω κώδικα και προσπαθώ να μάθω ο,τι μπορώ για να βγει αυτή η δουλειά. Βοήθεια ζήτησα.

Επεξ/σία από NIKOsVAIO
  • Like 1
Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Δημοσ. (επεξεργασμένο)
4 ώρες πριν, Fortistis είπε

Δηλαδή, να έχεις σκάσει λεφτά να πάρειςArduino, το shield και τα καλώδια χωρίς να το έχεις ψάξει καθόλου και να έχεις ακριβώς αυτή την ιδέα; Έτσι;

Σόρρυ μπρο. Θα ήταν πιο έντιμο από μέρους σου να πεις: "Έχω μία εργασία, ποιος ψήνεται να μου την κάνει;"

Δηλαδή, έχεις δει ότι τρώνε ψιλο-κράξιμο όσοι ζητάνε έτοιμες λύσεις και είπες να το αποκρύψεις.

Τι να πω...;

Καλή τύχη.

Γιατί πήρες από τα μούτρα τον φίλο? Κράξιμο τρώνε αυτοί που γράφουν την εκφώνηση και ζητάνε την λύση χωρίς καμία προσπάθεια.

Ο φίλος έγραψε αναλυτικά τι έχει κάνει , τι του έχει μείνει και η ερώτηση ήταν αν το πάει σωστά , δεν ζήτησε τπτ έτοιμο.

Μην τους βάζουμε όλους στο ίδιο καλάθι.

Λόγω devoxx θα τρέχω 2 μέρες , βάλε εδώ τον κώδικα να ρίξουμε μια ματιά

Επεξ/σία από tsofras
  • Like 1
Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Δημοσ. (επεξεργασμένο)
47 λεπτά πριν, tsofras είπε

Γιατί πήρες από τα μούτρα τον φίλο? Κράξιμο τρώνε αυτοί που γράφουν την εκφώνηση και ζητάνε την λύση χωρίς καμία προσπάθεια.

Ο φίλος έγραψε αναλυτικά τι έχει κάνει , τι του έχει μείνει και η ερώτηση ήταν αν το πάει σωστά , δεν ζήτησε τπτ έτοιμο.

Μην τους βάζουμε όλους στο ίδιο καλάθι

Σας παραθέτω αυτό που έχω αυτή τη στιγμή, για όποιον μπορεί να με βοηθήσει. 

Arduino Sketch για τον συγκεκριμένο αισθητήρα και την αποστολή δεδομένων στο serial port.

#include <NewPing.h>

#define TRIGGER_PIN  12  // Arduino pin tied to trigger pin on the ultrasonic sensor.
#define ECHO_PIN     11  // Arduino pin tied to echo pin on the ultrasonic sensor.
#define MAX_DISTANCE 200 // Maximum distance we want to ping for (in centimeters). Maximum sensor distance is rated at 400-500cm.

NewPing sonar(TRIGGER_PIN, ECHO_PIN, MAX_DISTANCE); // NewPing setup of pins and maximum distance.


void setup() {
  Serial.begin(115200); // Open serial monitor at 115200 baud to see ping results.
}

void loop() {
  delay(500);  // Wait 500ms between pings (about 2 pings/sec). 29ms should be the shortest delay between pings.
  unsigned int uS = sonar.ping(); // Send ping, get ping time in microseconds (uS).
  Serial.print("Ping: ");
  Serial.print(uS / US_ROUNDTRIP_CM); // Convert ping time to distance and print result (0 = outside set distance range, no ping echo)
  Serial.println("cm");
}

Και το script της processing, το οποίο παίρνει τις τιμές από το port του Arduino και προσπαθώ να το κάνω να παίξει με τον video player που φόρτωσα στην processing το video από το path στο pc μου, όταν λάβει από το port του Arduino μία τιμή μικρότερη του 100. Το πρόβλημα που αντιμετωπίζω αυτή τη στιγμή είναι ότι η τιμή που παίρνει το script είναι η τιμή που δηλώνω πάνω πάνω (val = 1000). Οπότε, για οποιαδήποτε τιμή βάζω από 0-100 στο val, αν πατήσω run, παίζει το βίντεο. Για οποιαδήποτε τιμή από 101 και πάνω δεν το παίζει. Εγώ θέλω να συμβαίνει ακριβώς αυτό, αλλά να μην παίρνει την τιμή που βάζω στο val. Να παίρνει όποια τιμή έχει το serial port του Arduino και να το κάνει αυτό. Όπως είπα δε ξέρω κώδικα και το παλεύω κομμάτι κομμάτι με google, tutorials και από forums για τέτοια πρότζεκτ κλπ. Αν κάποιος έχει να σχολιάσει, να προτείνει / διορθώσει κάτι για να πετύχω αυτό που περιγράφω, είμαι όλος αφτιά. Ευχαριστώ και πάλι για όποιον ασχοληθεί.

import processing.serial.*;
import processing.video.*;
Serial myPort;  // Create object from Serial class
int val = 1000;     // Data received from the serial port
String PATH = "D:\\nikos\\NIKOS\\VIDEOS\\Inside.Man.2006.1080p.BluRay.x264.anoXmous_.mp4";
Movie mov;

void setup() {
  size(1920, 816);
  frameRate(23.98);
  mov = new Movie(this, "PATH");
  mov.speed(1);
  mov.volume(30);

  String COM1 = Serial.list()[0]; //change the 0 to a 1 or 2 etc. to match your port
  myPort = new Serial(this, COM1, 115200);

  
}

void movieEvent(Movie m) {
  m.read();
}

void draw() {
  if ( myPort.available() > 0) {  // If data is available,
         try { 
            val = Integer.parseInt(myPort.readStringUntil('\n'));
         } catch (Exception ex) {
                   // decide what to do if input wasn't a number.
         }
         println(val);
  } 
  
  if (val <= 100) { //If the sensor detect object at less 100cm
    mov.play();
  }else{
    mov.pause();
  }

  image(mov, 0, 0, width, height);
}

 

Επεξ/σία από NIKOsVAIO
Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

2 λεπτά πριν, tsofras είπε

Οπότε θέλεις το val του sketch 2 να ισούται με το us του sketch 1 , σωστά? 

Προσπάθησε να κάνεις merge τα 2 sketches και εδώ είμαστε

Θεωρητικά ναι. Θέλω οι τιμές του Arduino να περνάνε στην processing. Αλλά τι εννοείς να τα κάνω merge? To 1o sketch του Arduino τρέχει ακριβώς όπως το βλέπεις και δίνει τιμές στο serial port. Όσο συμβαίνει αυτό λοιπόν, η processing θέλω να βλέπει το serial port του Arduino και να παίρνει την τιμή του. Έχω καταφέρει αυτή την επικοινωνία που περιγράφω. Δηλαδή, το sketch της processing βλέπει ότι το Arduino τρέχει και αναλόγως με το val παίζει ή όχι το βίντεο. Αν π.χ τραβήξω το Arduino από το pc, το sketch της processing δεν τρέχει. Εκεί που έχω σκαλώσει είναι να καταλάβει η processing την τιμή του Serial port του Arduino. Απ' ο,τι έχω καταλάβει με το ψάξιμο, το πρόβλημα είναι με το integer και το string κάπου. Δηλαδή δε μπορεί να πάρει σαν τιμή ακεραίου αυτά που βγαίνουν από το Arduino νομίζω, και τα βλέπει σαν strings. Φυσικά, όλα αυτά που σου λέω είναι με κάθε επιφύλαξη. Δε θέλω να σε μπερδέψω. Δε ξέρω αν καν βγάζω νόημα αυτή τη στιγμή. Το έχω κάψει λίγο... 

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

  • 2 εβδομάδες αργότερα...
Δημοσ. (επεξεργασμένο)

Στο loop του Arduino κάνεις το παρακάτω

Serial.print("Ping: ");
Serial.print(uS / US_ROUNDTRIP_CM); // Convert ping time to distance and print result (0 = outside set distance range, no ping echo)
Serial.println("cm");

Όμως στο draw της processing 

 try { 
            val = Integer.parseInt(myPort.readStringUntil('\n'));

Απ' ότι καταλαβαίνω η τιμή που θα έρθει στην processing είναι 

"Ping: 50cm" (π.χ. για uS / US_ROUNDTRIP_CM=50) 

Αυτό προφανώς δεν γίνεται parse σε integer

Δοκίμασε απ΄ τον Arduino να στέλνεις μόνο το Serial.print(uS / US_ROUNDTRIP_CM);

2 4 σημειώσεις:

1. Δεν ξέρω αν είναι καλό το parseInt, ίσως να θες να δοκιμάσεις με float ή double (δεν θυμάμαι τι types έχει η processing) σε περίπτωση που έχεις δεκαδικά.

2. Στο sketch της processing έχεις αυτό  readStringUntil('\n') , αλλά ο arduino δεν στέλνει ποτέ \n, οπότε ίσως θα πρέπει να κάνεις και ένα serial.prin("\n") μετά από κάθε print της τιμής που έχεις.

3. Το US_ROUNDTRIP_CM δεν βλέπω να το κάνεις κάπου define. Είναι στο NewPing.h?

4. Γενικά δες πρώτα απ' το serial του Arduino IDE τι τιμές σου βγάζει στα print. Ότι βλέπεις εκεί, αυτό διαβάζεις και στην processing

Επεξ/σία από tolhc1234
extra σημειώσεις
Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

  • 2 εβδομάδες αργότερα...
Στις 10/6/2018 στις 4:30 ΜΜ, tolhc1234 είπε

Στο loop του Arduino κάνεις το παρακάτω


Serial.print("Ping: ");
Serial.print(uS / US_ROUNDTRIP_CM); // Convert ping time to distance and print result (0 = outside set distance range, no ping echo)
Serial.println("cm");

Όμως στο draw της processing 


 try { 
            val = Integer.parseInt(myPort.readStringUntil('\n'));

Απ' ότι καταλαβαίνω η τιμή που θα έρθει στην processing είναι 

"Ping: 50cm" (π.χ. για uS / US_ROUNDTRIP_CM=50) 

Αυτό προφανώς δεν γίνεται parse σε integer

Δοκίμασε απ΄ τον Arduino να στέλνεις μόνο το Serial.print(uS / US_ROUNDTRIP_CM);

2 4 σημειώσεις:

1. Δεν ξέρω αν είναι καλό το parseInt, ίσως να θες να δοκιμάσεις με float ή double (δεν θυμάμαι τι types έχει η processing) σε περίπτωση που έχεις δεκαδικά.

2. Στο sketch της processing έχεις αυτό  readStringUntil('\n') , αλλά ο arduino δεν στέλνει ποτέ \n, οπότε ίσως θα πρέπει να κάνεις και ένα serial.prin("\n") μετά από κάθε print της τιμής που έχεις.

3. Το US_ROUNDTRIP_CM δεν βλέπω να το κάνεις κάπου define. Είναι στο NewPing.h?

4. Γενικά δες πρώτα απ' το serial του Arduino IDE τι τιμές σου βγάζει στα print. Ότι βλέπεις εκεί, αυτό διαβάζεις και στην processing

Φίλε μου σ'ευχαριστώ για τη βοήθεια. Το κατάφερα το πρότζεκτ, και το έχω ήδη ολοκληρώσει. :-D 

  • Like 1
Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

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

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

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

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

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

Σύνδεση

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

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