Echtzeitfähiges Arduino Projekt Frage

Hallo,

ich bin aktuell am Planen eines Projektes und brauche diesbezüglich ein wenig Hilfe was die Auswahl der richtigen Soft und/oder Hardware angeht.

Zum Projekt selbst:

Der Arduino ist das Bindeglied für eine RFID / Chipkarten Steuerung.
An den Arduino selbst wird eine RFID Antenne angeschlossen, mit welcher die jeweiligen Chipkarten ausgelesen werden können.
Diese Chipkarten sind jeweils mit einem einzigartigen Code versehen, sodass eine exakte Zuordnung erfolgen kann.

Nun soll im Programmcode / SD Karte des Arduinos eine Datenbank hinterlegt werden, in welche die zugehörigen Aktionen für die jeweilige Chipkarte stehen.
Der Arduino soll diese Aktionen dann ausführen und die hinterlegte Datenbank abändern !!!

Ich denke für den Anfang wird es das einfachste sein, die Datenbank mit den Daten auf einer SD Karte zu hinterlegen.
Allerdings kenne ich mich hier nicht aus und weiß nicht ob es mittels csv Datei , mySQL oder sonst irgendwie funktionieren kann ?

Der letzte Schritt soll es dann sein, mittels Bluetooth oder Wifi Shield eine Verbindung mit dem Handy/Tablet zum Arduino herstellen zu können und die aktuelle Datenbank auslesen zu können (nur auslesen) um sich den aktuellen Status anzeigen zu lassen. Ich bin mir nicht sicher, ob hierzu extra eine App o.ä. geschrieben werden muss, oder ob der Inhalt der SD Karte einfach per Excel oder sonst wie geöffnet werden kann.

Der Anschluss der Komponenten usw an den Arduino ist nicht das Problem.

Ich benötige allerdings Hilfe bei der Frage: Wo/Wie hinterlege ich die Datenbank, wie aktualisiere ich sie, sodass das Programm echtzeitfähig wird und wie lese ich das ganze mittels Handy/Tablet/PC aus ?

Beste Grüße
Tonno

Hallo

also unter Echtzeit-fähig verstehe ich das ein System innerhalb einer garantierten Zeitspanne auf ein Ereignis reagiert. Von daher finde ich den Titel der Frage etwas verwirrend.

Da Dein Aufbau ein Ethernet-Shield umfasst, würde ich die SD Karte gar nicht verwenden. Der Arduino könnte die Daten direkt per GET und POST Befehl von einem Web-Server oder auch über simple Socket-Kommunikation aktualisieren und abfragen. Zudem kann man dann von 'überall' auf die Daten zugreifen.
Das setzt natürlich einen ständig laufenden Rechner mit einem Webserver (zB Apache+PHP+MySQL) voraus.

Wenn man den Weg über die SD-Karte geht, kann man die Daten in jedem x-beliebigen Format ablegen. Das Datenformat hängt natürlich auch davon ab, was man speichern will. Über das Ethernet-Shield kann man dann eine Web-Seite mit den Daten füllen und von außen abrufen.

Ich hatte mal ein ähnliches System auf einem DOS-ähnlichen embedded System programmiert. Die Daten wurden binär abgelegt und konnten dann über eine ftp-ähnliche Schnittstelle kopiert oder beschrieben (zB wenn eine Karte nur temporär Zugang erlauben sollte) werden. In C waren die Daten als Struktur angelegt und enthielten Zugangs-ID und Datum/Uhrzeit für Start- und End-Zeitraum der Gültigkeit.

Josef

Zunächst vielen Dank für die Antwort, nun hätte ich noch ein paar Fragen diesbezüglich.

Wenn man den Weg über die SD-Karte geht, kann man die Daten in jedem x-beliebigen Format ablegen. Das Datenformat hängt natürlich auch davon ab, was man speichern will. Über das Ethernet-Shield kann man dann eine Web-Seite mit den Daten füllen und von außen abrufen.

Wäre das Ganze denn mit diesem Shield umsetzbar: http://arduino.cc/de/Main/ArduinoWiFiShield ?

Also ich nehme das Arduino und speichere meine kleine Datenbank auf der SD-Karte.
Das Arduino kann hier selbstständig Werte in der Datenbank je nach Softwarecode umändern.

Wenn ich mich dann in der nähe des Arduinos befinde und somit in Reichweite des Wifis bin, kann ich in meinem Browser am Handy/Tablet/Laptop die IP-Adresse des Wifi-Moduls aufrufen und finde dort den Inhalt meiner z.B. abgespeicherten csv Datei auf der SD Karte ?

Funktioniert das ganze so ?

Grüße

Tonno:
Nun soll im Programmcode / SD Karte des Arduinos eine Datenbank hinterlegt werden, in welche die zugehörigen Aktionen für die jeweilige Chipkarte stehen.
Der Arduino soll diese Aktionen dann ausführen und die hinterlegte Datenbank abändern !!!

Ich denke für den Anfang wird es das einfachste sein, die Datenbank mit den Daten auf einer SD Karte zu hinterlegen.
Allerdings kenne ich mich hier nicht aus und weiß nicht ob es mittels csv Datei , mySQL oder sonst irgendwie funktionieren kann ?

Auf dem Arduino selbst kann das nur funktionieren, wenn Du Dir als "Datenbank" eine "Datei" vorstellst, oder eine Verzeichnisstruktur aus vielen Verzeichnissen und Dateien. Relationale Datenbanksysteme wie mySQL erfordern ein zigtausendfaches an RAM-Speicher wie ein Arduino eingebaut hat, sowas läuft nicht auf einem Mikrocontroller.

Du kannst Dateien öffnen und dann lesen oder schreiben. Dabei ist es auch möglich, z.B. in einer Datei eine Liste mit 1000 gespeicherten RfID-Nummern stehen zu haben und ein oder mehrere weitere Merkmale. Und dann kannst Du nach Erkennung eines bestimmten RfID-Chips das weitere Merkmal auslesen und daraufhin weitere Funktionen ausführen, z.B. Daten in ein Logfile zu schreiben, oder aus einer Datei lesen oder eine Datei verändern.

Was die Echtzeitfähigkeit betrifft, liegt die Leserate auf SD natürlich deutlich unter der Leserate, wie sie auf PCs erzielbar sind. Je nachdem kannst Du vielleicht zwischen 1000 Bytes und 200000 Bytes pro Sekunde von SD-Karte lesen. Das kommt auch ganz auf Deine Programmierfähigkeiten an und wie Du was programmierst.

Genau so soll es funktionieren.

Ich werde ein Array Feld machen mit der Anzahl der benutzbaren Chipkarte und hinter jeder Chipkarte stehen dann diverse Funktionen.

Nach dem ausführen der Funktionen soll die "Datenbank" aktualisiert werden und als csv auf die SD Karte abgelegt werden.
Soweit sogut.

Der Inhalt der csv Datei sollte dann aber irgendwie über Wireless auszulesen sein. Hierzu habe ich ja bereits dieses Shield gepostet: http://arduino.cc/de/Main/ArduinoWiFiShield

Allerdings verstehe ich hier eins nicht - Muss das Arduino sich mittels Shield in ein Netzwerk anmelden ?
Oder kann ich das Ganze auch so programmieren, dass der Inhalt der SD Karte unter einer bestimmten HTTP Adresse abrufbar ist, wenn man sich in der nähe des Wifi Moduls befindet ?

grüße

Tonno:
Allerdings verstehe ich hier eins nicht - Muss das Arduino sich mittels Shield in ein Netzwerk anmelden ?
Oder kann ich das Ganze auch so programmieren, dass der Inhalt der SD Karte unter einer bestimmten HTTP Adresse abrufbar ist, wenn man sich in der nähe des Wifi Moduls befindet ?

Ich habe kein Wifi-Shield, aber genau so verstehe ich das: Ein Wifi-Shield ist kein Access-Point! Sondern ein Wifi-Shield braucht einen Access-Point, an dem es sich anmeldet. Auch das Smartphone meldet sich am selben Wifi-Acccess-Point an. Und genau dann hast Du ein "Netzwerk". Im Wifi-Sprech ist das der "Infrastruktur-Modus".

Im Gegensatz dazu steht der "AdHoc-Modus", bei dem keine zusätzliche Infrastruktur in Form eines Access-Points benötigt wird, sondern der AdHoc-Modus wird direkt zwischen zwei Wifi-Geräten aufgebaut.

Falls das Wifi-Shield auch den AdHoc-Modus beherrscht, sollte das im Datenblatt des entsprechenden Produkts drinstehen. Hast Du mal reingeschaut?

Infrastrukturmodus und AdHoc-Modus sind aber generell zueinander inkompatibel. So dass natürlich beide Geräte den Wifi-AdHoc Modus beherrschen und entsprechend konfiguriert sein müssen, damit eine AdHoc Verbindung zustande kommen kann.

Tonno:
Der Inhalt der csv Datei sollte dann aber irgendwie über Wireless auszulesen sein. Hierzu habe ich ja bereits dieses Shield gepostet: http://arduino.cc/de/Main/ArduinoWiFiShield

Allerdings verstehe ich hier eins nicht - Muss das Arduino sich mittels Shield in ein Netzwerk anmelden ?
Oder kann ich das Ganze auch so programmieren, dass der Inhalt der SD Karte unter einer bestimmten HTTP Adresse abrufbar ist, wenn man sich in der nähe des Wifi Moduls befindet ?

Das o.g. WiFiShield, bzw die dazugehörende Library, unterstützt keinen Ad-Hoc Modus. Es gibt wohl ein WiShield [http://www.elechouse.com/elechouse/index.php?main_page=product_info&cPath=90_186&products_id=2165] dessen Lib sowohl Infrastructure als auch Ad-Hoc Modus unterstützt.

Wenn Du eh ein WLAN im Haus betreibst, kannst Du das WiFiShield nehmen. Der Arduino wird dann über Dein WLAN erreichbar sein. Solltest Du kein WLAN betreiben, kannst Du nur ein WiFi Shield benutzen, das den AHoc Modus unterstützt. Aber dann würde ich eventuell ein Bluetooth Modul vorziehen.

Bezgl. der Daten-Speicherung würde ich an Deiner Stele nochmal über das Datenformat auf der SD-Karte nachdenken. Eine csv Datei zu schreiben und lesen ist aufwendiger als eine binäre Struktur zu verwenden. Wenn schon eine ASCII Datei, dann vielleicht besser eine Datei mit festen Feldgrößen (auch ne Art CSV, nur das eben kein Feld-Seprator verwendet wird, sondern jedes Feld einen bestimmten Platz einnimt).

Zum Beispiel:

CSV:
"TAG-ID1",20131224,1200,"Aktion1","Aktion10"
"TAG-ID2",20131224,1300,"Aktion2","Aktion20"

Fixed-CSV:
TAG-ID1      201312241200Aktion1     Aktion10
TAG-ID2      201312241200Aktion2     Aktion20

Warum müssen denn die Daten alle in einer Datei stehen? Da das RFID-Tag eindeutig ist, kann man das auch für den Dateinamen verwenden. Der Vorteil ist, man muss nicht jedesmal eine große Datei nach dem passenden Tag durchsuchen, sondern versucht einfach z.B. TAGNAME.dat zu öffnen. Gibt es die Datei, steht drin was gemacht werden soll, gibt es die Datei nicht, weiß der Arduino, das es ein unbekanntes Tag ist. Zusätzlich kann man z.B. in TAGNAME.log alle Zugriffe speichern. Das ist deutlich flexibler.
Mario.

Also die Aktionen welche ausgeführt werden sollen stehen nicht in der Datei auf der SD Karte, sondern im Quellcode auf dem Arduino selbst.

Allerdings soll der Arduino nach dem durchführen der Aktion die csv Datei / Datei mit festen Feldgrößen aktualisieren, damit z.B. ausgelesen werden kann wann die letze Durchführung der Aktion stattgefunden hat und z.B. wie oft innerhalb einer Woche.

Gibt es zu der Speicherung / Auslesung von Dateien mit festen Feldgrößen irgendwo ein Tutorial ?

Grüße
Tonno

hjgode:
Das o.g. WiFiShield, bzw die dazugehörende Library, unterstützt keinen Ad-Hoc Modus. Es gibt wohl ein WiShield [http://www.elechouse.com/elechouse/index.php?main_page=product_info&cPath=90_186&products_id=2165] dessen Lib sowohl Infrastructure als auch Ad-Hoc Modus unterstützt.

Wenn Du eh ein WLAN im Haus betreibst, kannst Du das WiFiShield nehmen. Der Arduino wird dann über Dein WLAN erreichbar sein. Solltest Du kein WLAN betreiben, kannst Du nur ein WiFi Shield benutzen, das den AHoc Modus unterstützt. Aber dann würde ich eventuell ein Bluetooth Modul vorziehen.

Wenn ich das Projekt allerdings im freien benötige, wo ich kein aufgegbautes Netzwerk zur verfügung habe, kann ich doch auch im Prinzip nur eine Wlan Router kaufen und das Ethernet Shield an den Wlan Router hängen. Der Router selbst ist dann NICHT mit dem Internet oder sonst einem Netzwerk verbunden.

Allerdings kann ich mich mittels Smartphone mit dem Wlan Router verbinden und dann den vom Arduino bereitsgestellten Webserver besuchen oder ?

Grüße

Wenn ich das Projekt allerdings im freien benötige, wo ich kein aufgegbautes Netzwerk zur verfügung habe, kann ich doch auch im Prinzip nur eine Wlan Router kaufen und das Ethernet Shield an den Wlan Router hängen. Der Router selbst ist dann NICHT mit dem Internet oder sonst einem Netzwerk verbunden.

Allerdings kann ich mich mittels Smartphone mit dem Wlan Router verbinden und dann den vom Arduino bereitsgestellten Webserver besuchen oder ?

Korrekt. Der WLAN Access Point vermittelt dann zwischen dem Smartphone und dem Arduino. Außer man hat die Kommunikation zwischen WLAN-Endgeräten auf dem AP verboten (is manchmal so).

mkl0815:
Warum müssen denn die Daten alle in einer Datei stehen? Da das RFID-Tag eindeutig ist, kann man das auch für den Dateinamen verwenden. Der Vorteil ist, man muss nicht jedesmal eine große Datei nach dem passenden Tag durchsuchen, sondern versucht einfach z.B. TAGNAME.dat zu öffnen. Gibt es die Datei, steht drin was gemacht werden soll, gibt es die Datei nicht, weiß der Arduino, das es ein unbekanntes Tag ist. Zusätzlich kann man z.B. in TAGNAME.log alle Zugriffe speichern. Das ist deutlich flexibler.
Mario.

Ob man für jedes TAG eine eigene Datei nimmt oder nicht, hängt auch von der Anzahl möglicher TAGs ab. Achtung: Bei FAT16/FAT32 ist die Anzahl der Einträge im Root-Verzeichnis begrenzt (so was von 255 oder so). In einem Unterverzeichnis gibt es keine solche Beschränkung.
Ich könnte mir auch vorstellen,, das die Verwendung von vielen Dateien das System ausbremst. Ich würde bei einem PC nie so programmieren. Dazu kommt noch die Lebensdauer von Consumer SD Karten bzgl. Anzahl der Schreib-Lesevorgänge. Ich weiss auch nicht, wie die SD Karten Treiber Library mit Wear-Leveling und anderen Eigenheiten von SD Karten umgeht. Vielleicht auch mal über ein statisches RAM zum Speichern nachdenken?

Dazu kommt noch die Lebensdauer von Consumer SD Karten bzgl. Anzahl der Schreib-Lesevorgänge. Ich weiss auch nicht, wie die SD Karten Treiber Library mit Wear-Leveling und anderen Eigenheiten von SD Karten umgeht.

Die Lebensdauer beschränkt eigentlich nur die Anzahl der Schreib-Vorgänge, oder?
Und Wear-Leveling sollte für den SD-Zugriff über SPI und FAT - formatierte Karten transparent sein, d.h. das macht die Karte selbst und ist von aussen nicht bemerkbar.
Oder kann ich da noch was lernen ?

Ich könnte mir auch vorstellen,, das die Verwendung von vielen Dateien das System ausbremst. Ich würde bei einem PC nie so programmieren.

Ich würde bei einem Arduino immer nur eine Datei gleichzeitig offen haben und mir keine Gedanken machen, wie schnell ein Block von 512 Byte bearbeitet werden kann. Der RAM ist der Engpass beim Arduino. Das ist beim PC etwas anders :wink:

Da der Arduino jeweils nur 1 Tag verarbeitet, passt eine Datei dieses Namens schon.
Man hat allerdings nur 8+3 Buchastaben für den Dateinamen.

Und wenn man schon die RFID in eine 8-Buchstaben-Kombi umrechnet, kann man sie auch gleich in einer Liste suchen.