Robot Asuro, langage C

Discutez d'informatique ici !
blackangel
Messages: 2
Enregistré le: 04 Oct 2008, 22:34

par blackangel » 08 Oct 2008, 13:19

merci pour la réponse PrépaQuébec, j'essayerai des que le courage men dira de tester un petit truc


asuro est très facile même si tu est débutant
la documentation de montage et maintenant disponible en francais se qui rend les chose encore plus simple !

j'ai deja vu des morceau de programme pour asuro ou il combiné le java et le C pour obtenir un programme en fenêtre de commande a distance



PrépaQuébec
Membre Relatif
Messages: 253
Enregistré le: 26 Juin 2007, 14:57

par PrépaQuébec » 24 Déc 2008, 05:10

Salut,

vacances de Noël oblige, j'ai pris le temps de me repencher sur l'Asuro, histoire aussi de mettre à profit mes nouvelles connaissances en C. Voici ce que ça donne, suivi de ligne AVEC gestion des obstacles:

/*
Par : Stephane
Date : 23 décembre 2008
Revisions :

Fonctionnalités du programme: Programme Asuro pour suivi de ligne.
*/




#include "asuro.h"




/****************************************************************************/
/* CONSTANTES DE COMPILATION */
/****************************************************************************/
#define TEMPO 255 /* Sans unité, envoyé à la fonction sleep */
#define PMP 255 /* Sans unité, envoyé en paramètre
à MotorSpeed, représente la vitesse max
du robot. */
#define SENSI_SWITCH 10 /* Sans unité, sera comparé au retour
de PollSwitch */

typedef enum {GAUCHE, DROITE} t_direction;





/****************************************************************************/
/* DECLARATIONS DE FONCTIONS */
/****************************************************************************/
void Suivi_ligne(void);
void reaction_obstacle(void);
void corriger_trajectoire(t_direction direction);


/****************************************************************************/
/* FONCTION MAIN() */
/****************************************************************************/
int main(void)
{
/* On initialise le microcontroleur.
Cette fonction doit OBLIGATOIREMENT etre appelée en début de
programme!
*/
Init();

/* Appel de la fonction ligne() de suivi de ligne, dans un boucle infinie
pour l'instant.*/
while (1)
{
Suivi_ligne();
}

return 0;
}



/****************************************************************************/
/* DEFINITIONS DE FONCTIONS */
/****************************************************************************/
/* Pour réaliser le suivi, on créé un tableau de 2 entiers non signé, qui sera
envoyé à la fonction LineData pour détérminer la position d'Asuro
par rapport à la ligne.*/
void Suivi_ligne(void)
{
/* Conserve les valeurs courantes lues sur les phototransistors. */
unsigned int posit_ligne[2];

/* On met la LED frontale à ON pour faciliter le travail des phototransistors,
sa lumière étant réfléchie par le sol sous le robot. La LED de status est
placé sur vert, fonctionnement normal. On envoit le tableau posit_ligne à
LineData.
*/
FrontLED(ON);
StatusLED(GREEN);
LineData(posit_ligne);

/* Si l'un des phototransistors reçoit plus de lumière, c'est que le robot
sort de sa ligne dans cette direction. Les moteurs doivent contrer cette
tendance.
*/
if (posit_ligne[0] < posit_ligne[1])
{
corriger_trajectoire(GAUCHE);
}
else if (posit_ligne[0] > posit_ligne[1])
{
corriger_trajectoire(DROITE);
}
}



void corriger_trajectoire(t_direction direction)
{
unsigned char contact;

if (direction == GAUCHE)
{
/* L'allumage d'une des LED arrières permet de visualiser quel "if"
est à l'oeuvre. */
BackLED(OFF,ON);

/* Appel des fonctions de propulsion, moteur en avant, moteur droit
tourne plus vite afin de corriger la position. */
MotorDir(FWD, FWD);
MotorSpeed(80, 170);
}
else
{
BackLED(ON, OFF);
MotorDir(FWD, FWD);
MotorSpeed (170, 80);
}

/* La valeur 1 pour PollSwitch permet d'éviter les déclenchements
intempestifs. */
if ((contact = PollSwitch()) > SENSI_SWITCH)
{
reaction_obstacle();
}
}


void reaction_obstacle(void)
{
int i;

/* Événement inattendu, on passe la LED de status à jaune.
FrontLED est inutile dans cette fonction, on l'éteint.*/
StatusLED(YELLOW);
FrontLED(OFF);

/* On accélére progressivement jusqu'à vitesse maxi, l'appel à
à Sleep permet de ralentir le processus pour une bonne execution
du 1/4 de tour.*/
for(i = 0; i < PMP; i++)
{
MotorDir(RWD,RWD);
MotorSpeed(i,0);
Sleep(TEMPO);
}
}


Ça marche bien, Asuro pivote de 90 degrés sur obstacle et reprend sa route.

@++

Stef

tronos
Messages: 3
Enregistré le: 19 Jan 2009, 14:52

par tronos » 19 Jan 2009, 15:09

Je suis vraiment impressionné par ce programme, cependant j'aurais quelques questions à vous poser.
Je ne comprends pas la déclarationde la variable :
" typedef enum {GAUCHE, DROITE} t_direction; "
Que représente GAUCHE et DROITE? J'ai cru comprendre que dans ce genre de type de variable que l'on crée, on devait mettre des variables déjà existantes du type int, char ...
Alors pourquoi y a t'il GAUCHE et DROITE séparé par une virgule dans ce nouveau type de variable?

Avatar de l’utilisateur
fatal_error
Modérateur
Messages: 6610
Enregistré le: 22 Nov 2007, 13:00

par fatal_error » 19 Jan 2009, 19:40

salut,

GAUCHE et DROITE sont pas des int. (en fait si mais bon).
En gros une variable de type enum (énumération) ne prend que l'une des valeurs présentes parmi celles dans sa def.

Donc en gros, si tu as enum mon_enum;
mon_enum ne peut prendre que la valeur GAUCHE ou la valeur DROITE.
Ensuite, il me semble qu'on peut aussi accéder avec les indices, du style
enum=0 <=> enum=GAUCHE
enum=1 <=> enum=DROITE
(mais c'est en c ou c++...ou juste dans mes fantasmes :-) )

L'interet, c'est de rendre le code plus lisible, plutot que de se taper des indices partout.
Une alternative, c'est de passer par des directives de preprocesseur (les #)
jor
#define GAUCHE 0;
#define DROITE 1;
lors de la compil du programme, toutes les occurrences "GAUCHE" seront remplacées par 0 et les occurrences "DROITE" par 1.
la vie est une fête :)

PrépaQuébec
Membre Relatif
Messages: 253
Enregistré le: 26 Juin 2007, 14:57

par PrépaQuébec » 20 Jan 2009, 03:54

Hello,

plutôt que de définir ma struct en y incluant des déclarations de variables, j'ai choisi l'enum pour un soucis d'économie; et si tu me demandes pourquoi une struct, je te dirais que gauche et droite concernent la même chose, à savoir la direction. En fait je créé le type t_direction, qui ne peut être de toute façon que gauche ou droite;pour une énum la valeur suis l'ordre, donc DROITE,GAUCHE == 0,1, implicitement.

Je trouve ça joli comme ça, pas vous?

C'est bien du C! Du bon vieux ANSI C 89 même!

Bien vu fatal_error :)

Stef

tronos
Messages: 3
Enregistré le: 19 Jan 2009, 14:52

par tronos » 20 Jan 2009, 10:13

Et bien j'en apprends tous les jours sur le C merci beaucoup :)

tronos
Messages: 3
Enregistré le: 19 Jan 2009, 14:52

par tronos » 20 Jan 2009, 18:41

Me revoilà, j'ai un soucci au niveau de la détection d'obstacle.
Quand j'utilise la fonction pollswitch pour pouvoir éviter un obstacle en faisant un arc de cercle en marche arrière et sinon suivre une ligne droite et bien mon robot ne fait que tourné en rond en marche arrière et ne suit pas la ligne. Pourquoi ? Je n'ai pas le code sous la main cela resemble très fortement au code cité dans les topics précédent. je rajouterait le code quand je le pourrait.

PrépaQuébec
Membre Relatif
Messages: 253
Enregistré le: 26 Juin 2007, 14:57

par PrépaQuébec » 21 Jan 2009, 02:09

Salut,

il me faut absolument le code pour pouvoir t'aider!

@+

Stef

VynilChoco
Membre Naturel
Messages: 40
Enregistré le: 14 Déc 2008, 21:09

par VynilChoco » 04 Fév 2009, 20:36

c'est pas de la publicité ça?

PrépaQuébec
Membre Relatif
Messages: 253
Enregistré le: 26 Juin 2007, 14:57

par PrépaQuébec » 04 Fév 2009, 21:35

Non.

Mais pour suivre ton absence de logique deux secondes, on pourrait arrêter de parler sur le forum de:

Maple, Excel, HP, Dell, Windows XP et Vista, Apple, TI 89, 92...etc..., qui sont tous payants.


Pourrais-tu éviter les posts stupides à l'avenir, et essayer de contribuer au sujet? Si tu n'as pas de contribution à apporter, abstiens-toi et passe ton chemin.

merci.

EDIT : le message en cause a été supprimé, et un avertissement envoyé à l'utilisateur en question.

provincial50
Messages: 1
Enregistré le: 23 Sep 2013, 17:42

Pêche à la ligne ...euh : au DVD exactement !!

par provincial50 » 23 Sep 2013, 17:49

A tout hasard, compte tenu de l'ancienneté relative de ce forum, je viens demander ... de l'aide, bien sûr !!
Je me suis acheté il y a pas mal de temps ce robot chez Conrad, avec l'envie de le construire quand il me plaira. Depuis, j'ai déménagé, et perdu le DVD qui accompagnait cet envoi !! Et mon envie revient au galop !!
Qui pourrait me fournir sous forme de zip le contenu de ce DVD pour que je me le reconstitue ???
Je lui devrais un grand merci !!!

refkaaa
Messages: 1
Enregistré le: 01 Fév 2014, 10:16

par refkaaa » 01 Fév 2014, 10:23

j'ai un projet titulé robot guide qui permet de faire une video dans une salle de conférence et la diffuse en temp réelle(streaming)
svp c quoi la solution en langage c et merci

 

Retourner vers ϟ Informatique

Qui est en ligne

Utilisateurs parcourant ce forum : Aucun utilisateur enregistré et 15 invités

Tu pars déja ?



Fais toi aider gratuitement sur Maths-forum !

Créé un compte en 1 minute et pose ta question dans le forum ;-)
Inscription gratuite

Identification

Pas encore inscrit ?

Ou identifiez-vous :

Inscription gratuite