<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="fr">
		<id>http://wikigeii.iut-troyes.univ-reims.fr//api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Bjacquot</id>
		<title>troyesGEII - Contributions de l’utilisateur [fr]</title>
		<link rel="self" type="application/atom+xml" href="http://wikigeii.iut-troyes.univ-reims.fr//api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Bjacquot"/>
		<link rel="alternate" type="text/html" href="http://wikigeii.iut-troyes.univ-reims.fr//index.php?title=Sp%C3%A9cial:Contributions/Bjacquot"/>
		<updated>2026-06-10T03:08:03Z</updated>
		<subtitle>Contributions de l’utilisateur</subtitle>
		<generator>MediaWiki 1.30.1</generator>

	<entry>
		<id>http://wikigeii.iut-troyes.univ-reims.fr//index.php?title=Cours:ArduinoSansLoopSetup&amp;diff=21101</id>
		<title>Cours:ArduinoSansLoopSetup</title>
		<link rel="alternate" type="text/html" href="http://wikigeii.iut-troyes.univ-reims.fr//index.php?title=Cours:ArduinoSansLoopSetup&amp;diff=21101"/>
				<updated>2026-06-04T13:47:31Z</updated>
		
		<summary type="html">&lt;p&gt;Bjacquot : /* Gestion du temps */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Il est tout à fait possible de se passer complètement des librairies Arduino, tout en utilisant le logiciel Arduino !&lt;br /&gt;
Ou d'utiliser une partie de la librairie Arduino pour simplifier l'usage de certains périphériques.&lt;br /&gt;
&lt;br /&gt;
=liaison série=&lt;br /&gt;
&lt;br /&gt;
On peut utiliser la classe {{Rouge|Serial}} arduino, à condition d'{{Rouge|autoriser les interruptions}} :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=c&amp;gt;&lt;br /&gt;
int main()&lt;br /&gt;
{&lt;br /&gt;
   sei();&lt;br /&gt;
   Serial.begin(9600);&lt;br /&gt;
   while(1)&lt;br /&gt;
   {&lt;br /&gt;
      Serial.println(&amp;quot;top&amp;quot;);&lt;br /&gt;
      _delay_ms(500);&lt;br /&gt;
   }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Gestion du temps=&lt;br /&gt;
&lt;br /&gt;
&amp;lt;big&amp;gt;Remplacement&amp;lt;/big&amp;gt; :&lt;br /&gt;
*utiliser {{Rouge|_delay_ms}} à la place de delay&lt;br /&gt;
*utiliser {{Rouge|_delay_us}} à la place de delayMicroseconds&lt;br /&gt;
&lt;br /&gt;
S'il est {{Rouge|indispensable}} d'utiliser les fonctions arduino [https://github.com/arduino/ArduinoCore-avr/blob/master/cores/arduino/wiring.c delay/delayMicroseconds/millis/micros], il faut configurer le Timer1 de la façon suivante :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=cpp&amp;gt;&lt;br /&gt;
void initFonctionsTempsArduino()&lt;br /&gt;
{&lt;br /&gt;
  sei();&lt;br /&gt;
  // marche pour 328p et 2560 et autres ...&lt;br /&gt;
  // à adapter suivant le µc&lt;br /&gt;
  // cf https://github.com/arduino/ArduinoCore-avr/blob/master/cores/arduino/wiring.c&lt;br /&gt;
  TCCR0A=(1&amp;lt;&amp;lt;WGM01)|(1&amp;lt;&amp;lt;WGM00);&lt;br /&gt;
  TCCR0B=(1&amp;lt;&amp;lt;CS01)|(1&amp;lt;&amp;lt;CS00);&lt;br /&gt;
  TIMSK0=(1&amp;lt;&amp;lt;TOIE0);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
int main()&lt;br /&gt;
{&lt;br /&gt;
  initFonctionsTempsArduino();&lt;br /&gt;
  Serial.begin(115200);&lt;br /&gt;
  while(1)&lt;br /&gt;
  {&lt;br /&gt;
    delay(100);&lt;br /&gt;
    Serial.println(millis());&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 ***********************************&lt;br /&gt;
   ATTENTION, dans ce cas il ne &lt;br /&gt;
   faut surtout pas avoir des&lt;br /&gt;
    _delay_ms avec de grandes valeurs&lt;br /&gt;
 ***********************************&lt;br /&gt;
&lt;br /&gt;
=i2c=&lt;br /&gt;
&lt;br /&gt;
Il est possible d'utiliser la librairie Arduino Wire, il convient juste d'autoriser les interruptions :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=cpp&amp;gt;&lt;br /&gt;
#include &amp;lt;Wire.h&amp;gt;&lt;br /&gt;
int main()&lt;br /&gt;
{&lt;br /&gt;
	sei();&lt;br /&gt;
	Wire.begin();&lt;br /&gt;
	while(1)&lt;br /&gt;
	{&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=can/adc=&lt;br /&gt;
&lt;br /&gt;
Il est possible d'utiliser la fonction analogRead à condition d'initialiser le convertisseur :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=cpp&amp;gt;&lt;br /&gt;
void initAdcArduino()&lt;br /&gt;
{&lt;br /&gt;
  sei();&lt;br /&gt;
  // marche pour 328p et 2560 et autres ... pour Fcpu = 16MHz&lt;br /&gt;
  // à adapter suivant le µc et la fréquence&lt;br /&gt;
  // cf https://github.com/arduino/ArduinoCore-avr/blob/master/cores/arduino/wiring.c&lt;br /&gt;
  ADCSRA|=(1&amp;lt;&amp;lt;ADEN)|(1&amp;lt;&amp;lt;ADPS2)|(1&amp;lt;&amp;lt;ADPS1)|(1&amp;lt;&amp;lt;ADPS0);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
int main()&lt;br /&gt;
{&lt;br /&gt;
  initAdcArduino();&lt;br /&gt;
  Serial.begin(115200);&lt;br /&gt;
  while(1)&lt;br /&gt;
  {&lt;br /&gt;
     Serial.println(analogRead(A0));&lt;br /&gt;
     _delay_ms(250);&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;/div&gt;</summary>
		<author><name>Bjacquot</name></author>	</entry>

	<entry>
		<id>http://wikigeii.iut-troyes.univ-reims.fr//index.php?title=Cours:SaeRobotique&amp;diff=21080</id>
		<title>Cours:SaeRobotique</title>
		<link rel="alternate" type="text/html" href="http://wikigeii.iut-troyes.univ-reims.fr//index.php?title=Cours:SaeRobotique&amp;diff=21080"/>
				<updated>2026-06-01T09:46:13Z</updated>
		
		<summary type="html">&lt;p&gt;Bjacquot : /* utilisation des leds couleur */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
[[Cours:SaeRobotique correction|{{Vert|&amp;lt;big&amp;gt;&amp;lt;big&amp;gt;Corrections enseignants&amp;lt;/big&amp;gt;&amp;lt;/big&amp;gt;}}]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Cours:SaeRobotiqueSuiviLigne]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Cours:SaeRobotiqueTennis]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=Ressources communes=&lt;br /&gt;
&lt;br /&gt;
==structure du programme==&lt;br /&gt;
&lt;br /&gt;
Vous pourrez utiliser la structure de programme suivante :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=cpp&amp;gt;&lt;br /&gt;
enum state {etapeInit,etapeChercheBalle,etapeDeplacementVersBalle};&lt;br /&gt;
&lt;br /&gt;
state etapeSuivante=etapeInit;&lt;br /&gt;
state etapeActive=etapeInit;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
int main()&lt;br /&gt;
{&lt;br /&gt;
  while(1)&lt;br /&gt;
  {&lt;br /&gt;
    // lecture des capteurs en début de boucle&lt;br /&gt;
    switch (etapeActive)&lt;br /&gt;
    {&lt;br /&gt;
      case etapeInit:&lt;br /&gt;
&lt;br /&gt;
            // si ... etapeSuivante=&lt;br /&gt;
            break;&lt;br /&gt;
      case etapeChercheBalle:&lt;br /&gt;
&lt;br /&gt;
            // si ... etapeSuivante=&lt;br /&gt;
            break;&lt;br /&gt;
      case etapeDeplacementVersBalle:&lt;br /&gt;
&lt;br /&gt;
            // si ... etapeSuivante=&lt;br /&gt;
            break;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    // on modifie l'étape active pour la prochaine boucle&lt;br /&gt;
    etapeActive=etapeSuivante;&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 {{Rouge|&amp;lt;big&amp;gt;*********************************&amp;lt;/big&amp;gt;}}&lt;br /&gt;
 {{Rouge|&amp;lt;big&amp;gt;ne pas déclarer de variables dans&amp;lt;/big&amp;gt;}}&lt;br /&gt;
 {{Rouge|&amp;lt;big&amp;gt;       le switch case&amp;lt;/big&amp;gt;}}&lt;br /&gt;
 {{Rouge|&amp;lt;big&amp;gt;*********************************&amp;lt;/big&amp;gt;}}&lt;br /&gt;
&lt;br /&gt;
==Programmation : comment faire==&lt;br /&gt;
&lt;br /&gt;
===Exécuter une action une seule fois :===&lt;br /&gt;
&amp;lt;source lang=cpp&amp;gt;&lt;br /&gt;
while(1)&lt;br /&gt;
{&lt;br /&gt;
   static bool dejaFait=false;&lt;br /&gt;
   if (dejaFait==false)&lt;br /&gt;
   {&lt;br /&gt;
      executerMonAction();&lt;br /&gt;
      dejaFait=true;&lt;br /&gt;
   }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Répéter une action régulièrement===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;source lang=cpp&amp;gt;&lt;br /&gt;
void initFonctionsTempsArduino()&lt;br /&gt;
{&lt;br /&gt;
  sei();&lt;br /&gt;
  // marche pour 328p et 2560 et autres ...&lt;br /&gt;
  // à adapter suivant le µc&lt;br /&gt;
  // cf https://github.com/arduino/ArduinoCore-avr/blob/master/cores/arduino/wiring.c&lt;br /&gt;
  TCCR0A=(1&amp;lt;&amp;lt;WGM01)|(1&amp;lt;&amp;lt;WGM00);&lt;br /&gt;
  TCCR0B=(1&amp;lt;&amp;lt;CS01)|(1&amp;lt;&amp;lt;CS00);&lt;br /&gt;
  TIMSK0=(1&amp;lt;&amp;lt;TOIE0);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
int main()&lt;br /&gt;
{&lt;br /&gt;
  initFonctionsTempsArduino();&lt;br /&gt;
  while(1)&lt;br /&gt;
  {&lt;br /&gt;
    static uint32_t triggerTime=millis();&lt;br /&gt;
    uint32_t currentTime=millis();&lt;br /&gt;
    if (currentTime&amp;gt;=triggerTime)&lt;br /&gt;
    {&lt;br /&gt;
       faireMonAction();&lt;br /&gt;
       triggerTime += 500; // prochaine exécution dans 500ms&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
||&lt;br /&gt;
&amp;lt;source lang=cpp&amp;gt;&lt;br /&gt;
void initFonctionsTempsArduino()&lt;br /&gt;
{&lt;br /&gt;
  sei();&lt;br /&gt;
  // marche pour 328p et 2560 et autres ...&lt;br /&gt;
  // à adapter suivant le µc&lt;br /&gt;
  // cf https://github.com/arduino/ArduinoCore-avr/blob/master/cores/arduino/wiring.c&lt;br /&gt;
  TCCR0A=(1&amp;lt;&amp;lt;WGM01)|(1&amp;lt;&amp;lt;WGM00);&lt;br /&gt;
  TCCR0B=(1&amp;lt;&amp;lt;CS01)|(1&amp;lt;&amp;lt;CS00);&lt;br /&gt;
  TIMSK0=(1&amp;lt;&amp;lt;TOIE0);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
int main()&lt;br /&gt;
{&lt;br /&gt;
  initFonctionsTempsArduino();&lt;br /&gt;
  while(1)&lt;br /&gt;
  {&lt;br /&gt;
    static uint32_t triggerTime=0;&lt;br /&gt;
    uint32_t currentTime=millis();&lt;br /&gt;
&lt;br /&gt;
    switch (etapeActive)&lt;br /&gt;
    {&lt;br /&gt;
      case etapeX:&lt;br /&gt;
            if ( qqch)&lt;br /&gt;
            {&lt;br /&gt;
               etapeSuivante=etapeY;&lt;br /&gt;
               triggerTime=currentTime;&lt;br /&gt;
            }&lt;br /&gt;
            break;&lt;br /&gt;
      case etapeY:&lt;br /&gt;
            if ( currentTime &amp;gt;= (triggerTime + duree ) )&lt;br /&gt;
            {&lt;br /&gt;
               etapeSuivante=etapeZ;&lt;br /&gt;
            }&lt;br /&gt;
            break;&lt;br /&gt;
      case etapeZ:&lt;br /&gt;
            ...&lt;br /&gt;
            break;&lt;br /&gt;
    }&lt;br /&gt;
    etapeActive=etapeSuivante;&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===Affichage provisoire pour deboggage===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{|&lt;br /&gt;
|-&lt;br /&gt;
| &lt;br /&gt;
&amp;lt;source lang=cpp&amp;gt;&lt;br /&gt;
#define debug   // mode debug&lt;br /&gt;
//ou&lt;br /&gt;
#undef debug // mode sans debug&lt;br /&gt;
&lt;br /&gt;
int main()&lt;br /&gt;
{&lt;br /&gt;
  ...&lt;br /&gt;
  while(1)&lt;br /&gt;
  {&lt;br /&gt;
    #ifdef debug&lt;br /&gt;
       Serial.println(&amp;quot;juste si debug&amp;quot;);&lt;br /&gt;
    #endif&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|| &lt;br /&gt;
&amp;lt;source lang=cpp&amp;gt;&lt;br /&gt;
#define DEBUG   //If you comment this line, the DEBUG_PRINT &amp;amp; DEBUG_PRINTLN lines are defined as blank.&lt;br /&gt;
#ifdef DEBUG    //Macros are usually in all capital letters.&lt;br /&gt;
   #define DEBUG_PRINT(...)    Serial.print(__VA_ARGS__)     //DEBUG_PRINT is a macro, debug print&lt;br /&gt;
   #define DEBUG_PRINTLN(...)  Serial.println(__VA_ARGS__)   //DEBUG_PRINTLN is a macro, debug print with new line&lt;br /&gt;
#else&lt;br /&gt;
   #define DEBUG_PRINT(...)     //now defines a blank line&lt;br /&gt;
   #define DEBUG_PRINTLN(...)   //now defines a blank line&lt;br /&gt;
#endif&lt;br /&gt;
int main()&lt;br /&gt;
{&lt;br /&gt;
  while(1)&lt;br /&gt;
  {&lt;br /&gt;
    DEBUG_PRINTLN(&amp;quot;juste si debug&amp;quot;);&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===changement d'état d'un capteur===&lt;br /&gt;
&lt;br /&gt;
{|&lt;br /&gt;
|-&lt;br /&gt;
! au front montant d'un capteur !! 1x si le capteur est actif suffisamment longtemps&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;source lang=cpp&amp;gt;&lt;br /&gt;
bool valeurActuelle=valeurInit;&lt;br /&gt;
bool valeurPrecedente=valeurInit;&lt;br /&gt;
&lt;br /&gt;
...&lt;br /&gt;
int main()&lt;br /&gt;
{&lt;br /&gt;
   ...&lt;br /&gt;
   while(1)&lt;br /&gt;
   {&lt;br /&gt;
      valeurPrecedente=valeurActuelle;&lt;br /&gt;
      valeurActuelle=lireValeurCapteur();&lt;br /&gt;
      if ( (valeurPrecedente==false) and (valeurActuelle==true) )&lt;br /&gt;
      {&lt;br /&gt;
         // action, par ex:&lt;br /&gt;
         nombreFrontMontant++;&lt;br /&gt;
      }&lt;br /&gt;
   }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|| &amp;lt;source lang=cpp&amp;gt;&lt;br /&gt;
bool valeurActuelle=valeurInit;&lt;br /&gt;
int8_t dureeActif=0;&lt;br /&gt;
bool isFront=true;&lt;br /&gt;
&lt;br /&gt;
...&lt;br /&gt;
int main()&lt;br /&gt;
{&lt;br /&gt;
   ...&lt;br /&gt;
   while(1)&lt;br /&gt;
   {&lt;br /&gt;
      valeurActuelle=lireValeurCapteur();&lt;br /&gt;
      if (valeurActuelle==true)&lt;br /&gt;
      {&lt;br /&gt;
         if (dureeActif&amp;gt;=20)&lt;br /&gt;
         {&lt;br /&gt;
            // faire l'action, par ex&lt;br /&gt;
            if (isFront==true)&lt;br /&gt;
            {&lt;br /&gt;
                isFront=false;&lt;br /&gt;
                nombreFrontMontant++;&lt;br /&gt;
            }&lt;br /&gt;
         }&lt;br /&gt;
         else dureeActif++;&lt;br /&gt;
      }&lt;br /&gt;
      else&lt;br /&gt;
      {&lt;br /&gt;
         dureeActif=0;&lt;br /&gt;
         isFront=true;&lt;br /&gt;
      }&lt;br /&gt;
   }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===filtrer un capteur tor===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! filtrer un capteur TOR !! sous forme de fonction pour filtrage de plusieurs capteurs&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;source lang=cpp&amp;gt;&lt;br /&gt;
&lt;br /&gt;
bool rawValue=readCapteur();&lt;br /&gt;
static bool value=false;&lt;br /&gt;
&lt;br /&gt;
const uint8_t filterValue=12;&lt;br /&gt;
static uint8_t nbTrue=0;&lt;br /&gt;
static uint8_t nbFalse=0;&lt;br /&gt;
&lt;br /&gt;
if ( rawValue  )&lt;br /&gt;
{&lt;br /&gt;
   if ( nbTrue&amp;gt;= filterValue)&lt;br /&gt;
   {&lt;br /&gt;
     value=true;&lt;br /&gt;
     nbFalse=0;&lt;br /&gt;
   }&lt;br /&gt;
   else nbTrue++;&lt;br /&gt;
}&lt;br /&gt;
else&lt;br /&gt;
{&lt;br /&gt;
   if ( nbFalse&amp;gt;= filterValue)&lt;br /&gt;
   {&lt;br /&gt;
     value=false;&lt;br /&gt;
     nbTrue=0;&lt;br /&gt;
   }&lt;br /&gt;
   else nbFalse++;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|| &amp;lt;source lang=cpp&amp;gt;&lt;br /&gt;
void filtreTor(bool rawValue,bool &amp;amp; value,uint8_t filterValue,uint8_t &amp;amp; nbTrue,uint8_t &amp;amp; nbFalse)&lt;br /&gt;
{&lt;br /&gt;
  if ( rawValue  )&lt;br /&gt;
  {&lt;br /&gt;
    if ( nbTrue&amp;gt;= filterValue)&lt;br /&gt;
    {&lt;br /&gt;
      value=true;&lt;br /&gt;
      nbFalse=0;&lt;br /&gt;
    }&lt;br /&gt;
    else nbTrue++;&lt;br /&gt;
  }&lt;br /&gt;
  else&lt;br /&gt;
  {&lt;br /&gt;
    if ( nbFalse&amp;gt;= filterValue)&lt;br /&gt;
    {&lt;br /&gt;
      value=false;&lt;br /&gt;
      nbTrue=0;&lt;br /&gt;
    }&lt;br /&gt;
    else nbFalse++;&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
int main()&lt;br /&gt;
{&lt;br /&gt;
  ...&lt;br /&gt;
  bool rawValue=rawValueTab[i];&lt;br /&gt;
  static bool value=false;&lt;br /&gt;
&lt;br /&gt;
  const uint8_t filterValue=5;&lt;br /&gt;
  static uint8_t nbTrue=0;&lt;br /&gt;
  static uint8_t nbFalse=0;&lt;br /&gt;
  filtreTor(rawValue,value,filterValue,nbTrue,nbFalse);&lt;br /&gt;
  ...&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===Optimiser l'exécution d'une fonction===&lt;br /&gt;
&amp;lt;source lang=cpp&amp;gt;&lt;br /&gt;
inline void setVitesse(int16_t vmG, int16_t vmD) __attribute__((always_inline));&lt;br /&gt;
&lt;br /&gt;
void setVitesse(int16_t vmG, int16_t vmD)&lt;br /&gt;
{&lt;br /&gt;
   // code de la fonction&lt;br /&gt;
   ...&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==utilisation des leds couleur==&lt;br /&gt;
&lt;br /&gt;
Voici comment utiliser une barrette de leds couleur pour afficher la valeur d'un nombre en binaire ( à adapter en fonction du nombre de bits) :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=cpp&amp;gt;&lt;br /&gt;
  rgb_color colorTrue{0,5,0};&lt;br /&gt;
  rgb_color colorFalse{5,0,0};&lt;br /&gt;
  for(uint16_t i = 0; i &amp;lt; 4; i++)&lt;br /&gt;
  {&lt;br /&gt;
    if (bit_is_set(n,i))  colors[i] = colorTrue;&lt;br /&gt;
    else                  colors[i] = colorFalse;&lt;br /&gt;
  }&lt;br /&gt;
  ledStrip.write(colors, LED_COUNT);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Une version plus complète permettant de choisir le nombre de bits, ainsi que la position sur le ruban de leds.&lt;br /&gt;
&amp;lt;source lang=cpp&amp;gt;&lt;br /&gt;
  const uint8_t nBits=3;&lt;br /&gt;
  const uint8_t firstLed=2;&lt;br /&gt;
  rgb_color colorTrue{0,5,0};&lt;br /&gt;
  rgb_color colorFalse{5,0,0};&lt;br /&gt;
  for(uint16_t i = firstLed; i &amp;lt; firstLed+nBits; i++)&lt;br /&gt;
  {&lt;br /&gt;
    if (bit_is_set(n,i))  colors[i] = colorTrue;&lt;br /&gt;
    else                  colors[i] = colorFalse;&lt;br /&gt;
  }&lt;br /&gt;
  ledStrip.write(colors, LED_COUNT);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Diagramme d'état==&lt;br /&gt;
&lt;br /&gt;
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 :&lt;br /&gt;
&lt;br /&gt;
[[Media:TestFiniteStateMachine.zip]]&lt;br /&gt;
&lt;br /&gt;
==Composants Kicad==&lt;br /&gt;
&lt;br /&gt;
*Résistances :&lt;br /&gt;
**symbole R&lt;br /&gt;
**boitier suivant la valeur : 1206(CMS)/Axial DIN0309 (traversant)&lt;br /&gt;
*Condensateur&lt;br /&gt;
**symbole C&lt;br /&gt;
**boitier suivant la valeur 1206(CMS)&lt;br /&gt;
*VNH7070&lt;br /&gt;
**télécharger et décompresser le fichier [[Media:VNH7070BASTR.zip]]&lt;br /&gt;
**ajouter la librairie en suivante la page : https://www.snapeda.com/about/import/#KiCad6&lt;br /&gt;
**{{Rouge|attention}} : pour l'ajout de la librairie de l'empreinte, indique comme &amp;quot;pseudo nom&amp;quot; {{Rouge|VNH7070BASTR}}&lt;br /&gt;
**modèle 3d&lt;br /&gt;
***ajouter le fichier VNH7070BASTR.step&lt;br /&gt;
***faire une rotation sur X de 90°&lt;br /&gt;
*Arduino Nano&lt;br /&gt;
**symbole Arduino_Nano_v2.x&lt;br /&gt;
**modèle 3d&lt;br /&gt;
***télécharger et décompresser : [[Media:Arduino_nano.STEP.zip]]&lt;br /&gt;
***dans les propriétés de la carte (éditeur de pcb), onglet modèle 3d&lt;br /&gt;
****ajouter le fichier téléchargé&lt;br /&gt;
****rotation X 90&lt;br /&gt;
****rotation Z -90&lt;br /&gt;
****décalage Z 11mm&lt;br /&gt;
***ajouter 2 barrettes M/F&lt;br /&gt;
***${KICAD9_3DMODEL_DIR}/Connector_PinSocket_2.54mm.3dshapes/PinSocket_1x15_P2.54mm_Vertical.step&lt;br /&gt;
***décaler le 2ème en X de 15,24mm&lt;br /&gt;
*bornier à vis : Screw_Terminal_01x02&lt;br /&gt;
*MPU-9250&lt;br /&gt;
**mettre 2 barrettes sécables 4 contacts, espacées de 6 pas&lt;br /&gt;
**[[Media:SparkFun MPU-9250 Breakout.step.zip]]&lt;br /&gt;
*convertisseur de niveau&lt;br /&gt;
**convertisseur {{Rouge|gt1167}}&lt;br /&gt;
***utiliser la librairie : [[Media:GT117.zip]]&lt;br /&gt;
***documentation : [[Media:Gt1167.pdf]]&lt;br /&gt;
**convertisseur [https://www.sparkfun.com/sparkfun-logic-level-converter-bi-directional.html sparkfun {{Rouge|BOB-12009}}]&lt;br /&gt;
***utiliser la librairie : [[Media:BOB-12009.zip]]&lt;br /&gt;
***modèle 3d :&lt;br /&gt;
****BOB-12009.step &lt;br /&gt;
*****rotation 90/0/0&lt;br /&gt;
*****translation 0/0/9&lt;br /&gt;
****ajouter 2 barrettes M/F : ${KICAD9_3DMODEL_DIR}/Connector_PinSocket_2.54mm.3dshapes/PinSocket_1x06_P2.54mm_Vertical.step&lt;br /&gt;
*****rotation 0/0/0&lt;br /&gt;
*****translation 5.08/6.35/0 et -5.08/6.35/0&lt;br /&gt;
*Autres : [[Media:SaeS2_2025.zip]]&lt;br /&gt;
*GroveH : [[Media:groveH.zip]]&lt;br /&gt;
*Connecteur à vis : [[Media:1729131.zip]]&lt;/div&gt;</summary>
		<author><name>Bjacquot</name></author>	</entry>

	<entry>
		<id>http://wikigeii.iut-troyes.univ-reims.fr//index.php?title=Cours:SaeRobotique&amp;diff=21079</id>
		<title>Cours:SaeRobotique</title>
		<link rel="alternate" type="text/html" href="http://wikigeii.iut-troyes.univ-reims.fr//index.php?title=Cours:SaeRobotique&amp;diff=21079"/>
				<updated>2026-06-01T09:36:31Z</updated>
		
		<summary type="html">&lt;p&gt;Bjacquot : /* Diagramme d'état */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
[[Cours:SaeRobotique correction|{{Vert|&amp;lt;big&amp;gt;&amp;lt;big&amp;gt;Corrections enseignants&amp;lt;/big&amp;gt;&amp;lt;/big&amp;gt;}}]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Cours:SaeRobotiqueSuiviLigne]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Cours:SaeRobotiqueTennis]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=Ressources communes=&lt;br /&gt;
&lt;br /&gt;
==structure du programme==&lt;br /&gt;
&lt;br /&gt;
Vous pourrez utiliser la structure de programme suivante :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=cpp&amp;gt;&lt;br /&gt;
enum state {etapeInit,etapeChercheBalle,etapeDeplacementVersBalle};&lt;br /&gt;
&lt;br /&gt;
state etapeSuivante=etapeInit;&lt;br /&gt;
state etapeActive=etapeInit;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
int main()&lt;br /&gt;
{&lt;br /&gt;
  while(1)&lt;br /&gt;
  {&lt;br /&gt;
    // lecture des capteurs en début de boucle&lt;br /&gt;
    switch (etapeActive)&lt;br /&gt;
    {&lt;br /&gt;
      case etapeInit:&lt;br /&gt;
&lt;br /&gt;
            // si ... etapeSuivante=&lt;br /&gt;
            break;&lt;br /&gt;
      case etapeChercheBalle:&lt;br /&gt;
&lt;br /&gt;
            // si ... etapeSuivante=&lt;br /&gt;
            break;&lt;br /&gt;
      case etapeDeplacementVersBalle:&lt;br /&gt;
&lt;br /&gt;
            // si ... etapeSuivante=&lt;br /&gt;
            break;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    // on modifie l'étape active pour la prochaine boucle&lt;br /&gt;
    etapeActive=etapeSuivante;&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 {{Rouge|&amp;lt;big&amp;gt;*********************************&amp;lt;/big&amp;gt;}}&lt;br /&gt;
 {{Rouge|&amp;lt;big&amp;gt;ne pas déclarer de variables dans&amp;lt;/big&amp;gt;}}&lt;br /&gt;
 {{Rouge|&amp;lt;big&amp;gt;       le switch case&amp;lt;/big&amp;gt;}}&lt;br /&gt;
 {{Rouge|&amp;lt;big&amp;gt;*********************************&amp;lt;/big&amp;gt;}}&lt;br /&gt;
&lt;br /&gt;
==Programmation : comment faire==&lt;br /&gt;
&lt;br /&gt;
===Exécuter une action une seule fois :===&lt;br /&gt;
&amp;lt;source lang=cpp&amp;gt;&lt;br /&gt;
while(1)&lt;br /&gt;
{&lt;br /&gt;
   static bool dejaFait=false;&lt;br /&gt;
   if (dejaFait==false)&lt;br /&gt;
   {&lt;br /&gt;
      executerMonAction();&lt;br /&gt;
      dejaFait=true;&lt;br /&gt;
   }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Répéter une action régulièrement===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;source lang=cpp&amp;gt;&lt;br /&gt;
void initFonctionsTempsArduino()&lt;br /&gt;
{&lt;br /&gt;
  sei();&lt;br /&gt;
  // marche pour 328p et 2560 et autres ...&lt;br /&gt;
  // à adapter suivant le µc&lt;br /&gt;
  // cf https://github.com/arduino/ArduinoCore-avr/blob/master/cores/arduino/wiring.c&lt;br /&gt;
  TCCR0A=(1&amp;lt;&amp;lt;WGM01)|(1&amp;lt;&amp;lt;WGM00);&lt;br /&gt;
  TCCR0B=(1&amp;lt;&amp;lt;CS01)|(1&amp;lt;&amp;lt;CS00);&lt;br /&gt;
  TIMSK0=(1&amp;lt;&amp;lt;TOIE0);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
int main()&lt;br /&gt;
{&lt;br /&gt;
  initFonctionsTempsArduino();&lt;br /&gt;
  while(1)&lt;br /&gt;
  {&lt;br /&gt;
    static uint32_t triggerTime=millis();&lt;br /&gt;
    uint32_t currentTime=millis();&lt;br /&gt;
    if (currentTime&amp;gt;=triggerTime)&lt;br /&gt;
    {&lt;br /&gt;
       faireMonAction();&lt;br /&gt;
       triggerTime += 500; // prochaine exécution dans 500ms&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
||&lt;br /&gt;
&amp;lt;source lang=cpp&amp;gt;&lt;br /&gt;
void initFonctionsTempsArduino()&lt;br /&gt;
{&lt;br /&gt;
  sei();&lt;br /&gt;
  // marche pour 328p et 2560 et autres ...&lt;br /&gt;
  // à adapter suivant le µc&lt;br /&gt;
  // cf https://github.com/arduino/ArduinoCore-avr/blob/master/cores/arduino/wiring.c&lt;br /&gt;
  TCCR0A=(1&amp;lt;&amp;lt;WGM01)|(1&amp;lt;&amp;lt;WGM00);&lt;br /&gt;
  TCCR0B=(1&amp;lt;&amp;lt;CS01)|(1&amp;lt;&amp;lt;CS00);&lt;br /&gt;
  TIMSK0=(1&amp;lt;&amp;lt;TOIE0);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
int main()&lt;br /&gt;
{&lt;br /&gt;
  initFonctionsTempsArduino();&lt;br /&gt;
  while(1)&lt;br /&gt;
  {&lt;br /&gt;
    static uint32_t triggerTime=0;&lt;br /&gt;
    uint32_t currentTime=millis();&lt;br /&gt;
&lt;br /&gt;
    switch (etapeActive)&lt;br /&gt;
    {&lt;br /&gt;
      case etapeX:&lt;br /&gt;
            if ( qqch)&lt;br /&gt;
            {&lt;br /&gt;
               etapeSuivante=etapeY;&lt;br /&gt;
               triggerTime=currentTime;&lt;br /&gt;
            }&lt;br /&gt;
            break;&lt;br /&gt;
      case etapeY:&lt;br /&gt;
            if ( currentTime &amp;gt;= (triggerTime + duree ) )&lt;br /&gt;
            {&lt;br /&gt;
               etapeSuivante=etapeZ;&lt;br /&gt;
            }&lt;br /&gt;
            break;&lt;br /&gt;
      case etapeZ:&lt;br /&gt;
            ...&lt;br /&gt;
            break;&lt;br /&gt;
    }&lt;br /&gt;
    etapeActive=etapeSuivante;&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===Affichage provisoire pour deboggage===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{|&lt;br /&gt;
|-&lt;br /&gt;
| &lt;br /&gt;
&amp;lt;source lang=cpp&amp;gt;&lt;br /&gt;
#define debug   // mode debug&lt;br /&gt;
//ou&lt;br /&gt;
#undef debug // mode sans debug&lt;br /&gt;
&lt;br /&gt;
int main()&lt;br /&gt;
{&lt;br /&gt;
  ...&lt;br /&gt;
  while(1)&lt;br /&gt;
  {&lt;br /&gt;
    #ifdef debug&lt;br /&gt;
       Serial.println(&amp;quot;juste si debug&amp;quot;);&lt;br /&gt;
    #endif&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|| &lt;br /&gt;
&amp;lt;source lang=cpp&amp;gt;&lt;br /&gt;
#define DEBUG   //If you comment this line, the DEBUG_PRINT &amp;amp; DEBUG_PRINTLN lines are defined as blank.&lt;br /&gt;
#ifdef DEBUG    //Macros are usually in all capital letters.&lt;br /&gt;
   #define DEBUG_PRINT(...)    Serial.print(__VA_ARGS__)     //DEBUG_PRINT is a macro, debug print&lt;br /&gt;
   #define DEBUG_PRINTLN(...)  Serial.println(__VA_ARGS__)   //DEBUG_PRINTLN is a macro, debug print with new line&lt;br /&gt;
#else&lt;br /&gt;
   #define DEBUG_PRINT(...)     //now defines a blank line&lt;br /&gt;
   #define DEBUG_PRINTLN(...)   //now defines a blank line&lt;br /&gt;
#endif&lt;br /&gt;
int main()&lt;br /&gt;
{&lt;br /&gt;
  while(1)&lt;br /&gt;
  {&lt;br /&gt;
    DEBUG_PRINTLN(&amp;quot;juste si debug&amp;quot;);&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===changement d'état d'un capteur===&lt;br /&gt;
&lt;br /&gt;
{|&lt;br /&gt;
|-&lt;br /&gt;
! au front montant d'un capteur !! 1x si le capteur est actif suffisamment longtemps&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;source lang=cpp&amp;gt;&lt;br /&gt;
bool valeurActuelle=valeurInit;&lt;br /&gt;
bool valeurPrecedente=valeurInit;&lt;br /&gt;
&lt;br /&gt;
...&lt;br /&gt;
int main()&lt;br /&gt;
{&lt;br /&gt;
   ...&lt;br /&gt;
   while(1)&lt;br /&gt;
   {&lt;br /&gt;
      valeurPrecedente=valeurActuelle;&lt;br /&gt;
      valeurActuelle=lireValeurCapteur();&lt;br /&gt;
      if ( (valeurPrecedente==false) and (valeurActuelle==true) )&lt;br /&gt;
      {&lt;br /&gt;
         // action, par ex:&lt;br /&gt;
         nombreFrontMontant++;&lt;br /&gt;
      }&lt;br /&gt;
   }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|| &amp;lt;source lang=cpp&amp;gt;&lt;br /&gt;
bool valeurActuelle=valeurInit;&lt;br /&gt;
int8_t dureeActif=0;&lt;br /&gt;
bool isFront=true;&lt;br /&gt;
&lt;br /&gt;
...&lt;br /&gt;
int main()&lt;br /&gt;
{&lt;br /&gt;
   ...&lt;br /&gt;
   while(1)&lt;br /&gt;
   {&lt;br /&gt;
      valeurActuelle=lireValeurCapteur();&lt;br /&gt;
      if (valeurActuelle==true)&lt;br /&gt;
      {&lt;br /&gt;
         if (dureeActif&amp;gt;=20)&lt;br /&gt;
         {&lt;br /&gt;
            // faire l'action, par ex&lt;br /&gt;
            if (isFront==true)&lt;br /&gt;
            {&lt;br /&gt;
                isFront=false;&lt;br /&gt;
                nombreFrontMontant++;&lt;br /&gt;
            }&lt;br /&gt;
         }&lt;br /&gt;
         else dureeActif++;&lt;br /&gt;
      }&lt;br /&gt;
      else&lt;br /&gt;
      {&lt;br /&gt;
         dureeActif=0;&lt;br /&gt;
         isFront=true;&lt;br /&gt;
      }&lt;br /&gt;
   }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===filtrer un capteur tor===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! filtrer un capteur TOR !! sous forme de fonction pour filtrage de plusieurs capteurs&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;source lang=cpp&amp;gt;&lt;br /&gt;
&lt;br /&gt;
bool rawValue=readCapteur();&lt;br /&gt;
static bool value=false;&lt;br /&gt;
&lt;br /&gt;
const uint8_t filterValue=12;&lt;br /&gt;
static uint8_t nbTrue=0;&lt;br /&gt;
static uint8_t nbFalse=0;&lt;br /&gt;
&lt;br /&gt;
if ( rawValue  )&lt;br /&gt;
{&lt;br /&gt;
   if ( nbTrue&amp;gt;= filterValue)&lt;br /&gt;
   {&lt;br /&gt;
     value=true;&lt;br /&gt;
     nbFalse=0;&lt;br /&gt;
   }&lt;br /&gt;
   else nbTrue++;&lt;br /&gt;
}&lt;br /&gt;
else&lt;br /&gt;
{&lt;br /&gt;
   if ( nbFalse&amp;gt;= filterValue)&lt;br /&gt;
   {&lt;br /&gt;
     value=false;&lt;br /&gt;
     nbTrue=0;&lt;br /&gt;
   }&lt;br /&gt;
   else nbFalse++;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|| &amp;lt;source lang=cpp&amp;gt;&lt;br /&gt;
void filtreTor(bool rawValue,bool &amp;amp; value,uint8_t filterValue,uint8_t &amp;amp; nbTrue,uint8_t &amp;amp; nbFalse)&lt;br /&gt;
{&lt;br /&gt;
  if ( rawValue  )&lt;br /&gt;
  {&lt;br /&gt;
    if ( nbTrue&amp;gt;= filterValue)&lt;br /&gt;
    {&lt;br /&gt;
      value=true;&lt;br /&gt;
      nbFalse=0;&lt;br /&gt;
    }&lt;br /&gt;
    else nbTrue++;&lt;br /&gt;
  }&lt;br /&gt;
  else&lt;br /&gt;
  {&lt;br /&gt;
    if ( nbFalse&amp;gt;= filterValue)&lt;br /&gt;
    {&lt;br /&gt;
      value=false;&lt;br /&gt;
      nbTrue=0;&lt;br /&gt;
    }&lt;br /&gt;
    else nbFalse++;&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
int main()&lt;br /&gt;
{&lt;br /&gt;
  ...&lt;br /&gt;
  bool rawValue=rawValueTab[i];&lt;br /&gt;
  static bool value=false;&lt;br /&gt;
&lt;br /&gt;
  const uint8_t filterValue=5;&lt;br /&gt;
  static uint8_t nbTrue=0;&lt;br /&gt;
  static uint8_t nbFalse=0;&lt;br /&gt;
  filtreTor(rawValue,value,filterValue,nbTrue,nbFalse);&lt;br /&gt;
  ...&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===Optimiser l'exécution d'une fonction===&lt;br /&gt;
&amp;lt;source lang=cpp&amp;gt;&lt;br /&gt;
inline void setVitesse(int16_t vmG, int16_t vmD) __attribute__((always_inline));&lt;br /&gt;
&lt;br /&gt;
void setVitesse(int16_t vmG, int16_t vmD)&lt;br /&gt;
{&lt;br /&gt;
   // code de la fonction&lt;br /&gt;
   ...&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==utilisation des leds couleur==&lt;br /&gt;
&lt;br /&gt;
Voici comment utiliser une barrette de leds couleur pour afficher la valeur d'un nombre en binaire ( à adapter en fonction du nombre de bits) :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=cpp&amp;gt;&lt;br /&gt;
  rgb_color colorTrue{0,5,0};&lt;br /&gt;
  rgb_color colorFalse{5,0,0};&lt;br /&gt;
  for(uint16_t i = 0; i &amp;lt; 4; i++)&lt;br /&gt;
  {&lt;br /&gt;
    if (bit_is_set(n,i))  colors[i] = colorTrue;&lt;br /&gt;
    else                  colors[i] = colorFalse;&lt;br /&gt;
  }&lt;br /&gt;
  ledStrip.write(colors, LED_COUNT);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Diagramme d'état==&lt;br /&gt;
&lt;br /&gt;
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 :&lt;br /&gt;
&lt;br /&gt;
[[Media:TestFiniteStateMachine.zip]]&lt;br /&gt;
&lt;br /&gt;
==Composants Kicad==&lt;br /&gt;
&lt;br /&gt;
*Résistances :&lt;br /&gt;
**symbole R&lt;br /&gt;
**boitier suivant la valeur : 1206(CMS)/Axial DIN0309 (traversant)&lt;br /&gt;
*Condensateur&lt;br /&gt;
**symbole C&lt;br /&gt;
**boitier suivant la valeur 1206(CMS)&lt;br /&gt;
*VNH7070&lt;br /&gt;
**télécharger et décompresser le fichier [[Media:VNH7070BASTR.zip]]&lt;br /&gt;
**ajouter la librairie en suivante la page : https://www.snapeda.com/about/import/#KiCad6&lt;br /&gt;
**{{Rouge|attention}} : pour l'ajout de la librairie de l'empreinte, indique comme &amp;quot;pseudo nom&amp;quot; {{Rouge|VNH7070BASTR}}&lt;br /&gt;
**modèle 3d&lt;br /&gt;
***ajouter le fichier VNH7070BASTR.step&lt;br /&gt;
***faire une rotation sur X de 90°&lt;br /&gt;
*Arduino Nano&lt;br /&gt;
**symbole Arduino_Nano_v2.x&lt;br /&gt;
**modèle 3d&lt;br /&gt;
***télécharger et décompresser : [[Media:Arduino_nano.STEP.zip]]&lt;br /&gt;
***dans les propriétés de la carte (éditeur de pcb), onglet modèle 3d&lt;br /&gt;
****ajouter le fichier téléchargé&lt;br /&gt;
****rotation X 90&lt;br /&gt;
****rotation Z -90&lt;br /&gt;
****décalage Z 11mm&lt;br /&gt;
***ajouter 2 barrettes M/F&lt;br /&gt;
***${KICAD9_3DMODEL_DIR}/Connector_PinSocket_2.54mm.3dshapes/PinSocket_1x15_P2.54mm_Vertical.step&lt;br /&gt;
***décaler le 2ème en X de 15,24mm&lt;br /&gt;
*bornier à vis : Screw_Terminal_01x02&lt;br /&gt;
*MPU-9250&lt;br /&gt;
**mettre 2 barrettes sécables 4 contacts, espacées de 6 pas&lt;br /&gt;
**[[Media:SparkFun MPU-9250 Breakout.step.zip]]&lt;br /&gt;
*convertisseur de niveau&lt;br /&gt;
**convertisseur {{Rouge|gt1167}}&lt;br /&gt;
***utiliser la librairie : [[Media:GT117.zip]]&lt;br /&gt;
***documentation : [[Media:Gt1167.pdf]]&lt;br /&gt;
**convertisseur [https://www.sparkfun.com/sparkfun-logic-level-converter-bi-directional.html sparkfun {{Rouge|BOB-12009}}]&lt;br /&gt;
***utiliser la librairie : [[Media:BOB-12009.zip]]&lt;br /&gt;
***modèle 3d :&lt;br /&gt;
****BOB-12009.step &lt;br /&gt;
*****rotation 90/0/0&lt;br /&gt;
*****translation 0/0/9&lt;br /&gt;
****ajouter 2 barrettes M/F : ${KICAD9_3DMODEL_DIR}/Connector_PinSocket_2.54mm.3dshapes/PinSocket_1x06_P2.54mm_Vertical.step&lt;br /&gt;
*****rotation 0/0/0&lt;br /&gt;
*****translation 5.08/6.35/0 et -5.08/6.35/0&lt;br /&gt;
*Autres : [[Media:SaeS2_2025.zip]]&lt;br /&gt;
*GroveH : [[Media:groveH.zip]]&lt;br /&gt;
*Connecteur à vis : [[Media:1729131.zip]]&lt;/div&gt;</summary>
		<author><name>Bjacquot</name></author>	</entry>

	<entry>
		<id>http://wikigeii.iut-troyes.univ-reims.fr//index.php?title=Cours:SaeRobotique&amp;diff=21074</id>
		<title>Cours:SaeRobotique</title>
		<link rel="alternate" type="text/html" href="http://wikigeii.iut-troyes.univ-reims.fr//index.php?title=Cours:SaeRobotique&amp;diff=21074"/>
				<updated>2026-06-01T08:48:24Z</updated>
		
		<summary type="html">&lt;p&gt;Bjacquot : /* structure du programme */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
[[Cours:SaeRobotique correction|{{Vert|&amp;lt;big&amp;gt;&amp;lt;big&amp;gt;Corrections enseignants&amp;lt;/big&amp;gt;&amp;lt;/big&amp;gt;}}]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Cours:SaeRobotiqueSuiviLigne]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Cours:SaeRobotiqueTennis]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=Ressources communes=&lt;br /&gt;
&lt;br /&gt;
==structure du programme==&lt;br /&gt;
&lt;br /&gt;
Vous pourrez utiliser la structure de programme suivante :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=cpp&amp;gt;&lt;br /&gt;
enum state {etapeInit,etapeChercheBalle,etapeDeplacementVersBalle};&lt;br /&gt;
&lt;br /&gt;
state etapeSuivante=etapeInit;&lt;br /&gt;
state etapeActive=etapeInit;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
int main()&lt;br /&gt;
{&lt;br /&gt;
  while(1)&lt;br /&gt;
  {&lt;br /&gt;
    // lecture des capteurs en début de boucle&lt;br /&gt;
    switch (etapeActive)&lt;br /&gt;
    {&lt;br /&gt;
      case etapeInit:&lt;br /&gt;
&lt;br /&gt;
            // si ... etapeSuivante=&lt;br /&gt;
            break;&lt;br /&gt;
      case etapeChercheBalle:&lt;br /&gt;
&lt;br /&gt;
            // si ... etapeSuivante=&lt;br /&gt;
            break;&lt;br /&gt;
      case etapeDeplacementVersBalle:&lt;br /&gt;
&lt;br /&gt;
            // si ... etapeSuivante=&lt;br /&gt;
            break;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    // on modifie l'étape active pour la prochaine boucle&lt;br /&gt;
    etapeActive=etapeSuivante;&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 {{Rouge|&amp;lt;big&amp;gt;*********************************&amp;lt;/big&amp;gt;}}&lt;br /&gt;
 {{Rouge|&amp;lt;big&amp;gt;ne pas déclarer de variables dans&amp;lt;/big&amp;gt;}}&lt;br /&gt;
 {{Rouge|&amp;lt;big&amp;gt;       le switch case&amp;lt;/big&amp;gt;}}&lt;br /&gt;
 {{Rouge|&amp;lt;big&amp;gt;*********************************&amp;lt;/big&amp;gt;}}&lt;br /&gt;
&lt;br /&gt;
==Programmation : comment faire==&lt;br /&gt;
&lt;br /&gt;
===Exécuter une action une seule fois :===&lt;br /&gt;
&amp;lt;source lang=cpp&amp;gt;&lt;br /&gt;
while(1)&lt;br /&gt;
{&lt;br /&gt;
   static bool dejaFait=false;&lt;br /&gt;
   if (dejaFait==false)&lt;br /&gt;
   {&lt;br /&gt;
      executerMonAction();&lt;br /&gt;
      dejaFait=true;&lt;br /&gt;
   }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Répéter une action régulièrement===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;source lang=cpp&amp;gt;&lt;br /&gt;
void initFonctionsTempsArduino()&lt;br /&gt;
{&lt;br /&gt;
  sei();&lt;br /&gt;
  // marche pour 328p et 2560 et autres ...&lt;br /&gt;
  // à adapter suivant le µc&lt;br /&gt;
  // cf https://github.com/arduino/ArduinoCore-avr/blob/master/cores/arduino/wiring.c&lt;br /&gt;
  TCCR0A=(1&amp;lt;&amp;lt;WGM01)|(1&amp;lt;&amp;lt;WGM00);&lt;br /&gt;
  TCCR0B=(1&amp;lt;&amp;lt;CS01)|(1&amp;lt;&amp;lt;CS00);&lt;br /&gt;
  TIMSK0=(1&amp;lt;&amp;lt;TOIE0);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
int main()&lt;br /&gt;
{&lt;br /&gt;
  initFonctionsTempsArduino();&lt;br /&gt;
  while(1)&lt;br /&gt;
  {&lt;br /&gt;
    static uint32_t triggerTime=millis();&lt;br /&gt;
    uint32_t currentTime=millis();&lt;br /&gt;
    if (currentTime&amp;gt;=triggerTime)&lt;br /&gt;
    {&lt;br /&gt;
       faireMonAction();&lt;br /&gt;
       triggerTime += 500; // prochaine exécution dans 500ms&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
||&lt;br /&gt;
&amp;lt;source lang=cpp&amp;gt;&lt;br /&gt;
void initFonctionsTempsArduino()&lt;br /&gt;
{&lt;br /&gt;
  sei();&lt;br /&gt;
  // marche pour 328p et 2560 et autres ...&lt;br /&gt;
  // à adapter suivant le µc&lt;br /&gt;
  // cf https://github.com/arduino/ArduinoCore-avr/blob/master/cores/arduino/wiring.c&lt;br /&gt;
  TCCR0A=(1&amp;lt;&amp;lt;WGM01)|(1&amp;lt;&amp;lt;WGM00);&lt;br /&gt;
  TCCR0B=(1&amp;lt;&amp;lt;CS01)|(1&amp;lt;&amp;lt;CS00);&lt;br /&gt;
  TIMSK0=(1&amp;lt;&amp;lt;TOIE0);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
int main()&lt;br /&gt;
{&lt;br /&gt;
  initFonctionsTempsArduino();&lt;br /&gt;
  while(1)&lt;br /&gt;
  {&lt;br /&gt;
    static uint32_t triggerTime=0;&lt;br /&gt;
    uint32_t currentTime=millis();&lt;br /&gt;
&lt;br /&gt;
    switch (etapeActive)&lt;br /&gt;
    {&lt;br /&gt;
      case etapeX:&lt;br /&gt;
            if ( qqch)&lt;br /&gt;
            {&lt;br /&gt;
               etapeSuivante=etapeY;&lt;br /&gt;
               triggerTime=currentTime;&lt;br /&gt;
            }&lt;br /&gt;
            break;&lt;br /&gt;
      case etapeY:&lt;br /&gt;
            if ( currentTime &amp;gt;= (triggerTime + duree ) )&lt;br /&gt;
            {&lt;br /&gt;
               etapeSuivante=etapeZ;&lt;br /&gt;
            }&lt;br /&gt;
            break;&lt;br /&gt;
      case etapeZ:&lt;br /&gt;
            ...&lt;br /&gt;
            break;&lt;br /&gt;
    }&lt;br /&gt;
    etapeActive=etapeSuivante;&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===Affichage provisoire pour deboggage===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{|&lt;br /&gt;
|-&lt;br /&gt;
| &lt;br /&gt;
&amp;lt;source lang=cpp&amp;gt;&lt;br /&gt;
#define debug   // mode debug&lt;br /&gt;
//ou&lt;br /&gt;
#undef debug // mode sans debug&lt;br /&gt;
&lt;br /&gt;
int main()&lt;br /&gt;
{&lt;br /&gt;
  ...&lt;br /&gt;
  while(1)&lt;br /&gt;
  {&lt;br /&gt;
    #ifdef debug&lt;br /&gt;
       Serial.println(&amp;quot;juste si debug&amp;quot;);&lt;br /&gt;
    #endif&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|| &lt;br /&gt;
&amp;lt;source lang=cpp&amp;gt;&lt;br /&gt;
#define DEBUG   //If you comment this line, the DEBUG_PRINT &amp;amp; DEBUG_PRINTLN lines are defined as blank.&lt;br /&gt;
#ifdef DEBUG    //Macros are usually in all capital letters.&lt;br /&gt;
   #define DEBUG_PRINT(...)    Serial.print(__VA_ARGS__)     //DEBUG_PRINT is a macro, debug print&lt;br /&gt;
   #define DEBUG_PRINTLN(...)  Serial.println(__VA_ARGS__)   //DEBUG_PRINTLN is a macro, debug print with new line&lt;br /&gt;
#else&lt;br /&gt;
   #define DEBUG_PRINT(...)     //now defines a blank line&lt;br /&gt;
   #define DEBUG_PRINTLN(...)   //now defines a blank line&lt;br /&gt;
#endif&lt;br /&gt;
int main()&lt;br /&gt;
{&lt;br /&gt;
  while(1)&lt;br /&gt;
  {&lt;br /&gt;
    DEBUG_PRINTLN(&amp;quot;juste si debug&amp;quot;);&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===changement d'état d'un capteur===&lt;br /&gt;
&lt;br /&gt;
{|&lt;br /&gt;
|-&lt;br /&gt;
! au front montant d'un capteur !! 1x si le capteur est actif suffisamment longtemps&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;source lang=cpp&amp;gt;&lt;br /&gt;
bool valeurActuelle=valeurInit;&lt;br /&gt;
bool valeurPrecedente=valeurInit;&lt;br /&gt;
&lt;br /&gt;
...&lt;br /&gt;
int main()&lt;br /&gt;
{&lt;br /&gt;
   ...&lt;br /&gt;
   while(1)&lt;br /&gt;
   {&lt;br /&gt;
      valeurPrecedente=valeurActuelle;&lt;br /&gt;
      valeurActuelle=lireValeurCapteur();&lt;br /&gt;
      if ( (valeurPrecedente==false) and (valeurActuelle==true) )&lt;br /&gt;
      {&lt;br /&gt;
         // action, par ex:&lt;br /&gt;
         nombreFrontMontant++;&lt;br /&gt;
      }&lt;br /&gt;
   }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|| &amp;lt;source lang=cpp&amp;gt;&lt;br /&gt;
bool valeurActuelle=valeurInit;&lt;br /&gt;
int8_t dureeActif=0;&lt;br /&gt;
bool isFront=true;&lt;br /&gt;
&lt;br /&gt;
...&lt;br /&gt;
int main()&lt;br /&gt;
{&lt;br /&gt;
   ...&lt;br /&gt;
   while(1)&lt;br /&gt;
   {&lt;br /&gt;
      valeurActuelle=lireValeurCapteur();&lt;br /&gt;
      if (valeurActuelle==true)&lt;br /&gt;
      {&lt;br /&gt;
         if (dureeActif&amp;gt;=20)&lt;br /&gt;
         {&lt;br /&gt;
            // faire l'action, par ex&lt;br /&gt;
            if (isFront==true)&lt;br /&gt;
            {&lt;br /&gt;
                isFront=false;&lt;br /&gt;
                nombreFrontMontant++;&lt;br /&gt;
            }&lt;br /&gt;
         }&lt;br /&gt;
         else dureeActif++;&lt;br /&gt;
      }&lt;br /&gt;
      else&lt;br /&gt;
      {&lt;br /&gt;
         dureeActif=0;&lt;br /&gt;
         isFront=true;&lt;br /&gt;
      }&lt;br /&gt;
   }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===filtrer un capteur tor===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! filtrer un capteur TOR !! sous forme de fonction pour filtrage de plusieurs capteurs&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;source lang=cpp&amp;gt;&lt;br /&gt;
&lt;br /&gt;
bool rawValue=readCapteur();&lt;br /&gt;
static bool value=false;&lt;br /&gt;
&lt;br /&gt;
const uint8_t filterValue=12;&lt;br /&gt;
static uint8_t nbTrue=0;&lt;br /&gt;
static uint8_t nbFalse=0;&lt;br /&gt;
&lt;br /&gt;
if ( rawValue  )&lt;br /&gt;
{&lt;br /&gt;
   if ( nbTrue&amp;gt;= filterValue)&lt;br /&gt;
   {&lt;br /&gt;
     value=true;&lt;br /&gt;
     nbFalse=0;&lt;br /&gt;
   }&lt;br /&gt;
   else nbTrue++;&lt;br /&gt;
}&lt;br /&gt;
else&lt;br /&gt;
{&lt;br /&gt;
   if ( nbFalse&amp;gt;= filterValue)&lt;br /&gt;
   {&lt;br /&gt;
     value=false;&lt;br /&gt;
     nbTrue=0;&lt;br /&gt;
   }&lt;br /&gt;
   else nbFalse++;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|| &amp;lt;source lang=cpp&amp;gt;&lt;br /&gt;
void filtreTor(bool rawValue,bool &amp;amp; value,uint8_t filterValue,uint8_t &amp;amp; nbTrue,uint8_t &amp;amp; nbFalse)&lt;br /&gt;
{&lt;br /&gt;
  if ( rawValue  )&lt;br /&gt;
  {&lt;br /&gt;
    if ( nbTrue&amp;gt;= filterValue)&lt;br /&gt;
    {&lt;br /&gt;
      value=true;&lt;br /&gt;
      nbFalse=0;&lt;br /&gt;
    }&lt;br /&gt;
    else nbTrue++;&lt;br /&gt;
  }&lt;br /&gt;
  else&lt;br /&gt;
  {&lt;br /&gt;
    if ( nbFalse&amp;gt;= filterValue)&lt;br /&gt;
    {&lt;br /&gt;
      value=false;&lt;br /&gt;
      nbTrue=0;&lt;br /&gt;
    }&lt;br /&gt;
    else nbFalse++;&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
int main()&lt;br /&gt;
{&lt;br /&gt;
  ...&lt;br /&gt;
  bool rawValue=rawValueTab[i];&lt;br /&gt;
  static bool value=false;&lt;br /&gt;
&lt;br /&gt;
  const uint8_t filterValue=5;&lt;br /&gt;
  static uint8_t nbTrue=0;&lt;br /&gt;
  static uint8_t nbFalse=0;&lt;br /&gt;
  filtreTor(rawValue,value,filterValue,nbTrue,nbFalse);&lt;br /&gt;
  ...&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===Optimiser l'exécution d'une fonction===&lt;br /&gt;
&amp;lt;source lang=cpp&amp;gt;&lt;br /&gt;
inline void setVitesse(int16_t vmG, int16_t vmD) __attribute__((always_inline));&lt;br /&gt;
&lt;br /&gt;
void setVitesse(int16_t vmG, int16_t vmD)&lt;br /&gt;
{&lt;br /&gt;
   // code de la fonction&lt;br /&gt;
   ...&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Diagramme d'état==&lt;br /&gt;
&lt;br /&gt;
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 :&lt;br /&gt;
&lt;br /&gt;
[[Media:TestFiniteStateMachine.zip]]&lt;br /&gt;
&lt;br /&gt;
==Composants Kicad==&lt;br /&gt;
&lt;br /&gt;
*Résistances :&lt;br /&gt;
**symbole R&lt;br /&gt;
**boitier suivant la valeur : 1206(CMS)/Axial DIN0309 (traversant)&lt;br /&gt;
*Condensateur&lt;br /&gt;
**symbole C&lt;br /&gt;
**boitier suivant la valeur 1206(CMS)&lt;br /&gt;
*VNH7070&lt;br /&gt;
**télécharger et décompresser le fichier [[Media:VNH7070BASTR.zip]]&lt;br /&gt;
**ajouter la librairie en suivante la page : https://www.snapeda.com/about/import/#KiCad6&lt;br /&gt;
**{{Rouge|attention}} : pour l'ajout de la librairie de l'empreinte, indique comme &amp;quot;pseudo nom&amp;quot; {{Rouge|VNH7070BASTR}}&lt;br /&gt;
**modèle 3d&lt;br /&gt;
***ajouter le fichier VNH7070BASTR.step&lt;br /&gt;
***faire une rotation sur X de 90°&lt;br /&gt;
*Arduino Nano&lt;br /&gt;
**symbole Arduino_Nano_v2.x&lt;br /&gt;
**modèle 3d&lt;br /&gt;
***télécharger et décompresser : [[Media:Arduino_nano.STEP.zip]]&lt;br /&gt;
***dans les propriétés de la carte (éditeur de pcb), onglet modèle 3d&lt;br /&gt;
****ajouter le fichier téléchargé&lt;br /&gt;
****rotation X 90&lt;br /&gt;
****rotation Z -90&lt;br /&gt;
****décalage Z 11mm&lt;br /&gt;
***ajouter 2 barrettes M/F&lt;br /&gt;
***${KICAD9_3DMODEL_DIR}/Connector_PinSocket_2.54mm.3dshapes/PinSocket_1x15_P2.54mm_Vertical.step&lt;br /&gt;
***décaler le 2ème en X de 15,24mm&lt;br /&gt;
*bornier à vis : Screw_Terminal_01x02&lt;br /&gt;
*MPU-9250&lt;br /&gt;
**mettre 2 barrettes sécables 4 contacts, espacées de 6 pas&lt;br /&gt;
**[[Media:SparkFun MPU-9250 Breakout.step.zip]]&lt;br /&gt;
*convertisseur de niveau&lt;br /&gt;
**convertisseur {{Rouge|gt1167}}&lt;br /&gt;
***utiliser la librairie : [[Media:GT117.zip]]&lt;br /&gt;
***documentation : [[Media:Gt1167.pdf]]&lt;br /&gt;
**convertisseur [https://www.sparkfun.com/sparkfun-logic-level-converter-bi-directional.html sparkfun {{Rouge|BOB-12009}}]&lt;br /&gt;
***utiliser la librairie : [[Media:BOB-12009.zip]]&lt;br /&gt;
***modèle 3d :&lt;br /&gt;
****BOB-12009.step &lt;br /&gt;
*****rotation 90/0/0&lt;br /&gt;
*****translation 0/0/9&lt;br /&gt;
****ajouter 2 barrettes M/F : ${KICAD9_3DMODEL_DIR}/Connector_PinSocket_2.54mm.3dshapes/PinSocket_1x06_P2.54mm_Vertical.step&lt;br /&gt;
*****rotation 0/0/0&lt;br /&gt;
*****translation 5.08/6.35/0 et -5.08/6.35/0&lt;br /&gt;
*Autres : [[Media:SaeS2_2025.zip]]&lt;br /&gt;
*GroveH : [[Media:groveH.zip]]&lt;br /&gt;
*Connecteur à vis : [[Media:1729131.zip]]&lt;/div&gt;</summary>
		<author><name>Bjacquot</name></author>	</entry>

	<entry>
		<id>http://wikigeii.iut-troyes.univ-reims.fr//index.php?title=Cours:SaeRobotique&amp;diff=21073</id>
		<title>Cours:SaeRobotique</title>
		<link rel="alternate" type="text/html" href="http://wikigeii.iut-troyes.univ-reims.fr//index.php?title=Cours:SaeRobotique&amp;diff=21073"/>
				<updated>2026-06-01T08:48:04Z</updated>
		
		<summary type="html">&lt;p&gt;Bjacquot : /* structure du programme */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
[[Cours:SaeRobotique correction|{{Vert|&amp;lt;big&amp;gt;&amp;lt;big&amp;gt;Corrections enseignants&amp;lt;/big&amp;gt;&amp;lt;/big&amp;gt;}}]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Cours:SaeRobotiqueSuiviLigne]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Cours:SaeRobotiqueTennis]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=Ressources communes=&lt;br /&gt;
&lt;br /&gt;
==structure du programme==&lt;br /&gt;
&lt;br /&gt;
Vous pourrez utiliser la structure de programme suivante :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=cpp&amp;gt;&lt;br /&gt;
enum state {etapeInit,etapeChercheBalle,etapeDeplacementVersBalle};&lt;br /&gt;
&lt;br /&gt;
state etapeSuivante=etapeInit;&lt;br /&gt;
state etapeActive=etapeInit;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
int main()&lt;br /&gt;
{&lt;br /&gt;
  while(1)&lt;br /&gt;
  {&lt;br /&gt;
    // lecture des capteurs en début de boucle&lt;br /&gt;
    switch (etapeActive)&lt;br /&gt;
    {&lt;br /&gt;
      case etapeInit:&lt;br /&gt;
&lt;br /&gt;
            // si ... etapeSuivante=&lt;br /&gt;
            break;&lt;br /&gt;
      case etapeChercheBalle:&lt;br /&gt;
&lt;br /&gt;
            // si ... etapeSuivante=&lt;br /&gt;
            break;&lt;br /&gt;
      case etapeDeplacementVersBalle:&lt;br /&gt;
&lt;br /&gt;
            // si ... etapeSuivante=&lt;br /&gt;
            break;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    // on modifie l'étape active pour la prochaine boucle&lt;br /&gt;
    etapeActive=etapeSuivante;&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 {{Rouge|&amp;lt;big&amp;gt;*********************************&amp;lt;/big&amp;gt;}}&lt;br /&gt;
 {{Rouge|&amp;lt;big&amp;gt;ne pas déclarer de variables dans&amp;lt;/big&amp;gt;}}&lt;br /&gt;
 {{Rouge|&amp;lt;big&amp;gt; le switch case&amp;lt;/big&amp;gt;}}&lt;br /&gt;
 {{Rouge|&amp;lt;big&amp;gt;*********************************&amp;lt;/big&amp;gt;}}&lt;br /&gt;
&lt;br /&gt;
==Programmation : comment faire==&lt;br /&gt;
&lt;br /&gt;
===Exécuter une action une seule fois :===&lt;br /&gt;
&amp;lt;source lang=cpp&amp;gt;&lt;br /&gt;
while(1)&lt;br /&gt;
{&lt;br /&gt;
   static bool dejaFait=false;&lt;br /&gt;
   if (dejaFait==false)&lt;br /&gt;
   {&lt;br /&gt;
      executerMonAction();&lt;br /&gt;
      dejaFait=true;&lt;br /&gt;
   }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Répéter une action régulièrement===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;source lang=cpp&amp;gt;&lt;br /&gt;
void initFonctionsTempsArduino()&lt;br /&gt;
{&lt;br /&gt;
  sei();&lt;br /&gt;
  // marche pour 328p et 2560 et autres ...&lt;br /&gt;
  // à adapter suivant le µc&lt;br /&gt;
  // cf https://github.com/arduino/ArduinoCore-avr/blob/master/cores/arduino/wiring.c&lt;br /&gt;
  TCCR0A=(1&amp;lt;&amp;lt;WGM01)|(1&amp;lt;&amp;lt;WGM00);&lt;br /&gt;
  TCCR0B=(1&amp;lt;&amp;lt;CS01)|(1&amp;lt;&amp;lt;CS00);&lt;br /&gt;
  TIMSK0=(1&amp;lt;&amp;lt;TOIE0);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
int main()&lt;br /&gt;
{&lt;br /&gt;
  initFonctionsTempsArduino();&lt;br /&gt;
  while(1)&lt;br /&gt;
  {&lt;br /&gt;
    static uint32_t triggerTime=millis();&lt;br /&gt;
    uint32_t currentTime=millis();&lt;br /&gt;
    if (currentTime&amp;gt;=triggerTime)&lt;br /&gt;
    {&lt;br /&gt;
       faireMonAction();&lt;br /&gt;
       triggerTime += 500; // prochaine exécution dans 500ms&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
||&lt;br /&gt;
&amp;lt;source lang=cpp&amp;gt;&lt;br /&gt;
void initFonctionsTempsArduino()&lt;br /&gt;
{&lt;br /&gt;
  sei();&lt;br /&gt;
  // marche pour 328p et 2560 et autres ...&lt;br /&gt;
  // à adapter suivant le µc&lt;br /&gt;
  // cf https://github.com/arduino/ArduinoCore-avr/blob/master/cores/arduino/wiring.c&lt;br /&gt;
  TCCR0A=(1&amp;lt;&amp;lt;WGM01)|(1&amp;lt;&amp;lt;WGM00);&lt;br /&gt;
  TCCR0B=(1&amp;lt;&amp;lt;CS01)|(1&amp;lt;&amp;lt;CS00);&lt;br /&gt;
  TIMSK0=(1&amp;lt;&amp;lt;TOIE0);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
int main()&lt;br /&gt;
{&lt;br /&gt;
  initFonctionsTempsArduino();&lt;br /&gt;
  while(1)&lt;br /&gt;
  {&lt;br /&gt;
    static uint32_t triggerTime=0;&lt;br /&gt;
    uint32_t currentTime=millis();&lt;br /&gt;
&lt;br /&gt;
    switch (etapeActive)&lt;br /&gt;
    {&lt;br /&gt;
      case etapeX:&lt;br /&gt;
            if ( qqch)&lt;br /&gt;
            {&lt;br /&gt;
               etapeSuivante=etapeY;&lt;br /&gt;
               triggerTime=currentTime;&lt;br /&gt;
            }&lt;br /&gt;
            break;&lt;br /&gt;
      case etapeY:&lt;br /&gt;
            if ( currentTime &amp;gt;= (triggerTime + duree ) )&lt;br /&gt;
            {&lt;br /&gt;
               etapeSuivante=etapeZ;&lt;br /&gt;
            }&lt;br /&gt;
            break;&lt;br /&gt;
      case etapeZ:&lt;br /&gt;
            ...&lt;br /&gt;
            break;&lt;br /&gt;
    }&lt;br /&gt;
    etapeActive=etapeSuivante;&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===Affichage provisoire pour deboggage===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{|&lt;br /&gt;
|-&lt;br /&gt;
| &lt;br /&gt;
&amp;lt;source lang=cpp&amp;gt;&lt;br /&gt;
#define debug   // mode debug&lt;br /&gt;
//ou&lt;br /&gt;
#undef debug // mode sans debug&lt;br /&gt;
&lt;br /&gt;
int main()&lt;br /&gt;
{&lt;br /&gt;
  ...&lt;br /&gt;
  while(1)&lt;br /&gt;
  {&lt;br /&gt;
    #ifdef debug&lt;br /&gt;
       Serial.println(&amp;quot;juste si debug&amp;quot;);&lt;br /&gt;
    #endif&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|| &lt;br /&gt;
&amp;lt;source lang=cpp&amp;gt;&lt;br /&gt;
#define DEBUG   //If you comment this line, the DEBUG_PRINT &amp;amp; DEBUG_PRINTLN lines are defined as blank.&lt;br /&gt;
#ifdef DEBUG    //Macros are usually in all capital letters.&lt;br /&gt;
   #define DEBUG_PRINT(...)    Serial.print(__VA_ARGS__)     //DEBUG_PRINT is a macro, debug print&lt;br /&gt;
   #define DEBUG_PRINTLN(...)  Serial.println(__VA_ARGS__)   //DEBUG_PRINTLN is a macro, debug print with new line&lt;br /&gt;
#else&lt;br /&gt;
   #define DEBUG_PRINT(...)     //now defines a blank line&lt;br /&gt;
   #define DEBUG_PRINTLN(...)   //now defines a blank line&lt;br /&gt;
#endif&lt;br /&gt;
int main()&lt;br /&gt;
{&lt;br /&gt;
  while(1)&lt;br /&gt;
  {&lt;br /&gt;
    DEBUG_PRINTLN(&amp;quot;juste si debug&amp;quot;);&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===changement d'état d'un capteur===&lt;br /&gt;
&lt;br /&gt;
{|&lt;br /&gt;
|-&lt;br /&gt;
! au front montant d'un capteur !! 1x si le capteur est actif suffisamment longtemps&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;source lang=cpp&amp;gt;&lt;br /&gt;
bool valeurActuelle=valeurInit;&lt;br /&gt;
bool valeurPrecedente=valeurInit;&lt;br /&gt;
&lt;br /&gt;
...&lt;br /&gt;
int main()&lt;br /&gt;
{&lt;br /&gt;
   ...&lt;br /&gt;
   while(1)&lt;br /&gt;
   {&lt;br /&gt;
      valeurPrecedente=valeurActuelle;&lt;br /&gt;
      valeurActuelle=lireValeurCapteur();&lt;br /&gt;
      if ( (valeurPrecedente==false) and (valeurActuelle==true) )&lt;br /&gt;
      {&lt;br /&gt;
         // action, par ex:&lt;br /&gt;
         nombreFrontMontant++;&lt;br /&gt;
      }&lt;br /&gt;
   }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|| &amp;lt;source lang=cpp&amp;gt;&lt;br /&gt;
bool valeurActuelle=valeurInit;&lt;br /&gt;
int8_t dureeActif=0;&lt;br /&gt;
bool isFront=true;&lt;br /&gt;
&lt;br /&gt;
...&lt;br /&gt;
int main()&lt;br /&gt;
{&lt;br /&gt;
   ...&lt;br /&gt;
   while(1)&lt;br /&gt;
   {&lt;br /&gt;
      valeurActuelle=lireValeurCapteur();&lt;br /&gt;
      if (valeurActuelle==true)&lt;br /&gt;
      {&lt;br /&gt;
         if (dureeActif&amp;gt;=20)&lt;br /&gt;
         {&lt;br /&gt;
            // faire l'action, par ex&lt;br /&gt;
            if (isFront==true)&lt;br /&gt;
            {&lt;br /&gt;
                isFront=false;&lt;br /&gt;
                nombreFrontMontant++;&lt;br /&gt;
            }&lt;br /&gt;
         }&lt;br /&gt;
         else dureeActif++;&lt;br /&gt;
      }&lt;br /&gt;
      else&lt;br /&gt;
      {&lt;br /&gt;
         dureeActif=0;&lt;br /&gt;
         isFront=true;&lt;br /&gt;
      }&lt;br /&gt;
   }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===filtrer un capteur tor===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! filtrer un capteur TOR !! sous forme de fonction pour filtrage de plusieurs capteurs&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;source lang=cpp&amp;gt;&lt;br /&gt;
&lt;br /&gt;
bool rawValue=readCapteur();&lt;br /&gt;
static bool value=false;&lt;br /&gt;
&lt;br /&gt;
const uint8_t filterValue=12;&lt;br /&gt;
static uint8_t nbTrue=0;&lt;br /&gt;
static uint8_t nbFalse=0;&lt;br /&gt;
&lt;br /&gt;
if ( rawValue  )&lt;br /&gt;
{&lt;br /&gt;
   if ( nbTrue&amp;gt;= filterValue)&lt;br /&gt;
   {&lt;br /&gt;
     value=true;&lt;br /&gt;
     nbFalse=0;&lt;br /&gt;
   }&lt;br /&gt;
   else nbTrue++;&lt;br /&gt;
}&lt;br /&gt;
else&lt;br /&gt;
{&lt;br /&gt;
   if ( nbFalse&amp;gt;= filterValue)&lt;br /&gt;
   {&lt;br /&gt;
     value=false;&lt;br /&gt;
     nbTrue=0;&lt;br /&gt;
   }&lt;br /&gt;
   else nbFalse++;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|| &amp;lt;source lang=cpp&amp;gt;&lt;br /&gt;
void filtreTor(bool rawValue,bool &amp;amp; value,uint8_t filterValue,uint8_t &amp;amp; nbTrue,uint8_t &amp;amp; nbFalse)&lt;br /&gt;
{&lt;br /&gt;
  if ( rawValue  )&lt;br /&gt;
  {&lt;br /&gt;
    if ( nbTrue&amp;gt;= filterValue)&lt;br /&gt;
    {&lt;br /&gt;
      value=true;&lt;br /&gt;
      nbFalse=0;&lt;br /&gt;
    }&lt;br /&gt;
    else nbTrue++;&lt;br /&gt;
  }&lt;br /&gt;
  else&lt;br /&gt;
  {&lt;br /&gt;
    if ( nbFalse&amp;gt;= filterValue)&lt;br /&gt;
    {&lt;br /&gt;
      value=false;&lt;br /&gt;
      nbTrue=0;&lt;br /&gt;
    }&lt;br /&gt;
    else nbFalse++;&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
int main()&lt;br /&gt;
{&lt;br /&gt;
  ...&lt;br /&gt;
  bool rawValue=rawValueTab[i];&lt;br /&gt;
  static bool value=false;&lt;br /&gt;
&lt;br /&gt;
  const uint8_t filterValue=5;&lt;br /&gt;
  static uint8_t nbTrue=0;&lt;br /&gt;
  static uint8_t nbFalse=0;&lt;br /&gt;
  filtreTor(rawValue,value,filterValue,nbTrue,nbFalse);&lt;br /&gt;
  ...&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===Optimiser l'exécution d'une fonction===&lt;br /&gt;
&amp;lt;source lang=cpp&amp;gt;&lt;br /&gt;
inline void setVitesse(int16_t vmG, int16_t vmD) __attribute__((always_inline));&lt;br /&gt;
&lt;br /&gt;
void setVitesse(int16_t vmG, int16_t vmD)&lt;br /&gt;
{&lt;br /&gt;
   // code de la fonction&lt;br /&gt;
   ...&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Diagramme d'état==&lt;br /&gt;
&lt;br /&gt;
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 :&lt;br /&gt;
&lt;br /&gt;
[[Media:TestFiniteStateMachine.zip]]&lt;br /&gt;
&lt;br /&gt;
==Composants Kicad==&lt;br /&gt;
&lt;br /&gt;
*Résistances :&lt;br /&gt;
**symbole R&lt;br /&gt;
**boitier suivant la valeur : 1206(CMS)/Axial DIN0309 (traversant)&lt;br /&gt;
*Condensateur&lt;br /&gt;
**symbole C&lt;br /&gt;
**boitier suivant la valeur 1206(CMS)&lt;br /&gt;
*VNH7070&lt;br /&gt;
**télécharger et décompresser le fichier [[Media:VNH7070BASTR.zip]]&lt;br /&gt;
**ajouter la librairie en suivante la page : https://www.snapeda.com/about/import/#KiCad6&lt;br /&gt;
**{{Rouge|attention}} : pour l'ajout de la librairie de l'empreinte, indique comme &amp;quot;pseudo nom&amp;quot; {{Rouge|VNH7070BASTR}}&lt;br /&gt;
**modèle 3d&lt;br /&gt;
***ajouter le fichier VNH7070BASTR.step&lt;br /&gt;
***faire une rotation sur X de 90°&lt;br /&gt;
*Arduino Nano&lt;br /&gt;
**symbole Arduino_Nano_v2.x&lt;br /&gt;
**modèle 3d&lt;br /&gt;
***télécharger et décompresser : [[Media:Arduino_nano.STEP.zip]]&lt;br /&gt;
***dans les propriétés de la carte (éditeur de pcb), onglet modèle 3d&lt;br /&gt;
****ajouter le fichier téléchargé&lt;br /&gt;
****rotation X 90&lt;br /&gt;
****rotation Z -90&lt;br /&gt;
****décalage Z 11mm&lt;br /&gt;
***ajouter 2 barrettes M/F&lt;br /&gt;
***${KICAD9_3DMODEL_DIR}/Connector_PinSocket_2.54mm.3dshapes/PinSocket_1x15_P2.54mm_Vertical.step&lt;br /&gt;
***décaler le 2ème en X de 15,24mm&lt;br /&gt;
*bornier à vis : Screw_Terminal_01x02&lt;br /&gt;
*MPU-9250&lt;br /&gt;
**mettre 2 barrettes sécables 4 contacts, espacées de 6 pas&lt;br /&gt;
**[[Media:SparkFun MPU-9250 Breakout.step.zip]]&lt;br /&gt;
*convertisseur de niveau&lt;br /&gt;
**convertisseur {{Rouge|gt1167}}&lt;br /&gt;
***utiliser la librairie : [[Media:GT117.zip]]&lt;br /&gt;
***documentation : [[Media:Gt1167.pdf]]&lt;br /&gt;
**convertisseur [https://www.sparkfun.com/sparkfun-logic-level-converter-bi-directional.html sparkfun {{Rouge|BOB-12009}}]&lt;br /&gt;
***utiliser la librairie : [[Media:BOB-12009.zip]]&lt;br /&gt;
***modèle 3d :&lt;br /&gt;
****BOB-12009.step &lt;br /&gt;
*****rotation 90/0/0&lt;br /&gt;
*****translation 0/0/9&lt;br /&gt;
****ajouter 2 barrettes M/F : ${KICAD9_3DMODEL_DIR}/Connector_PinSocket_2.54mm.3dshapes/PinSocket_1x06_P2.54mm_Vertical.step&lt;br /&gt;
*****rotation 0/0/0&lt;br /&gt;
*****translation 5.08/6.35/0 et -5.08/6.35/0&lt;br /&gt;
*Autres : [[Media:SaeS2_2025.zip]]&lt;br /&gt;
*GroveH : [[Media:groveH.zip]]&lt;br /&gt;
*Connecteur à vis : [[Media:1729131.zip]]&lt;/div&gt;</summary>
		<author><name>Bjacquot</name></author>	</entry>

	<entry>
		<id>http://wikigeii.iut-troyes.univ-reims.fr//index.php?title=Fichier:CircuitBUT2.png&amp;diff=21041</id>
		<title>Fichier:CircuitBUT2.png</title>
		<link rel="alternate" type="text/html" href="http://wikigeii.iut-troyes.univ-reims.fr//index.php?title=Fichier:CircuitBUT2.png&amp;diff=21041"/>
				<updated>2026-05-28T06:47:45Z</updated>
		
		<summary type="html">&lt;p&gt;Bjacquot : Bjacquot a téléversé une nouvelle version de Fichier:CircuitBUT2.png&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Bjacquot</name></author>	</entry>

	<entry>
		<id>http://wikigeii.iut-troyes.univ-reims.fr//index.php?title=Cours:SaeRobotiqueSuiviLigne&amp;diff=21040</id>
		<title>Cours:SaeRobotiqueSuiviLigne</title>
		<link rel="alternate" type="text/html" href="http://wikigeii.iut-troyes.univ-reims.fr//index.php?title=Cours:SaeRobotiqueSuiviLigne&amp;diff=21040"/>
				<updated>2026-05-27T07:55:18Z</updated>
		
		<summary type="html">&lt;p&gt;Bjacquot : /* MPU9250 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=Utiliser des librairies arduino avec un main =&lt;br /&gt;
&lt;br /&gt;
[[Cours:ArduinoSansLoopSetup|Arduino sans loop/setup]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Un certain nombre de librairies utilisent les fontions arduino [https://github.com/arduino/ArduinoCore-avr/blob/master/cores/arduino/wiring.c delay/delayMicroseconds/millis/micros]&lt;br /&gt;
&lt;br /&gt;
Ces fonctions utilisent le Timer0 et en particulier l'interruption de débordement.&lt;br /&gt;
&lt;br /&gt;
Ce Timer est configuré dans la fonction [https://github.com/arduino/ArduinoCore-avr/blob/master/cores/arduino/wiring.c init()], qui est appelée dans le [https://github.com/arduino/ArduinoCore-avr/blob/master/cores/arduino/main.cpp &amp;quot;main arduino&amp;quot;]&lt;br /&gt;
&lt;br /&gt;
{|&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
On peut donc initialiser ce Timer0 pour qu'il génère un débordement tel qu'attendu.&lt;br /&gt;
&lt;br /&gt;
Ainsi les fonctions de gestion du temps Arduino peuvent fonctionner comme prévu et on peut ainsi utiliser les librairies qui en dépendent :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=cpp&amp;gt;&lt;br /&gt;
void initFonctionsTempsArduino()&lt;br /&gt;
{&lt;br /&gt;
  sei();&lt;br /&gt;
  // marche pour 328p et 2560 et autres ...&lt;br /&gt;
  // à adapter suivant le µc&lt;br /&gt;
  // cf https://github.com/arduino/ArduinoCore-avr/blob/master/cores/arduino/wiring.c&lt;br /&gt;
  TCCR0A=(1&amp;lt;&amp;lt;WGM01)|(1&amp;lt;&amp;lt;WGM00);&lt;br /&gt;
  TCCR0B=(1&amp;lt;&amp;lt;CS01)|(1&amp;lt;&amp;lt;CS00);&lt;br /&gt;
  TIMSK0=(1&amp;lt;&amp;lt;TOIE0);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
int main()&lt;br /&gt;
{&lt;br /&gt;
  initFonctionsTempsArduino();&lt;br /&gt;
  Serial.begin(115200);&lt;br /&gt;
  while(1)&lt;br /&gt;
  {&lt;br /&gt;
    delay(100);&lt;br /&gt;
    Serial.println(millis());&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
||&lt;br /&gt;
&amp;lt;source lang=cpp&amp;gt;&lt;br /&gt;
/*&lt;br /&gt;
Exemple pour le capteur vl53l1x :&lt;br /&gt;
cf exemple de la librairie pour des commentaires&lt;br /&gt;
*/&lt;br /&gt;
#include &amp;lt;Wire.h&amp;gt;&lt;br /&gt;
#include &amp;lt;VL53L1X.h&amp;gt;&lt;br /&gt;
VL53L1X sensor;&lt;br /&gt;
&lt;br /&gt;
void initFonctionsTempsArduino()&lt;br /&gt;
{&lt;br /&gt;
  sei();&lt;br /&gt;
  // marche pour 328p et 2560 et autres ...&lt;br /&gt;
  // à adapter suivant le µc&lt;br /&gt;
  // cf https://github.com/arduino/ArduinoCore-avr/blob/master/cores/arduino/wiring.c&lt;br /&gt;
  TCCR0A=(1&amp;lt;&amp;lt;WGM01)|(1&amp;lt;&amp;lt;WGM00);&lt;br /&gt;
  TCCR0B=(1&amp;lt;&amp;lt;CS01)|(1&amp;lt;&amp;lt;CS00);&lt;br /&gt;
  TIMSK0=(1&amp;lt;&amp;lt;TOIE0);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
int main()&lt;br /&gt;
{&lt;br /&gt;
  initFonctionsTempsArduino();&lt;br /&gt;
  while (!Serial) {}&lt;br /&gt;
  Serial.begin(115200);&lt;br /&gt;
  Wire.begin();&lt;br /&gt;
  Wire.setClock(400000); // use 400 kHz I2C&lt;br /&gt;
  sensor.setTimeout(500);&lt;br /&gt;
  if (!sensor.init())&lt;br /&gt;
  {&lt;br /&gt;
    Serial.println(&amp;quot;Failed to detect and initialize sensor!&amp;quot;);&lt;br /&gt;
    while (1);&lt;br /&gt;
  }&lt;br /&gt;
  sensor.setDistanceMode(VL53L1X::Long);&lt;br /&gt;
  sensor.setMeasurementTimingBudget(50000);&lt;br /&gt;
  sensor.startContinuous(50);&lt;br /&gt;
  while(1)&lt;br /&gt;
  {&lt;br /&gt;
    Serial.print(sensor.read());&lt;br /&gt;
    if (sensor.timeoutOccurred()) { Serial.print(&amp;quot; TIMEOUT&amp;quot;); }&lt;br /&gt;
    Serial.println();&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=Augmenter la rapidité des Lidars=&lt;br /&gt;
&amp;lt;source lang=cpp&amp;gt;&lt;br /&gt;
   sensors[i].setMeasurementTimingBudget(20000);&lt;br /&gt;
   sensors[i].setDistanceMode(VL53L1X::Short);&lt;br /&gt;
   sensors[i].startContinuous(20);&lt;br /&gt;
   sensors[0].read(false);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Séquence 1 : tâches élémentaires individuelles =&lt;br /&gt;
&lt;br /&gt;
* Tâches de suivi de ligne (un étudiant sur chaque tâche) :&lt;br /&gt;
** suivi de cap avec MPU9250&lt;br /&gt;
** suivi avec capteurs photorélectifs (nombre de capteurs à choisir)&lt;br /&gt;
** suivi avec Lidar, en suivant un mur sur le côté&lt;br /&gt;
&lt;br /&gt;
* s'arrêter à la fin du parcours&lt;br /&gt;
&lt;br /&gt;
* À faire globalement : câblage robot, sécurité&lt;br /&gt;
&lt;br /&gt;
==Livrable 1==&lt;br /&gt;
* faire des recherches pour rendre un dossier par groupe (pour lundi 27/05) expliquant : le pont en H, schéma sécurité et chaque partie (a, b, c)&lt;br /&gt;
* évaluation le 24/05 (code + questions + fonctionnement)&lt;br /&gt;
&lt;br /&gt;
= Séquence 2 : tâches complexes individuelles + réalisation shield =&lt;br /&gt;
&lt;br /&gt;
* Tâches de suivi (à modifier)&lt;br /&gt;
** Capteurs photoréflectifs : détection de marques à droite (si marque : on tourne à droite à l'intersection, sinon tout droit). Détection des marques à gauche : stop et recul pendant 1 seconde (environ) et on repart (pas d'arrêt sur le second passage)&lt;br /&gt;
** Lidar : suivi de mur à gauche ET à droite (priorité en suivi à droite). Faire tomber une première barre, pas la seconde.&lt;br /&gt;
&lt;br /&gt;
* Trois cartes à réaliser (une par étudiant)&lt;br /&gt;
** carte avec capteurs photoreflectifs&lt;br /&gt;
** carte drivers moteur&lt;br /&gt;
** carte shield arduino nano&lt;br /&gt;
&lt;br /&gt;
==Livrable 2==&lt;br /&gt;
&lt;br /&gt;
* évaluation le 02/06 (routage/fabrication)&lt;br /&gt;
&lt;br /&gt;
= Séquence 3 : Fusion des trois tâches et programmation globale=&lt;br /&gt;
&lt;br /&gt;
==Livrable 3 ==&lt;br /&gt;
&lt;br /&gt;
= Rapport final =&lt;br /&gt;
&lt;br /&gt;
* Rapport final :&lt;br /&gt;
** '''À envoyer au format pdf par mail avant le DD/MM/YY à HH'''&lt;br /&gt;
** Diagramme de Gantt&lt;br /&gt;
** diagramme algorithme général&lt;br /&gt;
** stratégie de résolution de chaque tâche&lt;br /&gt;
** Mini-concours à la fin pour sélectionner le meilleur robot (évaluation des capacités du robot, par étudiant en fonction de l'organisation prévue).&lt;br /&gt;
** Chiffrage incluant le matériel ainsi que les ressources humaines.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=Organisation=&lt;br /&gt;
&lt;br /&gt;
*Fonctionnement en trinôme sur 12 jours&lt;br /&gt;
**9h-12h&lt;br /&gt;
**13h30-16h30&lt;br /&gt;
*{{Rouge|Compte rendu écrit quotidien individuel}}&lt;br /&gt;
**sera contrôlé chaque matin&lt;br /&gt;
**doit indiquer les tâches réalisées la veille&lt;br /&gt;
**doit indiquer le travail à réaliser le jour même&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=Ressources=&lt;br /&gt;
&lt;br /&gt;
==MPU9250==&lt;br /&gt;
&lt;br /&gt;
on va uniquement utiliser le magnétomètre de l'IMU MPU9250.&lt;br /&gt;
&lt;br /&gt;
Le principe est le suivant :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=cpp&amp;gt;&lt;br /&gt;
#include &amp;quot;MPU9250.h&amp;quot;&lt;br /&gt;
&lt;br /&gt;
MPU9250 mpu;&lt;br /&gt;
&lt;br /&gt;
void initFonctionsTempsArduino()&lt;br /&gt;
{&lt;br /&gt;
  sei();&lt;br /&gt;
  // marche pour 328p et 2560 et autres ...&lt;br /&gt;
  // à adapter suivant le µc&lt;br /&gt;
  // cf https://github.com/arduino/ArduinoCore-avr/blob/master/cores/arduino/wiring.c&lt;br /&gt;
  TCCR0A=(1&amp;lt;&amp;lt;WGM01)|(1&amp;lt;&amp;lt;WGM00);&lt;br /&gt;
  TCCR0B=(1&amp;lt;&amp;lt;CS01)|(1&amp;lt;&amp;lt;CS00);&lt;br /&gt;
  TIMSK0=(1&amp;lt;&amp;lt;TOIE0);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
int main()&lt;br /&gt;
{&lt;br /&gt;
    sei();&lt;br /&gt;
    initFonctionsTempsArduino();&lt;br /&gt;
    Serial.begin(115200);&lt;br /&gt;
    Wire.begin();&lt;br /&gt;
&lt;br /&gt;
    if (!mpu.setup(0x68)) {&lt;br /&gt;
        while (1) {&lt;br /&gt;
            Serial.println(&amp;quot;MPU connection failed. Please check your connection with `connection_check` example.&amp;quot;);&lt;br /&gt;
            delay(5000);&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
// il faudra calibrer le magnétomètre&lt;br /&gt;
// les valeurs sont propres à chaque composant&lt;br /&gt;
//  mpu.setMagBias(-56.47, 59.92, 0);&lt;br /&gt;
//  mpu.setMagScale(0.98, 1.10, 1);&lt;br /&gt;
&lt;br /&gt;
   while(1)&lt;br /&gt;
   {&lt;br /&gt;
      // attention, lecture toutes les 15ms max !!!&lt;br /&gt;
      if (mpu.available())&lt;br /&gt;
      {&lt;br /&gt;
          mpu.update_mag();&lt;br /&gt;
          print_mag();&lt;br /&gt;
      }&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void print_mag() {&lt;br /&gt;
    Serial.print(&amp;quot;angle, Hx, Hy : &amp;quot;);&lt;br /&gt;
    float angle=0;&lt;br /&gt;
    Serial.print(angle,2);&lt;br /&gt;
    Serial.print(&amp;quot; , &amp;quot;);&lt;br /&gt;
    Serial.print(mpu.getMagX(), 2);&lt;br /&gt;
    Serial.print(&amp;quot; , &amp;quot;);&lt;br /&gt;
    Serial.println(mpu.getMagY(), 2);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Composants/cartes==&lt;br /&gt;
*[[Cours:capteurPhotoReflectif|capteur '''photoréflectif''' pour détection de la {{Rouge|ligne}}]]&lt;br /&gt;
*convertisseur de niveau:&lt;br /&gt;
**https://www.eeweb.com/level-shifting-techniques-in-i2c-bus-design/&lt;br /&gt;
*Batterie LiFePo4&lt;br /&gt;
**assemblage de 4 éléments LiFePo4&lt;br /&gt;
**documentation sur les cellules [[Media:CellulesLiFePo4.pdf]]&lt;br /&gt;
**tensions à ne pas dépasser :&lt;br /&gt;
***maximum : 3,45V/élément&lt;br /&gt;
***minimum : 2,65V/élément&lt;br /&gt;
***ne pas démarrer le robot : 2,85V/élément&lt;br /&gt;
*divers&lt;br /&gt;
**Commutateur d'arrêt d'urgence https://fr.farnell.com/idec/yw1b-v4e01r/commut-bp-e-stop-spst-nc-10a-120v/dp/2833849?ost=2833849&lt;br /&gt;
**Régulateur ajustable 1,25 à 30 Vcc https://www.gotronic.fr/art-regulateur-ajustable-1-25-a-30-vcc-gt134-26094.htm&lt;br /&gt;
*driver de moteur&lt;br /&gt;
**https://www.cytron.io/p-13amp-6v-30v-dc-motor-driver&lt;br /&gt;
*capteurs de distance/contact&lt;br /&gt;
**HC-SR04  cf fiche technique sur la page : https://www.gotronic.fr/art-module-de-detection-us-hc-sr04-20912.htm&lt;br /&gt;
**VL53L1X&lt;br /&gt;
***https://www.robotshop.com/eu/fr/platine-deploiement-capteur-distance-tof-regulateur-tension-vl53l1x.html&lt;br /&gt;
***https://github.com/pololu/vl53l1x-arduino&lt;br /&gt;
**Mini Microrupteur - SPDT https://www.robotshop.com/eu/fr/mini-microrupteur-spdt-levier-rouleau.html&lt;br /&gt;
**GP2Yxxxx https://www.gotronic.fr/art-capteur-de-mesure-sharp-gp2y0a41sk0f-18338.htm&lt;br /&gt;
**lidar tfmini-s&lt;br /&gt;
***https://www.robotshop.com/eu/fr/module-micro-lidar-tfmini-s-benewake-i2c-12m.html&lt;br /&gt;
***https://www.arduino.cc/reference/en/libraries/tfmpi2c/&lt;br /&gt;
**lidar Lite 3&lt;br /&gt;
***https://www.robotshop.com/eu/fr/capteur-distance-laser-haute-performance-lidar-lite-3-llv3hp.html&lt;br /&gt;
***https://github.com/RobotShop/LIDARLite_v3_Arduino_Library&lt;br /&gt;
*caméra&lt;br /&gt;
**pixyv2&lt;br /&gt;
***https://pixycam.com/pixy2/&lt;br /&gt;
***[[Cours:TPS_2103_tp_pixy|TP caméra pixy]]&lt;br /&gt;
***Avoir un PixyMon plus rapide dans la g.008 :&lt;br /&gt;
****utiliser un 2ème poste&lt;br /&gt;
****ne pas se connecter sur nomachine&lt;br /&gt;
****lancer un terminal&lt;br /&gt;
****lancer la commande PixyMon&lt;br /&gt;
*IMU&lt;br /&gt;
**Explications du principe du capteur mpu9250 : https://learn.sparkfun.com/tutorials/mpu-9250-hookup-guide/all&lt;br /&gt;
**Bibliothèque à utiliser : dans le gestionnaire de bibliothèque =&amp;gt; ''by hideakitai'' (v 0.4.8) ou https://github.com/hideakitai/MPU9250&lt;br /&gt;
**Étapes :&lt;br /&gt;
***Réaliser la calibration et noter les valeurs affichées,&lt;br /&gt;
***les entrer dans votre programme (fonctions setMagBias() et setMagScale()&lt;br /&gt;
***Pour réaliser une mesure, se servir des programmes d'exemples&lt;br /&gt;
*Robot Arrex :&lt;br /&gt;
** [[Cours:RobotArrex]] (section documents)&lt;br /&gt;
** avec shield moteur&lt;br /&gt;
&lt;br /&gt;
==Fichiers/Images==&lt;br /&gt;
&lt;br /&gt;
*[[Image:CircuitBUT2.png|250px]]&lt;br /&gt;
&lt;br /&gt;
==liens (dont règlement concours) ==&lt;br /&gt;
* concours robotique Cachan, lien vers le règlement en pdf : https://www.festivalrobotiquecachan.fr/wp-content/uploads/Reglement_rencontres_de_robotique_GEII_BUT-1-2-3.pdf&lt;br /&gt;
* [[Media:FRC2024-Guideparticipant-v1.01.pdf|Organisation du concours]]&lt;br /&gt;
*[[Cours:archive SAÉ robot joueur de tennis]]&lt;br /&gt;
*[[Cours:archive SAÉ suivi de ligne]]&lt;br /&gt;
*https://www.youtube.com/watch?v=xH8EIqh-2_Y&lt;/div&gt;</summary>
		<author><name>Bjacquot</name></author>	</entry>

	<entry>
		<id>http://wikigeii.iut-troyes.univ-reims.fr//index.php?title=Cours:SaeRobotiqueSuiviLigne&amp;diff=21039</id>
		<title>Cours:SaeRobotiqueSuiviLigne</title>
		<link rel="alternate" type="text/html" href="http://wikigeii.iut-troyes.univ-reims.fr//index.php?title=Cours:SaeRobotiqueSuiviLigne&amp;diff=21039"/>
				<updated>2026-05-27T07:54:12Z</updated>
		
		<summary type="html">&lt;p&gt;Bjacquot : /* Ressources */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=Utiliser des librairies arduino avec un main =&lt;br /&gt;
&lt;br /&gt;
[[Cours:ArduinoSansLoopSetup|Arduino sans loop/setup]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Un certain nombre de librairies utilisent les fontions arduino [https://github.com/arduino/ArduinoCore-avr/blob/master/cores/arduino/wiring.c delay/delayMicroseconds/millis/micros]&lt;br /&gt;
&lt;br /&gt;
Ces fonctions utilisent le Timer0 et en particulier l'interruption de débordement.&lt;br /&gt;
&lt;br /&gt;
Ce Timer est configuré dans la fonction [https://github.com/arduino/ArduinoCore-avr/blob/master/cores/arduino/wiring.c init()], qui est appelée dans le [https://github.com/arduino/ArduinoCore-avr/blob/master/cores/arduino/main.cpp &amp;quot;main arduino&amp;quot;]&lt;br /&gt;
&lt;br /&gt;
{|&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
On peut donc initialiser ce Timer0 pour qu'il génère un débordement tel qu'attendu.&lt;br /&gt;
&lt;br /&gt;
Ainsi les fonctions de gestion du temps Arduino peuvent fonctionner comme prévu et on peut ainsi utiliser les librairies qui en dépendent :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=cpp&amp;gt;&lt;br /&gt;
void initFonctionsTempsArduino()&lt;br /&gt;
{&lt;br /&gt;
  sei();&lt;br /&gt;
  // marche pour 328p et 2560 et autres ...&lt;br /&gt;
  // à adapter suivant le µc&lt;br /&gt;
  // cf https://github.com/arduino/ArduinoCore-avr/blob/master/cores/arduino/wiring.c&lt;br /&gt;
  TCCR0A=(1&amp;lt;&amp;lt;WGM01)|(1&amp;lt;&amp;lt;WGM00);&lt;br /&gt;
  TCCR0B=(1&amp;lt;&amp;lt;CS01)|(1&amp;lt;&amp;lt;CS00);&lt;br /&gt;
  TIMSK0=(1&amp;lt;&amp;lt;TOIE0);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
int main()&lt;br /&gt;
{&lt;br /&gt;
  initFonctionsTempsArduino();&lt;br /&gt;
  Serial.begin(115200);&lt;br /&gt;
  while(1)&lt;br /&gt;
  {&lt;br /&gt;
    delay(100);&lt;br /&gt;
    Serial.println(millis());&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
||&lt;br /&gt;
&amp;lt;source lang=cpp&amp;gt;&lt;br /&gt;
/*&lt;br /&gt;
Exemple pour le capteur vl53l1x :&lt;br /&gt;
cf exemple de la librairie pour des commentaires&lt;br /&gt;
*/&lt;br /&gt;
#include &amp;lt;Wire.h&amp;gt;&lt;br /&gt;
#include &amp;lt;VL53L1X.h&amp;gt;&lt;br /&gt;
VL53L1X sensor;&lt;br /&gt;
&lt;br /&gt;
void initFonctionsTempsArduino()&lt;br /&gt;
{&lt;br /&gt;
  sei();&lt;br /&gt;
  // marche pour 328p et 2560 et autres ...&lt;br /&gt;
  // à adapter suivant le µc&lt;br /&gt;
  // cf https://github.com/arduino/ArduinoCore-avr/blob/master/cores/arduino/wiring.c&lt;br /&gt;
  TCCR0A=(1&amp;lt;&amp;lt;WGM01)|(1&amp;lt;&amp;lt;WGM00);&lt;br /&gt;
  TCCR0B=(1&amp;lt;&amp;lt;CS01)|(1&amp;lt;&amp;lt;CS00);&lt;br /&gt;
  TIMSK0=(1&amp;lt;&amp;lt;TOIE0);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
int main()&lt;br /&gt;
{&lt;br /&gt;
  initFonctionsTempsArduino();&lt;br /&gt;
  while (!Serial) {}&lt;br /&gt;
  Serial.begin(115200);&lt;br /&gt;
  Wire.begin();&lt;br /&gt;
  Wire.setClock(400000); // use 400 kHz I2C&lt;br /&gt;
  sensor.setTimeout(500);&lt;br /&gt;
  if (!sensor.init())&lt;br /&gt;
  {&lt;br /&gt;
    Serial.println(&amp;quot;Failed to detect and initialize sensor!&amp;quot;);&lt;br /&gt;
    while (1);&lt;br /&gt;
  }&lt;br /&gt;
  sensor.setDistanceMode(VL53L1X::Long);&lt;br /&gt;
  sensor.setMeasurementTimingBudget(50000);&lt;br /&gt;
  sensor.startContinuous(50);&lt;br /&gt;
  while(1)&lt;br /&gt;
  {&lt;br /&gt;
    Serial.print(sensor.read());&lt;br /&gt;
    if (sensor.timeoutOccurred()) { Serial.print(&amp;quot; TIMEOUT&amp;quot;); }&lt;br /&gt;
    Serial.println();&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=Augmenter la rapidité des Lidars=&lt;br /&gt;
&amp;lt;source lang=cpp&amp;gt;&lt;br /&gt;
   sensors[i].setMeasurementTimingBudget(20000);&lt;br /&gt;
   sensors[i].setDistanceMode(VL53L1X::Short);&lt;br /&gt;
   sensors[i].startContinuous(20);&lt;br /&gt;
   sensors[0].read(false);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Séquence 1 : tâches élémentaires individuelles =&lt;br /&gt;
&lt;br /&gt;
* Tâches de suivi de ligne (un étudiant sur chaque tâche) :&lt;br /&gt;
** suivi de cap avec MPU9250&lt;br /&gt;
** suivi avec capteurs photorélectifs (nombre de capteurs à choisir)&lt;br /&gt;
** suivi avec Lidar, en suivant un mur sur le côté&lt;br /&gt;
&lt;br /&gt;
* s'arrêter à la fin du parcours&lt;br /&gt;
&lt;br /&gt;
* À faire globalement : câblage robot, sécurité&lt;br /&gt;
&lt;br /&gt;
==Livrable 1==&lt;br /&gt;
* faire des recherches pour rendre un dossier par groupe (pour lundi 27/05) expliquant : le pont en H, schéma sécurité et chaque partie (a, b, c)&lt;br /&gt;
* évaluation le 24/05 (code + questions + fonctionnement)&lt;br /&gt;
&lt;br /&gt;
= Séquence 2 : tâches complexes individuelles + réalisation shield =&lt;br /&gt;
&lt;br /&gt;
* Tâches de suivi (à modifier)&lt;br /&gt;
** Capteurs photoréflectifs : détection de marques à droite (si marque : on tourne à droite à l'intersection, sinon tout droit). Détection des marques à gauche : stop et recul pendant 1 seconde (environ) et on repart (pas d'arrêt sur le second passage)&lt;br /&gt;
** Lidar : suivi de mur à gauche ET à droite (priorité en suivi à droite). Faire tomber une première barre, pas la seconde.&lt;br /&gt;
&lt;br /&gt;
* Trois cartes à réaliser (une par étudiant)&lt;br /&gt;
** carte avec capteurs photoreflectifs&lt;br /&gt;
** carte drivers moteur&lt;br /&gt;
** carte shield arduino nano&lt;br /&gt;
&lt;br /&gt;
==Livrable 2==&lt;br /&gt;
&lt;br /&gt;
* évaluation le 02/06 (routage/fabrication)&lt;br /&gt;
&lt;br /&gt;
= Séquence 3 : Fusion des trois tâches et programmation globale=&lt;br /&gt;
&lt;br /&gt;
==Livrable 3 ==&lt;br /&gt;
&lt;br /&gt;
= Rapport final =&lt;br /&gt;
&lt;br /&gt;
* Rapport final :&lt;br /&gt;
** '''À envoyer au format pdf par mail avant le DD/MM/YY à HH'''&lt;br /&gt;
** Diagramme de Gantt&lt;br /&gt;
** diagramme algorithme général&lt;br /&gt;
** stratégie de résolution de chaque tâche&lt;br /&gt;
** Mini-concours à la fin pour sélectionner le meilleur robot (évaluation des capacités du robot, par étudiant en fonction de l'organisation prévue).&lt;br /&gt;
** Chiffrage incluant le matériel ainsi que les ressources humaines.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=Organisation=&lt;br /&gt;
&lt;br /&gt;
*Fonctionnement en trinôme sur 12 jours&lt;br /&gt;
**9h-12h&lt;br /&gt;
**13h30-16h30&lt;br /&gt;
*{{Rouge|Compte rendu écrit quotidien individuel}}&lt;br /&gt;
**sera contrôlé chaque matin&lt;br /&gt;
**doit indiquer les tâches réalisées la veille&lt;br /&gt;
**doit indiquer le travail à réaliser le jour même&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=Ressources=&lt;br /&gt;
&lt;br /&gt;
==MPU9250==&lt;br /&gt;
&lt;br /&gt;
on va uniquement utiliser le magnétomètre de l'IMU MPU9250.&lt;br /&gt;
&lt;br /&gt;
Le principe est le suivant :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=cpp&amp;gt;&lt;br /&gt;
#include &amp;quot;MPU9250.h&amp;quot;&lt;br /&gt;
&lt;br /&gt;
MPU9250 mpu;&lt;br /&gt;
&lt;br /&gt;
void initFonctionsTempsArduino()&lt;br /&gt;
{&lt;br /&gt;
  sei();&lt;br /&gt;
  // marche pour 328p et 2560 et autres ...&lt;br /&gt;
  // à adapter suivant le µc&lt;br /&gt;
  // cf https://github.com/arduino/ArduinoCore-avr/blob/master/cores/arduino/wiring.c&lt;br /&gt;
  TCCR0A=(1&amp;lt;&amp;lt;WGM01)|(1&amp;lt;&amp;lt;WGM00);&lt;br /&gt;
  TCCR0B=(1&amp;lt;&amp;lt;CS01)|(1&amp;lt;&amp;lt;CS00);&lt;br /&gt;
  TIMSK0=(1&amp;lt;&amp;lt;TOIE0);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
int main()&lt;br /&gt;
{&lt;br /&gt;
    sei();&lt;br /&gt;
    initFonctionsTempsArduino();&lt;br /&gt;
    Serial.begin(115200);&lt;br /&gt;
    Wire.begin();&lt;br /&gt;
&lt;br /&gt;
    if (!mpu.setup(0x68)) {&lt;br /&gt;
        while (1) {&lt;br /&gt;
            Serial.println(&amp;quot;MPU connection failed. Please check your connection with `connection_check` example.&amp;quot;);&lt;br /&gt;
            delay(5000);&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
// il faudra calibrer le magnétomètre&lt;br /&gt;
// les valeurs sont propres à chaque composant&lt;br /&gt;
//  mpu.setMagBias(-56.47, 59.92, 0);&lt;br /&gt;
//  mpu.setMagScale(0.98, 1.10, 1);&lt;br /&gt;
&lt;br /&gt;
   while(1)&lt;br /&gt;
   {&lt;br /&gt;
      // attention, lecture toutes les 15ms max !!!&lt;br /&gt;
      if ((currentTime-time)&amp;gt;15)&lt;br /&gt;
      {&lt;br /&gt;
         if (mpu.available())&lt;br /&gt;
         {&lt;br /&gt;
            mpu.update_mag();&lt;br /&gt;
            print_mag();&lt;br /&gt;
         }&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void print_mag() {&lt;br /&gt;
    Serial.print(&amp;quot;angle, Hx, Hy : &amp;quot;);&lt;br /&gt;
    float angle=0;&lt;br /&gt;
    Serial.print(angle,2);&lt;br /&gt;
    Serial.print(&amp;quot; , &amp;quot;);&lt;br /&gt;
    Serial.print(mpu.getMagX(), 2);&lt;br /&gt;
    Serial.print(&amp;quot; , &amp;quot;);&lt;br /&gt;
    Serial.println(mpu.getMagY(), 2);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Composants/cartes==&lt;br /&gt;
*[[Cours:capteurPhotoReflectif|capteur '''photoréflectif''' pour détection de la {{Rouge|ligne}}]]&lt;br /&gt;
*convertisseur de niveau:&lt;br /&gt;
**https://www.eeweb.com/level-shifting-techniques-in-i2c-bus-design/&lt;br /&gt;
*Batterie LiFePo4&lt;br /&gt;
**assemblage de 4 éléments LiFePo4&lt;br /&gt;
**documentation sur les cellules [[Media:CellulesLiFePo4.pdf]]&lt;br /&gt;
**tensions à ne pas dépasser :&lt;br /&gt;
***maximum : 3,45V/élément&lt;br /&gt;
***minimum : 2,65V/élément&lt;br /&gt;
***ne pas démarrer le robot : 2,85V/élément&lt;br /&gt;
*divers&lt;br /&gt;
**Commutateur d'arrêt d'urgence https://fr.farnell.com/idec/yw1b-v4e01r/commut-bp-e-stop-spst-nc-10a-120v/dp/2833849?ost=2833849&lt;br /&gt;
**Régulateur ajustable 1,25 à 30 Vcc https://www.gotronic.fr/art-regulateur-ajustable-1-25-a-30-vcc-gt134-26094.htm&lt;br /&gt;
*driver de moteur&lt;br /&gt;
**https://www.cytron.io/p-13amp-6v-30v-dc-motor-driver&lt;br /&gt;
*capteurs de distance/contact&lt;br /&gt;
**HC-SR04  cf fiche technique sur la page : https://www.gotronic.fr/art-module-de-detection-us-hc-sr04-20912.htm&lt;br /&gt;
**VL53L1X&lt;br /&gt;
***https://www.robotshop.com/eu/fr/platine-deploiement-capteur-distance-tof-regulateur-tension-vl53l1x.html&lt;br /&gt;
***https://github.com/pololu/vl53l1x-arduino&lt;br /&gt;
**Mini Microrupteur - SPDT https://www.robotshop.com/eu/fr/mini-microrupteur-spdt-levier-rouleau.html&lt;br /&gt;
**GP2Yxxxx https://www.gotronic.fr/art-capteur-de-mesure-sharp-gp2y0a41sk0f-18338.htm&lt;br /&gt;
**lidar tfmini-s&lt;br /&gt;
***https://www.robotshop.com/eu/fr/module-micro-lidar-tfmini-s-benewake-i2c-12m.html&lt;br /&gt;
***https://www.arduino.cc/reference/en/libraries/tfmpi2c/&lt;br /&gt;
**lidar Lite 3&lt;br /&gt;
***https://www.robotshop.com/eu/fr/capteur-distance-laser-haute-performance-lidar-lite-3-llv3hp.html&lt;br /&gt;
***https://github.com/RobotShop/LIDARLite_v3_Arduino_Library&lt;br /&gt;
*caméra&lt;br /&gt;
**pixyv2&lt;br /&gt;
***https://pixycam.com/pixy2/&lt;br /&gt;
***[[Cours:TPS_2103_tp_pixy|TP caméra pixy]]&lt;br /&gt;
***Avoir un PixyMon plus rapide dans la g.008 :&lt;br /&gt;
****utiliser un 2ème poste&lt;br /&gt;
****ne pas se connecter sur nomachine&lt;br /&gt;
****lancer un terminal&lt;br /&gt;
****lancer la commande PixyMon&lt;br /&gt;
*IMU&lt;br /&gt;
**Explications du principe du capteur mpu9250 : https://learn.sparkfun.com/tutorials/mpu-9250-hookup-guide/all&lt;br /&gt;
**Bibliothèque à utiliser : dans le gestionnaire de bibliothèque =&amp;gt; ''by hideakitai'' (v 0.4.8) ou https://github.com/hideakitai/MPU9250&lt;br /&gt;
**Étapes :&lt;br /&gt;
***Réaliser la calibration et noter les valeurs affichées,&lt;br /&gt;
***les entrer dans votre programme (fonctions setMagBias() et setMagScale()&lt;br /&gt;
***Pour réaliser une mesure, se servir des programmes d'exemples&lt;br /&gt;
*Robot Arrex :&lt;br /&gt;
** [[Cours:RobotArrex]] (section documents)&lt;br /&gt;
** avec shield moteur&lt;br /&gt;
&lt;br /&gt;
==Fichiers/Images==&lt;br /&gt;
&lt;br /&gt;
*[[Image:CircuitBUT2.png|250px]]&lt;br /&gt;
&lt;br /&gt;
==liens (dont règlement concours) ==&lt;br /&gt;
* concours robotique Cachan, lien vers le règlement en pdf : https://www.festivalrobotiquecachan.fr/wp-content/uploads/Reglement_rencontres_de_robotique_GEII_BUT-1-2-3.pdf&lt;br /&gt;
* [[Media:FRC2024-Guideparticipant-v1.01.pdf|Organisation du concours]]&lt;br /&gt;
*[[Cours:archive SAÉ robot joueur de tennis]]&lt;br /&gt;
*[[Cours:archive SAÉ suivi de ligne]]&lt;br /&gt;
*https://www.youtube.com/watch?v=xH8EIqh-2_Y&lt;/div&gt;</summary>
		<author><name>Bjacquot</name></author>	</entry>

	<entry>
		<id>http://wikigeii.iut-troyes.univ-reims.fr//index.php?title=Cours:SaeRobotique&amp;diff=21003</id>
		<title>Cours:SaeRobotique</title>
		<link rel="alternate" type="text/html" href="http://wikigeii.iut-troyes.univ-reims.fr//index.php?title=Cours:SaeRobotique&amp;diff=21003"/>
				<updated>2026-05-15T17:36:30Z</updated>
		
		<summary type="html">&lt;p&gt;Bjacquot : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
[[Cours:SaeRobotique correction|{{Vert|&amp;lt;big&amp;gt;&amp;lt;big&amp;gt;Corrections enseignants&amp;lt;/big&amp;gt;&amp;lt;/big&amp;gt;}}]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Cours:SaeRobotiqueSuiviLigne]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Cours:SaeRobotiqueTennis]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=Ressources communes=&lt;br /&gt;
&lt;br /&gt;
==structure du programme==&lt;br /&gt;
&lt;br /&gt;
Vous pourrez utiliser la structure de programme suivante :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=cpp&amp;gt;&lt;br /&gt;
enum state {etapeInit,etapeChercheBalle,etapeDeplacementVersBalle};&lt;br /&gt;
&lt;br /&gt;
state etapeSuivante=etapeInit;&lt;br /&gt;
state etapeActive=etapeInit;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
int main()&lt;br /&gt;
{&lt;br /&gt;
  while(1)&lt;br /&gt;
  {&lt;br /&gt;
    // lecture des capteurs en début de boucle&lt;br /&gt;
    switch (etapeActive)&lt;br /&gt;
    {&lt;br /&gt;
      case etapeInit:&lt;br /&gt;
&lt;br /&gt;
            // si ... etapeSuivante=&lt;br /&gt;
            break;&lt;br /&gt;
      case etapeChercheBalle:&lt;br /&gt;
&lt;br /&gt;
            // si ... etapeSuivante=&lt;br /&gt;
            break;&lt;br /&gt;
      case etapeDeplacementVersBalle:&lt;br /&gt;
&lt;br /&gt;
            // si ... etapeSuivante=&lt;br /&gt;
            break;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    // on modifie l'étape active pour la prochaine boucle&lt;br /&gt;
    etapeActive=etapeSuivante;&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Programmation : comment faire==&lt;br /&gt;
&lt;br /&gt;
===Exécuter une action une seule fois :===&lt;br /&gt;
&amp;lt;source lang=cpp&amp;gt;&lt;br /&gt;
while(1)&lt;br /&gt;
{&lt;br /&gt;
   static bool dejaFait=false;&lt;br /&gt;
   if (dejaFait==false)&lt;br /&gt;
   {&lt;br /&gt;
      executerMonAction();&lt;br /&gt;
      dejaFait=true;&lt;br /&gt;
   }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Répéter une action régulièrement===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;source lang=cpp&amp;gt;&lt;br /&gt;
void initFonctionsTempsArduino()&lt;br /&gt;
{&lt;br /&gt;
  sei();&lt;br /&gt;
  // marche pour 328p et 2560 et autres ...&lt;br /&gt;
  // à adapter suivant le µc&lt;br /&gt;
  // cf https://github.com/arduino/ArduinoCore-avr/blob/master/cores/arduino/wiring.c&lt;br /&gt;
  TCCR0A=(1&amp;lt;&amp;lt;WGM01)|(1&amp;lt;&amp;lt;WGM00);&lt;br /&gt;
  TCCR0B=(1&amp;lt;&amp;lt;CS01)|(1&amp;lt;&amp;lt;CS00);&lt;br /&gt;
  TIMSK0=(1&amp;lt;&amp;lt;TOIE0);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
int main()&lt;br /&gt;
{&lt;br /&gt;
  initFonctionsTempsArduino();&lt;br /&gt;
  while(1)&lt;br /&gt;
  {&lt;br /&gt;
    static uint32_t triggerTime=millis();&lt;br /&gt;
    uint32_t currentTime=millis();&lt;br /&gt;
    if (currentTime&amp;gt;=triggerTime)&lt;br /&gt;
    {&lt;br /&gt;
       faireMonAction();&lt;br /&gt;
       triggerTime += 500; // prochaine exécution dans 500ms&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
||&lt;br /&gt;
&amp;lt;source lang=cpp&amp;gt;&lt;br /&gt;
void initFonctionsTempsArduino()&lt;br /&gt;
{&lt;br /&gt;
  sei();&lt;br /&gt;
  // marche pour 328p et 2560 et autres ...&lt;br /&gt;
  // à adapter suivant le µc&lt;br /&gt;
  // cf https://github.com/arduino/ArduinoCore-avr/blob/master/cores/arduino/wiring.c&lt;br /&gt;
  TCCR0A=(1&amp;lt;&amp;lt;WGM01)|(1&amp;lt;&amp;lt;WGM00);&lt;br /&gt;
  TCCR0B=(1&amp;lt;&amp;lt;CS01)|(1&amp;lt;&amp;lt;CS00);&lt;br /&gt;
  TIMSK0=(1&amp;lt;&amp;lt;TOIE0);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
int main()&lt;br /&gt;
{&lt;br /&gt;
  initFonctionsTempsArduino();&lt;br /&gt;
  while(1)&lt;br /&gt;
  {&lt;br /&gt;
    static uint32_t triggerTime=0;&lt;br /&gt;
    uint32_t currentTime=millis();&lt;br /&gt;
&lt;br /&gt;
    switch (etapeActive)&lt;br /&gt;
    {&lt;br /&gt;
      case etapeX:&lt;br /&gt;
            if ( qqch)&lt;br /&gt;
            {&lt;br /&gt;
               etapeSuivante=etapeY;&lt;br /&gt;
               triggerTime=currentTime;&lt;br /&gt;
            }&lt;br /&gt;
            break;&lt;br /&gt;
      case etapeY:&lt;br /&gt;
            if ( currentTime &amp;gt;= (triggerTime + duree ) )&lt;br /&gt;
            {&lt;br /&gt;
               etapeSuivante=etapeZ;&lt;br /&gt;
            }&lt;br /&gt;
            break;&lt;br /&gt;
      case etapeZ:&lt;br /&gt;
            ...&lt;br /&gt;
            break;&lt;br /&gt;
    }&lt;br /&gt;
    etapeActive=etapeSuivante;&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===Affichage provisoire pour deboggage===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{|&lt;br /&gt;
|-&lt;br /&gt;
| &lt;br /&gt;
&amp;lt;source lang=cpp&amp;gt;&lt;br /&gt;
#define debug   // mode debug&lt;br /&gt;
//ou&lt;br /&gt;
#undef debug // mode sans debug&lt;br /&gt;
&lt;br /&gt;
int main()&lt;br /&gt;
{&lt;br /&gt;
  ...&lt;br /&gt;
  while(1)&lt;br /&gt;
  {&lt;br /&gt;
    #ifdef debug&lt;br /&gt;
       Serial.println(&amp;quot;juste si debug&amp;quot;);&lt;br /&gt;
    #endif&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|| &lt;br /&gt;
&amp;lt;source lang=cpp&amp;gt;&lt;br /&gt;
#define DEBUG   //If you comment this line, the DEBUG_PRINT &amp;amp; DEBUG_PRINTLN lines are defined as blank.&lt;br /&gt;
#ifdef DEBUG    //Macros are usually in all capital letters.&lt;br /&gt;
   #define DEBUG_PRINT(...)    Serial.print(__VA_ARGS__)     //DEBUG_PRINT is a macro, debug print&lt;br /&gt;
   #define DEBUG_PRINTLN(...)  Serial.println(__VA_ARGS__)   //DEBUG_PRINTLN is a macro, debug print with new line&lt;br /&gt;
#else&lt;br /&gt;
   #define DEBUG_PRINT(...)     //now defines a blank line&lt;br /&gt;
   #define DEBUG_PRINTLN(...)   //now defines a blank line&lt;br /&gt;
#endif&lt;br /&gt;
int main()&lt;br /&gt;
{&lt;br /&gt;
  while(1)&lt;br /&gt;
  {&lt;br /&gt;
    DEBUG_PRINTLN(&amp;quot;juste si debug&amp;quot;);&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===changement d'état d'un capteur===&lt;br /&gt;
&lt;br /&gt;
{|&lt;br /&gt;
|-&lt;br /&gt;
! au front montant d'un capteur !! 1x si le capteur est actif suffisamment longtemps&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;source lang=cpp&amp;gt;&lt;br /&gt;
bool valeurActuelle=valeurInit;&lt;br /&gt;
bool valeurPrecedente=valeurInit;&lt;br /&gt;
&lt;br /&gt;
...&lt;br /&gt;
int main()&lt;br /&gt;
{&lt;br /&gt;
   ...&lt;br /&gt;
   while(1)&lt;br /&gt;
   {&lt;br /&gt;
      valeurPrecedente=valeurActuelle;&lt;br /&gt;
      valeurActuelle=lireValeurCapteur();&lt;br /&gt;
      if ( (valeurPrecedente==false) and (valeurActuelle==true) )&lt;br /&gt;
      {&lt;br /&gt;
         // action, par ex:&lt;br /&gt;
         nombreFrontMontant++;&lt;br /&gt;
      }&lt;br /&gt;
   }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|| &amp;lt;source lang=cpp&amp;gt;&lt;br /&gt;
bool valeurActuelle=valeurInit;&lt;br /&gt;
int8_t dureeActif=0;&lt;br /&gt;
bool isFront=true;&lt;br /&gt;
&lt;br /&gt;
...&lt;br /&gt;
int main()&lt;br /&gt;
{&lt;br /&gt;
   ...&lt;br /&gt;
   while(1)&lt;br /&gt;
   {&lt;br /&gt;
      valeurActuelle=lireValeurCapteur();&lt;br /&gt;
      if (valeurActuelle==true)&lt;br /&gt;
      {&lt;br /&gt;
         if (dureeActif&amp;gt;=20)&lt;br /&gt;
         {&lt;br /&gt;
            // faire l'action, par ex&lt;br /&gt;
            if (isFront==true)&lt;br /&gt;
            {&lt;br /&gt;
                isFront=false;&lt;br /&gt;
                nombreFrontMontant++;&lt;br /&gt;
            }&lt;br /&gt;
         }&lt;br /&gt;
         else dureeActif++;&lt;br /&gt;
      }&lt;br /&gt;
      else&lt;br /&gt;
      {&lt;br /&gt;
         dureeActif=0;&lt;br /&gt;
         isFront=true;&lt;br /&gt;
      }&lt;br /&gt;
   }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===filtrer un capteur tor===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! filtrer un capteur TOR !! sous forme de fonction pour filtrage de plusieurs capteurs&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;source lang=cpp&amp;gt;&lt;br /&gt;
&lt;br /&gt;
bool rawValue=readCapteur();&lt;br /&gt;
static bool value=false;&lt;br /&gt;
&lt;br /&gt;
const uint8_t filterValue=12;&lt;br /&gt;
static uint8_t nbTrue=0;&lt;br /&gt;
static uint8_t nbFalse=0;&lt;br /&gt;
&lt;br /&gt;
if ( rawValue  )&lt;br /&gt;
{&lt;br /&gt;
   if ( nbTrue&amp;gt;= filterValue)&lt;br /&gt;
   {&lt;br /&gt;
     value=true;&lt;br /&gt;
     nbFalse=0;&lt;br /&gt;
   }&lt;br /&gt;
   else nbTrue++;&lt;br /&gt;
}&lt;br /&gt;
else&lt;br /&gt;
{&lt;br /&gt;
   if ( nbFalse&amp;gt;= filterValue)&lt;br /&gt;
   {&lt;br /&gt;
     value=false;&lt;br /&gt;
     nbTrue=0;&lt;br /&gt;
   }&lt;br /&gt;
   else nbFalse++;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|| &amp;lt;source lang=cpp&amp;gt;&lt;br /&gt;
void filtreTor(bool rawValue,bool &amp;amp; value,uint8_t filterValue,uint8_t &amp;amp; nbTrue,uint8_t &amp;amp; nbFalse)&lt;br /&gt;
{&lt;br /&gt;
  if ( rawValue  )&lt;br /&gt;
  {&lt;br /&gt;
    if ( nbTrue&amp;gt;= filterValue)&lt;br /&gt;
    {&lt;br /&gt;
      value=true;&lt;br /&gt;
      nbFalse=0;&lt;br /&gt;
    }&lt;br /&gt;
    else nbTrue++;&lt;br /&gt;
  }&lt;br /&gt;
  else&lt;br /&gt;
  {&lt;br /&gt;
    if ( nbFalse&amp;gt;= filterValue)&lt;br /&gt;
    {&lt;br /&gt;
      value=false;&lt;br /&gt;
      nbTrue=0;&lt;br /&gt;
    }&lt;br /&gt;
    else nbFalse++;&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
int main()&lt;br /&gt;
{&lt;br /&gt;
  ...&lt;br /&gt;
  bool rawValue=rawValueTab[i];&lt;br /&gt;
  static bool value=false;&lt;br /&gt;
&lt;br /&gt;
  const uint8_t filterValue=5;&lt;br /&gt;
  static uint8_t nbTrue=0;&lt;br /&gt;
  static uint8_t nbFalse=0;&lt;br /&gt;
  filtreTor(rawValue,value,filterValue,nbTrue,nbFalse);&lt;br /&gt;
  ...&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===Optimiser l'exécution d'une fonction===&lt;br /&gt;
&amp;lt;source lang=cpp&amp;gt;&lt;br /&gt;
inline void setVitesse(int16_t vmG, int16_t vmD) __attribute__((always_inline));&lt;br /&gt;
&lt;br /&gt;
void setVitesse(int16_t vmG, int16_t vmD)&lt;br /&gt;
{&lt;br /&gt;
   // code de la fonction&lt;br /&gt;
   ...&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Diagramme d'état==&lt;br /&gt;
&lt;br /&gt;
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 :&lt;br /&gt;
&lt;br /&gt;
[[Media:TestFiniteStateMachine.zip]]&lt;br /&gt;
&lt;br /&gt;
==Composants Kicad==&lt;br /&gt;
&lt;br /&gt;
*Résistances :&lt;br /&gt;
**symbole R&lt;br /&gt;
**boitier suivant la valeur : 1206(CMS)/Axial DIN0309 (traversant)&lt;br /&gt;
*Condensateur&lt;br /&gt;
**symbole C&lt;br /&gt;
**boitier suivant la valeur 1206(CMS)&lt;br /&gt;
*VNH7070&lt;br /&gt;
**télécharger et décompresser le fichier [[Media:VNH7070BASTR.zip]]&lt;br /&gt;
**ajouter la librairie en suivante la page : https://www.snapeda.com/about/import/#KiCad6&lt;br /&gt;
**{{Rouge|attention}} : pour l'ajout de la librairie de l'empreinte, indique comme &amp;quot;pseudo nom&amp;quot; {{Rouge|VNH7070BASTR}}&lt;br /&gt;
**modèle 3d&lt;br /&gt;
***ajouter le fichier VNH7070BASTR.step&lt;br /&gt;
***faire une rotation sur X de 90°&lt;br /&gt;
*Arduino Nano&lt;br /&gt;
**symbole Arduino_Nano_v2.x&lt;br /&gt;
**modèle 3d&lt;br /&gt;
***télécharger et décompresser : [[Media:Arduino_nano.STEP.zip]]&lt;br /&gt;
***dans les propriétés de la carte (éditeur de pcb), onglet modèle 3d&lt;br /&gt;
****ajouter le fichier téléchargé&lt;br /&gt;
****rotation X 90&lt;br /&gt;
****rotation Z -90&lt;br /&gt;
****décalage Z 11mm&lt;br /&gt;
***ajouter 2 barrettes M/F&lt;br /&gt;
***${KICAD9_3DMODEL_DIR}/Connector_PinSocket_2.54mm.3dshapes/PinSocket_1x15_P2.54mm_Vertical.step&lt;br /&gt;
***décaler le 2ème en X de 15,24mm&lt;br /&gt;
*bornier à vis : Screw_Terminal_01x02&lt;br /&gt;
*MPU-9250&lt;br /&gt;
**mettre 2 barrettes sécables 4 contacts, espacées de 6 pas&lt;br /&gt;
**[[Media:SparkFun MPU-9250 Breakout.step.zip]]&lt;br /&gt;
*convertisseur de niveau&lt;br /&gt;
**convertisseur {{Rouge|gt1167}}&lt;br /&gt;
***utiliser la librairie : [[Media:GT117.zip]]&lt;br /&gt;
***documentation : [[Media:Gt1167.pdf]]&lt;br /&gt;
**convertisseur [https://www.sparkfun.com/sparkfun-logic-level-converter-bi-directional.html sparkfun {{Rouge|BOB-12009}}]&lt;br /&gt;
***utiliser la librairie : [[Media:BOB-12009.zip]]&lt;br /&gt;
***modèle 3d :&lt;br /&gt;
****BOB-12009.step &lt;br /&gt;
*****rotation 90/0/0&lt;br /&gt;
*****translation 0/0/9&lt;br /&gt;
****ajouter 2 barrettes M/F : ${KICAD9_3DMODEL_DIR}/Connector_PinSocket_2.54mm.3dshapes/PinSocket_1x06_P2.54mm_Vertical.step&lt;br /&gt;
*****rotation 0/0/0&lt;br /&gt;
*****translation 5.08/6.35/0 et -5.08/6.35/0&lt;br /&gt;
*Autres : [[Media:SaeS2_2025.zip]]&lt;br /&gt;
*GroveH : [[Media:groveH.zip]]&lt;br /&gt;
*Connecteur à vis : [[Media:1729131.zip]]&lt;/div&gt;</summary>
		<author><name>Bjacquot</name></author>	</entry>

	<entry>
		<id>http://wikigeii.iut-troyes.univ-reims.fr//index.php?title=Fichier:Gt1167.pdf&amp;diff=21002</id>
		<title>Fichier:Gt1167.pdf</title>
		<link rel="alternate" type="text/html" href="http://wikigeii.iut-troyes.univ-reims.fr//index.php?title=Fichier:Gt1167.pdf&amp;diff=21002"/>
				<updated>2026-05-15T17:36:09Z</updated>
		
		<summary type="html">&lt;p&gt;Bjacquot : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Bjacquot</name></author>	</entry>

	<entry>
		<id>http://wikigeii.iut-troyes.univ-reims.fr//index.php?title=Cours:SaeRobotique&amp;diff=21001</id>
		<title>Cours:SaeRobotique</title>
		<link rel="alternate" type="text/html" href="http://wikigeii.iut-troyes.univ-reims.fr//index.php?title=Cours:SaeRobotique&amp;diff=21001"/>
				<updated>2026-05-15T17:35:56Z</updated>
		
		<summary type="html">&lt;p&gt;Bjacquot : /* Composants Kicad */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
[[Cours:SaeRobotique correction|{{Vert|&amp;lt;big&amp;gt;&amp;lt;big&amp;gt;Corrections enseignants&amp;lt;/big&amp;gt;&amp;lt;/big&amp;gt;}}]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Cours:SaeRobotiqueSuiviLigne]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Cours:SaeRobotiqueTennis]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=Ressources communes=&lt;br /&gt;
&lt;br /&gt;
==structure du programme==&lt;br /&gt;
&lt;br /&gt;
Vous pourrez utiliser la structure de programme suivante :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=cpp&amp;gt;&lt;br /&gt;
enum state {etapeInit,etapeChercheBalle,etapeDeplacementVersBalle};&lt;br /&gt;
&lt;br /&gt;
state etapeSuivante=etapeInit;&lt;br /&gt;
state etapeActive=etapeInit;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
int main()&lt;br /&gt;
{&lt;br /&gt;
  while(1)&lt;br /&gt;
  {&lt;br /&gt;
    // lecture des capteurs en début de boucle&lt;br /&gt;
    switch (etapeActive)&lt;br /&gt;
    {&lt;br /&gt;
      case etapeInit:&lt;br /&gt;
&lt;br /&gt;
            // si ... etapeSuivante=&lt;br /&gt;
            break;&lt;br /&gt;
      case etapeChercheBalle:&lt;br /&gt;
&lt;br /&gt;
            // si ... etapeSuivante=&lt;br /&gt;
            break;&lt;br /&gt;
      case etapeDeplacementVersBalle:&lt;br /&gt;
&lt;br /&gt;
            // si ... etapeSuivante=&lt;br /&gt;
            break;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    // on modifie l'étape active pour la prochaine boucle&lt;br /&gt;
    etapeActive=etapeSuivante;&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Programmation : comment faire==&lt;br /&gt;
&lt;br /&gt;
===Exécuter une action une seule fois :===&lt;br /&gt;
&amp;lt;source lang=cpp&amp;gt;&lt;br /&gt;
while(1)&lt;br /&gt;
{&lt;br /&gt;
   static bool dejaFait=false;&lt;br /&gt;
   if (dejaFait==false)&lt;br /&gt;
   {&lt;br /&gt;
      executerMonAction();&lt;br /&gt;
      dejaFait=true;&lt;br /&gt;
   }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Répéter une action régulièrement===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;source lang=cpp&amp;gt;&lt;br /&gt;
void initFonctionsTempsArduino()&lt;br /&gt;
{&lt;br /&gt;
  sei();&lt;br /&gt;
  // marche pour 328p et 2560 et autres ...&lt;br /&gt;
  // à adapter suivant le µc&lt;br /&gt;
  // cf https://github.com/arduino/ArduinoCore-avr/blob/master/cores/arduino/wiring.c&lt;br /&gt;
  TCCR0A=(1&amp;lt;&amp;lt;WGM01)|(1&amp;lt;&amp;lt;WGM00);&lt;br /&gt;
  TCCR0B=(1&amp;lt;&amp;lt;CS01)|(1&amp;lt;&amp;lt;CS00);&lt;br /&gt;
  TIMSK0=(1&amp;lt;&amp;lt;TOIE0);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
int main()&lt;br /&gt;
{&lt;br /&gt;
  initFonctionsTempsArduino();&lt;br /&gt;
  while(1)&lt;br /&gt;
  {&lt;br /&gt;
    static uint32_t triggerTime=millis();&lt;br /&gt;
    uint32_t currentTime=millis();&lt;br /&gt;
    if (currentTime&amp;gt;=triggerTime)&lt;br /&gt;
    {&lt;br /&gt;
       faireMonAction();&lt;br /&gt;
       triggerTime += 500; // prochaine exécution dans 500ms&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
||&lt;br /&gt;
&amp;lt;source lang=cpp&amp;gt;&lt;br /&gt;
void initFonctionsTempsArduino()&lt;br /&gt;
{&lt;br /&gt;
  sei();&lt;br /&gt;
  // marche pour 328p et 2560 et autres ...&lt;br /&gt;
  // à adapter suivant le µc&lt;br /&gt;
  // cf https://github.com/arduino/ArduinoCore-avr/blob/master/cores/arduino/wiring.c&lt;br /&gt;
  TCCR0A=(1&amp;lt;&amp;lt;WGM01)|(1&amp;lt;&amp;lt;WGM00);&lt;br /&gt;
  TCCR0B=(1&amp;lt;&amp;lt;CS01)|(1&amp;lt;&amp;lt;CS00);&lt;br /&gt;
  TIMSK0=(1&amp;lt;&amp;lt;TOIE0);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
int main()&lt;br /&gt;
{&lt;br /&gt;
  initFonctionsTempsArduino();&lt;br /&gt;
  while(1)&lt;br /&gt;
  {&lt;br /&gt;
    static uint32_t triggerTime=0;&lt;br /&gt;
    uint32_t currentTime=millis();&lt;br /&gt;
&lt;br /&gt;
    switch (etapeActive)&lt;br /&gt;
    {&lt;br /&gt;
      case etapeX:&lt;br /&gt;
            if ( qqch)&lt;br /&gt;
            {&lt;br /&gt;
               etapeSuivante=etapeY;&lt;br /&gt;
               triggerTime=currentTime;&lt;br /&gt;
            }&lt;br /&gt;
            break;&lt;br /&gt;
      case etapeY:&lt;br /&gt;
            if ( currentTime &amp;gt;= (triggerTime + duree ) )&lt;br /&gt;
            {&lt;br /&gt;
               etapeSuivante=etapeZ;&lt;br /&gt;
            }&lt;br /&gt;
            break;&lt;br /&gt;
      case etapeZ:&lt;br /&gt;
            ...&lt;br /&gt;
            break;&lt;br /&gt;
    }&lt;br /&gt;
    etapeActive=etapeSuivante;&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===Affichage provisoire pour deboggage===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{|&lt;br /&gt;
|-&lt;br /&gt;
| &lt;br /&gt;
&amp;lt;source lang=cpp&amp;gt;&lt;br /&gt;
#define debug   // mode debug&lt;br /&gt;
//ou&lt;br /&gt;
#undef debug // mode sans debug&lt;br /&gt;
&lt;br /&gt;
int main()&lt;br /&gt;
{&lt;br /&gt;
  ...&lt;br /&gt;
  while(1)&lt;br /&gt;
  {&lt;br /&gt;
    #ifdef debug&lt;br /&gt;
       Serial.println(&amp;quot;juste si debug&amp;quot;);&lt;br /&gt;
    #endif&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|| &lt;br /&gt;
&amp;lt;source lang=cpp&amp;gt;&lt;br /&gt;
#define DEBUG   //If you comment this line, the DEBUG_PRINT &amp;amp; DEBUG_PRINTLN lines are defined as blank.&lt;br /&gt;
#ifdef DEBUG    //Macros are usually in all capital letters.&lt;br /&gt;
   #define DEBUG_PRINT(...)    Serial.print(__VA_ARGS__)     //DEBUG_PRINT is a macro, debug print&lt;br /&gt;
   #define DEBUG_PRINTLN(...)  Serial.println(__VA_ARGS__)   //DEBUG_PRINTLN is a macro, debug print with new line&lt;br /&gt;
#else&lt;br /&gt;
   #define DEBUG_PRINT(...)     //now defines a blank line&lt;br /&gt;
   #define DEBUG_PRINTLN(...)   //now defines a blank line&lt;br /&gt;
#endif&lt;br /&gt;
int main()&lt;br /&gt;
{&lt;br /&gt;
  while(1)&lt;br /&gt;
  {&lt;br /&gt;
    DEBUG_PRINTLN(&amp;quot;juste si debug&amp;quot;);&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===changement d'état d'un capteur===&lt;br /&gt;
&lt;br /&gt;
{|&lt;br /&gt;
|-&lt;br /&gt;
! au front montant d'un capteur !! 1x si le capteur est actif suffisamment longtemps&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;source lang=cpp&amp;gt;&lt;br /&gt;
bool valeurActuelle=valeurInit;&lt;br /&gt;
bool valeurPrecedente=valeurInit;&lt;br /&gt;
&lt;br /&gt;
...&lt;br /&gt;
int main()&lt;br /&gt;
{&lt;br /&gt;
   ...&lt;br /&gt;
   while(1)&lt;br /&gt;
   {&lt;br /&gt;
      valeurPrecedente=valeurActuelle;&lt;br /&gt;
      valeurActuelle=lireValeurCapteur();&lt;br /&gt;
      if ( (valeurPrecedente==false) and (valeurActuelle==true) )&lt;br /&gt;
      {&lt;br /&gt;
         // action, par ex:&lt;br /&gt;
         nombreFrontMontant++;&lt;br /&gt;
      }&lt;br /&gt;
   }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|| &amp;lt;source lang=cpp&amp;gt;&lt;br /&gt;
bool valeurActuelle=valeurInit;&lt;br /&gt;
int8_t dureeActif=0;&lt;br /&gt;
bool isFront=true;&lt;br /&gt;
&lt;br /&gt;
...&lt;br /&gt;
int main()&lt;br /&gt;
{&lt;br /&gt;
   ...&lt;br /&gt;
   while(1)&lt;br /&gt;
   {&lt;br /&gt;
      valeurActuelle=lireValeurCapteur();&lt;br /&gt;
      if (valeurActuelle==true)&lt;br /&gt;
      {&lt;br /&gt;
         if (dureeActif&amp;gt;=20)&lt;br /&gt;
         {&lt;br /&gt;
            // faire l'action, par ex&lt;br /&gt;
            if (isFront==true)&lt;br /&gt;
            {&lt;br /&gt;
                isFront=false;&lt;br /&gt;
                nombreFrontMontant++;&lt;br /&gt;
            }&lt;br /&gt;
         }&lt;br /&gt;
         else dureeActif++;&lt;br /&gt;
      }&lt;br /&gt;
      else&lt;br /&gt;
      {&lt;br /&gt;
         dureeActif=0;&lt;br /&gt;
         isFront=true;&lt;br /&gt;
      }&lt;br /&gt;
   }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===filtrer un capteur tor===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! filtrer un capteur TOR !! sous forme de fonction pour filtrage de plusieurs capteurs&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;source lang=cpp&amp;gt;&lt;br /&gt;
&lt;br /&gt;
bool rawValue=readCapteur();&lt;br /&gt;
static bool value=false;&lt;br /&gt;
&lt;br /&gt;
const uint8_t filterValue=12;&lt;br /&gt;
static uint8_t nbTrue=0;&lt;br /&gt;
static uint8_t nbFalse=0;&lt;br /&gt;
&lt;br /&gt;
if ( rawValue  )&lt;br /&gt;
{&lt;br /&gt;
   if ( nbTrue&amp;gt;= filterValue)&lt;br /&gt;
   {&lt;br /&gt;
     value=true;&lt;br /&gt;
     nbFalse=0;&lt;br /&gt;
   }&lt;br /&gt;
   else nbTrue++;&lt;br /&gt;
}&lt;br /&gt;
else&lt;br /&gt;
{&lt;br /&gt;
   if ( nbFalse&amp;gt;= filterValue)&lt;br /&gt;
   {&lt;br /&gt;
     value=false;&lt;br /&gt;
     nbTrue=0;&lt;br /&gt;
   }&lt;br /&gt;
   else nbFalse++;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|| &amp;lt;source lang=cpp&amp;gt;&lt;br /&gt;
void filtreTor(bool rawValue,bool &amp;amp; value,uint8_t filterValue,uint8_t &amp;amp; nbTrue,uint8_t &amp;amp; nbFalse)&lt;br /&gt;
{&lt;br /&gt;
  if ( rawValue  )&lt;br /&gt;
  {&lt;br /&gt;
    if ( nbTrue&amp;gt;= filterValue)&lt;br /&gt;
    {&lt;br /&gt;
      value=true;&lt;br /&gt;
      nbFalse=0;&lt;br /&gt;
    }&lt;br /&gt;
    else nbTrue++;&lt;br /&gt;
  }&lt;br /&gt;
  else&lt;br /&gt;
  {&lt;br /&gt;
    if ( nbFalse&amp;gt;= filterValue)&lt;br /&gt;
    {&lt;br /&gt;
      value=false;&lt;br /&gt;
      nbTrue=0;&lt;br /&gt;
    }&lt;br /&gt;
    else nbFalse++;&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
int main()&lt;br /&gt;
{&lt;br /&gt;
  ...&lt;br /&gt;
  bool rawValue=rawValueTab[i];&lt;br /&gt;
  static bool value=false;&lt;br /&gt;
&lt;br /&gt;
  const uint8_t filterValue=5;&lt;br /&gt;
  static uint8_t nbTrue=0;&lt;br /&gt;
  static uint8_t nbFalse=0;&lt;br /&gt;
  filtreTor(rawValue,value,filterValue,nbTrue,nbFalse);&lt;br /&gt;
  ...&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===Optimiser l'exécution d'une fonction===&lt;br /&gt;
&amp;lt;source lang=cpp&amp;gt;&lt;br /&gt;
inline void setVitesse(int16_t vmG, int16_t vmD) __attribute__((always_inline));&lt;br /&gt;
&lt;br /&gt;
void setVitesse(int16_t vmG, int16_t vmD)&lt;br /&gt;
{&lt;br /&gt;
   // code de la fonction&lt;br /&gt;
   ...&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Diagramme d'état==&lt;br /&gt;
&lt;br /&gt;
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 :&lt;br /&gt;
&lt;br /&gt;
[[Media:TestFiniteStateMachine.zip]]&lt;br /&gt;
&lt;br /&gt;
==Composants Kicad==&lt;br /&gt;
&lt;br /&gt;
*Résistances :&lt;br /&gt;
**symbole R&lt;br /&gt;
**boitier suivant la valeur : 1206(CMS)/Axial DIN0309 (traversant)&lt;br /&gt;
*Condensateur&lt;br /&gt;
**symbole C&lt;br /&gt;
**boitier suivant la valeur 1206(CMS)&lt;br /&gt;
*VNH7070&lt;br /&gt;
**télécharger et décompresser le fichier [[Media:VNH7070BASTR.zip]]&lt;br /&gt;
**ajouter la librairie en suivante la page : https://www.snapeda.com/about/import/#KiCad6&lt;br /&gt;
**{{Rouge|attention}} : pour l'ajout de la librairie de l'empreinte, indique comme &amp;quot;pseudo nom&amp;quot; {{Rouge|VNH7070BASTR}}&lt;br /&gt;
**modèle 3d&lt;br /&gt;
***ajouter le fichier VNH7070BASTR.step&lt;br /&gt;
***faire une rotation sur X de 90°&lt;br /&gt;
*Arduino Nano&lt;br /&gt;
**symbole Arduino_Nano_v2.x&lt;br /&gt;
**modèle 3d&lt;br /&gt;
***télécharger et décompresser : [[Media:Arduino_nano.STEP.zip]]&lt;br /&gt;
***dans les propriétés de la carte (éditeur de pcb), onglet modèle 3d&lt;br /&gt;
****ajouter le fichier téléchargé&lt;br /&gt;
****rotation X 90&lt;br /&gt;
****rotation Z -90&lt;br /&gt;
****décalage Z 11mm&lt;br /&gt;
***ajouter 2 barrettes M/F&lt;br /&gt;
***${KICAD9_3DMODEL_DIR}/Connector_PinSocket_2.54mm.3dshapes/PinSocket_1x15_P2.54mm_Vertical.step&lt;br /&gt;
***décaler le 2ème en X de 15,24mm&lt;br /&gt;
*bornier à vis : Screw_Terminal_01x02&lt;br /&gt;
*MPU-9250&lt;br /&gt;
**mettre 2 barrettes sécables 4 contacts, espacées de 6 pas&lt;br /&gt;
**[[Media:SparkFun MPU-9250 Breakout.step.zip]]&lt;br /&gt;
*convertisseur de niveau&lt;br /&gt;
**convertisseur {{Rouge|gt1167}}&lt;br /&gt;
***utiliser la librairie : [[Media:GT117.zip]]&lt;br /&gt;
***&lt;br /&gt;
**convertisseur [https://www.sparkfun.com/sparkfun-logic-level-converter-bi-directional.html sparkfun {{Rouge|BOB-12009}}]&lt;br /&gt;
***utiliser la librairie : [[Media:BOB-12009.zip]]&lt;br /&gt;
***modèle 3d :&lt;br /&gt;
****BOB-12009.step &lt;br /&gt;
*****rotation 90/0/0&lt;br /&gt;
*****translation 0/0/9&lt;br /&gt;
****ajouter 2 barrettes M/F : ${KICAD9_3DMODEL_DIR}/Connector_PinSocket_2.54mm.3dshapes/PinSocket_1x06_P2.54mm_Vertical.step&lt;br /&gt;
*****rotation 0/0/0&lt;br /&gt;
*****translation 5.08/6.35/0 et -5.08/6.35/0&lt;br /&gt;
*Autres : [[Media:SaeS2_2025.zip]]&lt;br /&gt;
*GroveH : [[Media:groveH.zip]]&lt;br /&gt;
*Connecteur à vis : [[Media:1729131.zip]]&lt;/div&gt;</summary>
		<author><name>Bjacquot</name></author>	</entry>

	<entry>
		<id>http://wikigeii.iut-troyes.univ-reims.fr//index.php?title=Cours:SaeRobotique&amp;diff=21000</id>
		<title>Cours:SaeRobotique</title>
		<link rel="alternate" type="text/html" href="http://wikigeii.iut-troyes.univ-reims.fr//index.php?title=Cours:SaeRobotique&amp;diff=21000"/>
				<updated>2026-05-15T17:34:53Z</updated>
		
		<summary type="html">&lt;p&gt;Bjacquot : /* Composants Kicad */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
[[Cours:SaeRobotique correction|{{Vert|&amp;lt;big&amp;gt;&amp;lt;big&amp;gt;Corrections enseignants&amp;lt;/big&amp;gt;&amp;lt;/big&amp;gt;}}]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Cours:SaeRobotiqueSuiviLigne]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Cours:SaeRobotiqueTennis]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=Ressources communes=&lt;br /&gt;
&lt;br /&gt;
==structure du programme==&lt;br /&gt;
&lt;br /&gt;
Vous pourrez utiliser la structure de programme suivante :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=cpp&amp;gt;&lt;br /&gt;
enum state {etapeInit,etapeChercheBalle,etapeDeplacementVersBalle};&lt;br /&gt;
&lt;br /&gt;
state etapeSuivante=etapeInit;&lt;br /&gt;
state etapeActive=etapeInit;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
int main()&lt;br /&gt;
{&lt;br /&gt;
  while(1)&lt;br /&gt;
  {&lt;br /&gt;
    // lecture des capteurs en début de boucle&lt;br /&gt;
    switch (etapeActive)&lt;br /&gt;
    {&lt;br /&gt;
      case etapeInit:&lt;br /&gt;
&lt;br /&gt;
            // si ... etapeSuivante=&lt;br /&gt;
            break;&lt;br /&gt;
      case etapeChercheBalle:&lt;br /&gt;
&lt;br /&gt;
            // si ... etapeSuivante=&lt;br /&gt;
            break;&lt;br /&gt;
      case etapeDeplacementVersBalle:&lt;br /&gt;
&lt;br /&gt;
            // si ... etapeSuivante=&lt;br /&gt;
            break;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    // on modifie l'étape active pour la prochaine boucle&lt;br /&gt;
    etapeActive=etapeSuivante;&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Programmation : comment faire==&lt;br /&gt;
&lt;br /&gt;
===Exécuter une action une seule fois :===&lt;br /&gt;
&amp;lt;source lang=cpp&amp;gt;&lt;br /&gt;
while(1)&lt;br /&gt;
{&lt;br /&gt;
   static bool dejaFait=false;&lt;br /&gt;
   if (dejaFait==false)&lt;br /&gt;
   {&lt;br /&gt;
      executerMonAction();&lt;br /&gt;
      dejaFait=true;&lt;br /&gt;
   }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Répéter une action régulièrement===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;source lang=cpp&amp;gt;&lt;br /&gt;
void initFonctionsTempsArduino()&lt;br /&gt;
{&lt;br /&gt;
  sei();&lt;br /&gt;
  // marche pour 328p et 2560 et autres ...&lt;br /&gt;
  // à adapter suivant le µc&lt;br /&gt;
  // cf https://github.com/arduino/ArduinoCore-avr/blob/master/cores/arduino/wiring.c&lt;br /&gt;
  TCCR0A=(1&amp;lt;&amp;lt;WGM01)|(1&amp;lt;&amp;lt;WGM00);&lt;br /&gt;
  TCCR0B=(1&amp;lt;&amp;lt;CS01)|(1&amp;lt;&amp;lt;CS00);&lt;br /&gt;
  TIMSK0=(1&amp;lt;&amp;lt;TOIE0);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
int main()&lt;br /&gt;
{&lt;br /&gt;
  initFonctionsTempsArduino();&lt;br /&gt;
  while(1)&lt;br /&gt;
  {&lt;br /&gt;
    static uint32_t triggerTime=millis();&lt;br /&gt;
    uint32_t currentTime=millis();&lt;br /&gt;
    if (currentTime&amp;gt;=triggerTime)&lt;br /&gt;
    {&lt;br /&gt;
       faireMonAction();&lt;br /&gt;
       triggerTime += 500; // prochaine exécution dans 500ms&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
||&lt;br /&gt;
&amp;lt;source lang=cpp&amp;gt;&lt;br /&gt;
void initFonctionsTempsArduino()&lt;br /&gt;
{&lt;br /&gt;
  sei();&lt;br /&gt;
  // marche pour 328p et 2560 et autres ...&lt;br /&gt;
  // à adapter suivant le µc&lt;br /&gt;
  // cf https://github.com/arduino/ArduinoCore-avr/blob/master/cores/arduino/wiring.c&lt;br /&gt;
  TCCR0A=(1&amp;lt;&amp;lt;WGM01)|(1&amp;lt;&amp;lt;WGM00);&lt;br /&gt;
  TCCR0B=(1&amp;lt;&amp;lt;CS01)|(1&amp;lt;&amp;lt;CS00);&lt;br /&gt;
  TIMSK0=(1&amp;lt;&amp;lt;TOIE0);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
int main()&lt;br /&gt;
{&lt;br /&gt;
  initFonctionsTempsArduino();&lt;br /&gt;
  while(1)&lt;br /&gt;
  {&lt;br /&gt;
    static uint32_t triggerTime=0;&lt;br /&gt;
    uint32_t currentTime=millis();&lt;br /&gt;
&lt;br /&gt;
    switch (etapeActive)&lt;br /&gt;
    {&lt;br /&gt;
      case etapeX:&lt;br /&gt;
            if ( qqch)&lt;br /&gt;
            {&lt;br /&gt;
               etapeSuivante=etapeY;&lt;br /&gt;
               triggerTime=currentTime;&lt;br /&gt;
            }&lt;br /&gt;
            break;&lt;br /&gt;
      case etapeY:&lt;br /&gt;
            if ( currentTime &amp;gt;= (triggerTime + duree ) )&lt;br /&gt;
            {&lt;br /&gt;
               etapeSuivante=etapeZ;&lt;br /&gt;
            }&lt;br /&gt;
            break;&lt;br /&gt;
      case etapeZ:&lt;br /&gt;
            ...&lt;br /&gt;
            break;&lt;br /&gt;
    }&lt;br /&gt;
    etapeActive=etapeSuivante;&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===Affichage provisoire pour deboggage===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{|&lt;br /&gt;
|-&lt;br /&gt;
| &lt;br /&gt;
&amp;lt;source lang=cpp&amp;gt;&lt;br /&gt;
#define debug   // mode debug&lt;br /&gt;
//ou&lt;br /&gt;
#undef debug // mode sans debug&lt;br /&gt;
&lt;br /&gt;
int main()&lt;br /&gt;
{&lt;br /&gt;
  ...&lt;br /&gt;
  while(1)&lt;br /&gt;
  {&lt;br /&gt;
    #ifdef debug&lt;br /&gt;
       Serial.println(&amp;quot;juste si debug&amp;quot;);&lt;br /&gt;
    #endif&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|| &lt;br /&gt;
&amp;lt;source lang=cpp&amp;gt;&lt;br /&gt;
#define DEBUG   //If you comment this line, the DEBUG_PRINT &amp;amp; DEBUG_PRINTLN lines are defined as blank.&lt;br /&gt;
#ifdef DEBUG    //Macros are usually in all capital letters.&lt;br /&gt;
   #define DEBUG_PRINT(...)    Serial.print(__VA_ARGS__)     //DEBUG_PRINT is a macro, debug print&lt;br /&gt;
   #define DEBUG_PRINTLN(...)  Serial.println(__VA_ARGS__)   //DEBUG_PRINTLN is a macro, debug print with new line&lt;br /&gt;
#else&lt;br /&gt;
   #define DEBUG_PRINT(...)     //now defines a blank line&lt;br /&gt;
   #define DEBUG_PRINTLN(...)   //now defines a blank line&lt;br /&gt;
#endif&lt;br /&gt;
int main()&lt;br /&gt;
{&lt;br /&gt;
  while(1)&lt;br /&gt;
  {&lt;br /&gt;
    DEBUG_PRINTLN(&amp;quot;juste si debug&amp;quot;);&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===changement d'état d'un capteur===&lt;br /&gt;
&lt;br /&gt;
{|&lt;br /&gt;
|-&lt;br /&gt;
! au front montant d'un capteur !! 1x si le capteur est actif suffisamment longtemps&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;source lang=cpp&amp;gt;&lt;br /&gt;
bool valeurActuelle=valeurInit;&lt;br /&gt;
bool valeurPrecedente=valeurInit;&lt;br /&gt;
&lt;br /&gt;
...&lt;br /&gt;
int main()&lt;br /&gt;
{&lt;br /&gt;
   ...&lt;br /&gt;
   while(1)&lt;br /&gt;
   {&lt;br /&gt;
      valeurPrecedente=valeurActuelle;&lt;br /&gt;
      valeurActuelle=lireValeurCapteur();&lt;br /&gt;
      if ( (valeurPrecedente==false) and (valeurActuelle==true) )&lt;br /&gt;
      {&lt;br /&gt;
         // action, par ex:&lt;br /&gt;
         nombreFrontMontant++;&lt;br /&gt;
      }&lt;br /&gt;
   }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|| &amp;lt;source lang=cpp&amp;gt;&lt;br /&gt;
bool valeurActuelle=valeurInit;&lt;br /&gt;
int8_t dureeActif=0;&lt;br /&gt;
bool isFront=true;&lt;br /&gt;
&lt;br /&gt;
...&lt;br /&gt;
int main()&lt;br /&gt;
{&lt;br /&gt;
   ...&lt;br /&gt;
   while(1)&lt;br /&gt;
   {&lt;br /&gt;
      valeurActuelle=lireValeurCapteur();&lt;br /&gt;
      if (valeurActuelle==true)&lt;br /&gt;
      {&lt;br /&gt;
         if (dureeActif&amp;gt;=20)&lt;br /&gt;
         {&lt;br /&gt;
            // faire l'action, par ex&lt;br /&gt;
            if (isFront==true)&lt;br /&gt;
            {&lt;br /&gt;
                isFront=false;&lt;br /&gt;
                nombreFrontMontant++;&lt;br /&gt;
            }&lt;br /&gt;
         }&lt;br /&gt;
         else dureeActif++;&lt;br /&gt;
      }&lt;br /&gt;
      else&lt;br /&gt;
      {&lt;br /&gt;
         dureeActif=0;&lt;br /&gt;
         isFront=true;&lt;br /&gt;
      }&lt;br /&gt;
   }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===filtrer un capteur tor===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! filtrer un capteur TOR !! sous forme de fonction pour filtrage de plusieurs capteurs&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;source lang=cpp&amp;gt;&lt;br /&gt;
&lt;br /&gt;
bool rawValue=readCapteur();&lt;br /&gt;
static bool value=false;&lt;br /&gt;
&lt;br /&gt;
const uint8_t filterValue=12;&lt;br /&gt;
static uint8_t nbTrue=0;&lt;br /&gt;
static uint8_t nbFalse=0;&lt;br /&gt;
&lt;br /&gt;
if ( rawValue  )&lt;br /&gt;
{&lt;br /&gt;
   if ( nbTrue&amp;gt;= filterValue)&lt;br /&gt;
   {&lt;br /&gt;
     value=true;&lt;br /&gt;
     nbFalse=0;&lt;br /&gt;
   }&lt;br /&gt;
   else nbTrue++;&lt;br /&gt;
}&lt;br /&gt;
else&lt;br /&gt;
{&lt;br /&gt;
   if ( nbFalse&amp;gt;= filterValue)&lt;br /&gt;
   {&lt;br /&gt;
     value=false;&lt;br /&gt;
     nbTrue=0;&lt;br /&gt;
   }&lt;br /&gt;
   else nbFalse++;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|| &amp;lt;source lang=cpp&amp;gt;&lt;br /&gt;
void filtreTor(bool rawValue,bool &amp;amp; value,uint8_t filterValue,uint8_t &amp;amp; nbTrue,uint8_t &amp;amp; nbFalse)&lt;br /&gt;
{&lt;br /&gt;
  if ( rawValue  )&lt;br /&gt;
  {&lt;br /&gt;
    if ( nbTrue&amp;gt;= filterValue)&lt;br /&gt;
    {&lt;br /&gt;
      value=true;&lt;br /&gt;
      nbFalse=0;&lt;br /&gt;
    }&lt;br /&gt;
    else nbTrue++;&lt;br /&gt;
  }&lt;br /&gt;
  else&lt;br /&gt;
  {&lt;br /&gt;
    if ( nbFalse&amp;gt;= filterValue)&lt;br /&gt;
    {&lt;br /&gt;
      value=false;&lt;br /&gt;
      nbTrue=0;&lt;br /&gt;
    }&lt;br /&gt;
    else nbFalse++;&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
int main()&lt;br /&gt;
{&lt;br /&gt;
  ...&lt;br /&gt;
  bool rawValue=rawValueTab[i];&lt;br /&gt;
  static bool value=false;&lt;br /&gt;
&lt;br /&gt;
  const uint8_t filterValue=5;&lt;br /&gt;
  static uint8_t nbTrue=0;&lt;br /&gt;
  static uint8_t nbFalse=0;&lt;br /&gt;
  filtreTor(rawValue,value,filterValue,nbTrue,nbFalse);&lt;br /&gt;
  ...&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===Optimiser l'exécution d'une fonction===&lt;br /&gt;
&amp;lt;source lang=cpp&amp;gt;&lt;br /&gt;
inline void setVitesse(int16_t vmG, int16_t vmD) __attribute__((always_inline));&lt;br /&gt;
&lt;br /&gt;
void setVitesse(int16_t vmG, int16_t vmD)&lt;br /&gt;
{&lt;br /&gt;
   // code de la fonction&lt;br /&gt;
   ...&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Diagramme d'état==&lt;br /&gt;
&lt;br /&gt;
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 :&lt;br /&gt;
&lt;br /&gt;
[[Media:TestFiniteStateMachine.zip]]&lt;br /&gt;
&lt;br /&gt;
==Composants Kicad==&lt;br /&gt;
&lt;br /&gt;
*Résistances :&lt;br /&gt;
**symbole R&lt;br /&gt;
**boitier suivant la valeur : 1206(CMS)/Axial DIN0309 (traversant)&lt;br /&gt;
*Condensateur&lt;br /&gt;
**symbole C&lt;br /&gt;
**boitier suivant la valeur 1206(CMS)&lt;br /&gt;
*VNH7070&lt;br /&gt;
**télécharger et décompresser le fichier [[Media:VNH7070BASTR.zip]]&lt;br /&gt;
**ajouter la librairie en suivante la page : https://www.snapeda.com/about/import/#KiCad6&lt;br /&gt;
**{{Rouge|attention}} : pour l'ajout de la librairie de l'empreinte, indique comme &amp;quot;pseudo nom&amp;quot; {{Rouge|VNH7070BASTR}}&lt;br /&gt;
**modèle 3d&lt;br /&gt;
***ajouter le fichier VNH7070BASTR.step&lt;br /&gt;
***faire une rotation sur X de 90°&lt;br /&gt;
*Arduino Nano&lt;br /&gt;
**symbole Arduino_Nano_v2.x&lt;br /&gt;
**modèle 3d&lt;br /&gt;
***télécharger et décompresser : [[Media:Arduino_nano.STEP.zip]]&lt;br /&gt;
***dans les propriétés de la carte (éditeur de pcb), onglet modèle 3d&lt;br /&gt;
****ajouter le fichier téléchargé&lt;br /&gt;
****rotation X 90&lt;br /&gt;
****rotation Z -90&lt;br /&gt;
****décalage Z 11mm&lt;br /&gt;
***ajouter 2 barrettes M/F&lt;br /&gt;
***${KICAD9_3DMODEL_DIR}/Connector_PinSocket_2.54mm.3dshapes/PinSocket_1x15_P2.54mm_Vertical.step&lt;br /&gt;
***décaler le 2ème en X de 15,24mm&lt;br /&gt;
*bornier à vis : Screw_Terminal_01x02&lt;br /&gt;
*MPU-9250&lt;br /&gt;
**mettre 2 barrettes sécables 4 contacts, espacées de 6 pas&lt;br /&gt;
**[[Media:SparkFun MPU-9250 Breakout.step.zip]]&lt;br /&gt;
*convertisseur de niveau&lt;br /&gt;
**convertisseur gt1167 :utiliser la librairie : [[Media:GT117.zip]]&lt;br /&gt;
**convertisseur [https://www.sparkfun.com/sparkfun-logic-level-converter-bi-directional.html sparkfun BOB-12009]&lt;br /&gt;
***utiliser la librairie : [[Media:BOB-12009.zip]]&lt;br /&gt;
***modèle 3d :&lt;br /&gt;
****BOB-12009.step &lt;br /&gt;
*****rotation 90/0/0&lt;br /&gt;
*****translation 0/0/9&lt;br /&gt;
****ajouter 2 barrettes M/F : ${KICAD9_3DMODEL_DIR}/Connector_PinSocket_2.54mm.3dshapes/PinSocket_1x06_P2.54mm_Vertical.step&lt;br /&gt;
*****rotation 0/0/0&lt;br /&gt;
*****translation 5.08/6.35/0 et -5.08/6.35/0&lt;br /&gt;
*Autres : [[Media:SaeS2_2025.zip]]&lt;br /&gt;
*GroveH : [[Media:groveH.zip]]&lt;br /&gt;
*Connecteur à vis : [[Media:1729131.zip]]&lt;/div&gt;</summary>
		<author><name>Bjacquot</name></author>	</entry>

	<entry>
		<id>http://wikigeii.iut-troyes.univ-reims.fr//index.php?title=Cours:SaeRobotique&amp;diff=20999</id>
		<title>Cours:SaeRobotique</title>
		<link rel="alternate" type="text/html" href="http://wikigeii.iut-troyes.univ-reims.fr//index.php?title=Cours:SaeRobotique&amp;diff=20999"/>
				<updated>2026-05-15T17:34:36Z</updated>
		
		<summary type="html">&lt;p&gt;Bjacquot : /* Composants Kicad */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
[[Cours:SaeRobotique correction|{{Vert|&amp;lt;big&amp;gt;&amp;lt;big&amp;gt;Corrections enseignants&amp;lt;/big&amp;gt;&amp;lt;/big&amp;gt;}}]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Cours:SaeRobotiqueSuiviLigne]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Cours:SaeRobotiqueTennis]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=Ressources communes=&lt;br /&gt;
&lt;br /&gt;
==structure du programme==&lt;br /&gt;
&lt;br /&gt;
Vous pourrez utiliser la structure de programme suivante :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=cpp&amp;gt;&lt;br /&gt;
enum state {etapeInit,etapeChercheBalle,etapeDeplacementVersBalle};&lt;br /&gt;
&lt;br /&gt;
state etapeSuivante=etapeInit;&lt;br /&gt;
state etapeActive=etapeInit;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
int main()&lt;br /&gt;
{&lt;br /&gt;
  while(1)&lt;br /&gt;
  {&lt;br /&gt;
    // lecture des capteurs en début de boucle&lt;br /&gt;
    switch (etapeActive)&lt;br /&gt;
    {&lt;br /&gt;
      case etapeInit:&lt;br /&gt;
&lt;br /&gt;
            // si ... etapeSuivante=&lt;br /&gt;
            break;&lt;br /&gt;
      case etapeChercheBalle:&lt;br /&gt;
&lt;br /&gt;
            // si ... etapeSuivante=&lt;br /&gt;
            break;&lt;br /&gt;
      case etapeDeplacementVersBalle:&lt;br /&gt;
&lt;br /&gt;
            // si ... etapeSuivante=&lt;br /&gt;
            break;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    // on modifie l'étape active pour la prochaine boucle&lt;br /&gt;
    etapeActive=etapeSuivante;&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Programmation : comment faire==&lt;br /&gt;
&lt;br /&gt;
===Exécuter une action une seule fois :===&lt;br /&gt;
&amp;lt;source lang=cpp&amp;gt;&lt;br /&gt;
while(1)&lt;br /&gt;
{&lt;br /&gt;
   static bool dejaFait=false;&lt;br /&gt;
   if (dejaFait==false)&lt;br /&gt;
   {&lt;br /&gt;
      executerMonAction();&lt;br /&gt;
      dejaFait=true;&lt;br /&gt;
   }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Répéter une action régulièrement===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;source lang=cpp&amp;gt;&lt;br /&gt;
void initFonctionsTempsArduino()&lt;br /&gt;
{&lt;br /&gt;
  sei();&lt;br /&gt;
  // marche pour 328p et 2560 et autres ...&lt;br /&gt;
  // à adapter suivant le µc&lt;br /&gt;
  // cf https://github.com/arduino/ArduinoCore-avr/blob/master/cores/arduino/wiring.c&lt;br /&gt;
  TCCR0A=(1&amp;lt;&amp;lt;WGM01)|(1&amp;lt;&amp;lt;WGM00);&lt;br /&gt;
  TCCR0B=(1&amp;lt;&amp;lt;CS01)|(1&amp;lt;&amp;lt;CS00);&lt;br /&gt;
  TIMSK0=(1&amp;lt;&amp;lt;TOIE0);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
int main()&lt;br /&gt;
{&lt;br /&gt;
  initFonctionsTempsArduino();&lt;br /&gt;
  while(1)&lt;br /&gt;
  {&lt;br /&gt;
    static uint32_t triggerTime=millis();&lt;br /&gt;
    uint32_t currentTime=millis();&lt;br /&gt;
    if (currentTime&amp;gt;=triggerTime)&lt;br /&gt;
    {&lt;br /&gt;
       faireMonAction();&lt;br /&gt;
       triggerTime += 500; // prochaine exécution dans 500ms&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
||&lt;br /&gt;
&amp;lt;source lang=cpp&amp;gt;&lt;br /&gt;
void initFonctionsTempsArduino()&lt;br /&gt;
{&lt;br /&gt;
  sei();&lt;br /&gt;
  // marche pour 328p et 2560 et autres ...&lt;br /&gt;
  // à adapter suivant le µc&lt;br /&gt;
  // cf https://github.com/arduino/ArduinoCore-avr/blob/master/cores/arduino/wiring.c&lt;br /&gt;
  TCCR0A=(1&amp;lt;&amp;lt;WGM01)|(1&amp;lt;&amp;lt;WGM00);&lt;br /&gt;
  TCCR0B=(1&amp;lt;&amp;lt;CS01)|(1&amp;lt;&amp;lt;CS00);&lt;br /&gt;
  TIMSK0=(1&amp;lt;&amp;lt;TOIE0);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
int main()&lt;br /&gt;
{&lt;br /&gt;
  initFonctionsTempsArduino();&lt;br /&gt;
  while(1)&lt;br /&gt;
  {&lt;br /&gt;
    static uint32_t triggerTime=0;&lt;br /&gt;
    uint32_t currentTime=millis();&lt;br /&gt;
&lt;br /&gt;
    switch (etapeActive)&lt;br /&gt;
    {&lt;br /&gt;
      case etapeX:&lt;br /&gt;
            if ( qqch)&lt;br /&gt;
            {&lt;br /&gt;
               etapeSuivante=etapeY;&lt;br /&gt;
               triggerTime=currentTime;&lt;br /&gt;
            }&lt;br /&gt;
            break;&lt;br /&gt;
      case etapeY:&lt;br /&gt;
            if ( currentTime &amp;gt;= (triggerTime + duree ) )&lt;br /&gt;
            {&lt;br /&gt;
               etapeSuivante=etapeZ;&lt;br /&gt;
            }&lt;br /&gt;
            break;&lt;br /&gt;
      case etapeZ:&lt;br /&gt;
            ...&lt;br /&gt;
            break;&lt;br /&gt;
    }&lt;br /&gt;
    etapeActive=etapeSuivante;&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===Affichage provisoire pour deboggage===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{|&lt;br /&gt;
|-&lt;br /&gt;
| &lt;br /&gt;
&amp;lt;source lang=cpp&amp;gt;&lt;br /&gt;
#define debug   // mode debug&lt;br /&gt;
//ou&lt;br /&gt;
#undef debug // mode sans debug&lt;br /&gt;
&lt;br /&gt;
int main()&lt;br /&gt;
{&lt;br /&gt;
  ...&lt;br /&gt;
  while(1)&lt;br /&gt;
  {&lt;br /&gt;
    #ifdef debug&lt;br /&gt;
       Serial.println(&amp;quot;juste si debug&amp;quot;);&lt;br /&gt;
    #endif&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|| &lt;br /&gt;
&amp;lt;source lang=cpp&amp;gt;&lt;br /&gt;
#define DEBUG   //If you comment this line, the DEBUG_PRINT &amp;amp; DEBUG_PRINTLN lines are defined as blank.&lt;br /&gt;
#ifdef DEBUG    //Macros are usually in all capital letters.&lt;br /&gt;
   #define DEBUG_PRINT(...)    Serial.print(__VA_ARGS__)     //DEBUG_PRINT is a macro, debug print&lt;br /&gt;
   #define DEBUG_PRINTLN(...)  Serial.println(__VA_ARGS__)   //DEBUG_PRINTLN is a macro, debug print with new line&lt;br /&gt;
#else&lt;br /&gt;
   #define DEBUG_PRINT(...)     //now defines a blank line&lt;br /&gt;
   #define DEBUG_PRINTLN(...)   //now defines a blank line&lt;br /&gt;
#endif&lt;br /&gt;
int main()&lt;br /&gt;
{&lt;br /&gt;
  while(1)&lt;br /&gt;
  {&lt;br /&gt;
    DEBUG_PRINTLN(&amp;quot;juste si debug&amp;quot;);&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===changement d'état d'un capteur===&lt;br /&gt;
&lt;br /&gt;
{|&lt;br /&gt;
|-&lt;br /&gt;
! au front montant d'un capteur !! 1x si le capteur est actif suffisamment longtemps&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;source lang=cpp&amp;gt;&lt;br /&gt;
bool valeurActuelle=valeurInit;&lt;br /&gt;
bool valeurPrecedente=valeurInit;&lt;br /&gt;
&lt;br /&gt;
...&lt;br /&gt;
int main()&lt;br /&gt;
{&lt;br /&gt;
   ...&lt;br /&gt;
   while(1)&lt;br /&gt;
   {&lt;br /&gt;
      valeurPrecedente=valeurActuelle;&lt;br /&gt;
      valeurActuelle=lireValeurCapteur();&lt;br /&gt;
      if ( (valeurPrecedente==false) and (valeurActuelle==true) )&lt;br /&gt;
      {&lt;br /&gt;
         // action, par ex:&lt;br /&gt;
         nombreFrontMontant++;&lt;br /&gt;
      }&lt;br /&gt;
   }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|| &amp;lt;source lang=cpp&amp;gt;&lt;br /&gt;
bool valeurActuelle=valeurInit;&lt;br /&gt;
int8_t dureeActif=0;&lt;br /&gt;
bool isFront=true;&lt;br /&gt;
&lt;br /&gt;
...&lt;br /&gt;
int main()&lt;br /&gt;
{&lt;br /&gt;
   ...&lt;br /&gt;
   while(1)&lt;br /&gt;
   {&lt;br /&gt;
      valeurActuelle=lireValeurCapteur();&lt;br /&gt;
      if (valeurActuelle==true)&lt;br /&gt;
      {&lt;br /&gt;
         if (dureeActif&amp;gt;=20)&lt;br /&gt;
         {&lt;br /&gt;
            // faire l'action, par ex&lt;br /&gt;
            if (isFront==true)&lt;br /&gt;
            {&lt;br /&gt;
                isFront=false;&lt;br /&gt;
                nombreFrontMontant++;&lt;br /&gt;
            }&lt;br /&gt;
         }&lt;br /&gt;
         else dureeActif++;&lt;br /&gt;
      }&lt;br /&gt;
      else&lt;br /&gt;
      {&lt;br /&gt;
         dureeActif=0;&lt;br /&gt;
         isFront=true;&lt;br /&gt;
      }&lt;br /&gt;
   }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===filtrer un capteur tor===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! filtrer un capteur TOR !! sous forme de fonction pour filtrage de plusieurs capteurs&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;source lang=cpp&amp;gt;&lt;br /&gt;
&lt;br /&gt;
bool rawValue=readCapteur();&lt;br /&gt;
static bool value=false;&lt;br /&gt;
&lt;br /&gt;
const uint8_t filterValue=12;&lt;br /&gt;
static uint8_t nbTrue=0;&lt;br /&gt;
static uint8_t nbFalse=0;&lt;br /&gt;
&lt;br /&gt;
if ( rawValue  )&lt;br /&gt;
{&lt;br /&gt;
   if ( nbTrue&amp;gt;= filterValue)&lt;br /&gt;
   {&lt;br /&gt;
     value=true;&lt;br /&gt;
     nbFalse=0;&lt;br /&gt;
   }&lt;br /&gt;
   else nbTrue++;&lt;br /&gt;
}&lt;br /&gt;
else&lt;br /&gt;
{&lt;br /&gt;
   if ( nbFalse&amp;gt;= filterValue)&lt;br /&gt;
   {&lt;br /&gt;
     value=false;&lt;br /&gt;
     nbTrue=0;&lt;br /&gt;
   }&lt;br /&gt;
   else nbFalse++;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|| &amp;lt;source lang=cpp&amp;gt;&lt;br /&gt;
void filtreTor(bool rawValue,bool &amp;amp; value,uint8_t filterValue,uint8_t &amp;amp; nbTrue,uint8_t &amp;amp; nbFalse)&lt;br /&gt;
{&lt;br /&gt;
  if ( rawValue  )&lt;br /&gt;
  {&lt;br /&gt;
    if ( nbTrue&amp;gt;= filterValue)&lt;br /&gt;
    {&lt;br /&gt;
      value=true;&lt;br /&gt;
      nbFalse=0;&lt;br /&gt;
    }&lt;br /&gt;
    else nbTrue++;&lt;br /&gt;
  }&lt;br /&gt;
  else&lt;br /&gt;
  {&lt;br /&gt;
    if ( nbFalse&amp;gt;= filterValue)&lt;br /&gt;
    {&lt;br /&gt;
      value=false;&lt;br /&gt;
      nbTrue=0;&lt;br /&gt;
    }&lt;br /&gt;
    else nbFalse++;&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
int main()&lt;br /&gt;
{&lt;br /&gt;
  ...&lt;br /&gt;
  bool rawValue=rawValueTab[i];&lt;br /&gt;
  static bool value=false;&lt;br /&gt;
&lt;br /&gt;
  const uint8_t filterValue=5;&lt;br /&gt;
  static uint8_t nbTrue=0;&lt;br /&gt;
  static uint8_t nbFalse=0;&lt;br /&gt;
  filtreTor(rawValue,value,filterValue,nbTrue,nbFalse);&lt;br /&gt;
  ...&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===Optimiser l'exécution d'une fonction===&lt;br /&gt;
&amp;lt;source lang=cpp&amp;gt;&lt;br /&gt;
inline void setVitesse(int16_t vmG, int16_t vmD) __attribute__((always_inline));&lt;br /&gt;
&lt;br /&gt;
void setVitesse(int16_t vmG, int16_t vmD)&lt;br /&gt;
{&lt;br /&gt;
   // code de la fonction&lt;br /&gt;
   ...&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Diagramme d'état==&lt;br /&gt;
&lt;br /&gt;
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 :&lt;br /&gt;
&lt;br /&gt;
[[Media:TestFiniteStateMachine.zip]]&lt;br /&gt;
&lt;br /&gt;
==Composants Kicad==&lt;br /&gt;
&lt;br /&gt;
*Résistances :&lt;br /&gt;
**symbole R&lt;br /&gt;
**boitier suivant la valeur : 1206(CMS)/Axial DIN0309 (traversant)&lt;br /&gt;
*Condensateur&lt;br /&gt;
**symbole C&lt;br /&gt;
**boitier suivant la valeur 1206(CMS)&lt;br /&gt;
*VNH7070&lt;br /&gt;
**télécharger et décompresser le fichier [[Media:VNH7070BASTR.zip]]&lt;br /&gt;
**ajouter la librairie en suivante la page : https://www.snapeda.com/about/import/#KiCad6&lt;br /&gt;
**{{Rouge|attention}} : pour l'ajout de la librairie de l'empreinte, indique comme &amp;quot;pseudo nom&amp;quot; {{Rouge|VNH7070BASTR}}&lt;br /&gt;
**modèle 3d&lt;br /&gt;
***ajouter le fichier VNH7070BASTR.step&lt;br /&gt;
***faire une rotation sur X de 90°&lt;br /&gt;
*Arduino Nano&lt;br /&gt;
**symbole Arduino_Nano_v2.x&lt;br /&gt;
**modèle 3d&lt;br /&gt;
***télécharger et décompresser : [[Media:Arduino_nano.STEP.zip]]&lt;br /&gt;
***dans les propriétés de la carte (éditeur de pcb), onglet modèle 3d&lt;br /&gt;
****ajouter le fichier téléchargé&lt;br /&gt;
****rotation X 90&lt;br /&gt;
****rotation Z -90&lt;br /&gt;
****décalage Z 11mm&lt;br /&gt;
***ajouter 2 barrettes M/F&lt;br /&gt;
***${KICAD9_3DMODEL_DIR}/Connector_PinSocket_2.54mm.3dshapes/PinSocket_1x15_P2.54mm_Vertical.step&lt;br /&gt;
***décaler le 2ème en X de 15,24mm&lt;br /&gt;
*bornier à vis : Screw_Terminal_01x02&lt;br /&gt;
*MPU-9250&lt;br /&gt;
**mettre 2 barrettes sécables 4 contacts, espacées de 6 pas&lt;br /&gt;
**[[Media:SparkFun MPU-9250 Breakout.step.zip]]&lt;br /&gt;
*convertisseur de niveau&lt;br /&gt;
**convertisseur gt1167 :utiliser la librairie : [[Media:GT117.zip]]&lt;br /&gt;
*convertisseur [https://www.sparkfun.com/sparkfun-logic-level-converter-bi-directional.html sparkfun BOB-12009]&lt;br /&gt;
**utiliser la librairie : [[Media:BOB-12009.zip]]&lt;br /&gt;
**modèle 3d :&lt;br /&gt;
***BOB-12009.step &lt;br /&gt;
****rotation 90/0/0&lt;br /&gt;
****translation 0/0/9&lt;br /&gt;
***ajouter 2 barrettes M/F : ${KICAD9_3DMODEL_DIR}/Connector_PinSocket_2.54mm.3dshapes/PinSocket_1x06_P2.54mm_Vertical.step&lt;br /&gt;
****rotation 0/0/0&lt;br /&gt;
****translation 5.08/6.35/0 et -5.08/6.35/0&lt;br /&gt;
*Autres : [[Media:SaeS2_2025.zip]]&lt;br /&gt;
*GroveH : [[Media:groveH.zip]]&lt;br /&gt;
*Connecteur à vis : [[Media:1729131.zip]]&lt;/div&gt;</summary>
		<author><name>Bjacquot</name></author>	</entry>

	<entry>
		<id>http://wikigeii.iut-troyes.univ-reims.fr//index.php?title=Fichier:GT117.zip&amp;diff=20998</id>
		<title>Fichier:GT117.zip</title>
		<link rel="alternate" type="text/html" href="http://wikigeii.iut-troyes.univ-reims.fr//index.php?title=Fichier:GT117.zip&amp;diff=20998"/>
				<updated>2026-05-15T17:32:27Z</updated>
		
		<summary type="html">&lt;p&gt;Bjacquot : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Bjacquot</name></author>	</entry>

	<entry>
		<id>http://wikigeii.iut-troyes.univ-reims.fr//index.php?title=Cours:SaeRobotique&amp;diff=20997</id>
		<title>Cours:SaeRobotique</title>
		<link rel="alternate" type="text/html" href="http://wikigeii.iut-troyes.univ-reims.fr//index.php?title=Cours:SaeRobotique&amp;diff=20997"/>
				<updated>2026-05-15T15:38:44Z</updated>
		
		<summary type="html">&lt;p&gt;Bjacquot : /* Composants Kicad */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
[[Cours:SaeRobotique correction|{{Vert|&amp;lt;big&amp;gt;&amp;lt;big&amp;gt;Corrections enseignants&amp;lt;/big&amp;gt;&amp;lt;/big&amp;gt;}}]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Cours:SaeRobotiqueSuiviLigne]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Cours:SaeRobotiqueTennis]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=Ressources communes=&lt;br /&gt;
&lt;br /&gt;
==structure du programme==&lt;br /&gt;
&lt;br /&gt;
Vous pourrez utiliser la structure de programme suivante :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=cpp&amp;gt;&lt;br /&gt;
enum state {etapeInit,etapeChercheBalle,etapeDeplacementVersBalle};&lt;br /&gt;
&lt;br /&gt;
state etapeSuivante=etapeInit;&lt;br /&gt;
state etapeActive=etapeInit;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
int main()&lt;br /&gt;
{&lt;br /&gt;
  while(1)&lt;br /&gt;
  {&lt;br /&gt;
    // lecture des capteurs en début de boucle&lt;br /&gt;
    switch (etapeActive)&lt;br /&gt;
    {&lt;br /&gt;
      case etapeInit:&lt;br /&gt;
&lt;br /&gt;
            // si ... etapeSuivante=&lt;br /&gt;
            break;&lt;br /&gt;
      case etapeChercheBalle:&lt;br /&gt;
&lt;br /&gt;
            // si ... etapeSuivante=&lt;br /&gt;
            break;&lt;br /&gt;
      case etapeDeplacementVersBalle:&lt;br /&gt;
&lt;br /&gt;
            // si ... etapeSuivante=&lt;br /&gt;
            break;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    // on modifie l'étape active pour la prochaine boucle&lt;br /&gt;
    etapeActive=etapeSuivante;&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Programmation : comment faire==&lt;br /&gt;
&lt;br /&gt;
===Exécuter une action une seule fois :===&lt;br /&gt;
&amp;lt;source lang=cpp&amp;gt;&lt;br /&gt;
while(1)&lt;br /&gt;
{&lt;br /&gt;
   static bool dejaFait=false;&lt;br /&gt;
   if (dejaFait==false)&lt;br /&gt;
   {&lt;br /&gt;
      executerMonAction();&lt;br /&gt;
      dejaFait=true;&lt;br /&gt;
   }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Répéter une action régulièrement===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;source lang=cpp&amp;gt;&lt;br /&gt;
void initFonctionsTempsArduino()&lt;br /&gt;
{&lt;br /&gt;
  sei();&lt;br /&gt;
  // marche pour 328p et 2560 et autres ...&lt;br /&gt;
  // à adapter suivant le µc&lt;br /&gt;
  // cf https://github.com/arduino/ArduinoCore-avr/blob/master/cores/arduino/wiring.c&lt;br /&gt;
  TCCR0A=(1&amp;lt;&amp;lt;WGM01)|(1&amp;lt;&amp;lt;WGM00);&lt;br /&gt;
  TCCR0B=(1&amp;lt;&amp;lt;CS01)|(1&amp;lt;&amp;lt;CS00);&lt;br /&gt;
  TIMSK0=(1&amp;lt;&amp;lt;TOIE0);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
int main()&lt;br /&gt;
{&lt;br /&gt;
  initFonctionsTempsArduino();&lt;br /&gt;
  while(1)&lt;br /&gt;
  {&lt;br /&gt;
    static uint32_t triggerTime=millis();&lt;br /&gt;
    uint32_t currentTime=millis();&lt;br /&gt;
    if (currentTime&amp;gt;=triggerTime)&lt;br /&gt;
    {&lt;br /&gt;
       faireMonAction();&lt;br /&gt;
       triggerTime += 500; // prochaine exécution dans 500ms&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
||&lt;br /&gt;
&amp;lt;source lang=cpp&amp;gt;&lt;br /&gt;
void initFonctionsTempsArduino()&lt;br /&gt;
{&lt;br /&gt;
  sei();&lt;br /&gt;
  // marche pour 328p et 2560 et autres ...&lt;br /&gt;
  // à adapter suivant le µc&lt;br /&gt;
  // cf https://github.com/arduino/ArduinoCore-avr/blob/master/cores/arduino/wiring.c&lt;br /&gt;
  TCCR0A=(1&amp;lt;&amp;lt;WGM01)|(1&amp;lt;&amp;lt;WGM00);&lt;br /&gt;
  TCCR0B=(1&amp;lt;&amp;lt;CS01)|(1&amp;lt;&amp;lt;CS00);&lt;br /&gt;
  TIMSK0=(1&amp;lt;&amp;lt;TOIE0);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
int main()&lt;br /&gt;
{&lt;br /&gt;
  initFonctionsTempsArduino();&lt;br /&gt;
  while(1)&lt;br /&gt;
  {&lt;br /&gt;
    static uint32_t triggerTime=0;&lt;br /&gt;
    uint32_t currentTime=millis();&lt;br /&gt;
&lt;br /&gt;
    switch (etapeActive)&lt;br /&gt;
    {&lt;br /&gt;
      case etapeX:&lt;br /&gt;
            if ( qqch)&lt;br /&gt;
            {&lt;br /&gt;
               etapeSuivante=etapeY;&lt;br /&gt;
               triggerTime=currentTime;&lt;br /&gt;
            }&lt;br /&gt;
            break;&lt;br /&gt;
      case etapeY:&lt;br /&gt;
            if ( currentTime &amp;gt;= (triggerTime + duree ) )&lt;br /&gt;
            {&lt;br /&gt;
               etapeSuivante=etapeZ;&lt;br /&gt;
            }&lt;br /&gt;
            break;&lt;br /&gt;
      case etapeZ:&lt;br /&gt;
            ...&lt;br /&gt;
            break;&lt;br /&gt;
    }&lt;br /&gt;
    etapeActive=etapeSuivante;&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===Affichage provisoire pour deboggage===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{|&lt;br /&gt;
|-&lt;br /&gt;
| &lt;br /&gt;
&amp;lt;source lang=cpp&amp;gt;&lt;br /&gt;
#define debug   // mode debug&lt;br /&gt;
//ou&lt;br /&gt;
#undef debug // mode sans debug&lt;br /&gt;
&lt;br /&gt;
int main()&lt;br /&gt;
{&lt;br /&gt;
  ...&lt;br /&gt;
  while(1)&lt;br /&gt;
  {&lt;br /&gt;
    #ifdef debug&lt;br /&gt;
       Serial.println(&amp;quot;juste si debug&amp;quot;);&lt;br /&gt;
    #endif&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|| &lt;br /&gt;
&amp;lt;source lang=cpp&amp;gt;&lt;br /&gt;
#define DEBUG   //If you comment this line, the DEBUG_PRINT &amp;amp; DEBUG_PRINTLN lines are defined as blank.&lt;br /&gt;
#ifdef DEBUG    //Macros are usually in all capital letters.&lt;br /&gt;
   #define DEBUG_PRINT(...)    Serial.print(__VA_ARGS__)     //DEBUG_PRINT is a macro, debug print&lt;br /&gt;
   #define DEBUG_PRINTLN(...)  Serial.println(__VA_ARGS__)   //DEBUG_PRINTLN is a macro, debug print with new line&lt;br /&gt;
#else&lt;br /&gt;
   #define DEBUG_PRINT(...)     //now defines a blank line&lt;br /&gt;
   #define DEBUG_PRINTLN(...)   //now defines a blank line&lt;br /&gt;
#endif&lt;br /&gt;
int main()&lt;br /&gt;
{&lt;br /&gt;
  while(1)&lt;br /&gt;
  {&lt;br /&gt;
    DEBUG_PRINTLN(&amp;quot;juste si debug&amp;quot;);&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===changement d'état d'un capteur===&lt;br /&gt;
&lt;br /&gt;
{|&lt;br /&gt;
|-&lt;br /&gt;
! au front montant d'un capteur !! 1x si le capteur est actif suffisamment longtemps&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;source lang=cpp&amp;gt;&lt;br /&gt;
bool valeurActuelle=valeurInit;&lt;br /&gt;
bool valeurPrecedente=valeurInit;&lt;br /&gt;
&lt;br /&gt;
...&lt;br /&gt;
int main()&lt;br /&gt;
{&lt;br /&gt;
   ...&lt;br /&gt;
   while(1)&lt;br /&gt;
   {&lt;br /&gt;
      valeurPrecedente=valeurActuelle;&lt;br /&gt;
      valeurActuelle=lireValeurCapteur();&lt;br /&gt;
      if ( (valeurPrecedente==false) and (valeurActuelle==true) )&lt;br /&gt;
      {&lt;br /&gt;
         // action, par ex:&lt;br /&gt;
         nombreFrontMontant++;&lt;br /&gt;
      }&lt;br /&gt;
   }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|| &amp;lt;source lang=cpp&amp;gt;&lt;br /&gt;
bool valeurActuelle=valeurInit;&lt;br /&gt;
int8_t dureeActif=0;&lt;br /&gt;
bool isFront=true;&lt;br /&gt;
&lt;br /&gt;
...&lt;br /&gt;
int main()&lt;br /&gt;
{&lt;br /&gt;
   ...&lt;br /&gt;
   while(1)&lt;br /&gt;
   {&lt;br /&gt;
      valeurActuelle=lireValeurCapteur();&lt;br /&gt;
      if (valeurActuelle==true)&lt;br /&gt;
      {&lt;br /&gt;
         if (dureeActif&amp;gt;=20)&lt;br /&gt;
         {&lt;br /&gt;
            // faire l'action, par ex&lt;br /&gt;
            if (isFront==true)&lt;br /&gt;
            {&lt;br /&gt;
                isFront=false;&lt;br /&gt;
                nombreFrontMontant++;&lt;br /&gt;
            }&lt;br /&gt;
         }&lt;br /&gt;
         else dureeActif++;&lt;br /&gt;
      }&lt;br /&gt;
      else&lt;br /&gt;
      {&lt;br /&gt;
         dureeActif=0;&lt;br /&gt;
         isFront=true;&lt;br /&gt;
      }&lt;br /&gt;
   }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===filtrer un capteur tor===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! filtrer un capteur TOR !! sous forme de fonction pour filtrage de plusieurs capteurs&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;source lang=cpp&amp;gt;&lt;br /&gt;
&lt;br /&gt;
bool rawValue=readCapteur();&lt;br /&gt;
static bool value=false;&lt;br /&gt;
&lt;br /&gt;
const uint8_t filterValue=12;&lt;br /&gt;
static uint8_t nbTrue=0;&lt;br /&gt;
static uint8_t nbFalse=0;&lt;br /&gt;
&lt;br /&gt;
if ( rawValue  )&lt;br /&gt;
{&lt;br /&gt;
   if ( nbTrue&amp;gt;= filterValue)&lt;br /&gt;
   {&lt;br /&gt;
     value=true;&lt;br /&gt;
     nbFalse=0;&lt;br /&gt;
   }&lt;br /&gt;
   else nbTrue++;&lt;br /&gt;
}&lt;br /&gt;
else&lt;br /&gt;
{&lt;br /&gt;
   if ( nbFalse&amp;gt;= filterValue)&lt;br /&gt;
   {&lt;br /&gt;
     value=false;&lt;br /&gt;
     nbTrue=0;&lt;br /&gt;
   }&lt;br /&gt;
   else nbFalse++;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|| &amp;lt;source lang=cpp&amp;gt;&lt;br /&gt;
void filtreTor(bool rawValue,bool &amp;amp; value,uint8_t filterValue,uint8_t &amp;amp; nbTrue,uint8_t &amp;amp; nbFalse)&lt;br /&gt;
{&lt;br /&gt;
  if ( rawValue  )&lt;br /&gt;
  {&lt;br /&gt;
    if ( nbTrue&amp;gt;= filterValue)&lt;br /&gt;
    {&lt;br /&gt;
      value=true;&lt;br /&gt;
      nbFalse=0;&lt;br /&gt;
    }&lt;br /&gt;
    else nbTrue++;&lt;br /&gt;
  }&lt;br /&gt;
  else&lt;br /&gt;
  {&lt;br /&gt;
    if ( nbFalse&amp;gt;= filterValue)&lt;br /&gt;
    {&lt;br /&gt;
      value=false;&lt;br /&gt;
      nbTrue=0;&lt;br /&gt;
    }&lt;br /&gt;
    else nbFalse++;&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
int main()&lt;br /&gt;
{&lt;br /&gt;
  ...&lt;br /&gt;
  bool rawValue=rawValueTab[i];&lt;br /&gt;
  static bool value=false;&lt;br /&gt;
&lt;br /&gt;
  const uint8_t filterValue=5;&lt;br /&gt;
  static uint8_t nbTrue=0;&lt;br /&gt;
  static uint8_t nbFalse=0;&lt;br /&gt;
  filtreTor(rawValue,value,filterValue,nbTrue,nbFalse);&lt;br /&gt;
  ...&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===Optimiser l'exécution d'une fonction===&lt;br /&gt;
&amp;lt;source lang=cpp&amp;gt;&lt;br /&gt;
inline void setVitesse(int16_t vmG, int16_t vmD) __attribute__((always_inline));&lt;br /&gt;
&lt;br /&gt;
void setVitesse(int16_t vmG, int16_t vmD)&lt;br /&gt;
{&lt;br /&gt;
   // code de la fonction&lt;br /&gt;
   ...&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Diagramme d'état==&lt;br /&gt;
&lt;br /&gt;
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 :&lt;br /&gt;
&lt;br /&gt;
[[Media:TestFiniteStateMachine.zip]]&lt;br /&gt;
&lt;br /&gt;
==Composants Kicad==&lt;br /&gt;
&lt;br /&gt;
*Résistances :&lt;br /&gt;
**symbole R&lt;br /&gt;
**boitier suivant la valeur : 1206(CMS)/Axial DIN0309 (traversant)&lt;br /&gt;
*Condensateur&lt;br /&gt;
**symbole C&lt;br /&gt;
**boitier suivant la valeur 1206(CMS)&lt;br /&gt;
*VNH7070&lt;br /&gt;
**télécharger et décompresser le fichier [[Media:VNH7070BASTR.zip]]&lt;br /&gt;
**ajouter la librairie en suivante la page : https://www.snapeda.com/about/import/#KiCad6&lt;br /&gt;
**{{Rouge|attention}} : pour l'ajout de la librairie de l'empreinte, indique comme &amp;quot;pseudo nom&amp;quot; {{Rouge|VNH7070BASTR}}&lt;br /&gt;
**modèle 3d&lt;br /&gt;
***ajouter le fichier VNH7070BASTR.step&lt;br /&gt;
***faire une rotation sur X de 90°&lt;br /&gt;
*Arduino Nano&lt;br /&gt;
**symbole Arduino_Nano_v2.x&lt;br /&gt;
**modèle 3d&lt;br /&gt;
***télécharger et décompresser : [[Media:Arduino_nano.STEP.zip]]&lt;br /&gt;
***dans les propriétés de la carte (éditeur de pcb), onglet modèle 3d&lt;br /&gt;
****ajouter le fichier téléchargé&lt;br /&gt;
****rotation X 90&lt;br /&gt;
****rotation Z -90&lt;br /&gt;
****décalage Z 11mm&lt;br /&gt;
***ajouter 2 barrettes M/F&lt;br /&gt;
***${KICAD9_3DMODEL_DIR}/Connector_PinSocket_2.54mm.3dshapes/PinSocket_1x15_P2.54mm_Vertical.step&lt;br /&gt;
***décaler le 2ème en X de 15,24mm&lt;br /&gt;
*bornier à vis : Screw_Terminal_01x02&lt;br /&gt;
*MPU-9250&lt;br /&gt;
**mettre 2 barrettes sécables 4 contacts, espacées de 6 pas&lt;br /&gt;
**[[Media:SparkFun MPU-9250 Breakout.step.zip]]&lt;br /&gt;
*convertisseur de niveau gt1167 {{Rouge|A modifier, pas le bon écartement : 12,7mm entre les 2 barrettes M/M !!}}&lt;br /&gt;
**utiliser la librairie : [[Media:BOB-12009.zip]]&lt;br /&gt;
**modèle 3d :&lt;br /&gt;
***BOB-12009.step &lt;br /&gt;
****rotation 90/0/0&lt;br /&gt;
****translation 0/0/9&lt;br /&gt;
***ajouter 2 barrettes M/F : ${KICAD9_3DMODEL_DIR}/Connector_PinSocket_2.54mm.3dshapes/PinSocket_1x06_P2.54mm_Vertical.step&lt;br /&gt;
****rotation 0/0/0&lt;br /&gt;
****translation 5.08/6.35/0 et -5.08/6.35/0&lt;br /&gt;
*Autres : [[Media:SaeS2_2025.zip]]&lt;br /&gt;
*GroveH : [[Media:groveH.zip]]&lt;br /&gt;
*Connecteur à vis : [[Media:1729131.zip]]&lt;/div&gt;</summary>
		<author><name>Bjacquot</name></author>	</entry>

	<entry>
		<id>http://wikigeii.iut-troyes.univ-reims.fr//index.php?title=Cours:TPS_2103_evse&amp;diff=20996</id>
		<title>Cours:TPS 2103 evse</title>
		<link rel="alternate" type="text/html" href="http://wikigeii.iut-troyes.univ-reims.fr//index.php?title=Cours:TPS_2103_evse&amp;diff=20996"/>
				<updated>2026-05-12T22:04:19Z</updated>
		
		<summary type="html">&lt;p&gt;Bjacquot : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;accesscontrol&amp;gt;Acces:Prof&amp;lt;/accesscontrol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 ******************************&lt;br /&gt;
&lt;br /&gt;
* modifier la partie potar pour ne faire qu'une seule lecture i2c&lt;br /&gt;
* revoir la partie détection voiture branchée/débranchée/en charge&lt;br /&gt;
&lt;br /&gt;
 ******************************&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=Description générale du système=&lt;br /&gt;
&lt;br /&gt;
==Cadre==&lt;br /&gt;
[[Image:ImageEvalTpEvse.png|vignette|600px]]&lt;br /&gt;
Vous allez &amp;quot;réaliser&amp;quot; une '''borne de recharge''' pour voiture électrique. Nous nous plaçons dans le cas d'une recharge en courant alternatif avec un connecteur de type 2 (recharge monophasé ou triphasé).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''La partie puissance ne nous intéresse pas''' ici et nous &amp;quot;alimenterons&amp;quot; la carte qui simule la voiture avec une tension réduite.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
L'objectif est d'implémenter les étapes du '''protocole de recharge''' du côté de la borne (EVSE).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Comme vous pouvez le voir sur la figure ci-contre :&lt;br /&gt;
*la voiture est simulée par une carte avec des leds et un bouton (carte bleue)&lt;br /&gt;
*l'électronique de la borne de recharge est sur un shield arduino Nano (carte verte à gauche)&lt;br /&gt;
*une carte avec un mcp23008 permettra d'avoir des leds pour afficher des informations (carte noire)&lt;br /&gt;
*un potentiomètre est connecté sur un CAN i2c (petite carte verte à droite)&lt;br /&gt;
&lt;br /&gt;
Il conviendra d'alimenter :&lt;br /&gt;
*la carte arduino Nano, juste en reliant le cordon usb&lt;br /&gt;
*le shield sur une alimentation -12v/GND/+12v : {{Rouge|attention au sens !}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Image:signalControlEVSE.png|vignette|600px]]&lt;br /&gt;
==Fil Control Pilot==&lt;br /&gt;
&lt;br /&gt;
La borne dialogue avec la voiture grâce au fil CP (cf figure ci-contre)&lt;br /&gt;
&lt;br /&gt;
Il s'agira de générer un signal sur ce fil et également de lire la tension. Ceci se fait par les liaisons notées :&lt;br /&gt;
*'''control''' : signal généré par le µcontroleur de la carte arduino Nano&lt;br /&gt;
*'''mesureCP''' : signal analogique observé par la carte arduino Uno (pour rappel reliée en i2c à la carte arduino Nano)&lt;br /&gt;
**le signal mesureCP est identique (forme) au signal CP ci-contre&lt;br /&gt;
**le niveau logique bas est de l'ordre de {{Rouge|1,17V}}&lt;br /&gt;
**le niveau logique haut est de l'ordre de :&lt;br /&gt;
***{{Rouge|4,3V}} : véhicule non connecté (state A)&lt;br /&gt;
***{{Rouge|3,89V}} : véhicule connecté (state B)&lt;br /&gt;
***{{Rouge|3,47V}} : véhicule connecté (state C)&lt;br /&gt;
***on n'utilise pas les state D et state E&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Protocole de charge==&lt;br /&gt;
La gestion de la charge d'un véhicule se  déroule de la façon suivante :&lt;br /&gt;
#'''pas de véhicule connecté''' ({{Rouge|state A}}) sur la borne (fil CP débranché) :&lt;br /&gt;
#*signal '''control à l'état logique 1'''&lt;br /&gt;
#*la valeur de mesureCP est de l'ordre de 4,3V&lt;br /&gt;
#'''Connection de la voiture''' borne non prête (fil CP relié):&lt;br /&gt;
#*signal '''control à l'état logique 1'''&lt;br /&gt;
#*la valeur de mesureCP est proche de 3,89V =&amp;gt; la borne passe en mode prêt pour la charge&lt;br /&gt;
#'''Connection de la voiture''' ({{Rouge|state B}}) borne prête (fil CP relié):&lt;br /&gt;
#*signal mli à 1kHz sur le fil control (le rapport cyclique indique le courant de charge autorisé)&lt;br /&gt;
#*la valeur du niveau haut de mesureCP est proche de 3,89V&lt;br /&gt;
#*des leds sur la voiture permettent de visualiser le courant de charge autorisé&lt;br /&gt;
#'''Voiture prête à charger''' ({{Rouge|state C}}) (appuyer sur le bouton de la voiture):&lt;br /&gt;
#*signal mli à 1kHz sur le fil control (le rapport cyclique indique le courant de charge autorisé)&lt;br /&gt;
#*la valeur du niveau haut de mesureCP est proche de 3,47V&lt;br /&gt;
#*on alimente la voiture avec le fil puissance à l'état 1&lt;br /&gt;
#'''arrêt de la charge''' ({{Rouge|state B}}) (relâcher le bouton de la voiture):&lt;br /&gt;
#*signal mli à 1kHz sur le fil control (le rapport cyclique indique le courant de charge autorisé)&lt;br /&gt;
#*la valeur du niveau haut de mesureCP est proche de 3,89V&lt;br /&gt;
#*on coupe l'alimentation en passant le fil puissance à l'état 0&lt;br /&gt;
# '''Déconnection de la voiture''' ({{Rouge|state A}}) : arrêt de la mli&lt;br /&gt;
#*signal '''control à l'état logique 1'''&lt;br /&gt;
#*la valeur de mesureCP est proche de 4,3V&lt;br /&gt;
&lt;br /&gt;
[[Fichier:ArduinoNanoPinout.png|300px|droite]]&lt;br /&gt;
&lt;br /&gt;
=Exercice 1 : générer le signal MLI=&lt;br /&gt;
&lt;br /&gt;
On commencera par réaliser le signal MLI qui permet d'indiquer à la voiture électrique le courant de charge autorisé.&lt;br /&gt;
&lt;br /&gt;
La broche {{Rouge|PB1}} est utilisée pour le signal MLI.&lt;br /&gt;
&lt;br /&gt;
Vous utiliserez le timer1 pour générer le signal MLI :&lt;br /&gt;
*en '''mode 14'''&lt;br /&gt;
*la '''fréquence de la mli''' doit être de '''1kHz'''&lt;br /&gt;
*le '''rapport cyclique''' sera pour le moment réglé à '''20%'''&lt;br /&gt;
&lt;br /&gt;
{{Eval|4|Réaliser le programme correspondant}}&lt;br /&gt;
&lt;br /&gt;
Remarque :&lt;br /&gt;
*visualiser la mli sur un oscilloscope avant de brancher la voiture&lt;br /&gt;
*vérifier ensuite que la voiture détecte bien la borne (led verte allumée)&lt;br /&gt;
&lt;br /&gt;
*prendre [[Media:Atmega328p.pdf|la datasheet pages 131 et suivantes]] pour une description du Timer1&lt;br /&gt;
*en mode 14, la fréquence de la MLI est donnée par Fmli= Fcpu / (P * ICR1)&lt;br /&gt;
*rapportCyclique=OCR1A/ICR1&lt;br /&gt;
&amp;lt;source lang=cpp&amp;gt;&lt;br /&gt;
   // broche en sortie&lt;br /&gt;
&lt;br /&gt;
   // timer1 en mode 14&lt;br /&gt;
&lt;br /&gt;
   // valeur du prédiviseur&lt;br /&gt;
&lt;br /&gt;
   // générer le signal MLI sur la broche OC1A (bits COM1xx dans le registre TCCR1A)&lt;br /&gt;
&lt;br /&gt;
   // valeur du rapport cyclique&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Exercice 2 : modification du courant de charge autorisé =&lt;br /&gt;
&lt;br /&gt;
La valeur du rapport cyclique de la MLI permet d'indiquer à la voiture le courant maximum de charge de la façon suivante :&lt;br /&gt;
 Current from 6A to 51A: Current [A] = Duty Cycle [%] * 0.6&lt;br /&gt;
 Current from 51A to 80A: Current [A] = (Duty Cycle [%]-64) * 2.5&lt;br /&gt;
&lt;br /&gt;
On fera varier le rapport cyclique en utilisant le potentiomètre sur la carte d'extension. Un {{Rouge|can i2c}} sur la carte permet de mesurer la tension du potentiomètre.&lt;br /&gt;
&lt;br /&gt;
{{Eval|1|Trouver l'adresse du can i2c : {{Rouge|mcp3021}} }}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
La datasheet du [[Media:Mcp3021.pdf|Mcp3021.pdf]] page 18 donne le principe pour faire une lecture de la valeur de conversion.&lt;br /&gt;
&lt;br /&gt;
'''Attention''' :&lt;br /&gt;
*il n'y a pas de registres i2c dans le composant&lt;br /&gt;
*Il convient de faire [[Cours:InfoS2_tdI2c#Lire_sur_le_slave_:_la_target_envoie_des_donn.C3.A9es_au_controller|'''2 lectures successives''']] (sans fermer la transmission):&lt;br /&gt;
**on {{Rouge|&amp;quot;request&amp;quot;}} 2 octets&lt;br /&gt;
**lire le 1er octet =&amp;gt; 8 bits de poids fort&lt;br /&gt;
**lire le 2ème octet =&amp;gt; 8 bits de poids faible&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{Eval|4|Ecrire un programme qui permet de modifier la valeur du rapport cyclique en fonction de la valeur du potentiomètre. Les valeurs du rapport cyclique générées devront varier entre 10% (au minimum) et 60% (au maximum).}}&lt;br /&gt;
&lt;br /&gt;
= Exercice 3 : détection de présence de la voiture =&lt;br /&gt;
&lt;br /&gt;
La tension sur le niveau haut du signal MLI varie en fonction de :&lt;br /&gt;
*la présence ou non de la voiture&lt;br /&gt;
*si la voiture charge ou non&lt;br /&gt;
&lt;br /&gt;
On mesure cette tension sur la broche ADC0 de la carte arduino Nano.&lt;br /&gt;
&lt;br /&gt;
Le tableau suivant récapitule les cas possibles :&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Etat !! Tension de l'état haut&lt;br /&gt;
|-&lt;br /&gt;
| voiture non connectée || proche de 5V&lt;br /&gt;
|-&lt;br /&gt;
| voiture connectée pas de charge || proche de 4,5V&lt;br /&gt;
|-&lt;br /&gt;
| voiture en charge || proche de 3,9V&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{{Eval|4|Ecrire un programme qui}}&lt;br /&gt;
*mesure la tension sur la broche ADC0 toutes les 200ms&lt;br /&gt;
*affiche sur la liaison série le message adéquat&lt;br /&gt;
**pas de voiture&lt;br /&gt;
**voiture branchée&lt;br /&gt;
**voiture en charge&lt;br /&gt;
&lt;br /&gt;
'''Remarques''' :&lt;br /&gt;
*il n'est pas possible de demander une mesure de la tension du niveau logique 1 de la MLI :&lt;br /&gt;
*on fait la mesure en permance&lt;br /&gt;
**si la valeur est trop faible (tension inférieur à 3V) ne pas en tenir compte =&amp;gt; c'est une mesure de la tension du niveau logique 0&lt;br /&gt;
**sinon envoyer le message selon la valeur mesurée&lt;br /&gt;
&lt;br /&gt;
= Exercice 4 : Affichage sur le mcp23008=&lt;br /&gt;
&lt;br /&gt;
le mcp23008 est un GPIO expander avec 8 gpio. Le principe d'utilisation est identique au mcp23017.&lt;br /&gt;
&lt;br /&gt;
Vous utiliserez [[Media:Mcp23008.pdf| la datasheet du composant]] pour écrire votre programme, ainsi que la déclaration des registres :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=cpp&amp;gt;&lt;br /&gt;
#define IODIR   0x00&lt;br /&gt;
#define IPOL    0x01&lt;br /&gt;
#define GPINTEN 0x02&lt;br /&gt;
#define DEFVAL  0x03&lt;br /&gt;
#define INTCON  0x04&lt;br /&gt;
#define IOCON   0x05&lt;br /&gt;
#define GPPU    0x06&lt;br /&gt;
#define INTF    0x07&lt;br /&gt;
#define INTCAP  0x08&lt;br /&gt;
#define GPIO    0x09&lt;br /&gt;
#define OLAT    0x0A&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Eval|4|Utiliser 3 leds du mcp23008 :}}&lt;br /&gt;
*la led de la gpio7 s'allume lorsqu'il n'y a pas de voiture&lt;br /&gt;
*la led de la gpio6 s'allume lorsqu'une voiture est branchée mais qu'elle ne charge pas&lt;br /&gt;
*la led de la gpio5 s'allume lorsqu'une voiture est branchée et en charge&lt;br /&gt;
&lt;br /&gt;
= Exercice 5 : Mise en place du protocole de charge=&lt;br /&gt;
&lt;br /&gt;
{{Eval|3|Implanter le protocole complet en gérant l'alimentation de la voiture avec le signal puissance}}&lt;br /&gt;
&lt;br /&gt;
*la broche {{Rouge|PC2 est utilisée pour alimenter la voiture}}&lt;br /&gt;
&lt;br /&gt;
=documentation=&lt;br /&gt;
*[[Media:Atmega328p.pdf|datasheet atmega328p]]&lt;br /&gt;
*[[Media:Current-State-of-the-Art-EV-Chargers.pdf|https://www.hnei.hawaii.edu/wp-content/uploads/Current-State-of-the-Art-EV-Chargers.pdf]]&lt;/div&gt;</summary>
		<author><name>Bjacquot</name></author>	</entry>

	<entry>
		<id>http://wikigeii.iut-troyes.univ-reims.fr//index.php?title=Cours:TPS_2103_evse&amp;diff=20995</id>
		<title>Cours:TPS 2103 evse</title>
		<link rel="alternate" type="text/html" href="http://wikigeii.iut-troyes.univ-reims.fr//index.php?title=Cours:TPS_2103_evse&amp;diff=20995"/>
				<updated>2026-05-12T14:10:39Z</updated>
		
		<summary type="html">&lt;p&gt;Bjacquot : /* Exercice 3 : détection de présence de la voiture */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;accesscontrol&amp;gt;Acces:Prof&amp;lt;/accesscontrol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Description générale du système=&lt;br /&gt;
&lt;br /&gt;
==Cadre==&lt;br /&gt;
[[Image:ImageEvalTpEvse.png|vignette|600px]]&lt;br /&gt;
Vous allez &amp;quot;réaliser&amp;quot; une '''borne de recharge''' pour voiture électrique. Nous nous plaçons dans le cas d'une recharge en courant alternatif avec un connecteur de type 2 (recharge monophasé ou triphasé).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''La partie puissance ne nous intéresse pas''' ici et nous &amp;quot;alimenterons&amp;quot; la carte qui simule la voiture avec une tension réduite.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
L'objectif est d'implémenter les étapes du '''protocole de recharge''' du côté de la borne (EVSE).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Comme vous pouvez le voir sur la figure ci-contre :&lt;br /&gt;
*la voiture est simulée par une carte avec des leds et un bouton (carte bleue)&lt;br /&gt;
*l'électronique de la borne de recharge est sur un shield arduino Nano (carte verte à gauche)&lt;br /&gt;
*une carte avec un mcp23008 permettra d'avoir des leds pour afficher des informations (carte noire)&lt;br /&gt;
*un potentiomètre est connecté sur un CAN i2c (petite carte verte à droite)&lt;br /&gt;
&lt;br /&gt;
Il conviendra d'alimenter :&lt;br /&gt;
*la carte arduino Nano, juste en reliant le cordon usb&lt;br /&gt;
*le shield sur une alimentation -12v/GND/+12v : {{Rouge|attention au sens !}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Image:signalControlEVSE.png|vignette|600px]]&lt;br /&gt;
==Fil Control Pilot==&lt;br /&gt;
&lt;br /&gt;
La borne dialogue avec la voiture grâce au fil CP (cf figure ci-contre)&lt;br /&gt;
&lt;br /&gt;
Il s'agira de générer un signal sur ce fil et également de lire la tension. Ceci se fait par les liaisons notées :&lt;br /&gt;
*'''control''' : signal généré par le µcontroleur de la carte arduino Nano&lt;br /&gt;
*'''mesureCP''' : signal analogique observé par la carte arduino Uno (pour rappel reliée en i2c à la carte arduino Nano)&lt;br /&gt;
**le signal mesureCP est identique (forme) au signal CP ci-contre&lt;br /&gt;
**le niveau logique bas est de l'ordre de {{Rouge|1,17V}}&lt;br /&gt;
**le niveau logique haut est de l'ordre de :&lt;br /&gt;
***{{Rouge|4,3V}} : véhicule non connecté (state A)&lt;br /&gt;
***{{Rouge|3,89V}} : véhicule connecté (state B)&lt;br /&gt;
***{{Rouge|3,47V}} : véhicule connecté (state C)&lt;br /&gt;
***on n'utilise pas les state D et state E&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Protocole de charge==&lt;br /&gt;
La gestion de la charge d'un véhicule se  déroule de la façon suivante :&lt;br /&gt;
#'''pas de véhicule connecté''' ({{Rouge|state A}}) sur la borne (fil CP débranché) :&lt;br /&gt;
#*signal '''control à l'état logique 1'''&lt;br /&gt;
#*la valeur de mesureCP est de l'ordre de 4,3V&lt;br /&gt;
#'''Connection de la voiture''' borne non prête (fil CP relié):&lt;br /&gt;
#*signal '''control à l'état logique 1'''&lt;br /&gt;
#*la valeur de mesureCP est proche de 3,89V =&amp;gt; la borne passe en mode prêt pour la charge&lt;br /&gt;
#'''Connection de la voiture''' ({{Rouge|state B}}) borne prête (fil CP relié):&lt;br /&gt;
#*signal mli à 1kHz sur le fil control (le rapport cyclique indique le courant de charge autorisé)&lt;br /&gt;
#*la valeur du niveau haut de mesureCP est proche de 3,89V&lt;br /&gt;
#*des leds sur la voiture permettent de visualiser le courant de charge autorisé&lt;br /&gt;
#'''Voiture prête à charger''' ({{Rouge|state C}}) (appuyer sur le bouton de la voiture):&lt;br /&gt;
#*signal mli à 1kHz sur le fil control (le rapport cyclique indique le courant de charge autorisé)&lt;br /&gt;
#*la valeur du niveau haut de mesureCP est proche de 3,47V&lt;br /&gt;
#*on alimente la voiture avec le fil puissance à l'état 1&lt;br /&gt;
#'''arrêt de la charge''' ({{Rouge|state B}}) (relâcher le bouton de la voiture):&lt;br /&gt;
#*signal mli à 1kHz sur le fil control (le rapport cyclique indique le courant de charge autorisé)&lt;br /&gt;
#*la valeur du niveau haut de mesureCP est proche de 3,89V&lt;br /&gt;
#*on coupe l'alimentation en passant le fil puissance à l'état 0&lt;br /&gt;
# '''Déconnection de la voiture''' ({{Rouge|state A}}) : arrêt de la mli&lt;br /&gt;
#*signal '''control à l'état logique 1'''&lt;br /&gt;
#*la valeur de mesureCP est proche de 4,3V&lt;br /&gt;
&lt;br /&gt;
[[Fichier:ArduinoNanoPinout.png|300px|droite]]&lt;br /&gt;
&lt;br /&gt;
=Exercice 1 : générer le signal MLI=&lt;br /&gt;
&lt;br /&gt;
On commencera par réaliser le signal MLI qui permet d'indiquer à la voiture électrique le courant de charge autorisé.&lt;br /&gt;
&lt;br /&gt;
La broche {{Rouge|PB1}} est utilisée pour le signal MLI.&lt;br /&gt;
&lt;br /&gt;
Vous utiliserez le timer1 pour générer le signal MLI :&lt;br /&gt;
*en '''mode 14'''&lt;br /&gt;
*la '''fréquence de la mli''' doit être de '''1kHz'''&lt;br /&gt;
*le '''rapport cyclique''' sera pour le moment réglé à '''20%'''&lt;br /&gt;
&lt;br /&gt;
{{Eval|4|Réaliser le programme correspondant}}&lt;br /&gt;
&lt;br /&gt;
Remarque :&lt;br /&gt;
*visualiser la mli sur un oscilloscope avant de brancher la voiture&lt;br /&gt;
*vérifier ensuite que la voiture détecte bien la borne (led verte allumée)&lt;br /&gt;
&lt;br /&gt;
*prendre [[Media:Atmega328p.pdf|la datasheet pages 131 et suivantes]] pour une description du Timer1&lt;br /&gt;
*en mode 14, la fréquence de la MLI est donnée par Fmli= Fcpu / (P * ICR1)&lt;br /&gt;
*rapportCyclique=OCR1A/ICR1&lt;br /&gt;
&amp;lt;source lang=cpp&amp;gt;&lt;br /&gt;
   // broche en sortie&lt;br /&gt;
&lt;br /&gt;
   // timer1 en mode 14&lt;br /&gt;
&lt;br /&gt;
   // valeur du prédiviseur&lt;br /&gt;
&lt;br /&gt;
   // générer le signal MLI sur la broche OC1A (bits COM1xx dans le registre TCCR1A)&lt;br /&gt;
&lt;br /&gt;
   // valeur du rapport cyclique&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Exercice 2 : modification du courant de charge autorisé =&lt;br /&gt;
&lt;br /&gt;
La valeur du rapport cyclique de la MLI permet d'indiquer à la voiture le courant maximum de charge de la façon suivante :&lt;br /&gt;
 Current from 6A to 51A: Current [A] = Duty Cycle [%] * 0.6&lt;br /&gt;
 Current from 51A to 80A: Current [A] = (Duty Cycle [%]-64) * 2.5&lt;br /&gt;
&lt;br /&gt;
On fera varier le rapport cyclique en utilisant le potentiomètre sur la carte d'extension. Un {{Rouge|can i2c}} sur la carte permet de mesurer la tension du potentiomètre.&lt;br /&gt;
&lt;br /&gt;
{{Eval|1|Trouver l'adresse du can i2c : {{Rouge|mcp3021}} }}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
La datasheet du [[Media:Mcp3021.pdf|Mcp3021.pdf]] page 18 donne le principe pour faire une lecture de la valeur de conversion.&lt;br /&gt;
&lt;br /&gt;
'''Attention''' :&lt;br /&gt;
*il n'y a pas de registres i2c dans le composant&lt;br /&gt;
*Il convient de faire [[Cours:InfoS2_tdI2c#Lire_sur_le_slave_:_la_target_envoie_des_donn.C3.A9es_au_controller|'''2 lectures successives''']] (sans fermer la transmission):&lt;br /&gt;
**on {{Rouge|&amp;quot;request&amp;quot;}} 2 octets&lt;br /&gt;
**lire le 1er octet =&amp;gt; 8 bits de poids fort&lt;br /&gt;
**lire le 2ème octet =&amp;gt; 8 bits de poids faible&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{Eval|4|Ecrire un programme qui permet de modifier la valeur du rapport cyclique en fonction de la valeur du potentiomètre. Les valeurs du rapport cyclique générées devront varier entre 10% (au minimum) et 60% (au maximum).}}&lt;br /&gt;
&lt;br /&gt;
= Exercice 3 : détection de présence de la voiture =&lt;br /&gt;
&lt;br /&gt;
La tension sur le niveau haut du signal MLI varie en fonction de :&lt;br /&gt;
*la présence ou non de la voiture&lt;br /&gt;
*si la voiture charge ou non&lt;br /&gt;
&lt;br /&gt;
On mesure cette tension sur la broche ADC0 de la carte arduino Nano.&lt;br /&gt;
&lt;br /&gt;
Le tableau suivant récapitule les cas possibles :&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Etat !! Tension de l'état haut&lt;br /&gt;
|-&lt;br /&gt;
| voiture non connectée || proche de 5V&lt;br /&gt;
|-&lt;br /&gt;
| voiture connectée pas de charge || proche de 4,5V&lt;br /&gt;
|-&lt;br /&gt;
| voiture en charge || proche de 3,9V&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{{Eval|4|Ecrire un programme qui}}&lt;br /&gt;
*mesure la tension sur la broche ADC0 toutes les 200ms&lt;br /&gt;
*affiche sur la liaison série le message adéquat&lt;br /&gt;
**pas de voiture&lt;br /&gt;
**voiture branchée&lt;br /&gt;
**voiture en charge&lt;br /&gt;
&lt;br /&gt;
'''Remarques''' :&lt;br /&gt;
*il n'est pas possible de demander une mesure de la tension du niveau logique 1 de la MLI :&lt;br /&gt;
*on fait la mesure en permance&lt;br /&gt;
**si la valeur est trop faible (tension inférieur à 3V) ne pas en tenir compte =&amp;gt; c'est une mesure de la tension du niveau logique 0&lt;br /&gt;
**sinon envoyer le message selon la valeur mesurée&lt;br /&gt;
&lt;br /&gt;
= Exercice 4 : Affichage sur le mcp23008=&lt;br /&gt;
&lt;br /&gt;
le mcp23008 est un GPIO expander avec 8 gpio. Le principe d'utilisation est identique au mcp23017.&lt;br /&gt;
&lt;br /&gt;
Vous utiliserez [[Media:Mcp23008.pdf| la datasheet du composant]] pour écrire votre programme, ainsi que la déclaration des registres :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=cpp&amp;gt;&lt;br /&gt;
#define IODIR   0x00&lt;br /&gt;
#define IPOL    0x01&lt;br /&gt;
#define GPINTEN 0x02&lt;br /&gt;
#define DEFVAL  0x03&lt;br /&gt;
#define INTCON  0x04&lt;br /&gt;
#define IOCON   0x05&lt;br /&gt;
#define GPPU    0x06&lt;br /&gt;
#define INTF    0x07&lt;br /&gt;
#define INTCAP  0x08&lt;br /&gt;
#define GPIO    0x09&lt;br /&gt;
#define OLAT    0x0A&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Eval|4|Utiliser 3 leds du mcp23008 :}}&lt;br /&gt;
*la led de la gpio7 s'allume lorsqu'il n'y a pas de voiture&lt;br /&gt;
*la led de la gpio6 s'allume lorsqu'une voiture est branchée mais qu'elle ne charge pas&lt;br /&gt;
*la led de la gpio5 s'allume lorsqu'une voiture est branchée et en charge&lt;br /&gt;
&lt;br /&gt;
= Exercice 5 : Mise en place du protocole de charge=&lt;br /&gt;
&lt;br /&gt;
{{Eval|3|Implanter le protocole complet en gérant l'alimentation de la voiture avec le signal puissance}}&lt;br /&gt;
&lt;br /&gt;
*la broche {{Rouge|PC2 est utilisée pour alimenter la voiture}}&lt;br /&gt;
&lt;br /&gt;
=documentation=&lt;br /&gt;
*[[Media:Atmega328p.pdf|datasheet atmega328p]]&lt;br /&gt;
*[[Media:Current-State-of-the-Art-EV-Chargers.pdf|https://www.hnei.hawaii.edu/wp-content/uploads/Current-State-of-the-Art-EV-Chargers.pdf]]&lt;/div&gt;</summary>
		<author><name>Bjacquot</name></author>	</entry>

	<entry>
		<id>http://wikigeii.iut-troyes.univ-reims.fr//index.php?title=Cours:SaeRobotiqueSuiviLigne&amp;diff=20991</id>
		<title>Cours:SaeRobotiqueSuiviLigne</title>
		<link rel="alternate" type="text/html" href="http://wikigeii.iut-troyes.univ-reims.fr//index.php?title=Cours:SaeRobotiqueSuiviLigne&amp;diff=20991"/>
				<updated>2026-05-11T14:08:57Z</updated>
		
		<summary type="html">&lt;p&gt;Bjacquot : /* Séquence 2 : tâches complexes individuelles + réalisation shield */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=Utiliser des librairies arduino avec un main =&lt;br /&gt;
&lt;br /&gt;
[[Cours:ArduinoSansLoopSetup|Arduino sans loop/setup]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Un certain nombre de librairies utilisent les fontions arduino [https://github.com/arduino/ArduinoCore-avr/blob/master/cores/arduino/wiring.c delay/delayMicroseconds/millis/micros]&lt;br /&gt;
&lt;br /&gt;
Ces fonctions utilisent le Timer0 et en particulier l'interruption de débordement.&lt;br /&gt;
&lt;br /&gt;
Ce Timer est configuré dans la fonction [https://github.com/arduino/ArduinoCore-avr/blob/master/cores/arduino/wiring.c init()], qui est appelée dans le [https://github.com/arduino/ArduinoCore-avr/blob/master/cores/arduino/main.cpp &amp;quot;main arduino&amp;quot;]&lt;br /&gt;
&lt;br /&gt;
{|&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
On peut donc initialiser ce Timer0 pour qu'il génère un débordement tel qu'attendu.&lt;br /&gt;
&lt;br /&gt;
Ainsi les fonctions de gestion du temps Arduino peuvent fonctionner comme prévu et on peut ainsi utiliser les librairies qui en dépendent :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=cpp&amp;gt;&lt;br /&gt;
void initFonctionsTempsArduino()&lt;br /&gt;
{&lt;br /&gt;
  sei();&lt;br /&gt;
  // marche pour 328p et 2560 et autres ...&lt;br /&gt;
  // à adapter suivant le µc&lt;br /&gt;
  // cf https://github.com/arduino/ArduinoCore-avr/blob/master/cores/arduino/wiring.c&lt;br /&gt;
  TCCR0A=(1&amp;lt;&amp;lt;WGM01)|(1&amp;lt;&amp;lt;WGM00);&lt;br /&gt;
  TCCR0B=(1&amp;lt;&amp;lt;CS01)|(1&amp;lt;&amp;lt;CS00);&lt;br /&gt;
  TIMSK0=(1&amp;lt;&amp;lt;TOIE0);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
int main()&lt;br /&gt;
{&lt;br /&gt;
  initFonctionsTempsArduino();&lt;br /&gt;
  Serial.begin(115200);&lt;br /&gt;
  while(1)&lt;br /&gt;
  {&lt;br /&gt;
    delay(100);&lt;br /&gt;
    Serial.println(millis());&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
||&lt;br /&gt;
&amp;lt;source lang=cpp&amp;gt;&lt;br /&gt;
/*&lt;br /&gt;
Exemple pour le capteur vl53l1x :&lt;br /&gt;
cf exemple de la librairie pour des commentaires&lt;br /&gt;
*/&lt;br /&gt;
#include &amp;lt;Wire.h&amp;gt;&lt;br /&gt;
#include &amp;lt;VL53L1X.h&amp;gt;&lt;br /&gt;
VL53L1X sensor;&lt;br /&gt;
&lt;br /&gt;
void initFonctionsTempsArduino()&lt;br /&gt;
{&lt;br /&gt;
  sei();&lt;br /&gt;
  // marche pour 328p et 2560 et autres ...&lt;br /&gt;
  // à adapter suivant le µc&lt;br /&gt;
  // cf https://github.com/arduino/ArduinoCore-avr/blob/master/cores/arduino/wiring.c&lt;br /&gt;
  TCCR0A=(1&amp;lt;&amp;lt;WGM01)|(1&amp;lt;&amp;lt;WGM00);&lt;br /&gt;
  TCCR0B=(1&amp;lt;&amp;lt;CS01)|(1&amp;lt;&amp;lt;CS00);&lt;br /&gt;
  TIMSK0=(1&amp;lt;&amp;lt;TOIE0);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
int main()&lt;br /&gt;
{&lt;br /&gt;
  initFonctionsTempsArduino();&lt;br /&gt;
  while (!Serial) {}&lt;br /&gt;
  Serial.begin(115200);&lt;br /&gt;
  Wire.begin();&lt;br /&gt;
  Wire.setClock(400000); // use 400 kHz I2C&lt;br /&gt;
  sensor.setTimeout(500);&lt;br /&gt;
  if (!sensor.init())&lt;br /&gt;
  {&lt;br /&gt;
    Serial.println(&amp;quot;Failed to detect and initialize sensor!&amp;quot;);&lt;br /&gt;
    while (1);&lt;br /&gt;
  }&lt;br /&gt;
  sensor.setDistanceMode(VL53L1X::Long);&lt;br /&gt;
  sensor.setMeasurementTimingBudget(50000);&lt;br /&gt;
  sensor.startContinuous(50);&lt;br /&gt;
  while(1)&lt;br /&gt;
  {&lt;br /&gt;
    Serial.print(sensor.read());&lt;br /&gt;
    if (sensor.timeoutOccurred()) { Serial.print(&amp;quot; TIMEOUT&amp;quot;); }&lt;br /&gt;
    Serial.println();&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=Augmenter la rapidité des Lidars=&lt;br /&gt;
&amp;lt;source lang=cpp&amp;gt;&lt;br /&gt;
   sensors[i].setMeasurementTimingBudget(20000);&lt;br /&gt;
   sensors[i].setDistanceMode(VL53L1X::Short);&lt;br /&gt;
   sensors[i].startContinuous(20);&lt;br /&gt;
   sensors[0].read(false);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Séquence 1 : tâches élémentaires individuelles =&lt;br /&gt;
&lt;br /&gt;
* Tâches de suivi de ligne (un étudiant sur chaque tâche) :&lt;br /&gt;
** suivi de cap avec MPU9250&lt;br /&gt;
** suivi avec capteurs photorélectifs (nombre de capteurs à choisir)&lt;br /&gt;
** suivi avec Lidar, en suivant un mur sur le côté&lt;br /&gt;
&lt;br /&gt;
* s'arrêter à la fin du parcours&lt;br /&gt;
&lt;br /&gt;
* À faire globalement : câblage robot, sécurité&lt;br /&gt;
&lt;br /&gt;
==Livrable 1==&lt;br /&gt;
* faire des recherches pour rendre un dossier par groupe (pour lundi 27/05) expliquant : le pont en H, schéma sécurité et chaque partie (a, b, c)&lt;br /&gt;
* évaluation le 24/05 (code + questions + fonctionnement)&lt;br /&gt;
&lt;br /&gt;
= Séquence 2 : tâches complexes individuelles + réalisation shield =&lt;br /&gt;
&lt;br /&gt;
* Tâches de suivi (à modifier)&lt;br /&gt;
** Capteurs photoréflectifs : détection de marques à droite (si marque : on tourne à droite à l'intersection, sinon tout droit). Détection des marques à gauche : stop et recul pendant 1 seconde (environ) et on repart (pas d'arrêt sur le second passage)&lt;br /&gt;
** Lidar : suivi de mur à gauche ET à droite (priorité en suivi à droite). Faire tomber une première barre, pas la seconde.&lt;br /&gt;
&lt;br /&gt;
* Trois cartes à réaliser (une par étudiant)&lt;br /&gt;
** carte avec capteurs photoreflectifs&lt;br /&gt;
** carte drivers moteur&lt;br /&gt;
** carte shield arduino nano&lt;br /&gt;
&lt;br /&gt;
==Livrable 2==&lt;br /&gt;
&lt;br /&gt;
* évaluation le 02/06 (routage/fabrication)&lt;br /&gt;
&lt;br /&gt;
= Séquence 3 : Fusion des trois tâches et programmation globale=&lt;br /&gt;
&lt;br /&gt;
==Livrable 3 ==&lt;br /&gt;
&lt;br /&gt;
= Rapport final =&lt;br /&gt;
&lt;br /&gt;
* Rapport final :&lt;br /&gt;
** '''À envoyer au format pdf par mail avant le DD/MM/YY à HH'''&lt;br /&gt;
** Diagramme de Gantt&lt;br /&gt;
** diagramme algorithme général&lt;br /&gt;
** stratégie de résolution de chaque tâche&lt;br /&gt;
** Mini-concours à la fin pour sélectionner le meilleur robot (évaluation des capacités du robot, par étudiant en fonction de l'organisation prévue).&lt;br /&gt;
** Chiffrage incluant le matériel ainsi que les ressources humaines.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=Organisation=&lt;br /&gt;
&lt;br /&gt;
*Fonctionnement en trinôme sur 12 jours&lt;br /&gt;
**9h-12h&lt;br /&gt;
**13h30-16h30&lt;br /&gt;
*{{Rouge|Compte rendu écrit quotidien individuel}}&lt;br /&gt;
**sera contrôlé chaque matin&lt;br /&gt;
**doit indiquer les tâches réalisées la veille&lt;br /&gt;
**doit indiquer le travail à réaliser le jour même&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=Ressources=&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Composants/cartes==&lt;br /&gt;
*[[Cours:capteurPhotoReflectif|capteur '''photoréflectif''' pour détection de la {{Rouge|ligne}}]]&lt;br /&gt;
*convertisseur de niveau:&lt;br /&gt;
**https://www.eeweb.com/level-shifting-techniques-in-i2c-bus-design/&lt;br /&gt;
*Batterie LiFePo4&lt;br /&gt;
**assemblage de 4 éléments LiFePo4&lt;br /&gt;
**documentation sur les cellules [[Media:CellulesLiFePo4.pdf]]&lt;br /&gt;
**tensions à ne pas dépasser :&lt;br /&gt;
***maximum : 3,45V/élément&lt;br /&gt;
***minimum : 2,65V/élément&lt;br /&gt;
***ne pas démarrer le robot : 2,85V/élément&lt;br /&gt;
*divers&lt;br /&gt;
**Commutateur d'arrêt d'urgence https://fr.farnell.com/idec/yw1b-v4e01r/commut-bp-e-stop-spst-nc-10a-120v/dp/2833849?ost=2833849&lt;br /&gt;
**Régulateur ajustable 1,25 à 30 Vcc https://www.gotronic.fr/art-regulateur-ajustable-1-25-a-30-vcc-gt134-26094.htm&lt;br /&gt;
*driver de moteur&lt;br /&gt;
**https://www.cytron.io/p-13amp-6v-30v-dc-motor-driver&lt;br /&gt;
*capteurs de distance/contact&lt;br /&gt;
**HC-SR04  cf fiche technique sur la page : https://www.gotronic.fr/art-module-de-detection-us-hc-sr04-20912.htm&lt;br /&gt;
**VL53L1X&lt;br /&gt;
***https://www.robotshop.com/eu/fr/platine-deploiement-capteur-distance-tof-regulateur-tension-vl53l1x.html&lt;br /&gt;
***https://github.com/pololu/vl53l1x-arduino&lt;br /&gt;
**Mini Microrupteur - SPDT https://www.robotshop.com/eu/fr/mini-microrupteur-spdt-levier-rouleau.html&lt;br /&gt;
**GP2Yxxxx https://www.gotronic.fr/art-capteur-de-mesure-sharp-gp2y0a41sk0f-18338.htm&lt;br /&gt;
**lidar tfmini-s&lt;br /&gt;
***https://www.robotshop.com/eu/fr/module-micro-lidar-tfmini-s-benewake-i2c-12m.html&lt;br /&gt;
***https://www.arduino.cc/reference/en/libraries/tfmpi2c/&lt;br /&gt;
**lidar Lite 3&lt;br /&gt;
***https://www.robotshop.com/eu/fr/capteur-distance-laser-haute-performance-lidar-lite-3-llv3hp.html&lt;br /&gt;
***https://github.com/RobotShop/LIDARLite_v3_Arduino_Library&lt;br /&gt;
*caméra&lt;br /&gt;
**pixyv2&lt;br /&gt;
***https://pixycam.com/pixy2/&lt;br /&gt;
***[[Cours:TPS_2103_tp_pixy|TP caméra pixy]]&lt;br /&gt;
***Avoir un PixyMon plus rapide dans la g.008 :&lt;br /&gt;
****utiliser un 2ème poste&lt;br /&gt;
****ne pas se connecter sur nomachine&lt;br /&gt;
****lancer un terminal&lt;br /&gt;
****lancer la commande PixyMon&lt;br /&gt;
*IMU&lt;br /&gt;
**Explications du principe du capteur mpu9250 : https://learn.sparkfun.com/tutorials/mpu-9250-hookup-guide/all&lt;br /&gt;
**Bibliothèque à utiliser : dans le gestionnaire de bibliothèque =&amp;gt; ''by hideakitai'' (v 0.4.8) ou https://github.com/hideakitai/MPU9250&lt;br /&gt;
**Étapes :&lt;br /&gt;
***Réaliser la calibration et noter les valeurs affichées,&lt;br /&gt;
***les entrer dans votre programme (fonctions setMagBias() et setMagScale()&lt;br /&gt;
***Pour réaliser une mesure, se servir des programmes d'exemples&lt;br /&gt;
*Robot Arrex :&lt;br /&gt;
** [[Cours:RobotArrex]] (section documents)&lt;br /&gt;
** avec shield moteur&lt;br /&gt;
&lt;br /&gt;
==Fichiers/Images==&lt;br /&gt;
&lt;br /&gt;
*[[Image:CircuitBUT2.png|250px]]&lt;br /&gt;
&lt;br /&gt;
==liens (dont règlement concours) ==&lt;br /&gt;
* concours robotique Cachan, lien vers le règlement en pdf : https://www.festivalrobotiquecachan.fr/wp-content/uploads/Reglement_rencontres_de_robotique_GEII_BUT-1-2-3.pdf&lt;br /&gt;
* [[Media:FRC2024-Guideparticipant-v1.01.pdf|Organisation du concours]]&lt;br /&gt;
*[[Cours:archive SAÉ robot joueur de tennis]]&lt;br /&gt;
*[[Cours:archive SAÉ suivi de ligne]]&lt;br /&gt;
*https://www.youtube.com/watch?v=xH8EIqh-2_Y&lt;/div&gt;</summary>
		<author><name>Bjacquot</name></author>	</entry>

	<entry>
		<id>http://wikigeii.iut-troyes.univ-reims.fr//index.php?title=Cours:PiPico&amp;diff=20939</id>
		<title>Cours:PiPico</title>
		<link rel="alternate" type="text/html" href="http://wikigeii.iut-troyes.univ-reims.fr//index.php?title=Cours:PiPico&amp;diff=20939"/>
				<updated>2026-04-09T08:48:47Z</updated>
		
		<summary type="html">&lt;p&gt;Bjacquot : /* configuration cmake */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Brochage =&lt;br /&gt;
&lt;br /&gt;
https://datasheets.raspberrypi.com/pico/Pico-R3-A4-Pinout.pdf&lt;br /&gt;
&lt;br /&gt;
=utilisation de l'ide arduino=&lt;br /&gt;
&lt;br /&gt;
https://github.com/earlephilhower/arduino-pico&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=non recommandé : QtCreator=&lt;br /&gt;
&lt;br /&gt;
== Création assistée d'un projet ==&lt;br /&gt;
&lt;br /&gt;
À l'aide de ''pico_project.py'' :&lt;br /&gt;
* ''git clone https://github.com/raspberrypi/pico-project-generator.git''&lt;br /&gt;
* ''./pico_project.py --gui''&lt;br /&gt;
* ne pas cocher &amp;quot;create VSCode project&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Attention, ne pas oublier de spécifier le chemin vers le SDK :&lt;br /&gt;
* ''export PICO_SDK_PATH=../../pico-sdk'' en remplaçant ''../../pico-sdk'' par le chemin vers le SDK.&lt;br /&gt;
&lt;br /&gt;
== Ouverture avec QTCreator ==&lt;br /&gt;
&lt;br /&gt;
QtCreator est capable de lire et interpréter le fichier ''CMakeLists.txt'' comme descripteur de projet, il suffit donc&lt;br /&gt;
* d'ouvrir (comme projet) le fichier ''CMakeLists.txt''&lt;br /&gt;
&lt;br /&gt;
=VsCode=&lt;br /&gt;
&lt;br /&gt;
*installer VsCode&lt;br /&gt;
**https://doc.ubuntu-fr.org/visual_studio_code&lt;br /&gt;
*ajouter le plugin pi pico&lt;br /&gt;
**https://github.com/raspberrypi/pico-vscode&lt;br /&gt;
**https://datasheets.raspberrypi.com/pico/getting-started-with-pico.pdf&lt;br /&gt;
&lt;br /&gt;
=Registres=&lt;br /&gt;
&lt;br /&gt;
==gpio==&lt;br /&gt;
&amp;lt;source lang=cpp&amp;gt;&lt;br /&gt;
#include &amp;quot;pico/stdlib.h&amp;quot;&lt;br /&gt;
#include &amp;quot;hardware/regs/addressmap.h&amp;quot;&lt;br /&gt;
&lt;br /&gt;
unsigned int&amp;amp; gpioOUT = *(unsigned int*) (SIO_BASE + 0x10);&lt;br /&gt;
unsigned int&amp;amp; gpioOE  = *(unsigned int*) (SIO_BASE + 0x20);&lt;br /&gt;
&lt;br /&gt;
unsigned int&amp;amp; gpioCtrl0 = *(unsigned int *) (IO_BANK0_BASE+0x4);&lt;br /&gt;
//facultatif&lt;br /&gt;
unsigned int&amp;amp; padsBank0_GPIO0 = *(unsigned int *) (PADS_BANK0_BASE+0x4);&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
int main() {&lt;br /&gt;
    // facultatif&lt;br /&gt;
    padsBank0_GPIO0|=(1&amp;lt;&amp;lt;6); // input enable&lt;br /&gt;
    padsBank0_GPIO0&amp;amp;=~(1&amp;lt;&amp;lt;7); // output disable&lt;br /&gt;
    // piloter la broche avec fonction SIO&lt;br /&gt;
    gpioCtrl0=5;&lt;br /&gt;
    // sortie enable&lt;br /&gt;
    gpioOE=1&amp;lt;&amp;lt;0;&lt;br /&gt;
    while (true)&lt;br /&gt;
    {&lt;br /&gt;
        gpioOUT&amp;amp;=~(1&amp;lt;&amp;lt;0);&lt;br /&gt;
        sleep_ms(200);&lt;br /&gt;
        gpioOUT|=(1&amp;lt;&amp;lt;0);&lt;br /&gt;
        sleep_ms(10);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=usage des périphériques au travers du sdk=&lt;br /&gt;
&lt;br /&gt;
== Référence en PDF du Pico C++ SDK ==&lt;br /&gt;
&lt;br /&gt;
[https://pip-assets.raspberrypi.com/categories/609-microcontroller-boards/documents/RP-009085-KB-1-raspberry-pi-pico-c-sdk.pdf Raspberry Pi Pico-series C/C++ SDK Libraries and tools for C/C++ development on Raspberry Pi microcontrollers]&lt;br /&gt;
&lt;br /&gt;
==GPIO==&lt;br /&gt;
&lt;br /&gt;
https://www.raspberrypi.com/documentation/pico-sdk/hardware.html#hardware_gpio&lt;br /&gt;
&lt;br /&gt;
==IO==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Syntaxe&lt;br /&gt;
||void gpio_init(uint gpio)&lt;br /&gt;
|-&lt;br /&gt;
! Paramètres&lt;br /&gt;
||&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| gpio || numéro de gpio&lt;br /&gt;
|}&lt;br /&gt;
|}&lt;br /&gt;
*gpio_put(LED_PIN, 1);&lt;br /&gt;
*gpio_set_dir(LED_PIN, GPIO_OUT);&lt;br /&gt;
*gpio_set_pulls (uint gpio, bool up, bool down)&lt;br /&gt;
&lt;br /&gt;
==interrupt==&lt;br /&gt;
&lt;br /&gt;
Il n'y a pas d'interruption dédiée à une broche particulière. Toutes les gpio déclenchent la même interruption. Il convient ensuite de regarder lesquelles ont déclenchées l'interruption :&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=cpp&amp;gt;&lt;br /&gt;
&lt;br /&gt;
void my_raw_interrupt_handler()&lt;br /&gt;
{&lt;br /&gt;
   const int32_t gpio;&lt;br /&gt;
   if (gpio_get_irq_event_mask(gpio) &amp;amp; (GPIO_IRQ_EDGE_RISE|GPIO_IRQ_EDGE_FALL))&lt;br /&gt;
    {&lt;br /&gt;
        if (gpio_get_irq_event_mask(gpio) &amp;amp; (GPIO_IRQ_EDGE_RISE)) // Front Montant&lt;br /&gt;
        {&lt;br /&gt;
&lt;br /&gt;
        } &lt;br /&gt;
        else&lt;br /&gt;
        {&lt;br /&gt;
        }&lt;br /&gt;
        gpio_acknowledge_irq(gpio, GPIO_IRQ_EDGE_RISE|GPIO_IRQ_EDGE_FALL);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
...&lt;br /&gt;
gpio_set_irq_enabled(2, GPIO_IRQ_EDGE_FALL | GPIO_IRQ_EDGE_RISE, true);&lt;br /&gt;
...&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Pwm==&lt;br /&gt;
&lt;br /&gt;
https://raspberry-pi.developpez.com/actu/344283/Raspberry-Pi-Pico-moins-Apprendre-a-generer-des-signaux-PWM-un-billet-blog-de-f-leb/&lt;br /&gt;
&lt;br /&gt;
 Fmli = Fcpu / ( wrap * clkdiv ) // sur pi pico, Fcpu=125MHz&lt;br /&gt;
&lt;br /&gt;
*clkdiv:&lt;br /&gt;
**Le registre qui stocke le diviseur de fréquence comprend 8 bits pour la partie entière, et 4 bits pour la partie fractionnaire&lt;br /&gt;
**valeur max de clkdiv : 255 + 15/16&lt;br /&gt;
**ex : pwm_set_clkdiv_int_frac (slice, 38, 3); // diviseur de fréquence = 38 + 3/16 &lt;br /&gt;
&lt;br /&gt;
*gpio_set_function(PICO_DEFAULT_LED_PIN, GPIO_FUNC_PWM);&lt;br /&gt;
*uint slice_num = pwm_gpio_to_slice_num(PICO_DEFAULT_LED_PIN);&lt;br /&gt;
*pwm_config config = pwm_get_default_config();&lt;br /&gt;
*pwm_config_set_clkdiv(&amp;amp;config, 4.f);&lt;br /&gt;
*pwm_init(slice_num, &amp;amp;config, true);&lt;br /&gt;
*pwm_set_gpio_level(PICO_DEFAULT_LED_PIN, fade * fade); // rapport cyclique 16 bits&lt;br /&gt;
&lt;br /&gt;
==I2C==&lt;br /&gt;
&lt;br /&gt;
===configuration cmake===&lt;br /&gt;
dans le fichier CMakeLists.txt ajouter dans la liste target_link_libraries&lt;br /&gt;
&amp;lt;source lang=cpp&amp;gt;&lt;br /&gt;
target_link_libraries( &lt;br /&gt;
        ....&lt;br /&gt;
        hardware_i2c&lt;br /&gt;
        ....&lt;br /&gt;
        )&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===i2c scanner===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=cpp&amp;gt;&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
#include &amp;quot;pico/stdlib.h&amp;quot;&lt;br /&gt;
#include &amp;quot;hardware/i2c.h&amp;quot;&lt;br /&gt;
#include &amp;quot;hardware/timer.h&amp;quot;&lt;br /&gt;
#include &amp;quot;hardware/clocks.h&amp;quot;&lt;br /&gt;
#include &amp;quot;pico/binary_info.h&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
int64_t alarm_callback(alarm_id_t id, void *user_data) {&lt;br /&gt;
    // Put your timeout handler code in here&lt;br /&gt;
    return 0;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
bool reserved_addr(uint8_t addr) {&lt;br /&gt;
    return (addr &amp;amp; 0x78) == 0 || (addr &amp;amp; 0x78) == 0x78;&lt;br /&gt;
}&lt;br /&gt;
int main()&lt;br /&gt;
{&lt;br /&gt;
    stdio_init_all();&lt;br /&gt;
&lt;br /&gt;
    // I2C Initialisation. Using it at 400Khz.&lt;br /&gt;
    i2c_init(i2c0, 100*1000);&lt;br /&gt;
    &lt;br /&gt;
    gpio_set_function(PICO_DEFAULT_I2C_SDA_PIN, GPIO_FUNC_I2C);&lt;br /&gt;
    gpio_set_function(PICO_DEFAULT_I2C_SCL_PIN, GPIO_FUNC_I2C);&lt;br /&gt;
    gpio_pull_up(PICO_DEFAULT_I2C_SDA_PIN);&lt;br /&gt;
    gpio_pull_up(PICO_DEFAULT_I2C_SCL_PIN);&lt;br /&gt;
    // For more examples of I2C use see https://github.com/raspberrypi/pico-examples/tree/master/i2c&lt;br /&gt;
    bi_decl(bi_2pins_with_func(PICO_DEFAULT_I2C_SDA_PIN, PICO_DEFAULT_I2C_SCL_PIN, GPIO_FUNC_I2C));&lt;br /&gt;
&lt;br /&gt;
    // Timer example code - This example fires off the callback after 2000ms&lt;br /&gt;
    add_alarm_in_ms(2000, alarm_callback, NULL, false);&lt;br /&gt;
    // For more examples of timer use see https://github.com/raspberrypi/pico-examples/tree/master/timer&lt;br /&gt;
&lt;br /&gt;
    printf(&amp;quot;System Clock Frequency is %d Hz\n&amp;quot;, clock_get_hz(clk_sys));&lt;br /&gt;
    printf(&amp;quot;USB Clock Frequency is %d Hz\n&amp;quot;, clock_get_hz(clk_usb));&lt;br /&gt;
    // For more examples of clocks use see https://github.com/raspberrypi/pico-examples/tree/master/clocks&lt;br /&gt;
&lt;br /&gt;
    while (true) {&lt;br /&gt;
        printf(&amp;quot;\nI2C Bus Scan\n&amp;quot;);&lt;br /&gt;
        printf(&amp;quot;   0  1  2  3  4  5  6  7  8  9  A  B  C  D  E  F\n&amp;quot;);&lt;br /&gt;
    &lt;br /&gt;
        for (int addr = 0; addr &amp;lt; (1 &amp;lt;&amp;lt; 7); ++addr) {&lt;br /&gt;
            if (addr % 16 == 0) {&lt;br /&gt;
                printf(&amp;quot;%02x &amp;quot;, addr);&lt;br /&gt;
            }&lt;br /&gt;
    &lt;br /&gt;
            // Perform a 1-byte dummy read from the probe address. If a slave&lt;br /&gt;
            // acknowledges this address, the function returns the number of bytes&lt;br /&gt;
            // transferred. If the address byte is ignored, the function returns&lt;br /&gt;
            // -1.&lt;br /&gt;
    &lt;br /&gt;
            // Skip over any reserved addresses.&lt;br /&gt;
            int ret;&lt;br /&gt;
            uint8_t rxdata;&lt;br /&gt;
            if (reserved_addr(addr))&lt;br /&gt;
                ret = PICO_ERROR_GENERIC;&lt;br /&gt;
            else&lt;br /&gt;
                ret = i2c_read_blocking(i2c_default, addr, &amp;amp;rxdata, 1, false);&lt;br /&gt;
    &lt;br /&gt;
            printf(ret &amp;lt; 0 ? &amp;quot;.&amp;quot; : &amp;quot;@&amp;quot;);&lt;br /&gt;
            printf(addr % 16 == 15 ? &amp;quot;\n&amp;quot; : &amp;quot;  &amp;quot;);&lt;br /&gt;
        }&lt;br /&gt;
        printf(&amp;quot;Done.\n&amp;quot;);&lt;br /&gt;
    &lt;br /&gt;
        sleep_ms(1000);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===read/write register===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=cpp&amp;gt;&lt;br /&gt;
void writeI2cReg(uint8_t targetAddress, uint8_t regAddress, uint8_t regValue)&lt;br /&gt;
{&lt;br /&gt;
    uint8_t data[2]={regAddress,regValue};&lt;br /&gt;
    i2c_write_blocking(i2c0,targetAddress,data,2,false);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
uint8_t readI2cReg(uint8_t targetAddress, uint8_t regAddress)&lt;br /&gt;
{&lt;br /&gt;
    i2c_write_blocking(i2c0,targetAddress,&amp;amp;regAddress,1,true);&lt;br /&gt;
    uint8_t regValue;&lt;br /&gt;
    i2c_read_blocking(i2c0,targetAddress,&amp;amp;regValue,1,false);&lt;br /&gt;
    return regValue;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==adc==&lt;br /&gt;
&lt;br /&gt;
==uart==&lt;br /&gt;
*https://www.raspberrypi.com/documentation/pico-sdk/hardware.html#group_hardware_uart&lt;br /&gt;
&lt;br /&gt;
==pio==&lt;br /&gt;
&lt;br /&gt;
===ws2812===&lt;br /&gt;
https://github.com/ForsakenNGS/PicoLED&lt;br /&gt;
&lt;br /&gt;
=liens=&lt;br /&gt;
*https://www.gibbard.me/using_the_raspberry_pi_pico_on_ubuntu/&lt;br /&gt;
*https://tutoduino.fr/en/pico-platformio/&lt;br /&gt;
*visual studio code :&lt;br /&gt;
**https://datasheets.raspberrypi.com/pico/getting-started-with-pico.pdf partie 7.1&lt;br /&gt;
**https://www.electronicshub.org/program-raspberry-pi-pico-with-visual-studio-code/&lt;br /&gt;
*https://github.com/raspberrypi/picotool&lt;/div&gt;</summary>
		<author><name>Bjacquot</name></author>	</entry>

	<entry>
		<id>http://wikigeii.iut-troyes.univ-reims.fr//index.php?title=Cours:PiPico&amp;diff=20937</id>
		<title>Cours:PiPico</title>
		<link rel="alternate" type="text/html" href="http://wikigeii.iut-troyes.univ-reims.fr//index.php?title=Cours:PiPico&amp;diff=20937"/>
				<updated>2026-04-09T08:16:12Z</updated>
		
		<summary type="html">&lt;p&gt;Bjacquot : /* I2C */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Brochage =&lt;br /&gt;
&lt;br /&gt;
https://datasheets.raspberrypi.com/pico/Pico-R3-A4-Pinout.pdf&lt;br /&gt;
&lt;br /&gt;
=utilisation de l'ide arduino=&lt;br /&gt;
&lt;br /&gt;
https://github.com/earlephilhower/arduino-pico&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=non recommandé : QtCreator=&lt;br /&gt;
&lt;br /&gt;
== Création assistée d'un projet ==&lt;br /&gt;
&lt;br /&gt;
À l'aide de ''pico_project.py'' :&lt;br /&gt;
* ''git clone https://github.com/raspberrypi/pico-project-generator.git''&lt;br /&gt;
* ''./pico_project.py --gui''&lt;br /&gt;
* ne pas cocher &amp;quot;create VSCode project&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Attention, ne pas oublier de spécifier le chemin vers le SDK :&lt;br /&gt;
* ''export PICO_SDK_PATH=../../pico-sdk'' en remplaçant ''../../pico-sdk'' par le chemin vers le SDK.&lt;br /&gt;
&lt;br /&gt;
== Ouverture avec QTCreator ==&lt;br /&gt;
&lt;br /&gt;
QtCreator est capable de lire et interpréter le fichier ''CMakeLists.txt'' comme descripteur de projet, il suffit donc&lt;br /&gt;
* d'ouvrir (comme projet) le fichier ''CMakeLists.txt''&lt;br /&gt;
&lt;br /&gt;
=VsCode=&lt;br /&gt;
&lt;br /&gt;
*installer VsCode&lt;br /&gt;
**https://doc.ubuntu-fr.org/visual_studio_code&lt;br /&gt;
*ajouter le plugin pi pico&lt;br /&gt;
**https://github.com/raspberrypi/pico-vscode&lt;br /&gt;
**https://datasheets.raspberrypi.com/pico/getting-started-with-pico.pdf&lt;br /&gt;
&lt;br /&gt;
=Registres=&lt;br /&gt;
&lt;br /&gt;
==gpio==&lt;br /&gt;
&amp;lt;source lang=cpp&amp;gt;&lt;br /&gt;
#include &amp;quot;pico/stdlib.h&amp;quot;&lt;br /&gt;
#include &amp;quot;hardware/regs/addressmap.h&amp;quot;&lt;br /&gt;
&lt;br /&gt;
unsigned int&amp;amp; gpioOUT = *(unsigned int*) (SIO_BASE + 0x10);&lt;br /&gt;
unsigned int&amp;amp; gpioOE  = *(unsigned int*) (SIO_BASE + 0x20);&lt;br /&gt;
&lt;br /&gt;
unsigned int&amp;amp; gpioCtrl0 = *(unsigned int *) (IO_BANK0_BASE+0x4);&lt;br /&gt;
//facultatif&lt;br /&gt;
unsigned int&amp;amp; padsBank0_GPIO0 = *(unsigned int *) (PADS_BANK0_BASE+0x4);&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
int main() {&lt;br /&gt;
    // facultatif&lt;br /&gt;
    padsBank0_GPIO0|=(1&amp;lt;&amp;lt;6); // input enable&lt;br /&gt;
    padsBank0_GPIO0&amp;amp;=~(1&amp;lt;&amp;lt;7); // output disable&lt;br /&gt;
    // piloter la broche avec fonction SIO&lt;br /&gt;
    gpioCtrl0=5;&lt;br /&gt;
    // sortie enable&lt;br /&gt;
    gpioOE=1&amp;lt;&amp;lt;0;&lt;br /&gt;
    while (true)&lt;br /&gt;
    {&lt;br /&gt;
        gpioOUT&amp;amp;=~(1&amp;lt;&amp;lt;0);&lt;br /&gt;
        sleep_ms(200);&lt;br /&gt;
        gpioOUT|=(1&amp;lt;&amp;lt;0);&lt;br /&gt;
        sleep_ms(10);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=usage des périphériques au travers du sdk=&lt;br /&gt;
&lt;br /&gt;
== Pico C++ SDK ==&lt;br /&gt;
&lt;br /&gt;
Raspberry Pi Pico-series C/C++ SDK&lt;br /&gt;
Libraries and tools for C/C++ development on Raspberry Pi&lt;br /&gt;
microcontrollers : &lt;br /&gt;
https://pip-assets.raspberrypi.com/categories/609-microcontroller-boards/documents/RP-009085-KB-1-raspberry-pi-pico-c-sdk.pdf&lt;br /&gt;
&lt;br /&gt;
==GPIO==&lt;br /&gt;
&lt;br /&gt;
https://www.raspberrypi.com/documentation/pico-sdk/hardware.html#hardware_gpio&lt;br /&gt;
&lt;br /&gt;
==IO==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Syntaxe&lt;br /&gt;
||void gpio_init(uint gpio)&lt;br /&gt;
|-&lt;br /&gt;
! Paramètres&lt;br /&gt;
||&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| gpio || numéro de gpio&lt;br /&gt;
|}&lt;br /&gt;
|}&lt;br /&gt;
*gpio_put(LED_PIN, 1);&lt;br /&gt;
*gpio_set_dir(LED_PIN, GPIO_OUT);&lt;br /&gt;
*gpio_set_pulls (uint gpio, bool up, bool down)&lt;br /&gt;
&lt;br /&gt;
==interrupt==&lt;br /&gt;
&lt;br /&gt;
Il n'y a pas d'interruption dédiée à une broche particulière. Toutes les gpio déclenchent la même interruption. Il convient ensuite de regarder lesquelles ont déclenchées l'interruption :&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=cpp&amp;gt;&lt;br /&gt;
&lt;br /&gt;
void my_raw_interrupt_handler()&lt;br /&gt;
{&lt;br /&gt;
   const int32_t gpio;&lt;br /&gt;
   if (gpio_get_irq_event_mask(gpio) &amp;amp; (GPIO_IRQ_EDGE_RISE|GPIO_IRQ_EDGE_FALL))&lt;br /&gt;
    {&lt;br /&gt;
        if (gpio_get_irq_event_mask(gpio) &amp;amp; (GPIO_IRQ_EDGE_RISE)) // Front Montant&lt;br /&gt;
        {&lt;br /&gt;
&lt;br /&gt;
        } &lt;br /&gt;
        else&lt;br /&gt;
        {&lt;br /&gt;
        }&lt;br /&gt;
        gpio_acknowledge_irq(gpio, GPIO_IRQ_EDGE_RISE|GPIO_IRQ_EDGE_FALL);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
...&lt;br /&gt;
gpio_set_irq_enabled(2, GPIO_IRQ_EDGE_FALL | GPIO_IRQ_EDGE_RISE, true);&lt;br /&gt;
...&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Pwm==&lt;br /&gt;
&lt;br /&gt;
https://raspberry-pi.developpez.com/actu/344283/Raspberry-Pi-Pico-moins-Apprendre-a-generer-des-signaux-PWM-un-billet-blog-de-f-leb/&lt;br /&gt;
&lt;br /&gt;
 Fmli = Fcpu / ( wrap * clkdiv ) // sur pi pico, Fcpu=125MHz&lt;br /&gt;
&lt;br /&gt;
*clkdiv:&lt;br /&gt;
**Le registre qui stocke le diviseur de fréquence comprend 8 bits pour la partie entière, et 4 bits pour la partie fractionnaire&lt;br /&gt;
**valeur max de clkdiv : 255 + 15/16&lt;br /&gt;
**ex : pwm_set_clkdiv_int_frac (slice, 38, 3); // diviseur de fréquence = 38 + 3/16 &lt;br /&gt;
&lt;br /&gt;
*gpio_set_function(PICO_DEFAULT_LED_PIN, GPIO_FUNC_PWM);&lt;br /&gt;
*uint slice_num = pwm_gpio_to_slice_num(PICO_DEFAULT_LED_PIN);&lt;br /&gt;
*pwm_config config = pwm_get_default_config();&lt;br /&gt;
*pwm_config_set_clkdiv(&amp;amp;config, 4.f);&lt;br /&gt;
*pwm_init(slice_num, &amp;amp;config, true);&lt;br /&gt;
*pwm_set_gpio_level(PICO_DEFAULT_LED_PIN, fade * fade); // rapport cyclique 16 bits&lt;br /&gt;
&lt;br /&gt;
==I2C==&lt;br /&gt;
&lt;br /&gt;
==configuration cmake==&lt;br /&gt;
ajouter dans la liste target_link_libraries&lt;br /&gt;
&amp;lt;source lang=cpp&amp;gt;&lt;br /&gt;
target_link_libraries( &lt;br /&gt;
        ....&lt;br /&gt;
        hardware_i2c&lt;br /&gt;
        ....&lt;br /&gt;
        )&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===i2c scanner===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=cpp&amp;gt;&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
#include &amp;quot;pico/stdlib.h&amp;quot;&lt;br /&gt;
#include &amp;quot;hardware/i2c.h&amp;quot;&lt;br /&gt;
#include &amp;quot;hardware/timer.h&amp;quot;&lt;br /&gt;
#include &amp;quot;hardware/clocks.h&amp;quot;&lt;br /&gt;
#include &amp;quot;pico/binary_info.h&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
int64_t alarm_callback(alarm_id_t id, void *user_data) {&lt;br /&gt;
    // Put your timeout handler code in here&lt;br /&gt;
    return 0;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
bool reserved_addr(uint8_t addr) {&lt;br /&gt;
    return (addr &amp;amp; 0x78) == 0 || (addr &amp;amp; 0x78) == 0x78;&lt;br /&gt;
}&lt;br /&gt;
int main()&lt;br /&gt;
{&lt;br /&gt;
    stdio_init_all();&lt;br /&gt;
&lt;br /&gt;
    // I2C Initialisation. Using it at 400Khz.&lt;br /&gt;
    i2c_init(i2c0, 100*1000);&lt;br /&gt;
    &lt;br /&gt;
    gpio_set_function(PICO_DEFAULT_I2C_SDA_PIN, GPIO_FUNC_I2C);&lt;br /&gt;
    gpio_set_function(PICO_DEFAULT_I2C_SCL_PIN, GPIO_FUNC_I2C);&lt;br /&gt;
    gpio_pull_up(PICO_DEFAULT_I2C_SDA_PIN);&lt;br /&gt;
    gpio_pull_up(PICO_DEFAULT_I2C_SCL_PIN);&lt;br /&gt;
    // For more examples of I2C use see https://github.com/raspberrypi/pico-examples/tree/master/i2c&lt;br /&gt;
    bi_decl(bi_2pins_with_func(PICO_DEFAULT_I2C_SDA_PIN, PICO_DEFAULT_I2C_SCL_PIN, GPIO_FUNC_I2C));&lt;br /&gt;
&lt;br /&gt;
    // Timer example code - This example fires off the callback after 2000ms&lt;br /&gt;
    add_alarm_in_ms(2000, alarm_callback, NULL, false);&lt;br /&gt;
    // For more examples of timer use see https://github.com/raspberrypi/pico-examples/tree/master/timer&lt;br /&gt;
&lt;br /&gt;
    printf(&amp;quot;System Clock Frequency is %d Hz\n&amp;quot;, clock_get_hz(clk_sys));&lt;br /&gt;
    printf(&amp;quot;USB Clock Frequency is %d Hz\n&amp;quot;, clock_get_hz(clk_usb));&lt;br /&gt;
    // For more examples of clocks use see https://github.com/raspberrypi/pico-examples/tree/master/clocks&lt;br /&gt;
&lt;br /&gt;
    while (true) {&lt;br /&gt;
        printf(&amp;quot;\nI2C Bus Scan\n&amp;quot;);&lt;br /&gt;
        printf(&amp;quot;   0  1  2  3  4  5  6  7  8  9  A  B  C  D  E  F\n&amp;quot;);&lt;br /&gt;
    &lt;br /&gt;
        for (int addr = 0; addr &amp;lt; (1 &amp;lt;&amp;lt; 7); ++addr) {&lt;br /&gt;
            if (addr % 16 == 0) {&lt;br /&gt;
                printf(&amp;quot;%02x &amp;quot;, addr);&lt;br /&gt;
            }&lt;br /&gt;
    &lt;br /&gt;
            // Perform a 1-byte dummy read from the probe address. If a slave&lt;br /&gt;
            // acknowledges this address, the function returns the number of bytes&lt;br /&gt;
            // transferred. If the address byte is ignored, the function returns&lt;br /&gt;
            // -1.&lt;br /&gt;
    &lt;br /&gt;
            // Skip over any reserved addresses.&lt;br /&gt;
            int ret;&lt;br /&gt;
            uint8_t rxdata;&lt;br /&gt;
            if (reserved_addr(addr))&lt;br /&gt;
                ret = PICO_ERROR_GENERIC;&lt;br /&gt;
            else&lt;br /&gt;
                ret = i2c_read_blocking(i2c_default, addr, &amp;amp;rxdata, 1, false);&lt;br /&gt;
    &lt;br /&gt;
            printf(ret &amp;lt; 0 ? &amp;quot;.&amp;quot; : &amp;quot;@&amp;quot;);&lt;br /&gt;
            printf(addr % 16 == 15 ? &amp;quot;\n&amp;quot; : &amp;quot;  &amp;quot;);&lt;br /&gt;
        }&lt;br /&gt;
        printf(&amp;quot;Done.\n&amp;quot;);&lt;br /&gt;
    &lt;br /&gt;
        sleep_ms(1000);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===read/write register===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=cpp&amp;gt;&lt;br /&gt;
void writeI2cReg(uint8_t targetAddress, uint8_t regAddress, uint8_t regValue)&lt;br /&gt;
{&lt;br /&gt;
    uint8_t data[2]={regAddress,regValue};&lt;br /&gt;
    i2c_write_blocking(i2c0,targetAddress,data,2,false);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
uint8_t readI2cReg(uint8_t targetAddress, uint8_t regAddress)&lt;br /&gt;
{&lt;br /&gt;
    i2c_write_blocking(i2c0,targetAddress,&amp;amp;regAddress,1,true);&lt;br /&gt;
    uint8_t regValue;&lt;br /&gt;
    i2c_read_blocking(i2c0,targetAddress,&amp;amp;regValue,1,false);&lt;br /&gt;
    return regValue;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==adc==&lt;br /&gt;
&lt;br /&gt;
==uart==&lt;br /&gt;
*https://www.raspberrypi.com/documentation/pico-sdk/hardware.html#group_hardware_uart&lt;br /&gt;
&lt;br /&gt;
==pio==&lt;br /&gt;
&lt;br /&gt;
===ws2812===&lt;br /&gt;
https://github.com/ForsakenNGS/PicoLED&lt;br /&gt;
&lt;br /&gt;
=liens=&lt;br /&gt;
*https://www.gibbard.me/using_the_raspberry_pi_pico_on_ubuntu/&lt;br /&gt;
*https://tutoduino.fr/en/pico-platformio/&lt;br /&gt;
*visual studio code :&lt;br /&gt;
**https://datasheets.raspberrypi.com/pico/getting-started-with-pico.pdf partie 7.1&lt;br /&gt;
**https://www.electronicshub.org/program-raspberry-pi-pico-with-visual-studio-code/&lt;br /&gt;
*https://github.com/raspberrypi/picotool&lt;/div&gt;</summary>
		<author><name>Bjacquot</name></author>	</entry>

	<entry>
		<id>http://wikigeii.iut-troyes.univ-reims.fr//index.php?title=Cours:SaeEvitementObstacles&amp;diff=20933</id>
		<title>Cours:SaeEvitementObstacles</title>
		<link rel="alternate" type="text/html" href="http://wikigeii.iut-troyes.univ-reims.fr//index.php?title=Cours:SaeEvitementObstacles&amp;diff=20933"/>
				<updated>2026-04-07T15:10:28Z</updated>
		
		<summary type="html">&lt;p&gt;Bjacquot : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;https://docs.google.com/document/d/1lLrXOisqDBmTie8lAPcVor_al1TS7HhtI7Or8wFLcsg/edit?tab=t.0&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
support de présentation :&lt;br /&gt;
 https://docs.google.com/presentation/d/1r9tSETGUbYgtk2Ip78lNhEWxcHYtDbIx4epwVoeI2hs/edit?slide=id.p#slide=id.p&lt;br /&gt;
&lt;br /&gt;
fonctions :&lt;br /&gt;
 https://docs.google.com/spreadsheets/d/1GX3zPpdC4umtqc4B8hLjQZWTMNHfw7GfKqrpxW5ORzc/edit?usp=sharing&lt;br /&gt;
&lt;br /&gt;
https://www.festivalrobotiquecachan.fr/&lt;br /&gt;
&lt;br /&gt;
https://www.festivalrobotiquecachan.fr/wp-content/uploads/Reglement_rencontres_de_robotique_GEII_BUT-1-2-3.pdf&lt;br /&gt;
&lt;br /&gt;
=Découpage fonctionnel=&lt;br /&gt;
&lt;br /&gt;
[[Media:DecoupageFcts2026.pdf]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=Travail à réaliser=&lt;br /&gt;
&lt;br /&gt;
==1ère partie (2 semaines)==&lt;br /&gt;
*travail individuel&lt;br /&gt;
**travail à réaliser pour fin de la 2ème semaine&lt;br /&gt;
**évaluation à la fin de la 2ème semaine (schéma/routage)&lt;br /&gt;
**sélection de la meilleure carte pour fabrication&lt;br /&gt;
***finalisation des pcbs pour le {{Rouge|jeudi 3/04 matin}}&lt;br /&gt;
*cartes :&lt;br /&gt;
**balise émettrice&lt;br /&gt;
***choix de la fréquence&lt;br /&gt;
**balise de réglage&lt;br /&gt;
***à l'opposé du terrain&lt;br /&gt;
***permet de régler l'élévation de la balise émettrice&lt;br /&gt;
***affiche le niveau de puissance&lt;br /&gt;
**carte réceptrice IR (filtre)&lt;br /&gt;
**carte filtrage (se plug sur la carte réceptrice IR)&lt;br /&gt;
***on change de carte pour changer la fréquence&lt;br /&gt;
**carte µc&lt;br /&gt;
***connectique pour e/s&lt;br /&gt;
***driver moteurs&lt;br /&gt;
***fourni alim symétrique&lt;br /&gt;
**banc test pour la carte filtre&lt;br /&gt;
**banc test pour la carte réceptrice complète&lt;br /&gt;
&lt;br /&gt;
==2ème partie (xx jours)==&lt;br /&gt;
&lt;br /&gt;
*Travail individuel&lt;br /&gt;
*montage des cartes&lt;br /&gt;
*vérification du fonctionnement&lt;br /&gt;
*réalisation programme : fonction à réaliser selon cdc&lt;br /&gt;
&lt;br /&gt;
==3ème partie (xx jours)==&lt;br /&gt;
&lt;br /&gt;
*travail en binôme ?&lt;br /&gt;
*programmation d'un robot&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=Modalités d'évaluation=&lt;br /&gt;
&lt;br /&gt;
==1 soutenance==&lt;br /&gt;
*Vendredi 17/05 matin&lt;br /&gt;
**20 minutes de présentation&lt;br /&gt;
**10 minutes de questions&lt;br /&gt;
*Présentation(introduction) de chaque &amp;quot;partie&amp;quot; en anglais&lt;br /&gt;
&lt;br /&gt;
==1 dossier==&lt;br /&gt;
*Analyse fonctionnelle&lt;br /&gt;
*Nomenclature&lt;br /&gt;
*Chiffrage&lt;br /&gt;
*Etude détaillée de chaque fonction&lt;br /&gt;
*Schémas électriques/algorithmes/simulations/courbes caractéristiques/fonctions de transfert ...&lt;br /&gt;
&lt;br /&gt;
==Démonstration(s)==&lt;br /&gt;
&lt;br /&gt;
* Démonstration du fonctionnement le 12/05 à 12h&lt;br /&gt;
* Participation au festival de robotique à Cachan&lt;br /&gt;
&lt;br /&gt;
==Note de résultat - Evaluation travaux de SAE==&lt;br /&gt;
*Groupe : accomplissement du projet&lt;br /&gt;
*Individuelle : en fonction de &lt;br /&gt;
**Difficulté technique&lt;br /&gt;
**Quantité de travail&lt;br /&gt;
**Qualité de la réalisation&lt;br /&gt;
**Investissement : &amp;lt;big&amp;gt;évalué chaque jour&amp;lt;/big&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Réalisation d'une vidéo==&lt;br /&gt;
Vidéo à réaliser pour le concours EEA :&lt;br /&gt;
 https://clubeea.com/concours-mon-projet-en-5-minutes/&lt;br /&gt;
&lt;br /&gt;
=Fonctions=&lt;br /&gt;
[[Cours:SaeEvitementObstaclesFonctions]]&lt;br /&gt;
&lt;br /&gt;
=Pages indispensables du wiki=&lt;br /&gt;
&lt;br /&gt;
*[[Cours:Oscillogbf|Utilisation de python et Qt pour la réalisation d'un banc de test]]&lt;br /&gt;
*[[Cours:PiPico|Programmation de la carte pico rp2040]]&lt;br /&gt;
*[[Cours:Esp01|Utilisation d'un esp-01 pour faire de la supervision]]&lt;br /&gt;
&lt;br /&gt;
=Ressources informatique=&lt;br /&gt;
&lt;br /&gt;
*[[Cours:pixyUartArduino|Pixy]]&lt;br /&gt;
*https://www.waveshare.com/wiki/RPLIDAR_C1&lt;br /&gt;
&lt;br /&gt;
=Ressources=&lt;br /&gt;
&lt;br /&gt;
*https://www.eeweb.com/level-shifting-techniques-in-i2c-bus-design/&lt;br /&gt;
*https://github.com/drankinatty/pico-mpu9250&lt;br /&gt;
&lt;br /&gt;
*vérifier la &amp;quot;programmabilité&amp;quot; du µcontroleur :&lt;br /&gt;
**dans un terminal&lt;br /&gt;
**avrdude -c usbasp -p nomDuMicro&lt;br /&gt;
**ex : avrdude -c usbasp -p t2313&lt;br /&gt;
**ex : avrdude -c usbasp -p m328p&lt;br /&gt;
&lt;br /&gt;
*modification des fusibles pour choisir fréquence d'horloge:&lt;br /&gt;
**pour les atmega328p, dans le logiciel graver le bootloader&lt;br /&gt;
**pour les attiny (utiliser '''arduino v1''' !! ) :&lt;br /&gt;
***installer attinycore : https://github.com/SpenceKonde/ATTinyCore/blob/v2.0.0-devThis-is-the-head-submit-PRs-against-this/Installation.md&lt;br /&gt;
***choisir le bon microcontroleur et la bonne source d'horloge&lt;br /&gt;
***graver la séquence d'initialisation&lt;br /&gt;
**pour les atmega2560, attention il faut modifier les fusibles par rapport au bootloader arduino :&lt;br /&gt;
***dans un terminal&lt;br /&gt;
***avrdude -v -patmega2560 -cusbasp -e -Ulock:w:0x3F:m -Uefuse:w:0xFD:m -Uhfuse:w:0xD9:m -Ulfuse:w:0xFF:m&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*http://raphael.candelier.fr/?blog=XL_320&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=contraintes de fabrication=&lt;br /&gt;
&lt;br /&gt;
==carte alimentation==&lt;br /&gt;
&lt;br /&gt;
==carte principale==&lt;br /&gt;
&lt;br /&gt;
*dimension maximum : 8cm x 13cm&lt;/div&gt;</summary>
		<author><name>Bjacquot</name></author>	</entry>

	<entry>
		<id>http://wikigeii.iut-troyes.univ-reims.fr//index.php?title=Cours:SaeEvitementObstacles&amp;diff=20932</id>
		<title>Cours:SaeEvitementObstacles</title>
		<link rel="alternate" type="text/html" href="http://wikigeii.iut-troyes.univ-reims.fr//index.php?title=Cours:SaeEvitementObstacles&amp;diff=20932"/>
				<updated>2026-04-07T13:14:01Z</updated>
		
		<summary type="html">&lt;p&gt;Bjacquot : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
&lt;br /&gt;
support de présentation :&lt;br /&gt;
 https://docs.google.com/presentation/d/1r9tSETGUbYgtk2Ip78lNhEWxcHYtDbIx4epwVoeI2hs/edit?slide=id.p#slide=id.p&lt;br /&gt;
&lt;br /&gt;
fonctions :&lt;br /&gt;
 https://docs.google.com/spreadsheets/d/1GX3zPpdC4umtqc4B8hLjQZWTMNHfw7GfKqrpxW5ORzc/edit?usp=sharing&lt;br /&gt;
&lt;br /&gt;
https://www.festivalrobotiquecachan.fr/&lt;br /&gt;
&lt;br /&gt;
https://www.festivalrobotiquecachan.fr/wp-content/uploads/Reglement_rencontres_de_robotique_GEII_BUT-1-2-3.pdf&lt;br /&gt;
&lt;br /&gt;
=Découpage fonctionnel=&lt;br /&gt;
&lt;br /&gt;
[[Media:DecoupageFcts2026.pdf]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=Travail à réaliser=&lt;br /&gt;
&lt;br /&gt;
==1ère partie (2 semaines)==&lt;br /&gt;
*travail individuel&lt;br /&gt;
**travail à réaliser pour fin de la 2ème semaine&lt;br /&gt;
**évaluation à la fin de la 2ème semaine (schéma/routage)&lt;br /&gt;
**sélection de la meilleure carte pour fabrication&lt;br /&gt;
***finalisation des pcbs pour le {{Rouge|jeudi 3/04 matin}}&lt;br /&gt;
*cartes :&lt;br /&gt;
**balise émettrice&lt;br /&gt;
***choix de la fréquence&lt;br /&gt;
**balise de réglage&lt;br /&gt;
***à l'opposé du terrain&lt;br /&gt;
***permet de régler l'élévation de la balise émettrice&lt;br /&gt;
***affiche le niveau de puissance&lt;br /&gt;
**carte réceptrice IR (filtre)&lt;br /&gt;
**carte filtrage (se plug sur la carte réceptrice IR)&lt;br /&gt;
***on change de carte pour changer la fréquence&lt;br /&gt;
**carte µc&lt;br /&gt;
***connectique pour e/s&lt;br /&gt;
***driver moteurs&lt;br /&gt;
***fourni alim symétrique&lt;br /&gt;
**banc test pour la carte filtre&lt;br /&gt;
**banc test pour la carte réceptrice complète&lt;br /&gt;
&lt;br /&gt;
==2ème partie (xx jours)==&lt;br /&gt;
&lt;br /&gt;
*Travail individuel&lt;br /&gt;
*montage des cartes&lt;br /&gt;
*vérification du fonctionnement&lt;br /&gt;
*réalisation programme : fonction à réaliser selon cdc&lt;br /&gt;
&lt;br /&gt;
==3ème partie (xx jours)==&lt;br /&gt;
&lt;br /&gt;
*travail en binôme ?&lt;br /&gt;
*programmation d'un robot&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=Modalités d'évaluation=&lt;br /&gt;
&lt;br /&gt;
==1 soutenance==&lt;br /&gt;
*Vendredi 17/05 matin&lt;br /&gt;
**20 minutes de présentation&lt;br /&gt;
**10 minutes de questions&lt;br /&gt;
*Présentation(introduction) de chaque &amp;quot;partie&amp;quot; en anglais&lt;br /&gt;
&lt;br /&gt;
==1 dossier==&lt;br /&gt;
*Analyse fonctionnelle&lt;br /&gt;
*Nomenclature&lt;br /&gt;
*Chiffrage&lt;br /&gt;
*Etude détaillée de chaque fonction&lt;br /&gt;
*Schémas électriques/algorithmes/simulations/courbes caractéristiques/fonctions de transfert ...&lt;br /&gt;
&lt;br /&gt;
==Démonstration(s)==&lt;br /&gt;
&lt;br /&gt;
* Démonstration du fonctionnement le 12/05 à 12h&lt;br /&gt;
* Participation au festival de robotique à Cachan&lt;br /&gt;
&lt;br /&gt;
==Note de résultat - Evaluation travaux de SAE==&lt;br /&gt;
*Groupe : accomplissement du projet&lt;br /&gt;
*Individuelle : en fonction de &lt;br /&gt;
**Difficulté technique&lt;br /&gt;
**Quantité de travail&lt;br /&gt;
**Qualité de la réalisation&lt;br /&gt;
**Investissement : &amp;lt;big&amp;gt;évalué chaque jour&amp;lt;/big&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Réalisation d'une vidéo==&lt;br /&gt;
Vidéo à réaliser pour le concours EEA :&lt;br /&gt;
 https://clubeea.com/concours-mon-projet-en-5-minutes/&lt;br /&gt;
&lt;br /&gt;
=Fonctions=&lt;br /&gt;
[[Cours:SaeEvitementObstaclesFonctions]]&lt;br /&gt;
&lt;br /&gt;
=Pages indispensables du wiki=&lt;br /&gt;
&lt;br /&gt;
*[[Cours:Oscillogbf|Utilisation de python et Qt pour la réalisation d'un banc de test]]&lt;br /&gt;
*[[Cours:PiPico|Programmation de la carte pico rp2040]]&lt;br /&gt;
*[[Cours:Esp01|Utilisation d'un esp-01 pour faire de la supervision]]&lt;br /&gt;
&lt;br /&gt;
=Ressources informatique=&lt;br /&gt;
&lt;br /&gt;
*[[Cours:pixyUartArduino|Pixy]]&lt;br /&gt;
*https://www.waveshare.com/wiki/RPLIDAR_C1&lt;br /&gt;
&lt;br /&gt;
=Ressources=&lt;br /&gt;
&lt;br /&gt;
*https://www.eeweb.com/level-shifting-techniques-in-i2c-bus-design/&lt;br /&gt;
*https://github.com/drankinatty/pico-mpu9250&lt;br /&gt;
&lt;br /&gt;
*vérifier la &amp;quot;programmabilité&amp;quot; du µcontroleur :&lt;br /&gt;
**dans un terminal&lt;br /&gt;
**avrdude -c usbasp -p nomDuMicro&lt;br /&gt;
**ex : avrdude -c usbasp -p t2313&lt;br /&gt;
**ex : avrdude -c usbasp -p m328p&lt;br /&gt;
&lt;br /&gt;
*modification des fusibles pour choisir fréquence d'horloge:&lt;br /&gt;
**pour les atmega328p, dans le logiciel graver le bootloader&lt;br /&gt;
**pour les attiny (utiliser '''arduino v1''' !! ) :&lt;br /&gt;
***installer attinycore : https://github.com/SpenceKonde/ATTinyCore/blob/v2.0.0-devThis-is-the-head-submit-PRs-against-this/Installation.md&lt;br /&gt;
***choisir le bon microcontroleur et la bonne source d'horloge&lt;br /&gt;
***graver la séquence d'initialisation&lt;br /&gt;
**pour les atmega2560, attention il faut modifier les fusibles par rapport au bootloader arduino :&lt;br /&gt;
***dans un terminal&lt;br /&gt;
***avrdude -v -patmega2560 -cusbasp -e -Ulock:w:0x3F:m -Uefuse:w:0xFD:m -Uhfuse:w:0xD9:m -Ulfuse:w:0xFF:m&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*http://raphael.candelier.fr/?blog=XL_320&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=contraintes de fabrication=&lt;br /&gt;
&lt;br /&gt;
==carte alimentation==&lt;br /&gt;
&lt;br /&gt;
==carte principale==&lt;br /&gt;
&lt;br /&gt;
*dimension maximum : 8cm x 13cm&lt;/div&gt;</summary>
		<author><name>Bjacquot</name></author>	</entry>

	<entry>
		<id>http://wikigeii.iut-troyes.univ-reims.fr//index.php?title=Cours:SaeEvitementObstacles&amp;diff=20931</id>
		<title>Cours:SaeEvitementObstacles</title>
		<link rel="alternate" type="text/html" href="http://wikigeii.iut-troyes.univ-reims.fr//index.php?title=Cours:SaeEvitementObstacles&amp;diff=20931"/>
				<updated>2026-04-07T13:13:08Z</updated>
		
		<summary type="html">&lt;p&gt;Bjacquot : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;https://docs.google.com/document/d/1lLrXOisqDBmTie8lAPcVor_al1TS7HhtI7Or8wFLcsg/edit?tab=t.0&lt;br /&gt;
&lt;br /&gt;
support de présentation :&lt;br /&gt;
 https://docs.google.com/presentation/d/1r9tSETGUbYgtk2Ip78lNhEWxcHYtDbIx4epwVoeI2hs/edit?slide=id.p#slide=id.p&lt;br /&gt;
&lt;br /&gt;
fonctions :&lt;br /&gt;
 https://docs.google.com/spreadsheets/d/1GX3zPpdC4umtqc4B8hLjQZWTMNHfw7GfKqrpxW5ORzc/edit?usp=sharing&lt;br /&gt;
&lt;br /&gt;
https://www.festivalrobotiquecachan.fr/&lt;br /&gt;
&lt;br /&gt;
https://www.festivalrobotiquecachan.fr/wp-content/uploads/Reglement_rencontres_de_robotique_GEII_BUT-1-2-3.pdf&lt;br /&gt;
&lt;br /&gt;
=Découpage fonctionnel=&lt;br /&gt;
&lt;br /&gt;
[[Media:DecoupageFcts2026.pdf]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=Travail à réaliser=&lt;br /&gt;
&lt;br /&gt;
==1ère partie (2 semaines)==&lt;br /&gt;
*travail individuel&lt;br /&gt;
**travail à réaliser pour fin de la 2ème semaine&lt;br /&gt;
**évaluation à la fin de la 2ème semaine (schéma/routage)&lt;br /&gt;
**sélection de la meilleure carte pour fabrication&lt;br /&gt;
***finalisation des pcbs pour le {{Rouge|jeudi 3/04 matin}}&lt;br /&gt;
*cartes :&lt;br /&gt;
**balise émettrice&lt;br /&gt;
***choix de la fréquence&lt;br /&gt;
**balise de réglage&lt;br /&gt;
***à l'opposé du terrain&lt;br /&gt;
***permet de régler l'élévation de la balise émettrice&lt;br /&gt;
***affiche le niveau de puissance&lt;br /&gt;
**carte réceptrice IR (filtre)&lt;br /&gt;
**carte filtrage (se plug sur la carte réceptrice IR)&lt;br /&gt;
***on change de carte pour changer la fréquence&lt;br /&gt;
**carte µc&lt;br /&gt;
***connectique pour e/s&lt;br /&gt;
***driver moteurs&lt;br /&gt;
***fourni alim symétrique&lt;br /&gt;
**banc test pour la carte filtre&lt;br /&gt;
**banc test pour la carte réceptrice complète&lt;br /&gt;
&lt;br /&gt;
==2ème partie (xx jours)==&lt;br /&gt;
&lt;br /&gt;
*Travail individuel&lt;br /&gt;
*montage des cartes&lt;br /&gt;
*vérification du fonctionnement&lt;br /&gt;
*réalisation programme : fonction à réaliser selon cdc&lt;br /&gt;
&lt;br /&gt;
==3ème partie (xx jours)==&lt;br /&gt;
&lt;br /&gt;
*travail en binôme ?&lt;br /&gt;
*programmation d'un robot&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=Modalités d'évaluation=&lt;br /&gt;
&lt;br /&gt;
==1 soutenance==&lt;br /&gt;
*Vendredi 17/05 matin&lt;br /&gt;
**20 minutes de présentation&lt;br /&gt;
**10 minutes de questions&lt;br /&gt;
*Présentation(introduction) de chaque &amp;quot;partie&amp;quot; en anglais&lt;br /&gt;
&lt;br /&gt;
==1 dossier==&lt;br /&gt;
*Analyse fonctionnelle&lt;br /&gt;
*Nomenclature&lt;br /&gt;
*Chiffrage&lt;br /&gt;
*Etude détaillée de chaque fonction&lt;br /&gt;
*Schémas électriques/algorithmes/simulations/courbes caractéristiques/fonctions de transfert ...&lt;br /&gt;
&lt;br /&gt;
==Démonstration(s)==&lt;br /&gt;
&lt;br /&gt;
* Démonstration du fonctionnement le 12/05 à 12h&lt;br /&gt;
* Participation au festival de robotique à Cachan&lt;br /&gt;
&lt;br /&gt;
==Note de résultat - Evaluation travaux de SAE==&lt;br /&gt;
*Groupe : accomplissement du projet&lt;br /&gt;
*Individuelle : en fonction de &lt;br /&gt;
**Difficulté technique&lt;br /&gt;
**Quantité de travail&lt;br /&gt;
**Qualité de la réalisation&lt;br /&gt;
**Investissement : &amp;lt;big&amp;gt;évalué chaque jour&amp;lt;/big&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Réalisation d'une vidéo==&lt;br /&gt;
Vidéo à réaliser pour le concours EEA :&lt;br /&gt;
 https://clubeea.com/concours-mon-projet-en-5-minutes/&lt;br /&gt;
&lt;br /&gt;
=Fonctions=&lt;br /&gt;
[[Cours:SaeEvitementObstaclesFonctions]]&lt;br /&gt;
&lt;br /&gt;
=Pages indispensables du wiki=&lt;br /&gt;
&lt;br /&gt;
*[[Cours:Oscillogbf|Utilisation de python et Qt pour la réalisation d'un banc de test]]&lt;br /&gt;
*[[Cours:PiPico|Programmation de la carte pico rp2040]]&lt;br /&gt;
*[[Cours:Esp01|Utilisation d'un esp-01 pour faire de la supervision]]&lt;br /&gt;
&lt;br /&gt;
=Ressources informatique=&lt;br /&gt;
&lt;br /&gt;
*[[Cours:pixyUartArduino|Pixy]]&lt;br /&gt;
*https://www.waveshare.com/wiki/RPLIDAR_C1&lt;br /&gt;
&lt;br /&gt;
=Ressources=&lt;br /&gt;
&lt;br /&gt;
*https://www.eeweb.com/level-shifting-techniques-in-i2c-bus-design/&lt;br /&gt;
*https://github.com/drankinatty/pico-mpu9250&lt;br /&gt;
&lt;br /&gt;
*vérifier la &amp;quot;programmabilité&amp;quot; du µcontroleur :&lt;br /&gt;
**dans un terminal&lt;br /&gt;
**avrdude -c usbasp -p nomDuMicro&lt;br /&gt;
**ex : avrdude -c usbasp -p t2313&lt;br /&gt;
**ex : avrdude -c usbasp -p m328p&lt;br /&gt;
&lt;br /&gt;
*modification des fusibles pour choisir fréquence d'horloge:&lt;br /&gt;
**pour les atmega328p, dans le logiciel graver le bootloader&lt;br /&gt;
**pour les attiny (utiliser '''arduino v1''' !! ) :&lt;br /&gt;
***installer attinycore : https://github.com/SpenceKonde/ATTinyCore/blob/v2.0.0-devThis-is-the-head-submit-PRs-against-this/Installation.md&lt;br /&gt;
***choisir le bon microcontroleur et la bonne source d'horloge&lt;br /&gt;
***graver la séquence d'initialisation&lt;br /&gt;
**pour les atmega2560, attention il faut modifier les fusibles par rapport au bootloader arduino :&lt;br /&gt;
***dans un terminal&lt;br /&gt;
***avrdude -v -patmega2560 -cusbasp -e -Ulock:w:0x3F:m -Uefuse:w:0xFD:m -Uhfuse:w:0xD9:m -Ulfuse:w:0xFF:m&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*http://raphael.candelier.fr/?blog=XL_320&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=contraintes de fabrication=&lt;br /&gt;
&lt;br /&gt;
==carte alimentation==&lt;br /&gt;
&lt;br /&gt;
==carte principale==&lt;br /&gt;
&lt;br /&gt;
*dimension maximum : 8cm x 13cm&lt;/div&gt;</summary>
		<author><name>Bjacquot</name></author>	</entry>

	<entry>
		<id>http://wikigeii.iut-troyes.univ-reims.fr//index.php?title=Cours:SaeEvitementObstacles&amp;diff=20930</id>
		<title>Cours:SaeEvitementObstacles</title>
		<link rel="alternate" type="text/html" href="http://wikigeii.iut-troyes.univ-reims.fr//index.php?title=Cours:SaeEvitementObstacles&amp;diff=20930"/>
				<updated>2026-04-07T07:02:39Z</updated>
		
		<summary type="html">&lt;p&gt;Bjacquot : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
support de présentation :&lt;br /&gt;
 https://docs.google.com/presentation/d/1r9tSETGUbYgtk2Ip78lNhEWxcHYtDbIx4epwVoeI2hs/edit?slide=id.p#slide=id.p&lt;br /&gt;
&lt;br /&gt;
fonctions :&lt;br /&gt;
 https://docs.google.com/spreadsheets/d/1GX3zPpdC4umtqc4B8hLjQZWTMNHfw7GfKqrpxW5ORzc/edit?usp=sharing&lt;br /&gt;
&lt;br /&gt;
https://www.festivalrobotiquecachan.fr/&lt;br /&gt;
&lt;br /&gt;
https://www.festivalrobotiquecachan.fr/wp-content/uploads/Reglement_rencontres_de_robotique_GEII_BUT-1-2-3.pdf&lt;br /&gt;
&lt;br /&gt;
=Découpage fonctionnel=&lt;br /&gt;
&lt;br /&gt;
[[Media:DecoupageFcts2026.pdf]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=Travail à réaliser=&lt;br /&gt;
&lt;br /&gt;
==1ère partie (2 semaines)==&lt;br /&gt;
*travail individuel&lt;br /&gt;
**travail à réaliser pour fin de la 2ème semaine&lt;br /&gt;
**évaluation à la fin de la 2ème semaine (schéma/routage)&lt;br /&gt;
**sélection de la meilleure carte pour fabrication&lt;br /&gt;
***finalisation des pcbs pour le {{Rouge|jeudi 3/04 matin}}&lt;br /&gt;
*cartes :&lt;br /&gt;
**balise émettrice&lt;br /&gt;
***choix de la fréquence&lt;br /&gt;
**balise de réglage&lt;br /&gt;
***à l'opposé du terrain&lt;br /&gt;
***permet de régler l'élévation de la balise émettrice&lt;br /&gt;
***affiche le niveau de puissance&lt;br /&gt;
**carte réceptrice IR (filtre)&lt;br /&gt;
**carte filtrage (se plug sur la carte réceptrice IR)&lt;br /&gt;
***on change de carte pour changer la fréquence&lt;br /&gt;
**carte µc&lt;br /&gt;
***connectique pour e/s&lt;br /&gt;
***driver moteurs&lt;br /&gt;
***fourni alim symétrique&lt;br /&gt;
**banc test pour la carte filtre&lt;br /&gt;
**banc test pour la carte réceptrice complète&lt;br /&gt;
&lt;br /&gt;
==2ème partie (xx jours)==&lt;br /&gt;
&lt;br /&gt;
*Travail individuel&lt;br /&gt;
*montage des cartes&lt;br /&gt;
*vérification du fonctionnement&lt;br /&gt;
*réalisation programme : fonction à réaliser selon cdc&lt;br /&gt;
&lt;br /&gt;
==3ème partie (xx jours)==&lt;br /&gt;
&lt;br /&gt;
*travail en binôme ?&lt;br /&gt;
*programmation d'un robot&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=Modalités d'évaluation=&lt;br /&gt;
&lt;br /&gt;
==1 soutenance==&lt;br /&gt;
*Vendredi 17/05 matin&lt;br /&gt;
**20 minutes de présentation&lt;br /&gt;
**10 minutes de questions&lt;br /&gt;
*Présentation(introduction) de chaque &amp;quot;partie&amp;quot; en anglais&lt;br /&gt;
&lt;br /&gt;
==1 dossier==&lt;br /&gt;
*Analyse fonctionnelle&lt;br /&gt;
*Nomenclature&lt;br /&gt;
*Chiffrage&lt;br /&gt;
*Etude détaillée de chaque fonction&lt;br /&gt;
*Schémas électriques/algorithmes/simulations/courbes caractéristiques/fonctions de transfert ...&lt;br /&gt;
&lt;br /&gt;
==Démonstration(s)==&lt;br /&gt;
&lt;br /&gt;
* Démonstration du fonctionnement le 12/05 à 12h&lt;br /&gt;
* Participation au festival de robotique à Cachan&lt;br /&gt;
&lt;br /&gt;
==Note de résultat - Evaluation travaux de SAE==&lt;br /&gt;
*Groupe : accomplissement du projet&lt;br /&gt;
*Individuelle : en fonction de &lt;br /&gt;
**Difficulté technique&lt;br /&gt;
**Quantité de travail&lt;br /&gt;
**Qualité de la réalisation&lt;br /&gt;
**Investissement : &amp;lt;big&amp;gt;évalué chaque jour&amp;lt;/big&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Réalisation d'une vidéo==&lt;br /&gt;
Vidéo à réaliser pour le concours EEA :&lt;br /&gt;
 https://clubeea.com/concours-mon-projet-en-5-minutes/&lt;br /&gt;
&lt;br /&gt;
=Fonctions=&lt;br /&gt;
[[Cours:SaeEvitementObstaclesFonctions]]&lt;br /&gt;
&lt;br /&gt;
=Pages indispensables du wiki=&lt;br /&gt;
&lt;br /&gt;
*[[Cours:Oscillogbf|Utilisation de python et Qt pour la réalisation d'un banc de test]]&lt;br /&gt;
*[[Cours:PiPico|Programmation de la carte pico rp2040]]&lt;br /&gt;
*[[Cours:Esp01|Utilisation d'un esp-01 pour faire de la supervision]]&lt;br /&gt;
&lt;br /&gt;
=Ressources informatique=&lt;br /&gt;
&lt;br /&gt;
*[[Cours:pixyUartArduino|Pixy]]&lt;br /&gt;
*https://www.waveshare.com/wiki/RPLIDAR_C1&lt;br /&gt;
&lt;br /&gt;
=Ressources=&lt;br /&gt;
&lt;br /&gt;
*https://www.eeweb.com/level-shifting-techniques-in-i2c-bus-design/&lt;br /&gt;
*https://github.com/drankinatty/pico-mpu9250&lt;br /&gt;
&lt;br /&gt;
*vérifier la &amp;quot;programmabilité&amp;quot; du µcontroleur :&lt;br /&gt;
**dans un terminal&lt;br /&gt;
**avrdude -c usbasp -p nomDuMicro&lt;br /&gt;
**ex : avrdude -c usbasp -p t2313&lt;br /&gt;
**ex : avrdude -c usbasp -p m328p&lt;br /&gt;
&lt;br /&gt;
*modification des fusibles pour choisir fréquence d'horloge:&lt;br /&gt;
**pour les atmega328p, dans le logiciel graver le bootloader&lt;br /&gt;
**pour les attiny (utiliser '''arduino v1''' !! ) :&lt;br /&gt;
***installer attinycore : https://github.com/SpenceKonde/ATTinyCore/blob/v2.0.0-devThis-is-the-head-submit-PRs-against-this/Installation.md&lt;br /&gt;
***choisir le bon microcontroleur et la bonne source d'horloge&lt;br /&gt;
***graver la séquence d'initialisation&lt;br /&gt;
**pour les atmega2560, attention il faut modifier les fusibles par rapport au bootloader arduino :&lt;br /&gt;
***dans un terminal&lt;br /&gt;
***avrdude -v -patmega2560 -cusbasp -e -Ulock:w:0x3F:m -Uefuse:w:0xFD:m -Uhfuse:w:0xD9:m -Ulfuse:w:0xFF:m&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*http://raphael.candelier.fr/?blog=XL_320&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=contraintes de fabrication=&lt;br /&gt;
&lt;br /&gt;
==carte alimentation==&lt;br /&gt;
&lt;br /&gt;
==carte principale==&lt;br /&gt;
&lt;br /&gt;
*dimension maximum : 8cm x 13cm&lt;/div&gt;</summary>
		<author><name>Bjacquot</name></author>	</entry>

	<entry>
		<id>http://wikigeii.iut-troyes.univ-reims.fr//index.php?title=Cours:InfoS2_EvaluationSimulIde&amp;diff=20929</id>
		<title>Cours:InfoS2 EvaluationSimulIde</title>
		<link rel="alternate" type="text/html" href="http://wikigeii.iut-troyes.univ-reims.fr//index.php?title=Cours:InfoS2_EvaluationSimulIde&amp;diff=20929"/>
				<updated>2026-04-04T08:17:31Z</updated>
		
		<summary type="html">&lt;p&gt;Bjacquot : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;accesscontrol&amp;gt;Acces:Prof&amp;lt;/accesscontrol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{EnTeteTdInfoS2|InfoS2 tdI2cRegistres prof}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=Identification des cibles=&lt;br /&gt;
&lt;br /&gt;
 Fichiers pour simulide : [[Media:I2cSlaveEvaluation.zip|I2cSlaveEvaluation.zip]]&lt;br /&gt;
&lt;br /&gt;
 {{Rouge|**************************************************}}&lt;br /&gt;
 {{Rouge|***  Attention, programme dans un fichier .ino ***}}&lt;br /&gt;
 {{Rouge|**************************************************}}&lt;br /&gt;
 {{Rouge|***  choisir le µc Master en tant que MainMCU  ***}}&lt;br /&gt;
 {{Rouge|***          !!!! le point jaune !!!!          ***}}&lt;br /&gt;
 {{Rouge|**************************************************}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{Eval|1|Trouver l'adresse i2c du &amp;quot;slave afficheur&amp;quot;}}&lt;br /&gt;
&lt;br /&gt;
=Utilisation du chenillard=&lt;br /&gt;
&lt;br /&gt;
Le slave chenillard s'utilise de façon simple :&lt;br /&gt;
*on peut uniquement écrire des valeurs sur ce slave&lt;br /&gt;
*il n'y a pas de registres&lt;br /&gt;
*on enverra :&lt;br /&gt;
**la valeur 0 pour arrêter le chenillard&lt;br /&gt;
**la valeur 1 pour mettre en route le chenillard&lt;br /&gt;
&lt;br /&gt;
{{Eval|1|Ecrire un programme dans le master qui :}}&lt;br /&gt;
*met en marche le chenillard pendant 1s&lt;br /&gt;
*l'arrête pendant 2s&lt;br /&gt;
*recommence&lt;br /&gt;
&lt;br /&gt;
=Utilisation du bouton=&lt;br /&gt;
Le slave bouton s'utilise de façon simple :&lt;br /&gt;
*on peut uniquement lire des valeurs sur ce slave&lt;br /&gt;
*il n'y a pas de registres&lt;br /&gt;
*on lira :&lt;br /&gt;
**la valeur 0 lorsque le bouton n'est pas appuyé&lt;br /&gt;
**la valeur 1 lorsque le bouton est appuyé&lt;br /&gt;
&lt;br /&gt;
{{Eval|2|Ecrire un programme dans le master qui :}}&lt;br /&gt;
*affiche la valeur du bouton sur la liaison série&lt;br /&gt;
*commande la mise en marche du chenillard avec le bouton&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Utilisation de l'afficheur 7 segments=&lt;br /&gt;
Le slave afficheur s'utilise de façon simple :&lt;br /&gt;
*on peut uniquement écrire des valeurs sur ce slave&lt;br /&gt;
*il y a 4 registres :&lt;br /&gt;
**registre {{Rouge|0}} : change la valeur des unités&lt;br /&gt;
**registre {{Rouge|1}} : change la valeur des dizaines&lt;br /&gt;
**registre {{Rouge|2}} : change la valeur des centaines&lt;br /&gt;
**registre {{Rouge|3}} : change la valeur des milliers&lt;br /&gt;
&lt;br /&gt;
{{Eval|2|Ecrire un programme dans le master qui :}}&lt;br /&gt;
*affiche la valeur &amp;quot;1234&amp;quot; pendant 1s&lt;br /&gt;
*affiche la valeur &amp;quot;9876&amp;quot; pendant 2s&lt;br /&gt;
*recommence&lt;br /&gt;
&lt;br /&gt;
=Utilisation du chrono=&lt;br /&gt;
Le slave chrono s'utilise de la façon suivante :&lt;br /&gt;
*on peut écrire ou lire des valeurs sur ce slave&lt;br /&gt;
*il n'y a pas de registres&lt;br /&gt;
*en écriture :&lt;br /&gt;
**écrire la valeur 0 permet d'arrêter le chrono&lt;br /&gt;
**écrire la valeur 1 permet de mettre en route le chrono et de le remettre à 0&lt;br /&gt;
*en lecture :&lt;br /&gt;
**on obtient la valeur du chronomètre&lt;br /&gt;
**il conviendra de multiplier la valeur lue en i2c par 8 pour obtenir la durée en ms&lt;br /&gt;
&lt;br /&gt;
{{Eval|2|Ecrire un programme dans le master qui :}}&lt;br /&gt;
*lance le chrono&lt;br /&gt;
*attend 500ms&lt;br /&gt;
*arrête le chrono&lt;br /&gt;
*récupère la valeur du chrono&lt;br /&gt;
*affiche la valeur du chrono sur la liaison série (en ms)&lt;br /&gt;
*affiche la valeur du chrono sur le slave afficheur&lt;br /&gt;
*attend 5s avant de recommencer&lt;br /&gt;
&lt;br /&gt;
=Assemblons le tout=&lt;br /&gt;
&lt;br /&gt;
On réalise un jeu de réflexe : le joueur devra appuyer sur le bouton dès qu'il constate un changement sur le chenillard&lt;br /&gt;
&lt;br /&gt;
{{Eval|2|Ecrire un programme correspondant à l'algorithme suivant :}}&lt;br /&gt;
*attendre 1s&lt;br /&gt;
*démarrer le chenillard&lt;br /&gt;
*démarrer le chrono&lt;br /&gt;
*attendre appui sur le bouton&lt;br /&gt;
*arrêter le chrono&lt;br /&gt;
*arrêter le chenillard&lt;br /&gt;
*lire le chrono&lt;br /&gt;
*afficher la valeur du chrono sur l'afficheur&lt;br /&gt;
*attendre le relâchement du bouton&lt;br /&gt;
*attendre 5s&lt;/div&gt;</summary>
		<author><name>Bjacquot</name></author>	</entry>

	<entry>
		<id>http://wikigeii.iut-troyes.univ-reims.fr//index.php?title=Cours:InfoS2_EvaluationSimulIde&amp;diff=20928</id>
		<title>Cours:InfoS2 EvaluationSimulIde</title>
		<link rel="alternate" type="text/html" href="http://wikigeii.iut-troyes.univ-reims.fr//index.php?title=Cours:InfoS2_EvaluationSimulIde&amp;diff=20928"/>
				<updated>2026-04-04T08:17:13Z</updated>
		
		<summary type="html">&lt;p&gt;Bjacquot : /* Utilisation du bouton */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
&lt;br /&gt;
{{EnTeteTdInfoS2|InfoS2 tdI2cRegistres prof}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=Identification des cibles=&lt;br /&gt;
&lt;br /&gt;
 Fichiers pour simulide : [[Media:I2cSlaveEvaluation.zip|I2cSlaveEvaluation.zip]]&lt;br /&gt;
&lt;br /&gt;
 {{Rouge|**************************************************}}&lt;br /&gt;
 {{Rouge|***  Attention, programme dans un fichier .ino ***}}&lt;br /&gt;
 {{Rouge|**************************************************}}&lt;br /&gt;
 {{Rouge|***  choisir le µc Master en tant que MainMCU  ***}}&lt;br /&gt;
 {{Rouge|***          !!!! le point jaune !!!!          ***}}&lt;br /&gt;
 {{Rouge|**************************************************}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{Eval|1|Trouver l'adresse i2c du &amp;quot;slave afficheur&amp;quot;}}&lt;br /&gt;
&lt;br /&gt;
=Utilisation du chenillard=&lt;br /&gt;
&lt;br /&gt;
Le slave chenillard s'utilise de façon simple :&lt;br /&gt;
*on peut uniquement écrire des valeurs sur ce slave&lt;br /&gt;
*il n'y a pas de registres&lt;br /&gt;
*on enverra :&lt;br /&gt;
**la valeur 0 pour arrêter le chenillard&lt;br /&gt;
**la valeur 1 pour mettre en route le chenillard&lt;br /&gt;
&lt;br /&gt;
{{Eval|1|Ecrire un programme dans le master qui :}}&lt;br /&gt;
*met en marche le chenillard pendant 1s&lt;br /&gt;
*l'arrête pendant 2s&lt;br /&gt;
*recommence&lt;br /&gt;
&lt;br /&gt;
=Utilisation du bouton=&lt;br /&gt;
Le slave bouton s'utilise de façon simple :&lt;br /&gt;
*on peut uniquement lire des valeurs sur ce slave&lt;br /&gt;
*il n'y a pas de registres&lt;br /&gt;
*on lira :&lt;br /&gt;
**la valeur 0 lorsque le bouton n'est pas appuyé&lt;br /&gt;
**la valeur 1 lorsque le bouton est appuyé&lt;br /&gt;
&lt;br /&gt;
{{Eval|2|Ecrire un programme dans le master qui :}}&lt;br /&gt;
*affiche la valeur du bouton sur la liaison série&lt;br /&gt;
*commande la mise en marche du chenillard avec le bouton&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Utilisation de l'afficheur 7 segments=&lt;br /&gt;
Le slave afficheur s'utilise de façon simple :&lt;br /&gt;
*on peut uniquement écrire des valeurs sur ce slave&lt;br /&gt;
*il y a 4 registres :&lt;br /&gt;
**registre {{Rouge|0}} : change la valeur des unités&lt;br /&gt;
**registre {{Rouge|1}} : change la valeur des dizaines&lt;br /&gt;
**registre {{Rouge|2}} : change la valeur des centaines&lt;br /&gt;
**registre {{Rouge|3}} : change la valeur des milliers&lt;br /&gt;
&lt;br /&gt;
{{Eval|2|Ecrire un programme dans le master qui :}}&lt;br /&gt;
*affiche la valeur &amp;quot;1234&amp;quot; pendant 1s&lt;br /&gt;
*affiche la valeur &amp;quot;9876&amp;quot; pendant 2s&lt;br /&gt;
*recommence&lt;br /&gt;
&lt;br /&gt;
=Utilisation du chrono=&lt;br /&gt;
Le slave chrono s'utilise de la façon suivante :&lt;br /&gt;
*on peut écrire ou lire des valeurs sur ce slave&lt;br /&gt;
*il n'y a pas de registres&lt;br /&gt;
*en écriture :&lt;br /&gt;
**écrire la valeur 0 permet d'arrêter le chrono&lt;br /&gt;
**écrire la valeur 1 permet de mettre en route le chrono et de le remettre à 0&lt;br /&gt;
*en lecture :&lt;br /&gt;
**on obtient la valeur du chronomètre&lt;br /&gt;
**il conviendra de multiplier la valeur lue en i2c par 8 pour obtenir la durée en ms&lt;br /&gt;
&lt;br /&gt;
{{Eval|2|Ecrire un programme dans le master qui :}}&lt;br /&gt;
*lance le chrono&lt;br /&gt;
*attend 500ms&lt;br /&gt;
*arrête le chrono&lt;br /&gt;
*récupère la valeur du chrono&lt;br /&gt;
*affiche la valeur du chrono sur la liaison série (en ms)&lt;br /&gt;
*affiche la valeur du chrono sur le slave afficheur&lt;br /&gt;
*attend 5s avant de recommencer&lt;br /&gt;
&lt;br /&gt;
=Assemblons le tout=&lt;br /&gt;
&lt;br /&gt;
On réalise un jeu de réflexe : le joueur devra appuyer sur le bouton dès qu'il constate un changement sur le chenillard&lt;br /&gt;
&lt;br /&gt;
{{Eval|2|Ecrire un programme correspondant à l'algorithme suivant :}}&lt;br /&gt;
*attendre 1s&lt;br /&gt;
*démarrer le chenillard&lt;br /&gt;
*démarrer le chrono&lt;br /&gt;
*attendre appui sur le bouton&lt;br /&gt;
*arrêter le chrono&lt;br /&gt;
*arrêter le chenillard&lt;br /&gt;
*lire le chrono&lt;br /&gt;
*afficher la valeur du chrono sur l'afficheur&lt;br /&gt;
*attendre le relâchement du bouton&lt;br /&gt;
*attendre 5s&lt;/div&gt;</summary>
		<author><name>Bjacquot</name></author>	</entry>

	<entry>
		<id>http://wikigeii.iut-troyes.univ-reims.fr//index.php?title=Cours:InfoS2_EvaluationSimulIde&amp;diff=20927</id>
		<title>Cours:InfoS2 EvaluationSimulIde</title>
		<link rel="alternate" type="text/html" href="http://wikigeii.iut-troyes.univ-reims.fr//index.php?title=Cours:InfoS2_EvaluationSimulIde&amp;diff=20927"/>
				<updated>2026-04-04T08:17:03Z</updated>
		
		<summary type="html">&lt;p&gt;Bjacquot : Annulation des modifications 20926 de Bjacquot (discussion)&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
&lt;br /&gt;
{{EnTeteTdInfoS2|InfoS2 tdI2cRegistres prof}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=Identification des cibles=&lt;br /&gt;
&lt;br /&gt;
 Fichiers pour simulide : [[Media:I2cSlaveEvaluation.zip|I2cSlaveEvaluation.zip]]&lt;br /&gt;
&lt;br /&gt;
 {{Rouge|**************************************************}}&lt;br /&gt;
 {{Rouge|***  Attention, programme dans un fichier .ino ***}}&lt;br /&gt;
 {{Rouge|**************************************************}}&lt;br /&gt;
 {{Rouge|***  choisir le µc Master en tant que MainMCU  ***}}&lt;br /&gt;
 {{Rouge|***          !!!! le point jaune !!!!          ***}}&lt;br /&gt;
 {{Rouge|**************************************************}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{Eval|1|Trouver l'adresse i2c du &amp;quot;slave afficheur&amp;quot;}}&lt;br /&gt;
&lt;br /&gt;
=Utilisation du chenillard=&lt;br /&gt;
&lt;br /&gt;
Le slave chenillard s'utilise de façon simple :&lt;br /&gt;
*on peut uniquement écrire des valeurs sur ce slave&lt;br /&gt;
*il n'y a pas de registres&lt;br /&gt;
*on enverra :&lt;br /&gt;
**la valeur 0 pour arrêter le chenillard&lt;br /&gt;
**la valeur 1 pour mettre en route le chenillard&lt;br /&gt;
&lt;br /&gt;
{{Eval|1|Ecrire un programme dans le master qui :}}&lt;br /&gt;
*met en marche le chenillard pendant 1s&lt;br /&gt;
*l'arrête pendant 2s&lt;br /&gt;
*recommence&lt;br /&gt;
&lt;br /&gt;
=Utilisation du bouton=&lt;br /&gt;
Le slave chenillard s'utilise de façon simple :&lt;br /&gt;
*on peut uniquement lire des valeurs sur ce slave&lt;br /&gt;
*il n'y a pas de registres&lt;br /&gt;
*on lira :&lt;br /&gt;
**la valeur 0 lorsque le bouton n'est pas appuyé&lt;br /&gt;
**la valeur 1 lorsque le bouton est appuyé&lt;br /&gt;
&lt;br /&gt;
{{Eval|2|Ecrire un programme dans le master qui :}}&lt;br /&gt;
*affiche la valeur du bouton sur la liaison série&lt;br /&gt;
*commande la mise en marche du chenillard avec le bouton&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Utilisation de l'afficheur 7 segments=&lt;br /&gt;
Le slave afficheur s'utilise de façon simple :&lt;br /&gt;
*on peut uniquement écrire des valeurs sur ce slave&lt;br /&gt;
*il y a 4 registres :&lt;br /&gt;
**registre {{Rouge|0}} : change la valeur des unités&lt;br /&gt;
**registre {{Rouge|1}} : change la valeur des dizaines&lt;br /&gt;
**registre {{Rouge|2}} : change la valeur des centaines&lt;br /&gt;
**registre {{Rouge|3}} : change la valeur des milliers&lt;br /&gt;
&lt;br /&gt;
{{Eval|2|Ecrire un programme dans le master qui :}}&lt;br /&gt;
*affiche la valeur &amp;quot;1234&amp;quot; pendant 1s&lt;br /&gt;
*affiche la valeur &amp;quot;9876&amp;quot; pendant 2s&lt;br /&gt;
*recommence&lt;br /&gt;
&lt;br /&gt;
=Utilisation du chrono=&lt;br /&gt;
Le slave chrono s'utilise de la façon suivante :&lt;br /&gt;
*on peut écrire ou lire des valeurs sur ce slave&lt;br /&gt;
*il n'y a pas de registres&lt;br /&gt;
*en écriture :&lt;br /&gt;
**écrire la valeur 0 permet d'arrêter le chrono&lt;br /&gt;
**écrire la valeur 1 permet de mettre en route le chrono et de le remettre à 0&lt;br /&gt;
*en lecture :&lt;br /&gt;
**on obtient la valeur du chronomètre&lt;br /&gt;
**il conviendra de multiplier la valeur lue en i2c par 8 pour obtenir la durée en ms&lt;br /&gt;
&lt;br /&gt;
{{Eval|2|Ecrire un programme dans le master qui :}}&lt;br /&gt;
*lance le chrono&lt;br /&gt;
*attend 500ms&lt;br /&gt;
*arrête le chrono&lt;br /&gt;
*récupère la valeur du chrono&lt;br /&gt;
*affiche la valeur du chrono sur la liaison série (en ms)&lt;br /&gt;
*affiche la valeur du chrono sur le slave afficheur&lt;br /&gt;
*attend 5s avant de recommencer&lt;br /&gt;
&lt;br /&gt;
=Assemblons le tout=&lt;br /&gt;
&lt;br /&gt;
On réalise un jeu de réflexe : le joueur devra appuyer sur le bouton dès qu'il constate un changement sur le chenillard&lt;br /&gt;
&lt;br /&gt;
{{Eval|2|Ecrire un programme correspondant à l'algorithme suivant :}}&lt;br /&gt;
*attendre 1s&lt;br /&gt;
*démarrer le chenillard&lt;br /&gt;
*démarrer le chrono&lt;br /&gt;
*attendre appui sur le bouton&lt;br /&gt;
*arrêter le chrono&lt;br /&gt;
*arrêter le chenillard&lt;br /&gt;
*lire le chrono&lt;br /&gt;
*afficher la valeur du chrono sur l'afficheur&lt;br /&gt;
*attendre le relâchement du bouton&lt;br /&gt;
*attendre 5s&lt;/div&gt;</summary>
		<author><name>Bjacquot</name></author>	</entry>

	<entry>
		<id>http://wikigeii.iut-troyes.univ-reims.fr//index.php?title=Cours:InfoS2_EvaluationSimulIde&amp;diff=20926</id>
		<title>Cours:InfoS2 EvaluationSimulIde</title>
		<link rel="alternate" type="text/html" href="http://wikigeii.iut-troyes.univ-reims.fr//index.php?title=Cours:InfoS2_EvaluationSimulIde&amp;diff=20926"/>
				<updated>2026-04-04T08:16:40Z</updated>
		
		<summary type="html">&lt;p&gt;Bjacquot : Révocation des modifications de Bjacquot (discussion) vers la dernière version de Fredmn&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;accesscontrol&amp;gt;Acces:Prof&amp;lt;/accesscontrol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{EnTeteTdInfoS2|InfoS2 tdI2cRegistres prof}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=Identification des cibles=&lt;br /&gt;
&lt;br /&gt;
 Fichiers pour simulide : [[Media:I2cSlaveEvaluation.zip|I2cSlaveEvaluation.zip]]&lt;br /&gt;
&lt;br /&gt;
 {{Rouge|**************************************************}}&lt;br /&gt;
 {{Rouge|***  Attention, programme dans un fichier .ino ***}}&lt;br /&gt;
 {{Rouge|**************************************************}}&lt;br /&gt;
 {{Rouge|***  choisir le µc Master en tant que MainMCU  ***}}&lt;br /&gt;
 {{Rouge|***          !!!! le point jaune !!!!          ***}}&lt;br /&gt;
 {{Rouge|**************************************************}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{Eval|1|Trouver l'adresse i2c du &amp;quot;slave afficheur&amp;quot;}}&lt;br /&gt;
&lt;br /&gt;
=Utilisation du chenillard=&lt;br /&gt;
&lt;br /&gt;
Le slave chenillard s'utilise de façon simple :&lt;br /&gt;
*on peut uniquement écrire des valeurs sur ce slave&lt;br /&gt;
*on enverra :&lt;br /&gt;
**la valeur 0 pour arrêter le chenillard&lt;br /&gt;
**la valeur 1 pour mettre en route le chenillard&lt;br /&gt;
&lt;br /&gt;
{{Eval|1|Ecrire un programme dans le master qui :}}&lt;br /&gt;
*met en marche le chenillard pendant 1s&lt;br /&gt;
*l'arrête pendant 2s&lt;br /&gt;
*recommence&lt;br /&gt;
&lt;br /&gt;
=Utilisation du bouton=&lt;br /&gt;
Le slave chenillard s'utilise de façon simple :&lt;br /&gt;
*on peut uniquement lire des valeurs sur ce slave&lt;br /&gt;
*on lira :&lt;br /&gt;
**la valeur 0 lorsque le bouton n'est pas appuyé&lt;br /&gt;
**la valeur 1 lorsque le bouton est appuyé&lt;br /&gt;
&lt;br /&gt;
{{Eval|2|Ecrire un programme dans le master qui :}}&lt;br /&gt;
*affiche la valeur du bouton sur la liaison série&lt;br /&gt;
*commande la mise en marche du chenillard avec le bouton&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=Utilisation de l'afficheur 7 segments=&lt;br /&gt;
Le slave afficheur s'utilise de façon simple :&lt;br /&gt;
*on peut uniquement écrire des valeurs sur ce slave&lt;br /&gt;
*il y a 4 registres :&lt;br /&gt;
**registre {{Rouge|0}} : change la valeur des unités&lt;br /&gt;
**registre {{Rouge|1}} : change la valeur des dizaines&lt;br /&gt;
**registre {{Rouge|2}} : change la valeur des centaines&lt;br /&gt;
**registre {{Rouge|3}} : change la valeur des milliers&lt;br /&gt;
&lt;br /&gt;
{{Eval|2|Ecrire un programme dans le master qui :}}&lt;br /&gt;
*affiche la valeur &amp;quot;1234&amp;quot; pendant 1s&lt;br /&gt;
*affiche la valeur &amp;quot;9876&amp;quot; pendant 2s&lt;br /&gt;
*recommence&lt;br /&gt;
&lt;br /&gt;
=Utilisation du chrono=&lt;br /&gt;
Le slave chrono s'utilise de la façon suivante :&lt;br /&gt;
*on peut écrire ou lire des valeurs sur ce slave&lt;br /&gt;
*en écriture :&lt;br /&gt;
**écrire la valeur 0 permet d'arrêter le chrono&lt;br /&gt;
**écrire la valeur 1 permet de mettre en route le chrono et de le remettre à 0&lt;br /&gt;
*en lecture :&lt;br /&gt;
**on obtient la valeur du chronomètre&lt;br /&gt;
**il conviendra de multiplier la valeur lue en i2c par 8 pour obtenir la durée en ms&lt;br /&gt;
&lt;br /&gt;
{{Eval|2|Ecrire un programme dans le master qui :}}&lt;br /&gt;
*lance le chrono&lt;br /&gt;
*attend 500ms&lt;br /&gt;
*arrête le chrono&lt;br /&gt;
*récupère la valeur du chrono&lt;br /&gt;
*affiche la valeur du chrono sur la liaison série (en ms)&lt;br /&gt;
*affiche la valeur du chrono sur le slave afficheur&lt;br /&gt;
*attend 5s avant de recommencer&lt;br /&gt;
&lt;br /&gt;
=Assemblons le tout=&lt;br /&gt;
&lt;br /&gt;
On réalise un jeu de réflexe : le joueur devra appuyer sur le bouton dès qu'il constate un changement sur le chenillard&lt;br /&gt;
&lt;br /&gt;
{{Eval|2|Ecrire un programme correspondant à l'algorithme suivant :}}&lt;br /&gt;
*attendre 1s&lt;br /&gt;
*démarrer le chenillard&lt;br /&gt;
*démarrer le chrono&lt;br /&gt;
*attendre appui sur le bouton&lt;br /&gt;
*arrêter le chrono&lt;br /&gt;
*arrêter le chenillard&lt;br /&gt;
*lire le chrono&lt;br /&gt;
*afficher la valeur du chrono sur l'afficheur&lt;br /&gt;
*attendre le relâchement du bouton&lt;br /&gt;
*attendre 5s&lt;/div&gt;</summary>
		<author><name>Bjacquot</name></author>	</entry>

	<entry>
		<id>http://wikigeii.iut-troyes.univ-reims.fr//index.php?title=Cours:DocsLTSP&amp;diff=20925</id>
		<title>Cours:DocsLTSP</title>
		<link rel="alternate" type="text/html" href="http://wikigeii.iut-troyes.univ-reims.fr//index.php?title=Cours:DocsLTSP&amp;diff=20925"/>
				<updated>2026-04-03T17:43:30Z</updated>
		
		<summary type="html">&lt;p&gt;Bjacquot : /* firefox */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=mise à jour=&lt;br /&gt;
&lt;br /&gt;
*préparer les mises à jour&lt;br /&gt;
**dans le menu de bootreseau&lt;br /&gt;
**choisir &amp;quot;installer mise a jour Ubuntu&amp;quot;&lt;br /&gt;
**mettre à jour le noyau avec : updateKernelReseau&lt;br /&gt;
*vérifier les mises à jour&lt;br /&gt;
**dans le menu de bootreseau&lt;br /&gt;
**choisir &amp;quot;verifier apres mise a jour Ubuntu&amp;quot;&lt;br /&gt;
*passer sur la nouvelle version&lt;br /&gt;
**après vérifications&lt;br /&gt;
**lancer la commande : updateBootReseau&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=Installation=&lt;br /&gt;
https://wiki.defis.info/?LTSPInstall&lt;br /&gt;
&lt;br /&gt;
*installation ltsp https://ltsp.org/docs/installation/&lt;br /&gt;
*debootstrap ubuntu&lt;br /&gt;
&lt;br /&gt;
**https://github.com/ltsp/ltsp/wiki/chroots&lt;br /&gt;
&amp;lt;source lang=bash&amp;gt;&lt;br /&gt;
mkdir /srv/ltsp&lt;br /&gt;
cd /srv/ltsp&lt;br /&gt;
debootstrap --include ubuntu-minimal noble noble&lt;br /&gt;
//config schroot&lt;br /&gt;
schroot&lt;br /&gt;
// continuer avec l'installation de paquets, par ex https://help.ubuntu.com/community/DebootstrapChroot&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*config ltsp&lt;br /&gt;
**ltsp dnsmasq&lt;br /&gt;
**ltsp ipxe&lt;br /&gt;
**ltsp initrd&lt;br /&gt;
**ltsp kernel&lt;br /&gt;
**ltsp nfs&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*ltsp initrd :&lt;br /&gt;
**update ltsp.img&lt;br /&gt;
**modifie users&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=bash&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=groupes utilisateurs=&lt;br /&gt;
modifier le fichier : /etc/security/group.conf&lt;br /&gt;
&lt;br /&gt;
=tftp from grub=&lt;br /&gt;
&lt;br /&gt;
*https://gist.github.com/maccadia/e5faa903f591a089c1c65be381619118&lt;br /&gt;
&lt;br /&gt;
=virt-viewer=&lt;br /&gt;
*https://www.apalrd.net/posts/2022/raspi_spice/&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=bash&amp;gt;&lt;br /&gt;
#!/bin/bash&lt;br /&gt;
set -e&lt;br /&gt;
&lt;br /&gt;
# Set auth options&lt;br /&gt;
PASSWORD='xxxxxxxx'&lt;br /&gt;
USERNAME='spiceUser@pve'&lt;br /&gt;
&lt;br /&gt;
# Set VM ID&lt;br /&gt;
VMID=&amp;quot;102&amp;quot;&lt;br /&gt;
&lt;br /&gt;
# Set Node&lt;br /&gt;
# This must either be a DNS address or name of the node in the cluster&lt;br /&gt;
NODE=&amp;quot;geii-node2-svr&amp;quot;&lt;br /&gt;
&lt;br /&gt;
# Proxy equals node if node is a DNS address&lt;br /&gt;
# Otherwise, you need to set the IP address of the node here&lt;br /&gt;
PROXY=&amp;quot;10.98.35.249&amp;quot;&lt;br /&gt;
&lt;br /&gt;
#The rest of the script from Proxmox&lt;br /&gt;
NODE=&amp;quot;${NODE%%\.*}&amp;quot;&lt;br /&gt;
&lt;br /&gt;
DATA=&amp;quot;$(curl -f -s -S -k --data-urlencode &amp;quot;username=$USERNAME&amp;quot; --data-urlencode &amp;quot;password=$PASSWORD&amp;quot; &amp;quot;https://$PROXY:8006/api2/json/access/ticket&amp;quot;)&amp;quot;&lt;br /&gt;
&lt;br /&gt;
echo &amp;quot;AUTH OK&amp;quot;&lt;br /&gt;
&lt;br /&gt;
TICKET=&amp;quot;${DATA//\&amp;quot;/}&amp;quot;&lt;br /&gt;
TICKET=&amp;quot;${TICKET##*ticket:}&amp;quot;&lt;br /&gt;
TICKET=&amp;quot;${TICKET%%,*}&amp;quot;&lt;br /&gt;
TICKET=&amp;quot;${TICKET%%\}*}&amp;quot;&lt;br /&gt;
&lt;br /&gt;
CSRF=&amp;quot;${DATA//\&amp;quot;/}&amp;quot;&lt;br /&gt;
CSRF=&amp;quot;${CSRF##*CSRFPreventionToken:}&amp;quot;&lt;br /&gt;
CSRF=&amp;quot;${CSRF%%,*}&amp;quot;&lt;br /&gt;
CSRF=&amp;quot;${CSRF%%\}*}&amp;quot;&lt;br /&gt;
&lt;br /&gt;
curl -f -s -S -k -b &amp;quot;PVEAuthCookie=$TICKET&amp;quot; -H &amp;quot;CSRFPreventionToken: $CSRF&amp;quot; &amp;quot;https://$PROXY:8006/api2/spiceconfig/nodes/$NODE/qemu/$VMID/spiceproxy&amp;quot; -d &amp;quot;proxy=$PROXY&amp;quot; &amp;gt; spiceproxy&lt;br /&gt;
&lt;br /&gt;
#Launch remote-viewer with spiceproxy file, in kiosk mode, quit on disconnect&lt;br /&gt;
#The run loop will get a new ticket and launch us again if we disconnect&lt;br /&gt;
exec remote-viewer -k --kiosk-quit on-disconnect spiceproxy&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=initrd nfs v4=&lt;br /&gt;
*https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=409272&lt;br /&gt;
*https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=409272&lt;br /&gt;
&lt;br /&gt;
=divers=&lt;br /&gt;
&lt;br /&gt;
The most common iPXE boot loaders are undionly.kpxe (for bios) and snp.efi/snponly.efi (for usefi). Just be aware you can not boot a bios bootloader (undionly.kpxe) on a uefi system unless CSM is enabled. But then CSM would boot in bios mode. The same is the case for snp.efi, it will not boot on a bios based computer.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
https://wiki.fogproject.org/wiki/index.php?title=ProxyDHCP_with_dnsmasq&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
https://wiki.ubuntu.com/LTSPLocalAppSetup&lt;br /&gt;
&lt;br /&gt;
http://wiki.bluelightav.org/pages/viewpage.action?pageId=23626143&lt;br /&gt;
&lt;br /&gt;
=grub=&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=bash&amp;gt;&lt;br /&gt;
menuentry &amp;quot;LTSP Network Boot&amp;quot;&lt;br /&gt;
{&lt;br /&gt;
 insmod net&lt;br /&gt;
 insmod efinet&lt;br /&gt;
 insmod tftp&lt;br /&gt;
 insmod pxeboot&lt;br /&gt;
 net_bootp linux (tftp,&amp;lt;IP_SERVEUR&amp;gt;)/ltsp/x86_64/vmlinuz initrd=/ltsp/x86_64/initrd.img root=/dev/nfs nfsroot=&amp;lt;IP_SERVEUR&amp;gt;:/opt/ltsp rootfstype=nfs ip=dhcp&lt;br /&gt;
 initrd (tftp,&amp;lt;IP_SERVEUR&amp;gt;)/ltsp/x86_64/initrd.img&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=optimisation=&lt;br /&gt;
&lt;br /&gt;
==firefox==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=bash&amp;gt;&lt;br /&gt;
nano /usr/lib/firefox/distribution/policies.json&lt;br /&gt;
&lt;br /&gt;
{&lt;br /&gt;
  &amp;quot;policies&amp;quot;: {&lt;br /&gt;
    &amp;quot;DisableTelemetry&amp;quot;: true,&lt;br /&gt;
    &amp;quot;Preferences&amp;quot;: {&lt;br /&gt;
      &amp;quot;browser.cache.disk.enable&amp;quot;: false,&lt;br /&gt;
      &amp;quot;browser.cache.memory.enable&amp;quot;: true,&lt;br /&gt;
      &amp;quot;browser.cache.offline.enable&amp;quot;: false,&lt;br /&gt;
      &amp;quot;browser.sessionstore.interval&amp;quot;: 600000,&lt;br /&gt;
      &amp;quot;network.http.pipelining&amp;quot;: true&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
nano /usr/lib/firefox/mozilla.cfg&lt;br /&gt;
&lt;br /&gt;
lockPref(&amp;quot;browser.cache.disk.enable&amp;quot;, false);&lt;br /&gt;
defaultPref(&amp;quot;browser.cache.memory.enable&amp;quot;, true);&lt;br /&gt;
lockPref(&amp;quot;browser.cache.offline.enable&amp;quot;, false);&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;/div&gt;</summary>
		<author><name>Bjacquot</name></author>	</entry>

	<entry>
		<id>http://wikigeii.iut-troyes.univ-reims.fr//index.php?title=Cours:DocsLTSP&amp;diff=20924</id>
		<title>Cours:DocsLTSP</title>
		<link rel="alternate" type="text/html" href="http://wikigeii.iut-troyes.univ-reims.fr//index.php?title=Cours:DocsLTSP&amp;diff=20924"/>
				<updated>2026-04-03T17:37:30Z</updated>
		
		<summary type="html">&lt;p&gt;Bjacquot : /* firefox */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=mise à jour=&lt;br /&gt;
&lt;br /&gt;
*préparer les mises à jour&lt;br /&gt;
**dans le menu de bootreseau&lt;br /&gt;
**choisir &amp;quot;installer mise a jour Ubuntu&amp;quot;&lt;br /&gt;
**mettre à jour le noyau avec : updateKernelReseau&lt;br /&gt;
*vérifier les mises à jour&lt;br /&gt;
**dans le menu de bootreseau&lt;br /&gt;
**choisir &amp;quot;verifier apres mise a jour Ubuntu&amp;quot;&lt;br /&gt;
*passer sur la nouvelle version&lt;br /&gt;
**après vérifications&lt;br /&gt;
**lancer la commande : updateBootReseau&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=Installation=&lt;br /&gt;
https://wiki.defis.info/?LTSPInstall&lt;br /&gt;
&lt;br /&gt;
*installation ltsp https://ltsp.org/docs/installation/&lt;br /&gt;
*debootstrap ubuntu&lt;br /&gt;
&lt;br /&gt;
**https://github.com/ltsp/ltsp/wiki/chroots&lt;br /&gt;
&amp;lt;source lang=bash&amp;gt;&lt;br /&gt;
mkdir /srv/ltsp&lt;br /&gt;
cd /srv/ltsp&lt;br /&gt;
debootstrap --include ubuntu-minimal noble noble&lt;br /&gt;
//config schroot&lt;br /&gt;
schroot&lt;br /&gt;
// continuer avec l'installation de paquets, par ex https://help.ubuntu.com/community/DebootstrapChroot&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*config ltsp&lt;br /&gt;
**ltsp dnsmasq&lt;br /&gt;
**ltsp ipxe&lt;br /&gt;
**ltsp initrd&lt;br /&gt;
**ltsp kernel&lt;br /&gt;
**ltsp nfs&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*ltsp initrd :&lt;br /&gt;
**update ltsp.img&lt;br /&gt;
**modifie users&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=bash&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=groupes utilisateurs=&lt;br /&gt;
modifier le fichier : /etc/security/group.conf&lt;br /&gt;
&lt;br /&gt;
=tftp from grub=&lt;br /&gt;
&lt;br /&gt;
*https://gist.github.com/maccadia/e5faa903f591a089c1c65be381619118&lt;br /&gt;
&lt;br /&gt;
=virt-viewer=&lt;br /&gt;
*https://www.apalrd.net/posts/2022/raspi_spice/&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=bash&amp;gt;&lt;br /&gt;
#!/bin/bash&lt;br /&gt;
set -e&lt;br /&gt;
&lt;br /&gt;
# Set auth options&lt;br /&gt;
PASSWORD='xxxxxxxx'&lt;br /&gt;
USERNAME='spiceUser@pve'&lt;br /&gt;
&lt;br /&gt;
# Set VM ID&lt;br /&gt;
VMID=&amp;quot;102&amp;quot;&lt;br /&gt;
&lt;br /&gt;
# Set Node&lt;br /&gt;
# This must either be a DNS address or name of the node in the cluster&lt;br /&gt;
NODE=&amp;quot;geii-node2-svr&amp;quot;&lt;br /&gt;
&lt;br /&gt;
# Proxy equals node if node is a DNS address&lt;br /&gt;
# Otherwise, you need to set the IP address of the node here&lt;br /&gt;
PROXY=&amp;quot;10.98.35.249&amp;quot;&lt;br /&gt;
&lt;br /&gt;
#The rest of the script from Proxmox&lt;br /&gt;
NODE=&amp;quot;${NODE%%\.*}&amp;quot;&lt;br /&gt;
&lt;br /&gt;
DATA=&amp;quot;$(curl -f -s -S -k --data-urlencode &amp;quot;username=$USERNAME&amp;quot; --data-urlencode &amp;quot;password=$PASSWORD&amp;quot; &amp;quot;https://$PROXY:8006/api2/json/access/ticket&amp;quot;)&amp;quot;&lt;br /&gt;
&lt;br /&gt;
echo &amp;quot;AUTH OK&amp;quot;&lt;br /&gt;
&lt;br /&gt;
TICKET=&amp;quot;${DATA//\&amp;quot;/}&amp;quot;&lt;br /&gt;
TICKET=&amp;quot;${TICKET##*ticket:}&amp;quot;&lt;br /&gt;
TICKET=&amp;quot;${TICKET%%,*}&amp;quot;&lt;br /&gt;
TICKET=&amp;quot;${TICKET%%\}*}&amp;quot;&lt;br /&gt;
&lt;br /&gt;
CSRF=&amp;quot;${DATA//\&amp;quot;/}&amp;quot;&lt;br /&gt;
CSRF=&amp;quot;${CSRF##*CSRFPreventionToken:}&amp;quot;&lt;br /&gt;
CSRF=&amp;quot;${CSRF%%,*}&amp;quot;&lt;br /&gt;
CSRF=&amp;quot;${CSRF%%\}*}&amp;quot;&lt;br /&gt;
&lt;br /&gt;
curl -f -s -S -k -b &amp;quot;PVEAuthCookie=$TICKET&amp;quot; -H &amp;quot;CSRFPreventionToken: $CSRF&amp;quot; &amp;quot;https://$PROXY:8006/api2/spiceconfig/nodes/$NODE/qemu/$VMID/spiceproxy&amp;quot; -d &amp;quot;proxy=$PROXY&amp;quot; &amp;gt; spiceproxy&lt;br /&gt;
&lt;br /&gt;
#Launch remote-viewer with spiceproxy file, in kiosk mode, quit on disconnect&lt;br /&gt;
#The run loop will get a new ticket and launch us again if we disconnect&lt;br /&gt;
exec remote-viewer -k --kiosk-quit on-disconnect spiceproxy&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=initrd nfs v4=&lt;br /&gt;
*https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=409272&lt;br /&gt;
*https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=409272&lt;br /&gt;
&lt;br /&gt;
=divers=&lt;br /&gt;
&lt;br /&gt;
The most common iPXE boot loaders are undionly.kpxe (for bios) and snp.efi/snponly.efi (for usefi). Just be aware you can not boot a bios bootloader (undionly.kpxe) on a uefi system unless CSM is enabled. But then CSM would boot in bios mode. The same is the case for snp.efi, it will not boot on a bios based computer.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
https://wiki.fogproject.org/wiki/index.php?title=ProxyDHCP_with_dnsmasq&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
https://wiki.ubuntu.com/LTSPLocalAppSetup&lt;br /&gt;
&lt;br /&gt;
http://wiki.bluelightav.org/pages/viewpage.action?pageId=23626143&lt;br /&gt;
&lt;br /&gt;
=grub=&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=bash&amp;gt;&lt;br /&gt;
menuentry &amp;quot;LTSP Network Boot&amp;quot;&lt;br /&gt;
{&lt;br /&gt;
 insmod net&lt;br /&gt;
 insmod efinet&lt;br /&gt;
 insmod tftp&lt;br /&gt;
 insmod pxeboot&lt;br /&gt;
 net_bootp linux (tftp,&amp;lt;IP_SERVEUR&amp;gt;)/ltsp/x86_64/vmlinuz initrd=/ltsp/x86_64/initrd.img root=/dev/nfs nfsroot=&amp;lt;IP_SERVEUR&amp;gt;:/opt/ltsp rootfstype=nfs ip=dhcp&lt;br /&gt;
 initrd (tftp,&amp;lt;IP_SERVEUR&amp;gt;)/ltsp/x86_64/initrd.img&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=optimisation=&lt;br /&gt;
&lt;br /&gt;
==firefox==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=bash&amp;gt;&lt;br /&gt;
nano /usr/lib/firefox/distribution/policies.json&lt;br /&gt;
&lt;br /&gt;
{&lt;br /&gt;
  &amp;quot;policies&amp;quot;: {&lt;br /&gt;
    &amp;quot;DisableTelemetry&amp;quot;: true,&lt;br /&gt;
    &amp;quot;Preferences&amp;quot;: {&lt;br /&gt;
      &amp;quot;browser.cache.disk.enable&amp;quot;: false,&lt;br /&gt;
      &amp;quot;browser.cache.memory.enable&amp;quot;: true,&lt;br /&gt;
      &amp;quot;browser.cache.offline.enable&amp;quot;: false&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
nano /usr/lib/firefox/mozilla.cfg&lt;br /&gt;
&lt;br /&gt;
lockPref(&amp;quot;browser.cache.disk.enable&amp;quot;, false);&lt;br /&gt;
defaultPref(&amp;quot;browser.cache.memory.enable&amp;quot;, true);&lt;br /&gt;
lockPref(&amp;quot;browser.cache.offline.enable&amp;quot;, false);&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;/div&gt;</summary>
		<author><name>Bjacquot</name></author>	</entry>

	<entry>
		<id>http://wikigeii.iut-troyes.univ-reims.fr//index.php?title=Cours:DocsLTSP&amp;diff=20923</id>
		<title>Cours:DocsLTSP</title>
		<link rel="alternate" type="text/html" href="http://wikigeii.iut-troyes.univ-reims.fr//index.php?title=Cours:DocsLTSP&amp;diff=20923"/>
				<updated>2026-04-03T17:37:20Z</updated>
		
		<summary type="html">&lt;p&gt;Bjacquot : /* grub */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=mise à jour=&lt;br /&gt;
&lt;br /&gt;
*préparer les mises à jour&lt;br /&gt;
**dans le menu de bootreseau&lt;br /&gt;
**choisir &amp;quot;installer mise a jour Ubuntu&amp;quot;&lt;br /&gt;
**mettre à jour le noyau avec : updateKernelReseau&lt;br /&gt;
*vérifier les mises à jour&lt;br /&gt;
**dans le menu de bootreseau&lt;br /&gt;
**choisir &amp;quot;verifier apres mise a jour Ubuntu&amp;quot;&lt;br /&gt;
*passer sur la nouvelle version&lt;br /&gt;
**après vérifications&lt;br /&gt;
**lancer la commande : updateBootReseau&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=Installation=&lt;br /&gt;
https://wiki.defis.info/?LTSPInstall&lt;br /&gt;
&lt;br /&gt;
*installation ltsp https://ltsp.org/docs/installation/&lt;br /&gt;
*debootstrap ubuntu&lt;br /&gt;
&lt;br /&gt;
**https://github.com/ltsp/ltsp/wiki/chroots&lt;br /&gt;
&amp;lt;source lang=bash&amp;gt;&lt;br /&gt;
mkdir /srv/ltsp&lt;br /&gt;
cd /srv/ltsp&lt;br /&gt;
debootstrap --include ubuntu-minimal noble noble&lt;br /&gt;
//config schroot&lt;br /&gt;
schroot&lt;br /&gt;
// continuer avec l'installation de paquets, par ex https://help.ubuntu.com/community/DebootstrapChroot&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*config ltsp&lt;br /&gt;
**ltsp dnsmasq&lt;br /&gt;
**ltsp ipxe&lt;br /&gt;
**ltsp initrd&lt;br /&gt;
**ltsp kernel&lt;br /&gt;
**ltsp nfs&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*ltsp initrd :&lt;br /&gt;
**update ltsp.img&lt;br /&gt;
**modifie users&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=bash&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=groupes utilisateurs=&lt;br /&gt;
modifier le fichier : /etc/security/group.conf&lt;br /&gt;
&lt;br /&gt;
=tftp from grub=&lt;br /&gt;
&lt;br /&gt;
*https://gist.github.com/maccadia/e5faa903f591a089c1c65be381619118&lt;br /&gt;
&lt;br /&gt;
=virt-viewer=&lt;br /&gt;
*https://www.apalrd.net/posts/2022/raspi_spice/&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=bash&amp;gt;&lt;br /&gt;
#!/bin/bash&lt;br /&gt;
set -e&lt;br /&gt;
&lt;br /&gt;
# Set auth options&lt;br /&gt;
PASSWORD='xxxxxxxx'&lt;br /&gt;
USERNAME='spiceUser@pve'&lt;br /&gt;
&lt;br /&gt;
# Set VM ID&lt;br /&gt;
VMID=&amp;quot;102&amp;quot;&lt;br /&gt;
&lt;br /&gt;
# Set Node&lt;br /&gt;
# This must either be a DNS address or name of the node in the cluster&lt;br /&gt;
NODE=&amp;quot;geii-node2-svr&amp;quot;&lt;br /&gt;
&lt;br /&gt;
# Proxy equals node if node is a DNS address&lt;br /&gt;
# Otherwise, you need to set the IP address of the node here&lt;br /&gt;
PROXY=&amp;quot;10.98.35.249&amp;quot;&lt;br /&gt;
&lt;br /&gt;
#The rest of the script from Proxmox&lt;br /&gt;
NODE=&amp;quot;${NODE%%\.*}&amp;quot;&lt;br /&gt;
&lt;br /&gt;
DATA=&amp;quot;$(curl -f -s -S -k --data-urlencode &amp;quot;username=$USERNAME&amp;quot; --data-urlencode &amp;quot;password=$PASSWORD&amp;quot; &amp;quot;https://$PROXY:8006/api2/json/access/ticket&amp;quot;)&amp;quot;&lt;br /&gt;
&lt;br /&gt;
echo &amp;quot;AUTH OK&amp;quot;&lt;br /&gt;
&lt;br /&gt;
TICKET=&amp;quot;${DATA//\&amp;quot;/}&amp;quot;&lt;br /&gt;
TICKET=&amp;quot;${TICKET##*ticket:}&amp;quot;&lt;br /&gt;
TICKET=&amp;quot;${TICKET%%,*}&amp;quot;&lt;br /&gt;
TICKET=&amp;quot;${TICKET%%\}*}&amp;quot;&lt;br /&gt;
&lt;br /&gt;
CSRF=&amp;quot;${DATA//\&amp;quot;/}&amp;quot;&lt;br /&gt;
CSRF=&amp;quot;${CSRF##*CSRFPreventionToken:}&amp;quot;&lt;br /&gt;
CSRF=&amp;quot;${CSRF%%,*}&amp;quot;&lt;br /&gt;
CSRF=&amp;quot;${CSRF%%\}*}&amp;quot;&lt;br /&gt;
&lt;br /&gt;
curl -f -s -S -k -b &amp;quot;PVEAuthCookie=$TICKET&amp;quot; -H &amp;quot;CSRFPreventionToken: $CSRF&amp;quot; &amp;quot;https://$PROXY:8006/api2/spiceconfig/nodes/$NODE/qemu/$VMID/spiceproxy&amp;quot; -d &amp;quot;proxy=$PROXY&amp;quot; &amp;gt; spiceproxy&lt;br /&gt;
&lt;br /&gt;
#Launch remote-viewer with spiceproxy file, in kiosk mode, quit on disconnect&lt;br /&gt;
#The run loop will get a new ticket and launch us again if we disconnect&lt;br /&gt;
exec remote-viewer -k --kiosk-quit on-disconnect spiceproxy&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=initrd nfs v4=&lt;br /&gt;
*https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=409272&lt;br /&gt;
*https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=409272&lt;br /&gt;
&lt;br /&gt;
=divers=&lt;br /&gt;
&lt;br /&gt;
The most common iPXE boot loaders are undionly.kpxe (for bios) and snp.efi/snponly.efi (for usefi). Just be aware you can not boot a bios bootloader (undionly.kpxe) on a uefi system unless CSM is enabled. But then CSM would boot in bios mode. The same is the case for snp.efi, it will not boot on a bios based computer.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
https://wiki.fogproject.org/wiki/index.php?title=ProxyDHCP_with_dnsmasq&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
https://wiki.ubuntu.com/LTSPLocalAppSetup&lt;br /&gt;
&lt;br /&gt;
http://wiki.bluelightav.org/pages/viewpage.action?pageId=23626143&lt;br /&gt;
&lt;br /&gt;
=grub=&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=bash&amp;gt;&lt;br /&gt;
menuentry &amp;quot;LTSP Network Boot&amp;quot;&lt;br /&gt;
{&lt;br /&gt;
 insmod net&lt;br /&gt;
 insmod efinet&lt;br /&gt;
 insmod tftp&lt;br /&gt;
 insmod pxeboot&lt;br /&gt;
 net_bootp linux (tftp,&amp;lt;IP_SERVEUR&amp;gt;)/ltsp/x86_64/vmlinuz initrd=/ltsp/x86_64/initrd.img root=/dev/nfs nfsroot=&amp;lt;IP_SERVEUR&amp;gt;:/opt/ltsp rootfstype=nfs ip=dhcp&lt;br /&gt;
 initrd (tftp,&amp;lt;IP_SERVEUR&amp;gt;)/ltsp/x86_64/initrd.img&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=optimisation=&lt;br /&gt;
&lt;br /&gt;
==firefox==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=bash&amp;gt;&lt;br /&gt;
nano /usr/lib/firefox/distribution/policies.json&lt;br /&gt;
&lt;br /&gt;
{&lt;br /&gt;
  &amp;quot;policies&amp;quot;: {&lt;br /&gt;
    &amp;quot;DisableTelemetry&amp;quot;: true,&lt;br /&gt;
    &amp;quot;Preferences&amp;quot;: {&lt;br /&gt;
      &amp;quot;browser.cache.disk.enable&amp;quot;: false,&lt;br /&gt;
      &amp;quot;browser.cache.memory.enable&amp;quot;: true,&lt;br /&gt;
      &amp;quot;browser.cache.offline.enable&amp;quot;: false&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
nano /usr/lib/firefox/mozilla.cfg&lt;br /&gt;
&lt;br /&gt;
lockPref(&amp;quot;browser.cache.disk.enable&amp;quot;, false);&lt;br /&gt;
defaultPref(&amp;quot;browser.cache.memory.enable&amp;quot;, true);&lt;br /&gt;
lockPref(&amp;quot;browser.cache.offline.enable&amp;quot;, false);&lt;/div&gt;</summary>
		<author><name>Bjacquot</name></author>	</entry>

	<entry>
		<id>http://wikigeii.iut-troyes.univ-reims.fr//index.php?title=Cours:InfoS2_EvaluationSimulIde&amp;diff=20922</id>
		<title>Cours:InfoS2 EvaluationSimulIde</title>
		<link rel="alternate" type="text/html" href="http://wikigeii.iut-troyes.univ-reims.fr//index.php?title=Cours:InfoS2_EvaluationSimulIde&amp;diff=20922"/>
				<updated>2026-04-03T07:35:17Z</updated>
		
		<summary type="html">&lt;p&gt;Bjacquot : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
&lt;br /&gt;
{{EnTeteTdInfoS2|InfoS2 tdI2cRegistres prof}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=Identification des cibles=&lt;br /&gt;
&lt;br /&gt;
 Fichiers pour simulide : [[Media:I2cSlaveEvaluation.zip|I2cSlaveEvaluation.zip]]&lt;br /&gt;
&lt;br /&gt;
 {{Rouge|**************************************************}}&lt;br /&gt;
 {{Rouge|***  Attention, programme dans un fichier .ino ***}}&lt;br /&gt;
 {{Rouge|**************************************************}}&lt;br /&gt;
 {{Rouge|***  choisir le µc Master en tant que MainMCU  ***}}&lt;br /&gt;
 {{Rouge|***          !!!! le point jaune !!!!          ***}}&lt;br /&gt;
 {{Rouge|**************************************************}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{Eval|1|Trouver l'adresse i2c du &amp;quot;slave afficheur&amp;quot;}}&lt;br /&gt;
&lt;br /&gt;
=Utilisation du chenillard=&lt;br /&gt;
&lt;br /&gt;
Le slave chenillard s'utilise de façon simple :&lt;br /&gt;
*on peut uniquement écrire des valeurs sur ce slave&lt;br /&gt;
*il n'y a pas de registres&lt;br /&gt;
*on enverra :&lt;br /&gt;
**la valeur 0 pour arrêter le chenillard&lt;br /&gt;
**la valeur 1 pour mettre en route le chenillard&lt;br /&gt;
&lt;br /&gt;
{{Eval|1|Ecrire un programme dans le master qui :}}&lt;br /&gt;
*met en marche le chenillard pendant 1s&lt;br /&gt;
*l'arrête pendant 2s&lt;br /&gt;
*recommence&lt;br /&gt;
&lt;br /&gt;
=Utilisation du bouton=&lt;br /&gt;
Le slave chenillard s'utilise de façon simple :&lt;br /&gt;
*on peut uniquement lire des valeurs sur ce slave&lt;br /&gt;
*il n'y a pas de registres&lt;br /&gt;
*on lira :&lt;br /&gt;
**la valeur 0 lorsque le bouton n'est pas appuyé&lt;br /&gt;
**la valeur 1 lorsque le bouton est appuyé&lt;br /&gt;
&lt;br /&gt;
{{Eval|2|Ecrire un programme dans le master qui :}}&lt;br /&gt;
*affiche la valeur du bouton sur la liaison série&lt;br /&gt;
*commande la mise en marche du chenillard avec le bouton&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Utilisation de l'afficheur 7 segments=&lt;br /&gt;
Le slave afficheur s'utilise de façon simple :&lt;br /&gt;
*on peut uniquement écrire des valeurs sur ce slave&lt;br /&gt;
*il y a 4 registres :&lt;br /&gt;
**registre {{Rouge|0}} : change la valeur des unités&lt;br /&gt;
**registre {{Rouge|1}} : change la valeur des dizaines&lt;br /&gt;
**registre {{Rouge|2}} : change la valeur des centaines&lt;br /&gt;
**registre {{Rouge|3}} : change la valeur des milliers&lt;br /&gt;
&lt;br /&gt;
{{Eval|2|Ecrire un programme dans le master qui :}}&lt;br /&gt;
*affiche la valeur &amp;quot;1234&amp;quot; pendant 1s&lt;br /&gt;
*affiche la valeur &amp;quot;9876&amp;quot; pendant 2s&lt;br /&gt;
*recommence&lt;br /&gt;
&lt;br /&gt;
=Utilisation du chrono=&lt;br /&gt;
Le slave chrono s'utilise de la façon suivante :&lt;br /&gt;
*on peut écrire ou lire des valeurs sur ce slave&lt;br /&gt;
*il n'y a pas de registres&lt;br /&gt;
*en écriture :&lt;br /&gt;
**écrire la valeur 0 permet d'arrêter le chrono&lt;br /&gt;
**écrire la valeur 1 permet de mettre en route le chrono et de le remettre à 0&lt;br /&gt;
*en lecture :&lt;br /&gt;
**on obtient la valeur du chronomètre&lt;br /&gt;
**il conviendra de multiplier la valeur lue en i2c par 8 pour obtenir la durée en ms&lt;br /&gt;
&lt;br /&gt;
{{Eval|2|Ecrire un programme dans le master qui :}}&lt;br /&gt;
*lance le chrono&lt;br /&gt;
*attend 500ms&lt;br /&gt;
*arrête le chrono&lt;br /&gt;
*récupère la valeur du chrono&lt;br /&gt;
*affiche la valeur du chrono sur la liaison série (en ms)&lt;br /&gt;
*affiche la valeur du chrono sur le slave afficheur&lt;br /&gt;
*attend 5s avant de recommencer&lt;br /&gt;
&lt;br /&gt;
=Assemblons le tout=&lt;br /&gt;
&lt;br /&gt;
On réalise un jeu de réflexe : le joueur devra appuyer sur le bouton dès qu'il constate un changement sur le chenillard&lt;br /&gt;
&lt;br /&gt;
{{Eval|2|Ecrire un programme correspondant à l'algorithme suivant :}}&lt;br /&gt;
*attendre 1s&lt;br /&gt;
*démarrer le chenillard&lt;br /&gt;
*démarrer le chrono&lt;br /&gt;
*attendre appui sur le bouton&lt;br /&gt;
*arrêter le chrono&lt;br /&gt;
*arrêter le chenillard&lt;br /&gt;
*lire le chrono&lt;br /&gt;
*afficher la valeur du chrono sur l'afficheur&lt;br /&gt;
*attendre le relâchement du bouton&lt;br /&gt;
*attendre 5s&lt;/div&gt;</summary>
		<author><name>Bjacquot</name></author>	</entry>

	<entry>
		<id>http://wikigeii.iut-troyes.univ-reims.fr//index.php?title=Cours:InfoS2_EvaluationSimulIde&amp;diff=20921</id>
		<title>Cours:InfoS2 EvaluationSimulIde</title>
		<link rel="alternate" type="text/html" href="http://wikigeii.iut-troyes.univ-reims.fr//index.php?title=Cours:InfoS2_EvaluationSimulIde&amp;diff=20921"/>
				<updated>2026-04-03T07:13:32Z</updated>
		
		<summary type="html">&lt;p&gt;Bjacquot : /* Utilisation du bouton */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;accesscontrol&amp;gt;Acces:Prof&amp;lt;/accesscontrol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{EnTeteTdInfoS2|InfoS2 tdI2cRegistres prof}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=Identification des cibles=&lt;br /&gt;
&lt;br /&gt;
 Fichiers pour simulide : [[Media:I2cSlaveEvaluation.zip|I2cSlaveEvaluation.zip]]&lt;br /&gt;
&lt;br /&gt;
 {{Rouge|**************************************************}}&lt;br /&gt;
 {{Rouge|***  Attention, programme dans un fichier .ino ***}}&lt;br /&gt;
 {{Rouge|**************************************************}}&lt;br /&gt;
 {{Rouge|***  choisir le µc Master en tant que MainMCU  ***}}&lt;br /&gt;
 {{Rouge|***          !!!! le point jaune !!!!          ***}}&lt;br /&gt;
 {{Rouge|**************************************************}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{Eval|1|Trouver l'adresse i2c du &amp;quot;slave afficheur&amp;quot;}}&lt;br /&gt;
&lt;br /&gt;
=Utilisation du chenillard=&lt;br /&gt;
&lt;br /&gt;
Le slave chenillard s'utilise de façon simple :&lt;br /&gt;
*on peut uniquement écrire des valeurs sur ce slave&lt;br /&gt;
*il n'y a pas de registres&lt;br /&gt;
*on enverra :&lt;br /&gt;
**la valeur 0 pour arrêter le chenillard&lt;br /&gt;
**la valeur 1 pour mettre en route le chenillard&lt;br /&gt;
&lt;br /&gt;
{{Eval|1|Ecrire un programme dans le master qui :}}&lt;br /&gt;
*met en marche le chenillard pendant 1s&lt;br /&gt;
*l'arrête pendant 2s&lt;br /&gt;
*recommence&lt;br /&gt;
&lt;br /&gt;
=Utilisation du bouton=&lt;br /&gt;
Le slave chenillard s'utilise de façon simple :&lt;br /&gt;
*on peut uniquement lire des valeurs sur ce slave&lt;br /&gt;
*il n'y a pas de registres&lt;br /&gt;
*on lira :&lt;br /&gt;
**la valeur 0 lorsque le bouton n'est pas appuyé&lt;br /&gt;
**la valeur 1 lorsque le bouton est appuyé&lt;br /&gt;
&lt;br /&gt;
{{Eval|2|Ecrire un programme dans le master qui :}}&lt;br /&gt;
*affiche la valeur du bouton sur la liaison série&lt;br /&gt;
*commande la mise en marche du chenillard avec le bouton&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Utilisation de l'afficheur 7 segments=&lt;br /&gt;
Le slave afficheur s'utilise de façon simple :&lt;br /&gt;
*on peut uniquement écrire des valeurs sur ce slave&lt;br /&gt;
*il y a 4 registres :&lt;br /&gt;
**registre {{Rouge|0}} : change la valeur des unités&lt;br /&gt;
**registre {{Rouge|1}} : change la valeur des dizaines&lt;br /&gt;
**registre {{Rouge|2}} : change la valeur des centaines&lt;br /&gt;
**registre {{Rouge|3}} : change la valeur des milliers&lt;br /&gt;
&lt;br /&gt;
{{Eval|2|Ecrire un programme dans le master qui :}}&lt;br /&gt;
*affiche la valeur &amp;quot;1234&amp;quot; pendant 1s&lt;br /&gt;
*affiche la valeur &amp;quot;9876&amp;quot; pendant 2s&lt;br /&gt;
*recommence&lt;br /&gt;
&lt;br /&gt;
=Utilisation du chrono=&lt;br /&gt;
Le slave chrono s'utilise de la façon suivante :&lt;br /&gt;
*on peut écrire ou lire des valeurs sur ce slave&lt;br /&gt;
*il n'y a pas de registres&lt;br /&gt;
*en écriture :&lt;br /&gt;
**écrire la valeur 0 permet d'arrêter le chrono&lt;br /&gt;
**écrire la valeur 1 permet de mettre en route le chrono et de le remettre à 0&lt;br /&gt;
*en lecture :&lt;br /&gt;
**on obtient la valeur du chronomètre&lt;br /&gt;
**il conviendra de multiplier la valeur lue en i2c par 8 pour obtenir la durée en ms&lt;br /&gt;
&lt;br /&gt;
{{Eval|2|Ecrire un programme dans le master qui :}}&lt;br /&gt;
*lance le chrono&lt;br /&gt;
*attend 500ms&lt;br /&gt;
*arrête le chrono&lt;br /&gt;
*récupère la valeur du chrono&lt;br /&gt;
*affiche la valeur du chrono sur la liaison série (en ms)&lt;br /&gt;
*affiche la valeur du chrono sur le slave afficheur&lt;br /&gt;
*attend 5s avant de recommencer&lt;br /&gt;
&lt;br /&gt;
=Assemblons le tout=&lt;br /&gt;
&lt;br /&gt;
On réalise un jeu de réflexe : le joueur devra appuyer sur le bouton dès qu'il constate un changement sur le chenillard&lt;br /&gt;
&lt;br /&gt;
{{Eval|2|Ecrire un programme correspondant à l'algorithme suivant :}}&lt;br /&gt;
*attendre 1s&lt;br /&gt;
*démarrer le chenillard&lt;br /&gt;
*démarrer le chrono&lt;br /&gt;
*attendre appui sur le bouton&lt;br /&gt;
*arrêter le chrono&lt;br /&gt;
*arrêter le chenillard&lt;br /&gt;
*lire le chrono&lt;br /&gt;
*afficher la valeur du chrono sur l'afficheur&lt;br /&gt;
*attendre le relâchement du bouton&lt;br /&gt;
*attendre 5s&lt;/div&gt;</summary>
		<author><name>Bjacquot</name></author>	</entry>

	<entry>
		<id>http://wikigeii.iut-troyes.univ-reims.fr//index.php?title=Acces:Prof&amp;diff=20918</id>
		<title>Acces:Prof</title>
		<link rel="alternate" type="text/html" href="http://wikigeii.iut-troyes.univ-reims.fr//index.php?title=Acces:Prof&amp;diff=20918"/>
				<updated>2026-04-02T13:15:26Z</updated>
		
		<summary type="html">&lt;p&gt;Bjacquot : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;*bjacquot&lt;br /&gt;
*AgnesD&lt;br /&gt;
*f.sisternas&lt;br /&gt;
*sl&lt;br /&gt;
*bernar03&lt;br /&gt;
*Gmillon&lt;br /&gt;
*Remy02&lt;br /&gt;
*Woznyrob&lt;br /&gt;
*penant&lt;br /&gt;
*fredmn&lt;br /&gt;
*vuille01&lt;br /&gt;
*nawal&lt;br /&gt;
*Tarek&lt;/div&gt;</summary>
		<author><name>Bjacquot</name></author>	</entry>

	<entry>
		<id>http://wikigeii.iut-troyes.univ-reims.fr//index.php?title=Cours:InfoS2_EvaluationSimulIde&amp;diff=20917</id>
		<title>Cours:InfoS2 EvaluationSimulIde</title>
		<link rel="alternate" type="text/html" href="http://wikigeii.iut-troyes.univ-reims.fr//index.php?title=Cours:InfoS2_EvaluationSimulIde&amp;diff=20917"/>
				<updated>2026-04-01T13:52:17Z</updated>
		
		<summary type="html">&lt;p&gt;Bjacquot : /* Utilisation du chrono */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;accesscontrol&amp;gt;Acces:Prof&amp;lt;/accesscontrol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{EnTeteTdInfoS2|InfoS2 tdI2cRegistres prof}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=Identification des cibles=&lt;br /&gt;
&lt;br /&gt;
 Fichiers pour simulide : [[Media:I2cSlaveEvaluation.zip|I2cSlaveEvaluation.zip]]&lt;br /&gt;
&lt;br /&gt;
 {{Rouge|**************************************************}}&lt;br /&gt;
 {{Rouge|***  Attention, programme dans un fichier .ino ***}}&lt;br /&gt;
 {{Rouge|**************************************************}}&lt;br /&gt;
 {{Rouge|***  choisir le µc Master en tant que MainMCU  ***}}&lt;br /&gt;
 {{Rouge|***          !!!! le point jaune !!!!          ***}}&lt;br /&gt;
 {{Rouge|**************************************************}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{Eval|1|Trouver l'adresse i2c du &amp;quot;slave afficheur&amp;quot;}}&lt;br /&gt;
&lt;br /&gt;
=Utilisation du chenillard=&lt;br /&gt;
&lt;br /&gt;
Le slave chenillard s'utilise de façon simple :&lt;br /&gt;
*on peut uniquement écrire des valeurs sur ce slave&lt;br /&gt;
*il n'y a pas de registres&lt;br /&gt;
*on enverra :&lt;br /&gt;
**la valeur 0 pour arrêter le chenillard&lt;br /&gt;
**la valeur 1 pour mettre en route le chenillard&lt;br /&gt;
&lt;br /&gt;
{{Eval|1|Ecrire un programme dans le master qui :}}&lt;br /&gt;
*met en marche le chenillard pendant 1s&lt;br /&gt;
*l'arrête pendant 2s&lt;br /&gt;
*recommence&lt;br /&gt;
&lt;br /&gt;
=Utilisation du bouton=&lt;br /&gt;
Le slave chenillard s'utilise de façon simple :&lt;br /&gt;
*on peut uniquement lire des valeurs sur ce slave&lt;br /&gt;
*il n'y a pas de registres&lt;br /&gt;
*on lira :&lt;br /&gt;
**la valeur 0 lorsque le bouton n'est pas appuyé&lt;br /&gt;
**la valeur 1 lorsque le bouton est appuyé&lt;br /&gt;
&lt;br /&gt;
{{Eval|2|Ecrire un programme dans le master qui :}}&lt;br /&gt;
*affiche la valeur du bouton sur la liaison série&lt;br /&gt;
*commande la mise en marche du chenillard avec le bouton&lt;br /&gt;
&lt;br /&gt;
=Utilisation de l'afficheur 7 segments=&lt;br /&gt;
Le slave afficheur s'utilise de façon simple :&lt;br /&gt;
*on peut uniquement écrire des valeurs sur ce slave&lt;br /&gt;
*il y a 4 registres :&lt;br /&gt;
**registre {{Rouge|0}} : change la valeur des unités&lt;br /&gt;
**registre {{Rouge|1}} : change la valeur des dizaines&lt;br /&gt;
**registre {{Rouge|2}} : change la valeur des centaines&lt;br /&gt;
**registre {{Rouge|3}} : change la valeur des milliers&lt;br /&gt;
&lt;br /&gt;
{{Eval|2|Ecrire un programme dans le master qui :}}&lt;br /&gt;
*affiche la valeur &amp;quot;1234&amp;quot; pendant 1s&lt;br /&gt;
*affiche la valeur &amp;quot;9876&amp;quot; pendant 2s&lt;br /&gt;
*recommence&lt;br /&gt;
&lt;br /&gt;
=Utilisation du chrono=&lt;br /&gt;
Le slave chrono s'utilise de la façon suivante :&lt;br /&gt;
*on peut écrire ou lire des valeurs sur ce slave&lt;br /&gt;
*il n'y a pas de registres&lt;br /&gt;
*en écriture :&lt;br /&gt;
**écrire la valeur 0 permet d'arrêter le chrono&lt;br /&gt;
**écrire la valeur 1 permet de mettre en route le chrono et de le remettre à 0&lt;br /&gt;
*en lecture :&lt;br /&gt;
**on obtient la valeur du chronomètre&lt;br /&gt;
**il conviendra de multiplier la valeur lue en i2c par 8 pour obtenir la durée en ms&lt;br /&gt;
&lt;br /&gt;
{{Eval|2|Ecrire un programme dans le master qui :}}&lt;br /&gt;
*lance le chrono&lt;br /&gt;
*attend 500ms&lt;br /&gt;
*arrête le chrono&lt;br /&gt;
*récupère la valeur du chrono&lt;br /&gt;
*affiche la valeur du chrono sur la liaison série (en ms)&lt;br /&gt;
*affiche la valeur du chrono sur le slave afficheur&lt;br /&gt;
*attend 5s avant de recommencer&lt;br /&gt;
&lt;br /&gt;
=Assemblons le tout=&lt;br /&gt;
&lt;br /&gt;
On réalise un jeu de réflexe : le joueur devra appuyer sur le bouton dès qu'il constate un changement sur le chenillard&lt;br /&gt;
&lt;br /&gt;
{{Eval|2|Ecrire un programme correspondant à l'algorithme suivant :}}&lt;br /&gt;
*attendre 1s&lt;br /&gt;
*démarrer le chenillard&lt;br /&gt;
*démarrer le chrono&lt;br /&gt;
*attendre appui sur le bouton&lt;br /&gt;
*arrêter le chrono&lt;br /&gt;
*arrêter le chenillard&lt;br /&gt;
*lire le chrono&lt;br /&gt;
*afficher la valeur du chrono sur l'afficheur&lt;br /&gt;
*attendre le relâchement du bouton&lt;br /&gt;
*attendre 5s&lt;/div&gt;</summary>
		<author><name>Bjacquot</name></author>	</entry>

	<entry>
		<id>http://wikigeii.iut-troyes.univ-reims.fr//index.php?title=Cours:InfoS2_EvaluationSimulIde&amp;diff=20916</id>
		<title>Cours:InfoS2 EvaluationSimulIde</title>
		<link rel="alternate" type="text/html" href="http://wikigeii.iut-troyes.univ-reims.fr//index.php?title=Cours:InfoS2_EvaluationSimulIde&amp;diff=20916"/>
				<updated>2026-04-01T13:52:01Z</updated>
		
		<summary type="html">&lt;p&gt;Bjacquot : /* Utilisation du bouton */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;accesscontrol&amp;gt;Acces:Prof&amp;lt;/accesscontrol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{EnTeteTdInfoS2|InfoS2 tdI2cRegistres prof}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=Identification des cibles=&lt;br /&gt;
&lt;br /&gt;
 Fichiers pour simulide : [[Media:I2cSlaveEvaluation.zip|I2cSlaveEvaluation.zip]]&lt;br /&gt;
&lt;br /&gt;
 {{Rouge|**************************************************}}&lt;br /&gt;
 {{Rouge|***  Attention, programme dans un fichier .ino ***}}&lt;br /&gt;
 {{Rouge|**************************************************}}&lt;br /&gt;
 {{Rouge|***  choisir le µc Master en tant que MainMCU  ***}}&lt;br /&gt;
 {{Rouge|***          !!!! le point jaune !!!!          ***}}&lt;br /&gt;
 {{Rouge|**************************************************}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{Eval|1|Trouver l'adresse i2c du &amp;quot;slave afficheur&amp;quot;}}&lt;br /&gt;
&lt;br /&gt;
=Utilisation du chenillard=&lt;br /&gt;
&lt;br /&gt;
Le slave chenillard s'utilise de façon simple :&lt;br /&gt;
*on peut uniquement écrire des valeurs sur ce slave&lt;br /&gt;
*il n'y a pas de registres&lt;br /&gt;
*on enverra :&lt;br /&gt;
**la valeur 0 pour arrêter le chenillard&lt;br /&gt;
**la valeur 1 pour mettre en route le chenillard&lt;br /&gt;
&lt;br /&gt;
{{Eval|1|Ecrire un programme dans le master qui :}}&lt;br /&gt;
*met en marche le chenillard pendant 1s&lt;br /&gt;
*l'arrête pendant 2s&lt;br /&gt;
*recommence&lt;br /&gt;
&lt;br /&gt;
=Utilisation du bouton=&lt;br /&gt;
Le slave chenillard s'utilise de façon simple :&lt;br /&gt;
*on peut uniquement lire des valeurs sur ce slave&lt;br /&gt;
*il n'y a pas de registres&lt;br /&gt;
*on lira :&lt;br /&gt;
**la valeur 0 lorsque le bouton n'est pas appuyé&lt;br /&gt;
**la valeur 1 lorsque le bouton est appuyé&lt;br /&gt;
&lt;br /&gt;
{{Eval|2|Ecrire un programme dans le master qui :}}&lt;br /&gt;
*affiche la valeur du bouton sur la liaison série&lt;br /&gt;
*commande la mise en marche du chenillard avec le bouton&lt;br /&gt;
&lt;br /&gt;
=Utilisation de l'afficheur 7 segments=&lt;br /&gt;
Le slave afficheur s'utilise de façon simple :&lt;br /&gt;
*on peut uniquement écrire des valeurs sur ce slave&lt;br /&gt;
*il y a 4 registres :&lt;br /&gt;
**registre {{Rouge|0}} : change la valeur des unités&lt;br /&gt;
**registre {{Rouge|1}} : change la valeur des dizaines&lt;br /&gt;
**registre {{Rouge|2}} : change la valeur des centaines&lt;br /&gt;
**registre {{Rouge|3}} : change la valeur des milliers&lt;br /&gt;
&lt;br /&gt;
{{Eval|2|Ecrire un programme dans le master qui :}}&lt;br /&gt;
*affiche la valeur &amp;quot;1234&amp;quot; pendant 1s&lt;br /&gt;
*affiche la valeur &amp;quot;9876&amp;quot; pendant 2s&lt;br /&gt;
*recommence&lt;br /&gt;
&lt;br /&gt;
=Utilisation du chrono=&lt;br /&gt;
Le slave chrono s'utilise de la façon suivante :&lt;br /&gt;
*on peut écrire ou lire des valeurs sur ce slave&lt;br /&gt;
*en écriture :&lt;br /&gt;
**écrire la valeur 0 permet d'arrêter le chrono&lt;br /&gt;
**écrire la valeur 1 permet de mettre en route le chrono et de le remettre à 0&lt;br /&gt;
*en lecture :&lt;br /&gt;
**on obtient la valeur du chronomètre&lt;br /&gt;
**il conviendra de multiplier la valeur lue en i2c par 8 pour obtenir la durée en ms&lt;br /&gt;
&lt;br /&gt;
{{Eval|2|Ecrire un programme dans le master qui :}}&lt;br /&gt;
*lance le chrono&lt;br /&gt;
*attend 500ms&lt;br /&gt;
*arrête le chrono&lt;br /&gt;
*récupère la valeur du chrono&lt;br /&gt;
*affiche la valeur du chrono sur la liaison série (en ms)&lt;br /&gt;
*affiche la valeur du chrono sur le slave afficheur&lt;br /&gt;
*attend 5s avant de recommencer&lt;br /&gt;
&lt;br /&gt;
=Assemblons le tout=&lt;br /&gt;
&lt;br /&gt;
On réalise un jeu de réflexe : le joueur devra appuyer sur le bouton dès qu'il constate un changement sur le chenillard&lt;br /&gt;
&lt;br /&gt;
{{Eval|2|Ecrire un programme correspondant à l'algorithme suivant :}}&lt;br /&gt;
*attendre 1s&lt;br /&gt;
*démarrer le chenillard&lt;br /&gt;
*démarrer le chrono&lt;br /&gt;
*attendre appui sur le bouton&lt;br /&gt;
*arrêter le chrono&lt;br /&gt;
*arrêter le chenillard&lt;br /&gt;
*lire le chrono&lt;br /&gt;
*afficher la valeur du chrono sur l'afficheur&lt;br /&gt;
*attendre le relâchement du bouton&lt;br /&gt;
*attendre 5s&lt;/div&gt;</summary>
		<author><name>Bjacquot</name></author>	</entry>

	<entry>
		<id>http://wikigeii.iut-troyes.univ-reims.fr//index.php?title=Cours:InfoS2_EvaluationSimulIde&amp;diff=20915</id>
		<title>Cours:InfoS2 EvaluationSimulIde</title>
		<link rel="alternate" type="text/html" href="http://wikigeii.iut-troyes.univ-reims.fr//index.php?title=Cours:InfoS2_EvaluationSimulIde&amp;diff=20915"/>
				<updated>2026-04-01T13:51:53Z</updated>
		
		<summary type="html">&lt;p&gt;Bjacquot : /* Utilisation du chenillard */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;accesscontrol&amp;gt;Acces:Prof&amp;lt;/accesscontrol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{EnTeteTdInfoS2|InfoS2 tdI2cRegistres prof}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=Identification des cibles=&lt;br /&gt;
&lt;br /&gt;
 Fichiers pour simulide : [[Media:I2cSlaveEvaluation.zip|I2cSlaveEvaluation.zip]]&lt;br /&gt;
&lt;br /&gt;
 {{Rouge|**************************************************}}&lt;br /&gt;
 {{Rouge|***  Attention, programme dans un fichier .ino ***}}&lt;br /&gt;
 {{Rouge|**************************************************}}&lt;br /&gt;
 {{Rouge|***  choisir le µc Master en tant que MainMCU  ***}}&lt;br /&gt;
 {{Rouge|***          !!!! le point jaune !!!!          ***}}&lt;br /&gt;
 {{Rouge|**************************************************}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{Eval|1|Trouver l'adresse i2c du &amp;quot;slave afficheur&amp;quot;}}&lt;br /&gt;
&lt;br /&gt;
=Utilisation du chenillard=&lt;br /&gt;
&lt;br /&gt;
Le slave chenillard s'utilise de façon simple :&lt;br /&gt;
*on peut uniquement écrire des valeurs sur ce slave&lt;br /&gt;
*il n'y a pas de registres&lt;br /&gt;
*on enverra :&lt;br /&gt;
**la valeur 0 pour arrêter le chenillard&lt;br /&gt;
**la valeur 1 pour mettre en route le chenillard&lt;br /&gt;
&lt;br /&gt;
{{Eval|1|Ecrire un programme dans le master qui :}}&lt;br /&gt;
*met en marche le chenillard pendant 1s&lt;br /&gt;
*l'arrête pendant 2s&lt;br /&gt;
*recommence&lt;br /&gt;
&lt;br /&gt;
=Utilisation du bouton=&lt;br /&gt;
Le slave chenillard s'utilise de façon simple :&lt;br /&gt;
*on peut uniquement lire des valeurs sur ce slave&lt;br /&gt;
*on lira :&lt;br /&gt;
**la valeur 0 lorsque le bouton n'est pas appuyé&lt;br /&gt;
**la valeur 1 lorsque le bouton est appuyé&lt;br /&gt;
&lt;br /&gt;
{{Eval|2|Ecrire un programme dans le master qui :}}&lt;br /&gt;
*affiche la valeur du bouton sur la liaison série&lt;br /&gt;
*commande la mise en marche du chenillard avec le bouton&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=Utilisation de l'afficheur 7 segments=&lt;br /&gt;
Le slave afficheur s'utilise de façon simple :&lt;br /&gt;
*on peut uniquement écrire des valeurs sur ce slave&lt;br /&gt;
*il y a 4 registres :&lt;br /&gt;
**registre {{Rouge|0}} : change la valeur des unités&lt;br /&gt;
**registre {{Rouge|1}} : change la valeur des dizaines&lt;br /&gt;
**registre {{Rouge|2}} : change la valeur des centaines&lt;br /&gt;
**registre {{Rouge|3}} : change la valeur des milliers&lt;br /&gt;
&lt;br /&gt;
{{Eval|2|Ecrire un programme dans le master qui :}}&lt;br /&gt;
*affiche la valeur &amp;quot;1234&amp;quot; pendant 1s&lt;br /&gt;
*affiche la valeur &amp;quot;9876&amp;quot; pendant 2s&lt;br /&gt;
*recommence&lt;br /&gt;
&lt;br /&gt;
=Utilisation du chrono=&lt;br /&gt;
Le slave chrono s'utilise de la façon suivante :&lt;br /&gt;
*on peut écrire ou lire des valeurs sur ce slave&lt;br /&gt;
*en écriture :&lt;br /&gt;
**écrire la valeur 0 permet d'arrêter le chrono&lt;br /&gt;
**écrire la valeur 1 permet de mettre en route le chrono et de le remettre à 0&lt;br /&gt;
*en lecture :&lt;br /&gt;
**on obtient la valeur du chronomètre&lt;br /&gt;
**il conviendra de multiplier la valeur lue en i2c par 8 pour obtenir la durée en ms&lt;br /&gt;
&lt;br /&gt;
{{Eval|2|Ecrire un programme dans le master qui :}}&lt;br /&gt;
*lance le chrono&lt;br /&gt;
*attend 500ms&lt;br /&gt;
*arrête le chrono&lt;br /&gt;
*récupère la valeur du chrono&lt;br /&gt;
*affiche la valeur du chrono sur la liaison série (en ms)&lt;br /&gt;
*affiche la valeur du chrono sur le slave afficheur&lt;br /&gt;
*attend 5s avant de recommencer&lt;br /&gt;
&lt;br /&gt;
=Assemblons le tout=&lt;br /&gt;
&lt;br /&gt;
On réalise un jeu de réflexe : le joueur devra appuyer sur le bouton dès qu'il constate un changement sur le chenillard&lt;br /&gt;
&lt;br /&gt;
{{Eval|2|Ecrire un programme correspondant à l'algorithme suivant :}}&lt;br /&gt;
*attendre 1s&lt;br /&gt;
*démarrer le chenillard&lt;br /&gt;
*démarrer le chrono&lt;br /&gt;
*attendre appui sur le bouton&lt;br /&gt;
*arrêter le chrono&lt;br /&gt;
*arrêter le chenillard&lt;br /&gt;
*lire le chrono&lt;br /&gt;
*afficher la valeur du chrono sur l'afficheur&lt;br /&gt;
*attendre le relâchement du bouton&lt;br /&gt;
*attendre 5s&lt;/div&gt;</summary>
		<author><name>Bjacquot</name></author>	</entry>

	<entry>
		<id>http://wikigeii.iut-troyes.univ-reims.fr//index.php?title=Fichier:Micronucleus-cli-2.5-azd1-x86_64-linux-gnu.tar.bz2.zip&amp;diff=20914</id>
		<title>Fichier:Micronucleus-cli-2.5-azd1-x86 64-linux-gnu.tar.bz2.zip</title>
		<link rel="alternate" type="text/html" href="http://wikigeii.iut-troyes.univ-reims.fr//index.php?title=Fichier:Micronucleus-cli-2.5-azd1-x86_64-linux-gnu.tar.bz2.zip&amp;diff=20914"/>
				<updated>2026-04-01T08:51:09Z</updated>
		
		<summary type="html">&lt;p&gt;Bjacquot : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Bjacquot</name></author>	</entry>

	<entry>
		<id>http://wikigeii.iut-troyes.univ-reims.fr//index.php?title=Cours:Esp01&amp;diff=20913</id>
		<title>Cours:Esp01</title>
		<link rel="alternate" type="text/html" href="http://wikigeii.iut-troyes.univ-reims.fr//index.php?title=Cours:Esp01&amp;diff=20913"/>
				<updated>2026-03-31T06:36:55Z</updated>
		
		<summary type="html">&lt;p&gt;Bjacquot : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;source lang=cpp&amp;gt;&lt;br /&gt;
// SP-01&lt;br /&gt;
// connecter GPIO0 à la masse pour programmer&lt;br /&gt;
// GPIO0 en l'air pour démarrer !!&lt;br /&gt;
// connecter CH_PD au Vcc&lt;br /&gt;
&lt;br /&gt;
#include &amp;lt;ESP8266WiFi.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
const char* host = &amp;quot;esp01DataLog&amp;quot;;&lt;br /&gt;
const char* ssid = STASSID;&lt;br /&gt;
const char* password = STAPSK;&lt;br /&gt;
&lt;br /&gt;
WiFiServer server(8080); // Port TCP&lt;br /&gt;
&lt;br /&gt;
void setup(void) {&lt;br /&gt;
  Serial.begin(921600);&lt;br /&gt;
  Serial.println();&lt;br /&gt;
  Serial.println(&amp;quot;Booting Sketch...&amp;quot;);&lt;br /&gt;
  WiFi.mode(WIFI_STA);&lt;br /&gt;
  WiFi.begin(ssid, password);&lt;br /&gt;
  if (WiFi.waitForConnectResult() == WL_CONNECTED) {&lt;br /&gt;
    Serial.println(WiFi.localIP());&lt;br /&gt;
    server.begin();&lt;br /&gt;
  } else {&lt;br /&gt;
    Serial.println(&amp;quot;WiFi Failed&amp;quot;);&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void loop(void) {&lt;br /&gt;
  WiFiClient client = server.available();&lt;br /&gt;
  if (client) {&lt;br /&gt;
    while (client.connected()) {&lt;br /&gt;
      if (Serial.available()) {&lt;br /&gt;
        String data = Serial.readStringUntil('\n');&lt;br /&gt;
        data.trim(); // Supprime les espaces/retours chariot&lt;br /&gt;
        if (data.length() &amp;gt; 0) {&lt;br /&gt;
          client.print(data + &amp;quot;\n&amp;quot;);&lt;br /&gt;
          //Serial.println(&amp;quot;Envoyé: &amp;quot; + data); // Debug&lt;br /&gt;
        }&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
    client.stop();&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=wifi=&lt;br /&gt;
on utilisera le réseau wifi :&lt;br /&gt;
* ssid robotGeii&lt;br /&gt;
* pwd  robotGeiiTroyes&lt;/div&gt;</summary>
		<author><name>Bjacquot</name></author>	</entry>

	<entry>
		<id>http://wikigeii.iut-troyes.univ-reims.fr//index.php?title=Cours:SaeEvitementObstacles&amp;diff=20912</id>
		<title>Cours:SaeEvitementObstacles</title>
		<link rel="alternate" type="text/html" href="http://wikigeii.iut-troyes.univ-reims.fr//index.php?title=Cours:SaeEvitementObstacles&amp;diff=20912"/>
				<updated>2026-03-31T06:24:44Z</updated>
		
		<summary type="html">&lt;p&gt;Bjacquot : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
https://docs.google.com/spreadsheets/d/1GX3zPpdC4umtqc4B8hLjQZWTMNHfw7GfKqrpxW5ORzc/edit?usp=sharing&lt;br /&gt;
&lt;br /&gt;
https://www.festivalrobotiquecachan.fr/&lt;br /&gt;
&lt;br /&gt;
https://www.festivalrobotiquecachan.fr/wp-content/uploads/Reglement_rencontres_de_robotique_GEII_BUT-1-2-3.pdf&lt;br /&gt;
&lt;br /&gt;
=Découpage fonctionnel=&lt;br /&gt;
&lt;br /&gt;
[[Media:DecoupageFcts2026.pdf]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=Travail à réaliser=&lt;br /&gt;
&lt;br /&gt;
==1ère partie (2 semaines)==&lt;br /&gt;
*travail individuel&lt;br /&gt;
**travail à réaliser pour fin de la 2ème semaine&lt;br /&gt;
**évaluation à la fin de la 2ème semaine (schéma/routage)&lt;br /&gt;
**sélection de la meilleure carte pour fabrication&lt;br /&gt;
***finalisation des pcbs pour le {{Rouge|jeudi 3/04 matin}}&lt;br /&gt;
*cartes :&lt;br /&gt;
**balise émettrice&lt;br /&gt;
***choix de la fréquence&lt;br /&gt;
**balise de réglage&lt;br /&gt;
***à l'opposé du terrain&lt;br /&gt;
***permet de régler l'élévation de la balise émettrice&lt;br /&gt;
***affiche le niveau de puissance&lt;br /&gt;
**carte réceptrice IR (filtre)&lt;br /&gt;
**carte filtrage (se plug sur la carte réceptrice IR)&lt;br /&gt;
***on change de carte pour changer la fréquence&lt;br /&gt;
**carte µc&lt;br /&gt;
***connectique pour e/s&lt;br /&gt;
***driver moteurs&lt;br /&gt;
***fourni alim symétrique&lt;br /&gt;
**banc test pour la carte filtre&lt;br /&gt;
**banc test pour la carte réceptrice complète&lt;br /&gt;
&lt;br /&gt;
==2ème partie (xx jours)==&lt;br /&gt;
&lt;br /&gt;
*Travail individuel&lt;br /&gt;
*montage des cartes&lt;br /&gt;
*vérification du fonctionnement&lt;br /&gt;
*réalisation programme : fonction à réaliser selon cdc&lt;br /&gt;
&lt;br /&gt;
==3ème partie (xx jours)==&lt;br /&gt;
&lt;br /&gt;
*travail en binôme ?&lt;br /&gt;
*programmation d'un robot&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=Modalités d'évaluation=&lt;br /&gt;
&lt;br /&gt;
==1 soutenance==&lt;br /&gt;
*Vendredi 17/05 matin&lt;br /&gt;
**20 minutes de présentation&lt;br /&gt;
**10 minutes de questions&lt;br /&gt;
*Présentation(introduction) de chaque &amp;quot;partie&amp;quot; en anglais&lt;br /&gt;
&lt;br /&gt;
==1 dossier==&lt;br /&gt;
*Analyse fonctionnelle&lt;br /&gt;
*Nomenclature&lt;br /&gt;
*Chiffrage&lt;br /&gt;
*Etude détaillée de chaque fonction&lt;br /&gt;
*Schémas électriques/algorithmes/simulations/courbes caractéristiques/fonctions de transfert ...&lt;br /&gt;
&lt;br /&gt;
==Démonstration(s)==&lt;br /&gt;
&lt;br /&gt;
* Démonstration du fonctionnement le 12/05 à 12h&lt;br /&gt;
* Participation au festival de robotique à Cachan&lt;br /&gt;
&lt;br /&gt;
==Note de résultat - Evaluation travaux de SAE==&lt;br /&gt;
*Groupe : accomplissement du projet&lt;br /&gt;
*Individuelle : en fonction de &lt;br /&gt;
**Difficulté technique&lt;br /&gt;
**Quantité de travail&lt;br /&gt;
**Qualité de la réalisation&lt;br /&gt;
**Investissement : &amp;lt;big&amp;gt;évalué chaque jour&amp;lt;/big&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Réalisation d'une vidéo==&lt;br /&gt;
Vidéo à réaliser pour le concours EEA :&lt;br /&gt;
 https://clubeea.com/concours-mon-projet-en-5-minutes/&lt;br /&gt;
&lt;br /&gt;
=Fonctions=&lt;br /&gt;
[[Cours:SaeEvitementObstaclesFonctions]]&lt;br /&gt;
&lt;br /&gt;
=Pages indispensables du wiki=&lt;br /&gt;
&lt;br /&gt;
*[[Cours:Oscillogbf|Utilisation de python et Qt pour la réalisation d'un banc de test]]&lt;br /&gt;
*[[Cours:PiPico|Programmation de la carte pico rp2040]]&lt;br /&gt;
*[[Cours:Esp01|Utilisation d'un esp-01 pour faire de la supervision]]&lt;br /&gt;
&lt;br /&gt;
=Ressources informatique=&lt;br /&gt;
&lt;br /&gt;
*[[Cours:pixyUartArduino|Pixy]]&lt;br /&gt;
*https://www.waveshare.com/wiki/RPLIDAR_C1&lt;br /&gt;
&lt;br /&gt;
=Ressources=&lt;br /&gt;
&lt;br /&gt;
*https://www.eeweb.com/level-shifting-techniques-in-i2c-bus-design/&lt;br /&gt;
*https://github.com/drankinatty/pico-mpu9250&lt;br /&gt;
&lt;br /&gt;
*vérifier la &amp;quot;programmabilité&amp;quot; du µcontroleur :&lt;br /&gt;
**dans un terminal&lt;br /&gt;
**avrdude -c usbasp -p nomDuMicro&lt;br /&gt;
**ex : avrdude -c usbasp -p t2313&lt;br /&gt;
**ex : avrdude -c usbasp -p m328p&lt;br /&gt;
&lt;br /&gt;
*modification des fusibles pour choisir fréquence d'horloge:&lt;br /&gt;
**pour les atmega328p, dans le logiciel graver le bootloader&lt;br /&gt;
**pour les attiny (utiliser '''arduino v1''' !! ) :&lt;br /&gt;
***installer attinycore : https://github.com/SpenceKonde/ATTinyCore/blob/v2.0.0-devThis-is-the-head-submit-PRs-against-this/Installation.md&lt;br /&gt;
***choisir le bon microcontroleur et la bonne source d'horloge&lt;br /&gt;
***graver la séquence d'initialisation&lt;br /&gt;
**pour les atmega2560, attention il faut modifier les fusibles par rapport au bootloader arduino :&lt;br /&gt;
***dans un terminal&lt;br /&gt;
***avrdude -v -patmega2560 -cusbasp -e -Ulock:w:0x3F:m -Uefuse:w:0xFD:m -Uhfuse:w:0xD9:m -Ulfuse:w:0xFF:m&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*http://raphael.candelier.fr/?blog=XL_320&lt;/div&gt;</summary>
		<author><name>Bjacquot</name></author>	</entry>

	<entry>
		<id>http://wikigeii.iut-troyes.univ-reims.fr//index.php?title=Cours:SaeEvitementObstacles&amp;diff=20911</id>
		<title>Cours:SaeEvitementObstacles</title>
		<link rel="alternate" type="text/html" href="http://wikigeii.iut-troyes.univ-reims.fr//index.php?title=Cours:SaeEvitementObstacles&amp;diff=20911"/>
				<updated>2026-03-30T09:33:26Z</updated>
		
		<summary type="html">&lt;p&gt;Bjacquot : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
https://docs.google.com/spreadsheets/d/1GX3zPpdC4umtqc4B8hLjQZWTMNHfw7GfKqrpxW5ORzc/edit?usp=sharing&lt;br /&gt;
&lt;br /&gt;
https://www.festivalrobotiquecachan.fr/&lt;br /&gt;
&lt;br /&gt;
https://www.festivalrobotiquecachan.fr/wp-content/uploads/Reglement_rencontres_de_robotique_GEII_BUT-1-2-3.pdf&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=Travail à réaliser=&lt;br /&gt;
&lt;br /&gt;
==1ère partie (2 semaines)==&lt;br /&gt;
*travail individuel&lt;br /&gt;
**travail à réaliser pour fin de la 2ème semaine&lt;br /&gt;
**évaluation à la fin de la 2ème semaine (schéma/routage)&lt;br /&gt;
**sélection de la meilleure carte pour fabrication&lt;br /&gt;
***finalisation des pcbs pour le {{Rouge|jeudi 3/04 matin}}&lt;br /&gt;
*cartes :&lt;br /&gt;
**balise émettrice&lt;br /&gt;
***choix de la fréquence&lt;br /&gt;
**balise de réglage&lt;br /&gt;
***à l'opposé du terrain&lt;br /&gt;
***permet de régler l'élévation de la balise émettrice&lt;br /&gt;
***affiche le niveau de puissance&lt;br /&gt;
**carte réceptrice IR (filtre)&lt;br /&gt;
**carte filtrage (se plug sur la carte réceptrice IR)&lt;br /&gt;
***on change de carte pour changer la fréquence&lt;br /&gt;
**carte µc&lt;br /&gt;
***connectique pour e/s&lt;br /&gt;
***driver moteurs&lt;br /&gt;
***fourni alim symétrique&lt;br /&gt;
**banc test pour la carte filtre&lt;br /&gt;
**banc test pour la carte réceptrice complète&lt;br /&gt;
&lt;br /&gt;
==2ème partie (xx jours)==&lt;br /&gt;
&lt;br /&gt;
*Travail individuel&lt;br /&gt;
*montage des cartes&lt;br /&gt;
*vérification du fonctionnement&lt;br /&gt;
*réalisation programme : fonction à réaliser selon cdc&lt;br /&gt;
&lt;br /&gt;
==3ème partie (xx jours)==&lt;br /&gt;
&lt;br /&gt;
*travail en binôme ?&lt;br /&gt;
*programmation d'un robot&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=Modalités d'évaluation=&lt;br /&gt;
&lt;br /&gt;
==1 soutenance==&lt;br /&gt;
*Vendredi 17/05 matin&lt;br /&gt;
**20 minutes de présentation&lt;br /&gt;
**10 minutes de questions&lt;br /&gt;
*Présentation(introduction) de chaque &amp;quot;partie&amp;quot; en anglais&lt;br /&gt;
&lt;br /&gt;
==1 dossier==&lt;br /&gt;
*Analyse fonctionnelle&lt;br /&gt;
*Nomenclature&lt;br /&gt;
*Chiffrage&lt;br /&gt;
*Etude détaillée de chaque fonction&lt;br /&gt;
*Schémas électriques/algorithmes/simulations/courbes caractéristiques/fonctions de transfert ...&lt;br /&gt;
&lt;br /&gt;
==Démonstration(s)==&lt;br /&gt;
&lt;br /&gt;
* Démonstration du fonctionnement le 12/05 à 12h&lt;br /&gt;
* Participation au festival de robotique à Cachan&lt;br /&gt;
&lt;br /&gt;
==Note de résultat - Evaluation travaux de SAE==&lt;br /&gt;
*Groupe : accomplissement du projet&lt;br /&gt;
*Individuelle : en fonction de &lt;br /&gt;
**Difficulté technique&lt;br /&gt;
**Quantité de travail&lt;br /&gt;
**Qualité de la réalisation&lt;br /&gt;
**Investissement : &amp;lt;big&amp;gt;évalué chaque jour&amp;lt;/big&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Réalisation d'une vidéo==&lt;br /&gt;
Vidéo à réaliser pour le concours EEA :&lt;br /&gt;
 https://clubeea.com/concours-mon-projet-en-5-minutes/&lt;br /&gt;
&lt;br /&gt;
=Fonctions=&lt;br /&gt;
[[Cours:SaeEvitementObstaclesFonctions]]&lt;br /&gt;
&lt;br /&gt;
=Pages indispensables du wiki=&lt;br /&gt;
&lt;br /&gt;
*[[Cours:Oscillogbf|Utilisation de python et Qt pour la réalisation d'un banc de test]]&lt;br /&gt;
*[[Cours:PiPico|Programmation de la carte pico rp2040]]&lt;br /&gt;
*[[Cours:Esp01|Utilisation d'un esp-01 pour faire de la supervision]]&lt;br /&gt;
&lt;br /&gt;
=Ressources informatique=&lt;br /&gt;
&lt;br /&gt;
*[[Cours:pixyUartArduino|Pixy]]&lt;br /&gt;
*https://www.waveshare.com/wiki/RPLIDAR_C1&lt;br /&gt;
&lt;br /&gt;
=Ressources=&lt;br /&gt;
&lt;br /&gt;
*https://www.eeweb.com/level-shifting-techniques-in-i2c-bus-design/&lt;br /&gt;
*https://github.com/drankinatty/pico-mpu9250&lt;br /&gt;
&lt;br /&gt;
*vérifier la &amp;quot;programmabilité&amp;quot; du µcontroleur :&lt;br /&gt;
**dans un terminal&lt;br /&gt;
**avrdude -c usbasp -p nomDuMicro&lt;br /&gt;
**ex : avrdude -c usbasp -p t2313&lt;br /&gt;
**ex : avrdude -c usbasp -p m328p&lt;br /&gt;
&lt;br /&gt;
*modification des fusibles pour choisir fréquence d'horloge:&lt;br /&gt;
**pour les atmega328p, dans le logiciel graver le bootloader&lt;br /&gt;
**pour les attiny (utiliser '''arduino v1''' !! ) :&lt;br /&gt;
***installer attinycore : https://github.com/SpenceKonde/ATTinyCore/blob/v2.0.0-devThis-is-the-head-submit-PRs-against-this/Installation.md&lt;br /&gt;
***choisir le bon microcontroleur et la bonne source d'horloge&lt;br /&gt;
***graver la séquence d'initialisation&lt;br /&gt;
**pour les atmega2560, attention il faut modifier les fusibles par rapport au bootloader arduino :&lt;br /&gt;
***dans un terminal&lt;br /&gt;
***avrdude -v -patmega2560 -cusbasp -e -Ulock:w:0x3F:m -Uefuse:w:0xFD:m -Uhfuse:w:0xD9:m -Ulfuse:w:0xFF:m&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*http://raphael.candelier.fr/?blog=XL_320&lt;/div&gt;</summary>
		<author><name>Bjacquot</name></author>	</entry>

	<entry>
		<id>http://wikigeii.iut-troyes.univ-reims.fr//index.php?title=Fichier:DecoupageFcts2026.pdf&amp;diff=20910</id>
		<title>Fichier:DecoupageFcts2026.pdf</title>
		<link rel="alternate" type="text/html" href="http://wikigeii.iut-troyes.univ-reims.fr//index.php?title=Fichier:DecoupageFcts2026.pdf&amp;diff=20910"/>
				<updated>2026-03-30T07:17:56Z</updated>
		
		<summary type="html">&lt;p&gt;Bjacquot : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Bjacquot</name></author>	</entry>

	<entry>
		<id>http://wikigeii.iut-troyes.univ-reims.fr//index.php?title=Cours:SaeEvitementObstacles&amp;diff=20909</id>
		<title>Cours:SaeEvitementObstacles</title>
		<link rel="alternate" type="text/html" href="http://wikigeii.iut-troyes.univ-reims.fr//index.php?title=Cours:SaeEvitementObstacles&amp;diff=20909"/>
				<updated>2026-03-30T06:37:08Z</updated>
		
		<summary type="html">&lt;p&gt;Bjacquot : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
&lt;br /&gt;
https://www.festivalrobotiquecachan.fr/&lt;br /&gt;
&lt;br /&gt;
https://www.festivalrobotiquecachan.fr/wp-content/uploads/Reglement_rencontres_de_robotique_GEII_BUT-1-2-3.pdf&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=Travail à réaliser=&lt;br /&gt;
&lt;br /&gt;
==1ère partie (2 semaines)==&lt;br /&gt;
*travail individuel&lt;br /&gt;
**travail à réaliser pour fin de la 2ème semaine&lt;br /&gt;
**évaluation à la fin de la 2ème semaine (schéma/routage)&lt;br /&gt;
**sélection de la meilleure carte pour fabrication&lt;br /&gt;
***finalisation des pcbs pour le {{Rouge|jeudi 3/04 matin}}&lt;br /&gt;
*cartes :&lt;br /&gt;
**balise émettrice&lt;br /&gt;
***choix de la fréquence&lt;br /&gt;
**balise de réglage&lt;br /&gt;
***à l'opposé du terrain&lt;br /&gt;
***permet de régler l'élévation de la balise émettrice&lt;br /&gt;
***affiche le niveau de puissance&lt;br /&gt;
**carte réceptrice IR (filtre)&lt;br /&gt;
**carte filtrage (se plug sur la carte réceptrice IR)&lt;br /&gt;
***on change de carte pour changer la fréquence&lt;br /&gt;
**carte µc&lt;br /&gt;
***connectique pour e/s&lt;br /&gt;
***driver moteurs&lt;br /&gt;
***fourni alim symétrique&lt;br /&gt;
**banc test pour la carte filtre&lt;br /&gt;
**banc test pour la carte réceptrice complète&lt;br /&gt;
&lt;br /&gt;
==2ème partie (xx jours)==&lt;br /&gt;
&lt;br /&gt;
*Travail individuel&lt;br /&gt;
*montage des cartes&lt;br /&gt;
*vérification du fonctionnement&lt;br /&gt;
*réalisation programme : fonction à réaliser selon cdc&lt;br /&gt;
&lt;br /&gt;
==3ème partie (xx jours)==&lt;br /&gt;
&lt;br /&gt;
*travail en binôme ?&lt;br /&gt;
*programmation d'un robot&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=Modalités d'évaluation=&lt;br /&gt;
&lt;br /&gt;
==1 soutenance==&lt;br /&gt;
*Vendredi 17/05 matin&lt;br /&gt;
**20 minutes de présentation&lt;br /&gt;
**10 minutes de questions&lt;br /&gt;
*Présentation(introduction) de chaque &amp;quot;partie&amp;quot; en anglais&lt;br /&gt;
&lt;br /&gt;
==1 dossier==&lt;br /&gt;
*Analyse fonctionnelle&lt;br /&gt;
*Nomenclature&lt;br /&gt;
*Chiffrage&lt;br /&gt;
*Etude détaillée de chaque fonction&lt;br /&gt;
*Schémas électriques/algorithmes/simulations/courbes caractéristiques/fonctions de transfert ...&lt;br /&gt;
&lt;br /&gt;
==Démonstration(s)==&lt;br /&gt;
&lt;br /&gt;
* Démonstration du fonctionnement le 12/05 à 12h&lt;br /&gt;
* Participation au festival de robotique à Cachan&lt;br /&gt;
&lt;br /&gt;
==Note de résultat - Evaluation travaux de SAE==&lt;br /&gt;
*Groupe : accomplissement du projet&lt;br /&gt;
*Individuelle : en fonction de &lt;br /&gt;
**Difficulté technique&lt;br /&gt;
**Quantité de travail&lt;br /&gt;
**Qualité de la réalisation&lt;br /&gt;
**Investissement : &amp;lt;big&amp;gt;évalué chaque jour&amp;lt;/big&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Réalisation d'une vidéo==&lt;br /&gt;
Vidéo à réaliser pour le concours EEA :&lt;br /&gt;
 https://clubeea.com/concours-mon-projet-en-5-minutes/&lt;br /&gt;
&lt;br /&gt;
=Fonctions=&lt;br /&gt;
[[Cours:SaeEvitementObstaclesFonctions]]&lt;br /&gt;
&lt;br /&gt;
=Pages indispensables du wiki=&lt;br /&gt;
&lt;br /&gt;
*[[Cours:Oscillogbf|Utilisation de python et Qt pour la réalisation d'un banc de test]]&lt;br /&gt;
*[[Cours:PiPico|Programmation de la carte pico rp2040]]&lt;br /&gt;
*[[Cours:Esp01|Utilisation d'un esp-01 pour faire de la supervision]]&lt;br /&gt;
&lt;br /&gt;
=Ressources informatique=&lt;br /&gt;
&lt;br /&gt;
*[[Cours:pixyUartArduino|Pixy]]&lt;br /&gt;
*https://www.waveshare.com/wiki/RPLIDAR_C1&lt;br /&gt;
&lt;br /&gt;
=Ressources=&lt;br /&gt;
&lt;br /&gt;
*https://www.eeweb.com/level-shifting-techniques-in-i2c-bus-design/&lt;br /&gt;
*https://github.com/drankinatty/pico-mpu9250&lt;br /&gt;
&lt;br /&gt;
*vérifier la &amp;quot;programmabilité&amp;quot; du µcontroleur :&lt;br /&gt;
**dans un terminal&lt;br /&gt;
**avrdude -c usbasp -p nomDuMicro&lt;br /&gt;
**ex : avrdude -c usbasp -p t2313&lt;br /&gt;
**ex : avrdude -c usbasp -p m328p&lt;br /&gt;
&lt;br /&gt;
*modification des fusibles pour choisir fréquence d'horloge:&lt;br /&gt;
**pour les atmega328p, dans le logiciel graver le bootloader&lt;br /&gt;
**pour les attiny (utiliser '''arduino v1''' !! ) :&lt;br /&gt;
***installer attinycore : https://github.com/SpenceKonde/ATTinyCore/blob/v2.0.0-devThis-is-the-head-submit-PRs-against-this/Installation.md&lt;br /&gt;
***choisir le bon microcontroleur et la bonne source d'horloge&lt;br /&gt;
***graver la séquence d'initialisation&lt;br /&gt;
**pour les atmega2560, attention il faut modifier les fusibles par rapport au bootloader arduino :&lt;br /&gt;
***dans un terminal&lt;br /&gt;
***avrdude -v -patmega2560 -cusbasp -e -Ulock:w:0x3F:m -Uefuse:w:0xFD:m -Uhfuse:w:0xD9:m -Ulfuse:w:0xFF:m&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*http://raphael.candelier.fr/?blog=XL_320&lt;/div&gt;</summary>
		<author><name>Bjacquot</name></author>	</entry>

	<entry>
		<id>http://wikigeii.iut-troyes.univ-reims.fr//index.php?title=Cours:SaeEvitementObstacles&amp;diff=20908</id>
		<title>Cours:SaeEvitementObstacles</title>
		<link rel="alternate" type="text/html" href="http://wikigeii.iut-troyes.univ-reims.fr//index.php?title=Cours:SaeEvitementObstacles&amp;diff=20908"/>
				<updated>2026-03-30T06:36:54Z</updated>
		
		<summary type="html">&lt;p&gt;Bjacquot : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;---&lt;br /&gt;
https://docs.google.com/spreadsheets/d/1GX3zPpdC4umtqc4B8hLjQZWTMNHfw7GfKqrpxW5ORzc/edit?usp=sharing&lt;br /&gt;
&lt;br /&gt;
https://docs.google.com/drawings/d/1Sx1-TMEwxtu88lV1r9OLJn0NRbNuhe1B5LcxISXYEUo/edit?usp=sharing&lt;br /&gt;
&lt;br /&gt;
support de présentation : https://docs.google.com/presentation/d/1XX2BhkMtSTAADme2EaAWc-SifegQYEkAcy0RMHZ_woQ/edit?usp=sharing&lt;br /&gt;
&lt;br /&gt;
fonctions informatiques : https://docs.google.com/document/d/1RmPY8mEmqChhHdfy2rKRFLjAjVSy4ZVAEw0Gml7Y8ZE/edit?tab=t.0&lt;br /&gt;
&lt;br /&gt;
---&amp;gt;&lt;br /&gt;
&lt;br /&gt;
https://www.festivalrobotiquecachan.fr/&lt;br /&gt;
&lt;br /&gt;
https://www.festivalrobotiquecachan.fr/wp-content/uploads/Reglement_rencontres_de_robotique_GEII_BUT-1-2-3.pdf&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=Travail à réaliser=&lt;br /&gt;
&lt;br /&gt;
==1ère partie (2 semaines)==&lt;br /&gt;
*travail individuel&lt;br /&gt;
**travail à réaliser pour fin de la 2ème semaine&lt;br /&gt;
**évaluation à la fin de la 2ème semaine (schéma/routage)&lt;br /&gt;
**sélection de la meilleure carte pour fabrication&lt;br /&gt;
***finalisation des pcbs pour le {{Rouge|jeudi 3/04 matin}}&lt;br /&gt;
*cartes :&lt;br /&gt;
**balise émettrice&lt;br /&gt;
***choix de la fréquence&lt;br /&gt;
**balise de réglage&lt;br /&gt;
***à l'opposé du terrain&lt;br /&gt;
***permet de régler l'élévation de la balise émettrice&lt;br /&gt;
***affiche le niveau de puissance&lt;br /&gt;
**carte réceptrice IR (filtre)&lt;br /&gt;
**carte filtrage (se plug sur la carte réceptrice IR)&lt;br /&gt;
***on change de carte pour changer la fréquence&lt;br /&gt;
**carte µc&lt;br /&gt;
***connectique pour e/s&lt;br /&gt;
***driver moteurs&lt;br /&gt;
***fourni alim symétrique&lt;br /&gt;
**banc test pour la carte filtre&lt;br /&gt;
**banc test pour la carte réceptrice complète&lt;br /&gt;
&lt;br /&gt;
==2ème partie (xx jours)==&lt;br /&gt;
&lt;br /&gt;
*Travail individuel&lt;br /&gt;
*montage des cartes&lt;br /&gt;
*vérification du fonctionnement&lt;br /&gt;
*réalisation programme : fonction à réaliser selon cdc&lt;br /&gt;
&lt;br /&gt;
==3ème partie (xx jours)==&lt;br /&gt;
&lt;br /&gt;
*travail en binôme ?&lt;br /&gt;
*programmation d'un robot&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=Modalités d'évaluation=&lt;br /&gt;
&lt;br /&gt;
==1 soutenance==&lt;br /&gt;
*Vendredi 17/05 matin&lt;br /&gt;
**20 minutes de présentation&lt;br /&gt;
**10 minutes de questions&lt;br /&gt;
*Présentation(introduction) de chaque &amp;quot;partie&amp;quot; en anglais&lt;br /&gt;
&lt;br /&gt;
==1 dossier==&lt;br /&gt;
*Analyse fonctionnelle&lt;br /&gt;
*Nomenclature&lt;br /&gt;
*Chiffrage&lt;br /&gt;
*Etude détaillée de chaque fonction&lt;br /&gt;
*Schémas électriques/algorithmes/simulations/courbes caractéristiques/fonctions de transfert ...&lt;br /&gt;
&lt;br /&gt;
==Démonstration(s)==&lt;br /&gt;
&lt;br /&gt;
* Démonstration du fonctionnement le 12/05 à 12h&lt;br /&gt;
* Participation au festival de robotique à Cachan&lt;br /&gt;
&lt;br /&gt;
==Note de résultat - Evaluation travaux de SAE==&lt;br /&gt;
*Groupe : accomplissement du projet&lt;br /&gt;
*Individuelle : en fonction de &lt;br /&gt;
**Difficulté technique&lt;br /&gt;
**Quantité de travail&lt;br /&gt;
**Qualité de la réalisation&lt;br /&gt;
**Investissement : &amp;lt;big&amp;gt;évalué chaque jour&amp;lt;/big&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Réalisation d'une vidéo==&lt;br /&gt;
Vidéo à réaliser pour le concours EEA :&lt;br /&gt;
 https://clubeea.com/concours-mon-projet-en-5-minutes/&lt;br /&gt;
&lt;br /&gt;
=Fonctions=&lt;br /&gt;
[[Cours:SaeEvitementObstaclesFonctions]]&lt;br /&gt;
&lt;br /&gt;
=Pages indispensables du wiki=&lt;br /&gt;
&lt;br /&gt;
*[[Cours:Oscillogbf|Utilisation de python et Qt pour la réalisation d'un banc de test]]&lt;br /&gt;
*[[Cours:PiPico|Programmation de la carte pico rp2040]]&lt;br /&gt;
*[[Cours:Esp01|Utilisation d'un esp-01 pour faire de la supervision]]&lt;br /&gt;
&lt;br /&gt;
=Ressources informatique=&lt;br /&gt;
&lt;br /&gt;
*[[Cours:pixyUartArduino|Pixy]]&lt;br /&gt;
*https://www.waveshare.com/wiki/RPLIDAR_C1&lt;br /&gt;
&lt;br /&gt;
=Ressources=&lt;br /&gt;
&lt;br /&gt;
*https://www.eeweb.com/level-shifting-techniques-in-i2c-bus-design/&lt;br /&gt;
*https://github.com/drankinatty/pico-mpu9250&lt;br /&gt;
&lt;br /&gt;
*vérifier la &amp;quot;programmabilité&amp;quot; du µcontroleur :&lt;br /&gt;
**dans un terminal&lt;br /&gt;
**avrdude -c usbasp -p nomDuMicro&lt;br /&gt;
**ex : avrdude -c usbasp -p t2313&lt;br /&gt;
**ex : avrdude -c usbasp -p m328p&lt;br /&gt;
&lt;br /&gt;
*modification des fusibles pour choisir fréquence d'horloge:&lt;br /&gt;
**pour les atmega328p, dans le logiciel graver le bootloader&lt;br /&gt;
**pour les attiny (utiliser '''arduino v1''' !! ) :&lt;br /&gt;
***installer attinycore : https://github.com/SpenceKonde/ATTinyCore/blob/v2.0.0-devThis-is-the-head-submit-PRs-against-this/Installation.md&lt;br /&gt;
***choisir le bon microcontroleur et la bonne source d'horloge&lt;br /&gt;
***graver la séquence d'initialisation&lt;br /&gt;
**pour les atmega2560, attention il faut modifier les fusibles par rapport au bootloader arduino :&lt;br /&gt;
***dans un terminal&lt;br /&gt;
***avrdude -v -patmega2560 -cusbasp -e -Ulock:w:0x3F:m -Uefuse:w:0xFD:m -Uhfuse:w:0xD9:m -Ulfuse:w:0xFF:m&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*http://raphael.candelier.fr/?blog=XL_320&lt;/div&gt;</summary>
		<author><name>Bjacquot</name></author>	</entry>

	<entry>
		<id>http://wikigeii.iut-troyes.univ-reims.fr//index.php?title=Cours:InfoS2_tdI2cRegistres&amp;diff=20907</id>
		<title>Cours:InfoS2 tdI2cRegistres</title>
		<link rel="alternate" type="text/html" href="http://wikigeii.iut-troyes.univ-reims.fr//index.php?title=Cours:InfoS2_tdI2cRegistres&amp;diff=20907"/>
				<updated>2026-03-25T07:58:22Z</updated>
		
		<summary type="html">&lt;p&gt;Bjacquot : /* Lire un registre i2c */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{EnTeteTdInfoS2|InfoS2 tdI2cRegistres prof}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 Fichiers pour simulide : [[Media:I2cTd2.zip|I2cTd2.zip]]&lt;br /&gt;
&lt;br /&gt;
 {{Bleu|**************************************************}}&lt;br /&gt;
 {{Bleu|***  Attention, programme dans un fichier .ino ***}}&lt;br /&gt;
 {{Bleu|**************************************************}}&lt;br /&gt;
&lt;br /&gt;
 {{Rouge|**************************************************}}&lt;br /&gt;
 {{Rouge|*** !!!  Relier la broche Ar à la broche A+ !! ***}}&lt;br /&gt;
 {{Rouge|**************************************************}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=vérification des @i2c=&lt;br /&gt;
&lt;br /&gt;
{{Todo|Pensez à utiliser un programme pour lister les adresses des targets i2c, cf td précédent !}}&lt;br /&gt;
&lt;br /&gt;
=Registres=&lt;br /&gt;
&lt;br /&gt;
Les targets i2c {{Rouge|ne sont pas}} des composants programmables. Par contre, il convient de pouvoir les {{Rouge|configurer}}.&lt;br /&gt;
&lt;br /&gt;
Le principe retenu pour la plupart des targets est d'utiliser la notion de {{Rouge|registres}}.&lt;br /&gt;
*1 registre est une {{Rouge|mémoire}} sur la cible&lt;br /&gt;
*1 registre est associé à {{Rouge|une adresse}}&lt;br /&gt;
*chaque registre {{Rouge|modifie/observe}} le fonctionnement de la target&lt;br /&gt;
*1 registre à {{Rouge|un rôle spécifique}}&lt;br /&gt;
*pour {{Rouge|utiliser}} le composant, il faut indiquer {{Rouge|l'adresse}} du registre, que l'on souhaite {{Rouge|lire ou écrire}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[fichier:I2c_modele.png|600px]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Une {{Rouge|transmission}} i2c devient alors une {{Rouge|trame}} selon le principe simplifié suivant :&lt;br /&gt;
*bit de start&lt;br /&gt;
*@ de la target (7 bits)&lt;br /&gt;
*bit de lecture/écriture&lt;br /&gt;
*{{Rouge|attente de l'acknowledge}} (accusé de bonne réception) de la cible&lt;br /&gt;
*choix d'un registre (8 bits)&lt;br /&gt;
*acknowledge&lt;br /&gt;
*envoi/réception de la valeur (8 bits)&lt;br /&gt;
*acknowledge&lt;br /&gt;
*bit de stop&lt;br /&gt;
&lt;br /&gt;
=Ecrire dans un registre i2c=&lt;br /&gt;
&lt;br /&gt;
Voici un programme d'exemple pour modifier la valeur d'un registre :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=cpp&amp;gt;&lt;br /&gt;
#include &amp;lt;Wire.h&amp;gt;&lt;br /&gt;
const uint8_t targetAdress=0x04;&lt;br /&gt;
uint8_t regAd=7;&lt;br /&gt;
uint8_t value=0b10101010;&lt;br /&gt;
&lt;br /&gt;
int main()&lt;br /&gt;
{&lt;br /&gt;
	Wire.begin();        // join i2c bus (address optional for master)&lt;br /&gt;
	Serial.begin(9600);&lt;br /&gt;
	sei();&lt;br /&gt;
	while(1)&lt;br /&gt;
	{&lt;br /&gt;
	    Wire.beginTransmission(targetAdress); // start transmitting&lt;br /&gt;
	    Wire.write(regAd);                    // sends @ registre&lt;br /&gt;
	    Wire.write(value);                    // sends value registre&lt;br /&gt;
	    Wire.endTransmission();               // stop transmitting&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Nous considérons ici la cible avec les leds.&lt;br /&gt;
&lt;br /&gt;
Cette target i2c possède 6 registres d'adresses 0 à 5.&lt;br /&gt;
&lt;br /&gt;
Chaque registre est une valeur [0 255], qui modifie l'intensité lumineuse d'une led.&lt;br /&gt;
&lt;br /&gt;
{{Question|Ecrire un programme permettant de faire varier l'intensité lumineuse d'une, puis de plusieurs, leds}}&lt;br /&gt;
&lt;br /&gt;
{Question|Ecrire une fonction qui permet de modifier la valeur d'un registre d'une cible en respectant la signature suivante: }}&lt;br /&gt;
 void writeI2cReg(uint8_t targetAddress, uint8_t regAddress, uint8_t regValue)&lt;br /&gt;
&lt;br /&gt;
=Lire un registre i2c=&lt;br /&gt;
&lt;br /&gt;
Voici un programme d'exemple pour lire la valeur d'un registre :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=cpp&amp;gt;&lt;br /&gt;
#include &amp;lt;Wire.h&amp;gt;&lt;br /&gt;
const uint8_t targetAdress=0x04;&lt;br /&gt;
uint8_t regAd=5;&lt;br /&gt;
uint8_t value=60;&lt;br /&gt;
&lt;br /&gt;
int main()&lt;br /&gt;
{&lt;br /&gt;
	Wire.begin();                             // join i2c bus (address optional for master)&lt;br /&gt;
	Serial.begin(9600);&lt;br /&gt;
	sei();&lt;br /&gt;
	while(1)&lt;br /&gt;
	{&lt;br /&gt;
		Wire.beginTransmission(targetAdress); // start transmitting&lt;br /&gt;
		Wire.write(regAd);                    // sends @ registre&lt;br /&gt;
		Wire.endTransmission();               // stop transmitting&lt;br /&gt;
		Wire.requestFrom(targetAdress, (uint8_t) 1);&lt;br /&gt;
		value = Wire.read();&lt;br /&gt;
		Serial.println(value);&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Nous considérons ici la cible avec les potentiomètres.&lt;br /&gt;
&lt;br /&gt;
Cette target i2c possède 4 registres d'adresses 0 à 3.&lt;br /&gt;
&lt;br /&gt;
Chaque registre est une valeur [0 255], qui varie en fonction de la position du potentiomètre.&lt;br /&gt;
&lt;br /&gt;
{{Question|Ecrire un programme permettant de lire les valeurs des potentiomètres}}&lt;br /&gt;
&lt;br /&gt;
{{Question|Ecrire une fonction qui permet de modifier la valeur d'un registre d'une cible en respectant la signature suivante: }}&lt;br /&gt;
 uint8_t readI2cReg(uint8_t targetAddress, uint8_t regAddress)&lt;br /&gt;
&lt;br /&gt;
=Association=&lt;br /&gt;
&lt;br /&gt;
{{Question|Faire en sorte que chaque potentiomètre modifie l'intensité lumineuse d'une led différente}}&lt;/div&gt;</summary>
		<author><name>Bjacquot</name></author>	</entry>

	<entry>
		<id>http://wikigeii.iut-troyes.univ-reims.fr//index.php?title=Cours:InfoS2_tdI2cRegistres&amp;diff=20906</id>
		<title>Cours:InfoS2 tdI2cRegistres</title>
		<link rel="alternate" type="text/html" href="http://wikigeii.iut-troyes.univ-reims.fr//index.php?title=Cours:InfoS2_tdI2cRegistres&amp;diff=20906"/>
				<updated>2026-03-24T22:19:19Z</updated>
		
		<summary type="html">&lt;p&gt;Bjacquot : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{EnTeteTdInfoS2|InfoS2 tdI2cRegistres prof}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 Fichiers pour simulide : [[Media:I2cTd2.zip|I2cTd2.zip]]&lt;br /&gt;
&lt;br /&gt;
 {{Bleu|**************************************************}}&lt;br /&gt;
 {{Bleu|***  Attention, programme dans un fichier .ino ***}}&lt;br /&gt;
 {{Bleu|**************************************************}}&lt;br /&gt;
&lt;br /&gt;
 {{Rouge|**************************************************}}&lt;br /&gt;
 {{Rouge|*** !!!  Relier la broche Ar à la broche A+ !! ***}}&lt;br /&gt;
 {{Rouge|**************************************************}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=vérification des @i2c=&lt;br /&gt;
&lt;br /&gt;
{{Todo|Pensez à utiliser un programme pour lister les adresses des targets i2c, cf td précédent !}}&lt;br /&gt;
&lt;br /&gt;
=Registres=&lt;br /&gt;
&lt;br /&gt;
Les targets i2c {{Rouge|ne sont pas}} des composants programmables. Par contre, il convient de pouvoir les {{Rouge|configurer}}.&lt;br /&gt;
&lt;br /&gt;
Le principe retenu pour la plupart des targets est d'utiliser la notion de {{Rouge|registres}}.&lt;br /&gt;
*1 registre est une {{Rouge|mémoire}} sur la cible&lt;br /&gt;
*1 registre est associé à {{Rouge|une adresse}}&lt;br /&gt;
*chaque registre {{Rouge|modifie/observe}} le fonctionnement de la target&lt;br /&gt;
*1 registre à {{Rouge|un rôle spécifique}}&lt;br /&gt;
*pour {{Rouge|utiliser}} le composant, il faut indiquer {{Rouge|l'adresse}} du registre, que l'on souhaite {{Rouge|lire ou écrire}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[fichier:I2c_modele.png|600px]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Une {{Rouge|transmission}} i2c devient alors une {{Rouge|trame}} selon le principe simplifié suivant :&lt;br /&gt;
*bit de start&lt;br /&gt;
*@ de la target (7 bits)&lt;br /&gt;
*bit de lecture/écriture&lt;br /&gt;
*{{Rouge|attente de l'acknowledge}} (accusé de bonne réception) de la cible&lt;br /&gt;
*choix d'un registre (8 bits)&lt;br /&gt;
*acknowledge&lt;br /&gt;
*envoi/réception de la valeur (8 bits)&lt;br /&gt;
*acknowledge&lt;br /&gt;
*bit de stop&lt;br /&gt;
&lt;br /&gt;
=Ecrire dans un registre i2c=&lt;br /&gt;
&lt;br /&gt;
Voici un programme d'exemple pour modifier la valeur d'un registre :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=cpp&amp;gt;&lt;br /&gt;
#include &amp;lt;Wire.h&amp;gt;&lt;br /&gt;
const uint8_t targetAdress=0x04;&lt;br /&gt;
uint8_t regAd=7;&lt;br /&gt;
uint8_t value=0b10101010;&lt;br /&gt;
&lt;br /&gt;
int main()&lt;br /&gt;
{&lt;br /&gt;
	Wire.begin();        // join i2c bus (address optional for master)&lt;br /&gt;
	Serial.begin(9600);&lt;br /&gt;
	sei();&lt;br /&gt;
	while(1)&lt;br /&gt;
	{&lt;br /&gt;
	    Wire.beginTransmission(targetAdress); // start transmitting&lt;br /&gt;
	    Wire.write(regAd);                    // sends @ registre&lt;br /&gt;
	    Wire.write(value);                    // sends value registre&lt;br /&gt;
	    Wire.endTransmission();               // stop transmitting&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Nous considérons ici la cible avec les leds.&lt;br /&gt;
&lt;br /&gt;
Cette target i2c possède 6 registres d'adresses 0 à 5.&lt;br /&gt;
&lt;br /&gt;
Chaque registre est une valeur [0 255], qui modifie l'intensité lumineuse d'une led.&lt;br /&gt;
&lt;br /&gt;
{{Question|Ecrire un programme permettant de faire varier l'intensité lumineuse d'une, puis de plusieurs, leds}}&lt;br /&gt;
&lt;br /&gt;
{Question|Ecrire une fonction qui permet de modifier la valeur d'un registre d'une cible en respectant la signature suivante: }}&lt;br /&gt;
 void writeI2cReg(uint8_t targetAddress, uint8_t regAddress, uint8_t regValue)&lt;br /&gt;
&lt;br /&gt;
=Lire un registre i2c=&lt;br /&gt;
&lt;br /&gt;
Voici un programme d'exemple pour lire la valeur d'un registre :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=cpp&amp;gt;&lt;br /&gt;
#include &amp;lt;Wire.h&amp;gt;&lt;br /&gt;
const uint8_t targetAdress=0x04;&lt;br /&gt;
uint8_t regAd=5;&lt;br /&gt;
uint8_t value=60;&lt;br /&gt;
&lt;br /&gt;
int main()&lt;br /&gt;
{&lt;br /&gt;
	Wire.begin();                             // join i2c bus (address optional for master)&lt;br /&gt;
	Serial.begin(9600);&lt;br /&gt;
	sei();&lt;br /&gt;
	while(1)&lt;br /&gt;
	{&lt;br /&gt;
		Wire.beginTransmission(targetAdress); // start transmitting&lt;br /&gt;
		Wire.write(regAd);                    // sends @ registre&lt;br /&gt;
		Wire.endTransmission();               // stop transmitting&lt;br /&gt;
		Wire.requestFrom(targetAdress, (uint8_t) 1);&lt;br /&gt;
		value = Wire.read();&lt;br /&gt;
		Serial.println(value);&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Nous considérons ici la cible avec les potentiomètres.&lt;br /&gt;
&lt;br /&gt;
Cette target i2c possède 4 registres d'adresses 0 à 3.&lt;br /&gt;
&lt;br /&gt;
Chaque registre est une valeur [0 255], qui varie en fonction de la position du potentiomètre.&lt;br /&gt;
&lt;br /&gt;
{{Question|Ecrire un programme permettant de lire les valeurs des potentiomètres}}&lt;br /&gt;
&lt;br /&gt;
{Question|Ecrire une fonction qui permet de modifier la valeur d'un registre d'une cible en respectant la signature suivante: }}&lt;br /&gt;
 uint8_t readI2cReg(uint8_t targetAddress, uint8_t regAddress)&lt;br /&gt;
&lt;br /&gt;
=Association=&lt;br /&gt;
&lt;br /&gt;
{{Question|Faire en sorte que chaque potentiomètre modifie l'intensité lumineuse d'une led différente}}&lt;/div&gt;</summary>
		<author><name>Bjacquot</name></author>	</entry>

	<entry>
		<id>http://wikigeii.iut-troyes.univ-reims.fr//index.php?title=Cours:InfoS2_tdI2cRegistres&amp;diff=20905</id>
		<title>Cours:InfoS2 tdI2cRegistres</title>
		<link rel="alternate" type="text/html" href="http://wikigeii.iut-troyes.univ-reims.fr//index.php?title=Cours:InfoS2_tdI2cRegistres&amp;diff=20905"/>
				<updated>2026-03-24T21:51:01Z</updated>
		
		<summary type="html">&lt;p&gt;Bjacquot : /* Lire un registre i2c */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{EnTeteTdInfoS2|InfoS2 tdI2cRegistres prof}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 Fichiers pour simulide : [[Media:I2cTd2.zip|I2cTd2.zip]]&lt;br /&gt;
&lt;br /&gt;
 {{Rouge|**************************************************}}&lt;br /&gt;
 {{Rouge|***  Attention, programme dans un fichier .ino ***}}&lt;br /&gt;
 {{Rouge|**************************************************}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=vérification des @i2c=&lt;br /&gt;
&lt;br /&gt;
{{Todo|Pensez à utiliser un programme pour lister les adresses des targets i2c, cf td précédent !}}&lt;br /&gt;
&lt;br /&gt;
=Registres=&lt;br /&gt;
&lt;br /&gt;
Les targets i2c {{Rouge|ne sont pas}} des composants programmables. Par contre, il convient de pouvoir les {{Rouge|configurer}}.&lt;br /&gt;
&lt;br /&gt;
Le principe retenu pour la plupart des targets est d'utiliser la notion de {{Rouge|registres}}.&lt;br /&gt;
*1 registre est une {{Rouge|mémoire}} sur la cible&lt;br /&gt;
*1 registre est associé à {{Rouge|une adresse}}&lt;br /&gt;
*chaque registre {{Rouge|modifie/observe}} le fonctionnement de la target&lt;br /&gt;
*1 registre à {{Rouge|un rôle spécifique}}&lt;br /&gt;
*pour {{Rouge|utiliser}} le composant, il faut indiquer {{Rouge|l'adresse}} du registre, que l'on souhaite {{Rouge|lire ou écrire}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[fichier:I2c_modele.png|600px]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Une {{Rouge|transmission}} i2c devient alors une {{Rouge|trame}} selon le principe simplifié suivant :&lt;br /&gt;
*bit de start&lt;br /&gt;
*@ de la target (7 bits)&lt;br /&gt;
*bit de lecture/écriture&lt;br /&gt;
*{{Rouge|attente de l'acknowledge}} (accusé de bonne réception) de la cible&lt;br /&gt;
*choix d'un registre (8 bits)&lt;br /&gt;
*acknowledge&lt;br /&gt;
*envoi/réception de la valeur (8 bits)&lt;br /&gt;
*acknowledge&lt;br /&gt;
*bit de stop&lt;br /&gt;
&lt;br /&gt;
=Ecrire dans un registre i2c=&lt;br /&gt;
&lt;br /&gt;
Voici un programme d'exemple pour modifier la valeur d'un registre :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=cpp&amp;gt;&lt;br /&gt;
#include &amp;lt;Wire.h&amp;gt;&lt;br /&gt;
const uint8_t targetAdress=0x04;&lt;br /&gt;
uint8_t regAd=7;&lt;br /&gt;
uint8_t value=0b10101010;&lt;br /&gt;
&lt;br /&gt;
int main()&lt;br /&gt;
{&lt;br /&gt;
	Wire.begin();        // join i2c bus (address optional for master)&lt;br /&gt;
	Serial.begin(9600);&lt;br /&gt;
	sei();&lt;br /&gt;
	while(1)&lt;br /&gt;
	{&lt;br /&gt;
	    Wire.beginTransmission(targetAdress); // start transmitting&lt;br /&gt;
	    Wire.write(regAd);                    // sends @ registre&lt;br /&gt;
	    Wire.write(value);                    // sends value registre&lt;br /&gt;
	    Wire.endTransmission();               // stop transmitting&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Nous considérons ici la cible avec les leds.&lt;br /&gt;
&lt;br /&gt;
Cette target i2c possède 6 registres d'adresses 0 à 5.&lt;br /&gt;
&lt;br /&gt;
Chaque registre est une valeur [0 255], qui modifie l'intensité lumineuse d'une led.&lt;br /&gt;
&lt;br /&gt;
{{Question|Ecrire un programme permettant de faire varier l'intensité lumineuse d'une, puis de plusieurs, leds}}&lt;br /&gt;
&lt;br /&gt;
{Question|Ecrire une fonction qui permet de modifier la valeur d'un registre d'une cible en respectant la signature suivante: }}&lt;br /&gt;
 void writeI2cReg(uint8_t targetAddress, uint8_t regAddress, uint8_t regValue)&lt;br /&gt;
&lt;br /&gt;
=Lire un registre i2c=&lt;br /&gt;
&lt;br /&gt;
Voici un programme d'exemple pour lire la valeur d'un registre :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=cpp&amp;gt;&lt;br /&gt;
#include &amp;lt;Wire.h&amp;gt;&lt;br /&gt;
const uint8_t targetAdress=0x04;&lt;br /&gt;
uint8_t regAd=5;&lt;br /&gt;
uint8_t value=60;&lt;br /&gt;
&lt;br /&gt;
int main()&lt;br /&gt;
{&lt;br /&gt;
	Wire.begin();                             // join i2c bus (address optional for master)&lt;br /&gt;
	Serial.begin(9600);&lt;br /&gt;
	sei();&lt;br /&gt;
	while(1)&lt;br /&gt;
	{&lt;br /&gt;
		Wire.beginTransmission(targetAdress); // start transmitting&lt;br /&gt;
		Wire.write(regAd);                    // sends @ registre&lt;br /&gt;
		Wire.endTransmission();               // stop transmitting&lt;br /&gt;
		Wire.requestFrom(targetAdress, (uint8_t) 1);&lt;br /&gt;
		value = Wire.read();&lt;br /&gt;
		Serial.println(value);&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Nous considérons ici la cible avec les potentiomètres.&lt;br /&gt;
&lt;br /&gt;
Cette target i2c possède 4 registres d'adresses 0 à 3.&lt;br /&gt;
&lt;br /&gt;
Chaque registre est une valeur [0 255], qui varie en fonction de la position du potentiomètre.&lt;br /&gt;
&lt;br /&gt;
{{Question|Ecrire un programme permettant de lire les valeurs des potentiomètres}}&lt;br /&gt;
&lt;br /&gt;
{Question|Ecrire une fonction qui permet de modifier la valeur d'un registre d'une cible en respectant la signature suivante: }}&lt;br /&gt;
 uint8_t readI2cReg(uint8_t targetAddress, uint8_t regAddress)&lt;br /&gt;
&lt;br /&gt;
=Association=&lt;br /&gt;
&lt;br /&gt;
{{Question|Faire en sorte que chaque potentiomètre modifie l'intensité lumineuse d'une led différente}}&lt;/div&gt;</summary>
		<author><name>Bjacquot</name></author>	</entry>

	<entry>
		<id>http://wikigeii.iut-troyes.univ-reims.fr//index.php?title=Cours:InfoS2_tdI2cRegistres&amp;diff=20904</id>
		<title>Cours:InfoS2 tdI2cRegistres</title>
		<link rel="alternate" type="text/html" href="http://wikigeii.iut-troyes.univ-reims.fr//index.php?title=Cours:InfoS2_tdI2cRegistres&amp;diff=20904"/>
				<updated>2026-03-24T21:38:46Z</updated>
		
		<summary type="html">&lt;p&gt;Bjacquot : /* Lire un registre i2c */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{EnTeteTdInfoS2|InfoS2 tdI2cRegistres prof}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 Fichiers pour simulide : [[Media:I2cTd2.zip|I2cTd2.zip]]&lt;br /&gt;
&lt;br /&gt;
 {{Rouge|**************************************************}}&lt;br /&gt;
 {{Rouge|***  Attention, programme dans un fichier .ino ***}}&lt;br /&gt;
 {{Rouge|**************************************************}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=vérification des @i2c=&lt;br /&gt;
&lt;br /&gt;
{{Todo|Pensez à utiliser un programme pour lister les adresses des targets i2c, cf td précédent !}}&lt;br /&gt;
&lt;br /&gt;
=Registres=&lt;br /&gt;
&lt;br /&gt;
Les targets i2c {{Rouge|ne sont pas}} des composants programmables. Par contre, il convient de pouvoir les {{Rouge|configurer}}.&lt;br /&gt;
&lt;br /&gt;
Le principe retenu pour la plupart des targets est d'utiliser la notion de {{Rouge|registres}}.&lt;br /&gt;
*1 registre est une {{Rouge|mémoire}} sur la cible&lt;br /&gt;
*1 registre est associé à {{Rouge|une adresse}}&lt;br /&gt;
*chaque registre {{Rouge|modifie/observe}} le fonctionnement de la target&lt;br /&gt;
*1 registre à {{Rouge|un rôle spécifique}}&lt;br /&gt;
*pour {{Rouge|utiliser}} le composant, il faut indiquer {{Rouge|l'adresse}} du registre, que l'on souhaite {{Rouge|lire ou écrire}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[fichier:I2c_modele.png|600px]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Une {{Rouge|transmission}} i2c devient alors une {{Rouge|trame}} selon le principe simplifié suivant :&lt;br /&gt;
*bit de start&lt;br /&gt;
*@ de la target (7 bits)&lt;br /&gt;
*bit de lecture/écriture&lt;br /&gt;
*{{Rouge|attente de l'acknowledge}} (accusé de bonne réception) de la cible&lt;br /&gt;
*choix d'un registre (8 bits)&lt;br /&gt;
*acknowledge&lt;br /&gt;
*envoi/réception de la valeur (8 bits)&lt;br /&gt;
*acknowledge&lt;br /&gt;
*bit de stop&lt;br /&gt;
&lt;br /&gt;
=Ecrire dans un registre i2c=&lt;br /&gt;
&lt;br /&gt;
Voici un programme d'exemple pour modifier la valeur d'un registre :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=cpp&amp;gt;&lt;br /&gt;
#include &amp;lt;Wire.h&amp;gt;&lt;br /&gt;
const uint8_t targetAdress=0x04;&lt;br /&gt;
uint8_t regAd=7;&lt;br /&gt;
uint8_t value=0b10101010;&lt;br /&gt;
&lt;br /&gt;
int main()&lt;br /&gt;
{&lt;br /&gt;
	Wire.begin();        // join i2c bus (address optional for master)&lt;br /&gt;
	Serial.begin(9600);&lt;br /&gt;
	sei();&lt;br /&gt;
	while(1)&lt;br /&gt;
	{&lt;br /&gt;
	    Wire.beginTransmission(targetAdress); // start transmitting&lt;br /&gt;
	    Wire.write(regAd);                    // sends @ registre&lt;br /&gt;
	    Wire.write(value);                    // sends value registre&lt;br /&gt;
	    Wire.endTransmission();               // stop transmitting&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Nous considérons ici la cible avec les leds.&lt;br /&gt;
&lt;br /&gt;
Cette target i2c possède 6 registres d'adresses 0 à 5.&lt;br /&gt;
&lt;br /&gt;
Chaque registre est une valeur [0 255], qui modifie l'intensité lumineuse d'une led.&lt;br /&gt;
&lt;br /&gt;
{{Question|Ecrire un programme permettant de faire varier l'intensité lumineuse d'une, puis de plusieurs, leds}}&lt;br /&gt;
&lt;br /&gt;
{Question|Ecrire une fonction qui permet de modifier la valeur d'un registre d'une cible en respectant la signature suivante: }}&lt;br /&gt;
 void writeI2cReg(uint8_t targetAddress, uint8_t regAddress, uint8_t regValue)&lt;br /&gt;
&lt;br /&gt;
=Lire un registre i2c=&lt;br /&gt;
&lt;br /&gt;
Voici un programme d'exemple pour lire la valeur d'un registre :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=cpp&amp;gt;&lt;br /&gt;
#include &amp;lt;Wire.h&amp;gt;&lt;br /&gt;
const uint8_t targetAdress=0x04;&lt;br /&gt;
uint8_t regAd=5;&lt;br /&gt;
uint8_t value=60;&lt;br /&gt;
&lt;br /&gt;
int main()&lt;br /&gt;
{&lt;br /&gt;
	Wire.begin();                             // join i2c bus (address optional for master)&lt;br /&gt;
	Serial.begin(9600);&lt;br /&gt;
	sei();&lt;br /&gt;
	while(1)&lt;br /&gt;
	{&lt;br /&gt;
		Wire.beginTransmission(targetAdress); // start transmitting&lt;br /&gt;
		Wire.write(regAd);                    // sends @ registre&lt;br /&gt;
		Wire.endTransmission();               // stop transmitting&lt;br /&gt;
		Wire.requestFrom(targetAdress, 1);&lt;br /&gt;
		value = Wire.read();&lt;br /&gt;
		Serial.println(value);&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Nous considérons ici la cible avec les potentiomètres.&lt;br /&gt;
&lt;br /&gt;
Cette target i2c possède 4 registres d'adresses 0 à 3.&lt;br /&gt;
&lt;br /&gt;
Chaque registre est une valeur [0 255], qui varie en fonction de la position du potentiomètre.&lt;br /&gt;
&lt;br /&gt;
{{Question|Ecrire un programme permettant de lire les valeurs des potentiomètres}}&lt;br /&gt;
&lt;br /&gt;
{Question|Ecrire une fonction qui permet de modifier la valeur d'un registre d'une cible en respectant la signature suivante: }}&lt;br /&gt;
 uint8_t readI2cReg(uint8_t targetAddress, uint8_t regAddress)&lt;br /&gt;
&lt;br /&gt;
=Association=&lt;br /&gt;
&lt;br /&gt;
{{Question|Faire en sorte que chaque potentiomètre modifie l'intensité lumineuse d'une led différente}}&lt;/div&gt;</summary>
		<author><name>Bjacquot</name></author>	</entry>

	<entry>
		<id>http://wikigeii.iut-troyes.univ-reims.fr//index.php?title=Cours:InfoS2_tdI2cRegistres&amp;diff=20903</id>
		<title>Cours:InfoS2 tdI2cRegistres</title>
		<link rel="alternate" type="text/html" href="http://wikigeii.iut-troyes.univ-reims.fr//index.php?title=Cours:InfoS2_tdI2cRegistres&amp;diff=20903"/>
				<updated>2026-03-24T21:37:57Z</updated>
		
		<summary type="html">&lt;p&gt;Bjacquot : /* Ecrire dans un registre i2c */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{EnTeteTdInfoS2|InfoS2 tdI2cRegistres prof}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 Fichiers pour simulide : [[Media:I2cTd2.zip|I2cTd2.zip]]&lt;br /&gt;
&lt;br /&gt;
 {{Rouge|**************************************************}}&lt;br /&gt;
 {{Rouge|***  Attention, programme dans un fichier .ino ***}}&lt;br /&gt;
 {{Rouge|**************************************************}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=vérification des @i2c=&lt;br /&gt;
&lt;br /&gt;
{{Todo|Pensez à utiliser un programme pour lister les adresses des targets i2c, cf td précédent !}}&lt;br /&gt;
&lt;br /&gt;
=Registres=&lt;br /&gt;
&lt;br /&gt;
Les targets i2c {{Rouge|ne sont pas}} des composants programmables. Par contre, il convient de pouvoir les {{Rouge|configurer}}.&lt;br /&gt;
&lt;br /&gt;
Le principe retenu pour la plupart des targets est d'utiliser la notion de {{Rouge|registres}}.&lt;br /&gt;
*1 registre est une {{Rouge|mémoire}} sur la cible&lt;br /&gt;
*1 registre est associé à {{Rouge|une adresse}}&lt;br /&gt;
*chaque registre {{Rouge|modifie/observe}} le fonctionnement de la target&lt;br /&gt;
*1 registre à {{Rouge|un rôle spécifique}}&lt;br /&gt;
*pour {{Rouge|utiliser}} le composant, il faut indiquer {{Rouge|l'adresse}} du registre, que l'on souhaite {{Rouge|lire ou écrire}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[fichier:I2c_modele.png|600px]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Une {{Rouge|transmission}} i2c devient alors une {{Rouge|trame}} selon le principe simplifié suivant :&lt;br /&gt;
*bit de start&lt;br /&gt;
*@ de la target (7 bits)&lt;br /&gt;
*bit de lecture/écriture&lt;br /&gt;
*{{Rouge|attente de l'acknowledge}} (accusé de bonne réception) de la cible&lt;br /&gt;
*choix d'un registre (8 bits)&lt;br /&gt;
*acknowledge&lt;br /&gt;
*envoi/réception de la valeur (8 bits)&lt;br /&gt;
*acknowledge&lt;br /&gt;
*bit de stop&lt;br /&gt;
&lt;br /&gt;
=Ecrire dans un registre i2c=&lt;br /&gt;
&lt;br /&gt;
Voici un programme d'exemple pour modifier la valeur d'un registre :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=cpp&amp;gt;&lt;br /&gt;
#include &amp;lt;Wire.h&amp;gt;&lt;br /&gt;
const uint8_t targetAdress=0x04;&lt;br /&gt;
uint8_t regAd=7;&lt;br /&gt;
uint8_t value=0b10101010;&lt;br /&gt;
&lt;br /&gt;
int main()&lt;br /&gt;
{&lt;br /&gt;
	Wire.begin();        // join i2c bus (address optional for master)&lt;br /&gt;
	Serial.begin(9600);&lt;br /&gt;
	sei();&lt;br /&gt;
	while(1)&lt;br /&gt;
	{&lt;br /&gt;
	    Wire.beginTransmission(targetAdress); // start transmitting&lt;br /&gt;
	    Wire.write(regAd);                    // sends @ registre&lt;br /&gt;
	    Wire.write(value);                    // sends value registre&lt;br /&gt;
	    Wire.endTransmission();               // stop transmitting&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Nous considérons ici la cible avec les leds.&lt;br /&gt;
&lt;br /&gt;
Cette target i2c possède 6 registres d'adresses 0 à 5.&lt;br /&gt;
&lt;br /&gt;
Chaque registre est une valeur [0 255], qui modifie l'intensité lumineuse d'une led.&lt;br /&gt;
&lt;br /&gt;
{{Question|Ecrire un programme permettant de faire varier l'intensité lumineuse d'une, puis de plusieurs, leds}}&lt;br /&gt;
&lt;br /&gt;
{Question|Ecrire une fonction qui permet de modifier la valeur d'un registre d'une cible en respectant la signature suivante: }}&lt;br /&gt;
 void writeI2cReg(uint8_t targetAddress, uint8_t regAddress, uint8_t regValue)&lt;br /&gt;
&lt;br /&gt;
=Lire un registre i2c=&lt;br /&gt;
&lt;br /&gt;
Voici un programme d'exemple pour lire la valeur d'un registre :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=cpp&amp;gt;&lt;br /&gt;
#include &amp;lt;Wire.h&amp;gt;&lt;br /&gt;
const uint8_t targetAdress=0x04;&lt;br /&gt;
uint8_t regAd=5;&lt;br /&gt;
uint8_t value=60;&lt;br /&gt;
&lt;br /&gt;
int main()&lt;br /&gt;
{&lt;br /&gt;
	Wire.begin();                             // join i2c bus (address optional for master)&lt;br /&gt;
	Serial.begin(9600);&lt;br /&gt;
	sei();&lt;br /&gt;
	while(1)&lt;br /&gt;
	{&lt;br /&gt;
		Wire.beginTransmission(targetAdress); // start transmitting&lt;br /&gt;
		Wire.write(regAd);                    // sends @ registre&lt;br /&gt;
		Wire.endTransmission();               // stop transmitting&lt;br /&gt;
		Wire.requestFrom(targetAdress, 1);&lt;br /&gt;
		while (Wire.available()) value = Wire.read();&lt;br /&gt;
		Serial.println(value);&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Nous considérons ici la cible avec les potentiomètres.&lt;br /&gt;
&lt;br /&gt;
Cette target i2c possède 4 registres d'adresses 0 à 3.&lt;br /&gt;
&lt;br /&gt;
Chaque registre est une valeur [0 255], qui varie en fonction de la position du potentiomètre.&lt;br /&gt;
&lt;br /&gt;
{{Question|Ecrire un programme permettant de lire les valeurs des potentiomètres}}&lt;br /&gt;
&lt;br /&gt;
=Association=&lt;br /&gt;
&lt;br /&gt;
{{Question|Faire en sorte que chaque potentiomètre modifie l'intensité lumineuse d'une led différente}}&lt;/div&gt;</summary>
		<author><name>Bjacquot</name></author>	</entry>

	<entry>
		<id>http://wikigeii.iut-troyes.univ-reims.fr//index.php?title=Cours:TPS_2103_tp_regulationVitesse&amp;diff=20901</id>
		<title>Cours:TPS 2103 tp regulationVitesse</title>
		<link rel="alternate" type="text/html" href="http://wikigeii.iut-troyes.univ-reims.fr//index.php?title=Cours:TPS_2103_tp_regulationVitesse&amp;diff=20901"/>
				<updated>2026-03-16T09:52:08Z</updated>
		
		<summary type="html">&lt;p&gt;Bjacquot : /* Contraintes */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
&amp;lt;accesscontrol&amp;gt;Acces:Prof&amp;lt;/accesscontrol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Contraintes=&lt;br /&gt;
*pour contrôler la vitesse du moteur :&lt;br /&gt;
**on utilisera un timer 16 bits (timer1)&lt;br /&gt;
**utilisation du timer1 dans le mode 14&lt;br /&gt;
*un potentiomètre sera utilisé en le reliant sur la broche indiquée ci-dessous&lt;br /&gt;
*vous respecterez les contraintes spécifiques suivantes :&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Groupe TP !! sujet !! sortie du timer !! valeur max(top) du timer1 !! valeurs de rapport cyclique !! prédiviseur !! entrée potar !! nombre d'incréments / 10ms&lt;br /&gt;
|-&lt;br /&gt;
| 1A || A || OC1A || 3199 || 20% / 60% || 8 || ADC3 || 9 &lt;br /&gt;
|-&lt;br /&gt;
| 1A || B || OC1A || 15999 || 10% / 90% || 1 || ADC2 || 7 &lt;br /&gt;
|-&lt;br /&gt;
| 1B || A || OC1B || 3899 || 25% / 75% || 8 || ADC5 || 8&lt;br /&gt;
|-&lt;br /&gt;
| 1B || B || OC1B || 24999 || 40% / 60% || 1 || ADC4 || 9&lt;br /&gt;
|-&lt;br /&gt;
| 2A || A || OC1A || 2399 || 25% / 50% || 8 || ADC3 || 6&lt;br /&gt;
|-&lt;br /&gt;
| 2A || B || OC1A || 17999 || 30% / 70% || 1 || ADC1 || 7&lt;br /&gt;
|-&lt;br /&gt;
| 2B || A || OC1B || 2499 || 25% / 50% || 8 || ADC2 || 9&lt;br /&gt;
|-&lt;br /&gt;
| 2B || B || OC1B || 16999 || 40% / 75% || 1 || ADC3 || 6&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=Travail à réaliser=&lt;br /&gt;
&lt;br /&gt;
==mode marche/arrêt==&lt;br /&gt;
&lt;br /&gt;
on utilise le bouton BP1 comme bouton '''marche''' :&lt;br /&gt;
 le moteur ne pourra tourner que si on maintient le bouton marche appuyé&lt;br /&gt;
&lt;br /&gt;
{{Eval|2|Visualisation du mode de fonctionnement avec 2 leds}}&lt;br /&gt;
*entrées/sorties&lt;br /&gt;
**relier le bouton sur la broche PD2&lt;br /&gt;
**relier la led rouge sur PD6&lt;br /&gt;
**relier la led verte sur PD7&lt;br /&gt;
*bouton est appuyé&lt;br /&gt;
**mode marche&lt;br /&gt;
**led verte allumée&lt;br /&gt;
*bouton n'est pas appuyé&lt;br /&gt;
**mode arrêt&lt;br /&gt;
**led rouge allumée&lt;br /&gt;
&lt;br /&gt;
==génération de MLI==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Vous allez générer une MLI qui permettra de faire varier la vitesse de rotation du moteur.&lt;br /&gt;
&lt;br /&gt;
Vous trouverez dans le tableau les contraintes (sortie du timer/ valeur Top / prédiviseur/valeurs de rapport cyclique)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{Eval|4|génération et vérification de la MLI }}&lt;br /&gt;
*utilisation du Timer 1 (16 bits)&lt;br /&gt;
*en mode 14&lt;br /&gt;
*avec la valeur Top indiquée dans le tableau&lt;br /&gt;
*avec le prédiviseur indiqué dans le tableau&lt;br /&gt;
*faire varier le rapport cyclique :&lt;br /&gt;
**alterner entre les 2 valeur de rapport cyclique du tableau&lt;br /&gt;
**en changeant toutes les 5 secondes&lt;br /&gt;
*visualiser la MLI à l'oscilloscope&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{Eval|2|banchez le moteur et faire en sorte que}}&lt;br /&gt;
*en mode arrêt le moteur ne tourne pas (bouton relâché/led rouge allumée)&lt;br /&gt;
*en mode marche : le moteur change de vitesse selon les 2 valeurs de rapport cyclique toutes les 5 secondes&lt;br /&gt;
&lt;br /&gt;
==Asservissement de vitesse==&lt;br /&gt;
On utilise des fourches optiques [https://fr.farnell.com/vishay/tcut1300x01/capteur-transm-aec-q101-1-2v-cms/dp/2889654?st=TCUT1300X01 TCUT1300] pour détecter la rotation de l'arbre moteur.&lt;br /&gt;
&lt;br /&gt;
Il y a 8 dents sur la roue codeuse par tour.&lt;br /&gt;
&lt;br /&gt;
On utilisera l'entrée INT1 pour réaliser le comptage de la roue codeuse.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=cpp&amp;gt;&lt;br /&gt;
//interruption qui incrémente un compteur à chaque front montant de la fourche optique&lt;br /&gt;
&lt;br /&gt;
int main()&lt;br /&gt;
{&lt;br /&gt;
   // configuration dont timer/interruption&lt;br /&gt;
   while(1)&lt;br /&gt;
   {&lt;br /&gt;
       _delay_ms(10);&lt;br /&gt;
       // ttes les 10ms on :&lt;br /&gt;
       // regarde la valeur du compteur de la fourche optique&lt;br /&gt;
       // augmente/diminue la vitesse si le compteur est sup/inf à 8&lt;br /&gt;
       // remettre à 0 le compteur&lt;br /&gt;
   }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Eval|5|Asservir la vitesse de rotation de l'arbre moteur pour avoir le bon nombre d'incréments toutes les 10ms :}}&lt;br /&gt;
 '''Prendre la valeur demandée dans le tableau partie contraintes'''&lt;br /&gt;
&lt;br /&gt;
 Remarque : Il suffit de diminuer(d'augmenter) le rapport cyclique si il y a trop (pas assez) d'impulsions dans le temps imparti.&lt;br /&gt;
&lt;br /&gt;
{{Eval|1|En déduire la vitesse de rotation en sortie de réducteur, et vérifier avec un tachymètre}}&lt;br /&gt;
&lt;br /&gt;
==modification de la vitesse de consigne==&lt;br /&gt;
&lt;br /&gt;
On va utiliser le potentiomètre pour modifier la valeur de consigne (nombre d'incréments/10ms)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{Eval|4|Ajouter la gestion du potentiomètre}}&lt;br /&gt;
*connecter le potentiomètre sur l'entrée indiquée dans le tableau&lt;br /&gt;
*configurer l'ADC&lt;br /&gt;
*faire varier le nombre d'incréments de 4 à 12 lorsque le potentiomètre tourne de part en part.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Remarque''' : vous pouvez utiliser la liaison série pour mettre au point :&lt;br /&gt;
&amp;lt;source lang=c&amp;gt;&lt;br /&gt;
int main()&lt;br /&gt;
{&lt;br /&gt;
   sei();&lt;br /&gt;
   Serial.begin(9600);&lt;br /&gt;
   while(1)&lt;br /&gt;
   {&lt;br /&gt;
      Serial.println(&amp;quot;top&amp;quot;);&lt;br /&gt;
      _delay_ms(500);&lt;br /&gt;
   }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==comptage avec un Timer==&lt;br /&gt;
Il est possible de décharger le processeur de la tâche de comptage en utilisant un Timer.&lt;br /&gt;
&lt;br /&gt;
On utilisera le timer0 qu'on configurera :&lt;br /&gt;
*en mode normal&lt;br /&gt;
*entrée d'horloge sur T0 (choix avec les bits CS02/CS01/CS00)&lt;br /&gt;
*la valeur du compteur correspond au registre TCNT0&lt;br /&gt;
&lt;br /&gt;
{{Eval|2|Modifier votre programme en conséquence}}&lt;br /&gt;
&lt;br /&gt;
'''&amp;lt;big&amp;gt;Remarques :&amp;lt;/big&amp;gt;'''&lt;br /&gt;
*en observant les fronts montants+descendants il y a 16 impulsions par tour, ce qui permet d'augmenter la précision de la mesure de vitesse&lt;br /&gt;
*on peut jouer sur la durée du delay&lt;br /&gt;
**il faut rester dans les limites du compteur (8 bits)&lt;br /&gt;
**on peut éventuellement observer le bit de débordement du timer&lt;/div&gt;</summary>
		<author><name>Bjacquot</name></author>	</entry>

	</feed>