Aller au contenu


Photo

Mon tout 1er robot!


  • Veuillez vous connecter pour répondre
11 réponses à ce sujet

#1 clemch

clemch

    Nouveau membre

  • Membres
  • 7 messages

Posté 03 juin 2010 - 09:03

Bonjor à tous, je suis en train de mettre au point un robot avec arduino nommé "Otiste" car il l'est souvent!

Autant vous prévenir tout de suite: j'ai 14ans donc soyez indulgent!!!

Voilà la tête de l'engin:

Image IPB



Image IPB



Image IPB



Le robot possède:

  • Deux capteurs de contacts à l'avant
  • Un capteur ultrason SRF05
  • Et un petit programme (mon premier!)



Il est pour l'instant capable:

  • D'avancer
  • De changer de trajectoire lorsqu'un objet se situe à moins de 40 cm du capteur ultrason
  • De changer de direction lorsque l'un des capteurs avant est percuté
  • De devenir dingue!!! ;)



Pour avancer, j'ai déja besoin de vous:



Je viens d'acheter 2 cellules photosensibles 12 mm sur lextronic et je souhaiterais savoir comment les mettre à profit pour que celui-ci cherche la lumière. Voilà, j'attend vos réponses.



A+

#2 Esprit

Esprit

    Pilier du forum

  • Membres
  • PipPipPipPipPip
  • 1 503 messages
  • Gender:Male
  • Location:Belgique

Posté 03 juin 2010 - 10:23

Ehh, un nouveau !

Bienvenue ! :)



Avant toute chose, je te conseille d'aller te présenter, dans la partie du forum appropriée.

En effet, on est un peu curieux ici. C'est pas pour rien qu'on s'intéresse à la robotique et à toutes ces choses qu'il faut chercher et comprendre...





Maintenant, la bête.

Otiste a l'air vachement sympa.



Deux trois petites choses cependant.

Je serais toi, j'essayerais de rendre le câblage un peu plus structuré. Là on a l'impression que les fils partent un peu dans tous les sens.

C'est un peu normal pour un prototype, mais un peu de clarté et de structure, ça ne fait de mal à personne.



D'ailleurs, est-ce que les fils qui passent devant le capteur Ultrason ne gênent pas ? Ce qui serait une explication pour son comportement "étrange" que tu décris ? En effet, s'il voit les fils comme étant des objets, il risque de réagir comme tel, même s'il n'y a rien devant lui. Je me trompe ?





Pour tes cellules photosensibles, tu parles bien de photorésistance ?

Si oui, j'ai peut-être trouvé quelque chose qui va t'être utile : Photorésistance et arduino.

(Lien issu d'un site qui a l'air assez complet sur l'interaction entre les capteurs et l'arduino, voir ici.)





Bonne recherche et surtout bon amusement !

#3 clemch

clemch

    Nouveau membre

  • Membres
  • 7 messages

Posté 06 juin 2010 - 10:33

D'abord, merci pour ta réponse!

En effet, les fils passent devant les capteurs, ce qui explique ses réactions bizarroïdes!
Merci!!!



Ensuite, je parlais bien de photorésistances et le tutoriel que tu m'as indiqué est très bien cependant, il comporte une erreur: la PIN utilisé sur le schéma est l'analog 0 alors que dans le code, c'est la 1! Je me trompe?

Ensuite, le code ne m'indique pas comment je peut faire pour exploiter les données que me permettent de récuperer le code!

J'avais pensé à utiliser les deux photorésistances et lorsque la valeur de l'une est supérieure à l'autre, le robot tourne de ce côté, mais le problème c'est que dans ce cas, le robot ne cesserais de zigzaguer!!! Alors, je cherche un code qui me permettrais de dire: si une resistance a un peu plus de lumière que l'autre, le robot tourne.(laisser une marge de quelques unités pour que le robot ne zigzague pas CONTINUELLEMENT mais seulement lorsque la lumière devient trop différente.

Je ne sait pas si je me suis fait comprendre mais demandez-moi si vous voulez que je réexplique clairement.

merci d'avance

#4 Esprit

Esprit

    Pilier du forum

  • Membres
  • PipPipPipPipPip
  • 1 503 messages
  • Gender:Male
  • Location:Belgique

Posté 06 juin 2010 - 02:42

Il y a effectivement une petite erreur.

Dans le texte il est mis "une photorésistance, branchée à l'entrée analogique 1 de l'Arduino, est lue avec la commande analogRead()." et dans le programme "PHOTO = analogRead(1);", mais sur le schéma c'est bien cablé sur l'entrée analogique 0. Je n'avais pas fait attention.. Mais j'ai compris pourquoi. Ils ont repris le schéma de ce site, qu'ils conseillent d'ailleurs d'aller visiter.





Pour l'exploitation des données, une entrée analogique va te donner un chiffre entre 0 et 1023. (Voir "Entrée Analogique" du même site.) Partant de ce principe, et sachant que tu vas avoir deux photo-résistances, tu peux faire une différence entre les deux. Et utiliser cette différence avec une condition. (Voir "instructions conditionnelles".)



Ce qui donnerait une structure approximativement comme ceci :




{

}



void loop()

{

capteurDroite = analogRead(1);

capteurGauche = analogRead(2);



difference = capteurDroite - capteurGauche; //il faudra bien sûr déclarer "difference" plus haut.



if(difference < 0)

{

tourner à droite;

}

else if (difference > 0)

{

tourner à gauche;

}

else

{

continuer tout droit;

}

}[/code]



Dans ce cas là, le robot tournera à la moindre différence de luminosité entre la droite et la gauche.

Pour diminuer la réactivité pour attendre qu'il y ait une plus grosse différence entre droite et gauche, tu peux mettre par exemple :




{ ... }[/code]





Essaye toujours ça et tiens-nous au courant. ;)

(J'ai codé à la va-vite en de manière assez schématique, je n'ai pas testé ce code...)

#5 clemch

clemch

    Nouveau membre

  • Membres
  • 7 messages

Posté 06 juin 2010 - 04:37

Encore merci pour ton aide, je retient!

Par contre, après avoir longuement réfléchis, j'ai trouvé que lorsque le robot détectait un obstacle à 40 cm il vire tout le temps à droite (c'est dans le programme) et que par conséquent, je pourrais lui dire de tourner vers le point le plus lumineux! En plus, ce genre de code est simple! Mais rien ne m'empêche de combiner les deux!

à réfléchir!

Sinon, il m'arrive souvent de me retrouver dans une situation "ping-pong": il détecte un obstacle donc tourne vers la droite puis il rencontre un autre obstacle donc il tourne vers la gauche, droite, gauche, droite, gauche... Connais tu une parade à ce genre de situation?

Merci encore!

#6 Eskimon

Eskimon

    Membre

  • Membres
  • 71 messages

Posté 06 juin 2010 - 04:56

Hello !!

Bien dis donc beau début tout ça, ça promet !!

Pour parer à ta solution "Ping-pong", il existe une solution (parmi tant d'autre).

Tu peux t'amuser à tourner d'un angle aléatoire lorsque tu rencontres un obstacle, comme ça tu as une chance de t'en sortir :)

En gros, tu lances un nombre aléatoire, si il est pair tu vas a droite, si il est impair tu vas à gauche. Et tu tournes d'un angle égale au résultat du tirage aléatoire...

Comme ca il te fera encore plein d'autre surprise !!

#7 clemch

clemch

    Nouveau membre

  • Membres
  • 7 messages

Posté 06 juin 2010 - 05:03

C'est quoi le code pour un angle aléatoire?

#8 Eskimon

Eskimon

    Membre

  • Membres
  • 71 messages

Posté 06 juin 2010 - 05:39

bah ça dépend, je sais pas comment tu as codé tes changements de direction donc je saurais pas vraiment te dire...

pour faire de l'aléatoire :

et sinon, tu peux par exemple faire ceci :
tempo = random(100, 1000);
if(tempo%2) //nombre impaire, on tourne vers la droite pendant un certain temps
{
for(i=0; i {
moteur_droit=0;
moteur_gauche=1;
}
}
else //nombre paire, on tourne vers la gauche pendant un certain temps
{
for(i=0; i {
moteur_droit=0;
moteur_gauche=1;
}
}
//retour à la normal !!
[/code]



#9 clemch

clemch

    Nouveau membre

  • Membres
  • 7 messages

Posté 06 juin 2010 - 06:14

Très sofistiqué!
Mais j'ai compris!

Mais sinon, ne serais-il pas possible de créer un variable "pingpong" = à 0 au début et quand on tourne à gauche: +1 et à droite -1. On crée une autre variable "compteur" qui compte le nombre de virage et si "compteur" > 5 et "pingpong" == 0 alors on fait un demi-tour et avec un peu de chance, on est sorti du pétrin!

Exemple:

int pingpong;
int compteur;

void loop()
{
//On considère qu'a chaque virage vers la gauche, pingpong + 1 et vers la droite - 1
//On considère qu'a chaque virage, compteur + 1
if (compteur > 5)
{
if (pingpong == 0)
{
//Faire un demi-tour
}
}
}
[/code]

#10 Eskimon

Eskimon

    Membre

  • Membres
  • 71 messages

Posté 06 juin 2010 - 06:24

dans mon code, tu peux virer le for() pour mettre un delay() à la place

Ton idée devrait fonctionner, il te reste juste à tester ^^

(après je veux pas faire celui-qui-se-bat-pour-son-idée mais "l'avantage" de mettre de l'aléatoire dans un robot c'est que ca le rend moins "machine", en lui fesant prendre des chemins différents pour la même situation... )

#11 clemch

clemch

    Nouveau membre

  • Membres
  • 7 messages

Posté 06 juin 2010 - 08:24

exact!

#12 Eskimon

Eskimon

    Membre

  • Membres
  • 71 messages

Posté 06 juin 2010 - 08:41

alors ta essayé quoi ??




0 utilisateur(s) li(sen)t ce sujet

0 members, 0 guests, 0 anonymous users