- fchao-Sinus-Wechselrichter AliExpress         
Ergebnis 1 bis 10 von 14

Thema: Labyrinth_programm

Baum-Darstellung

Vorheriger Beitrag Vorheriger Beitrag   Nächster Beitrag Nächster Beitrag
  1. #13
    Moderator Robotik Visionär Avatar von radbruch
    Registriert seit
    27.12.2006
    Ort
    Stuttgart
    Alter
    62
    Beiträge
    5.799
    Blog-Einträge
    8
    Hallo

    Nur zeitgesteuert (und ungetestet!) ist das eine echte Herausforderung:

    Code:
    #include "asuro.h"
    
    #define BWD RWD // Rückwards bedeutet Backwards
    #define pwm_links 130
    #define pwm_rechts 117
    
    void Msleep_(uint16_t pause) // Funktion muss bei Libs mit 36kHz entfernt werden!
    {
    	if(pause) while(pause--) Sleep(72);
    }
    
    uint8_t taste(void)
    {
    	uint8_t t1, t2;
    	t1=PollSwitch();
    	t2=PollSwitch();
    	if(t1==t2) return(t1); // Wert gültig
    	return(0);
    }
    
    void vorwaerts(void)
    {
    	StatusLED(GREEN);
    	MotorSpeed(pwm_links, pwm_rechts);
    	MotorDir(FWD,FWD);
    }
    
    void bremsen(void)
    {
    	StatusLED(RED);
    	BackLED(OFF, OFF);
    	MotorSpeed(0,0);
    	MotorDir(BREAK, BREAK);
    	Msleep(50); // Bremszeit bis zum Stillstand
    }
    
    void rueckwaerts(void)
    {
    	BackLED(ON, ON);
    	MotorSpeed(pwm_links, pwm_rechts);
    	MotorDir(BWD,BWD);
    	Msleep(500);
    }
    
    void linksdrehen(void)
    {
    	BackLED(ON, OFF);
    	MotorSpeed(pwm_links, pwm_rechts);
    	MotorDir(BWD,FWD);
    	Msleep(300); // Zeit für 90°
    	bremsen();
    }
    
    void rechtsdrehen(void)
    {
    	BackLED(OFF, ON);
    	MotorSpeed(pwm_links, pwm_rechts);
    	MotorDir(FWD,BWD);
    	Msleep(300); // ditto
    	bremsen();
    }
    
    uint8_t testen(void)
    {
    	uint8_t temp=10; // Anzahl der Versuche
    	
    	vorwaerts();
    	FrontLED(ON);
    	while(--temp && !taste()) Msleep(20); // 20ms pro Versuch weiterfahren
    	if(temp) bremsen();
    	FrontLED(OFF);
    	return(temp); // Wenn temp != null wurde eine Taste gedrückt = Wand erkannt
    }
    
    int main(void)
    {
    	uint8_t schritt=0;
    
    	Init();
    
    	while(1)
    	{
    		vorwaerts(); // Vorwärts bis Hinderniss erkannt wird
    		while(!taste());
    		bremsen();
    		rueckwaerts();
    		bremsen();
    		
    		if(schritt++<3) // dreimal zuerst links abbiegen...
    		{
    			linksdrehen();
    			if(testen())
    			{
    			   rechtsdrehen();
    			   rechtsdrehen();
    			   if(testen()) rechtsdrehen();
    			}
    		}
    		else
    		{
    			rechtsdrehen();
    			if(testen())
    			{
    			   linksdrehen();
    			   linksdrehen();
    			   if(testen()) linksdrehen();
    			}
    			schritt=0;
    		}
    	}
    	return 0;
    }
    Wenn beim Kompilieren die Funktion Msleep() angemotzt wird, dann muss man diese umbenennen oder entfernen. Die Zeiten für die Drehungen, das Zurücksetzen und das Bremsen muss man anpassen. Das gilt auch für die PWM-Werte der Motoren.

    Keine Ahnung ob das halbwegs funktioniert...

    Gruß

    mic
    Geändert von radbruch (14.10.2012 um 12:59 Uhr) Grund: if(temp) bremsen(); eingefügt
    Bild hier  
    Atmel’s products are not intended, authorized, or warranted for use
    as components in applications intended to support or sustain life!

Stichworte

Berechtigungen

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

LiFePO4 Speicher Test