- Akku Tests und Balkonkraftwerk Speicher         
Ergebnis 1 bis 9 von 9

Thema: Asuro Steuerung

  1. #1
    Neuer Benutzer Öfters hier
    Registriert seit
    05.06.2008
    Beiträge
    6

    Asuro Steuerung

    Anzeige

    LiFePo4 Akku selber bauen - Video
    Schreiben Sie ein Programm, um den ASURO (Atmega 8 ) fernzusteuern. Vom Terminalprogramm eines Computers aus soll der ASURO folgende Befehle entgegennehmen. Jeder Befehl besteht aus einem großen Buchstaben und wird mit dem zugehörigen kleinen Buchstaben quittiert. Wird ein anderes Zeichen übertragen, meldet der ASURO einen Stern zurück.

    V – vorwärts fahren
    R – rückwärts fahren
    L – langsam (wenn der ASURO fährt, ändert er die Geschwindigkeit)
    S – schnell (wenn der ASURO fährt, ändert er die Geschwindigkeit)
    B – bremsen
    A - ausrollen

    Benutzen Sie die ASURO-Bibliothek zum kontinuierlichen Abfragen der IR-Schnittstelle und steuern Sie mit einer eigenen Software die Hardware zur PWM so an, dass die Steuerung der Motoren nebenläufig zur Abfrage der IR-Schnittstelle arbeitet.
    Ich bräuchte vorschläge, wie ich das realisieren kann. Code wäre wünschenswert. [-o<

  2. #2
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    04.04.2005
    Ort
    Hamburg
    Alter
    36
    Beiträge
    826
    Öhm, wo ist denn jetzt das Problem?

    A) Es steht eigentlich alles in der Aufgabe
    B) Wenn wir dir Code-Schnipsel geben, dann ist dein Lernerfolg dabei minimal
    C) Hättest du ein wenig im Forum gestöbert, hättest du das Asuro-Unterforum entdeckt ... https://www.roboternetz.de/phpBB2/viewforum.php?f=44
    D) Wenn du ne klare Frage stellst, bekommst du ne klare Antwort

    mfg
    Andun
    www.subms.de
    Aktuell: Flaschcraft Funkboard - Informationssammlung

  3. #3
    Neuer Benutzer Öfters hier
    Registriert seit
    05.06.2008
    Beiträge
    6
    Ich verstehe schon das man diese Tastereingaben mit if Abfragen realisieren kann. Nebenläufige Abfrage zur IR-Schnitstelle verstehe ich als einfache while(1) schleife drum herum, und keine Msleep() befehl zu benutzen.

    fürs programm vorstellung

    #include "asuro.h"
    int main()
    {
    Init();
    while(1){}
    return 0;
    }


    //Mit .. lässt sich vorwärts realisieren
    MotorSpeed(a,b);
    MotorDir(FWD,FWD);

    //Mit .. lässt sich rückwärts realisieren
    MotorSpeed(a,b);
    MotorDir(RWD,RWD);

    //Fürs schneller fahren
    ??

    //Fürs langsamer fahren
    ??

    //Für bremsen ?
    break;

    //Ausrollen ?
    MotorSpeed(0,0);

    und die Eingabe mit den Tastern groß bzw. klein soll man da irgendwie die ASCII tabelle benutzen um das zu begrentzen usw..

    Also bitte, da ich Anfänger bin, wenn jemand seinen Code hier posten/erklären kann, wäre ich ihm sehr dankbar. **Wenn nötig den Topic ins ASURO unterforum versetzen.**

  4. #4
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    12.02.2006
    Beiträge
    459
    Das einfachste wäre hier im Forum nach einem Beispielprogramm zu suchen. Das Thema "Asuro Steuerung vom PC" wurde hier nämlich schon öfters bearbeitet ( inclusive Programmbeispiele ).

  5. #5
    Erfahrener Benutzer Robotik Visionär Avatar von oberallgeier
    Registriert seit
    01.09.2007
    Ort
    Oberallgäu
    Beiträge
    8.687
    ... oder dieses hübsche Lehr-/Lern-Beispiel von Henk:
    http://home.planet.nl/~winko001/Asur.../Asuro%20019.c
    Ciao sagt der JoeamBerg

  6. #6
    Neuer Benutzer Öfters hier
    Registriert seit
    05.06.2008
    Beiträge
    6
    ok mal schauen

  7. #7
    Neuer Benutzer Öfters hier
    Registriert seit
    05.06.2008
    Beiträge
    6
    Code:
    #include "asuro.h"
    
    int main(void)
    {
       Init();
       StatusLED(YELLOW);
       
       char c[3]={0, 0, 0};
       while(1)
       {
          SerRead(c,3,20);
       
       while( (c[1]||c[0]) != 'v'){
       if(c[1]=='V'||c[0]=='V')						//Vorwaerts fahren
       {
             StatusLED(YELLOW);
             MotorSpeed(150,150);
    		 MotorDir(FWD,FWD);
             	  
    	     if(c[1]=='L'||c[0]=='L')  //langsam
          {
             StatusLED(YELLOW);
             MotorSpeed(100,100);
            
          }
             if(c[1]=='S'||c[0]=='S')  //schnell
          {
             StatusLED(YELLOW);
             MotorSpeed(250,250);
             
          }
    	     if(c[1]=='B'||c[0]=='B')  //break
          {
             MotorSpeed(BREAK, BREAK);
             StatusLED(GREEN);
          }
    	     if(c[1]=='A'||c[0]=='A')   //motor aus, ausrollen
          {
             MotorSpeed(0,0);
             StatusLED(GREEN);
          }
    	     if((c[1]||c[0])!= ('A'||'B'||'S'||'L'||'R')){SerWrite("*\r\n",3);}   //blabla
    
       }							}
    
    
         
    	 while( (c[1]||c[0]) != 'r'){
        if(c[1]=='R'||c[0]=='R')			//Rueckwaerts fahren
       {
             StatusLED(YELLOW);
             MotorSpeed(150,150);
             MotorDir(RWD,RWD);
    
    		 if(c[1]=='L'||c[0]=='L')	//langsam
          {
             StatusLED(YELLOW);
             MotorSpeed(100,100);
            
          }
             if(c[1]=='S'||c[0]=='S')	//schnell	
          {
             StatusLED(YELLOW);
             MotorSpeed(250,250);
             
          }
    	     if(c[1]=='B'||c[0]=='B')	//break
          {
             MotorSpeed(BREAK, BREAK);
             StatusLED(GREEN);
          }
    	     if(c[1]=='A'||c[0]=='A')	//motor aus, ausrollen
          {
             MotorSpeed(0,0);
             StatusLED(GREEN);
          }
    		 if((c[1]||c[0])!= ('A'||'B'||'S'||'L'||'V')){SerWrite("*\r\n",3);}   //blabla
       }							}
    
          c[0]=0;c[1]=0;c[2]=0;
          Msleep(100);
       }
       
       return(0);
    }
    So, jetzt! Verbesserungsvorschläge usw. Wozu brauche ich auch eigentlich c[0] und c[1] in den abfragen?

    Es gibt da auch eine (unbedeutende? da gelbe farbe im AVRstudio) fehlermeldung
    tastat.c:11: warning: pointer targets in passing argument 1 of 'SerRead' differ in signedness

  8. #8
    Benutzer Stammmitglied
    Registriert seit
    01.12.2007
    Beiträge
    32
    https://www.roboternetz.de/phpBB2/ze...ght=signedness

    Da wurde das Problem behandelt. Hatte gestern das selbe Problem und mit den Tipps aus dem Thread hab ich es hinbekommen.

  9. #9
    Neuer Benutzer Öfters hier
    Registriert seit
    05.06.2008
    Beiträge
    6
    Code:
    //Besseres Programm
    #include "asuro.h"
    
    void vorwaerts()
    {
    //Motor links auf vorwärts
    PORTD |=(1<<PD5);
    PORTD &=~(1<<PD4);
    
    //Motor rechts auf vorwärts
    PORTB |=(1<<PB5);
    PORTB &=~(1<<PB4);
    }
    
    void rueckwaerts()
    {
    
    //Motor links auf rueckwaerts
    PORTD |=(1<<PD4);
    PORTD &=~(1<<PD5);
    
    //Motor rechts auf rueckwaerts
    PORTB |=(1<<PB4);
    PORTB &=~(1<<PB5);
    }
    
    void bremsen()
    {
    //Motor links bremsen (den Motor kurzschliessen)
    PORTD &=~(1<<PD4);
    PORTD &=~(1<<PD5);
    
    //Motor links bremsen (den Motor kurzschliessen)
    PORTB &=~(1<<PB4);
    PORTB &=~(1<<PB5);
    }
    
    void leerlauf()
    {
    //Motor kein Transistor öffnet
    PORTD |=(1<<PD4); //T1 geschlossen
    PORTD |=(1<<PD5);  //T3 geschlosen
    OCR1A=0; //T2 und T4 geschlossen
    
    //Motor rechts auf leerlauf
    PORTB |=(1<<PB4); //T1 geschlossen
    PORTB |=(1<<PB5); //T3 geschlosen
    OCR1B=0; //T2 und T4 geschlossen
    }
    
    void schneller()
    {
    //Wichig: 255 ist das Maximum
    if(OCR1A<=245) OCR1A += 10;
    	else OCR1A=255;
    if(OCR1B<=245) OCR1B += 10;
    	else OCR1B=255;
    }
    
    
    void langsamer()
    {
    //keinen negativen wert
    if(OCR1A>=10) OCR1A -= 10;
    	else OCR1A=0;
    if(OCR1B>=10) OCR1B -= 10;
    	else OCR1B=0;
    }
    
    int main()
    {
    Init();
    char zeichen;
    
    // Motorrichtung einstellen
    // PD4, PD5 für linken Motor, PB4, PB5 für rechten motor
    // als erstes die Pins als Ausgang setzten
    DDRD|=(1<<PD4) | (1<<PD5);
    DDRB |=(1<<PB4) | (1<<PB5);
    
    // PB1 und PB2 sind für die Ansteuerung der H-Brücken zuständig und werden von der PWM erzeugt
    // Jedoch müssen die Pins erst als Ausgang gesetzt weden.
    DDRB |= (1<<PB1) | (1<<PB2);
    
    //PWM einheit einstellen
    //Da wir jedes Bit in den Registern TCCR1A und TCCR1B aendern wollen koennen wir hier "=" benutzen und muessen nicht "|=" bzw "&=" benutzen
    //Wir setzen also nicht nur WGM10, COM1A1, COM1B1 und CS11 sondern löschen auch alle anderen Bits!!!
    TCCR1A = (1<<WGM10) | (1<<COM1A1) | (1<<COM1B1); //PWM phase correct 8-Bit, clear on match when upcounting
    TCCR1B = (1<<CS11); //nur CS11 etzen alles andere 0, fuer Takt/8     
    
    //Startrichtung
    vorwaerts();
    
    //Startgeschwindigkeit 100
    OCR1A=100;
    OCR1B=100;
    
    SerWrite("Eingabe:",7);
    while(1)
    {
    	SerRead(&zeichen,1,0);
    
    	switch(zeichen)
    	{
    		case 'V': 	vorwaerts();
    					SerWrite("v",1); 
    					break;
    
    		case 'R': 	rueckwaerts();
    					SerWrite("r",1); 
    					break;
    
    		case 'S': 	schneller();
    					SerWrite("s",1); 
    					break;
    
    		case 'L': 	langsamer(); 
    					SerWrite("l",1);
    					break;
    
    		case 'B': 	bremsen();
    					SerWrite("b",1);
    					break;
    		case 'A': 	leerlauf(); 
    					SerWrite("a",1);
    					break;
    
    		default: 	SerWrite("*",1);
    	}
    }
    
    }
    
    
    /*
    //Beispiele von Studenten
    
    	DDRB |= 54; //PB1,PB2,PB4,PB5 setzen => alle 4 als Ausgang
    	DDRD |= 48; //PD4,PD5 auf Ausgang
    	
    	TCCR1A |= 161; //TCCR1A/B setzen wie in Vorlesungsfolien angegeben
    
    
    //ist das gleiche wie
    	DDRB |=(1<<PB4) | (1<<PB5) | (1<<PB1) | (1<<PB2);
    	DDRD|=(1<<PD4) | (1<<PD5);
    
    // Jedoch ist die schreibweise DDRB |= 54; deutlich unübersichtlicher und Fehleranfällig
    
    
    //Mann kann sich auch Macros definieren um den COde strukturierter zu gestalten
    / Beispiel:
    //********* MACROS **********
     #define setBit(Byte, BitNo)   (Byte |=  (1<<BitNo))    // sets the BitNo in Byte
     #define clrBit(Byte, BitNo)   (Byte &= ~(1<<BitNo))   // clears the BitNo in Byte
     #define chkBit(Byte, BitNo)   (Byte & (1<<BitNo)) // true (!=0) , if Bit is set.
    	
    
    //Beisüiel aus der AVR Library:
    // In ./avr/include/avr/sfr_defs.h steht folgendes:
    #define _BV(bit) (1 << (bit))
    
    
    // Hier ein Beispiel wie die Motorensteuerung in der Asuro Bibliothek realisiert wird
    inline void MotorDir (
    unsigned char left_dir,
     unsigned char right_dir)
    {
    PORTD = (PORTD &~ ((1 << PD4) | (1 << PD5))) | left_dir;
    PORTB = (PORTB &~ ((1 << PB4) | (1 << PB5))) | right_dir;
    }
    //als Eingabe dienen die Makros:
    #define 	FWD   _BV(PB5)
    #define 	RWD   _BV(PB4)
    #define 	BREAK   0x00
    #define 	FREE   _BV(PB4) | _BV(PB5)
    
    */

Berechtigungen

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

Solar Speicher und Akkus Tests