1. Diese Seite verwendet Cookies. Wenn Sie sich weiterhin auf dieser Seite aufhalten, akzeptieren Sie unseren Einsatz von Cookies. Weitere Informationen
  2. Kandidat werden bei Die Modellbauer
    Information ausblenden

Praxisbericht Arduino - Zusatzhardware und Sensoren

Dieses Thema im Forum "Arduino, RaspberryPi und Co." wurde erstellt von BAXL, 26. April 2019.

  1. BAXL

    BAXL Moderator Mitarbeiter

    Nachdem ich nun schon ein wenig mit dem Arduino "herumgespielt" habe, sind immer mehr Zusatzelektroniken zum Einsatz gekommen. Ich weiß, dass hier einige Kollegen sich ein Starterset gekauft haben, aber irgendwie nicht so richtig wissen wie sie es anstellen sollen, also wäre hier genau der richtige Platz, um den Einstieg etwas zu erleichtern.

    An den Arduino kann man eine Reihe elektronischer Komponenten (Transistor, Diode, Fotoelemente usw.) quasi direkt anschließen und ohne größere Zusatzbeschaltung in Betrieb nehmen (evtl. mal ein Widerstand bei einer LED oder einem Transistor). Es gibt aber auch komplette Module (Relaismodule, Echtzeituhren, SD-Kartenleser usew.), die bereits eine aufwändigere Zusatzbeschaltung enthalten, um diese ebenfalls sehr einfach an den Arduino anschließen zu können. Diese Zusatzmodule werden entweder über Steckbrücken angeschlossen, oder in Form von so genannten Shields direkt auf die Arduinoplatine aufgesteckt.

    In diesem Thema kann/darf/soll jeder von Bauteilen, Zusatzmodulen und Shields kurz berichte. Was kann die Hardware? Wozu verwendet man sie und wo ist sie ggf. erhältlich? Umfangreichere Erklärungen (gerne auch mit Anschluß- und Programmbeispiel) sind besser in eigene Themen unterzubringen, weil dazu sicher noch Nachfragen kommen können. Ein erster Überblick kann aber hier aufgeschrieben werden.

    Gerne mache ich den Start.
     
    BlackbirdXL1 gefällt das.
  2. BAXL

    BAXL Moderator Mitarbeiter

    Der Temperatursensor LM35

    In vielen Anwendungen ist eine Temperatur zu messen. Diese kann man einfach nur anzeigen lassen, oder für eine Steuerungsaufgabe aktiv auswerten und z.B. ein Relais ein und wieder ausschalten. Es gibt viele Messensoren, die zum Teil unterschiedlich funktionieren.

    Dabei ist mir in der Anwendung als einfachste Variante der LM35 untergekommen. Der LM35 ist schon eine richtige Zusatzelektronik in einem transistorartigen Gehäuse. Er hat drei Beine und misst die Temperatur. In Abhängigkeit von der Temperatur gibt er eine Spannung aus, die man über einen analogen Eingang des Arduinos direkt messen kann. Eine besondere Zusatzbeschaltung ist nicht erforderlich. Die drei Anschlußbeine werden einmal an Plus 5V, an Masse und an einen analogen Port angeschlossen. Das braucht nur drei Verbindungsleitungen.

    Den LM35 kann man z.B. bei Reichelt für rund einen Euro kaufen. Der angegbene Meßbereich ist von 0 - 150°C. Die Angabe unterscheiden sich manchmal, je nachdem, welche Variante des LM35 man erwischt. Gelegntlich wird als Maximaltemperatur auch nur 100°C angegeben. Bei 0°C gibt der LM35 eine Spannung von 0V aus. Pro Grad Celsius steigt die ausgegbene Spannung um 10 mV, also 0,01V. Bei 25°C wären das dann 250mV.

    Bei funduino.de findet man ein Beispielprogramm, dass direkt in den Arduino geladen werden kann.
     
    BlackbirdXL1 gefällt das.
  3. BAXL

    BAXL Moderator Mitarbeiter

    Der Dallas DS18B20 Temperatursensor

    Ein weiterer Vertreter für die Temperaturmessung ist der DS18B20. Auch dieser Sensor beinhaltet eine Komplette Mess- und Auswerteelektronik. Wie schon beim TMP36 benötigt man nur drei Anschlussleitungen und einen einfachen Widerstand von 4,7 kilo Ohm. Im Unterschied zum TMP36 wird aber keine auswertbare Spannung ausgegeben, sondern direkt ein Messwert als Zahl. Möglich wird das über die Art, wie der DS18B20 das Ergebnis an den Arduino übermittelt. Die Übermittlung erfolgt über eine Art serieller Kommunikation.

    Angeschlossen wird wieder plus 5V, Masse und eine Leitung an einen digitalen Arduinopin.
    Damit die Übermittlung elektrisch funktioniert, wird die Datenleitung des DS18B20 über den erwähnten 4k7 Widerstand an plus 5V angeschlossen.

    Die Messwertübermittlung selbst wird in Form von Datenpaketen an den digitalen Pin gesendet. Aber keine Angst, für das Auslesen der Werte gibt es vorgefertigte Programmbibliotheken, die man einfach in das eigene Programm einbindet. Man muß dann nur noch die entsprechenden Funktionen in einer Programmzeile aufrufen. Auch dafür gibt es genügend Beispiele, die man einfach in die Programmieroberfläche des Arduinos kopiert und startet.

    Natürlich kann man die Beispielprogramme 1:1 übernehmen, doch soll die Temperaturmessung nur ein kleiner Teil des eigenen Programms sein. Dazu sind ein paar Sachen erklärungswürdig. Doch das sprengt den Rahmen dieses Posts und wird von mir in einem eigenen Thema ausführlicher beschrieben.

    Den Dallas DS18B20 bekommt man in allen einschlägigen Shops für rund 2€ das Stück. Ich habe meine Exemplare, die zudem noch wasserdicht sind und ein Kabel haben, bei AZ-Delivery gekauft, die versenden auch über Amazon. Link direkt zum Shop, Link zum Amazon-Shop.


    Und so sehen die Dinger aus. Einmal als wasserdichte Version mit Anschlußkabel und im einfachen TO-Gehäuse. (das obere Bild symbolisch, es ist eigentlich der TMP36)

    [​IMG]

    [​IMG]
     
    Zuletzt bearbeitet: 17. Mai 2019
    BlackbirdXL1 gefällt das.
  4. BAXL

    BAXL Moderator Mitarbeiter

    PT100 / PT1000 Widerstände

    Mit am einfachsten sind temperaturabhängige Widerstände. Das sind passive elektronische Bauteile, die bei Temperaturänderung auch ihren Widerstand verändern. Um damit messen zu können, benötigt man idR. einen weiteren Festwiderstand, der zusammen mit dem Messwiderstand einen Spannungsteiler bildet. Man misst dann den Spannungsfall am Messwiderstand. Weit verbreitet sind PT100 und PT1000 Messwiderstände, die aus Platin bestehen und ein relativ lineares Widerstandsverhalten bei Temperaturänderung haben.
    Der Name PT100 und PT1000 kommt von dem Widerstandswert, den diese Widerstände bei 0°C haben. Der PT100 eben 100 Ohm und der PT1000 1000 Ohm bzw 1kOhm.
    Die Widerstandsveränderung bzw. der Widerstand für eine bestimmte Temperatur, errechnet sich aus einer Formel, die man je nach Sensortyp leicht im Internet findet.
    Für die Messung mit dem Arduino fließt dann noch die verwendete Spannung für den Spannungsteiler ein. Diese Sensoren sind je nach Ausführung günstig zu erhalten (PT100), können aber auch recht teuer werden (PT1000). Unterm Strich steht man sich preislich und beim messtechnischen Aufwand bei dem LM35 oder dem DS18B20 besser. Darum weite ich diese Sensoren hier nicht weiter aus. Wer aber Lust hat kann sich gerne damit auseinandersetzen und hier berichten :).
     
    BlackbirdXL1 gefällt das.
  5. BAXL

    BAXL Moderator Mitarbeiter

    Anzeigedisplay 2x16

    Interessant wird es erst, wenn man gemessene Werte auch ohne die Hilfe des PCs anzeigen lassen kann. Das hat bei mir z.B. den Durchbruch bei der Motivation des Weitermachens gebracht. Ich dachte zuerst das sei sehr kompliziert, aber...

    In einem zweiten Arduinoset, dass ich mir zwischenzeitlich gekauft hatte, war ein LCD-Display dabei, das 16 Zeichen in 2 Reihen darstellen kann. Und zwar so eins hier:

    [​IMG]

    Man sieht schon einen Messwert angezeigt, den ich mit einem DS18B20 gemessen habe.

    Die Krux ist die Ansteuerung. Man kann das umständlich machen, also mehrere Datenleitungen an das Display anschließen, oder man nimmt ein kleines Zusatzmodul (I2C-Converter), das nur Plus, Masse und zwei Datenpins benötigt. Dieser I2C-Converter erhält seine Steuersignal als serielles Datenpaket und leitet das dann umgewandelt an die Signalpinns des Displays weiter - vollautomatisch :) :

    [​IMG]

    Auch hier ist die Ansteuerung sehr einfach. Man benötigt wieder eine kleine Programmbibliothek, die einem Funktionen für das Beschreiben des Displays zur Verfügung stellt. Es geht zwar auch "zufuß", allerdings bindet das einige Digitalausgänge des Arduinos mehr. Sowohl das Display, als auch die messensoren arbeiten über eine Art Bussystem, das es elaubt mehrere dieser Geräte parallel anzuschließen, ohne weitere Signalpins des Arduinos zu opfern.

    So ein Display gibt es in unterschiedlicher Ausführung. Mal grün, mal blau, mal mit 2x16 Zeichen oder 4x20 Zeichen. Die Kosten halten sich im niedrigen Eurobereich. So ein 2x16 LCD-Display mit i2C-Converter kostet z.B. bei AZ-Delivery 2,99€. Ein 4x20 Display inkl. I2C-Converter kostet über Amazon 9€. Die Preise schwanken nur geringfügig, je nach Anbieter. AZ-Delivery nenne ich nur deshalb meistens, weil ich da die Sachen überwiegen kaufe und zu jedem Bauteil oder Modul eine ausführliche deutsche Beschreibung inkl. Beispielprogramm dazubekomme.

    Hier zum Vergleich noch mal das 4x20 LCD-Display im Vergleich zum 2x16 Display.

    [​IMG]
     
    Zuletzt bearbeitet: 26. April 2019
    Crazy virus 4.0 und BlackbirdXL1 gefällt das.
  6. BAXL

    BAXL Moderator Mitarbeiter

    SD-Kartenlese und Echtzeituhr Shield

    Wenn man es soweit geschafft hat Messwerte zu erfassen und auf einem Display anzuzeigen, kann man sich die ansehen und daran freuen. Möchte man diese Werte aber nutzen, wäre es nützlich diese zu konservieren und mit einem Zeitstempel zu versehen. Der Arduino bieten von Hause aus keine derartige Funktionalität. Doch dafür gibt es Zusatzmodule, natürlich mit entsprechenden Hilfsbibliotheken. Weil es mir einfach erschien, habe ich mir gleich ein komplettes Shield bestellt. Darauf ist ein Einschub für eine normalgroße SD-Karte, eine Echtzeituhr und ein kleines Lochrasterfeld, um ggf. eigene kleine Schaltungen darauf unterzubringen. Das Shield heißt DatenLogger Modul und kostet bei diversen Anbietern so zwischen 7 - 8 €. Diese Module (SD-Kartenleser, Echtzeituhr) gibt es auch getrennt. Das kann praktisch bei einem Einbau in ein Gehäuse sein. Würde man alle Zusatzmodule in Form eines Shields bestellen, hätte man irgendwann einen riesigen Stapel Platinen übereinandergesteckt :).

    Das Shield sieht so aus:

    [​IMG]

    Die Echtzeituhr läuft mit Datum und Uhrzeit, die SD-Karten sollten in FAT32 formatiert sein, damit diese erkannt, gelesen und beschrieben werden können.
    Es gibt so ein paar Kleinigkeiten, die ich nur am Rande erwähnen möchte. Dateinamen können mit der verfügbaren Programmbiliothek (Library) nur Dateinamen im alten DOS-Format 8.3 bedienen. D.h., der Name kann nur 8 Zeichen und die Dateierweiterung nur 3 Zeichen lang sein. Es sollte auf Umlaute und Sonderzeichen (bis auf - und _) verzichtet werden.

    Die Echteituhr liefert schon das Datum und die Uhrzeit zurück, aus irgendeinem Grund, den ich noch nicht herausgefunden habe, ist es schwierig bei einstelligen Monats-, Tages-, Sekunden-, Minuten- und Stundenzahlen, diese mit einer führenden Null auszugeben. Dafür ist ein gewisse Programmieraufwand nötig. Auf dem nachfolgenden Foto ist das an der Sekundenanzeige zu sehen. Es macht übrigens keinen Unterschied welches Ausgabemedium verwendet wird, die führenden Nullen sind nur mit Programmieraufwand möglich.

    [​IMG]

    Schreibt man diese Angaben aber in eine Datei, dann kommt z.B. Excel damit trotzdem klar und ordnet das richtig zu. Natürlich muß die Uhr erst einmal gestellt werden. dazu gibt es Miniprogramme für den Arduino, in denen man die Zahlenwerte von Hand einträgt und hochlädt, oder aber, wenn die Uhr des PCs richtig stimmt, diese Daten übernimmt und an die Uhr übergibt. Ich habe letzteres verwendet.
     
    Zuletzt bearbeitet: 26. April 2019
  7. BAXL

    BAXL Moderator Mitarbeiter

    Anzeigedisplay 2004 / 4 Zeilen, 20 Zeichen

    [​IMG]

    Im oberen Bild ist das 2004 Display bereits zu sehen. Für die Inbetriebnahme, habe ich einen meiner Arduino Nano Nachbauten genommen. Der erste Versuch, das Display einfach am Uno, an die Anschlüsse des 1602 zu stecken, hat leider nicht funktioniert. Scheinbar sind die verwendeten Bibliotheken nicht kompatibel. Beim 1602 brauchte ich nur die Displaygröße (16,2) in der Initialisierung angeben, beim 2004 musste dem I2C-Modul ebenfalls eine Pinreihenfolge übergeben werden. Wie sich die ergibt und was genau damit gemeint ist habe ich noch nicht herausgefunden. Gut dass ich eine Anleitung und einen Demosketch dafür hatte.

    Man achte auch darauf, dass beim Befehl lcd.setcursor(s,z); der erste Wert die Spaltenposition ist und der zweite Wert die Zeile und dass dort bei 0 angefangen wird zu zählen. (0,0) ist dann (Spalte 1, Zeile 1)

    #include <LiquidCrystal_I2C.h>

    LiquidCrystal_I2C lcd(0x27,2,1,0,4,5,6,7,3,POSITIVE);

    void setup() {

    lcd.begin(20, 4);
    lcd.clear();

    lcd.setCursor(0,0);
    lcd.print("Testtext Zeile 1");
    lcd.setCursor(0,1);
    lcd.print("Testtext Zeile 2");
    lcd.setCursor(0,2);
    lcd.print("Testtext Zeile 3");
    lcd.setCursor(0,3);
    lcd.print("Testtext Zeile 4");

    }

    void loop() {

    lcd.setBacklight(HIGH);
    delay(1000);
    lcd.setBacklight(LOW);
    delay(1000);
    }
     
  8. DFENCE

    DFENCE Mitglied

    Ich könnte berichtet über alles was ich habe, aber dazu bräuchte ich Monate weil ich seit nem Jahr AZ Delivery und co wöchtenlich abgesucht hab und viel sehr sehr viel gekauft hab. Ich kann aber über bestimmte Bauteilgruppen berichten wenn jemand was bestimmtes sucht.
    Einfach nachfragen :)
     
  9. BAXL

    BAXL Moderator Mitarbeiter

    RTC DS3231 AT24C32 Real Time Clock

    Gestern trudelte wieder ein kleines Tütchen aus dem Osten ein. Eine Echtzeituhr basierend auf dem DS3231 Chip. Das besondere an diesem Modul ist die Ganggenauigkeit. Durch eine Temperaturmessung und eines Korrekturprogramms soll die Abweichung nur wenige Sekunden im Jahr sein. Es gibt Berichte,wo die Abweichung faktisch Null sein soll. Wenige Sekunden reichen mir aber schon. :)

    Das Platinchen habe ich bei Amazon bestellt und hat mich 84 Ct zuzüglich 1,05€ Versandkosten gekostet. Lieferzeit war ca. 2 Wochen.

    Und so sieht die Platine, bereits mit einem Arduino verbunden, aus.

    [​IMG]

    Ganz wichtig ist der Anschluß. Zuerst die Betriebsspannung (das Teil läuft von 3,3 - 5 V), also +5V und GND. Der Anschluß SLC der Uhr kommt beim Arduino an A5 und SDA an A4.

    Zum Stellen der Uhr habe ich ein Sketch von Matthias Busse verwendet. Link zu seiner Seite:

    Man muß allerdings hier die Uhrzeit von Hand im Sketch eintragen und mit einem Vorlauf von ca. 4s zur eingetragenen Zeit hochladen.

    Edit: Und sie läuft. Zusammen mit dem 2004 Display und dem Nano.

    Edit: Die Uhr läuft nun schon seit 13 Tagen und ich konnte keine Abweichung der Uhrzeit feststellen. Ich vergleiche immer mit meiner Funkuhr.

    [​IMG]

    ----------------------------------------------------------------------------------------------------------------
    ACHTUNG!

    Folgender Sketch setzt bei jedem Neustart des Arduinos die Uhrzeit so, wie es im Programmquellcode steht. Damit die Uhr also nicht jedes mal wieder verstellt wird, muss man das Uhrenmodul vor dem nächsten Reset oder Power on, vom Arduino trennen.

    Möglichkeit zwei wäre es, im Quellcode die Zeile "einstellenDS3231zeit(00, 48, 11, 7, 4, 5, 19);" , durch zwei // auszukommentieren und den Sketch erneut compilieren und übertragen.
    -----------------------------------------------------------------------------------------------------------------

    Der Sketch:

    // Einstellen der Uhrzeit vom RTC3231
    // Die aktuelle Zeit wird in Setup() eingestellt und beim Start übertragen
    // Dazu wird das Programm ca. 4 Sekunden vor der eingestellten Zeit übersetzt
    // und übertragen, dann ist es rechtzeitig fertig
    // SLC an A5, SDA an Pin A4
    // Matthias Busse 7.11.2016 Version 1.0

    #include "Wire.h"
    #define DS3231_ADDRESSE 0x68

    void setup() {
    Wire.begin();
    Serial.begin(9600);
    // aktuelle Zeit sek min std wt tag mon jahr
    einstellenDS3231zeit(00, 48, 11, 7, 4, 5, 19);
    }

    void loop() {
    zeigeZeit(); // Zeit ausgeben
    delay(5000); // jede Sekunde
    }

    void einstellenDS3231zeit(byte sekunde, byte minute, byte stunde, byte wochentag, byte tag, byte monat, byte jahr) {
    // Datum und Uhrzeit einstellen
    Wire.beginTransmission(DS3231_ADDRESSE);
    Wire.write(0);
    Wire.write(decToBcd(sekunde)); // Sekunden einstellen
    Wire.write(decToBcd(minute)); // Minuten einstellen
    Wire.write(decToBcd(stunde));
    Wire.write(decToBcd(wochentag)); // 1=Sonntag ... 7=Samstag
    Wire.write(decToBcd(tag));
    Wire.write(decToBcd(monat));
    Wire.write(decToBcd(jahr)); // 0...99
    Wire.endTransmission();
    }


    void leseDS3231zeit(byte *sekunde, byte *minute,byte *stunde, byte *wochentag, byte *tag, byte *monat, byte *jahr) {
    Wire.beginTransmission(DS3231_ADDRESSE);
    Wire.write(0); // DS3231 Register zu 00h
    Wire.endTransmission();
    Wire.requestFrom(DS3231_ADDRESSE, 7); // 7 Byte Daten vom DS3231 holen
    *sekunde = bcdToDec(Wire.read() & 0x7f);
    *minute = bcdToDec(Wire.read());
    *stunde = bcdToDec(Wire.read() & 0x3f);
    *wochentag = bcdToDec(Wire.read());
    *tag = bcdToDec(Wire.read());
    *monat = bcdToDec(Wire.read());
    *jahr = bcdToDec(Wire.read());
    }

    void zeigeZeit(){
    byte sekunde, minute, stunde, wochentag, tag, monat, jahr;
    leseDS3231zeit(&sekunde, &minute, &stunde, &wochentag, &tag, &monat, &jahr); // Daten vom DS3231 holen
    if (tag < 10) { Serial.print("0");}
    Serial.print(tag); // ausgeben T.M.J H:M:S
    Serial.print(":");
    if (monat < 10) { Serial.print("0");}
    Serial.print(monat);
    Serial.print(":20");
    Serial.print(jahr);
    Serial.print(" ");
    if (stunde < 10) { Serial.print("0");}
    Serial.print(stunde, DEC); // byte in Dezimal zur Ausgabe
    Serial.print(":");
    if (minute < 10) { Serial.print("0");}
    Serial.print(minute, DEC);
    Serial.print(":");
    if (sekunde < 10) { Serial.print("0"); }
    Serial.println(sekunde, DEC);
    }

    byte decToBcd(byte val) {
    // Dezimal Zahl zu binary coded decimal (BCD) umwandeln
    return((val/10*16) + (val%10));
    }

    byte bcdToDec(byte val) {
    // BCD (binary coded decimal) in Dezimal Zahl umwandeln
    return((val/16*10) + (val%16));
    }
     
    Zuletzt bearbeitet: 17. Mai 2019
  10. BAXL

    BAXL Moderator Mitarbeiter

    Demarkt SPI Leser Micro Speicher SD TF Karte Speicherkarte

    Mein letzter Neuzugang waren 5 SD-Kartenleser für Micro SD-Karten. Bei einem Angebot von 2,91€ zuzügl. 1,10€ Versand für 5 Stück bei Amazon, konnte ich nicht widerstehen.

    [​IMG]

    [​IMG]

    Die Module sehen recht ordentlich aus. Angeschlossen ist schon eins, habe es aber noch nicht ausprobiert.
    Sobald es läuft ergänze ich hier.
     
    Zuletzt bearbeitet: 17. Mai 2019
  11. BAXL

    BAXL Moderator Mitarbeiter

    Mega 2560 R3 Board mit ATmega2560

    Ein Arduino Mega Nachbau hat auch den Weg zu mir gefunden. Für knapp 15€ von AZ-Delivery über Amazon. Nötig wurde das, weil ich mit dem Uno an die Speichergrenzen gestoßen bin, obgleich das Programm nicht sonderlich groß war und auch nicht übermäßig viele Variablen benutzt wurden. Mir wurde beim Compilieren nur immer gemeldet, dass der Speicher knapp würde und es zu Programmlauffehlern kommen könne. Weil das Projekt aber für eine Solarsteuerung gedacht ist, kann ich mir unvorhergesehene Abstürze nicht leisten.

    Mit 256 KB Flashspeicher (inkl. 8 KB für Bootloader), 8 KB SRAM und 4 KB EEPROM-Speicher sollte ich auf der sicheren Seite sein. Als angenehmen Nebeneffekt stehen mir jetzt noch mehr Ein- und Ausgänge zur Verfügung. 55 digitale I/O-Pins, davon 15 mit 8-bit-PWM, 16 analoge Inputs mit 10 bit Auflösung, 6 externe Interrupt-Pins, 2 Hardware-Serial-Verbindungen, je 1x SPI & I²C

    [​IMG]
     

Diese Seite empfehlen