-         
RSS-Feed anzeigen

witkatz

WR02 - kleiner Buttler entsteht

Bewerten
Ich habe gerade angefangen, an einem kleinen autonomen 3W2D Roboter mit einer ca. A4 großen Ladefläche zu tüfteln. Das Chassis besteht aus 1,5mm starken Baumarkt-Aluwinkeln. Gedacht ist das zum Spaß als Buttler, der kleine Gegenstände indoor transportieren kann. Wahrscheinlich wird er Spielzeuge meiner Kleinen oder ein Stück Obst oder ein Getränk fahren, aber hauptsächlich mir als Spielwiese für µC und Elektronik dienen

Motoren habe ich solche wie die hier per Ebay gekauft "12V DC 100RPM High Torque Gear Box Electric Motor". Mit 90Ncm haben die Motoren genug Kraft, um das Fahrzeug + ca. 2kg Zuladung auf 75mm Rädern zu bewegen, auch auf weicherem Teppich und über kleine Schwellen. Erste Fahrproben haben das auch bestätigt
Als Räder habe ich 75mm Apparaterollen genommen. Angetrieben mit 8 x Mignon NiMh Akku fährt er ca. 30cm/s schnell. Meine nächste Baustelle ist die Leistungselektronik mit L298.

Hier ein paar Bilder vom Chassis.



Hier ein Video von der ersten Fahrprobe mit PWM und 1s Beschleunigungsrampen. Noch ohne Sensorik - reine Zeitsteuerung.
https://youtu.be/Uu1yAg4V5Ww

"WR02 - kleiner Buttler entsteht" bei Twitter speichern "WR02 - kleiner Buttler entsteht" bei Facebook speichern "WR02 - kleiner Buttler entsteht" bei Mister Wong speichern "WR02 - kleiner Buttler entsteht" bei YiGG.de speichern "WR02 - kleiner Buttler entsteht" bei Google speichern "WR02 - kleiner Buttler entsteht" bei del.icio.us speichern "WR02 - kleiner Buttler entsteht" bei Webnews speichern "WR02 - kleiner Buttler entsteht" bei My Yahoo speichern

Aktualisiert: 03.04.2015 um 11:13 von witkatz

Stichworte: - Stichworte bearbeiten
Kategorien
Kategorielos

Kommentare

  1. Avatar von witkatz
    Das Projekt schreitet langsam voran. Die Motortreiberplatine mit Spannungsversorgung und Batterieüberwachung ist soweit auf Rasterloch fertig. Die Motoren können jetzt in beide Richtungen drehen, getestet erstmal nur per manuellem Setzen der Signale. Die µC Platine mit PIC18F4520 ist jetzt im Aufbau.

    Aktualisiert: 29.03.2015 um 21:52 von witkatz
  2. Avatar von witkatz
    Der Roboter wird jetzt mit einem PIC18F4520 mit 32MHz internem Oszillator gesteuert. Für die Ansteuerung der Motortreiber habe ich die PWM Frequenz auf ca. 16kHz parametriert:
    Code:
        // CCP/PWM 
        PR2 = 0x7F; // 15625Hz, PWM Freq = OscFreq / 4 / (PR2+1) / TMR2_Prescale
        CCPR1L = 0; CCP1CONbits.DC1B = 0; // PWM Duty Cycle
        CCPR2L = 0; CCP2CONbits.DC2B = 0;
        TRISCbits.TRISC2 = 0; // set CCP1 pin to Output
        TRISCbits.TRISC6 = 0; // set Reverse_MotorL pin to Output
        TRISCbits.TRISC1 = 0; // set CCP2 pin to Output
        TRISCbits.TRISC5 = 0; // set Reverse_MotorR pin to Output
        T2CONbits.T2CKPS = 0b01; // TMR2 Prescaler 4
        T2CONbits.TMR2ON = 1; // TMR2 on
        CCP1CONbits.CCP1M = 0b1100; // CCP1 PWM Mode
        CCP1CONbits.P1M = 0b00; // CCP1 Enhanced PWM: Single Output
        CCP2CONbits.CCP2M = 0b1100; // CCP2 PWM Mode
    Für sanften Anlauf sorgen 1s Beschleunigungs/Verzögerungsrampen mit 4ms Timervariablen:
    Code:
        softtmr_1 = 250;
        while(softtmr_1){
            MotorL_vor(250-softtmr_1); // 1s beschl Rampe
        }
        softtmr_1 = 250;
        while(softtmr_1){
            MotorL_vor(softtmr_1);  // 1s verz Rampe
        }
    Das aktualisierte Video im ersten Blogbeitrag zeigt den Motortest nach Einschalten und eine Testfahrt mit einem (halbvollen ) Glas Apfelsaft.
    Aktualisiert: 03.04.2015 um 20:23 von witkatz
  3. Avatar von Searcher
    Zitat Zitat von witkatz
    Das aktualisierte Video im ersten Blogbeitrag zeigt den Motortest nach Einschalten und eine Testfahrt mit einem (halbvollen ) Glas Apfelsaft.
    Sieht gut aus und scheint ja was zu werden. Allerdings passiert mir da zu wenig. Glas ruhig mal randvoll machen
    Gruß
    Searcher
  4. Avatar von witkatz
    Mein Roboter bekommt jetzt einen Distanz- und Kollisionssensor. Eine Prallplatte aus einem Kabelkanaldeckel mit 3 HC-SR04 Sensoren und einem Magneten ist schwenkbar aufgehängt. In der Ruhelage wird ein kleiner Reed-Schließer von dem Magneten geschaltet. Wird bei Kollision die Platte frontal oder seitlich berührt, dann wird der Reed-Kontakt frei und der Sensor schaltet. Der Sensor hat eine Anzeige LED zur Schaltkontrolle, damit man die Position schnell nachjustieren kann.

    Die drei HC-SR04 werden alle gleichzeitig von einem PIC12F675 getriggert. Der PIC generiert mit Timer0 alle 65ms ein 250µs Puls, einfach Timer0 mit 1:256 Prescaler bei 4MHz internem Takt laufen lassen und Bit 0 des Timer0 auf GP0 ausgegeben. Die drei Echo-Signale der HC-SR04 und das Signal des Reedsensors werden zu einem einzigen Signal verUNDet, und zum haupt-µC gesendet.


    Aktualisiert: 15.09.2015 um 08:41 von witkatz
  5. Avatar von witkatz
    Das Handling des Abstand- und Kollisionssensors im Haupt µC (PIC18F4520) ist fertig getestet. Ich frage den HC-SR04 in einer 250µs ISR Routine ab, damit komme ich auf eine Genauigkeit von +/- 4cm. Für eine Distanzmessung zwecks Kollisionservermeidung ist es ausreichend.
    Code:
    volatile struct {
        char LastColSensor:1;
        char NewRawColDistanceAvailable:1;
        char reserve: 6; 
    } Flags;
    
    void interrupt isr(void)
    {
        // 250 µs Interrupt, oscillator 32MHz, TMR0 prescaler 1:16
        TMR0 -= 125; // Timer Value for next 250µs interrupt
        
        // ...
    
        // handling collision sensor in 250µs ISR Routine
        Tmr16bit250usColSens++;
        if ((CollisionSensor == 1) && (Flags.LastColSensor == 0)){
            // handle positive trig collision sensor
            Tmr16bit250usColSens = 0; 
            Flags.LastColSensor = 1;
        }
        if ((CollisionSensor == 0) && (Flags.LastColSensor == 1)){
            // handle negative trig collision sensor
            RawDistanceToCollision = Tmr16bit250usColSens;
            Flags.NewRawColDistanceAvailable = 1;
            Flags.LastColSensor = 0;
        }
        
        INTCONbits.T0IF = 0;
    }
    /* CalcDistanceToCollision should be called in main routine minimum every 30ms
     */
    void CalcDistanceToCollision(void){
        if (Flags.NewRawColDistanceAvailable){
            // calculate new distance value
            // distance in cm = 4.5 * Distance in 250µs ticks (ca.); 
            // filtered distance = (3 * filtered distance + new distance) / 4;
            DistanceToCollision = 
                    ((DistanceToCollision << 2) - DistanceToCollision // 3 * filtered distance 
                      + (RawDistanceToCollision << 2) + (RawDistanceToCollision >> 1)) // + distance in cm
                    >> 2; // / 4
            Flags.NewRawColDistanceAvailable = 0;
        }    
        if(Tmr16bit250usColSens > 600){ // limit max to 150ms
            Tmr16bit250usColSens = 600;
            DistanceToCollision = 0;        
        } 
    }
    Zum Testen der Auswertung ist es praktisch, den Wert in cm auf Display auszugeben. Im Video sieht man den Signalverlauf des vom PIC12F675 zusammengefassten Signal der 3 HC-SR04 und des Reedsensors und eine Testausgabe der Distanzmessung auf LCD. Dann folgt ein Fahrauftrag "60s gerade aus", der bei gemessenen 40cm Abstand vor einem Hindernis vorzeitig beendet wird.
    Aktualisiert: 15.09.2015 um 08:48 von witkatz
  6. Avatar von witkatz
    Zwischen den Jahren ist die beste Bastelzeit

    Der WR02 kann jetzt als Linienfolger kleine Transportaufträge in der Wohnung ausführen. Eine aus einzelnen auf A4 gedruckten Bahnabschitten verlegbare Linienbahn lässt sich flexibel verlegen und verändern. Die PVC-Klebstreifen lassen sich vom Papier und Boden leicht lösen, so dass die Bahn wiederwerwendbar ist.

    Problematisch sind jedoch Unebenheiten auf der Strecke. Die Höhenunterschiede an Teppichkanten und Türschwellen habe ich stufenweise mit Papierstapeln auf Stufen <2mm nivelliert. Wenn der Liniensensor mit RPR220 richtig in der Höhe justiert ist, hat er etwas reserve im Erfassungsbereich nach oben und nach unten so dass der Roboter <2mm Stufen auf und ab schafft. Wenn die Papierbahn während des Betriebs jedoch größere Beulen bekommt, verliert der Roboter an den Stellen die Linie.

    Zum Spielen ist eine aus 80g Standardpapier verlegte Bahn ok, aber als Buttler ist so ein Linienfolger auf Papierbahn nicht so zuverlässig Wenn der Spielspaß dauerhaft anhält, werde ich vielleicht die Bahn auf 100 oder 120g Papier ausdrucken.
    Zum Abschluss dieses Blogs habe ich ein kurzes, unspektakuläres Video gedreht, in dem WR02 ein Flens holt. Prost Neujahr!

    Aktualisiert: 03.01.2016 um 20:22 von witkatz
  7. Avatar von witkatz
    Um die Bahnver- und Zerlegung zu beschleunigen, habe ich die Bahnabschnitte an 4 Stellen 1cm eingeschnitten. Jetzt lassen sie die Blätter mit Geraden- und Kurvenabschnitten wie Gleisabschnitte einer Modelleisenbahn einfach zusammenstecken - ohne zusammenkleben.
    Ein paar Minuten und die Strecke Wohnzimmer - Küche ist zusammengesteckt und mit Kreppband auf dem Boden fixiert
    Aktualisiert: 18.02.2016 um 11:34 von witkatz