-

Alban42800
- Level 11

-
- Messages: 2473
- Localisation: Loire (42)
- Âge: 51 ans
  
|
par 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 ! 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 ! .gif)
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.
|