- MultiPlus Wechselrichter Insel und Nulleinspeisung Conrad         
Seite 1 von 2 12 LetzteLetzte
Ergebnis 1 bis 10 von 13

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

  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

    Anzeige

    LiFePo4 Akku selber bauen - Video
    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

  7. #7
    Erfahrener Benutzer Robotik Einstein Avatar von Dirk
    Registriert seit
    30.04.2004
    Ort
    NRW
    Beiträge
    3.803
    Auch ratlos: Dirk

    Kannst du in Main mal die Variable adcLSL z.B. alle 500ms ausgeben?
    Geändert von Dirk (23.02.2016 um 21:39 Uhr)
    Gruß
    Dirk

  8. #8
    Erfahrener Benutzer Fleißiges Mitglied Avatar von basteluwe
    Registriert seit
    15.11.2012
    Beiträge
    131
    Zitat Zitat von Dirk Beitrag anzeigen
    Auch ratlos: Dirk

    Kannst du in Main mal die Variable adcLSL z.B. alle 500ms ausgeben?
    Kann ich versuchen, weiß aber nicht recht was du meinst!? Ausgeben wo/wie?

    Hier ist die "Main", wie sie im Moment bei mir aussieht (rot meine Einfügungen):
    Code:
    /*****************************************************************************/
    // Main function - The program starts here:
    
    int main(void)
    {
    	initRP6M256(); 
    	initLCD();
    	
    	// UART1 Initialisierung für Steuerung Speakjet
    	cli();			// Disable global interrupts.
    
    	UBRR1H = UBRR_BAUD_LOW_WIFI >> 8; // Setup UART1: Baud is Low Speed (9600)
    	UBRR1L = (uint8_t) UBRR_BAUD_LOW_WIFI;
    	UCSR1A = 0x00;
    	UCSR1C = (0<<UMSEL10) | (0<<UMSEL11) | (1<<UCSZ11) | (1<<UCSZ10);
    	UCSR1B = (1 << TXEN1) | (1 << RXEN1) | (1 << RXCIE1);
    
    	clearReceptionBuffer1();
    
    	sei();			// Enable Global Interrupts
    	// Ende der UART1 Initialisierung
    
        
    	writeString_P("\n\nRP6 CONTROL M32 I2C Master Example Program!\n"); 
            writeString_P("\nMoving...\n"); 
    
    	// ---------------------------------------
    	WDT_setRequestHandler(watchDogRequest); 
    	BUMPERS_setStateChangedHandler(bumpersStateChanged);
    	ACS_setStateChangedHandler(acsStateChanged);
    	BATTERY_setLowVoltageHandler(batteryVoltageLow);
    
    	// ---------------------------------------
    	I2CTWI_initMaster(100);  
    	I2CTWI_setRequestedDataReadyHandler(I2C_requestedDataReady);
    	I2CTWI_setTransmissionErrorHandler(I2C_transmissionError);
    
    
    	setLEDs(0b1111);
    		
    	// I2C auf der Basis sicher wecken
    	I2CTWI_transmitByte(0, 0);
    	mSleep(200);
            I2CTWI_transmitByte(0, 0);
    	
    		
    	showScreenLCD("################", "################");
    	mSleep(500);
    	showScreenLCD("I2C-Master", "Behaviours");
    	mSleep(1000);
    	setLEDs(0b0000);
    	
    	// sende Begrüßung zum SpeakJet
    	sound_rp6_ready();
    	mSleep(2000);
    	
    	// Scheinwerfer-Steuerung
    	controlHeadlights();
    		
    	// ---------------------------------------
    	// Setup ACS power:
    	I2CTWI_transmit3Bytes(I2C_RP6_BASE_ADR, 0, CMD_SET_ACS_POWER, ACS_PWR_MED);
    	// Enable Watchdog for Interrupt requests:
    	I2CTWI_transmit3Bytes(I2C_RP6_BASE_ADR, 0, CMD_SET_WDT, true);
    	// Enable timed watchdog requests:
    	I2CTWI_transmit3Bytes(I2C_RP6_BASE_ADR, 0, CMD_SET_WDT_RQ, true);
    	
    	startStopwatch1();
    	startStopwatch2();
    	startStopwatch3();
    	
    	showScreenLCD("Active Behaviour", "");
    	
    	while(true) 
    	{ 
    	    task_LCDHeartbeat();
    	    task_checkINT();
    	    task_I2CTWI();
    	    behaviourController();
    	}
    	return 0;
    }
    Meinst du, ich soll die adcLSL auf dem LCD ausgeben? Wenn ja, wie?
    Sorry für viel dumm

    Uwe

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

    vergiss das mit der Ausgabe erstmal.

    In Main werden alle Befehle VOR der Hauptschleife, also vor while(true) {...} nur EINMAL und nie wieder ausgeführt ("Initialisierungen").

    D.h., dass auch deine Funktion controlHeadlights() nur EINMAL ausgeführt wird.
    Was du willst ist ja aber, dass sich die Frontscheinwerfer je nach Lichtverhältnissen während der Fahrt an- oder ausschalten.
    Dann gehört deine Funktion IN die while(true) {...} Schleife.

    Ich würde sie dann aber nicht bei JEDEM Durchlauf der schnellen Hauptschleife aufrufen, sondern in Abständen (z.B. jede Sekunde) mithilfe einer Stopwatch.
    Gruß
    Dirk

  10. #10
    Erfahrener Benutzer Fleißiges Mitglied Avatar von basteluwe
    Registriert seit
    15.11.2012
    Beiträge
    131
    Hi Dirk,
    Zitat Zitat von Dirk Beitrag anzeigen
    In Main werden alle Befehle VOR der Hauptschleife, also vor while(true) {...} nur EINMAL und nie wieder ausgeführt ("Initialisierungen").
    D.h., dass auch deine Funktion controlHeadlights() nur EINMAL ausgeführt wird.
    Das verstehe ich! Auf jeden Fall müsste die Funktion aber EINMAL richtig funktionieren, oder nicht?
    Ich kann aber das Programm bei völliger Dunkelheit starten oder bei prallem Licht, IMMER geht der Scheinwerfer an! Ich bekomme im Moment gar keine Abhängigkeit von adcLSL hin. Nur wenn ich der Variablen "licht" von Hand verschiedene Werte zuweise, schaltet er richtig!

    Uwe

    P.S. Ich werde die Funktion aber trotzdem IN der Schleife aufrufen, nur helfen wird es im Moment wohl nicht. Der Fehler liegt woanders, denke ich.
    Geändert von basteluwe (24.02.2016 um 11:16 Uhr)

Seite 1 von 2 12 LetzteLetzte

Ä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
  •  

Solar Speicher und Akkus Tests