Arduino Candygrabber: 9 Schritte (mit Bildern)

Arduino Candygrabber: 9 Schritte (mit Bildern)

Inhaltsverzeichnis:

Anonim

Ich habe viele Möglichkeiten gesehen, mit Arduino über das Netz zu kommunizieren, aber keiner von ihnen hat es geschafft, die Nachrichten von Arduino in Echtzeit an den Client (Sie) zurückzuschicken und umgekehrt.

In dieser Anleitung erfahren Sie, wie Sie eine Verbindung zu Ihrem Arduino herstellen und über das Netz steuern, einen Videostream einrichten und in Echtzeit alles mit Ihrem Arduino steuern. Ich werde versuchen, Ihnen anhand eines konkreten Beispiels zu zeigen, wie dies getan werden kann, aber der von mir verwendete und geschriebene Code wird generisch sein, sodass Sie ihn für Ihre Projekte verwenden können. Beachten Sie, dass ich keinen neuen Code entdeckt habe, sondern einen Code verwendet habe, den ich im Netz gefunden habe, der daraus erstellt und an meine Bedürfnisse angepasst wurde.

In diesem Beispiel wird mein Arduino eine Candy Grabbing-Maschine steuern. Erinnerst du dich, als du ein Kind warst und zum Karneval gingst und dort, wo die Maschinen, in die du Geld steckst, mit dem Kran spielen, Stofftiere und alles Mögliche packen und wenn du geschickt genug bist, kannst du Nimm das Spielzeug, lass es in ein Loch fallen und geh mit einem neuen pelzigen Freund nach Hause?

Der Candy Grabber ist eine Desktop-Version dieser Karnevalsmaschine.

Wie soll es also funktionieren? Die Idee ist, dass sich auf meinem Heimcomputer eine Flash AIR-App befindet, mit der die Videoübertragung gestartet wird, wenn ein Remote-Client eine Verbindung herstellt. Die Kommunikation zwischen dem Client und der AIR-App würde über einen PHP-Socket erfolgen, da Nachrichten sofort von einem zum anderen übertragen werden können. Der Socket kümmert sich um alle Clients und die Warteschlange. Der Red5-Server wird verwendet, um die Videoübertragung zu verarbeiten, das Video zu streamen und die Arduino-Befehle von dem Client, der sich als erster in der Warteschlange befindet, an die AIR-App zu senden (obwohl dies noch viel mehr kann … darüber werden wir später sprechen ein späterer Schritt). Schließlich wird TinkerProxy verwendet, um Befehle von der AIR-App an das Arduino zu senden, das mit demselben Computer verbunden ist.

Ich werde versuchen, es so lange wie möglich online zu halten, aber mein Internetprovider ist etwas schrullig. Wenn Sie keine Verbindung herstellen können, versuchen Sie es später erneut. Auch meine Upload-Geschwindigkeit ist ziemlich langsam, so dass das Video relativ klein ist. Wenn Ihre Verbindung jedoch schneller ist, können Sie es einfach so einstellen, dass es größer wird.

Scheint kompliziert? Keine Sorge, ich werde versuchen, in den nächsten Schritten alles im Detail zu erklären.

UPDATE 2:

ich habe entschieden, ob ich den MakerBot gewinne, um ihn an meine Arduino-Community zu verschenken, die in Kroatien gestartet ist. Ich denke, dass ein erschwinglicher Weg, Teile herzustellen, für die Entwicklung jeglicher Art von Projekten von entscheidender Bedeutung ist, und da die Herstellung von Prototypen in Kroatien absurd teuer ist, denke ich, dass dies für alle meine Freunde eine große Hilfe wäre.

Außerdem habe ich die 6 LEDs entfernt, die für die Lichtquelle verwendet wurden. Da ich keinen LED-Treiber gemacht habe, habe ich sie gebraten.:-(Das ist der Preis dafür, etwas tun zu wollen, ohne vorher darüber nachgedacht zu haben, wie man es anpackt.

Natürlich ist der Crapy Chinese Candy Grabber-Mechanismus kaputt gegangen, daher wird die Greifhand leider eingeklemmt und geht nicht rauf oder runter, außer wenn ich sie rausreiße. Der MakerBot wäre sehr nützlich, um das kaputte Teil zu fabrizieren:-)

Zubehör:

Schritt 1: Was Sie brauchen

Hier ist die Liste der Dinge, die Sie für dieses Projekt benötigen.

Hardware:

1.Candy Grabber Spielzeug (oder alles, was Sie kontrollieren möchten) - Sie können sie online für rund 30 $ bekommen, wenn ich mich nicht irre

2. Arduino / Arduino Mega - kaufte meine online. Ich habe das Mega verwendet, weil es beim Anschließen des Motorcontrollers mehr freie Pins hatte

3.Motorsteuerung - Sie benötigen eine Möglichkeit, die Motoren im Candygrabber zu steuern. Ich benutze Adafruit Motor / Stepper / Servo Shield für Arduino 20 $ (http://www.adafruit.com/index.php?main_page=product_info&cPath=17_21&products_id=81)

4.Breadboard

5.IR LED - Ich habe meins von einer alten Fernbedienung entfernt

6.Photointerupter - nahm meine aus einer alten PS / 2-Maus. (Wird für die Bewegungserkennung der X- und Y-Achse der Maus verwendet. Jede Achse hat eine Eins.)

7.1kΩ Widerstände für die Endschalter (4 Stk.)

8,670 kΩ Widerstand für den Photointerupter

9,410 Ω Widerstand für die IR-LED

10. Bündel von Drähten und Überbrückungsdrähten (sie sind praktisch, da Sie sie leicht in die Arduino-Pins stecken können).

11.Schrumpfrohr

Fähigkeiten und Werkzeuge:

1. Lötkolben, Lötzinn, Soder Docht und Löten Fähigkeiten

2.Schraubendreher

3.Dremel-Tool

4. Heißklebepistole

5. Multimeter - Vertrauen Sie mir, wenn Sie keinen haben, kaufen Sie einen. Nein ernsthaft GO! Wenn Sie mit Programmierung vertraut sind, denken Sie an eine Art Debugger für Ihre Schaltkreise. Ich hätte dieses Projekt nicht beendet, wenn ich es nicht gehabt hätte. Versuchen Sie herauszufinden, welches der 20 Kabel etwas für was ist, und Sie werden wissen, wovon ich spreche.

6. Gute Programmierkenntnisse in ActionScript 3 (Flash)

Software:

1.Flash CS3 oder höher

2. Auf Ihrem Computer ist eine Art Apache / PHP-Server installiert (ich verwende MAMP, da es kostenlos und einfach einzurichten und zu verwenden ist) -

3. Red5-Server - Sie benötigen ihn, um Ihr Video von Flash AIR zu übertragen und an den Flash-Client zu streamen (kostenlos, wenn Sie über einen Server verfügen, ansonsten reichen die Hosting-Tarife von 30 USD, ich habe www.videowhisper.com/ verwendet). Weitere Informationen finden Sie unter

4.NO-IP.ORG - da mein Dienstanbieter mir keine statische IP-Adresse gibt, muss ich diese verwenden, um eine Verbindung zum PHP-Socket auf meinem Computer herzustellen (auch kostenlos, muss registriert werden) - www.no-ip. org

5.TinkerProxy - damit Flash mit Arduino kommunizieren kann -

Hier können Sie alle Quellcodes herunterladen:

AKTUALISIEREN

Ich hatte einige Fehler mit der Warteschlange im PHP-Socket - Gelöst

Dem Client-Flash wurden einige Sounds hinzugefügt, damit der Benutzer benachrichtigt wird, wenn er an der Reihe ist.

Einige Änderungen an den Klassen XMLSocketAppController.as, Red5Broadcast.as und Red5SharedObject.as - Zeitüberschreitung, wenn keine Benutzer mehr vorhanden sind. Auch auf diese Weise habe ich das Problem der sich ändernden IP behoben (ich weiß nicht warum, aber mein Internet-Provider macht das ein paar Mal am Tag) und Sie sparen Bandbreite.

Außerdem habe ich 6 LEDs in die obere Abdeckung eingefügt, um die störende Lichtreflexion zu beseitigen.

Schritt 2: Der Candy Grabber

Sie können versuchen, Ihren eigenen Candy Grabber zu bauen, dies ist jedoch nicht der Umfang dieses Projekts. Ich konzentriere mich darauf, das Spielzeug anzuschließen und zu steuern.

Also, um das Arduino und das Spielzeug zu verbinden, müssen wir es öffnen und die Eingeweide herausnehmen. Verwenden Sie einen Schraubendreher und schrauben Sie den Boden und die Oberseite des Spielzeugs ab. Unten sehen Sie ein Bündel von Drähten, die mit einer Platine verbunden sind. Jetzt kommt das Multimeter zum Spielen. Verwenden Sie es, um herauszufinden, welcher Draht für was ist. Ein großartiges Tutorial zur Verwendung eines Multimeters finden Sie hier (http://www.ladyada.net/learn/multimeter/).

Ich habe ein Diagramm gemacht, wie der Motor und die Endschalter verbunden sind (Bild 12). Die Sache ist, dass die Joysticks (Potentiometer) die Polarität am Motor und an den Endschaltern ändern, wenn Sie ihn von einer Seite zur anderen schieben (Tatsächlich bin ich mir nicht ganz sicher, ob die Joysticks Potentiometer sind, da ich keine Daten gefunden habe Blätter dieser Art von Potentiometer. Wenn jemand weiß, was sie sind, schreiben Sie mir einen Kommentar). Später müssen Sie den Motor von den Schaltern trennen, indem Sie die Drähte abschneiden, die von den Schaltern zum Motor führen (Bild 1). Jetzt wollen wir nur herausfinden was was ist.

Schalten Sie es ein, werfen Sie eine Münze ein, drücken Sie den ersten Joystick in die gewünschte Richtung und halten Sie ihn fest. Beginnen Sie nun, die Drähte paarweise auf Spannung zu prüfen. Beginnen Sie mit denen, die dem Joystick am nächsten liegen. Beachten Sie, dass beim Erreichen des Endschalters für die jeweilige Achse die Stromversorgung des Motors unterbrochen wird. Wenn Sie die X-Achse abtasten, finden Sie deren Endschalter (Abb. 8 und 9). Auf der Platine sollten sich die Schalterkabel in der Nähe des Joysticks befinden (Bild 7). Es sollten drei Drähte für die 2 Schalter der Achse vorhanden sein. Einer ist + 5V und die anderen zwei GND. Wenn Sie die entsprechenden Schalterkabel gefunden haben, schalten Sie das Spielzeug aus und prüfen Sie die Kabel auf Durchgang. Beginnen Sie mit zwei Drähten und drücken Sie dann den Endschalter für die entsprechende Achse von oben. Wenn Sie den Durchgang verlieren, ist dies einer Ihrer Schalter. Beschriften Sie es als SWITCH_1. Das Beschriften von Dingen wird es später viel einfacher machen. Fahren Sie nun fort und suchen Sie den gegenüberliegenden Schalter und bezeichnen Sie ihn als SWITCH_2.

Wiederholen Sie nun den Vorgang für die andere Achse, indem Sie die Drähte SWITCH_3, SWITCH_4 beschriften.

Der letzte Motor, der die Auf- und Abbewegung der Greifhand steuert, hat keinen Endschalter, sodass Sie nur zwei Drähte des Motors suchen müssen.

Wenn Sie wissen, welcher Schalter der richtige ist, können Sie den Motorschlitten öffnen (Bild 11) und den Draht der X-Achse vom ersten Schalter zum Motor und den Draht vom Motor zum anderen Endschalter abschneiden. Schließen Sie die Kabel vom ersten zum zweiten Schalter an. Außerdem sollten Sie zwei lange Drähte von jedem Draht des Motors anschließen und sie als AXIS_X kennzeichnen. Wiederholen Sie den Vorgang für die Y-Achse und kennzeichnen Sie die Motorkabel als AXIS_Y. Bild 13 zeigt, wie der Motor und die Schalter angeschlossen werden müssen, nachdem Sie sie getrennt haben.

Als nächstes suchen Sie die LED und den Lichtsensor (Bild 14). Wir werden sie verwenden, um ein Ereignis in Arduino auszulösen, das dem Kunden eine Nachricht sendet, dass er gewonnen hat. Sie sind an der Seite der Rutsche angebracht, wo Sie das Material fallen lassen, das Sie ergriffen haben. Nehmen Sie sie heraus und ersetzen Sie sie durch eine IR-LED und einen Photointerupter. Das Problem war, dass der Arduino-Interrupt zufällig und langsam ausgelöst wurde, als ich den Lichtsensor verwendete. Deshalb entschied ich mich, stattdessen den Photointerupter und die IR-LED zu verwenden. Wenn Ihr Photointerupter von einer Maus stammt und 3 Pins hat, können Sie davon ausgehen, dass der mittlere Pin der 5-V-Pin und die anderen beiden GND-Pins sind. Diese Photointerrupter haben tatsächlich zwei Photointerrupter. Das liegt daran, dass sie zwei Werte benötigen, um die Position und Geschwindigkeit der Maus zu berechnen. Es wird Quadraturcodierung genannt. Wir werden nur einen verwenden. Löten Sie also einen Draht an den 5-V-Pin und den anderen an einen GND-Pin.

Nehmen Sie einige Überbrückungsdrähte, schneiden Sie sie ab und entfernen Sie sie. Schneiden Sie anschließend die beschrifteten Drähte ab und entfernen Sie sie. Schließen Sie dann jeweils einen Überbrückungsdraht an und sichern Sie sie mit einem Schrumpfschlauch. Verbinden Sie nun die Motorkabel mit dem Motorcontroller und den restlichen Kabeln wie in der Abbildung gezeigt (Bild 19).

Schritt 3: Arduino

Um das Spielzeug mit dem Arduino zu verbinden, nehmen Sie ein Steckbrett und verbinden Sie alles wie in der Abbildung in Bild 1 gezeigt. Laden Sie die Skizze Candygrabber.pde hoch, die Sie im ersten Schritt in der Zip-Datei finden. Beachten Sie, dass der Photointerupter als Pin definiert ist 5 weil wir es als Interrupt verwenden. Informationen zu Interrupts finden Sie unter

Die setup () - Funktion wird beim Start einer Skizze aufgerufen. Wir verwenden es, um Variablen, Pin-Modi und die Motoren zu initialisieren. Die Setup-Funktion wird nach jedem Einschalten oder Zurücksetzen der Arduino-Karte nur einmal ausgeführt.

Als nächstes gibt es die Schleifenfunktion, die startet, inByte als Byte-Variable definiert und ihm den Wert 255 zuweist und eine while-Schleife startet, die ausgeführt wird, bis sie über Serial.read () den Wert Null (0) erhält. Dies ist wichtig, damit es weiß, dass die drei nächsten Werte die Befehlswerte sind. Wenn wir die Null nicht verwenden, werden die Befehle vertauscht (z. B. verschieben sich die Werte manchmal um eine Stelle, sodass motorX nicht bewegt wird, sondern um motorY). In der while-Schleife rufen wir auch die Funktion readInteruptors () auf, um zu überprüfen, ob der Schlitten einen der Endschalter erreicht hat, und um die Motoren anzuhalten. Wenn er einen Nullwert erhält, wird die while-Schleife verlassen und die nächsten drei Werte werden gelesen, und wenn es alle drei Werte erhält, ruft es die runMotors () - Funktion auf.

Die Funktion runMotors () prüft, in welche Richtung jeder Motor laufen soll und ob der Schlitten an seinen Grenzen steht. Die einzige verbleibende Funktion ist stateChange (), die ausgelöst wird, wenn etwas in den Schacht fällt. Sie sendet eine Nachricht, die Sie gewonnen haben, an die AIR-App, die sie dann an den gerade spielenden Benutzer weiterleitet.

#umfassen int pinLDR = 5; int sensorPin = 7; int limitSwitch1 2; int limitSwitch2 2; int limitSwitch1PwrPIN = 28; int limitSwitch2PwrPIN = 30; int incomingByte 128; int numBytes = 0; int motorSpeed ​​= 0; AF_DCMotor motorGrabber (1); AF_DCMotor motorX (3); AF_DCMotor motorY (4); volatileint state = LOW; void setup () {attachInterrupt (pinLDR, stateChange, FALLING); int i = 0; limitSwitch1 0 = 36; limitSwitch1 1 = 38; limitSwitch2 0 = 40; limitSwitch2 1 = 42; // Setze Pin-Modi für (i = 0; i <2; i ++) {pinMode (limitSwitch1 i, INPUT); pinMode (limitSwitch2 i, INPUT);} pinMode (limitSwitch1PwrPIN, OUTPUT); digitalWrite (limitSwitch1PwrPIN, HIGH); pinMode (limitSwitch2PwrPIN, OUTPUT); digitalWrite (limitSwitch2PwrPIN, HIGH); for (i = 0; i <3; i ++) {incomingByte i = 6;} motorGrabber.setSpeed ​​(255); motorGrabber.run (RELEASE); motorX.setSpeed ​​(255); motorX.run (RELEASE); motorY.setSpeed ​​(255); motorY.run (RELEASE); Serial.begin (9600);} void loop () {int i = 0; Byte inByte = 255; while (inByte! = 0) {inByte = Serial.read (); readInteruptors ();} if (inByte == 0) {while (Serial.available () <3) {;} // Liest alle Daten im Puffer für (i = 0; i <3; i ++) {incomingByte i = Serial.read ();} Serial.flush ();} runMotors ();} readInteruptors () ungültig {if ((incomingByte 0 <6 && digitalRead (limitSwitch1 0) == LOW) || (incomingByte 0> 6 && digitalRead (limitSwitch1 1) == LOW)) {incomingByte 0 = 6; motorX.run (RELEASE);} if ((incomingByte 1 <6 && digitalRead (limitSwitch2 0) == LOW) || (incomingByte 1> 6 && digitalRead (limitSwitch2 1) == LOW) { incomingByte 1 = 6; motorY.run (RELEASE);}} runMotors () {if (Posteingang 0 <6 && digitalRead (limitSwitch1 0) == HIGH) {motorSpeed ​​= map (Posteingang 0, 5,1,0,255); motorX.run (BACKWARD); motorX.setSpeed ​​(motorSpeed);} elseif (incomingByte 0> 6 && digitalRead (limitSwitch1 1) == HIGH) {motorSpeed ​​= map (incomingByte 0, 7,11,0,255); motorX.run (FORWARD); motorX.setSpeed ​​(motorSpeed);} else {incomingByte 0 = 6; motorX.run (RELEASE);} if (incomingByte 1 <6 && digitalRead (limitSwitch2 0) == HIGH) {motorSpeed ​​= map (incomingByte 1, 5,1,0,255); motorY.run (BACKWARD); motorY.setSpeed ​​(motorSpeed);} elseif (incomingByte 1> 6 && digitalRead (limitSwitch2 1) == HIGH) {motorSpeed ​​= map (incomingByte 1, 7,11,0,255); motorY.run (FORWARD); motorY.setSpeed ​​(motorSpeed);} else {incomingByte 1 = 6; motorY.run (RELEASE);} if (incomingByte 2 <6) {motorSpeed ​​= map (incomingByte 2, 5,1,0,255); motorGrabber.run (BACKWARD); motorGrabber.setSpeed ​​(motorSpeed);} elseif (incomingByte 2> 6) {motorSpeed ​​= map (incomingByte 2, 7,11,0,255); motorGrabber.run (FORWARD); motorGrabber.setSpeed ​​(motorSpeed);} else {incomingByte 2 = 6; motorGrabber.run (RELEASE);}} void stateChange () {Serial.println ("WIN"); Serial.flush ();}

Schritt 4: Der PHP-Socket

Das erste, was Sie zum Einrichten eines PHP-Sockets benötigen, ist ein Apache / PHP-Server, der auf Ihrem lokalen Computer eingerichtet ist. Ich arbeite auf einem Mac und verwende MAMP (http://www.mamp.info/en/index.html) für alle meine Entwicklungsanforderungen. Es ist einfach einzurichten und zu verwenden und ich würde es jedem empfehlen, der einen Apache / PHP / mySQL-Server benötigt. Sie werden mich als Mac-Benutzer fragen, warum ich nicht den Apache-Server verwende, der im Lieferumfang von Mac OS X 10.5 enthalten ist. Nun, ich finde MAMP viel benutzerfreundlicher und benutzerfreundlicher. Fahren wir fort. Das Tutorial, das mir am meisten geholfen hat und das ich verwendet habe, ist "PHP5 Sockets with Flash 8" auf Kirpua.com (http://www.kirupa.com/developer/flash8/php5sockets_flash8.htm). Ich wollte es benutzerfreundlicher und aktueller machen und entschied mich, in ActionScript 3 (anstelle von AS2 wie im Beispiel) einige Klassen zu schreiben, die die Verbindung handhaben würden.

Aber als ich anfing zu programmieren, stieß ich auf ein Problem. Die Sache ist, dass MAMP eine spezielle Portnummer auf Ihrem lokalen Computer anstelle von Port 80 verwendet, wie es für HTTP-Server üblich ist. MAMPs Standardport ist 8888 (zB Funkyzeitmac.local: 8888) und der Port des Sockets ist 8890. Wenn Flash versucht, eine Verbindung zum Socket herzustellen, sucht es IMMER nach einer Crossdomain-Richtlinie, bevor irgendetwas anderes. Deshalb hat es nicht funktioniert. Also habe ich eine Crossdomain-Richtlinie erstellt und versucht, sie rund um den Server zu platzieren, aber ich hatte kein Glück. Schließlich suchte ich im Internet nach der Antwort (und fand sie natürlich nicht auf den Support-Seiten von Adobe). Die Sache ist, wenn Flash mit dem Socket verbunden ist, sollte der PHP-Code die Crossdomain-Richtlinie vor allem anderen senden. Machen Sie also Ihre Crossdomain-Richtlinie, kopieren Sie den Code und fügen Sie ihn in den PHP-Code ein. Nachdem Flash diese Crossdomain-Richtlinie erhalten hat, funktioniert es wie ein Zauber.

Sie können die Datei am Ende dieses Schritts herunterladen.

Wie Sie sehen, habe ich XML-ähnliche Syntax für die Nachrichten verwendet, die an Flash gesendet werden. Dies erleichtert das Analysieren der eingehenden Daten im Flash-Client und in der AIR-App. Es gibt einige Servernachrichten, die gesendet werden, wenn ein neuer Socket verbunden wird, wenn ein Socket getrennt wird, die Anzahl der Sockets und die Warteschlange für alle Client-Sockets abgerufen wird. Da dies ein Online-Spiel sein wird, möchten wir einen Timer im Client-Flash haben, der nach anderthalb Minuten endet und zum Ende der Warteschlange führt. Das ist die Warteschlange für. Speichern Sie die Datei in dem MAMP-Ordner, in dem sich Ihr Projekt befinden wird. Um zum Stammordner des MAMP-Servers zu gelangen, erstellen Sie unter / Applications / MAMP / htdocs einen neuen Ordner, nennen Sie ihn Candygrabber und speichern Sie Ihre Datei hier. Öffnen Sie nun ein neues Terminal-Fenster (/ Programme / Dienstprogramme / Terminal) und geben Sie Folgendes ein

/ Programme / MAMP / bin / php5 / bin / php /Applications/MAMP/htdocs/Candygrabber/socketShell.php

und drücken Sie dann die Eingabetaste. Dadurch wird PHP angewiesen, die Datei wie ein Serverskript auszuführen. Wenn alles gut gelaufen ist, sollten Sie im Terminalfenster Folgendes sehen:

1 Socket an 192.168.1.119:8890 gebunden

1 zuhören …

Schließen Sie das Terminalfenster nicht, da sonst die Sitzung beendet und der PHP-Socket geschlossen wird.

Kommen wir nun zum Flash-Teil.

Schritt 5: Red5 Server

Wenn Sie möchten, können Sie Red5 herunterladen und zu Testzwecken auf Ihrem lokalen Computer installieren. Am Ende empfehle ich jedoch die Verwendung eines Hosting-Plans, der standardmäßig Red5 enthält. Das spart Zeit und erleichtert die Arbeit erheblich. Laden Sie die Red5-App am Ende dieses Schritts herunter und laden Sie sie in den Ordner webapps auf Ihrem Red5-Server hoch. Die App wurde vom Red5-Team erstellt, um die Möglichkeiten des Video-Streamings aufzuzeigen. Es ist also nicht notwendig, das Rad für diesen Teil des Projekts neu zu erfinden.

Du bist mit diesem Teil fertig … aber warte. Es gibt ein paar Dinge, die ich über Red5 sagen möchte. Es ist ein Java-Server und meiner Meinung nach wird dies die Technologie der Zukunft sein. Es hat die Möglichkeiten von Flash Media Server, noch viel mehr. PHP ist in der Tat eine Skriptsprache, keine vollwertige Programmiersprache. Sie könnten sich also fragen, warum ich PHP-Sockets verwendet habe? Die Antwort ist, dass ich mir zu Beginn dieses Projekts gar nicht vorstellen konnte, was Red5 alles kann. Ich musste überhaupt keine PHP-Sockets verwenden und habe vor, eine App zu schreiben, die die Warteschlange, den Nachrichtenaustausch zwischen Clients usw. verwaltet, sobald ich mich mit Red5 vertraut gemacht habe.

Ich habe bereits die Befehle, die der Flash-Client an die AIR-App sendet, vom PHP-Socket auf Red5 verschoben und einen enormen Geschwindigkeitsschub erhalten. Der PHP-Socket begann zu verzögern, als einige Benutzer eine Verbindung herstellten, und die Kommunikation mit Arduino verschlechterte sich. Dies liegt daran, dass Flash alle 30-40 ms versucht hat, einen Befehl an die AIR-App zu senden. Die Verlangsamung häufte sich und an einem Punkt fiel Arduino 10 Sekunden lang hinter die Befehle zurück! Das würde das gesamte Projekt zum Erliegen bringen, da die Idee darin bestand, es in Echtzeit zu steuern. Das Problem wurde mit dem SharedObject behoben.

Nun, nach all dem Lob über Red5, gibt es ein paar Dinge zu erwähnen. Die Dokumentation ist schrecklich und fast alle Beispiele für Flash sind in ActionScript 2 geschrieben. WAS? Action Script 3 wurde vor einigen Jahren gestartet und verwendet immer noch AS2. Und viel Glück beim Finden eines Tutorials, das Ihnen helfen könnte.

Aber vielleicht sollten wir ihnen vergeben. Die Sache ist, dass die Version 1.0 RC vor ein paar Tagen ins Leben gerufen wurde. Ich hoffe also, dass die Dinge in Ordnung kommen, sobald die Community wächst und die Leute sie immer mehr nutzen.

Eine letzte Sache. Habe ich schon erwähnt, es ist KOSTENLOS !!!!! Ja! Das ist das Entscheidende, das ihn in Schwung bringen könnte. Erinnern Sie sich an die Kindheit von PHP? Es war auch kostenlos und heute ist es der Standard.

Und auf der anderen Seite gibt es einen Flash Media Server, der 2500 $ kostet !!! Was? Möchten Sie Video-Streaming / -Rundfunk und Kommunikation betreiben?

Wenn Sie mehr an Red5 interessiert sind, als Sie wissen müssen, finden Sie hier eine Liste von Links, die ich hilfreich fand:

- Ein dreiteiliges Tutorial zum Installieren und Ausführen von Red5

lelandcope.com/beginner-red5-streaming-tutorial-part-1-of-3/

lelandcope.com/beginner-red5-streaming-part-2-of-3/

lelandcope.com/beginner-red5-streaming-tutorial-–-part-3-of-3-2/

- Dominick Accattato - einer der Entwickler und Schöpfer von Red5

www.youtube.com/user/dominickaccattato#p/c/9B94807E1D0AF2DE

- Und hier ist die Red5-Dokumentation

build.xuggle.com/job/red5_jdk6_stable/javadoc/

Schritt 6: Proxy basteln

Sie können Tinker Proxy hier herunterladen (http://code.google.com/p/tinkerit/Install) und Tinker Proxy starten.Überprüfen Sie, ob arduino an den Computer angeschlossen ist. Die Nummer des Anschlusses sollte 5333 sein. Wählen Sie Ihren seriellen Anschluss und stellen Sie die Geschwindigkeit auf 9600 ein. Klicken Sie dann auf Start.

Schritt 7: Flash Client und Anwendung

Jetzt, da wir unseren Socket bereit haben, können wir mit dem ActionScript 3.0-Code fertig werden. Sie können den Code am Ende dieses Schritts herunterladen. Nachdem ich mir viele Gedanken gemacht hatte, beschloss ich, nicht ins Detail zu gehen und zu erklären, wie ich die Klasse geschrieben habe und was sie tut. Der Umfang dieser Anleitung besteht nicht darin, Sie über Klassen, Entwurfsmuster und OOP (objektorientierte Programmierung) zu unterrichten. Ich werde mich lieber darauf konzentrieren, wie man es benutzt. Als ich mit dem Programmieren anfing, entschied ich mich, ein MVC-Entwurfsmuster (Model / View / Controller) für die Klasse zu verwenden. Als sich herausstellte, dass dies möglicherweise nicht die beste Idee war und ich ein anderes, einfacheres und skalierbareres Entwurfsmuster hätte verwenden sollen. Da ich jedoch eifrig war, das Projekt fortzusetzen, beschloss ich, daran festzuhalten. Keine Sorge, die Klasse wird trotzdem funktionieren. Ich werde die neuen Klassen veröffentlichen, sobald ich sie beendet habe.

Öffnen Sie also Flash und erstellen Sie zwei neue Flash-Dateien. Eines heißt ActionScript 3.0 und heißt Client.fla, das andere für Adobe AIR heißt ArduinoAIR.fla. Erstellen Sie anschließend zwei ActionScript-Dateien und nennen Sie sie ClienDocument.as und ArduinoAIRDocument.as. Der Client enthält eine TextArea-Komponente mit dem Namen „msgArea“, eine InputText-Komponente mit dem Namen „inputMessage“, eine Schaltfläche mit dem Namen „sendButton“ und eine Schaltfläche mit dem Namen „reconnectButton“ "MotorX", "motorY", "motorZ" und vier dynamische TextFields mit den Namen "red5StatusTxt", "sharedStatusTxt", "socketStatusTxt" und "queueStatus".

Die AIR-App enthält dieselben Komponenten, außer dass sie eine zusätzliche Schaltflächenkomponente namens „sendArduinoButton“ enthält. Wenn Sie diese Einstellungen vorgenommen haben, müssen Sie jede Flash-Datei auf ihre Dokumentenklasse verweisen. Dokumentklassen werden im Klartext verwendet, um Ihren Code von der Timeline in eine externe Acrionscript-Datei zu verschieben. Für Client.fla sollte die Dokumentenklasse ClientDocument.as und für ArduinoAIR.fla ArduinoAIRDocument.as.OK sein. Öffnen Sie jetzt ClientDocument.as und sehen Sie, was wir hier haben.

package {import flash.display. *; import flash.events. *; import flash.net.URLRequest; import flash.text. *; import com.SocketsConnection.XMLSocketModel; import com.SocketsConnection.XMLSocketView; import com.SocketsConnection.XMLSocketController; importiere com.Red5Link.Red5Broadcast; publicclass ClientDocument erweitert MovieClip {publicvar xmlSocketModel: XMLSocketModel; publicvar xmlSocketView: XMLSocketView; publicvar xmlSocketController: XMLSocketController; publicvar broadcast: Red5Broadcast; public function ClientDocument () {msgA inputMessage.visible = false; winnerStamp.visible = false; broadcast = new Red5Broadcast ("rtmp: //IhreDomain.com", "red5BroadcastDemo", red5StatusTxt); addChild (broadcast); xmlSocketModel = neues XMLSocketModel ("arduinoproject.no-ip.org", 8890, "client"); xmlSocketView = new XMLSocketView (msgArea, socketStatusTxt); xmlSocketView.socketsModel = xmlSocketModel; xmlSocketController = neuer XMLSocketController (); xmlSocketController.socketsModel = xmlSocketModel; xmlSocketController.videoBroadcast = broadcast; xmlSocketController.addSendButton (sendButton, inputMessage); xmlSocketController.addReconnectButton (reconnectButton); xmlSocketController.addMotorButtons (motorX, motorY, motorZ); xmlSocketController.addQueueStatus (queueStatus); xmlSocketController.addWinnerStamp (winnerStamp); xmlSocketController.sharedObject = neues Array ("rtmp: //IhreDomäne.com", "Motoren", sharedStatusTxt);}}}

In den ersten Zeilen definieren wir die Klassen, die wir verwenden werden.

Die Dinge, die uns interessieren, sind in der öffentlichen Funktion ClientDocument () Lassen Sie uns also durch jeden von ihnen gehen und erklären, was sie tun.

öffentliche Funktion ClientDocument () {msgArea.visible = false; inputMessage.visible = false; winnerStamp.visible = false; broadcast = new Red5Broadcast ("rtmp: //IhreDomain.com", "red5BroadcastDemo", red5StatusTxt); addChild (broadcast); xmlSocketModel = neues XMLSocketModel ("arduinoproject.no-ip.org", 8890, "client"); xmlSocketView = new XMLSocketView (msgArea, socketStatusTxt); xmlSocketView.socketsModel = xmlSocketModel; xmlSocketController = neuer XMLSocketController (); xmlSocketController.socketsModel = xmlSocketModel; xmlSocketController.videoBroadcast = broadcast; xmlSocketController.addSendButton (sendButton, inputMessage); xmlSocketController.addReconnectButton (reconnectButton); xmlSocketController.addMotorButtons (motorX, motorY, motorZ); xmlSocketController.addQueueStatus (queueStatus); xmlSocketController.addWinnerStamp (winnerStamp); xmlSocketController.sharedObject = neues Array ("rtmp: //IhreDomäne.com", "Motoren", sharedStatusTxt);}

Die ersten drei Zeilen verbergen die TextAreas und den Siegerpokal. Die 4. Zeile initialisiert die Red5Broadcast Klasse, die das Streaming und Broadcasting des Videos verwaltet. Wir müssen ihm den Standort des red5-Servers, den Namen der red5-Anwendung und das TextField geben, in dem der Stream-Status angezeigt wird. Dann müssen wir es zur Anzeigeliste hinzufügen, sonst wird der Videostream nicht angezeigt.

Als nächstes kommuniziert Flash mit dem PHP-Socket über eine XMLSocket-Klasse, die Teil von Flash ist. Ich habe eine Model-Klasse erstellt, die alle erforderlichen Listener und Dispatch-Ereignisse verarbeitet, wenn die Daten empfangen werden. Es wird genannt XMLSocketModel und wir initialisieren es so:

xmlSocketModel = neues XMLSocketModel ("arduinoproject.no-ip.org", 8890, "client");

Wir müssen die URL übergeben, wo sich unser Socket befindet, unsere Socket-Nummer und als letzten Parameter den App-Typ. Die URL, die ich benutze, ist arduinoproject.no-ip.org. Ja, ich benutze den Dienst www.no-ip.org. Auf diese Weise habe ich die Möglichkeit, einen Hostnamen für meine dynamische IP zu vergeben. Einfach registrieren, einen Hostnamen auswählen und das entsprechende Programm auf Ihrem Computer installieren. Das letzte, was wir übergeben, ist "client", da wir jetzt an unserer Client-Flash-Datei arbeiten. Beachten Sie, dass alle Parameter ausgefüllt werden müssen.

Die nächste Zeile initialisiert die View-Klasse. Es wird verwendet, um die eingehenden Daten anzuzeigen, und es ändert sich, wenn es die Ereignisse empfängt, die von der Model-Klasse ausgelöst wurden.

xmlSocketView = new XMLSocketView (msgArea);

Wenn wir das initialisieren xmlSocketView wir übergeben ihm den TextArea mit dem Namen "msgArea" als Parameter. Das sagt ihm, wo unsere eingehenden Daten angezeigt werden sollen. In der nächsten Zeile wird angegeben, welches Modell auf Ereignisse überwacht werden soll.

xmlSocketView.socketsModel = xmlSocketModel;

Daher sollte xmlSocketView xmlSocketModel auf Ereignisse überwachen.

Als nächstes müssen wir unsere Controller-Klasse initialisieren. Hier geschieht die ganze Magie. In der Controller-Klasse werden alle Entscheidungen getroffen und alle Befehle ausgegeben. Auch die Schaltflächen, die wir auf die Bühne stellen, haben Listener in den Controller-Befehlen, wenn wir sie drücken. Der Controller ändert sich auch, wenn er die Ereignisse empfängt, die von der Model-Klasse abgesetzt wurden. Also initialisieren wir zuerst den Controler. In der nächsten Zeile teilen wir ihm mit, welches Modell er anhören soll. Wieder wie bei der View-Klasse sagen wir, dass das Model xmlSocketModel ist. Dann sagen wir, dass es ist videoBroadcast = Sendung. Wir fügen die Schaltflächen, das Textfeld "queueStatus" zum Anzeigen der Warteschlange und den MovieClip "winnerStamp" hinzu, der anzeigt, ob der Client gewinnt.

Schließlich initialisieren wir die sharedObject Dadurch werden die Befehle für den Motor mit der AIR-App ausgetauscht. Die Parameter sind Ihr Domänenpfad, der Name für das freigegebene Objekt und das Textfeld "sharedStatusTxt", in dem der Status der freigegebenen Verbindung angezeigt wird.

xmlSocketController = neuer XMLSocketController (); xmlSocketController.socketsModel = xmlSocketModel; xmlSocketController.videoBroadcast = broadcast; xmlSocketController.addSendButton (sendButton, inputMessage); xmlSocketController.addReconnectButton (reconnectButton); xmlSocketController.addMotorButtons (motorX, motorY, motorZ); xmlSocketController.addQueueStatus (queueStatus); xmlSocketController.addWinnerStamp (winnerStamp); xmlSocketController.sharedObject = neues Array ("rtmp: //IhreDomäne.com", "Motoren", sharedStatusTxt);

Jetzt schauen wir uns den Code für die AIR-App an.

package {import flash.display. *; import flash.events. *; import flash.net.URLRequest; import flash.text. *; import fl.controls.Slider; import com.SocketsConnection.XMLSocketModel; import com.SocketsConnection.XMLSocketView; com.SocketsConnection.XMLSocketAppController importieren; com.SocketsConnection.SocketModel importieren; com.SocketsConnection.SocketView importieren; com.Red5Link.Red5Broadcast importieren; publicclass ArduinoAIRDocument erweitert MovieClip {publicvar xmlSocketModel; publicvar xmlSocketAppController: XMLSocketAppController; publicvar socketModel: SocketModel; publicvar socketView: SocketView; publicvar socketAppController: SocketAppController; publicvar broadcast: Red5Broadcast; public function, red5StatusTxt); addChild (broadcast); xmlSocketModel = neues XMLSocketModel ("localhost", 8890, "AIR"); xmlSocketView = new XMLSocketView (msgArea, socketStatusTxt); xmlSocketView.socketsModel = xmlSocketModel; socketModel = new SocketModel ("localhost", 5333, "arduino"); socketView = new SocketView (msgArea); socketView.socketsModel = socketModel; xmlSocketAppController = neuer XMLSocketAppController (); xmlSocketAppController.socketsModel = xmlSocketModel; xmlSocketAppController.colaboratingModel = socketModel; xmlSocketAppController.videoBroadcast = broadcast; xmlSocketAppController.addSendButton (sendButton, inputMessage); xmlSocketAppController.addReconnectButton (reconnectButton); xmlSocketAppController.addSendArduinoButton (sendArduinoButton); xmlSocketAppController.addMotorButtons (motorX, motorY, motorZ); xmlSocketAppController.sharedObject = neues Array ("rtmp: //IhreDomain.com", "motors", sharedStatusTxt); socketAppController = neuer SocketAppController (); socketAppController.socketsModel = socketModel; socketAppController.colaboratingModel = xmlSocketModel;}}}

Schauen Sie sich die öffentliche Funktion ArduinoAIRDocument () genau an.

öffentliche Funktion ArduinoAIRDocument () {broadcast = new Red5Broadcast ("rtmp: //yourdomain.com", "red5BroadcastDemo", red5StatusTxt); addChild (broadcast); xmlSocketModel = neues XMLSocketModel ("localhost", 8890, "AIR"); xmlSocketView = new XMLSocketView (msgArea, socketStatusTxt); xmlSocketView.socketsModel = xmlSocketModel; socketModel = new SocketModel ("localhost", 5333, "arduino"); socketView = new SocketView (msgArea); socketView.socketsModel = socketModel; xmlSocketAppController = neuer XMLSocketAppController (); xmlSocketAppController.socketsModel = xmlSocketModel; xmlSocketAppController.colaboratingModel = socketModel; xmlSocketAppController.videoBroadcast = broadcast; xmlSocketAppController.addSendButton (sendButton, inputMessage); xmlSocketAppController.addReconnectButton (reconnectButton); xmlSocketAppController.addSendArduinoButton (sendArduinoButton); xmlSocketAppController.addMotorButtons (motorX, motorY, motorZ); xmlSocketAppController.sharedObject = neues Array ("rtmp: //IhreDomain.com", "motors", sharedStatusTxt); socketAppController = neuer SocketAppController (); socketAppController.socketsModel = socketModel; socketAppController.colaboratingModel = xmlSocketModel;}

Der Code ist fast derselbe wie in der Client-Flash-Datei, außer wenn wir die xmlSocketModel-Klasse initialisieren, müssen wir als letzten Parameter "AIR" übergeben.

Das Neue, was wir hier haben, passiert in den Zeilen 8 bis 10.

socketModel = new SocketModel ("localhost", 5333, "arduino"); socketView = new SocketView (msgArea); socketView.socketsModel = socketModel;

Hier initialisieren wir die socketModel. Das SocketModel ist die Model-Klasse für die Kommunikation mit Arduino. Es wird die Socket-Klasse von Flash verwendet. Zeile 9 initialisiert die socketView Dies ist die View-Klasse für das socketModel. Wenn wir es initialisieren, müssen wir die TextArea "msgArea" übergeben, da hier auch die Befehle angezeigt werden, die wir an arduino senden, und was arduino an die AIR-App zurückgibt. Zeile 10 weist die SocketView an, auf Ereignisse vom SocketModel zu warten.

Das xmlSocketAppController erstreckt sich von der xmlSocketController also initialisieren wir es fast auf die gleiche Weise.

Die letzten drei Codezeilen initialisieren das socketAppController Das ist der Controller für das SocketModel. Die Kommunikation zwischen der AIR-App und Arduino wird über Port 5333 abgewickelt. Port 5333 wird von TinkerProxy geöffnet.

Jetzt müssen wir unsere Dateien veröffentlichen. Veröffentlichen Sie die Client.fla für Flash Player 10 und die AIR-App.

Schritt 8: Testen

Wir sind bereit, also fangen wir an zu testen.

Öffnen Sie ein Terminalfenster und wenn Sie MAMP im Standardverzeichnis installiert haben, geben Sie Folgendes ein:

/ Programme / MAMP / bin / php5 / bin / php /Applications/MAMP/htdocs/Candygrabber/socketShell.php

es sollte ungefähr so ​​lauten:

1 Socket an 192.168.1.119:8890 gebunden

1 zuhören …

Starten Sie den dynamischen Updater NO-IP.ORG. Stecken Sie das mit arduino verbundene USB-Kabel in den Computer und öffnen Sie dann Tinker Proxy. Wählen Sie Ihre Netzwerk-Portnummer (sollte 5333 sein), den seriellen Port und die Geschwindigkeit (stellen Sie diese auf 9600 ein) und klicken Sie dann auf "Start".

Wenn alles in Ordnung ist, starten Sie Ihre AIR-App.

Wenn die AIR-App alle drei Verbindungen herstellt, sind Sie fertig. Jetzt können Sie Ihren bevorzugten Browser starten und zur Client-Flash-Datei navigieren. In meinem Fall ist es www.pimedius.com/Candygrabber/, da ich es online hoste.

Schritt 9: Fazit

Ich hoffe, dass Sie dieses instructable genossen haben. Dies ist meine erste, also wenn etwas unklar ist, sende mir eine PN oder schreibe einen Kommentar. Ich werde versuchen, alles zu klären, was Sie nicht verstehen.

Sie können es hier spielen. Ich werde versuchen, es so lange wie möglich online zu halten, aber mein Internetprovider ist etwas schrullig. Wenn Sie keine Verbindung herstellen können, versuchen Sie es später erneut.

Sobald ich etwas mehr Zeit und Verständnis für Red5 habe, werde ich versuchen, den Code neu zu schreiben, um die Notwendigkeit eines PHP-Sockets zu beseitigen.

Vielen Dank fürs Lesen, und wenn Ihnen diese Anleitung gefallen hat, stimmen Sie ab !!!

Frieden, Liebe, Einheit!

Finalist in der

MakerBot Challenge