-         
Seite 3 von 3 ErsteErste 123
Ergebnis 21 bis 27 von 27

Thema: Ladestation für RP6?

  1. #21
    Moderator Robotik Visionär Avatar von radbruch
    Registriert seit
    27.12.2006
    Ort
    Stuttgart
    Alter
    56
    Beiträge
    5.788
    Blog-Einträge
    8
    Anzeige

    Ursprünglich wollte ich das Anlocken ja nur mit Bordmitteln des RP6 lösen:
    PHP-Code:
    // Projekt Ladestation Step 1: RP6 anlocken                         mic 9.2.2011

    #include "RP6RobotBaseLib.h"

    // ACS als LED-Sensor: https://www.roboternetz.de/phpBB2/zeigebeitrag.php?t=39560

    uint8_t getACS(void)
    {
        
    DDRD |= ACS_PWR;                    // Pins als Ausgang
        
    DDRB |= ACS_PWRH;
        
    PORTD &= ~ACS_PWR;                // Anoden gegen GND schalten
        
    PORTB &= ~ACS_PWRH;
        
    sleep(10);                            // Kurz warten und Stoppuhr starten
        
    setStopwatch1(0);
        
    startStopwatch1();
        
    DDRD &= ~ACS_PWR;                    // Anoden als Eingang
        
    DDRB &= ~ACS_PWRH;
        while(!(
    PIND ACS_PWR));        // Warten bis Pegel wieder high ist
        
    stopStopwatch1();

    // writeInteger(getStopwatch1(), 10); writeString_P("\n\r"); mSleep(100); // debug

        
    return(getStopwatch1());        // Messwert zurückgeben
    }

    int main(void)
    {
       
    initRobotBase();              // sollte man nicht vergessen
        
    powerON();                    // Achtung! Der RP6 kann sich bewegen!
        
    enableACS();                  // ACS muss für die Helligkeitsmessung
        
    setACSPwrHigh();              // eingeschaltet sein

       
    while(1)
       {
            
    moveAtSpeed(0150);
            while(
    getACS() > 20task_motionControl();
          
    moveAtSpeed(200150);
            while(
    getACS() < 20task_motionControl();
       }
       return(
    0);

    Das funktioniert, aber das Ausrichten des Lasers ist quasi unmöglich.

    Inzwischen habe ich den Bootlader als Problem ausgemacht. Wenn man zum Laden den Akku vom Kontroller trennt, startet der RP6 nach Beenden des Ladens nicht mehr. Also muss man wohl mit angeschlossenem RP6 laden, der Kontroller könnte dabei selbst die Ladekontrolle übernehmen. Ansatz wäre viellecht ein Sleep-Modus aus dem ihn sein Watchdog regelmässig wieder aufweckt.

    Warum soll der RP6 verschiedenfarbige LEDs auf der Station erkennen können? Welche Informationen willst du ihm zublinken?

    Atmel’s products are not intended, authorized, or warranted for use
    as components in applications intended to support or sustain life!

  2. #22
    Erfahrener Benutzer Roboter-Spezialist Avatar von RolfD
    Registriert seit
    07.02.2011
    Beiträge
    414
    Das könnte gehen, allerdings nicht mit verschiedenfarbigen Led Farben sondern mit verschiedenen Frequenzen / Pulslängen an den LEDs der Ladestation und dem ACS Sensor des RP6. Vielleicht reicht sogar schon eine einfache Wechselblinkerschaltung mit verstellbaren Dutycycle von 40 zu 60 % bei geschätzten 100Hz und Sichtblende.
    Mit NE555 als ic
    http://www.ne555.at/timer-ic-ne555/g...ungen/146.html
    Oder transistorisiert
    http://www.ferromel.de/tronic_1603.htm

    Wenn z.B. IR-LEDs der Station durch eine Sichtblende ähnlich wie die LDRs am RP6 voneinander getrennt sind, gibts quasi nur einen geraden "Einflugwinkel" auf die Ladestation, wo beide LEDs gleich stark empfangbar sind und eine Art Korridor aus "Dauerlicht" entsteht. Sobald du Dich vom Pfad weg bewegst muss die kurz oder lang leuchtende LED schwächer werden und es entsteht ein Rechteckimpuls dessen Breite und Ausschlag dir sagt wo Du dich ca. befindest. Ziel ist dann den Pfad z.B. über ein PID Regler wieder zu finden. Quasi ein umgedengelter Linienfolger. Natürlich muss man Reflektionen abschirmen. Das ganze funktioniert ähnlich wie die Landelichter auf einem Flugplatz. Man muss beim ansteuern halt nur schauen das man möglichst gleich viel Anteil von beiden Pulsen bekommt und wenn man von einer Sorte zu wenig hat muss man in die Gegenrichtung. Das wird genauer je näher du ran kommst da sich die Lichtkegel der LEDs auf Entfernung mischen können (wirkt wie ein Trichter), allerdings muss die Abschirmung so gebaut sein das auch wirklich bis zur "Landung" noch beide Sorten Licht zu bekommen sind, sonst kriegt die Regelschleife der Antriebsrichtung Torschlußpanik und baut mist. Ein Laser streut zu wenig, man braucht wirklich Lichtkegel und kein Strahl dafür. Ist also auch eine Frage des Aufbaus. Und man muss sicher stellen, das man min. ein Wechsel zwischen den LEDs bzw. mit dem Wechselblinker Dauerlicht hat, ab da beginnt dann der Zielanflug. Man könnte natürlich auch mit 2 freilaufenden Frequenzen arbeiten... und FFT... oder die IR-LEDs RC5 Signale senden lassen... die eine: weiter rechts.. die andere: weiter links... und der RP6 eiert dann auf die Station zu je nach dem welche LED er grade reinbekommt...

    LG Rolf
    Geändert von RolfD (08.03.2011 um 05:19 Uhr)

  3. #23
    Erfahrener Benutzer Roboter Genie Avatar von inka
    Registriert seit
    29.10.2006
    Ort
    nahe Dresden
    Alter
    71
    Beiträge
    1.406
    Zitat Zitat von radbruch Beitrag anzeigen
    Ursprünglich wollte ich das Anlocken ja nur mit Bordmitteln des RP6 lösen:
    [PHP]// Projekt Ladestation Step 1: RP6 anlocken mic 9.2.2011


    DDRD |= ACS_PWR; // Pins als Ausgang
    DDRB |= ACS_PWRH;
    PORTD &= ~ACS_PWR; // Anoden gegen GND schalten
    PORTB &= ~ACS_PWRH;
    ich versuche vergeblich - trotz komentare - diese befehle zu verstehen

    auch die Suche nach "ACS_PWR" ergab, dass es die defines wohl in der "RP6Robotbase.h" gibt, aber in der "RP6Control_I2CMasterLib.h" nur in einer abgewandeltern form...

    #define ACS_PWR_OFF 0
    #define ACS_PWR_LOW 1
    #define ACS_PWR_MED 2
    #define ACS_PWR_HIGH 3


    und wieder stehe ich aufm schlauch - wie schreibe ich jetzt den code so um, dass er von der m32 ausführbar ist?
    gruß inka

  4. #24
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    22.06.2009
    Beiträge
    1.388
    Das ist die ganz normale Schreibweise wie man auf einem Atmega in die Register schreibt.
    In dem Fall wird das Register DDRD (Richtungsregister für Port D) mit dem hinter ACS_PWR stehen den Wert verodert. Also eine 1 an die passende Stelle im Register geschrieben. Das selbe passiert auch mit Port B.
    Danach wird das Portausgangsregister (PORTD) mit dem invertieren Wert von ACS_PWR Verundet. Also in diesem Fall wird eine Null an die passende Stelle geschrieben. Dadurch schaltet man den entsprechenden PIN auf GND.

  5. #25
    Erfahrener Benutzer Roboter Genie Avatar von inka
    Registriert seit
    29.10.2006
    Ort
    nahe Dresden
    Alter
    71
    Beiträge
    1.406
    @shepede,

    danke für die erklärung für das beschreiben der register...

    mir ging es aber auch um die behandlung bzw. ersatz der defines z.b. "#define ACS_PWR (1 << PIND6) // Output" in der "RP6Robotbase.h", die ja bei ausführung des programms von der m32 aus nicht mehr eingebunden wird...
    gruß inka

  6. #26
    Erfahrener Benutzer Robotik Einstein Avatar von Dirk
    Registriert seit
    30.04.2004
    Ort
    NRW
    Beiträge
    3.798
    Hi inka,

    das Programm von radbruch läßt sich mit der M32 als I2C-Master und der Base als Slave (mit dem Standard-Slave-Programm) nicht 1:1 umsetzen.
    radbruch steuert die ACS-LEDs direkt an, was auf dem Base Slave nicht vorgesehen ist.

    Ich würde auch eher mit dem IR-Empfänger arbeiten: Das ist der eigentliche Empfänger für die 36 kHz IR-Signale.
    Du müßtest also "nur" den PB2-Pin Zustand der Base ausgeben.
    Aber auch dafür ist beim Slave keine Funktion 1:1 vorhanden, so dass man den Slave (und M32 Master) ändern müßte, um die Abfrage über die M32 zu realisieren.
    Gruß
    Dirk

  7. #27
    Erfahrener Benutzer Roboter-Spezialist Avatar von RolfD
    Registriert seit
    07.02.2011
    Beiträge
    414
    Was spricht dagegen wenn du dir eigene #defines baust bzw. die benötigten einfach aus der RP6Robotbase.h in deinen Quellcode übernimmst?
    Da beides (Base & M32 Board) eine M32 CPU hat, kann man auf beiden auch die Register erst mal gleich ansprechen, es macht ggf. nur einen Unterschied durch die Periherie.
    (die M32 hat ja keine ACS, also macht es keinen Sinn den Port auf der M32 dann ACS zu nennen oder so anzusteuern als wäre ein ACS dran...)
    Wirklich problematisch wäre das erst, wenn du unterschiedliche Prozessoren hast.
    Du solltes dich aber mal mit den Ports und den Arten wie man sie schaltet genauer befassen... also Richtungssteuerung der Ports (E/A) .. anlegen von 0/1, auslesen der Ports...
    Da gibts diverse Beiträge zu.. u.a. auch auf RN-Wissen.
    Dann im Quellcode nachgucken wie die Ports und deren Steuerbytes definiert werden... ggf. vergleichend zwischen Base und M32.
    Wenn du diese Lektion verstanden hast, schreibst du dir die #defines zukünftig mit links
    Gruß Rolf
    Sind Sie auch ambivalent?

Seite 3 von 3 ErsteErste 123

Stichworte

Berechtigungen

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