Cours:SaeRobotique : Différence entre versions
(→Diagramme d'état) |
|||
| Ligne 7 : | Ligne 7 : | ||
[[Cours:SaeRobotiqueTennis]] | [[Cours:SaeRobotiqueTennis]] | ||
| + | |||
| + | |||
| + | =Ressources communes== | ||
| + | |||
| + | ==structure du programme== | ||
| + | |||
| + | Vous pourrez utiliser la structure de programme suivante : | ||
| + | |||
| + | <source lang=cpp> | ||
| + | enum state {etapeInit,etapeChercheBalle,etapeDeplacementVersBalle}; | ||
| + | |||
| + | state etapeSuivante=etapeInit; | ||
| + | state etapeActive=etapeInit; | ||
| + | |||
| + | |||
| + | int main() | ||
| + | { | ||
| + | while(1) | ||
| + | { | ||
| + | // lecture des capteurs en début de boucle | ||
| + | switch (etapeActive) | ||
| + | { | ||
| + | case etapeInit: | ||
| + | |||
| + | // si ... etapeSuivante= | ||
| + | break; | ||
| + | case etapeChercheBalle: | ||
| + | |||
| + | // si ... etapeSuivante= | ||
| + | break; | ||
| + | case etapeDeplacementVersBalle: | ||
| + | |||
| + | // si ... etapeSuivante= | ||
| + | break; | ||
| + | } | ||
| + | |||
| + | // on modifie l'étape active pour la prochaine boucle | ||
| + | etapeActive=etapeSuivante; | ||
| + | } | ||
| + | } | ||
| + | </source> | ||
| + | |||
| + | ==Programmation : comment faire== | ||
| + | |||
| + | ===Exécuter une action une seule fois :=== | ||
| + | <source lang=cpp> | ||
| + | while(1) | ||
| + | { | ||
| + | static bool dejaFait=false; | ||
| + | if (dejaFait==false) | ||
| + | { | ||
| + | executerMonAction(); | ||
| + | dejaFait=true; | ||
| + | } | ||
| + | } | ||
| + | </source> | ||
| + | |||
| + | ===Répéter une action régulièrement=== | ||
| + | {| class="wikitable" | ||
| + | |- | ||
| + | | | ||
| + | <source lang=cpp> | ||
| + | void initFonctionsTempsArduino() | ||
| + | { | ||
| + | sei(); | ||
| + | // marche pour 328p et 2560 et autres ... | ||
| + | // à adapter suivant le µc | ||
| + | // cf https://github.com/arduino/ArduinoCore-avr/blob/master/cores/arduino/wiring.c | ||
| + | TCCR0A=(1<<WGM01)|(1<<WGM00); | ||
| + | TCCR0B=(1<<CS01)|(1<<CS00); | ||
| + | TIMSK0=(1<<TOIE0); | ||
| + | } | ||
| + | |||
| + | int main() | ||
| + | { | ||
| + | initFonctionsTempsArduino(); | ||
| + | while(1) | ||
| + | { | ||
| + | static uint32_t triggerTime=millis(); | ||
| + | uint32_t currentTime=millis(); | ||
| + | if (currentTime>=triggerTime) | ||
| + | { | ||
| + | faireMonAction(); | ||
| + | triggerTime += 500; // prochaine exécution dans 500ms | ||
| + | } | ||
| + | } | ||
| + | } | ||
| + | </source> | ||
| + | || | ||
| + | <source lang=cpp> | ||
| + | void initFonctionsTempsArduino() | ||
| + | { | ||
| + | sei(); | ||
| + | // marche pour 328p et 2560 et autres ... | ||
| + | // à adapter suivant le µc | ||
| + | // cf https://github.com/arduino/ArduinoCore-avr/blob/master/cores/arduino/wiring.c | ||
| + | TCCR0A=(1<<WGM01)|(1<<WGM00); | ||
| + | TCCR0B=(1<<CS01)|(1<<CS00); | ||
| + | TIMSK0=(1<<TOIE0); | ||
| + | } | ||
| + | |||
| + | int main() | ||
| + | { | ||
| + | initFonctionsTempsArduino(); | ||
| + | while(1) | ||
| + | { | ||
| + | static uint32_t triggerTime=0; | ||
| + | uint32_t currentTime=millis(); | ||
| + | |||
| + | switch (etapeActive) | ||
| + | { | ||
| + | case etapeX: | ||
| + | if ( qqch) | ||
| + | { | ||
| + | etapeSuivante=etapeY; | ||
| + | triggerTime=currentTime; | ||
| + | } | ||
| + | break; | ||
| + | case etapeY: | ||
| + | if ( currentTime >= (triggerTime + duree ) ) | ||
| + | { | ||
| + | etapeSuivante=etapeZ; | ||
| + | } | ||
| + | break; | ||
| + | case etapeZ: | ||
| + | ... | ||
| + | break; | ||
| + | } | ||
| + | etapeActive=etapeSuivante; | ||
| + | } | ||
| + | } | ||
| + | </source> | ||
| + | |} | ||
| + | |||
| + | ===Affichage provisoire pour deboggage=== | ||
| + | |||
| + | |||
| + | {| | ||
| + | |- | ||
| + | | | ||
| + | <source lang=cpp> | ||
| + | #define debug // mode debug | ||
| + | //ou | ||
| + | #undef debug // mode sans debug | ||
| + | |||
| + | int main() | ||
| + | { | ||
| + | ... | ||
| + | while(1) | ||
| + | { | ||
| + | #ifdef debug | ||
| + | Serial.println("juste si debug"); | ||
| + | #endif | ||
| + | } | ||
| + | } | ||
| + | |||
| + | </source> | ||
| + | || | ||
| + | <source lang=cpp> | ||
| + | #define DEBUG //If you comment this line, the DEBUG_PRINT & DEBUG_PRINTLN lines are defined as blank. | ||
| + | #ifdef DEBUG //Macros are usually in all capital letters. | ||
| + | #define DEBUG_PRINT(...) Serial.print(__VA_ARGS__) //DEBUG_PRINT is a macro, debug print | ||
| + | #define DEBUG_PRINTLN(...) Serial.println(__VA_ARGS__) //DEBUG_PRINTLN is a macro, debug print with new line | ||
| + | #else | ||
| + | #define DEBUG_PRINT(...) //now defines a blank line | ||
| + | #define DEBUG_PRINTLN(...) //now defines a blank line | ||
| + | #endif | ||
| + | int main() | ||
| + | { | ||
| + | while(1) | ||
| + | { | ||
| + | DEBUG_PRINTLN("juste si debug"); | ||
| + | } | ||
| + | } | ||
| + | |||
| + | </source> | ||
| + | |} | ||
Version du 9 juin 2024 à 15:48
Sommaire
Ressources communes=
structure du programme
Vous pourrez utiliser la structure de programme suivante :
enum state {etapeInit,etapeChercheBalle,etapeDeplacementVersBalle};
state etapeSuivante=etapeInit;
state etapeActive=etapeInit;
int main()
{
while(1)
{
// lecture des capteurs en début de boucle
switch (etapeActive)
{
case etapeInit:
// si ... etapeSuivante=
break;
case etapeChercheBalle:
// si ... etapeSuivante=
break;
case etapeDeplacementVersBalle:
// si ... etapeSuivante=
break;
}
// on modifie l'étape active pour la prochaine boucle
etapeActive=etapeSuivante;
}
}
Programmation : comment faire
Exécuter une action une seule fois :
while(1)
{
static bool dejaFait=false;
if (dejaFait==false)
{
executerMonAction();
dejaFait=true;
}
}
Répéter une action régulièrement
void initFonctionsTempsArduino()
{
sei();
// marche pour 328p et 2560 et autres ...
// à adapter suivant le µc
// cf https://github.com/arduino/ArduinoCore-avr/blob/master/cores/arduino/wiring.c
TCCR0A=(1<<WGM01)|(1<<WGM00);
TCCR0B=(1<<CS01)|(1<<CS00);
TIMSK0=(1<<TOIE0);
}
int main()
{
initFonctionsTempsArduino();
while(1)
{
static uint32_t triggerTime=millis();
uint32_t currentTime=millis();
if (currentTime>=triggerTime)
{
faireMonAction();
triggerTime += 500; // prochaine exécution dans 500ms
}
}
}
|
void initFonctionsTempsArduino()
{
sei();
// marche pour 328p et 2560 et autres ...
// à adapter suivant le µc
// cf https://github.com/arduino/ArduinoCore-avr/blob/master/cores/arduino/wiring.c
TCCR0A=(1<<WGM01)|(1<<WGM00);
TCCR0B=(1<<CS01)|(1<<CS00);
TIMSK0=(1<<TOIE0);
}
int main()
{
initFonctionsTempsArduino();
while(1)
{
static uint32_t triggerTime=0;
uint32_t currentTime=millis();
switch (etapeActive)
{
case etapeX:
if ( qqch)
{
etapeSuivante=etapeY;
triggerTime=currentTime;
}
break;
case etapeY:
if ( currentTime >= (triggerTime + duree ) )
{
etapeSuivante=etapeZ;
}
break;
case etapeZ:
...
break;
}
etapeActive=etapeSuivante;
}
}
|
Affichage provisoire pour deboggage
#define debug // mode debug
//ou
#undef debug // mode sans debug
int main()
{
...
while(1)
{
#ifdef debug
Serial.println("juste si debug");
#endif
}
}
|
#define DEBUG //If you comment this line, the DEBUG_PRINT & DEBUG_PRINTLN lines are defined as blank.
#ifdef DEBUG //Macros are usually in all capital letters.
#define DEBUG_PRINT(...) Serial.print(__VA_ARGS__) //DEBUG_PRINT is a macro, debug print
#define DEBUG_PRINTLN(...) Serial.println(__VA_ARGS__) //DEBUG_PRINTLN is a macro, debug print with new line
#else
#define DEBUG_PRINT(...) //now defines a blank line
#define DEBUG_PRINTLN(...) //now defines a blank line
#endif
int main()
{
while(1)
{
DEBUG_PRINTLN("juste si debug");
}
}
|
Diagramme d'état
Media:TestFiniteStateMachine.zip
Composants Kicad
- Résistances :
- symbole R
- boitier suivant la valeur : 1206(CMS)/Axial DIN0309 (traversant)
- Condensateur
- symbole C
- boitier suivant la valeur 1206(CMS)
- Arduino Nano
- symbole Arduino_Nano_v2.x
- modèle 3d
- télécharger et décompresser : Media:Arduino_nano.STEP.zip
- dans les propriétés de la carte (éditeur de pcb), onglet modèle 3d
- ajouter le fichier téléchargé
- rotation X -90
- rotation Z 90
- décalage Z 2,5mm