1.11.9

News

Page  1 sur 3  > >>

2019-01-16
Catégorie : Arduino
Posté par : xavier
Un Circuit imprimé pour plusieurs sketches
2018-06-07
Catégorie : Arduino
Posté par : xavier
Des pistes pour developper un projet a base d'Arduino
2017-09-23
Catégorie : Expositions
Posté par : xavier

Les 4/5 Novembre 2017, au parc Savoie Expo de Chambéry (Savoie), se tiendra l'exposition Savoie Modelisme.

CMS - 1.11.9 - Bartolome
 

Au fait

Au fait

Pendant que l'on attend, on ne fait rien d'autre! Ceci est valable quand on perd du temps avec delay() et c'est encore valable quand on ne attend une chaîne de caractères en provenance du PC.

Imaginez que pendant que vous lisez ceci, quelqu'un sonne a votre porte... vous enregistrez rapidement ce le document qui vous permet de prendre des notes, avant d'aller ouvrir la porte, accueillir votre hôte.

Ce n'est que quand il sera parti que vous ré-ouvrirez votre document et poursuivrez votre lecture attentive.

Vous avez été interrompu!

Votre Arduino sait en faire autant... et cela peut se révéler très intéressant.

Quelques commandes pour continuer:

sei()

C'est une instruction C++ qui autorise les interruptions définies précédemment. Bien compliqué...Ayez confiance... il faut que cela soit comme ça!

Utilisez ce bout de programme même si vous ne comprenez pas.

volatile

C'est une directive de compilation. Ayez encore confiance...

 

Programme N°8:

#define niveau 20 // Rapport cyclique
#define cycle 100 // Fréquence du cycle
#define led 13

void setup() {
    // Mise en place d'une interruption
    TCCR2B = 0b00000010; // clk/8
    TIMSK2 = 0b00000001; // TOIE2 local
    sei() ; // GIE global
    // Positionnement led en sortie
    pinMode(led,OUTPUT);
}

// Gestion de l'interruption
ISR (TIMER2_OVF_vect) {
    volatile byte cpt;
    TCNT2 = 62; // 256-200 --> 100 us
    if (cpt++ > cycle) { // toutes les 10ms
remise a zéro (cycle=100)
   
    cpt = 0;
    }
    if (cpt<niveau) {digitalWrite(led,HIGH;} else {digitalWrite(led,LOW);}
}

void loop() {
}


Commentaires

Le programme se complique!!! Il permet de faire clignoter la led de votre Arduino comme le premier programme. Mais un ENORME PLUS, c'est qu'il permet de faire d'autres chose en même temps.

 

A remarquer:

- loop est vide. Eh oui, tout est géré par interruption! Et c'est pour cela que vous pouvez faire d'autres choses!

- Dans le setup, la mise en place de l'interruption semble barbare. Il faut seulement la recopier, pas besoin de comprendre le détail.

- ISR () est le sous programme qui gère l'interruption mise en place plus haut. Toutes les 100 us l'interruption reviendra. Le compteur s’incrémentera de 1 a 100 puis retour a 0. On teste la valeur du compteur pour savoir si il faut allumer ou éteindre la led, ce qui permet de régler le rapport de cycle. Pour régler le temps de cycle, on jouera sur la valeur de cycle

Programme N°9:

String inputString = ""; // pour contenir la chaîne reçue
boolean stringComplete = false; // Indique que la chaîne est complète

void setup() {
    Serial.begin(9600);
}

// =====================================================
// Serial Event Handler
// =====================================================
void serialEvent() {
    while (Serial.available()) {
        // Lit un nouveau caractère:
        char inChar = (char)Serial.read();
        // ajoute ce caractère a la chaîne en cours de construction:
        inputString += inChar;
        // Si le caractère est un LN, positionne un drapeau
        // afin que le programme principal puisse l'utiliser:
        if (inChar == '\n') {
            stringComplete = true;
        }
    }
}

void loop() {
// Regarde si on a reçu une chaîne USB
    if (stringComplete) {
        Usb_Handler(inputString.substring(0,inputString.length()-1));
        // C'est ici que l'on traite la chaîne reçue:
        Serial.print("Chaîne reçue :");
        Serial.println(inputString);
        // Vide la chaine:
        inputString = "";
        stringComplete = false;
    }
}


Commentaires

Comme le programme 7 on communique avec le PC... La aussi , ce programme permet de faire d'autres chose en même temps.

 

A remarquer:

- Le message peut arriver a n'importe quel moment. Il ne sera affiché que s'il est complet.

- Après traitement (ici affichage USB)l est indispensable de vider la chaîne et de repositionner la variable stringComplete = false pour recevoir d'autres chaînes.

 

En combinant les deux, on obtiendrait:

#define Led 13
#define Period 100 // 5000
#define Tempo 62   // 620

/*
Clignottement  5000 & 620
Fader              100 & 62
*/
//int Period =100; // 5000
//int Tempo =62;   // 620
int cntpf;
int cpt;
int Rapport=Period/2;

String inputString = "";         // Chaîne contenant les caractères USB reçus
boolean stringComplete = false;  // Drapeau indiquant le retour chariot

// =================================================
// Gestion des interruptions
// =================================================
ISR(TIMER2_OVF_vect) {
  TCNT2=Tempo;  // Boucle de base 100/1000ms
  if (cntpf++>Period) {
    cpt++;
    cntpf=0;
    Serial.print(".");
  }

  if (cntpf<Rapport) {
    digitalWrite(Led, HIGH);
  } else {
    digitalWrite(Led, LOW);
  }
}

/*
Evènement série intervenant à chaque caractère USB reçu (RX).
Cette routine tourne entre deux boucles principales,
l'utilisation d'un delay dans la boucle pourrait retarder la réponse.
*/
void serialEvent() {
  while (Serial.available()) {
    // réception d'un nouveau caractère:
    char inChar = (char)Serial.read();
    // ajout à inputString:
    inputString += inChar;
    // si le caractère reçu est un CR, le drapeau est levé
    // pour que la boucle principale puisse la traiter:
    if (inChar == '\n') {
      stringComplete = true;
    }
  }
}

void setup() {
  // placer ici vos initialisations à executer une fois au demarrage:
  // Initialisation de l'interruption Timer;
  TCCR2B = 0b00000010;
  TIMSK2 = 0b00000001;
  sei();
  pinMode(Led, OUTPUT);
  Serial.begin(9600);
  // reserve 200 octets pour inputString:
  inputString.reserve(200);
}

void loop() {
  if (stringComplete) {
    Serial.println();
    Serial.print(inputString);
    if (inputString=="+\n") {
      Rapport+=Period/10;
    }
    if (inputString=="-\n") {
      Rapport=Period/10;
    }
    //Rapport=Rapport%Period;
    Serial.print(">>");
    Serial.println(Rapport);
    // effacement de la chaîne reçue, après traitement:
    inputString = "";
    stringComplete = false;
  }
}

En envoyant des + ou des - sur l'USB, on modifie le rapport cyclique du clignottement.

Notez que suivant le parametrage, ce programme a deux aspects differents, en effet si le clignottement est trés rapide, l'oeil ne percoit plus le clignottement mais seulement sa valeur moyenne. En jouant sur le rapport cyclique, on a donc l'impression d'une luminosité variable :

Pour obtenir un clignottement :       
#define Period 5000
#define Tempo 620

Pour obtenir une luminosité variable :
#define Period 100
#define Tempo 62