PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : RP6 Fotowiderstand



Marian Otte
09.12.2012, 18:45
Hallo,

ich habe jetzt die Fotowiderstände angeschlossen und nun kann ich am pc auch die Werte außlesen, aber die Werte sind kaum unterschiedlich bei schwarz und weiß. Außerdem suche ich noch den Befehl für int1 auf dem base board.
Wie ich also den Port int1 mit 5 v ansteuern kann?

Danke:confused:

Dirk
09.12.2012, 20:06
@Marian Otte:

ich habe jetzt die Fotowiderstände angeschlossen und nun kann ich am pc auch die Werte außlesen, aber die Werte sind kaum unterschiedlich bei schwarz und weiß.
Vielleicht liegt es ja an deinen zu hellen "Scheinwerfern": https://www.roboternetz.de/community/threads/60036-RP6-Linienverfolgung?p=565667&viewfull=1#post565667


Außerdem suche (https://www.roboternetz.de/community/content/50-volltextsuche) ich noch den Befehl für int1 auf dem base board. Wie ich also den Port int1 mit 5 v ansteuern kann?
Was genau hast du mit INT1 vor?

Marian Otte
10.12.2012, 12:31
ich will auf dem int1 5v anlegen und damit mein fet schalten und außerdem verändern sich die Werte bei normalem licht auch nur sehr schwach.

Dirk
10.12.2012, 18:56
INT1 ist der Portpin PA4. Wie man einen Portpin ein- oder ausschaltet, findest du in der Anleitung zur RP6 Control M32 (RP6_M32_MANUAL_20071031.pdf) auf Seite 18 (Kapitel 3.1.9).

Wenn du mit den Fotowiderständen Probleme hast: Poste hier, wie genau du die LDRs angeschlossen hast und wie dein Programm zum Auslesen aussieht.

Marian Otte
11.12.2012, 13:43
Das ist mein Programm:
#include "RP6RobotBaseLib.h"

// Achtung! Die PWM-Werte werden hier OHNE Rampe verändert!
void setMotorPWM(uint8_t power_links, uint8_t power_rechts)
{
extern uint8_t mleft_ptmp, mright_ptmp;

if(power_links > 210) power_links = 210;
if(power_rechts > 210) power_rechts = 210;
mleft_power=mleft_ptmp=power_links;
mright_power=mright_ptmp=power_rechts;

OCR1BL = power_links;
OCR1AL = power_rechts;

if(power_links || power_rechts)
TCCR1A = (1 << WGM11) | (1 << COM1A1) | (1 << COM1B1);
else
TCCR1A = 0;
}
int main(void)
{
initRobotBase();
while(1)
{
writeInteger(readADC(ADC_ADC0), 10);
writeString_P(" - ");
writeInteger(readADC(ADC_ADC1), 10);
writeString_P("\n\r");
if (readADC(ADC_ADC1)) > (readADC(ADC_ADC0))
setLEDs(4);
setMotorPWM(100,50);
}
else
{
setLEDs(32);
setMotorPWM(50,100);
}
mSleep(100);
}
return(0);
}

Dann habe ich die LDR an adc0 und adc1 angeschlossen

radbruch
11.12.2012, 14:22
ADC0 größer als ADC0?

if (readADC(ADC_ADC0)) > (readADC(ADC_ADC0))

SlyD
11.12.2012, 18:12
Hallo,


Dann habe ich die LDR an adc0 und adc1 angeschlossen

NUR die LDRs?
Siehe Schaltung der LDRs im RP6 Schaltplan um zu sehen wie man es machen muss (Spannungsteiler).
Den INTERNEN Pullup abschalten falls der an sein sollte.
Der Widerstandswert sollte natürlich passend zum Wert des LDR sein.


MfG,
SlyD

Marian Otte
11.12.2012, 19:04
Hallo,

Den INTERNEN Pullup abschalten falls der an sein sollte.
Kann mir jemand dazu eine genaue anleitung geben bitte da der Roboter am Freitag laufen muss und die Linie auch erkennen sollte

Der Widerstandswert sollte natürlich passend zum Wert des LDR sein. Was heißt das?

Dirk
11.12.2012, 19:42
Marian Otte:
Den INTERNEN Pullup abschalten falls der an sein sollte. Kann mir jemand dazu eine genaue anleitung geben bitte ...
Ich hatte dir ja die Anleitung zur M32 ab Seite 18 empfohlen: Auf Seite 19 oben wird beschrieben, wie man die internen Pullup-Widerstände aktivieren (umgekehrt auch deaktivieren) kann.


Der Widerstandswert sollte natürlich passend zum Wert des LDR sein. Was heißt das?
Der Widerstand sollte in etwa so groß sein, wie der Widerstandswert des LDR bei einer mittleren Helligkeit. Ideal wäre, wenn das DIE Helligkeit ist, die fast in der Mitte zwischen der Helligkeit auf der Linie und NICHT auf der Linie liegt.

Marian Otte
11.12.2012, 20:42
kann mir jemand schnell ein beispielprogramm mit diesen pins geben ich schaffe das mit dem deklarieren und dem richtigen schreiben noch nicht so. Bin noch am lernen

Danke schon mal im Voraus

Marian Otte
12.12.2012, 05:39
danke und jetzt noch mal zu dem programm wie schreibe ich das jetzt in ein programm habe das schon versucht klappt aber nicht muss ich noch irgewas deklarieren oder muss ich die makefile ändern bin total hilflos.
Danke

radbruch
12.12.2012, 06:47
Hallo

Die Pins von ADC0 und ADC1 sollten nach einem Reset immer noch als Eingang konfiguriert sein, deshalb kannst du die Werte ohne zusätzliches Setup einlesen. Allerdings benötigst du dazu einen externen Spannungsteiler (gebildet aus dem Fotowiderstand und einem zusätzlichen Reihenwiderstand). Beispielhaft die Beschaltung der orginalen LDRs beim RP6(V1):
https://www.roboternetz.de/community/attachment.php?attachmentid=24010&stc=1&d=1355294442

Eine einfachere Lösung wäre den LDR direkt zwischen Pin und GND anzuschliesen und den internen PullUp des Pins zu aktivieren. Ob das funktioniert kann ich nicht sagen. Der interne Pullup hat ca. 20-50 kOhm und wird für ADC0 und ADC1 so aktiviert:


DDRA &= ~0b00000011; // Datenrichtung ADC0 und ADC1 ist Eingang
PORTA |= 0b00000011; // interne PullUps aktivieren
Bei der ersten Lösung steigt der eingelesene Wert mit der Helligkeit, bei der zweiten Lösung sinkt er bei steigender Helligkeit.

Gruß

mic

Marian Otte
12.12.2012, 18:33
danke und welchle libarys muss ich jetzt nehmen um diesen befehl zu schreiben zu können und was muss ich deklarieren? Muss ich was in der Makefile ändern? und kann mir jeman noch mal den ganzen programmcode geben.

Danke

radbruch
12.12.2012, 19:50
Du hast immer noch nicht beschrieben, wie genau du die LDR angeschlossen hast. Zusätzliche Libs oder Änderungen im Makefile brauchst du aber bei keinem der Ansätze. Das passende Programm hast du ja schon gepostet.

Marian Otte
12.12.2012, 20:47
und was muss ich jetz da einfügen? Die LDR's habe ich direkt an die adc ports angeschlossen an pin 3 und 2.

Danke

Marian Otte

radbruch
12.12.2012, 21:27
Hallo

Pin 2 und 3 sind GND und ADC-Pin:

https://www.roboternetz.de/community/attachment.php?attachmentid=24013&stc=1&d=1355347495

Das wäre dann die Variante mit aktivierten PullUp:


#include "RP6RobotBaseLib.h"

// Achtung! Die PWM-Werte werden hier OHNE Rampe verändert!
void setMotorPWM(uint8_t power_links, uint8_t power_rechts)
{
extern uint8_t mleft_ptmp, mright_ptmp;

if(power_links > 210) power_links = 210;
if(power_rechts > 210) power_rechts = 210;
mleft_power=mleft_ptmp=power_links;
mright_power=mright_ptmp=power_rechts;

OCR1BL = power_links;
OCR1AL = power_rechts;

if(power_links || power_rechts)
TCCR1A = (1 << WGM11) | (1 << COM1A1) | (1 << COM1B1);
else
TCCR1A = 0;
}
int main(void)
{
initRobotBase();
DDRA &= ~0b00000011; // Datenrichtung ADC0 und ADC1 ist Eingang
PORTA |= 0b00000011; // interne PullUps aktivieren

while(1)
{
writeInteger(readADC(ADC_ADC0), 10);
writeString_P(" - ");
writeInteger(readADC(ADC_ADC1), 10);
writeString_P("\n\r");
if (readADC(ADC_ADC1)) > (readADC(ADC_ADC0))
setLEDs(4);
setMotorPWM(100,50);
}
else
{
setLEDs(32);
setMotorPWM(50,100);
}
mSleep(100);
}
return(0);
}(ungetestet)

Gruß

mic

Marian Otte
13.12.2012, 14:48
vielen danke werde es sofort testen

- - - Aktualisiert - - -

kann man den wert des pullups auch ändern weil der roboter erkennt nur wenn ich meinen finger direkt vor den sensor halte und ihn damit verdunkle der wert liegt jetzt bei 1023
und bei deaktiviertem pull up sind die Werte auf schwarzem und weißen papier identisch WARUM?
und wenn diesen befehl zum einschalten des Pins int1 nehemen will sagt der mir das ich erst deklarieren muss aber wie?
DDRC |= IO_PA4;
PORTC |= IO_PA4;

kann mir jemand bitte schnell helfen der Roboter muss nähmlich morgen der linie nach fahren können

Danke

Marian Otte

Dirk
13.12.2012, 18:22
Marian Otte:
kann man den wert des pullups auch ändern
Ja, indem man nicht den internen Pullup nimmt, sondern einen externen Widerstand. In der Schaltung des RP6, die radbruch gepostet hat, sind das R2 und R4.


und wenn diesen befehl zum einschalten des Pins int1 nehemen will sagt der mir das ich erst deklarieren muss aber wie?
DDRC |= IO_PA4;
PORTC |= IO_PA4;
Der Portpin PA4 gehört zu Port A des Mikrocontrollers und heisst auch nicht IO_PA4, also muss das so aussehen:
DDRA |= E_INT1;
PORTA |= E_INT1;

Marian Otte
13.12.2012, 18:27
danke

ich habe jetzt einen wiederstand von 200 kilo ohm pro fotowiederstand genommen aber unabhängig voneinander messen die beiden sensoren immer noch nicht wirklich
wenn der eine Wert hoch geht geht der andere auch mit hoch

Dirk
13.12.2012, 18:33
Siehe private Nachricht!
Evtl. LDRs mit schwarzer Pappe gegeneinander abschirmen.

Marian Otte
13.12.2012, 18:41
aber brauche ich beim spannungteiler den Kondensator?
Der ROboter muss bis morgen laufen und bis morgen bekomme ich solche kondensatoren nicht mehr

mfg Marian Otte

Dirk
13.12.2012, 18:43
Nein, den Kondensator brauchst du erstmal nicht.

Marian Otte
13.12.2012, 18:56
ok danke aber die Werte sind auch nach der Abschirmung noch Relativ gleich wenn ich den einene Zuhalte gehen beide Werte von vorher 500 auf undgefähr 900
Warum?

Dirk
13.12.2012, 19:13
Keine Ahnung.
Wenn du die LDRs lichtmäßig gut voneinander abgeschirmt hast, bleiben wieder 2 Fragen:
1. Wie GENAU hast du die beiden LDRs angeschlossen (kleine Skizze!)? Welche LDR-Typen hast du?
2. Wie sieht dein Programm aus?

Marian Otte
13.12.2012, 19:29
Das ist die Skizze

mein programm habe ich oben schon gepostest 24023
und das sind meine LDRs http://www.conrad.de/ce/de/product/145475/Fotowiderstand-A-9060-Gehaeuseart-5-mm/SHOP_AREA_37351&promotionareaSearchDetail=005
ich verstehe das einfach nicht

so hier noch ma das Programm
// Einfaches Linienfolgen mit RP6-Sensoren (Test der Funktion 2) 6.3.2008 mic

#include "RP6RobotBaseLib.h"

// Achtung! Die PWM-Werte werden hier OHNE Rampe verändert!
void setMotorPWM(uint8_t power_links, uint8_t power_rechts)
{
extern uint8_t mleft_ptmp, mright_ptmp;

if(power_links > 210) power_links = 210;
if(power_rechts > 210) power_rechts = 210;
mleft_power=mleft_ptmp=power_links;
mright_power=mright_ptmp=power_rechts;

OCR1BL = power_links;
OCR1AL = power_rechts;

if(power_links || power_rechts)
TCCR1A = (1 << WGM11) | (1 << COM1A1) | (1 << COM1B1);
else
TCCR1A = 0;
}
int main(void)
{
initRobotBase();
while(1)
{
writeInteger(readADC(ADC_ADC1), 10);
writeString_P(" - ");
writeInteger(readADC(ADC_ADC0), 10);
writeString_P("\n\r");
if (readADC(ADC_ADC1) > readADC(ADC_ADC0))
{
setLEDs(4);
setMotorPWM(100,50);
}
else
{
setLEDs(32);
setMotorPWM(50,100);
}
mSleep(100);
}
return(0);
}

radbruch
13.12.2012, 20:01
Vdd -- LDR -- ADCPin -- Widerstand -- GND

So sollten die Teile angeschlossen werden.

Marian Otte
14.12.2012, 11:29
danke

mfg marian otte