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

Thema: NIBO2 Programmierung mit dem Xbee Modul

  1. #1

    NIBO2 Programmierung mit dem Xbee Modul

    Anzeige

    LiFePo4 Akku selber bauen - Video
    Hallo,

    ich bin ein Anfänger wenn es die Programmierung von Robotern angeht. Wir haben ein Projekt mit dem NIBO2 Roboter, der mit dem NXB2 Modul ausgestattet ist. Auf dem PC läuft die Gegenstation UCOM-XBEE. Mein Problem ist folgendes:
    Der NIBO2 fährt autonom und wenn den S3 Schalter gedrückt wird soll er dann in "manuellen" Modus schalten, in diesem Modus sendet er ein Signal an den PC. Problem ist, dass dieses Signal nur manchmal vom PC empfängt wird. Ich denke nicht es liegt am Gerät, weil wir es mit anderen Robotern getestet haben und das gleiche passiert. Hier der Stück Code , der das Signal sendet
    Code:
    sendCmd(0x00);
    while((last_cmd=getCmd())==0);
    sprintf(text,"CMD: %d",last_cmd);
    appendLine(text);
    So er sendet das Signal mit sendCmd() und dann wartet bis er eine Antwort vom PC bekommt. sendCmd() und getCmd() sehen so aus:
    Code:
    void sendCmd(uint8_t c){
    	while(uart0_txfull());
    	UART0_putchar(c);
    }
    
    uint8_t getCmd(){
    	if(!uart0_rxempty()) return UART0_getchar();
    	return 0;
    }
    Und der Code vom PC sieht so aus:
    Code:
    int main(void){
    	if(!init())
    		return 1;
    	while(1){
    		printf("Waiting for NIBO...\n");
    		read(fd,buf,1); // auf NIBO2 Signal warten
    		printf("NIBO is requesting a command\n");
    		printf("Send a command back to NIBO\n");
                    scanf(" %d",&ch); // user Eingabe lesen
    		printf("Char: %d\n",ch);
    		write(fd,&ch,1); // Eingabe an NIBO2 senden
    	}
    	// Before leaving, reset the old serial settings and close the serial port
    	tcsetattr(fd, TCSANOW, &old_termios);
    	close(fd);
    	printf("Serial port closed");
    	return 0;
    }
    mit der Methode read() sollte der PC die Signale empfangen ,aber das passiert nur manchmal. Hier die Methode init(): (diese habe ich von einem anderen Projekt genommen, ich weiß nicht was das macht aber denke es ist nötig)

    Code:
    int init(){
    		//opens the serial port
    		fd = open(dev, O_RDWR | O_NOCTTY);
    		//if the selected serial port is not found
    		if (fd < 0) {
    			fprintf(stderr, "error, counldn't open file %s\n", dev);
    			return 0;
    		}
    		//returns an integer that either indicates success or failure of the prot opening
    		if (tcgetattr(fd, &old_termios) != 0) {
    			fprintf(stderr, "tcgetattr(fd, &old_termios) failed: %s\n", strerror(errno));
    			return 0;
    		}
    		//configure the serial port -> for more information: http://en.wikibooks.org/wiki/Serial_Programming/termios
    		memset(&new_termios, 0, sizeof(new_termios));
    		new_termios.c_iflag = IGNPAR; //ignore parity bit
    		new_termios.c_oflag = 0;
    		new_termios.c_cflag = CS8 | CREAD | CLOCAL | HUPCL; //sets the serial port to 8N1
    		new_termios.c_lflag = 0;
    		new_termios.c_cc[VINTR]    = 0;
    		new_termios.c_cc[VQUIT]    = 0;
    		new_termios.c_cc[VERASE]   = 0;
    		new_termios.c_cc[VKILL]    = 0;
    		new_termios.c_cc[VEOF]     = 4;
    		new_termios.c_cc[VTIME]    = 0;
    		new_termios.c_cc[VMIN]     = 1;
    		new_termios.c_cc[VSWTC]    = 0;
    		new_termios.c_cc[VSTART]   = 0;
    		new_termios.c_cc[VSTOP]    = 0;
    		new_termios.c_cc[VSUSP]    = 0;
    		new_termios.c_cc[VEOL]     = 0;
    		new_termios.c_cc[VREPRINT] = 0;
    		new_termios.c_cc[VDISCARD] = 0;
    		new_termios.c_cc[VWERASE]  = 0;
    		new_termios.c_cc[VLNEXT]   = 0;
    		new_termios.c_cc[VEOL2]    = 0;
    		//sets the input speed of the serial interdace to 9600baud
    		if (cfsetispeed(&new_termios, B9600) != 0) {
    			fprintf(stderr, "cfsetispeed(&new_termios, B9600) failed: %s\n", strerror(errno));
    			return 0;
    		}
    		//sets the output speed of the serial interdace to 9600baud
    		if (cfsetospeed(&new_termios, B9600) != 0) {
    			fprintf(stderr, "cfsetospeed(&new_termios, B9600) failed: %s\n", strerror(errno));
    			return 0;
    		}
    		//sets the termios struct of the file handle fd from the options defined via the options
    		if (tcsetattr(fd, TCSANOW, &new_termios) != 0) {
    			fprintf(stderr, "tcsetattr(fd, TCSANOW, &new_termios) failed: %s\n", strerror(errno));
    			return 0;
    		}
    		return 1;
    }
    Geändert von radbruch (30.11.2017 um 15:56 Uhr) Grund: Code-Tags eingefügt

Ähnliche Themen

  1. Verkaufe Xbee Devkit mit Xbee Modulen
    Von zwieblum im Forum Kaufen, Verkaufen, Tauschen, Suchen
    Antworten: 0
    Letzter Beitrag: 06.10.2012, 10:30
  2. Suche Beispielcode für die Datenübertragung mittels XBee-Modul beim Nibo2
    Von RoboFreak++ im Forum Allgemeines zum Thema Roboter / Modellbau
    Antworten: 22
    Letzter Beitrag: 06.03.2012, 03:11
  3. NIBO2 - Kommunikation ATmega128 mit Xbee-Modul und PC
    Von Hero_123 im Forum Sonstige Roboter- und artverwandte Modelle
    Antworten: 17
    Letzter Beitrag: 14.11.2010, 19:30
  4. Nibo2 RC5
    Von El Achimo im Forum Sonstige Roboter- und artverwandte Modelle
    Antworten: 40
    Letzter Beitrag: 13.10.2010, 22:36
  5. Antworten: 3
    Letzter Beitrag: 25.11.2009, 16:02

Stichworte

Berechtigungen

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

Solar Speicher und Akkus Tests