Robot Asuro, langage C

Discutez d'informatique ici !
PrépaQuébec
Membre Relatif
Messages: 253
Enregistré le: 26 Juin 2007, 14:57

par PrépaQuébec » 27 Aoû 2008, 01:19

Hello,

une autre fonction, incluant le suivi de ligne, avec en plus détection des obstacles avec les switchs:

#include "asuro.h"
int main(void)
{
Init();
unsigned int lineData[2];
unsigned char taste;
FrontLED(ON);
StatusLED(GREEN);
while(1) {
taste=PollSwitch();
if (taste>0) {
StatusLED(RED);
MotorDir(RWD,RWD);
MotorSpeed(255,255);
}
else {
StatusLED(GREEN);
MotorDir(FWD,FWD);
LineData(lineData);
if (lineData[0]lineData[1]) {
MotorSpeed (140,80);
}
else if (lineData[0]==lineData[1]) {
MotorSpeed (150,150);
}
}
}
return 0;
}


C'est très rudimentaire au niveau de la réaction à la détection d'obstacle, j'aimerais ajouter une tempo afin de faire en sorte que le robot recule d'une certaine distance avant de reprendre sa route, mais je ne vois pas comment faire.

Quelqu'un peut m'aider?

Stef



bombastus
Membre Complexe
Messages: 2295
Enregistré le: 29 Nov 2007, 22:35

par bombastus » 28 Aoû 2008, 09:59

Salut,

Tu veux faire quoi exactement?

Si c'est pour le faire reculer d'une certaine distance il y a les capteurs odométriques, non?

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

par PrépaQuébec » 28 Aoû 2008, 16:34

Exact Bombastus, il y a ça, mais je me demandais si on ne pouvait rien faire de plus simple... genre une tempo...

Stef

bombastus
Membre Complexe
Messages: 2295
Enregistré le: 29 Nov 2007, 22:35

par bombastus » 28 Aoû 2008, 18:01

Oui avec une tempo, c'est possible aussi.

Mais je n'ai pas bien compris ce que tu veux faire : au départ ton robot suit une ligne, et là, tu as mis des obstacles sur la ligne? tu veux que le robot contourne l'obstacle? et qu'il retrouve la ligne après?

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

par PrépaQuébec » 28 Aoû 2008, 18:30

Oui à terme c'est ça le but, mais là j'y vais pas à pas afin de glaner tous les éléments qui me permettrons de faire un gros code complet; là j'y vais à coup de petits codes pas vraiment fonctionnels mais qui me permettent de voir comment ça marche.

Merci pour ton aide Bombastus, c'est grandement apprécié.

Stef

Allolaterre
Messages: 5
Enregistré le: 31 Aoû 2008, 17:04

par Allolaterre » 31 Aoû 2008, 17:23

Salut à tous,

D'abord, désolé si je pollue la discussion mais j'ai décidé de squatter le topic pour la bonne et simple raison que j'ai vu que certains aussi cherchaient à comprendre le fonctionnement des Switchs !
Bref, je galère et j'aimerais bien que quelqu'un explique une bonne fois pour toute comment marchent ces fout## Switchs !

Je suis relativement novice en programmation mais j'aimerais quand même savoir pourquoi avec ce programme (voir ci -dessous) , le robot ne fait-il rien ??

Code: Tout sélectionner
#include "asuro.h"
int main(void)
{
BackLED(OFF,OFF);
StatusLED(GREEN);
MotorDir(RWD,RWD);


unsigned char contact_1;
contact_1=PollSwitch();

if (contact_1>10)
{MotorSpeed(100,100);
BackLED(ON,ON);
}
else if (contact_1==0)
{StatusLED(RED);
}
else
{StatusLED(YELLOW);
}

while(1){}
return 0;
}


Je pense que l'erreur vient de la fonction PollSwitch() mais j'avoue que même avec les explications sur la librairie d'Asuro, je n'arrive à l'utiliser...

Voilà !
D'avance, un gros merci à celui qui débloquera la situation !
A+ !

abcd22
Membre Complexe
Messages: 2426
Enregistré le: 13 Jan 2006, 15:36

par abcd22 » 31 Aoû 2008, 18:09

(J'ai réindenté et supprimé des accolades inutiles)
Allolaterre a écrit:
Code: Tout sélectionner
#include "asuro.h"
int main(void)
{
    BackLED(OFF,OFF);
    StatusLED(GREEN);
    MotorDir(RWD,RWD);

    unsigned char contact_1;
    contact_1=PollSwitch();

    if (contact_1>10)
    {
   MotorSpeed(100,100);
   BackLED(ON,ON);
    }
    else if (contact_1==0)
   StatusLED(RED);
    else
   StatusLED(YELLOW);


Là si contact_1 > 10 tu fais avancer le robot, sinon tu changes juste la couleur de la LED, je ne sais pas si c'est ce que tu veux faire (comment on arrête le robot après ?).
Code: Tout sélectionner
while(1){}


Là tu as écris « tant que 1, ne rien faire », c'est une boucle infinie.
En fait ton programme lit une fois l'état de l'interrupteur, puis il ne fait plus rien, tu voulais sûrement mettre le if(contact_1... dans la boucle while.

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

par PrépaQuébec » 31 Aoû 2008, 19:07

Salut allolaterre, c'est aussi moi qui te répond sur le forum de arrex... :we:

Voici mon code pour le switch (ici ça marche pour n'importe quel switch, je t'ai expliqué sur l'autre forum comment faire pour les différencier)

Avec tu as le suivi de ligne:

#include "asuro.h"
int main(void)
{
Init();
unsigned int lineData[2];
unsigned char taste;
FrontLED(ON);
StatusLED(GREEN);
while(1) {
taste=PollSwitch();
if (taste>0) {
StatusLED(RED);
MotorDir(RWD,RWD);
MotorSpeed(200,200);
}
else {
StatusLED(GREEN);
MotorDir(FWD,FWD);
LineData(lineData);
if (lineData[0]lineData[1]) {
MotorSpeed (140,80);
}
else if (lineData[0]==lineData[1]) {
MotorSpeed (150,150);
}
}
}
return 0;
}


Il faut que tu mette ta boucle infinie avant:

while(1) {
taste=PollSwitch();
if (taste>0) {
StatusLED(RED);
MotorDir(RWD,RWD);
MotorSpeed(200,200);
}


En plus dans ton code tu as oublié d'appeler la fonction init(), nécessaire à chaque début de programme pour initialiser le microcontrôleur.
Je précise pour les perfectionnistes du forum que ce code est en développement, en effet vous aurez remarqué qu'avec ma réaction à la détection asuro ne fait que buter sur l'obstacle... dès que j'ai un peu de temps j'y mettrai une tempo.

Stef

Allolaterre
Messages: 5
Enregistré le: 31 Aoû 2008, 17:04

par Allolaterre » 01 Sep 2008, 00:21

Salut,
Pfiou, ça fuse les réponses par ici :we: !

Là si contact_1 > 10 tu fais avancer le robot, sinon tu changes juste la couleur de la LED, je ne sais pas si c'est ce que tu veux faire (comment on arrête le robot après ?).

En fait, c'était juste un mini-programme pour voir coment réagissait la fonction PollSwitch, d'où certaines incohérences (en fait volontaires car je ne voulais pas me prendre la tête sur un programme vraiment foncionnel, je reconnais quand même que j'ai oublié "init()" au début... :--: )


Là tu as écris « tant que 1, ne rien faire », c'est une boucle infinie.

En fait, je mets "while(1)" à la fin pour emprisonner le programme en fin de cycle. C'est recommandé pour éviter que des résidus de vieux programmes, qui n'ont pas été correctement flashés, n'interviennent pas dans le déroulement du programme actuel !


En gros, la fonction PollSwitch() ne fait que lire le nombre de byte, on est d'accord ??
Maintenant, je comprends mon erreur, j'avais déclaré ma variable contact au mauvais endroit ce qui fait qu'elle était ignorée : Voici un petit programme un peu plus abouti :
Code: Tout sélectionner
#include "asuro.h"
int main(void)
{
Init();

unsigned char contact;
unsigned char temps;

while(1){
contact=PollSwitch();
if (contact>0){
StatusLED(RED);
MotorDir(BREAK,BREAK);
MotorSpeed(0,0);
BackLED(ON,ON);
MotorDir(RWD,RWD);
MotorSpeed(150,150);
for (temps=0;temps<5;temps++){
Sleep(50);
StatusLED(YELLOW);
}
}

else{
MotorDir(FWD,FWD);
MotorSpeed(150,150);
BackLED(OFF,OFF);
StatusLED(GREEN);
}

}
return 0;
}


Par contre, les fonctions de temporisation conduisent à des résultats aléatoires, si quelqu'un savait comment mieux les exploiter, je suis preneur ???
Sinon, je pense qu'on peut se servir de l'odométrie sur les roues : quelqu'un sait si on doit les programmer de la même façon que le suivi de ligne ?

Merci Beaucoup !
Bonne nuit !

abcd22
Membre Complexe
Messages: 2426
Enregistré le: 13 Jan 2006, 15:36

par abcd22 » 01 Sep 2008, 01:16

Allolaterre a écrit:En fait, je mets "while(1)" à la fin pour emprisonner le programme en fin de cycle. C'est recommandé pour éviter que des résidus de vieux programmes, qui n'ont pas été correctement flashés, n'interviennent pas dans le déroulement du programme actuel !

C'est recommandé où ? Je ne vois vraiment pas en quoi le fait d'occuper le processeur à 100 % inutilement (au lieu de simplement terminer l'exécution du programme par un « return 0 ») peut être une bonne idée... ni en quoi ça peut empêcher un programme pas tué de fonctionner.
En gros, la fonction PollSwitch() ne fait que lire le nombre de byte, on est d'accord ??

Ça je n'en sais rien, je n'ai pas le robot, je ne commente que les erreurs de C.
Maintenant, je comprends mon erreur, j'avais déclaré ma variable contact au mauvais endroit ce qui fait qu'elle était ignorée

Ça m'étonnerait beaucoup que ton problème ait quelque chose à voir avec la déclaration de contact (si la déclaration avait été ignorée, le compilateur aurait émis une erreur pour utilisation d'une variable non déclarée); la seule chose qu'on pourrait reprocher à cette déclaration, c'est quelle n'est pas en début de bloc, endroit où il est conseillé de regrouper les déclarations de variables pour des raisons de clarté (je croyais même que c'était obligatoire de mettre les déclarations en début de bloc, après vérification dans la norme ce n'est pas le cas).

PS: Indentez le code SVP, tout l'intérêt des balises [code], c'est qu'à l'intérieur les espaces multiples ne sont pas supprimés, si vous n'indentez pas elles perdent tout leur intérêt.

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

par PrépaQuébec » 01 Sep 2008, 03:37

Allolaterre,
inutile d'appeler plusieurs fois la même fonction sous la même condition (MotorDir et MotorSpeed par exemple).

for (temps=0;temps<5;temps++){
Sleep(50);
StatusLED(YELLOW);
}


Ça m'étonnerai fort que ceci fonctionne? La durée max de sleep est extrêmement brève, de l'ordre de la milli-seconde il me semble... ça donne quoi?

En gros, la fonction PollSwitch() ne fait que lire le nombre de byte, on est d'accord ?


On est d'accord.

@++

Stef

Allolaterre
Messages: 5
Enregistré le: 31 Aoû 2008, 17:04

par Allolaterre » 12 Sep 2008, 21:41

Salut à tous,

D'abord, désolé pour le retard mais on va dire que c'était le rush de la rentrée :zen: !

En fait, j'avais une question toute simple : par exemple pour faire clignoter une DEL, comment je programme la temporisation ? Une boucle for ? La fonction sleep ?

J'en rajoute une autre pour la route : est ce que les fonctions de barrière lumineuse nécessitent d'ouvrir un pointeur comme pour la fonction de suivi de ligne ? Je veux dire faut-il déclarer "linedata0" ?

Merci beaucoup !
Bonne soirée !

Dominique Lefebvre
Membre Légendaire
Messages: 8007
Enregistré le: 03 Déc 2005, 13:00

par Dominique Lefebvre » 13 Sep 2008, 10:49

Allolaterre a écrit:Salut à tous,

D'abord, désolé pour le retard mais on va dire que c'était le rush de la rentrée :zen: !

En fait, j'avais une question toute simple : par exemple pour faire clignoter une DEL, comment je programme la temporisation ? Une boucle for ? La fonction sleep ?

Bonjour,
Ne connaissant pas le type précis de ton microcontroleur, je te ferai une réponse générale.
Dans le premier cas, la boucle for, tu fais dérouler à ton processeur toute une liste d'instructions rien que pour attendre! En fait, tu bloques ton processeur, alors qu'il est censé ne rien faire.

Dans le cas du Sleep, tu le libères vraiment et il peut faire autre chose pendant que ton thread attend d'être réveillé, ce qui suppose bien sur que ton processeur ait autre chose à faire. Si sa tâche est de dérouler le code dont tu parles, alors ça n'a que peu d'importance.... Le Sleep est simplement plus élégant qu'une boucle For.

Allolaterre
Messages: 5
Enregistré le: 31 Aoû 2008, 17:04

par Allolaterre » 13 Sep 2008, 19:13

Salut,

Donc, tu recommandes plus l'utilisation de la fonction sleep ? Par contre, j'ai l'impression que je ne peux pas aller plus loin que 255 :

Image

En gros quand je l'insère entre 2 fonctions (par exemple pour faire clignoter une DEL), et bien je ne vois pas de différence !
Si quelqu'un a une idée de son fonctionnement ?

Merci !
Bonne aprèm !

Dominique Lefebvre
Membre Légendaire
Messages: 8007
Enregistré le: 03 Déc 2005, 13:00

par Dominique Lefebvre » 13 Sep 2008, 19:26

Effectivement c'est un peu court! Le texte est suffisamment explicite!

Est-ce que tu as accés à la gestion d'interruptions sur ton processeur et si oui, sais-tu déclencher une interruption sur un évènement? Dans ce cas, tu peux programmer toi-même la veille de ta fonction...

Allolaterre
Messages: 5
Enregistré le: 31 Aoû 2008, 17:04

par Allolaterre » 14 Sep 2008, 12:16

Est-ce que tu as accés à la gestion d'interruptions sur ton processeur et si oui, sais-tu déclencher une interruption sur un évènement? Dans ce cas, tu peux programmer toi-même la veille de ta fonction...


Gloups, je suis désolé mais là je comprends pas tout :marteau: ... Pour moi l'interruption se fait avec la fonction sleep,non ???
Mais comme tu as vu sur la notice, je ne peux pas dépasser la valeur de 255, ce qui correspond à un temps de pause très court !

Merci !

PS : Pour info, le processeur est un Atml8(si tu connais ?)...

Dominique Lefebvre
Membre Légendaire
Messages: 8007
Enregistré le: 03 Déc 2005, 13:00

par Dominique Lefebvre » 14 Sep 2008, 12:30

Allolaterre a écrit:Gloups, je suis désolé mais là je comprends pas tout :marteau: ... Pour moi l'interruption se fait avec la fonction sleep,non ???
Mais comme tu as vu sur la notice, je ne peux pas dépasser la valeur de 255, ce qui correspond à un temps de pause très court !

Merci !

PS : Pour info, le processeur est un Atml8(si tu connais ?)...

Non je ne connais pas ce microcontrôleur...
Bien sur la fonction Sleep utilise une interruption! Mais comme elle ne te convient pas, je cherchais à savoir si tu disposais des outils pour programmer ta propre fonction de temporisation.

Un moyen de bricoleur, pas très élégant consisterait à mettre un Sleep dans une boucle, mais c'est vraiment pas beau, sans compter que pour les perf...

blackangel
Messages: 2
Enregistré le: 04 Oct 2008, 22:34

par blackangel » 04 Oct 2008, 22:44

salut a tous je suis nouveau jeune mais en lisant les fonction de base de asuro on trouve sa dans asuro.c

void Sleep(unsigned char time72kHz)
{
count72kHz = 0;
while (count72kHz < time72kHz);
}


moi pour l'instant j'ai pas encore compris toute la fonction mais avec quelque modification on devrai pouvoir rallonger le temps d'attente

j'ai une question comment on fait pour compiler les .hex avec codeblock si quelqun pouvai me repondre sa serai simpa le logitielle livré avec asuro n'est vraiment pas tres esthétique et je sui habituer a codeblock
alors comment faire ?

GrMi91
Messages: 1
Enregistré le: 07 Oct 2008, 20:26

par GrMi91 » 07 Oct 2008, 20:31

Bonjour tout le monde.
Je compte prendre un ASURO mais avant j'aurais une petite question "bête": est-ce qu'on peut le commander/diriger à distance ou pas ASURO? je pense pas vu le prix mais je demande quand même...
... et il n'y a pas un module qui permettrait de pouvoir le faire (via je sais pas comment (wifi, ....) :hein: )??? (et ui l'espoir fait vivre hihihihihi)

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

par PrépaQuébec » 08 Oct 2008, 01:37

Salut,

il est possible de le guider depuis ton PC, via récepteur/émetteur IR.
La portée est cependant assez faible ( environ 50 cm...), mais étant donné que le robot est assez modulable, si tu te sens l'âme d'un concepteur tu peux toujours bricoler de quoi pour que ça marche, avec du bluetooth par exemple.

Blackangel, je compte passer sous codeblocks moi aussi car je code avec ça d'habitude; pour créer un .hex, tu va dans nouveau projet, AVR, tu choisis AtMega8 (le micro contrôleur de l'asuro), et ensuite tu aura la possibilité de créer ton .h .

Stef

 

Retourner vers ϟ Informatique

Qui est en ligne

Utilisateurs parcourant ce forum : Aucun utilisateur enregistré et 9 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