---
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.
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
https://arduino.cc/en/Tutorial/LiquidCrystal
und auf
https://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:
~~~ c
// include the library code:
#include
// 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.
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.
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:
~~~ html
~~~
Und die Seite, die die Eingaben verarbeitet:
~~~ php
= 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
^^
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