- 3D-Druck Einstieg und Tipps         
Ergebnis 1 bis 3 von 3

Thema: Kommunikation zweier Asuros: Datentransfer mit Fehlern...

  1. #1

    Kommunikation zweier Asuros: Datentransfer mit Fehlern...

    Anzeige

    LiFePo4 Akku selber bauen - Video
    Hallo, Ich bin Julian und neu hier im Forum.
    Zur Zeit habe ich ein Projekt mit dem Asuro, bei dem ich zwei Ausros untereinander via Bluetooth kommunizieren lassen möchte. Die Verbindung mit Bluetooth steht bereits.
    Der eine Asuro soll eine Linie verfolgen und dabei seine Geschwindigkeitswerte an den zweitesch schicken. Dieser soll dann zeitgleich parallel zum ersten Asuro das gleiche Linienmuster fahren. Dies nur mittels der empfangenen Daten.
    Die Linienverfolgung klappt recht gut. (ist auch eine sehr einfache Verfolgung^^). Der zweite Asuro jedoch erhält nur manchmal die Richtungsänderung und fährt somit lange im Kreis bzw. völlig falsch....
    Hat jemand eine Idee, woran dies liegen könnte? Kann es sein, dass es mit den Sendezeiten Probleme gibt? Also dass der zweite die daten nicht richtig empfängt, weil sich sendung und empfang sich direkt überschneiden?

    Hier mal der Quelltext:
    Linienverfolger:
    Code:
     
    #include <asuro.h>
    
    int main() {
    	Init();
    
    	unsigned int data[2];
    	unsigned int SpeedLinks,SpeedRechts;
    	char SndBuf[2];
    	FrontLED(ON);
    	while(1){ 
    		LineData(data); 
    		if (data [0] > 50 ) { 			// neben der linie
    			SpeedLinks=33;
    			SpeedRechts=175;
    			MotorSpeed(SpeedRechts,SpeedLinks);
    			SerWrite('R',1);
    		}
    		else {							// Korrektur, um auf die Linie zurückzukommen
    			SpeedLinks=175;
    			SpeedRechts=33;
    			MotorSpeed(SpeedRechts,SpeedLinks);
    			SerWrite('L',1);
    		}
    	};
    	return(0);
    }

    zweiter Asuro:

    Code:
    #include <asuro.h>
    
    int main(void) {
    	Init();
    	char RecBuf[1];
    	int SpeedRechts;
    	int SpeedLinks;
        MotorSpeed(0,0);
    	MotorDir(FWD,FWD);
    	
    	while(1) {
    		StatusLED(RED);
    		SerRead(RecBuf,1,0);
    		if (RecBuf[0]=='L') {
    			SpeedLinks=175;
    			SpeedRechts=33;
    			MotorSpeed(SpeedRechts,SpeedLinks);
    		}
    		if (RecBuf[0]=='R') {
    			SpeedLinks=33;
    			SpeedRechts=175;
    			MotorSpeed(SpeedRechts,SpeedLinks);
    		}
    	}
    	return (0);
    }

    Schonmal Danke für eure Hilfe

  2. #2
    Moderator Robotik Visionär Avatar von radbruch
    Registriert seit
    27.12.2006
    Ort
    Stuttgart
    Alter
    61
    Beiträge
    5.799
    Blog-Einträge
    8
    Hallo

    Nette Idee. Vielleicht wird es so besser:

    Code:
    #include <asuro.h>
    
    int main(void) {
    	Init();
    
    	unsigned int data[2];
    	unsigned int SpeedLinks,SpeedRechts;
    	char SndBuf[2], Richtung=0;
    	FrontLED(ON);
    	while(1){
    		LineData(data);
    		if (data [0] > 50 ) { 			// neben der linie
    			SpeedLinks=33;
    			SpeedRechts=175;
    			MotorSpeed(SpeedRechts,SpeedLinks);
    			if(!(Richtung == 'R')) {
    				SerWrite('R',1);
    				Richtung='R';
    			}
    		}
    		else {							// Korrektur, um auf die Linie zurückzukommen
    			SpeedLinks=175;
    			SpeedRechts=33;
    			MotorSpeed(SpeedRechts,SpeedLinks);
    			if(!(Richtung == 'L')) {
    				SerWrite('L',1);
    				Richtung='L';
    			}
    		}
    	}
    	return(0);
    }
    (Ungetestet)

    Gruß

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

  3. #3
    Erstmal danke für den Vorschlag. Klang auf jeden Fall logisch. Jedoch funktionierte dies auch nicht ganz korrekt.
    Ich hab es jetzt selbst soweit hinbekommen, dass es funktioniert.
    Code:
    ...	
    while(1){
    		LineData(data);
    		if (data [0] > 50 ) { 			// neben der linie
    			SpeedLinks=33;
    			SpeedRechts=175;
    			MotorSpeed(SpeedRechts,SpeedLinks);
    			if(!(SndBuf[0] == 'R')) {
    				SndBuf[0]='R';
    				SerWrite(SndBuf,1);
    				
    			}
    		}
    		else {						// Korrektur, um auf die Linie zurückzukommen
    			SpeedLinks=175;
    			SpeedRechts=33;
    			MotorSpeed(SpeedRechts,SpeedLinks);
    			if(!(SndBuf[0] == 'L')) {
    				SndBuf[0]='L';
    				SerWrite(SndBuf,1);
    				
    			}
    		}
    		Msleep(5);
    ...
    Wichtig ist dabei das Msleep am ende. Ohne diesem Sendet er daten mehrmahls und auch falsch...
    Am zweiten habe ich nichts verändert...
    Nun funktioniert alles soweit wie ich es wollte. Lediglich dass die Geschwindigkeiten der beiden nicht richtig übereinstimmen...

    vielen dank, Julian

Ähnliche Themen

  1. Brauche Hilfe bei der Kommunikation zweier Atmega über UART
    Von gm4288 im Forum Basic-Programmierung (Bascom-Compiler)
    Antworten: 4
    Letzter Beitrag: 27.12.2011, 22:47
  2. Kleines Programm mit Fehlern...
    Von Hans Z im Forum Asuro
    Antworten: 3
    Letzter Beitrag: 09.01.2007, 11:26
  3. Kommunikation zweier ATmega über ca. 10m Kabel
    Von Björn im Forum AVR Hardwarethemen
    Antworten: 43
    Letzter Beitrag: 10.11.2005, 22:05
  4. Rechenaufgabe (Datentransfer RS232 an PC)
    Von boeseTURBO-CT im Forum Basic-Programmierung (Bascom-Compiler)
    Antworten: 5
    Letzter Beitrag: 22.07.2005, 11:51
  5. Datentransfer ohne com-Port
    Von solo im Forum Elektronik
    Antworten: 16
    Letzter Beitrag: 09.02.2005, 17:02

Berechtigungen

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

Solar Speicher und Akkus Tests