void ubicop() { int back ; /*compteur pour reculer lors des obstacles*/ int speed1 = 30; int speed2 = 50; int speed3 = 80; int z = 0 ; /*compteur acquisition donnees*/ int donnee[4] ; /*tableau des donnees*/ int compteur ; /*compteur transmission donnees*/ int traitement = 1 ; /*flag pour fin de traitement*/ int transmission = 1 ; /*flag pour fin de transmission de donnee*/ int buffer ; /*ce qu on envoie au port serie*/ int bumper1 ; /*variable contenant les donnees du bumper*/ int maskbumper ; /*ce qu on envoie au port serie p/r au bumper*/ int synchro ; int flagrot = 0 ; int batterie ; char tampon ; /*tampon pour masker la commande*/ char commande; /*commande de l'hôte*/ char mask ; /*mask de la commande*/ char a = 0x10 ; /*rotation 90*/ char b = 0x20 ; /*rotation 135*/ char c = 0x30 ; /*rotation 180*/ char d = 0x40 ; /*rotation -135*/ char e = 0x50 ; /*rotation -90*/ char f = 0x00 ; /*roue gauche ou droit ->vitesse0 et pour vérifier si rotation*/ char g = 0x04 ; /*roue gauche vitesse 1*/ char h = 0x08 ; /*roue gauche vitesse 2*/ char i = 0x0C ; /*roue gauche vitesse 3*/ char j = 0x01 ; /*roue droite vitesse 1*/ char k = 0x02 ; /*roue droite vitesse 2*/ char l = 0x03 ; /*roue droite vitesse 3*/ char debut = 'z' ; /*protocole d envoie des delais*/ char obstacle='w' ; /*protocole d envoie des obstacles*/ float timeout = 0.3 ; sleep(10.0); disable_pcode_serial(); printf("go\n") ; bit_set (0x1021 , 0b00000100) ; /*IC2 rising edge*/ bit_clear(0x1022, 0b00000010) ; /*flag polled mode*/ while(1) { poke(0x1030 , 0b00100111); sleep(0.2); batterie=peek(0x1034); bumper1 = bumper(); /*detect obstacle*/ if(bumper1!=0) { stop(); for (back=0 ; back <90 ; back++) {motor(0,-100); motor(1,-100); } stop(); printf("bumper %d" , bumper1 ) ; } bit_set (0x1023 , 0b00000010) ; /*clear flag pour prochaine edge*/ synchro = 1 ; z = 0 ; while(synchro) { printf("syn..."); printf("\n") ; while (!(peek(0x1023)&0b00000010)); /*1er pulse*/ reset_system_time(); sleep(0.1) ; /*evite les échos*/ bit_set (0x1023 , 0b00000010) ; /*clear flag pour 2e pulse*/ while (!(peek(0x1023)&0b00000010)); /*2e pulse*/ poke(0x1025 , 0b10000000); /*clear timer overflow tflg2*/ if (seconds() >= timeout) /*si on a un délai >300ms*/ {synchro = 0;} /*on a la 1er pulse...on sort*/ } printf("sortie\n"); donnee[z++] = peekword(0x1012) ; /*temps du 1 bip (origine)*/ sleep(0.1) ; bit_set (0x1023 , 0b00000010) ; /*clear IC2F pour prochaine edge */ while(!(peek(0x1023)&0b00000010)) ; /* attend le 2e bip */ donnee[z++] = peekword(0x1012) ; /*temps du 2e bip */ sleep(0.1) ; bit_set (0x1023 , 0b00000010) ; /*clear IC2F pour prochaine edge */ while(!(peek(0x1023)&0b00000010)) ; /* attend le 3e bip */ donnee[z++] = peekword(0x1012) ; /*temps du 3e bip */ sleep(0.1); bit_set (0x1023 , 0b00000010) ; /*clear IC2F pour prochaine edge */ while (!(peek(0x1023)&0b00000010)); /* attend le 4e bip en comptant les overflow */ donnee[z++] = peekword(0x1012) ; /*temps du 4e bip */ /********donnees prises , envoie des delais*******/ transmission = 1 ; while (transmission) { printf("transmission\n"); sleep(1.0); /* serial_putchar(obstacle) ; serial_putchar(obstacle) ; maskbumper = (bumper1&0xFF); serial_putchar(maskbumper) ;*/ /*envoie des delais*/ /* serial_putchar(debut) ;*/ /*z*/ /* serial_putchar(debut) ; *//*z*/ while(!(peek(0x102e) & 0x80)); /*buffer vide?*/ for (compteur=0;compteur<4 ; compteur++) { buffer =(donnee[compteur]&0xFF) ; serial_putchar(buffer) ; /*partie basse*/ buffer =(donnee[compteur]>> 8) ; /*partie haute*/ serial_putchar(buffer) ; } sleep(0.2); maskbumper = (bumper1&0xFF); serial_putchar(maskbumper) ; serial_putchar(batterie) ; transmission = 0 ; } printf("reception\n"); traitement = 1 ; while (traitement) { /*sleep(1.0) ;*/ commande = serial_getchar(c); tampon = commande ; mask = (tampon&0b01110000) ; if (mask!=f) /* branche si on demande une rotation*/ { printf("c=%d" , commande); printf("%b" , mask); if(flagrot == 0 ) { flagrot++ ; if(mask==a) {track(0,-100, 8 );} if(mask==b) {track(0, -100 , 11);} if(mask==c){track(0,-100,15);} if(mask==d) {track(0,100,11 );} if(mask==e) {track(0,100,10);} } traitement = 0 ; } else { tampon = commande ; mask = (tampon&0b00000011); flagrot = 0 ; if(mask==j || mask == k || mask == l) { motor(0,speed3); motor(1,speed3); } sleep(1.2); stop(); traitement = 0; printf("\n"); printf("\n"); /*sortir de la boucle while*/ } } } peek(0x102e); /*de le buffer*/ reenable_pcode_serial(); }