Timer

Skywodd, tu n'es pas dans cette classe !
Laisse les petits répondre :smiley:

barbudor:
Skywodd, tu n'es pas dans cette classe !
Laisse les petits répondre :smiley:

Mais heu ... faut bien que je trouve une utilité à la calculette windows !
T'as pensé à tout les dév µsoft qui ont passé des semaines à débugger (sans sucées) la calculette Windows ? :grin:

merci pour vos reponses j essaye ce code :

seulement ca ne fonctionne pas

#include <NXTTouch.h>
#include <Wire.h>
#include <NXShield.h>
#include <NXTTouch.h>
#include <NXTLight.h>
#include <SumoEyes.h>
#include <ACCLNx.h>
#include <NXTUS.h>

//
// declare the NXShield(s) attached to your Arduino.
//
NXShield    nxshield;

//
// declare the i2c devices used on NXShield(s).
//

//
// declare analog devices attached to nxshields.
//
NXTTouch    touch1;

 
  

unsigned long time_start;
enum { ATTENTE, EN_COURS } etat = ATTENTE;
void loop()
{
  switch( etat )
  {

  nxshield.init( SH_SoftwareI2C );
  touch1.init( &nxshield, SH_BBS1 );

  
  case ATTENTE:
    if ( touch1() == false )
    {
      // demarrage du comptage de 90 secondes
      time_start = millis();
      etat = EN_COURS;
    }
    break;
  case EN_COURS:
    if ( (millis() - time_start) >= 90000 )
    {
      // fin des  90 secondes
      etat = ATTENTE;
      // faire ce qu'il y a a faire au bout des 90 secondes
      // ....
    }
    break;
  }
}

Qu'est-ce qui ne marche pas ?
Soit plus précis.

Où est setup() ?
Pourquoi les fonctions d'init ne soit pas dans setup() au lieu d'être dans loop() ?

Où est le reste du code ?
Par ce que le peu que tu en montre va pas faire grand chose à part compter 90 secondes....

En fait je débute dans la programmation.

J explique mon cas, j'encadre une equipe de jeune qui va participer a la coupe de france de robotique. Moi meme je participe depuis quelques années, cependant je m'occupe de la mécanique et pas de la programmation.

Nous avons monté une structure en lego, et nous souhaitons la programmer avec une carte arduino : http://www.generationrobots.com/carte-arduino-mega-adk-pour-android,fr,4,ARDUINO-MEGA-ADK.cfm

et un nxt shield : http://www.generationrobots.com/nxshield-m-pour-arduino-mega-ou-arduino-adk-mindsensors,fr,4,NXShield-M-Arduino.cfm

le programme que je souhaite créer serait de la sorte :

- Programme en attente
- Choix de la couleur avec le bouton de nxt-shield - allumage de la led selon la couleur choisis
- si couleur = bleu -> programme bleu sinon -> programme rouge
- Programme Bleu
- Programme en attente
- Si touch 1 = true else :

- démarrage chrono 90 seconde (si chrono = 90 seconde alors on arrête tout)
- sous programme détection avant on
- sous programme avancer de 100 pas
- sous programme detection off
- sous programme tourner a droite de 45°
- sous programme détection avant on
- sous programme reculer de 20 pas
etc ...

si touch1 = false else on arrête tout : arrêt d'urgence
Void(détection avant on)

allumer le capteur sonar et vérifier tout les 10 ms que la distance de détection est inférieur a 30 cm sinon mettre programme en attente jusqu’à a que détection fini
- Void (avancer de x pas)

allumer les moteur en marche avant a vitesse 2
compter x pas sur les codeurs
a x pas -20% rallentir les moteur a vitesse 1
 a x pas arreter les moteur
- Void ( programme détection off)

éteindre le capteur sonar
- Void (tourner a droite de 45°)

allumer moteur 1 en marche avant et moteur 2 en marche arrière
compter x pas sur codeur 1 et -x pas sur codeur 2
a x pas -20% ralentir les moteur a vitesse 1
a x pas sur codeur 1 et -x pas sur codeur 2
- Void( reculer de X pas)

allumer les moteur en marche arriere a vitesse 2
compter -x pas sur les codeurs
a -x pas -20% ralentir les moteur a vitesse 1
a -x pas arrêter les moteur

barbudor: et mince il ma pris de cour je serais plus le chouchou du prof euhh :frowning: lol

Et SuperBaloO euh.. comment te dire que ton programme est faisable mais qu'on te ne le fera pas? on aide mais on fait pas ici !! lool ^^ essaye de faire des premières version et viens vers nous avec des problèmes concret pas des je voudrais faire ça.. et je sais pas le faire ^^ mais je comprend tes soucis les début en C c'est jamais onctueux :p, reviens avec une vrai problématique la tu en est a la phase conception pas dépannage, nous on sera la pour corrigé ton code une fois fait ^^

ps: le copier coller bête et méchant ça na rien de bon !!

Skizo !

alors mes premieres problématique :

comment fait on un appel de fonction ?

skizoh:
ps: le copier coller bête et méchant ça na rien de bon !!

Skizo !

Merci, je suis pas programmeur, mais j ai quelques notions quand meme

lol te vexe pas :wink:

alors appel de fonction:

Fonction:

void hello_word (String hello)
{String hello;

Serial.print(hello);

return 0;
}

appel:

String envoyer ="saluuut";
hello_word(envoyer);

résultat: 

sur la liaison série: saluut

si ta fonction n'a pas besoin de paramètre:

void attendre()
{
delay(10000);//attend 10s
}  

appel:

attendre();//attend 10s

voila tout simplement =)

Skizo !

j ai fait un ptit essai avec quelque chose de cette structure la

#include <Wire.h>
#include <NXShield.h>
#include <NXTTouch.h>
#include <NXTLight.h>
#include <SumoEyes.h>
#include <ACCLNx.h>
#include <NXTUS.h>


//
// declare the NXShield(s) attached to your Arduino.
//
NXShield    nxshield;

//
// declare the i2c devices used on NXShield(s).
//

//
// declare analog devices attached to nxshields.
//
NXTTouch    touch1;


Void main()
{str= 100
serial.void(avancer)

}








Void Avancer()
{
    // Drive both motors forward and backward for a specific number of
    // rotations
    delay(1000);
    sprintf(str, "Both Motors Forward %d Rotations", rotations);
    Serial.println(str);
    str[0] = '\0';
    nxshield.bank_a.motorRunRotations(SH_Motor_Both, 
                     SH_Direction_Forward,
                     SH_Speed_Medium, 
                     rotations, 
                     SH_Completion_Wait_For,
                     SH_Next_Action_BrakeHold);
    delay(1000);
    sprintf(str, "Both Motors Reverse %d Rotations", rotations);
    Serial.println(str);
    str[0] = '\0';
    nxshield.bank_a.motorRunRotations(SH_Motor_Both, 
                     SH_Direction_Reverse,
                     SH_Speed_Medium, 
                     rotations, 
                     SH_Completion_Wait_For,
                     SH_Next_Action_BrakeHold);

    Serial.println("Bank B motors >>");
    
}

alors:

#include <Wire.h>
#include <NXShield.h>
#include <NXTTouch.h>
#include <NXTLight.h>
#include <SumoEyes.h>
#include <ACCLNx.h>
#include <NXTUS.h>


//
// declare the NXShield(s) attached to your Arduino.
//
NXShield  nxshield;


//
// declare analog devices attached to nxshields.
//
NXTTouch  touch1;


Void main()
{
str= 100
avancer(str);// comme ça l'appel de fonction avec paramètre 

}




Void Avancer(int str)
{
int str;

    // Drive both motors forward and backward for a specific number of
    // rotations
    delay(1000);
    sprintf(str, "Both Motors Forward %d Rotations", rotations);
    Serial.println(str);
    str[0] = '\0';//bon reflex =)
    nxshield.bank_a.motorRunRotations(SH_Motor_Both, 
                     SH_Direction_Forward,
                     SH_Speed_Medium, 
                     rotations, 
                     SH_Completion_Wait_For,
                     SH_Next_Action_BrakeHold);
    delay(1000);
    sprintf(str, "Both Motors Reverse %d Rotations", rotations);
    Serial.println(str);
    str[0] = '\0';
    nxshield.bank_a.motorRunRotations(SH_Motor_Both, 
                     SH_Direction_Reverse,
                     SH_Speed_Medium, 
                     rotations, 
                     SH_Completion_Wait_For,
                     SH_Next_Action_BrakeHold);

    Serial.println("Bank B motors >>");
    
}

sinon c'est pas faut mais il faut un pointeur, ou un str défini en globale pour qu'il sois aussi présent dans ta fonction..

Voila.

Skizo !

SuperBaloo

J'ai l'impression que ta réflexion est relativement bien avancée.
De mon point de vue, je prêche la religion des machines d'état.

De ce que je vois de ta description tu as de quoi créer 2 ou 3 machines d'état qui vont gérer par exemple les moteurs, les décisions globales, ...

Je te suggère de regarder ce sujet là : http://arduino.cc/forum/index.php/topic,102491.15.html
où j'ai conseillé mat0013 sur la création d'un programme pour contrôler un train.

Je lui ai fait un code que je pense être assez didactique (fichier demo_train2.ino ici).
Tu devrais pouvoir t'en inspirer pour voir la méthode de travail.

A+

barbudor:
SuperBaloo

J'ai l'impression que ta réflexion est relativement bien avancée.
De mon point de vue, je prêche la religion des machines d'état.

De ce que je vois de ta description tu as de quoi créer 2 ou 3 machines d'état qui vont gérer par exemple les moteurs, les décisions globales, ...

Je te suggère de regarder ce sujet là : http://arduino.cc/forum/index.php/topic,102491.15.html
où j'ai conseillé mat0013 sur la création d'un programme pour contrôler un train.

Je lui ai fait un code que je pense être assez didactique (fichier demo_train2.ino ici).
Tu devrais pouvoir t'en inspirer pour voir la méthode de travail.

A+

J ai pas trop compris ton histoire de machine etat, peut tu m' expliquer plus en details.

ce que j ai compris c est que chaque etat que tu me parle serait une fonction

ex
etat 1 = avancer
etat 2 = reculer
etat 3 = detecter

skizoh:

#include <Wire.h>

#include <NXShield.h>
#include <NXTTouch.h>
#include <NXTLight.h>
#include <SumoEyes.h>
#include <ACCLNx.h>
#include <NXTUS.h>

//
// declare the NXShield(s) attached to your Arduino.
//
NXShield  nxshield;

//
// declare analog devices attached to nxshields.
//
NXTTouch  touch1;

Void main()
{
str= 100
avancer(str);// comme ça l'appel de fonction avec paramètre

}

Void Avancer(int str)
{
int str;

// Drive both motors forward and backward for a specific number of
    // rotations
    delay(1000);
    sprintf(str, "Both Motors Forward %d Rotations", rotations);
    Serial.println(str);
    str[0] = '\0';//bon reflex =)
    nxshield.bank_a.motorRunRotations(SH_Motor_Both,
                     SH_Direction_Forward,
                     SH_Speed_Medium,
                     rotations,
                     SH_Completion_Wait_For,
                     SH_Next_Action_BrakeHold);
    delay(1000);
    sprintf(str, "Both Motors Reverse %d Rotations", rotations);
    Serial.println(str);
    str[0] = '\0';
    nxshield.bank_a.motorRunRotations(SH_Motor_Both,
                     SH_Direction_Reverse,
                     SH_Speed_Medium,
                     rotations,
                     SH_Completion_Wait_For,
                     SH_Next_Action_BrakeHold);

Serial.println("Bank B motors >>");
   
}

Petite question,

je dois gerer l'évitement durant mon déplacement (en gros je m’arrête si y a quelqu'un devant), est il plus simple de mettre une condition si dans mon void.avancer() ou de créer un programme annexe

ça c'est à toi de voir si dans ta fonction il avance une seconde après il vois ce qui ce passe et continue a nouveau d'avance tu peut le mettre dans ta fonction mais bon pendant ces une seconde tout peut ce passé sans qu'il le vois :s

et c'est histoire de machine d'état c'est une façon simple de procéder, comme tu dit sa donnerai sa:

switche (x):
{
  case 1: avancer
 break;

  case 2: reculer
  break;

  case 3: tourner
  break;
}

et avec ça soit a chaque fin de case tu passe au suivant soit tu choisie l'action avant:

switche (x):
{
  case 1: avancer
 x=2;
 break;

  case 2: reculer
  x=3;
  break;

  case 3: tourner
  x=1;
  break;
}
if(je veux tourner){x=3;}
if(je veux avancer){x=1;}
if(je veux reculer){x=2;}


switche (x):
{
  case 1: avancer
 break;

  case 2: reculer
  break;

  case 3: tourner
  break;
}

par exemple...

Skizo !

Que pensez vous de celui ci avec intégration du timer et arret urgence

#include <Wire.h>
#include <NXShield.h>
#include <NXTTouch.h>
#include <NXTLight.h>
#include <SumoEyes.h>
#include <ACCLNx.h>
#include <NXTUS.h>


//
// declare the NXShield(s) attached to your Arduino.
//
NXShield  nxshield;


//
// declare analog devices attached to nxshields.
//
NXTTouch  touch1;


Void main()
{
  
time=90000
timer(time);
str= 100
avancer(str);// comme ça l'appel de fonction avec paramètre 

}

Void timer(int time)
{

int time;
time1=milis();
if (time1>=(time)) // non bloquante !
{time=millis();
else Void arreturgence
}
}

Void arreturgence()
{
nxshield.bank_a.motorReset();
nxshield.bank_b.motorReset();
nxshield.bank_c.motorReset();
}

Void Avancer(int str)
{
int str;

    // Drive both motors forward and backward for a specific number of
    // rotations
    delay(1000);
    sprintf(str, "Both Motors Forward %d Rotations", rotations);
    Serial.println(str);
    str[0] = '\0';//bon reflex =)
    nxshield.bank_a.motorRunRotations(SH_Motor_Both, 
                     SH_Direction_Forward,
                     SH_Speed_Medium, 
                     rotations, 
                     SH_Completion_Wait_For,
                     SH_Next_Action_BrakeHold);
    delay(1000);
    sprintf(str, "Both Motors Reverse %d Rotations", rotations);
    Serial.println(str);
    str[0] = '\0';
    nxshield.bank_a.motorRunRotations(SH_Motor_Both, 
                     SH_Direction_Reverse,
                     SH_Speed_Medium, 
                     rotations, 
                     SH_Completion_Wait_For,
                     SH_Next_Action_BrakeHold);

    Serial.println("Bank B motors >>");
    
}

...

regarde change ça:

Void timer(int time)
{
time1=milis();//bof comme téchnique, ca va marcher au début et plus apres... il te faut une reference...
if (time1>=(time))
{time=millis();
else Void arreturgence // <================= encore une fois l'appel c'est : arreturgence(); et c'est tout :s
}
}

change comme ça !

Void timer(int time)
{

time1=milis();
 if (time1>=(time2+time))
 {
  time2=millis();
  return 1; //<=== signe que ta tempo est passée..
 }
 else { return 0; }//<=== tempo pas fini

}

l'appel de l’arrêt d'urgence ce fait pas la, il ce fait après avoir testé ton capteur ou la variable qui est image de la présence de quelque chose..

tu a encore trop de chemin à faire avant d'avoir un problème compréhensible va sur le cite du zero un peut tu avancera plus vite..

Skizo !

skizoh:
tu a encore trop de chemin à faire avant d'avoir un problème compréhensible va sur le cite du zero un peut tu avancera plus vite..

Skizo !

Je comprend pas, il s'agit bien la du forum arduino, ou les gens s'entraide dans leur galère ??? Il y a des gens qui sont complétement hors sujet vis a vis d'arduino (ex info de capteur ou autre) et on les aide, je vois pas pourquoi on pourrais pas m'aider sur un projet de robot, avec un nxt shield que beaucoup de jeunes roboticiens pourraient utiliser.

le problème n'est pas la, ton projet est intéressent et le matos approprier au forum, mais ton code n'est pas du tout compilable et tu nous donne une version avec ton idée et nous faut qu'on en face un code qui fonctionne.. c'est pas trop comme ça que ça marche.. normalement tu apprend comment fonctionne tes fonction etc, tu fait ton programme petit bou par petit bou ou gros programme peut importe et la on répond a toute tes questions et on corrige ton code, mais la c'est même pas du C même les if(){ }else.. son pas respecté etc.. il va falloir que tu apprenne un peu avant je pense..

ps: on dirait que tu veut faire marcher un robot sans savoir programmer en C...

Skizo !