summaryrefslogtreecommitdiff
path: root/_posts/2010-09-04-talk-to-me-ein-kleines-arduino-projekt.md
blob: ae330f44bbbdd5a7b2497a9a3f074f4c70498f00 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
---
title: "[WIP] Talk to me - Ein kleines Arduino-Projekt."
date: '2010-09-04T14:45:00.005+02:00'
tags:
- arduino
- tech
categories: tech
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
lang: de
last_modified_at: 2021-03-07 13:27 +01:00
mod_d_test: 2021-03-07T12:34:08+01:00
description: "Vorstellung eines kleinen Elektronik-Projekts: Nachrichten an ein LCD schicken (mit Webserver)"
---

*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),
ohne deren Hilfe der Code nicht mehr verfügbar wäre.*

Update 07.03.2021: Toter Link gefixt.

(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 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="https://pics.uvokchee.de/upload/2020/05/18/20200518200050-cd21e27d.png"
    imageanchor="1"
    style="margin-left: 1em; margin-right: 1em;">
    <img
      border="0"
      src="https://pics.uvokchee.de/i.php?/upload/2020/05/18/20200518200050-cd21e27d-me.png"
      alt="Der Schaltungsaufbau, Verbindung Arduino mit LCD" />
    </a>
</div>

Für den Aufbau der Schaltung siehe obige Abbildung. <br />Weiterhin verweise ich
hier auf
<a href="https://www.arduino.cc/en/Tutorial/LibraryExamples/HelloWorld/">
https://www.arduino.cc/en/Tutorial/LibraryExamples/HelloWorld/
</a>
und auf
<a 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 href="https://pics.uvokchee.de/upload/2020/05/18/20200518200050-39c41bdc.jpg">
<img
    alt="ArduLCD"
    border="0"
    height="300"
    src="https://pics.uvokchee.de/i.php?/upload/2020/05/18/20200518200050-39c41bdc-me.jpg"
    width="400"/>
</a>