Πίνακας περιεχομένων:
2025 Συγγραφέας: John Day | [email protected]. Τελευταία τροποποίηση: 2025-01-13 06:57
Αυτό το Instructable θα σας δείξει πώς να φτιάξετε το δικό σας ρομπότ συνδεδεμένο στο Web (χρησιμοποιώντας μικροελεγκτή Arduino και Asus eee pc). Γιατί θα θέλατε ένα ρομπότ συνδεδεμένο στο Web; Για να παίξει φυσικά. Οδηγήστε το ρομπότ σας από όλο το δωμάτιο ή από τη χώρα, χρησιμοποιώντας τίποτα περισσότερο από το Skype και ένα πρόγραμμα περιήγησης ιστού (τίποτα για εγκατάσταση στον υπολογιστή ελέγχου). Μετά από αυτό? Εξερευνήστε το λογισμικό και προσαρμόστε το όπως θέλετε, προσθέστε ένα GPS, ώστε να μπορείτε να παρακολουθείτε πού οδηγείτε στο χάρτη, να προσθέτετε αισθητήρες θερμοκρασίας για να αντιστοιχίζετε κλίσεις θερμοκρασίας στο σπίτι σας ή αισθητήρες βυθομέτρου για να προσθέτετε στοιχεία ελέγχου σε αυτό που είστε στον ιστό Οι οδηγοί μπορούν και δεν μπορούν να συναντήσουν. Χαρακτηριστικά:
- Φθηνό - (~ 500 $ αν αγοράσετε όλα τα ανταλλακτικά καινούργια και σημαντικά φθηνότερα αν σκάψετε στον κάδο ανταλλακτικών σας)
- Για να τεθεί σε λειτουργία ο έλεγχος του ρομπότ απαιτεί μόνο ένα πρόγραμμα περιήγησης ιστού - (και Skype εάν θέλετε να δείτε πού οδηγείτε)
- Ανοικτού κώδικα και εύκολα προσαρμόσιμο - (χρησιμοποιεί μικροελεγκτή Arduino, Επεξεργασία για τον διακομιστή ιστού και όλο το λογισμικό μπορεί να εκτελεστεί σε Linux (όλος ο κώδικας σχολιάζεται επίσης για να διευκολύνει τη μετάβαση και την αλλαγή των πραγμάτων))
- Modular Design (όχι ένα ολοκληρωμένο σύστημα, αν θέλετε να χρησιμοποιήσετε μια διαφορετική υπηρεσία τηλεδιάσκεψης χωρίς να ανησυχείτε, ή εάν έχετε μια βασική σφραγίδα και όχι ένα Arduino απλώς διορθώστε ένα μικρό κομμάτι κώδικα και τοποθετήστε το)
Ακολουθεί ένα γρήγορο βίντεο με το ρομπότ που είναι συνδεδεμένο στο Web να απομακρύνεται από την κουζίνα.
Βήμα 1: Μέρη & εργαλεία
Απαιτούνται μόνο μερικά μέρη: Robot: Arduino Controlled Servo Robot - (SERB) ($ 175 @ oomlout.com) ή (φτιάξτε το δικό σας)
Ένα ρομπότ ανοιχτού κώδικα που χρησιμοποιεί έναν μικροελεγκτή Arduino ως εγκέφαλο
(μπορεί να χρησιμοποιηθεί οποιαδήποτε πλατφόρμα διπλού σερβο ρομπότ με arduino (επιλογή 1) (στείλτε μου μήνυμα αν ανακαλύψετε άλλες επιλογές) Υπολογιστής: Asus eee PC 4G ($ 280) (@Best Buy)
Ένα μικρό φθηνό φορητό υπολογιστή που είναι ιδανικό για αυτόν τον σκοπό
(μπορεί να χρησιμοποιηθεί οποιοσδήποτε φορητός υπολογιστής (ή επιτραπέζιος υπολογιστής εάν θέλετε να τρέξει με χορδή)) Μπορεί να χρησιμοποιηθεί Σκίτσα επεξεργασίας) Επιτραπέζιο φορητό υπολογιστή: Ακρυλικό Laser Cut ($ 25 (@ oomlout)) ή (δημιουργήστε το δικό σας βήμα 3)
Μερικά επιπλέον ακρυλικά κομμάτια που βιδώνουν σε ένα (SERB) για να του δώσουν ένα γραφείο για να κάθεται ο φορητός υπολογιστής
Ξηροί καρποί και μπουλόνια: (διατίθεται στο σπίτι αποθήκη)
- Βίδα 3mm x 10mm (x4)
- Βίδα 3mm x 15mm (x4)
- Παξιμάδι 3mm (x8)
Βήμα 2: Κοπή Κομματιών & Συναρμολόγηση
Υπάρχουν τρεις επιλογές για την απόκτηση κομματιών για το γραφείο του φορητού υπολογιστή σας. Κοπή Επιλογή 1: (Αγορά από το oomlout.com)
κομμάτια γραφείου κοπής λέιζερ και το απαραίτητο υλικό είναι διαθέσιμα από το oomlout για $ 25 (εδώ)
Επιλογή 2: (Κοπή στον δικό σας κόφτη λέιζερ ή Ponoko.com)
- Κατεβάστε το παρακάτω αρχείο (03-WEBB-Ακρυλικά μέρη. Cdr ή 03-WEBB-Ακρυλικά μέρη (Ponoko P2).eps)
- Κόψτε τα από ακρυλικό 3mm (1/8 ")
Επιλογή 3: (Scroll Saw)
- Κατεβάστε το μοτίβο κύλισης κύλισης από κάτω (03-WEBB-ScrollSaw Pattern (A4).pdf (για χαρτί μεγέθους Α4) ή 03-WEBB-ScrollSaw Pattern (γράμμα).pdf (για χαρτί μεγέθους γραμμάτων))
- Ελέγξτε ξανά ότι δεν έχει κλιμακωθεί κατά την εκτύπωση (μετρώντας τους εκτυπωμένους χάρακες)
- Κολλήστε σε ένα κομμάτι ακρυλικού 3mm (1/8 ") και κόψτε τα κομμάτια.
Συναρμολόγηση: Κατεβάστε τον οδηγό συναρμολόγησης (04-WEBB-Assembly Guide.pdf) παρακάτω και τοποθετήστε το γραφείο του φορητού υπολογιστή μαζί.
Βήμα 3: Λογισμικό - (Arduino)
Για τους νέους στο Arduino, δείτε τον υπέροχο οδηγό έναρξης στο Arduino.cc Αρχικά, ξεκινήστε το λογισμικό που λειτουργεί στο Arduino. Είναι ένα πολύ απλό πρόγραμμα, αυτό που κάνει το Arduino είναι η παρακολούθηση της σειριακής θύρας δεδομένων. Αυτό που αναζητά είναι μια συνομιλία μήκους 5 byte.
- Byte 1-3 (Ελέγξτε τα bytes "AAA")
- Byte 4 Command (Λέει στο arduino τι να κάνει) (Υποστηριζόμενες εντολές 'F' - Forward, 'B' - Backward, 'L' - Left, 'R' - Right, 'S' - Speed, 'X' - SetSpeedLeft, "Y" - SetSpeedRight, "C" - Stop)
- Byte 5 Parameter - Για τις εντολές μετακίνησης αυτό ερμηνεύεται ως χρονικό διάστημα (Παράμετρος * 100 ms) και για τις εντολές ταχύτητας ένα ποσοστό από 0-100
Ο κώδικας σχολιάζεται διεξοδικά και δεδομένου αυτού του πλαισίου, η προσθήκη πρόσθετων εντολών θα πρέπει να είναι εύκολη. Για λήψη:
- Κατεβάστε το συνημμένο αρχείο zip. (05-WEBB-Arduino Code.zip)
- Αποσυμπιέστε στον κατάλογο Arduino Sketch. (προεπιλογή: Τα έγγραφά μου / Arduino)
- Ανοίξτε το περιβάλλον ανάπτυξης arduino και ανεβάστε το στο Arduino σας.
Για αντιγραφή και επικόλληση
- Αντιγράψτε τον κωδικό από κάτω.
- Επικολλήστε στο περιβάλλον ανάπτυξης του Arduino.
- Ανεβάστε στο Arduino σας.
Παράρτημα: Το πρόγραμμα Arduino
/ * * Arduino Controlled Web Connected Robot (WEBB) - Serial Host * Για περισσότερες λεπτομέρειες επισκεφθείτε: https://www.oomlout.com/serb * * Συμπεριφορά: Το Arduino ακούει τη σειριακή θύρα του για μια εντολή * σε μορφή 254, 88, 88, (COMMAND), (TIME) * Υποστηριζόμενες εντολές - & aposF & apos - 70 - Forward * & aposB & apos - 66 - Backward * & aposL & apos - 76 - Left * & aposR & apos - 82 - Right * & aposS & apos - 83 - Speed * & aposX & aposL - 88 - SetS * & aposY & apos - 89 - SetSpeedRight * & aposC & apos - 67 - Διακοπή * Υποστηριζόμενοι χρόνοι - 0 - 255 (0 έως 25,5 δευτερόλεπτα) τιμή * 100 χιλιοστά του δευτερολέπτου * sp * Καλωδίωση: Δεξί σήμα σερβομηχανισμού - καρφίτσα 9 * Αριστερό σήμα σερβομηχανισμού - καρφίτσα 10 * * Άδεια: Αυτό το έργο έχει άδεια σύμφωνα με το Creative Commons * Attribution-Share Alike 3.0 Unported License. Για * προβολή αντιγράφου αυτής της άδειας, επισκεφτείτε την ιστοσελίδα * https://creativecommons.org/licenses/by-sa/3.0/ * ή στείλτε ένα γράμμα στο Creative Commons, 171 Second * Street, Suite 300, San Francisco, California 94105, * ΗΠΑ. * */// ------------------------------------------------- --------------------) #define FORWARD 70 // F#define BACKWARD 66 // B#define LEFT 76 // L#define RIGHT 82 // R#define SETSPEED 83 // S#define STOP 67 // C#define SETSPEEDLEFT 88 // X #define SETSPEEDRIGHT 89 // Y/ *Τα τρία byte ελέγχου (χρησιμοποιούνται για να εμποδίζουν το ρομπότ να αποκρίνεται σε τυχαία σειριακά *δεδομένα) επί του παρόντος "AAA" */#define checkByte1 65 // "A" #define checkByte2 65 // "A "#define checkByte3 65 //" A "// ------------------------------------------ ---------------------------- #define LEFTSERVOPIN 10 // Ο ακροδέκτης του αριστερού σερβο είναι συνδεδεμένος στο#define RIGHTSERVOPIN 9 // Ο ακροδέκτης του δεξιού σερβο είναι συνδεδεμένος στοServo leftServo; Servo rightServo; int leftSpeed = 50; // κρατά την ταχύτητα των ρομπότ leftServo // ποσοστό μεταξύ 0 και 100int δεξιάSpeed = 100; // κρατάει σωστά την ταχύτητα των ρομπότServo // ποσοστό μεταξύ 0 και 100 // ΤΕΛΟΣ ΑΡΝΤΟΥΝΙΟΥ ΕΛΕΓΧΟΥΜΕΝΟΥ ΣΕΡΒΟ ΡΟΜΠΟΤ (ΣΕΡΒ) ΠΡΟΑΙΡΕΤΙΚΟ // ------------------- ------------------------------------------------------ ----- // Εγκαθιστά τα πάντα και τρέχειvoid setup () {Serial.begin (9600); // Ξεκινά τη σειριακή θύρα serbSetup (); // ορίζει την κατάσταση όλων των απαραίτητων // καρφιτσών και προσθέτει servos στο σκίτσο σας} // Ο κύριος βρόχος loopvoid του προγράμματος () {serbPollSerialPort (); // κοιτάζει συνεχώς στη σειριακή θύρα // αν υπάρχουν δεδομένα τα επεξεργάζεται} // ------------------------------ ------------------------------------ * * Επεξεργάζεται τις εντολές που παραδίδονται στη σειριακή θύρα arduino & aposs */void serbPollSerialPort () {int dta; // μεταβλητή για να κρατήσει το σειριακό byte εάν (Serial.available ()> = 5) {// εάν 5 byte βρίσκονται στο buffer (μήκος pf ένα πλήρες αίτημα) dta = Serial.read (); if (dta = checkByte1) {// Έλεγχος byte πρώτου ελέγχου dta = Serial.read (); if (dta = checkByte2) {// Έλεγχος byte δεύτερου ελέγχου dta = Serial.read (); if (dta = checkByte3) {// Έλεγχος για τρίτο byte ελέγχου εντολή int = Serial.read (); // Τέταρτο byte είναι η εντολή int param1 = Serial.read (); // Το πέμπτο byte είναι param1 interpretCommand (εντολή, param1); // στέλνει το αίτημα ανάλυσης σε αυτό & aposs handler}}}}}/ * * Παίρνει την εντολή και την παράμετρο και τα μεταφέρει στο ρομπότ */void interpretCommand (int command, int param1) {if (command == FORWARD) {goForward (); καθυστέρηση (param1 * 100)? goStop ();} // if forward else if (command == BACKWARD) {goBackward (); καθυστέρηση (param1 * 100). goStop ();} // αν προς τα πίσω else if (εντολή == ΑΡΙΣΤΕΡΑ) {goLeft (); καθυστέρηση (param1 * 100). goStop ();} // αν μείνει αλλού εάν (εντολή == ΔΕΞΙΑ) {goRight (); καθυστέρηση (param1 * 100). goStop ();} // εάν δεξιά αλλού εάν (εντολή == SETSPEED) {setSpeed (param1);} // εάν ρυθμίζετε την ταχύτητα else if (εντολή == STOP) {goStop ();} // εάν σταματήσετε αλλού εάν (εντολή == SETSPEEDLEFT) {setSpeedLeft (param1);} // εάν ρυθμίζετε την αριστερή ταχύτητα else if (εντολή == SETSPEEDRIGHT) {setSpeedRight (param1);} // εάν ορίζετε τη σωστή ταχύτητα else {// εάν η μη αναγνωρισμένη εντολή κάντε μια μικρή αναλαμπή πήγαινε αριστερά(); καθυστέρηση (150)? πήγαινε δεξιά(); καθυστέρηση (150)? goStop (); }} // -------------------------------------------------- -------------------- οι συμπεριλαμβανόμενες ρουτίνες*/void serbSetup () {setSpeed (leftSpeed)? pinMode (LEFTSERVOPIN, OUTPUT); // ορίζει την αριστερή καρφίτσα σερβο σήματος // στην έξοδο pinMode (RIGHTSERVOPIN, OUTPUT). // ρυθμίζει το δεξιό pin του σερβο σήματος // στην έξοδο leftServo.attach (LEFTSERVOPIN). // επισυνάπτει αριστερό σερβο rightServo.attach (RIGHTSERVOPIN); // επισυνάπτει δεξί servo goStop ();}/ * * ορίζει την ταχύτητα του ρομπότ μεταξύ 0- (διακοπή) και 100- (πλήρης ταχύτητα) * ΣΗΜΕΙΩΣΗ: η ταχύτητα δεν θα αλλάξει την τρέχουσα ταχύτητα πρέπει να αλλάξετε την ταχύτητα * και καλέστε έναν των μεθόδων μετά την αλλαγή.*/ void setSpeed (int newSpeed) {setSpeedLeft (newSpeed); // ρυθμίζει την αριστερή ταχύτητα setSpeedRight (newSpeed); // ορίζει τη σωστή ταχύτητα}/ * * Ορίζει την ταχύτητα του αριστερού τροχού */void setSpeedLeft (int newSpeed) {if (newSpeed> = 100) {newSpeed = 100;} // εάν η ταχύτητα είναι μεγαλύτερη από 100 // κάντε το 100 if (newSpeed = 100) {newSpeed = 100;} // αν η ταχύτητα είναι μεγαλύτερη από 100 // κάντε 100 αν (newSpeed <= 0) {newSpeed = 0;} // εάν η ταχύτητα είναι μικρότερη από 0 κάντε // it 0 rightSpeed = newSpeed * 0,9; // κλιμακώνει την ταχύτητα να είναι}/ * * στέλνει το ρομπότ προς τα εμπρός */void goForward () {leftServo.write (90 + leftSpeed); rightServo.write (90 - rightSpeed);} / * * στέλνει το ρομπότ προς τα πίσω * /void goBackward () {leftServo.write (90 - leftSpeed); rightServo.write (90 + rightSpeed);} / * * στέλνει το ρομπότ δεξιά * /void goRight () {leftServo.write (90 + leftSpeed); rightServo.write (90 + rightSpeed);}/ * * στέλνει το ρομπότ αριστερά */void goLeft () {leftServo.write (90 - leftSpeed); rightServo.write (90 - rightSpeed);}/ * * σταματά το ρομπότ */void goStop () {leftServo.write (90); rightServo.write (90);} // END OF ARDUINO CONTROLLED SERVO ROBOT (SERB) ROUTINES // ---------------------------- ---------------------------------------------------
Βήμα 4: Λογισμικό - Φορητός υπολογιστής ρομπότ (WebServer)
(Η επεξεργασία είναι μια γλώσσα προγραμματισμού ανοιχτού κώδικα και περιβάλλον με την οποία μπορείτε να ξεκινήσετε. Για περισσότερες λεπτομέρειες επισκεφτείτε την Επεξεργασία) Το λογισμικό που λειτουργεί στο φορητό υπολογιστή ρομπότ είναι επίσης αρκετά απλό. Είναι ένας μάλλον υποτυπώδης διακομιστής ιστού (ακρόαση αιτημάτων ιστοσελίδων από πρόγραμμα περιήγησης ιστού), μια μικρή διεπαφή χρήστη (για ρύθμιση) και διευκολύνσεις για τη μεταφορά των εντολών που λαμβάνονται από τον διακομιστή Web στο Arduino. Γρήγορη εγκατάσταση: (στα παράθυρα)
- Κατεβάστε το αρχείο zip παρακάτω (06-WEBB-Processing Webserver (windows exe).zip)
- Αποσυμπιέστε το και εκτελέστε το αρχείο.exe (_WEBB_WebServer_RobotComputer.exe)
Για επεξεργασία κατά την επεξεργασία:
- Κατεβάστε το αρχείο zip παρακάτω (06-WEBB-Processing Webserver (αρχεία προέλευσης).zip)
- Αποσυμπιέστε οπουδήποτε στον υπολογιστή σας.
- Ανοίξτε το περιβάλλον επεξεργασίας και ανοίξτε (_WEBB_WebServer_RobotComputer.pde)
Να δοκιμάσω:
- Εκτελέστε το πρόγραμμα.
- Στο πλαίσιο #1 θα υπάρχει μια λίστα με τις διαθέσιμες θύρες comm στον υπολογιστή σας (κάντε κλικ σε αυτήν με την οποία είναι συνδεδεμένο το Arduino σας. θύρα comm)
- Στο πλαίσιο #2 δοκιμάστε για να δείτε αν το Arduino σας είναι συνδεδεμένο. Κάντε κλικ σε ένα από τα βέλη και ελπίζουμε ότι το ρομπότ σας θα κινηθεί στην κατεύθυνση που έχει κάνει κλικ για μισό δευτερόλεπτο.
- Στο πλαίσιο #3 κάντε κλικ στο κουμπί "Έναρξη" για να ξεκινήσετε τον διακομιστή ιστού.
- Ανοίξτε ένα πρόγραμμα περιήγησης ιστού (στο φορητό υπολογιστή ρομπότ) και επισκεφτείτε τη διεύθυνση https://127.0.0.1:12345/ControlPage.html (ελπίζουμε ότι θα εμφανιστεί η ιστοσελίδα ελέγχου με τα κουμπιά πάνω της) -Λεπτομέρειες σχετικά με τον τρόπο χρήσης αυτής της σελίδας στο επόμενο βήμα -
Τι συμβαίνει:
- Ο διακομιστής Web ακούει τη θύρα 12345 για αιτήματα http (αυτό που αποστέλλεται όταν πληκτρολογείτε μια διεύθυνση ιστοσελίδας)
- Υπάρχουν δύο τύποι αιτημάτων στα οποία απαντά.
1. Ακούει το "ControlPage.html" και θα στείλει τον ιστότοπο ελέγχου 2. Ακούει αιτήματα της φόρμας "/request? Command = F & param1 = 100" (αυτές οι εντολές αναλύονται και αποστέλλονται στο Arduino (αυτό το παράδειγμα θα είχε ως αποτέλεσμα στο ρομπότ που προχωρά για 10 δευτερόλεπτα) Προσάρτημα: (Ο κωδικός για τον διακομιστή Web)
/ * * Arduino Controlled Web Connected Robot (WEBB) - Webserver * Για περισσότερες λεπτομέρειες επισκεφθείτε: https://www.oomlout.com/serb * * Συμπεριφορά: Το πρόγραμμα ακούει για http (ιστοσελίδα) αιτήματα με τη μορφή * "/αίτημα ? command = F & param1 = 100 "και στη συνέχεια τα περνάει στο * Arduino * Υποστηριζόμενες εντολές - & aposF & apos - 70 - Forward * & aposB & apos - 66 - Backward * & aposL & apos - 76 - Left * & aposR & apos - 82 - Right * & aposS & apos - 83 - Speed * & aposX & apos - 88 - SetSpeedLeft * & aposY & apos - 89 - SetSpeedRight * & aposC & apos - 67 - Stop * param1 & aposs - 0 - 255 (0 έως 25,5 δευτερόλεπτα) τιμή * 100 χιλιοστά του δευτερολέπτου * * εξυπηρετεί επίσης την ιστοσελίδα ελέγχου στο πρόγραμμα περιήγησης εάν ζητάτε ControlPage.html * * Λειτουργία: 1. Κάντε κλικ στη θύρα Comm στο οποίο είναι συνδεδεμένο το Arduino * 2. Χρησιμοποιήστε τα δοκιμαστικά κουμπιά για να δείτε αν το arduino σας ακούει * (θα κινηθεί προς την κατεύθυνση που έγινε κλικ για μισό δευτερόλεπτο) * 3. Κάντε κλικ στο κουμπί Έναρξη και ο διακομιστής ιστού σας θα να ακούτε αιτήματα * * * Άδεια: Αυτό το έργο έχει άδεια βάσει του Creative Commons * Attribu tion-Share Alike 3.0 Unported License. Για * προβολή αντιγράφου αυτής της άδειας, επισκεφτείτε την ιστοσελίδα * https://creativecommons.org/licenses/by-sa/3.0/ * ή στείλτε ένα γράμμα στο Creative Commons, 171 Second * Street, Suite 300, San Francisco, California 94105, * ΗΠΑ. * */import processing.serial. *; // εισαγωγή της σειριακής βιβλιοθήκης για χρήση Serial (για συνομιλία με το Arduino) εισαγωγή επεξεργασίας.net.*; // εισαγωγή της δικτυακής βιβλιοθήκης για χρήση διακομιστή (για συνομιλία στο διαδίκτυο)/ * Σειρές μεταβλητές σχετικών σειρών */int serialPortIndex = -1; // το ευρετήριο της σειριακής θύρας που χρησιμοποιούμε στο Serial.list () listString commOptions; // Μια μεταβλητή για αποθήκευση της Serial.list (), ώστε να μην χρειάζεται να κάνετε δημοσκόπηση // τις σειριακές θύρες κάθε φορά που θέλουμε να την αναφέρουμε (η ψηφοφορία προκαλεί // άλμα στα servos του arduino) Serial serialPort; // Κάνει τη σειριακή θύρα να διευθύνεται σε όλο αυτό το σκίτσο/ * Γραμματοσειρά σχετιζόμενη με μεταβλητές γραφικών και απόδοσης */γραμματοσειρά PFont. // καθιστά τη γραμματοσειρά δημόσια, οπότε πρέπει να φορτωθεί μόνο μία φορά (Arial-72)/ * Μεταβλητές που σχετίζονται με το δίκτυο */διακομιστής wServer. // Ο διακομιστής που χειρίζεται τη θύρα διαδικτυακών αιτήσεων = 12345; // Η θύρα που ακούει ο διακομιστής σε κύκλοCount = 0; // Μετράει τον αριθμό των φορών που εκτελείται ο βρόχος σχεδίασης (χρησιμοποιείται για να // ζωντανέψει το κείμενο "σε λειτουργία") * * Utility Variables */PImage bg; // Η εικόνα φόντου αυτήν τη στιγμή / WEBB-background.png/ * * Σχετικές μεταβλητές με κουμπιά * (τα κουμπιά εφαρμόζονται πολύ τραχιά, τα πλαίσια οριοθέτησης αποθηκεύονται και τα γραφικά και το κείμενο * σχεδιάζονται στην εικόνα φόντου) δηλ. η μετακίνηση των μεταβλητών κουμπιών δεν θα μετακινήσει την εμφάνιση των κουμπιών */Button comm1. Κουμπί comm2; Κουμπί comm3; Κουμπί comm4; // Τα κουμπιά για να επιλέξετε τη σωστή σειριακή θύραΚουμπί επάνω; Κουμπί δεξιά? Κουμπί αριστερά. Πλήκτρο προς τα κάτω; // Τα κουμπιά κατεύθυνσης για να ελέγξετε εάν το ρομπότ ανταποκρίνεταιButton webServer. // Το κουμπί για την εκκίνηση του webServer/ * * ορίζει τα πάντα */void setup () {frameRate (5); // Επιβραδύνει λίγο το σκίτσο, ώστε να μην είναι τόσο επιβαρυντικό για το σύστημα bg = loadImage ("WEBB-background.png"); // Φορτώνει το μέγεθος της εικόνας φόντου (αποθηκευμένο στο φάκελο σκίτσων) (700, 400). // Ορίζει το μέγεθος του παραθύρου σκίτσου font = loadFont ("ArialMT-72.vlw"); // Φορτώνει τη γραμματοσειρά που θα χρησιμοποιήσουμε μέσω αυτού του σκίτσου commOptions = Serial.list (); // Δημοσκοπεί τις σειριακές θύρες και λαμβάνει μια λίστα με τις διαθέσιμες θύρες // (κάνοντας αυτό μόνο μία φορά εμποδίζει το ρομπότ να στριφογυρίζει κάθε φορά που ερωτάται η σειριακή θύρα) defineButtons (); // Ορίζει τα πλαίσια οριοθέτησης για κάθε φόντο κουμπιού (bg). // Ζωγραφίζει την εικόνα φόντου (αυτή η εικόνα έχει όλα τα γραφικά κουμπιών)}/ * Ο σκιαγραφεί τον κύριο βρόχο */void draw () {if (cycleCount == 0) {//- ρουτίνες κλήσης κλήσης drawCommBox (); // Σχεδιάζει τα χημικά στο Comm Box (πλαίσιο 1) drawTestBox (); // Σχεδιάζει όλα τα στοιχεία στο πλαίσιο ελέγχου (πλαίσιο 2) drawWebServerBox (); // Σχεδιάζει όλα τα στοιχεία στο WebServer Box (πλαίσιο 3)} //- ρουτίνες εργασίας κλήσεων pollWebServer (); // Δημοσκοπεί τον διακομιστή ιστού για να διαπιστώσει εάν έχουν υποβληθεί αιτήματα μέσω του δικτύου} // ------------------------------ ---------------------------------------------- // Έναρξη της σχεδιάστε ρουτίνες (χωρίστε μόνο για να κάνετε τον κώδικα πιο όμορφο στην ανάγνωση)/ * * Η ρουτίνα ενημέρωσης κλήρωσης (εκτελείται κάθε κύκλος) για στοιχεία στο πλαίσιο comm (πλαίσιο 1) */void drawCommBox () {fill (0, 0, 0) ? // Ορίστε τη συμπλήρωση σε μαύρο textFont (γραμματοσειρά, 15). // Ορίστε τη γραμματοσειρά στο σωστό μέγεθος για (int i = 0; i 0) {running = running + ".";} // ο αριθμός των κουκκίδων βασίζεται στο cycleCount if ((cycleCount /1)> 1) { τρέξιμο = τρέξιμο + ".";} if ((cycleCount / 1)> 2) {running = running + ".";}} if ((cycleCount / 1)> 3) {cycleCount = 0;} κείμενο (τρέξιμο, 520, 210); } cycleCount ++; // Κάθε φορά μέσω του κύκλουCount αυξάνεται κατά ένα} // Τέλος ρουτίνας σχεδίασης // ------------------------------- ------------------------------ // ------------------ ---------------------------------------------- // Ρουτίνες έναρξης υπηρεσίας/ * * mousePressed καλείται κάθε φορά που πατάτε το ποντίκι αυτό * ελέγχει αν το ποντίκι βρίσκεται μέσα σε κάποιο από τα πλαίσια οριοθέτησης κουμπιών * και εάν είναι η κατάλληλη ρουτίνα ονομάζεται */void mousePressed () {if (comm1.pressed ()) { updateSerialPort (0);} // Αλλαγές στη θύρα comm στο ευρετήριο 0 στο Serial.list () αλλιώς αν (comm2.pressed ()) {updateSerialPort (1);} // Αλλαγές στη θύρα comm στο ευρετήριο 1 στο Serial.list () else if (comm3.pressed ()) {updateSerialPort (2);} // Αλλαγές στη θύρα comm στο ευρετήριο 2 στο Serial.list () αλλιώς αν (comm4.pressed ()) {updateSerialPort (3);} // Αλλαγές στη θύρα comm στο ευρετήριο 3 στο Serial.list () αλλιώς αν (up.pressed ()) {sendRobotCommand ("F", 5);} // Στέλνει μια εντολή για μετακίνηση του ρομπότ προς τα εμπρός για 0,5 δευτερόλεπτα άλλο εάν (left.pressed ()) {sendRobotCommand ("L", 5);} / /Στέλνει μια εντολή για να μετακινήσετε το ρομπότ Αριστερά για 0,5 δευτερόλεπτα αλλού εάν (right.pressed ()) {sendRobotCommand ("R", 5);} // Στέλνει μια εντολή για να μετακινήσετε το ρομπότ Δεξιά για 0,5 δευτερόλεπτα αλλού εάν (κάτω) πατημένο ()) {sendRobotCommand ("B", 5);} // Στέλνει μια εντολή για μετακίνηση του ρομπότ προς τα πίσω για 0,5 δευτερόλεπτα αλλιώς εάν (webServer.pressed ()) {startWebServer ();} // Εκκινήσει τον κύκλο webServerCount = 0; φόντο (bg)? // Επαναβαφίζει την εικόνα φόντου (αυτή η εικόνα έχει όλα τα γραφικά κουμπιών) σχεδιάστε ();}/ * * Καλείται μία φορά εκτέλεσης ελέγχει τον διακομιστή για να δει αν υπάρχουν συνδέσεις αναμονής * εάν υπάρχει σύνδεση αναμονής που τραβάει έξω το αίτημα και το περνάει στη ρουτίνα parseRequest (String) * για να αφαιρέσει επιπλέον κείμενο. Στη συνέχεια, αυτό αποστέλλεται στη ρουτίνα interpretRequest (String) για να * καλέσει την κατάλληλη ρουτίνα ενεργειών (δηλ. Να στείλει οδηγίες στο ρομπότ).* * Ένα αίτημα διαβιβάζεται με την εισαγωγή της διεύθυνσης και της θύρας υπολογιστών σε πρόγραμμα περιήγησης ιστού * Για τοπικό μηχάνημα "https://127.0.0.1:12345/request?command=F¶m1=100" * * Παράδειγμα Αιτήματος: * GET/αίτημα; εντολή = F & param1 = 100 HTTP/1.1 * User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; el-US) AppleWebKit/525.19 (KHTML, όπως το Gecko) * Αποδοχή: * // * * Αποδοχή-Γλώσσα: en-US, el * Accept-Charset: ISO-8859-1, *, utf-8 * Accept-Encoding: gzip, deflate, bzip2 * Host: 127.0.0.1:12345 * Σύνδεση: Keep-Alive * * Παράδειγμα απάντησης (για επεξεργασμένο αίτημα) * HTTP/1.1 200 OK * Σύνδεση: κλείσιμο * Τύπος περιεχομένου: κείμενο/html * * εντολή: F param1: 100 */void pollWebServer () {if (wServer! = null) {// Εάν ο webServer εκτελείται Client request = wServer.available (); // Φορτώστε τον επόμενο Πελάτη στη σειρά στον // διακομιστή (null αν δεν υπάρχουν αιτήματα σε αναμονή) εάν (request! = Null) {// εάν υπάρχει διαδικασία αιτήματος το String fullRequest = request.readString (); // Αποθήκευση περιεχομένου αιτήματος ως συμβολοσειρά String ip = request.ip (); // Αποθηκεύστε τη διεύθυνση IP των πελατών ως συμβολοσειρά String requestString = parseRequest (fullRequest.toUpperCase ()); // Αφαιρέστε όλες τις επιπλέον // πληροφορίες αφήνοντας μόνο τη συμβολοσειρά αιτήματος (κείμενο μετά το GET) // (μετατοπίζεται στο πεζό για να διευκολύνει τη δοκιμή συμβολοσειράς) εάν (requestString.indexOf ("REQUEST?")! = -1) { // Ελέγχει εάν το αίτημα έχει "REQUEST?" String reply = interpretRequest (requestString); // Αποστέλλει το αίτημα στο αίτημα διερμηνέα request.write ("HTTP/1.1 200 OK / nΣύνδεση: κλείσιμο / nΠεριεχόμενο-τύπος: text/html / n / n" + απάντηση); // Στέλνει στην απάντηση ένα 200 για να πει ότι το αίτημα // χειρίστηκε και τη συμβολοσειρά "απάντηση" ως απάντηση wServer.disconnect (αίτημα). // Αποσυνδέει τον Πελάτη} αλλού εάν (requestString.indexOf ("CONTROLPAGE")! = -1) {// Εάν το αίτημα αφορά την ιστοσελίδα ελέγχου String webPageArray = loadStrings ("WEBB -ControlPage.html"); // Φορτώνει την ιστοσελίδα ελέγχου από / data / WEBB-ControlPage.html // (φορτώνεται ως συστοιχία γραμμών) Ιστοσελίδα συμβολοσειράς = ""; // Για να διευκολυνθεί η επεξεργασία, η ιστοσελίδα έχει μείνει με // διακοπή γραμμών, έτσι για βρόχο σβήνει αυτές τις γραμμές για (int i = 0; i portIndex) {// εάν το portIndex που έχει περάσει είναι έγκυρος κατάλογος στο Serial.list () // (δηλ. όχι η επιλογή τρεις σε μια λίστα δύο) serialPortIndex = portIndex; // ορίστε τη μεταβλητή serialPortIndex στο νέο ευρετήριο σειριακής θύρας // (αυτό χρησιμοποιείται για την εμφάνιση της κουκκίδας δίπλα στην ενεργή θύρα)} if (serialPortIndex! = -1) {// ελέγξτε για να βεβαιωθείτε ότι μια θύρα έχει επιλεγεί κάποια στιγμή πριν (serialPort! = null) {serialPort.stop ();} // εάν χρησιμοποιείται ήδη μια σειριακή θύρα σταματήστε την πριν φορτώσετε μια νέα serialPort = νέα Serial (αυτή, Serial.list () [serialPortIndex], 9600); // Δημιουργήστε ένα νέο σειριακό αντικείμενο για επικοινωνία με το Arduino 9600 Baud}}/ * * Παίρνει μια συμβολοσειρά αιτήματος (π.χ.: "request? Command = F & param1 = 100") και θα αφαιρέσει την εντολή * και param1 και θα την περάσει στο arduino (η προσθήκη επιπλέον παραμέτρων ή εντολών μη arduino θα γινόταν εδώ) */String interpretRequest (String requestString) {String returnValue = "OK"; // Ετοιμάζει μια εντολή μεταβλητής returnValue String. // Οι επόμενες τρεις γραμμές εξάγουν την τιμή μετά το "command =" // (η επιπλέον γραμμή είναι σε περίπτωση που η παράμετρος εντολής βρίσκεται στο // τέλος του αιτήματος και δεν ακολουθείται από ένα & if (requestString.indexOf ("COMMAND =")! = -1) {command = requestString.substring (requestString.indexOf ("COMMAND =") + "COMMAND =". Length ());} else {command = "Z";} if (command.indexOf (" & ")! = -1) {command = command.substring (0, command.indexOf (" & "));} else {command = command;} String param1String; // Οι επόμενες τρεις γραμμές εξάγουν την τιμή μετά" param1 = "// (η επιπλέον γραμμή είναι σε περίπτωση που η παράμετρος εντολής βρίσκεται στο // τέλος του αιτήματος και δεν ακολουθείται από ένα & if (requestString.indexOf (" PARAM1 = ")! = -1) {param1String = requestString.substring (requestString.indexOf ("PARAM1 =") + "PARAM1 =". μήκος ());} else {param1String = "0";} if (param1String.indexOf ("&")! = -1) {param1String = param1String.substring (0, param1String.indexOf ("&"));} else {param1String = param1String;} int param1 = Integer.parseInt (param1String); // Μετατρέπει τη συμβολοσειρά param1 σε ακέραιος sendRobotCommand (εντολή, param1); // Στέλνει την εντολή στη ρουτίνα που την στέλνει στο Arduino returnValue = "command:" + command + "param1:" + param1; // προς το παρόν μόνο η εντολή ανάλυσης αλλά η αποστολή // ως html ώστε να μπορεί να συμπεριληφθεί η μορφοποίηση return returnValue;}/ * * Παίρνει μια εντολή (επί του παρόντος ένα γράμμα) και μια παράμετρο (ένα byte 0-255) και τα στέλνει στο arduino * που ακούει και ξανακάνει * Υποστηριζόμενες εντολές * F - */void sendRobotCommand (εντολή συμβολοσειράς, int param1) {println ("command:" + command + "time:" + param1); String checkString = "AAA"; if (serialPort! = null) {serialPort.write (εντολή checkString +); serialPort.write (byte (param1)); }} // Τέλος ρύθμισης/δεν ονομάζονται πολύ συχνά ρουτίνες // --------------------------------------- ------------------------------------------------------ // Κουμπί παραδείγματος και κώδικας RectButton από το processing.org παράδειγμα με κάποιες αλλαγές // που έγιναν κυρίως για να απλοποιήσουν και να αφαιρέσουν το roll over animation // https://processing.org/learning/topics/buttons.html (2008-09-23) class Button {int x, y; int πλάτος, ύψος. Κουμπί (int ix, int iy, int iwidth, int iheight) {x = ix; y = iy; πλάτος = iwidth; ύψος = iheight? } boolean pressed () {if (overRect ()) {return true; } else {return false;}} boolean overRect () {if (mouseX> = x && mouseX = y && mouseY <= y+height) {return true; } else {return false? }}}
Βήμα 5: Λογισμικό - (Ιστοσελίδα)
Λοιπόν, έχουμε σχεδόν τελειώσει το μόνο που απομένει είναι να μιλάμε στο ρομπότ σας. Για να μιλήσετε: (μέσω τοπικού δικτύου -στην παράθυρα-)
- Ανακαλύψτε την τοπική διεύθυνση IP του φορητού υπολογιστή. Για να το κάνετε αυτό, μεταβείτε στο "Έναρξη / Προγράμματα / Αξεσουάρ / Γραμμή εντολών" και όταν ανοίξει το παράθυρο τερματικού πληκτρολογήστε "ipconfig". Γράψτε "Διεύθυνση IP" και κατευθυνθείτε σε άλλο υπολογιστή στο τοπικό σας δίκτυο.
- Ανοίξτε ένα πρόγραμμα περιήγησης ιστού, πληκτρολογήστε "https:// (robot computer ip): 12345/ControlPage.html
- Η ιστοσελίδα ελέγχου πρέπει να φορτωθεί, στο πλαίσιο "Διεύθυνση IP" πληκτρολογήστε τα ρομπότ ip.
- Ξεκινήστε να ελέγχετε το ρομπότ σας.
Για να μιλήσετε: (μέσω Διαδικτύου) Τώρα που το έχετε δουλέψει τοπικά, το να μιλάτε μέσω Διαδικτύου απέχει λίγα μόλις βήματα.
- (το πιο δύσκολο βήμα) Ρύθμιση Port Forwarding - Ο υπολογιστής σας πρέπει να ακούει το Διαδίκτυο και όχι μόνο το τοπικό δίκτυο. Για να το κάνετε αυτό, πρέπει να πείτε στο δρομολογητή σας να περάσει ορισμένα αιτήματα στον υπολογιστή που ελέγχει το ρομπότ. Αυτό είναι λίγο περίπλοκο και υπερβαίνει κατά πολύ το πεδίο εφαρμογής αυτού του Instructable. Ωστόσο, εάν επισκεφθείτε το PortForward.com θα σας δώσει όλα όσα πρέπει να γνωρίζετε για τη διαμόρφωση του δρομολογητή σας (πρέπει να προωθήσετε τη θύρα 12345 στο φορητό υπολογιστή ρομπότ σας)
- Στη συνέχεια ανακαλύψτε την IP σας στο διαδίκτυο (επισκεφτείτε το WhatIsMyIP.com)
- Τέλος, ενεργοποιήστε το Skype για μια βιντεοκλήση και επισκεφθείτε όποιον μιλάτε για να επισκεφθείτε "https:// (IP IP): 12345/ControlPage.html"
- Πληκτρολογήστε τη διεύθυνση IP στο πλαίσιο "Διεύθυνση IP" στην ιστοσελίδα ελέγχου και το ρομπότ σας που συνδέεται με το Web οδηγείται από μακριά.
Βήμα 6: Ολοκληρώθηκε
Λοιπόν αυτό είναι. Ελπίζω να περνάτε όμορφα οδηγώντας το ρομπότ σας από μακριά. Εάν έχετε προβλήματα με το λογισμικό ή το υλικό, μη διστάσετε να αφήσετε ένα σχόλιο και θα προσπαθήσω να σας βοηθήσω. Εάν θέλετε να δείτε περισσότερα τακτοποιημένα έργα, δοκιμάστε να επισκεφθείτε: oomlout.com