NXT précision

Présentez-nous vos créations...
Avatar de l’utilisateur
Alban42800
Level 11
Level 11
 
Messages: 2473
Localisation: Loire (42)
Âge: 51 ans
expertgbbexpertnxtvainqueurconcours

Messagepar Alban42800 » Mer Avr 30, 2008 11:07 am

Voici mon moc en cours :
C'est une plate-forme d'expérimentation NXT qui à pour premier but :
De mesurer les dimensions d'une table afin de s'y déplacer et de revenir à un endroit sans utiliser les capteurs.

Mais aussi : de voir des objets et de les prendre et les déplacer.

Mais encore : d'autres trucs à venir (j'attend vos idées) !
Image
Image
Image
Image
Image
Comme vous pouvez le voir il n'a que deux roues, le ou les roues "folles" sont remplacées par de simples "pieds" glissant sur le sol. cela évite les problèmes de dérive quand le robot change de direction (le temps que la roue folle se mette dans l'axe).
Aussi j'ai choisi une transmission directe afin de limiter le jeu.

Edit :

Dans un premier temps je vais m'intéresser au déplacement sur une table. (J'ai un problème avec le sol chez moi : le carrelage est plein de relief et il y a plein de pieds de chaises/tables + un tapis + un chien alors la table c'est plus facile au début).
J'ai deux capteurs de lumière donc je vais les utiliser, ils me permette de positionner le robot perpendiculairement au bord de la table mais surtout d'éviter de tomber.
Donc le robot est posé sur la table en direction d'un bord mais pas d'un coin. il va mesurer le dimensions de la table puis se placer au centre.
Enfin il va calculer l'angle et la distance pour aller se placer dans un coin de la table les "yeux" fermés.

Voici la vidéo youtube qui sera dispo dans qq minutes le temps que youtube la traite... :



Avatar de l’utilisateur
Alex
Level 8
Level 8
 
Messages: 813
Localisation: Pallud (à coté d'Albertville) SAVOIE
moceurtechnicjunior

Messagepar Alex » Mer Avr 30, 2008 11:28 am

Un bon MOC déjà ! Ayant été fan des Mindstorms, je trouve celui-ci poussé en terme de programmation ! :D
Bon, ben sinon, j'ai pas d'autres idées à proposer. Ce MOC remplit déjà suffisamment de fonctions : avoir le plan de la table et être capable de voir et de prendre des objets ! Ah, si une idée ! Regroupés tous les objets pris par le NXT au centre de la table par exemple...chaud à réaliser ! :D ;)

Avatar de l’utilisateur
Alban42800
Level 11
Level 11
 
Messages: 2473
Localisation: Loire (42)
Âge: 51 ans
expertgbbexpertnxtvainqueurconcours

Messagepar Alban42800 » Mer Avr 30, 2008 11:35 am

Alors, j'ai oublié qq précisions :
dans les moteurs il a du jeu, j'ai donc adapté le programme pour faire un rattrapage de jeu, cela consiste à envoyer un courant de faible intensité au moteur afin qu'il mette les engrenages en pression sans faire avancer le robot puis de mémoriser la position en degré avant de démarrer. sans cela le robot se décale à chaque fois qu'il tourne.
Ensuite on voit sur la vidéo qu'il n'avance pas droit malgré les fonctions de synchronisations des moteurs intégrées (code en nxc). Pour l'instant cela ne me gène pas car la table est petite mais il faudra trouver une solution.
Enfin le programme est prévu pour une table rectangulaire et je n'en ai pas :-((( sur une table ronde cela à peu d'intérêt.

Edit :

Voici le code actuel en NXC pour ceux qui veulent le lire...

Code: Tout sélectionner
#include "NXCDefs.h"
int seuil2,seuil3; //seuils capteurs lum
int gp, pp, jp; // grande puissance, petite puissance et puissance pour le ratrappage de jeu
int pause; //pause entre 2 actions
int s2,s3; //sensor2 et 3
long disb,disc,refb,refc; // mesure angle moteurs b et c
long tx,ty; // largeur et longueur table
long chemin,angle; // distance à parcourir et angle de direction
long aa,bb,cc; // temporaires pour les calculs

void on_light()
{
SetSensorType(IN_2, IN_TYPE_LIGHT_ACTIVE);
SetSensorMode(IN_2, IN_MODE_RAW);
SetSensorType(IN_3, IN_TYPE_LIGHT_ACTIVE);
SetSensorMode(IN_3, IN_MODE_RAW);
}

void off_light()
{
SetSensorType(IN_2, IN_TYPE_NO_SENSOR );
SetSensorType(IN_3, IN_TYPE_NO_SENSOR );
}

void init()
{
SetIOMA(OutputIOUpdateFlags(OUT_B), UF_UPDATE_RESET_ROTATION_COUNT);
SetIOMA(OutputIOUpdateFlags(OUT_C), UF_UPDATE_RESET_ROTATION_COUNT);
on_light();
Wait(100);
seuil2=Sensor(S2)-100;
seuil3=Sensor(S3)-100;
gp=50;
pp=20;
jp=7;
pause=200;
off_light();
}

void bord()
{
on_light();
s2=500; s3=500;
while (s2 > seuil2 || s3 > seuil3)
   {
   s2=Sensor(S2);
   s3=Sensor(S3);
   if (s2<seuil2) Off(OUT_B); else OnFwdReg(OUT_B,gp,OUT_REGMODE_SPEED);
   if (s3<seuil3) Off(OUT_C); else OnFwdReg(OUT_C,gp,OUT_REGMODE_SPEED);
   }
Off(OUT_BC);
PlayTone(800, 50);
Wait(pause);
s2=0; s3=0;
while (s2 < seuil2 || s3 <seuil3>seuil2) Off(OUT_B); else OnRevReg(OUT_B,pp,OUT_REGMODE_SPEED);
   if (s3>seuil3) Off(OUT_C); else OnRevReg(OUT_C,pp,OUT_REGMODE_SPEED);
   }
Off(OUT_BC);
PlayTone(800, 50);
Wait(pause);
s2=500; s3=500;
while (s2 > seuil2 || s3 > seuil3)
   {
   s2=Sensor(S2);
   s3=Sensor(S3);
   if (s2<seuil2) Off(OUT_B); else OnFwdReg(OUT_B,pp,OUT_REGMODE_SPEED);
   if (s3<seuil3) Off(OUT_C); else OnFwdReg(OUT_C,pp,OUT_REGMODE_SPEED);
   }
Off(OUT_BC);
PlayTone(800, 50);
Wait(pause);
off_light();
}

void tourne(int angle)
{
long degrees;
PlayTone(400, 200);
OnFwdSync(OUT_BC, jp, -100); // rattrappage de jeu
Wait(pause);
Off(OUT_BC);
refb=MotorRotationCount(OUT_B);
refc=MotorRotationCount(OUT_C);
OnFwdSync(OUT_BC, gp, -100);
disb=0;
disc=0;
degrees=angle*670/100;
while (disb-disc < degrees)
   {
   disb=MotorRotationCount(OUT_B)-refb;
   disc=MotorRotationCount(OUT_C)-refc;
   }
Off(OUT_BC);
PlayTone(1200, 50);
}


task main()
{

init();
bord();
tourne(180);
PlayTone(400, 200);
OnFwd(OUT_BC,jp); // rattrappage de jeu
Wait(pause);
Off(OUT_BC);
refb=MotorRotationCount(OUT_B);
refc=MotorRotationCount(OUT_C);
bord();
tx=(MotorRotationCount(OUT_B)-refb + MotorRotationCount(OUT_C)-refc) / 2;
NumOut(0, LCD_LINE1, tx, true);
PlayTone(600, 500);
tourne(180);
RotateMotorEx(OUT_BC, gp, tx/2,0,true,true);
tourne(90);
bord();
tourne(180);
PlayTone(400, 200);
OnFwd(OUT_BC,jp); // rattrappage de jeu
Wait(pause);
Off(OUT_BC);
refb=MotorRotationCount(OUT_B);
refc=MotorRotationCount(OUT_C);
bord();
ty=(MotorRotationCount(OUT_B)-refb + MotorRotationCount(OUT_C)-refc) / 2;
NumOut(0, LCD_LINE2, ty, false);
PlayTone(600, 500);
tourne(180);
RotateMotorEx(OUT_BC, gp, ty/2,0,true,true);

// DEMO
// chemin = racine((tx/2)^2)+((ty/2)^2)
aa=(tx/2)*(tx/2);
bb=(ty/2)*(ty/2);
cc=aa+bb;
aa=Sqrt(cc);
chemin=aa-180;
//angle = Acos x/2 / chemin
aa=50*ty;
bb=chemin+180;
cc=aa/bb;
angle=Acos(cc);
NumOut(0, LCD_LINE1, aa, true);//
NumOut(0, LCD_LINE2, bb, false);//
NumOut(0, LCD_LINE3, cc, false);//
NumOut(0, LCD_LINE4, angle, false);//
tourne(angle);
RotateMotorEx(OUT_BC, gp, chemin,0,true,true);
Wait(60000);
}


Edit :

Alex a écrit:Un bon MOC déjà ! Ayant été fan des Mindstorms, je trouve celui-ci poussé en terme de programmation ! :D
Bon, ben sinon, j'ai pas d'autres idées à proposer. Ce MOC remplit déjà suffisamment de fonctions : avoir le plan de la table et être capable de voir et de prendre des objets ! Ah, si une idée ! Regroupés tous les objets pris par le NXT au centre de la table par exemple...chaud à réaliser ! :D ;)

Ouaip, avec une grande table pourquoi pas...
Pour l'instant je vais commencer à faire joujou avec les objets sur le sol, je pensais à : chercher un objet - aller le prendre - retourner le poser d'où viens le robot, aller ou était l'objet et en chercher un autre.
Mais avant j'aimerai faire dessiner un cercle au robot sachant qu'il doit définir son centre et son diamètre afin de le faire le plus grand possible dans la table. La difficulté est de maîtriser la vitesse des moteurs et la distance parcourue.

Avatar de l’utilisateur
maxlemalade
Level 10
Level 10
 
Messages: 1612

Messagepar maxlemalade » Mer Avr 30, 2008 12:00 pm

pour ton probleme de changement de direction; la solution est peut etre d'utiliser un soustracteur (voir MOC de sariel )
l'idée etant qu'on moteur te servira alors pour avancer/reculer et l'autre, pour pivoter.

j'avais l'image sur mon PC donc je l'ai mise dans ma gallerie par flemme de rechercher :p (Sariel, contacte moi si cela te pose probleme, j'effacerai ;))

Image

voila, a priori, je pense qu'il y a moyen de reduire la quantité de pignons par rapport au plan original de sariel pour reduire les jeux et garantir une meilleure precision.
ensuite, l'avantage, c'est que, moteur de direction arreté, la seule deviation que tu puisses avoir, c'est celle du au jeu de fonctionnement - ensuite, c'est fini, ca ne devira plus, quelle que soit la distance a mesurer :)
membre fantôme en cure de désintoxication d'internet ludique :p

Avatar de l’utilisateur
Alban42800
Level 11
Level 11
 
Messages: 2473
Localisation: Loire (42)
Âge: 51 ans
expertgbbexpertnxtvainqueurconcours

Messagepar Alban42800 » Mer Avr 30, 2008 12:37 pm

Oui j'ai déjà vu ce système plusieurs fois et je le ferai un jour, effectivement le robot avancera en ligne droite plus facilement mais est-ce qu'il tourne sur lui même si l'on n'actionne que la direction ?
Pour le jeu j'ai la solution logicielle.
PS : fait ch*** de refaire la mécanique et ensuite de refaire tous les calibrages et tout le programme alors que j'ai pas encore utilisé la pince et le capteur US.

Avatar de l’utilisateur
maxlemalade
Level 10
Level 10
 
Messages: 1612

Messagepar maxlemalade » Mer Avr 30, 2008 12:49 pm

ouhla, je ne me rappelle plus s'il peut tourer sur lui meme avec ce systeme ... et mes capacités de mentalisation du mouvement (ventre creux de surcroit) sont un peu juste pour te le dire comme ca :p ... j'crois que oui mais pas sur :p
membre fantôme en cure de désintoxication d'internet ludique :p

Avatar de l’utilisateur
Nico71
Level 14
Level 14
 
Messages: 9618
Âge: 35 ans
expertgbbexpertsoft3dexperttrialtruckmoceurtechnicexpertvainqueurconcours3

Messagepar Nico71 » Mer Avr 30, 2008 4:42 pm

Hello, trés jolie moc, trés poussée en prog surtout :D

Pour le substractor, oui en faisant tourner le moteur direction, les deux chenilles tourne en sans inverse.

donc c'est faisable, trés faisable même, mais faut mettre en place tout le substractor

:D

Avatar de l’utilisateur
Alban42800
Level 11
Level 11
 
Messages: 2473
Localisation: Loire (42)
Âge: 51 ans
expertgbbexpertnxtvainqueurconcours

Messagepar Alban42800 » Mer Avr 30, 2008 4:58 pm

A vouloir trop en faire on ne fait plus rien, je reste sur ma mécanique, le soustracteur se sera pour un prochain moc. Pour l'instant j'essaye de faire un cercle et c'est pas évident, la précision des moteurs (asservissement intégré) n'est pas top, surtout à faible puissance.
Edit 1 : Enfin en me relisant j'aurai bien besoin du soustracteur quand même :)
Edit 2 : quoique le pb serait le même, si le steering motor ne tourne pas à vitesse constante le cercle ne sera pas rond.
Edit 3 : La programmation c'est en partie mon métier, ça aide.

Avatar de l’utilisateur
Polo
Level 12
Level 12
 
Messages: 3031
Localisation: Tours France
Âge: 38 ans
collectionneurmoceurstarwarsexpert

Messagepar Polo » Mer Avr 30, 2008 5:54 pm

Très joli tout ça !!

Avatar de l’utilisateur
Anio
Administrateur
Administrateur
 
Messages: 19514
Âge: 37 ans
revieweurmoceurstarwarsexpertambassadeur

Messagepar Anio » Mer Avr 30, 2008 6:24 pm

Ben je suis très impressionné ! :shock:
Alban, tu fais vraiment des merveilles avec le NXT, t'es sacrément fort !

Car c'est quand même pas accessible à tout le monde le NXT.

Le MOC qui se déplace tout seul, c'est terrible.
Et le chien qui est intrigué, ça me fait toujours autant marrer ! mdr !

Chapeau bas, l'artiste. :resp:
Think outside the box.

Tout plein de liens utiles dans mon profil ! :P

Avatar de l’utilisateur
maxlemalade
Level 10
Level 10
 
Messages: 1612

Messagepar maxlemalade » Mer Avr 30, 2008 10:02 pm

Alban42800 a écrit:A vouloir trop en faire on ne fait plus rien, je reste sur ma mécanique, le soustracteur se sera pour un prochain moc. Pour l'instant j'essaye de faire un cercle et c'est pas évident, la précision des moteurs (asservissement intégré) n'est pas top, surtout à faible puissance.
Edit 1 : Enfin en me relisant j'aurai bien besoin du soustracteur quand même :)
Edit 2 : quoique le pb serait le même, si le steering motor ne tourne pas à vitesse constante le cercle ne sera pas rond.
Edit 3 : La programmation c'est en partie mon métier, ça aide.


hum, le probleme serait "le meme" pour les virages - enfin, il serait tres similaire, c'est certain.
par contre, a priori, passé le jeu de fonctionnement; en ligne droite, tu serais peinard :) bref, au pire, un petit decalage inevitable mais par contre, qui n'irait pas en s'amplifiant ;)
membre fantôme en cure de désintoxication d'internet ludique :p

Avatar de l’utilisateur
Alban42800
Level 11
Level 11
 
Messages: 2473
Localisation: Loire (42)
Âge: 51 ans
expertgbbexpertnxtvainqueurconcours

Messagepar Alban42800 » Mer Avr 30, 2008 10:34 pm

Ben oui, en ligne droite le steering motor tourne à une vitesse constante de zéro.
Si je réussi à maîtriser réellement la vitesse de mes moteurs par le soft je serai tranquille dans tous les cas... un asservissement de vitesse sur chaque moteur... argh.

Avatar de l’utilisateur
madwaxe
Level 6
Level 6
 
Messages: 444
Localisation: Vienne isere
Âge: 53 ans

Messagepar madwaxe » Ven Mai 02, 2008 9:38 pm

je pensais que les moteurs avaient un compte tour intégré ?

bien ce sujet.......... il y avais pas de robots lego encore ici, c'est plutôt bien ;)

je n'ai pas les sous pour le NXT :( mais j'ai 2 RCX 2.0

bonne continuation ;)
Legos quand tu nous tiens :P
---------------------------------
ma galerie brickset
ma galerie bricshelf

Avatar de l’utilisateur
Alban42800
Level 11
Level 11
 
Messages: 2473
Localisation: Loire (42)
Âge: 51 ans
expertgbbexpertnxtvainqueurconcours

Messagepar Alban42800 » Sam Mai 03, 2008 7:54 pm

Oui les moteurs ont un capteur de rotation intégré. Pour qu'il tourne a vitesse constante il faut que le programme (ou la fonction utilisé) régule la vitesse en fonction des info du capteur C'est cette régulation qui n'est pas parfaite dans mon cas.
Si seulement LEGO avait choisi des moteurs pas à pas...

Avatar de l’utilisateur
maxlemalade
Level 10
Level 10
 
Messages: 1612

Messagepar maxlemalade » Sam Mai 03, 2008 8:00 pm

Alban42800 a écrit:Oui les moteurs ont un capteur de rotation intégré. Pour qu'il tourne a vitesse constante il faut que le programme (ou la fonction utilisé) régule la vitesse en fonction des info du capteur C'est cette régulation qui n'est pas parfaite dans mon cas.
Si seulement LEGO avait choisi des moteurs pas à pas...


hum, le problème serait alors de compter le nombre de pas sauté je suppose :/ (quoique, pas sur que les couples demandés soient assez important pour que ca saute ... )
membre fantôme en cure de désintoxication d'internet ludique :p


Retourner vers Vos MOCs Technic

Qui est en ligne ?

Utilisateurs parcourant actuellement ce forum : Aucun utilisateur inscrit et 13 invités