Cours:SaeRobotique : Différence entre versions
(→Livrable) |
(→Diagramme d'état) |
||
(12 révisions intermédiaires par 2 utilisateurs non affichées) | |||
Ligne 1 : | Ligne 1 : | ||
[[Cours:SaeRobotique correction|{{Vert|<big><big>Corrections enseignants</big></big>}}]] | [[Cours:SaeRobotique correction|{{Vert|<big><big>Corrections enseignants</big></big>}}]] | ||
− | |||
− | + | [[Cours:SaeRobotiqueSuiviLigne]] | |
+ | [[Cours:SaeRobotiqueTennis]] | ||
− | |||
− | |||
− | |||
− | |||
− | |||
− | + | =Ressources communes= | |
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | =Ressources= | ||
==structure du programme== | ==structure du programme== | ||
Ligne 61 : | Ligne 22 : | ||
− | + | int main() | |
− | + | { | |
− | + | while(1) | |
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
{ | { | ||
− | case etapeInit: | + | // lecture des capteurs en début de boucle |
+ | switch (etapeActive) | ||
+ | { | ||
+ | case etapeInit: | ||
// si ... etapeSuivante= | // si ... etapeSuivante= | ||
break; | break; | ||
− | + | case etapeChercheBalle: | |
// si ... etapeSuivante= | // si ... etapeSuivante= | ||
break; | break; | ||
− | + | case etapeDeplacementVersBalle: | |
// si ... etapeSuivante= | // si ... etapeSuivante= | ||
break; | break; | ||
+ | } | ||
+ | |||
+ | // on modifie l'étape active pour la prochaine boucle | ||
+ | etapeActive=etapeSuivante; | ||
} | } | ||
− | |||
− | |||
− | |||
} | } | ||
</source> | </source> | ||
Ligne 94 : | Ligne 53 : | ||
===Exécuter une action une seule fois :=== | ===Exécuter une action une seule fois :=== | ||
<source lang=cpp> | <source lang=cpp> | ||
− | + | while(1) | |
{ | { | ||
static bool dejaFait=false; | static bool dejaFait=false; | ||
Ligne 110 : | Ligne 69 : | ||
| | | | ||
<source lang=cpp> | <source lang=cpp> | ||
− | void | + | 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(); | faireMonAction(); | ||
triggerTime += 500; // prochaine exécution dans 500ms | triggerTime += 500; // prochaine exécution dans 500ms | ||
− | + | } | |
+ | } | ||
} | } | ||
</source> | </source> | ||
|| | || | ||
<source lang=cpp> | <source lang=cpp> | ||
− | void | + | 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; | |
− | case etapeX: | + | uint32_t currentTime=millis(); |
+ | |||
+ | switch (etapeActive) | ||
+ | { | ||
+ | case etapeX: | ||
if ( qqch) | if ( qqch) | ||
{ | { | ||
Ligne 139 : | Ligne 125 : | ||
} | } | ||
break; | break; | ||
− | + | case etapeY: | |
if ( currentTime >= (triggerTime + duree ) ) | if ( currentTime >= (triggerTime + duree ) ) | ||
{ | { | ||
Ligne 145 : | Ligne 131 : | ||
} | } | ||
break; | break; | ||
− | + | case etapeZ: | |
... | ... | ||
break; | break; | ||
+ | } | ||
+ | etapeActive=etapeSuivante; | ||
} | } | ||
− | |||
} | } | ||
</source> | </source> | ||
Ligne 156 : | Ligne 143 : | ||
===Affichage provisoire pour deboggage=== | ===Affichage provisoire pour deboggage=== | ||
+ | |||
+ | {| | ||
+ | |- | ||
+ | | | ||
<source lang=cpp> | <source lang=cpp> | ||
#define debug // mode debug | #define debug // mode debug | ||
Ligne 161 : | Ligne 152 : | ||
#undef debug // mode sans debug | #undef debug // mode sans debug | ||
− | + | int main() | |
{ | { | ||
− | + | ... | |
+ | while(1) | ||
+ | { | ||
+ | #ifdef debug | ||
Serial.println("juste si debug"); | Serial.println("juste si debug"); | ||
− | #endif | + | #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> | </source> | ||
+ | |} | ||
+ | |||
+ | ==Diagramme d'état== | ||
− | + | Pour aller plus loin dans la programmation sous forme de [https://fr.wikipedia.org/wiki/Automate_fini {{Rouge|machine à état fini]}}, vous utiliserez comme base le programme suivant : | |
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | + | [[Media:TestFiniteStateMachine.zip]] | |
− | |||
− | |||
− | |||
− | |||
==Composants Kicad== | ==Composants Kicad== | ||
Ligne 240 : | Ligne 208 : | ||
****rotation Z 90 | ****rotation Z 90 | ||
****décalage Z 2,5mm | ****décalage Z 2,5mm | ||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− |
Version actuelle datée du 9 juin 2024 à 15:50
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
Pour aller plus loin dans la programmation sous forme de machine à état fini, vous utiliserez comme base le programme suivant :
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