Ich hab vor einiger Zeit auf YouTube einen Roboter gesehen, der wie ein fahrender Router aussah. Vorne war eine Kamera dran und man konnte das ganze vom PC aus steuern und das Bild der Kamera sehen. Sowas würde ich gerne mit einem Arduino nachbauen, wenn das möglich ist. Leider hab ich im Netz dazu keine passende Anleitung gefunden, aber unter dem Video stand verwendete Komponenten: Arduino UNO, Ethernet Shield, D-Link Router und D-Link cam.
Wenn ich das also richtig verstanden habe, Kommuniziert der Router mit dem PC und braucht dazu nur Strom (Akku).
An dem Router ist vermutlich eine IP Cam angeschlossen, die wird direkt an den Router angeschlossen oder?
Dann ist der Arduino mit einem Ethernet Shield auch direkt an den Router angeschlossen? Wie man wahrscheinlich merkt hab ich noch kaum bis keine Erfahrung mit der Kommunikation über so einen Router
Man verbindet ja den Arduino über den Router mit dem Netzwerk und dann mit dem PC oder? (Arduino -> Shield -> Router -> PC) Nur wie steuer ich den durch dieses Netzwerk an?
Es wäre vielleich ratsam, erst einmal mit den Basics anzufangen.
Die Kamera selber wird nicht vom Arduino gesteuert. Hierbei handelt es sich um eine WLAN Kamera, die lediglich vom Arduino bzw. deren Spannungsversorgung gespeisst wird.
Der D-Link Router (kleiner Mini-Router auf dem Roboter) fungiert vermutlich als WLAN-Client und ist mit dem Heimischen WLAN verbunden. An diesem kleinen Router ist dann der Arduino per Ethernetkabel angeschlossen. Die Kamera selbst ist, wie bereits geschrieben autark und wird nur mit Strom versorgt. Durch den Router ist der Arduino dann per IP über das WLAN erreichbar und man kann vom PC aus Befehle schicken. Wie das funktioniert, haben wir hier im Forum schon recht häufig diskutiert. Da sollte die Suchfunktion ganz gute Ergebnisse liefern. Am Ende hat Dein Roboter 2 IP-Adressen. Die erste ist zum Steuern des Roboters über den Arduino und die zweite IP ist von der Kamera, um das Bild abzugreifen.
Mario.
Ok danke schonmal für die Antworten. Ich fang dann erstmal an mich mit dem Ethernet Shield und dem Router vertraut zu machen und melde mich dann später wieder.
So hab mir grade ein Ethernet Shield und einen Router besorgt (telekom Speedport W 701V) und mal versucht das anzuschließen. Wenn ich nur Spannung an den Router anlege, komm ich mit dem PC sogar in das WLAN Netzwerk (Hab natürlich keinen Internetzugriff). Dann hab ich per CAT5 Kabel den Arduino an den Router angeschlossen. Jetzt leuchtet eine der LAN LEDs am Router und am Ethernet Shield leuchten 2 LEDs.
Wie kann ich jetzt mit dem PC den Arduino ansprechen?
Edit:
Versteh ich das richtig das ich dafür Internet brauche? Der Router auf dem Roboter hat ja kein Internet... Und wenn ich den als Client in ein vorhandenes WLAN Netzwerk setze brauch ich ja immer WLAN um den fahren zu lassen. Kann man den nicht per Drahtlosverbindung (WLAN des Roboter-Routers) mit dem PC verbinden und dann in diesem Netzwerk einen Befehl verschicken? Oder ist ein vorhandenes WLAN vorraussetzung?
Liebe Leute hört doch bitte mal auf, ständig vom "Router" zu labern.
Die Funktion, die hier verwendet wird, heisst "Accesspoint" oder "WLAN-Client" - je nachdem, "wie herum" die Funkstrecke betrieben wird. Es ist ja richtig, dass in der DLink-Box AUCH ein Router steckt, aber das ist für das hiesige Beispiel vollkommen Banane. Wie sollen Anfänger etwas lernen, wenn statt der korrekten Begiffe nur Marketing-Geseiere ("WLAN-Router!") verwendet wird.
Ist nicht böse gemeint, aber denkt mal drüber nach, bitte ...
TheFrr22:
So hab mir grade ein Ethernet Shield und einen Router besorgt (telekom Speedport W 701V)
Warum denn so einen großen Router? Ich bin davon ausgegangen, das Du den auf dem Roboter verbauen willst.
Kannst Du bitte nochmal Dein genaues Setup beschreiben? (Welche Geräte gibt es genau und Wo sollen die verbaut werden)
Edit:
Versteh ich das richtig das ich dafür Internet brauche? Der Router auf dem Roboter hat ja kein Internet... Und wenn ich den als Client in ein vorhandenes WLAN Netzwerk setze brauch ich ja immer WLAN um den fahren zu lassen. Kann man den nicht per Drahtlosverbindung (WLAN des Roboter-Routers) mit dem PC verbinden und dann in diesem Netzwerk einen Befehl verschicken? Oder ist ein vorhandenes WLAN vorraussetzung?
Ich glaube hier sollte mal einiges sortiert werden. Internetzugang benötigst Du nicht, ein funktionierendes WLAN aber schon.
Aus meiner Sicht sollte der Aufbau wiefolgt sein.
Es gibt einen WLAN-Accesspoint (das z.B. der WLAN-Router sein, der auch die Internetverbindung für das lokale Netz aufbaut). Dieser ist mit dem PC-Verbunden (Kabelnetzwerk oder WLAN)
Es gibt einen kleinen WLAN-Client (z.B. sowas hier: TP-Link Minirouter. Der ist auf dem Roboter verbaut und per Kabel mit dem Ethernetshield verbunden. Vorteil des TP-Link er ist per USB mit 5V Versorgbar und kann damit parallel zum Arduino betrieben werden. Der TP-Link ist als WLAN-Client konfiguriert und arbeitet quasi als WLAN-Verlängerung des Arduino
Es gibt einen Arudino Ethernet oder einen Arduino mit Ethernet-Shield. Dieser hat eine feste IP-Adresse im lokalen Netzwerk konfiguriert. Über diese IP kann man dann vom PC aus den Arduino ansprechen. Der Rest ist nur die passende Programmierung, um den Arduino auf Befehle lauschen und sie ausführen zu lassen.
Theoretisch könnte man den TP-Link auch als kleinen Accesspoint betreiben, der ein eigenes WLAN aufspannt. Ein PC kann sich dann direkt damit verbinden. Allerdings muß der Accesspoint dann auch den per Kabel angeschlossenen Arudino als "Client" akzeptieren. Hier bin ich nicht 100%ig sicher, ob das geht. Die Chancen stehen aber recht gut.
Vorteil dieser Methode ist, das man keinen zusätzlichen WLAN-Zugang benötigt und somit ein Gerät spart. Nachteil ist, das die meisten Computer / Tablets / Handys nur mit einem WLAN zu einem Zeitpunkt verbunden sein können. Ist also der PC mit dem WLAN des Roboters verbunden, sieht er ein etlv. anderes WLAN für den Internetzugang o.ä. nicht mehr.
Den Router habe ich von einem Kumpel geschenkt bekommen, deshalb hab ich den genommen. Außerdem hat der Speedport mehrere LAN Anschlüsse und der TP-Link nur einen. Für den Arduino mit Ethernet Shield reicht das, aber wenn ich später noch eine IP Kamera anschließen möchte brauche ich mindestens 2. Der Roboter ist ziemlich groß (Radstand Länge: 40cm, Radstand Breite 30cm), da ist das nicht sooo schlimm wenn der Router etwas größer ist.
Es gibt einen WLAN-Accesspoint (das z.B. der WLAN-Router sein, der auch die Internetverbindung für das lokale Netz aufbaut).
Das wollte ich ja eben vermeiden. Der Roboter sollte (wenn möglich) unabhängig vom lokalen Netz sein. Das man den z.b. irgendwo fahren lässt und nur einen Laptop dabei haben muss.
Kannst Du bitte nochmal Dein genaues Setup beschreiben? (Welche Geräte gibt es genau und Wo sollen die verbaut werden)
Also: Ich habe einen Router, welcher auf dem Roboter befestigt wird. Dieses ist per Cat5 Kabel mit dem Ethernet Shield des Arduino Uno verbunden (beide auf dem Roboter). Später soll dann noch eine IP Kamera auf den Roboter, auch per Kabel mit dem Router verbunden. Der PC bzw. Laptop wird via WLAN mit dem Roboter verbunden.
Jetzt müsste ich den Arduino als Client mit dem Accespoint verbinden (LAN Kabel), die IP Kamera als Client mit dem Accespoint verbinden (LAN Kabel) und den Laptop als Client mit dem Accespoint verbinden (Wireless-LAN) oder?
Dann wären Arduino, IP Kamera und Laptop alle Clients im Netzwerk des Accespoints und könnten untereinander kommunizieren (per IP) richtig?
Was denn für Beispielcode? Für den Motor zur Robotersteuerung? Für den Arduino-Ethernet zum Empfangen von Steuersignalen?
Am besten gehst Du erstmal schrittweise vor und zerlegst Dein Projekt in kleinere Aufgaben, die Du leichter bewältigen kannst.
Was hast Du denn auf dem Arduino schon an Code geschrieben? Wie groß sind Deine Erfahrungen generell mit Programmierung im allgemeinen und C/C++ im speziellen?
Dir wird hier sicher keiner das Programm für Deinen Roboter schreiben und Dir muss auch klar sein, das dieses Projekt nicht gerade klein ist. Da wirst Du je nach "Bastelerfahrung" sicher mehrere Monate dran arbeiten.
Ein guter Einstieg ist es, erstmal LEDs blinken zu lassen. So simpel wie das jetzt klingt, kann man damit schon eine Menge erreichen.
Ich würde z.B. erstmal 4 LEDs nehmen. Zwei repräsentieren den linken Antriebsmotor, zwei den rechten. Je eine LED für Vorwärts und eine für Rückwärts.
Dann schriebst Du einen kleinen Sketch der die LEDs erstmal generell leuchten, blinken etc. läßt. Wenn das klappt, dann kommt Code dazu, der Daten die über die serielle Schnittstelle kommen interpretieren kann, um damit die LEDs (vorwärts, rückwärts, rechts, links etc.) anzusteuern. Wenn das klappt, wird der Code auf die Netzwerkklassen übertragen, damit man über eine Netzwerkverbindung die LEDs steuern kann. wenn das klappt, dann macht man sich (das kann aber auch parallel geschehen) an die Motorsteuerung. Da Dein Roboter recht groß ist, dürften da auch einige spannende technische Herausforderungen auf Dich warten.
Wichtig ist aus meiner Sicht, das Du Dir immer nur kleine Teilaufgaben vornimmst, die Du auch bewältigen kannst. Sonst verlierst Du schnell die Lust daran, wenn es nicht voran geht.
Mario.
Das das ein großes Projekt wird hatte ich mir schon gedacht, alleine das ansteuern so "großer" Motoren über einen Akku ist schon schwer, deshalb wollte ich mit der Grundlage anfangen, der Steuerung des ganzen. Der Teil mit dem fahren (lenkung :~) kommt dann später. Das Kommunizieren zwischen Laptop und Roboter ist denke ich mal das wichtigste und grundlegendste.
Also so einfache Sachen wie ein blinkende LED oder ein Lauflich würde ich schon hinbekommen (auch mit der millis Funktion statt dem delay), aber ich habe noch nie etwas mit Netzwerkverbindungen gebastelt. Ich würde das ganze gerne über TCP/IP realisieren, das Problem ist nur das ich nicht weiß wo ich da Anfangen soll mich mit Auseinanderzusetzen. Auf dem PC soll ein Java Programm laufen, das soll ein Socket zum Arduino aufbauen und der soll diese Verbindung annehmen und dann nach gesendeten Strings "lauschen". Der PC schickt diese Strings. Mit einem Code um eine LED über das Netzwerk ein- und auszuschalten wäre mir schon geholfen. Mit einem Beispiel kann man sowas einfach besser verstehen, bzw. für seine Bedürfnisse (Motoren, Servos, etc.) verändern und ausbauen.
Könntest du, bzw. jemand anderes der Ahnung hat mir so ein Beispiel schreiben?
Schau Dir mal folgenden Thread an, da wurde das zwar mit PHP auf der PC-Seite gemacht, aber das Prinzip ist das gleiche. Steuerung des Arduino per TCP-Verbindung. http://forum.arduino.cc/index.php?topic=102817.0
ZUsätzlich kannst Du Dir auch die Beispiele der IDE ansehen. Z.B. der ChatServer aus der Ethernet Bibliothek ist ein guter Ausgangspunkt.
Mario.
Ich hab mal eine Frage zum Router. Ich brauche für meine Vorhaben ja zwei LAN Anschlüsse (Arduino und IP Cam). Wenn ich mir jetzt einen Mini Router wie diesen hier TL-WR710N | Tragbarer 150Mbit/s-WLAN-Router/AP/TV-Adapter/Repeater | TP-Link Deutschland kaufen würde, könnte ich den doch bestimmt aufschrauben und mit weniger Spannung verwenden oder? Der wird ja wohl kaum mit 230V arbeiten.
Außerdem bräuchte ich zwei LAN Kabel die max. 10cm lang sind, so bekommt man sowas her? Kann man das nicht irgendwie mit so einer Crimp-Zange selber machen? So eine könnte ich mir im Labor bestimmt ausleihen..
Wegen des Programmierens treffe ich mich Mittwoch mit einem Bekannten der sich mit sowas auskennt, dann werden wir mal versuchen da was zusammenzubasteln. So ähnlich wie Certax in dem Post oben, nur halt auf der PC Seite anders. Danke nochmal an mkl0815 für die Hilfe, bin schonmal ein Stück weiter!
Ja, die Platine kann man ausbauen und Kabel direkt anlöten:
Das ist für einen WR702. Eine größere Platine passt nicht so schön auf das Ethernt-Shield, aber man kann die ja auch anders montieren.
Die externe Spannungsversorgung sollte eigentlich auch beim WR710 gehen, auch wenn der ein Netzteil eingebaut hat. Man kann wahrscheinlich auch die Leiterbahn von Plus durchtrennen, so dass das Netzteil völlig abgekoppelt ist.
So ich bin jetzt schon ein ganzes Stück weiter gekommen, hänge aber wieder fest
Auf dem Arduino läuft jetzt ein TCP Server und auf dem PC ein Java Programm. Das Programm schickt eine Nachricht an den Server und der gibt die zurück. Die IP Kamera funktioniert auch gut. Jetzt weiß ich nur nicht wie ich die Werte übermitteln soll. Meine Idee war, alle Werte in eine Nachricht zu packen und mit irgendeinem Zeichen (z.b. #) zu trennen. Der Arduino pflückt das dann alles wieder auseinander, also bei jedem # kommt der nächste Wert. Das ganze wird dann ständig hintereinander gesendet.
Die Werte würde ich mit
DataOutputStream outToServer = new DataOutputStream(clientSocket.getOutputStream());
outToServer.writeBytes(1111#22222#333#444444#5555);
versenden, aber wie nimmt man das wieder auseinander? Irgendwie mit char, aber so ganz hab ich das noch nicht verstanden...
Eine Option ist Textfinder und getValue(): http://playground.arduino.cc/Code/TextFinder
Das ist gerade für Anfänger weniger Fehler-anfällig und man kann direkt vom Ethernet Client lesen ohne das vorher in einen extra String-Puffer zu schreiben. Dazu ist mit SerialReceive ein Beispiel in der Lib wie das mit Serial geht. Genauso kann man das auf ein Client Objekt anwenden.
Es ist aber bei einem so einfachen String kein Problem sich mit den Standard C String Methoden einen kleinen Parser zu schreiben: http://www.cplusplus.com/reference/cstring/ (das ist die Standard C Lib. Diese ist nicht mit der auf dem Arduino identisch, aber die Erklärung ist gut) avr-libc: <string.h>: Strings (das ist die Lib die du wirklich hast und die ist automatisch inkludiert. Ist da aber nicht so gut erklärt) String-Funktionen | C-HowTo
Hierfür ist strtok() gut. Ich nehme hier mal an du hast das schon in einen C-String eingelesen (das geht bei Ethernet analog zu Serial mit available() und read()) und gebe das mal testweise als Konstante vor:
strtok() steht für String Tokenizer. Der sucht den String durch und ersetzt jeden Delimiter (das kann auch mehr als ein Zeichen sein) durch NULL. Der Rückgabe-Wert ist ein Pointer auf den Anfang des Tokens (oder NULL wenn fertig). Durch die NULL-Ersetzung ist dieser Teil-String dann korrekt terminiert und kann für sich verarbeitet werden. Pass nur auch dass du nicht aus Versehen auf einen NULL-Pointer zugreifst.
Siehe auch hier:
Hier hat man erst mal blanke Teil-Strings. Aber man kann diese auch mit Funktionen wie atoi() oder atol() in Integer umwandeln. Da kommt es dann darauf an was du damit genau machen willst und was da genau drin steht. Siehe auch stdlib.h für diese Umwandlungs-Funktionen: http://www.nongnu.org/avr-libc/user-manual/group__avr__stdlib.html
Probier das erst mal so statisch, ob du damit hinkommst. Oder wie gesagt TextFinder. Das wird für dich einfacher sein
Die einzige Schwierigkeit bei sowas ist falls man Strings nicht konstanter Länge hat und die Werte in einem Array speichern will. Da man normalerweise im bei so kleinen Prozessoren auf dynamischen Speicherallokierung verzichten will, müsste man das Array auf einem bestimmten Maximalwert festlegen.