- Labornetzteil AliExpress         
Ergebnis 1 bis 10 von 13

Thema: Scheinwerfer mit Front-LDR steuern - geht (noch) nicht

Hybrid-Darstellung

Vorheriger Beitrag Vorheriger Beitrag   Nächster Beitrag Nächster Beitrag
  1. #1
    Erfahrener Benutzer Fleißiges Mitglied Avatar von basteluwe
    Registriert seit
    15.11.2012
    Beiträge
    131

    Scheinwerfer mit Front-LDR steuern - geht (noch) nicht

    Wieder mal ich:
    Ich habe meinen Krabbler (RP6 mit M256-WiFi) mit Scheinwerfern ausgerüstet und möchte die versuchsweise durch die LDRs lichtabhängig schalten.
    Die Scheinwerfer werden über einen Transistor am Port-L5 geschaltet. Der Port ist als Ausgang konfiguriert.
    Auf der M256 läuft das Programm Move2. In die main-routine habe ich folgenden Code eingefügt:
    Code:
    uint16_t licht = adcLSL;
    		
    	if(licht < 100)
    		PORTL &= ~IO_PL5_OC5C;	// Scheinwerfer an
    	else
    		PORTL |= IO_PL5_OC5C;	// Scheinwerfer aus
    Das funktioniert leider nicht! Es scheint als wenn der Wert für "licht" immer 0 ist, das heißt die Scheinwerfer sind immer an! Gleichzeitig wird der Wert für adcLSL aber im Terminal richtig angegeben (schwankt zwischen 0020 und 0980 je nach Licht).
    Wenn ich manuel Werte für "licht" zuweise, funktioniert es.
    Was mach ich falsch???

    Gruß Uwe

  2. #2
    Erfahrener Benutzer Robotik Einstein Avatar von Dirk
    Registriert seit
    30.04.2004
    Ort
    NRW
    Beiträge
    3.803
    Hi Uwe,

    die Helligkeitswerte stammen ja von den LDRs auf der RP6 Base, müssen also von der M256 WiFi via I2C gelesen werden.

    Beispiel 1:
    Programm RP6M256_06_I2CMaster.c
    Da erfolgt das Lesen aller Sensorwerte in den Funktionen readAllRegisters() oder der Helligkeit allein in readLightSensors().
    Das Ergebnis steht dann in den Variablen, die du definierst.

    Beispiel 2:
    Programm RP6M256_08_I2CMaster.c
    Hier ist die RP6M256_I2CMasterLib mit eingebunden und die Sensorwerte werden "automatisch" regelmäßig von der RP6 Base abgeholt.
    Wenn das so läuft, ist das Ergebnis des linken LDRs auch in der Variablen adcLSL zu finden.

    Frage:
    In welcher Form holst du die Sensorwerte von der Base ab?
    Gruß
    Dirk

  3. #3
    Erfahrener Benutzer Fleißiges Mitglied Avatar von basteluwe
    Registriert seit
    15.11.2012
    Beiträge
    131
    Hi Dirk,
    Hm, da hab ich wohl zu einfach gedacht! Es läuft bei mir ja wie gesagt das komplette Programm Move2, allerdings mit den zusätzlichen Zeilen in der "main".
    Wenn ich das richtig sehe, ist da auch die I2CMasterlib schon eingebunden, denn in Zeile 42 steht: #include "RP6I2CmasterTWI.h"
    Ich dachte, daß die Werte da sowieso ständig von der Base abgefragt sind und sozusagen schon in "adcLSL" bereitliegen. Der Wert wird ja ständig auf dem WiFi-Terminal ausgegeben, also muß er doch da sein!?
    in Zeile 439 und 467 des Originalprogramms finde ich allerdings "getAllSensors()"und unmittelbar danach werden die Werte ausgegeben.

    Meinst Du, ich müsste meinen kurzen Code auch noch mal mit "getAllSensors()" beginnen?

    Gruß Uwe

    - - - Aktualisiert - - -

    Sehe gerade, daß auch die Anweisung #include "RP6M256_I2CMasterLib.h" in dem Programm schon vorhanden ist!
    In der "RP6M256_I2CMasterLib.c" habe ich gerade noch mal gecheckt, daß vermutlich für meinen Fall "getLightSensors()" richtig/ausreichend wäre?
    Geändert von basteluwe (23.02.2016 um 15:39 Uhr)

  4. #4
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    27.08.2013
    Ort
    Region Basel
    Alter
    66
    Beiträge
    2.435
    Hallo,
    Zitat Zitat von basteluwe Beitrag anzeigen
    Sehe gerade, daß auch die Anweisung #include "RP6M256_I2CMasterLib.h" in dem Programm schon vorhanden ist!
    In der "RP6M256_I2CMasterLib.c" habe ich gerade noch mal gecheckt, daß vermutlich für meinen Fall "getLightSensors()" richtig/ausreichend wäre?
    Etwas vereinfacht:
    Mit
    #include xxxxx.h
    Fügst du nur eine Art Inhaltverzeichnis und zu verwendende Konstanten der Bibliothek ein. Die .h hat normalerweise erst einmal keinen Einfluss auf das eigentliche Programm.

    Zitat Zitat von basteluwe Beitrag anzeigen
    In der "RP6M256_I2CMasterLib.c" habe ich gerade noch mal gecheckt, daß vermutlich für meinen Fall "getLightSensors()" richtig/ausreichend wäre?
    Ich kenne den RP6 nicht, aber der Funktionsname hört sich gut an.
    Eigentlich müsste doch eine Beschreibung der Bibliothek vorhanden sein?

    MfG Peter(TOO)
    Manchmal frage ich mich, wieso meine Generation Geräte ohne Simulation entwickeln konnte?

  5. #5
    Erfahrener Benutzer Robotik Einstein Avatar von Dirk
    Registriert seit
    30.04.2004
    Ort
    NRW
    Beiträge
    3.803
    Hi Uwe,

    im Programm 10_Move2 erfolgt die Abfrage der Sensorwerte schon regelmäßig in den Funktionen printAllSensorValues() und printAllSensorValues_WIFI().
    Die werden wieder in displayBehaviour() und task_LCDHeartbeat() aufgerufen.
    Wenn du also adcLSL im Hauptprogramm von 10_Move2 liest, müßten darin wechselnde Werte erkennbar sein.

    Definierst du adcLSL in deinem neuen Programm?
    Gruß
    Dirk

  6. #6
    Erfahrener Benutzer Fleißiges Mitglied Avatar von basteluwe
    Registriert seit
    15.11.2012
    Beiträge
    131
    Zitat Zitat von Dirk Beitrag anzeigen
    im Programm 10_Move2 erfolgt die Abfrage der Sensorwerte schon regelmäßig in den Funktionen printAllSensorValues() und printAllSensorValues_WIFI().
    Die werden wieder in displayBehaviour() und task_LCDHeartbeat() aufgerufen.
    Wenn du also adcLSL im Hauptprogramm von 10_Move2 liest, müßten darin wechselnde Werte erkennbar sein.

    Definierst du adcLSL in deinem neuen Programm?
    Hi Dirk,
    genau das, was du hier oben schreibst habe ich versucht in meinem erste Post darzustellen:
    Ich habe kein NEUES Programm! Ich lass das gute alte 10_Move2 laufen, nur mit ein paar zusätzlichen Programmzeilen. Ich sehe die sich ändernden adcLSL-Werte im Terminal. Das ist alles so, wie es soll.
    "adcLSL" gibt es also schon und die Werte werden auch richtig im Terminal dargestellt! Der Aufruf "getAllSensors()" existiert damit natürlich auch schon und funktioniert für die zwei Terminal-Print Funktionen.
    Ich habe nun eben gerade meinen Code als neue Funktion "controlHeadlights()) vorne bei den bereits vorhandenen Funktionen mit eingebaut. Also nicht mehr in der "Main"!
    Hier ist der Code der Funktion, wie er im Moment aussieht:

    Code:
    void controlHeadlights(void)
    
    {
    	DDRL |= IO_PL5_OC5C;		// PL5 = Ausgang (Scheinwerferanschluß)
    	
    	getAllSensors();
    	uint16_t licht = adcLSL;
    	if(licht < 500)
    		PORTL &= ~IO_PL5_OC5C;	// PL5-low = Scheinwerfer an
    	else
    		PORTL |= IO_PL5_OC5C;	// PL5-high = Scheinwerfer aus
    }
    Aufgerufen wird er mit
    Code:
    controlHeadlights();
    aus dem "main". Der Aufruf funktioniert, aber die Lichter sind immer an, unabhängig von dem im Terminal angezeigten adcLSL Wert.
    Und nein, ich habe adcLSL nicht noch mal selbst definiert, die Variable ist doch schon definiert im Programm!?

    ratlos Uwe

Ähnliche Themen

  1. Pololiu A4988 STEP-Eingang mit PWM steuern - geht das?
    Von acrobat88 im Forum Elektronik
    Antworten: 2
    Letzter Beitrag: 10.10.2011, 22:57
  2. problem mit K6 (geht, geht nicht...)
    Von ijjiij im Forum Asuro
    Antworten: 3
    Letzter Beitrag: 17.12.2010, 18:19
  3. Asuro Front LED funktioniert nicht
    Von RoninShooter im Forum Asuro
    Antworten: 6
    Letzter Beitrag: 29.12.2009, 21:06
  4. Nicht-invertierender OpAmp, Rechnung geht nicht
    Von Crock im Forum Elektronik
    Antworten: 6
    Letzter Beitrag: 26.06.2008, 14:51
  5. Front LED tot?
    Von gtacelt im Forum Asuro
    Antworten: 5
    Letzter Beitrag: 21.01.2007, 21:13

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •  

12V Akku bauen