Go Down

Topic: "Laserparcours" bitte um Verbesserungsvorschlaege (Read 1 time) previous topic - next topic

grillgemuese

Nov 23, 2017, 09:50 pm Last Edit: Nov 23, 2017, 10:35 pm by grillgemuese
Guten Abend zusammen,

in ein paar Tagen habe wir Tag der offenen Tuer in unserer Schule, bei diesem
soll ich ein Programm fuer den Arduino schreiben, welches einen Laser-Hindernisparcours
realisiert.

Inhalt:
-Hindernisse durch aufgestellte Tische
-Nebel durch 2 Nebelmaschinen
-10 Laser (mit Laserschutz-Beauftragtem)
-10 LDRs zur Auswertung der Laser
(Laser koennen nicht gespiegelt werden da der Nebel zu stark einschraenkt)

Visualisierung:
-5 7SEG Anzeigen (sek, sek, sek | ms, ms)
-Weboberflaeche mit Bestenliste Platz 1-5
-Meldeleuchten:
*Leuchte_Runde (blinkt wenn Runde aktiv)
*Leuchte_Alarm (leuchtet wenn Laser unterbrochen wurde)
*Leuchte_Erfolg (leuchtet wenn Runde abgelschlossen (erflogreich))
(-3 Servos mit Zeiger fuer Sek, Sek/10, Sek/100 (nur wenn noch Zeit bleibt))

Steuerung:
-4 Taster + Notaus(noch nicht sicher, ob als Eingang oder Spannungsfreiheit-erzwingend)
Notaus (schaltet alle Ausgaenge Spannungsfrei)
Taster_Start (startet die Runde, wenn Bedingungen erfuellt)
Taster_Stop (stopt Runde (Runde wird als erflogreich gewertet))
Taster_Reset (verwirft angefangene Runde)
Taster_Kalibrieren (LDRs werden mit jeweils 2 Messungen + offset "kalibriert")

Nun meine Frage an Euch:
Was sollte ich an Euerer Stelle anders gestalten / ersetzen / ergaenzen?

Vielen Dank
Grillgemuese  :)

(Bitte bedenkt, dass das einer meiner ersten Arduino Projekte ist und dies noch eine BETA ist.)
Laser_Arduino.ino aktualisiert (VS_Code hatte Fehler verursacht)
22:33 Uhr nochmals aktualisiert (5 min Postsperre)
(Maechtiges Problem durch VS_Code: die letzten Aenderungen wurden immer verworfen.)

Tommy56

Ich weiß nicht, was Du mit Deiner ino gemacht hast- ich bekomme beim Zugriff immer einen Error.

Meinst Du nicht, dass die Diskussion "ein paar Tage" vor Deadline (wann ist das) etwas kurz ist?

Gruß Tommy
"Wer den schnellen Erfolg sucht, sollte nicht programmieren, sondern Holz hacken." (Quelle unbekannt)

postmaster-ino

#2
Nov 23, 2017, 10:17 pm Last Edit: Nov 23, 2017, 10:18 pm by postmaster-ino
Hi

In ein paar Tagen ist 'ganz schön knapp'.
Wie darf ich mir Das vorstellen?
Ihr habt eine Art Labyrinth aus Tischen erstellt, etwas Nebel, damit man die Laser sieht und hier und da strahlt ein Laser durch den Gang - also Lichtschranken.

Ab Start läuft eine Zeit und am Ende des Parcours ein Schlagtaster, damit man die Zeit stoppen kann - sofern man den Weg 'überlebt'.

Das kniffligste wird wohl werden, daß die Laser-Pointer auf die LDR ausgerichtet bleiben und nicht bei jedem Husten die ganze Mimik neu ausgerichtet werden muß.

Dann habt Ihr auch noch einige Meter Kabel, Die gerne Störungen auffangen - ob ein Handy in Kabelnähe bereits ein No-Go ist - kA, aber zumindest Handys werdet Ihr einige in Eurem Klassenzimmer vorfinden ;)

Zum NotAus: Diesen legst Du in Reihe zur 5V-Versorgung - ein NotAus hat das System möglichst 'hardware-nah' abzuschalten - wenn da erst ein µC drüber nachdenken muß, kann man Das auch direkt sein lassen.
(wobei ich mich allen Ernstes frage, was der NotAus Da soll - denke mir, daß die Laser der Klasse I angehören und keine Löcher in Tische und Wände brennen sollen/können)

Dann brauchst Du für jeden LDR einen INPUT, oder Du verkettest die LDR (theoretisch könnte iene einfache Reihenschaltung reichen).

Wenn die Laser moduliert werden sollen (oder blinken, damit man eine Chance hat, dran vorbei zu kommen), brauchst Du für JEDEN Laser einen OUTPUT und für JEDEN LDR einen INPUT, da Du ja den LDR, Dessen Laser gerade abgeschaltet ist, nicht als 'unterbrochen' auswerten darfst.
Beim Modulieren (also immer Mal wieder kurz ausschalten) muß dann der LDR auch 'Laser weg' dem Arduino melden - wenn das Licht nämlich an bleibt, blendet der Einbrecher gerade den LDR der Lichtschranke, damit Er unbemerkt vorbei gehen kann - wäre aber wohl eher das Sahne-Häubchen :)
Müsste gerade nachzählen, wie viele I/Os der UNO so mitbringt.

Irgend was passt mit dem Link nicht - ich darf den Sketch nicht saugen.

MfG

Tommy56

11/2=5,5 oder 1 + 1/2 Wochen?

Wenn wir denn auf Deine Ino zugreifen könnten aber das hatte ich schon geschrieben.

Gruß Tommy
"Wer den schnellen Erfolg sucht, sollte nicht programmieren, sondern Holz hacken." (Quelle unbekannt)

postmaster-ino

Hi

Naja, das Problem hat sich verschoben - jetzt gibt's keinen Link mehr ;)

Da Du ja nur noch 10 Tage (Zeit-Tage, wohl eher maximal 8 'Arbeits'tage) hast, wird ein I2C-Display oder eine Matrix ala MAX7219 wohl ausscheiden, da wirst Du wohl selber multiplexen müssen - schon Mal gemacht, oder auch eine Premiere?

Du solltest Die Einzelprobleme auch einzeln angehen und immer nur an einer Baustelle arbeiten - zu schnell hast Du zwei/drei Kleinigkeiten geändert und plötzlich geht gar nichts mehr.
Mache Dir auch ab und zu 'Sicherheitskopien' - unter Linux heißt der Menüpunkt 'Duplikat erstellen' - und benenne die Dateiendung um, da sonst ALLE INO-Files zusammen gepackt werden - und dann meckert der Compiler, wenn Da mehrere Funktionen identisch heißen ;)

Für mich klingt Das nach einem ganz schön großen Projekt, Countdown, Multiplex-Anzeige, Menü-Steuerung, Servo-Ansteuerung ... da kann auch durchaus das Eine mit was Anderem kollidieren - plane also auch ein paar kleinere Pausen zum 'runter kommen' mit ein - wirst Du sicher brauchen.

Trotzdem viel Erfolg, kannst ja Mal schauen, ob die INO noch irgendwo zum Vorschein kommt - für mich aber Heute nicht mehr ;) (bin ja schon alt ...)

MfG

Tommy56

"Wer den schnellen Erfolg sucht, sollte nicht programmieren, sondern Holz hacken." (Quelle unbekannt)

postmaster-ino

Hi

Bei 'Webfail' wird der Server ein 2.tes Mal gestartet - hier wird aber NICHT überprüft, ob Dieser ebenfalls 'gefailed' ist.

In der BEstenliste machst Du IMMER das Gleiche - nur halt nicht immer mit allen Einträgen.
Hier dürfte eine WHILE-Schleife einigen Code sparen helfen.

... Überfliegen fertig ... ach ja: Es wird auch eine HTML-Seite ausgegeben - hatte davon zuvor Nichts gelesen.

MfG

postmaster-ino

Hi

Oha - hatte ich Oben doch überlesen, mit der Bestenliste :)
Sollte auch kein Vorwurf werden, finde den Sketch nur bisher sehr prall gefüllt und wie mir scheint, mit 'übersichtlich vielen' funktionierenden Teilbereichen.
Würde an Deiner Stelle versuchen, die Probleme einzeln anzugehen, dabei wirst Du auch genügend Stolpersteine finden, wenn die anderen Sketchteile Dich nicht zusätzlich in Atem halten.

Mit der Bestenliste meinte ich, daß Du in einem Zweig folgendes machst:
Code: [Select]

- Position 4 auf 5, Position 3 auf 4, Position 2 auf 3, Position 1 auf 2, Position 1 neu setzen
- Position 4 auf 5, Position 3 auf 4, Position 2 auf 3                    Position 2 neu setzen
- Position 4 auf 5, Position 3 auf 4,                                     Position 3 neu setzen
- Position 4 auf 5,                                                       Position 4 neu setzen
-                                                                         Position 5 neu setzen

Ich habe den Code jetzt nicht erneut gelesen, die Reihenfolge oder der eigentliche Sinn könnte ein Anderer sein - die Grundidee aber bleibt:
Bei jeder der 'Abläufe' wird nahezu exakt das Gleiche gemacht - es wird nur an unterschiedlichen Positionen damit aufgehört.
Bei dem Beispiel hier wird IMMER von Unten nach Oben ein Listenplatz 'nach unten gereicht', bis wir 'an der richtigen Position sind'.
Dann wird die zuletzt gelesene Position neu gesetzt (ok, in der letzten Zeile müssten wir zuvor definiert haben, daß mit 'lastread=5;' gestartet wird.

Zur Einspeisung in den Arduino - gute Frage ;)
Ich meine, wenn USB verwendet wird, wird Dessen 5V zum Arduino durch geschaltet (hatte irgendwo einen Schaltplan vom Arduino-Bord gesehen ... lange ist's her *hüstel*).
Dann kann Es sein, daß diese beiden '5V' gegen einander 'arbeiten' - wenn dann auch noch Vin belegt ist, will der dortige Spannungsregler auch noch mitspielen - Bei Linear-Reglern sollte eigentlich nicht viel passieren, sofern Vout nicht viel größer als Vin wird (zumindest die 78xx er können Das nicht ab, weshalb öfter eine Diode antiparallel verbaut wird).

MfG

michael_x

Quote
Bei Arduino ist mir aufgefallen, dass der Speicherbedarf bei Verwendung fluechtiger Variablen ansteigt.
Der Ram bleibt laut Compiler davon unberuehrt...?
Keine Ahnung  ( ;) )  was flüchtige Variblen für dich sind.
Für lokale nicht-statische Variablen wird erst beim Funktionsaufruf auf dem Stack Platz belegt. Daher sieht du diesen nicht in der Übersicht nach dem Compilieren.

Deine andere Beobachtung ( mehr Flash bei lokalen Variablen ? ) kann ich so pauschal nicht nachvollziehen. Hast du da ein einfaches Beispiel ?

michael_x

#9
Nov 27, 2017, 11:59 pm Last Edit: Nov 28, 2017, 12:09 am by michael_x
Quote from: grillgemuese
Macht es Sinn, die beiden Arrays als volatile zu kennzeichnen?
Meinst du old_ZT und old_TLN?
Dann solltest du dein Verständnis des Begriffs volatile überarbeiten.
Was du meinst, sind lokale Variable. Die nur keine Initialisierung bei der Definition brauchen.

Wenn du die globalen Arrays ZT und TLN meinst: Wenn diese gleichzeitig in einer ISR verwendet würden, dann schon, aber dann würde das nicht reichen. 

michael_x

volatile ist ein Hinweis für den Compiler, dass die Variable sich evtl. ausserhalb seiner Kontrolle während des Programmablaufs ändert, er also vorsichtig mit Optimieren sein muss. Das trifft für deine lokalen Variablen nicht zu.

5 float und 5 uint16 sollten auf dem Stack Platz haben, kein Problem

Mit "nicht reichen" meinte ich nicht den RAM-Speicherplatz sondern fehlende Programm-Logik, wenn das volatile wirklich erforderlich gewesen wäre. Vergiss das z.Zt. einfach, sorry.

Du meinst vermutlich "temporär" (oder so) als Eigenschaft lokaler Variablen, die undefiniert sind, sobald die Funktion verlassen wird.

Go Up