Liste der Anhänge anzeigen (Anzahl: 1)
Frage zur Funktionsweise eines Anti Collision System (mit Infrarot)
Hallo, ich hab eine Verständnis Frage zu dem ACS des RP6.
Das ACS besteht aus einem IR Empfänger und 2 IR LEDs.Anhang 22489
Woran erkennt jetzt der IR Empfänger von welcher IR LED der Strahl reflektiert wird?
Liegt es an der Frequenz oder an etwas anderem?
Schon mal Danke für Antworten.
Liste der Anhänge anzeigen (Anzahl: 2)
Hallo
Ein Blick in den Schaltplan (Seite 2) der Base offenbart es:
Bild hier
Die ACS-LEDs können getrennt angesteuert werden:
Code:
/**
* Disables the ACS task.
* ACS and IRCOMM Transmissions/Receptions will not work anymore.
*/
void disableACS(void)
{
acs_state = ACS_STATE_IDLE;
TIMSK &= ~(1 << OCIE2);
IRCOMM_OFF();
PORTB |= ACS_L;
PORTC |= ACS_R;
obstacle_right = false;
obstacle_left = false;
}
/**
* Enables the ACS task.
*/
void enableACS(void)
{
TIMSK &= ~(1 << OCIE2);
IRCOMM_OFF();
PORTB |= ACS_L;
PORTC |= ACS_R;
obstacle_right = false;
obstacle_left = false;
acs_state = ACS_STATE_IRCOMM_DELAY;
}
/**
* Turn ACS Power off.
*
* Example:
*
* setACSPwrOff();
*
*/
void setACSPwrOff(void)
{
DDRD &= ~ACS_PWR;
PORTD &= ~ACS_PWR;
DDRB &= ~ACS_PWRH;
PORTB &= ~ACS_PWRH;
PORTB &= ~ACS_L;
PORTC &= ~ACS_R;
}
/**
* Set ACS Power low.
*
* Example:
*
* setACSPwrLow();
*
*/
void setACSPwrLow(void)
{
DDRD |= ACS_PWR;
PORTD |= ACS_PWR;
DDRB &= ~ACS_PWRH;
PORTB &= ~ACS_PWRH;
}
/**
* Set ACS Power medium.
*
* Example:
*
* setACSPwrMed();
*
*/
void setACSPwrMed(void)
{
DDRD &= ~ACS_PWR;
PORTD &= ~ACS_PWR;
DDRB |= ACS_PWRH;
PORTB |= ACS_PWRH;
}
/**
* Set ACS Power high.
*
* Example:
*
* setACSPwrHigh();
*
*/
void setACSPwrHigh(void)
{
DDRD |= ACS_PWR;
PORTD |= ACS_PWR;
DDRB |= ACS_PWRH;
PORTB |= ACS_PWRH;
}
(Aus RP6RobotBaseLib.c)
Mit ACS_PWR und ACS_PWRH kann man R8 und R9 in unterschiedlichen Kombinationen ansteuern und so den Strom durch die ACS-LEDs und die Leuchtstärke beeinflußen.
Gruß
mic
[Edit]
Ach ja, ganz vergessen, die Kathoden liegen an ACS_L/ACS_R. Die Leds leuchten, wenn sie auf low liegen und über R8/9 ein high ausgegeben wird:
Bild hier
[Noch ein Edit]
Bei der Suche nach dem Urheber der 36kHz-Trägerfrequenz für das ACS habe ich die getrennte Ansteuerung der ACS-LEDs gefunden:
Code:
// -------------------------------
/**
* Timer 2 Compare ISR
* ACS & IRCOMM
*
* WARNING: DO NOT CHANGE THIS!
* NEVER try to control the IRCOMM by your own routines if you do not
* know what you are doing!
*
*/
ISR (TIMER2_COMP_vect)
{
static uint8_t ircomm_pulse;
if(acs_state < 2) { // If ACS is not active, perform IRCOMM transmissions
if(ircomm_pulse) { // Do we have IR pulses to send?
if(ircomm_pulse < 60) { // Bi-Phase encoding...
if(ircomm_data & 0x4000) // check current bit
PORTD ^= (1<<PIND7); // Toggle IRCOMM port
else
PORTD &= ~(1<<PIND7); // deactivate IRCOMM port
}
else if(ircomm_data & 0x4000) // The same as above, but the other way round:
PORTD &= ~(1<<PIND7); // deactivate IRCOMM port
else
PORTD ^= (1<<PIND7); // Toggle IRCOMM port
ircomm_pulse--;
}
else if(ircomm_send) { // Do we still have data?
PORTD &= ~(1<<PIND7);
ircomm_data <<= 1; // Next Bit!
ircomm_pulse = 120;
ircomm_send--;
}
else
PORTD &= ~(1<<PIND7); // no more pulses - IR LEDs off!
}
else if(acs_pulse) { // Send ACS IR pulses?
if(sysStatACS.channel == ACS_CHANNEL_LEFT) // which channel?
PORTB ^= ACS_L;
else
PORTC ^= ACS_R;
acs_pulse--;
}
else { // no more pulses - IR LEDs off!
PORTB |= ACS_L;
PORTC |= ACS_R;
}
}
(Ebenfalls aus RP6RobotBaseLib.c)