Samstag, 4. September 2010

[WIP] Talk to me - Ein kleines Arduino-Projekt.

(last edit : 28.10.2010)
(Anmerkung: Zur Zeit ist das wirklich nur eine sehr kurze Anleitung, die ich zu einem späteren Zeitpunkt hoffentlich noch ausbauen kann)

Vor kurzem habe ich ein Arduino-Board erworben. Da ich noch zusätzlich ein LCD hatte, wollte ich natürlich auch damit arbeiten.

Nach einiger Einarbeitung kam ich auch zum Beispiel "Texte per serieller Schnittstelle an das Arduino-Board senden". Da war auch schon die Idee da: Ich lasse mir übers Internet Nachrichten ans LCD schicken.


Neu ist die Idee nicht, ich hab das schon irgendwo mal gesehen. Dennoch wollte ich das mal probieren.

Da ich kein Ethernet-Shield habe, muss das Board per USB am PC bleiben, die Kommunikation erfolgt per serieller Schnittstelle. Das Board muss also die ganze Zeit am USB hängen.

Da ich eigentlich an meiner Belegarbeit arbeiten müsste, nur eine (ganz kurze) Projektvorstellung:

Was wird benötigt?

Hardware

Erstmal braucht man ein Board. Ich verwende das Arduino Duemilanove. Wer das ältere Diecimila benutzt, ist sogar besser dran - siehe weiter unten, warum.
Weiterhin braucht man ein LCD (jedes sollte funktionieren, sofern es sich per LiquidCrystal-Bibliothek ansteuern lässt), evtl. eine Diode (ich hab hier eine 1N4007).

Ein Potentiometer zur Kontrasteinstellung sollte auch vorhanden sein.

Wer ein Board mit Autoreset hat, braucht auch einen 110~120 Ohm Widerstand. (2x 220 Ohm parallel tun es natürlich auch).

(edit, 09.09.2010)

Fritzing sei dank kann ich euch meine Schaltung zur Verfügung stellen:



Für den Aufbau der Schaltung siehe obige Abbildung.
Weiterhin verweise ich hier  auf http://arduino.cc/en/Tutorial/LiquidCrystal und auf http://www.ladyada.net/learn/lcd/charlcd.html. Lest zur Pinbelegung des LCD auf jeden Fall das Datenblatt.

Meins LCD verträgt z.B. nur 4,2 Volt am Eingang des Backlight-Pins. Daher brauch ich die Diode, um die Spannung von 5V auf 4,3 V runterzubekommen. (Wenn Ihr wollt, könnt ihr auch einen Spannungsteiler mit einem 2. Poti aufbauen, damit ihr die Helligkeit regeln könnt).

Nochmal zum Autoreset: Wenn ihr per echo Daten an /dev/ttyUSB0 sendet, resettet sich das Board, Das führt dazu, dass die Nachricht am Ende nicht auf dem LCD angezeigt wird. Deshalb muss der Reset-Pin über einen 110 Ohm-Wiederstand mit 5V verbunden werden. Ist der Widerstand größer, resettet sich das Board trotzdem, ist er kleiner, zerschießt ihr evtl. euer Board (danke an die Leute vom arduino.cc Forum)

DAS führt natürlich dazu, dass Arduino(IDE) das Board beim Programmieren nicht automatisch resettet. Also den Wiederstand beim Programmieren entfernen oder manuell resetten. (Ich muss sowieso den 5V-Stecker beim Programmieren entfernen, da der Programmer sonst nicht erreichbar ist.)

Wie oben erwähnt: Die älteren  Diecimila haben kein Autoreset und brauchen das nicht.

Software

Ich gehe hier nur Auf Linux ein. Ich hab keine Ahnung, wie man unter Windows Daten direkt an nen COM-Port per Kommandozeile schickt. Vll. kann ja jemand was dazu beitragen.
Weiterhin solltet ihr auf eurem PC einen Webserver mit PHP-Unterstützung haben. Ich hab hier Lampp laufen.
Arduino-Entwicklungsumgebung sollte installiert sein, wenn ihr wisst wie, könnt ihr auch direkt in Emacs rumhacken, das ganze per avr-gcc kompilieren und dann mit avrdude brennen (Arduino-Entwicklungsumgebung macht nichts anderes).

Hier der Code von der Sketch: http://c.pastebin.com/niFH8DSC
Ich hab hier ein 16x2 LCD mit meiner Anschlussbelegung. Wie das LCD-Objekt initialisiert werden muss, steht auch auf der arduino.cc Seite.
Wenn ihr ein 4-zeiliges LCD habt, könnt ihr den Quelltext natürlich anpassen.

Bash-Skript: http://pastebin.com/aLSvEgEt
Das Bash Skript prüft die Text-Datei, in die per PHP die Nachrichten geschrieben werden.
Das Bash-Skript muss evtl noch ergänzt werden, sodass zu Beginn der /dev/ttyUSB-Port mit einer Baud von 9600 initialisiert wird. Dazu wird der Befehl

stty -F /dev/ttyUSB0  9600

als erstes ausgeführt werden. Falsche Baud führt jedenfalls zu falschen Zeichen auf dem Display

Zuletzt noch die Seiten für den Webserver:
Das Formular: http://pastebin.com/Lw1qv8bp
Und die Seite, die die Eingaben verarbeitet: http://pastebin.com/y84K80Zx

Es empfiehlt sich ggf, das Formular mit einem Captcha zu schützen oder andere Schutzmaßnahmen einzubauen. Ansonten kann es passieren, dass man zugespammt wird. Mit curl ist es z.B. möglich, Daten an Formulare (sowohl POST als auch GET) zu senden.

Sollte ich in meiner Eile was vergessen haben, sagt Bescheid ^^
Hier noch ein Bild vom Ergebnis. Hier kann man auch gleich etwas von der Verkabelung erkennen, der +Pin ist 5V, der -Pin logischerweise auf GND

ArduLCD


Stumble Upon Toolbar

Keine Kommentare:

Kommentar veröffentlichen