diff options
Diffstat (limited to '_posts/2010-09-04-talk-to-me-ein-kleines-arduino-projekt.md')
-rw-r--r-- | _posts/2010-09-04-talk-to-me-ein-kleines-arduino-projekt.md | 240 |
1 files changed, 240 insertions, 0 deletions
diff --git a/_posts/2010-09-04-talk-to-me-ein-kleines-arduino-projekt.md b/_posts/2010-09-04-talk-to-me-ein-kleines-arduino-projekt.md new file mode 100644 index 0000000..fa49350 --- /dev/null +++ b/_posts/2010-09-04-talk-to-me-ein-kleines-arduino-projekt.md @@ -0,0 +1,240 @@ +--- +layout: post +title: "[WIP] Talk to me - Ein kleines Arduino-Projekt." +date: '2010-09-04T14:45:00.005+02:00' +author: uvok +tags: +- arduino +modified_time: '2010-10-28T17:29:33.408+02:00' +thumbnail: https://1.bp.blogspot.com/_iYx36V-6wFY/TIkfJI4BEaI/AAAAAAAAABI/ufuH0QHoFvI/s72-c/ardu.png +blogger_id: tag:blogger.com,1999:blog-3402054131713474507.post-5167631921540516517 +blogger_orig_url: https://uvok.blogspot.com/2010/09/talk-to-me-ein-kleines-arduino-projekt.html +--- + +*Update vom 19.05.2019 (Datum der Migration): Links zum Code wurden in den Post integriert. +An dieser Stelle gilt ein riesiger Dank der +[Wayback Machine vom Internet Archive](https://web.archive.org){:target="_blank"}{:rel="noreferrer"}, +ohne deren Hilfe der Code nicht mehr verfügbar wäre.* + +(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.<br /> +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) + +<a target="_blank" rel="noreferrer" href="https://fritzing.org/">Fritzing</a> sei dank kann ich euch meine +Schaltung zur Verfügung stellen: + +<div class="separator" style="clear: both; text-align: center;"> + <a + href="/assets/ardu.png" + imageanchor="1" + style="margin-left: 1em; margin-right: 1em;"> + <img + border="0" + height="256" + src="/assets/ardu.png" + width="320"/> + </a> +</div> + +Für den Aufbau der Schaltung siehe obige Abbildung. <br />Weiterhin verweise ich +hier auf +<a target="_blank" rel="noreferrer" href="https://arduino.cc/en/Tutorial/LiquidCrystal">https://arduino.cc/en/Tutorial/LiquidCrystal</a> +und auf +<a target="_blank" rel="noreferrer" href="https://www.ladyada.net/learn/lcd/charlcd.html">https://www.ladyada.net/learn/lcd/charlcd.html</a>. +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.<br />Weiterhin solltet ihr auf eurem PC einen Webserver mit +PHP-Unterstützung haben. Ich hab hier Lampp laufen.<br />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: + +~~~ c +// include the library code: +#include <LiquidCrystal.h> + +// initialize the library with the numbers of the interface pins +LiquidCrystal lcd(2, 3, 8, 9, 10, 11); +int count=0; + +void setup(){ + // set up the LCD's number of rows and columns: + lcd.begin(16, 2); + // initialize the serial communications: + Serial.begin(9600); + lcd.print("Send serial data"); +} + +// Scrolling *very* long messages results in error (line jumping etc). +// This function *should* prevent it +void overflow() { + // Autoscroll schonmal aus, brauchen wir dann bis zum "neuen" 32. Chr eh nicht mehr + lcd.noAutoscroll(); + + // lass den Nutzer noch zu Ende lesen + delay(1500); + + // Loeschen und zur ersten Position + lcd.clear(); + + // Counter wieder auf 0 + count=0; +} + +void loop() +{ + // when characters arrive over the serial port... + if (Serial.available()) { + // wait a bit for the entire message to arrive + delay(100); + // clear the screen + lcd.clear(); + // read all the available characters + while (Serial.available() > 0) { + // display each character to the LCD + count++; + lcd.write(Serial.read()); + + // wechsele in die naechste Zeile + if(count==16) lcd.setCursor(0,1); + + // Autoscroll an und warten bis der Nutzer die Displayanzeige gelesen hat + if(count==32) { lcd.autoscroll(); delay(2000); } + + //Und los geht das scrollen + if(count>=32) delay(500); + + // Bevor der Pufferueberluf (?) beginnt + if(count==54) overflow(); + } + lcd.noAutoscroll(); + } + count = 0; +} +~~~ + +Ich hab hier ein 16x2 LCD mit meiner Anschlussbelegung. Wie das +LCD-Objekt initialisiert werden muss, steht auch auf der arduino.cc Seite.<br />Wenn +ihr ein 4-zeiliges LCD habt, könnt ihr den Quelltext natürlich anpassen. + +Bash-Skript: + +~~~ bash +#Pfad zur Text-Datei anpassen +FILE="/opt/lampp/htdocs/test/text.txt" +LASTMOD=`stat -c '%Y' $FILE` + +while [ 1 ]; do +NOWMOD=`stat -c '%Y' $FILE` +if [ $NOWMOD -ne $LASTMOD ]; then + LASTMOD=$NOWMOD; + cat $FILE > /dev/ttyUSB0 + #Zusätzliches Nachrichtenlog + cat $FILE >> /home/user/arduino/newslog.txt + echo >> /home/user/arduino/newslog.txt +fi +~~~ + +Das Bash Skript prüft die Text-Datei, in die per PHP die Nachrichten geschrieben +werden.<br />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:<br />Das Formular: + +~~~ html +<form action="proc.php" method="post"> + +<p>Nachricht eingeben: <br /> +<input type="Text" name="text" size=44 maxlength=42></p> + +<input type="Submit" name="" value="speichern"> + +</form> +~~~ + +Und die Seite, die die Eingaben verarbeitet: + +~~~ php +<?php +$text = $_POST['text']; +if ( strlen($text) >= 43 ) { + echo "Nachricht zu lang!"; + exit; +} + +if ( strlen($text) == 0 ) { + echo "Keine Nachricht eingegeben!"; + exit; +} + +if ( $text <> "" ) { + $handle = fopen ( "text.txt", "w" ); + fwrite ( $handle, $text ); + fclose ( $handle ); + echo "Nachricht wurde gespeichert: " . $text; + exit; +} +?> +~~~ + +Es empfiehlt sich ggf, das Formular mit einem Captcha zu schützen oder andere +Schutzmaßnahmen einzubauen. Ansonsten 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 +^^<br />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 + +<a target="_blank" rel="noreferrer" href="/assets/ardu-example.jpg"> +<img + alt="ArduLCD" + border="0" + height="300" + src="/assets/ardu-example.jpg" + width="400"/> +</a> |