LOCODUINO

Parlons Arduino => Vos projets => Discussion démarrée par: Yann le octobre 06, 2020, 10:47:37 pm

Titre: Impulsion temporisée avec Attiny 85
Posté par: Yann le octobre 06, 2020, 10:47:37 pm
Bonjour à tous,

Il y a quelques années en arrière j'ai eu besoin d'avoir un petit circuit basé sur un Attiny 85 et programmé via un Arduino qui me permette de faire une temporisation au relâchement pour un capteur Infra-rouge. Vous trouverez un descriptif du montage sur mon site à cette page:
http://www.digi-train.ch/montage_electro/capteur_infra.html
Je joins encore ici le schéma électrique.

Aujourd'hui j'aimerai modifier le code afin de réaliser le diagramme des temps ci-dessous. Le potentiomètre permet de régler le temps t.

Le problème c'est que j'ai beaucoup de peine à trouver le code pour réaliser ce diagramme des temps... est-ce que quelqu'un aurait quelques pistes...

D'avance merci pour votre aide.
Titre: Re : Impulsion temporisée avec Attiny 85
Posté par: Fantasio le octobre 07, 2020, 02:29:45 pm
Bonjour Yann

1)Ce que je comprends de ton diagramme:
- quand le signal d'entrée passe du niveau LOW au niveau HIGH:
      - mise en route d'un monostable rédéclenchable dont la valeur est ajustée par le potentiomètre
      - lorsque le monostable revient au repos, changement de l'état de la sortie pendant la durée d'une tempo

2)Le programme pourrait s'organiser ainsi:
-définir les broches :
   signal capteur
   commande relais
   curseur potentiomètre
-définir la durée de l'impulsion de sortie

dans le setup
  définir les broches en entrée et en sortie

dans la loop
  lire la tension au curseur du potentiomètre et en calculer la valeur de la tempo du momonostable
  selon l'état du capteur déclencher le monostable
  la fin du monostable changer l'état de la sortie commande relais durant la valeur de l'impulsion

Voila en gros ce que j'envisagerai...
     
Titre: Re : Impulsion temporisée avec Attiny 85
Posté par: Fantasio le octobre 07, 2020, 02:47:37 pm
Je viens de retrouver ce code qui commande un monostable redéclenchable, éventuellement si tu veux t'en inspirer...const byte led = 13;
const byte button = 2;
unsigned long interval = 10000;
unsigned long startTime;
byte lastPress;


void setup()
{
  pinMode(led, OUTPUT);
  pinMode(button, INPUT_PULLUP);
  Serial.begin (9600);
}


void loop()
{
  byte pressed = digitalRead(button);
  Serial.print("pressed = ");
  Serial.println(pressed);
  if (pressed)
  {
    if (pressed != lastPress)
    {
      digitalWrite(led, HIGH);
      startTime = millis();
    }
  }
  lastPress = pressed;
  if (digitalRead(led))
  {
    if (millis() - startTime >= interval)

    {
      digitalWrite(led, LOW);
    }
  }
}

Bonne continuation
Titre: Re : Impulsion temporisée avec Attiny 85
Posté par: msport le octobre 07, 2020, 03:33:31 pm
Bonjour,
je n'ai rien contre l'ATTiny85 (et les autres), bien au contraire, mais pour ce type de fonction qui est un monostable re-déclenchable, l'utilisation d'un circuit spécialisé comme le 74LS123 (74LS122) est potentiellement plus simple.
https://fr.aliexpress.com/item/33016852443.html
https://www.electronique-et-informatique.fr/Electronique-et-Informatique/Digit/Digit_6TS.php

La modification souhaitée nécessite de faire suivre le 1er monostable par le 2e monostable déclenché par le front descendant du premier.
Mais effectivement, on est hors sujet Arduino pour lequel la 1ere réponse est la bonne surtout si il y a un autre traitement après.
Titre: Re : Re : Impulsion temporisée avec Attiny 85
Posté par: Yann le octobre 07, 2020, 08:09:05 pm
Je viens de retrouver ce code qui commande un monostable redéclenchable, éventuellement si tu veux t'en inspirer...

Bonjour Fantasio,

Merci pour cet exemple. Lorsque je met ce code dans Arduino j'ai une erreur:
exit status 1 'Serial' was not declared in this scope
Je ne comprend pas d'où vient le problème...

Bonjour msport,
Bonjour,
je n'ai rien contre l'ATTiny85 (et les autres), bien au contraire, mais pour ce type de fonction qui est un monostable re-déclenchable, l'utilisation d'un circuit spécialisé comme le 74LS123 (74LS122) est potentiellement plus simple.
https://fr.aliexpress.com/item/33016852443.html
https://www.electronique-et-informatique.fr/Electronique-et-Informatique/Digit/Digit_6TS.php

La modification souhaitée nécessite de faire suivre le 1er monostable par le 2e monostable déclenché par le front descendant du premier.
Mais effectivement, on est hors sujet Arduino pour lequel la 1ere réponse est la bonne surtout si il y a un autre traitement après.
Merci pour votre réponse. L'idée est que j'ai déjà tout le hardware et que ce n'est que du code à changer! Les circuits sont fait, alors si je peux gagner en université dans avoir besoin de refaire des circuits et un montage différent ça m'arrange, pour la maintenance aussi!

Voici le code fonctionnel qui permet de réaliser le diagramme des temps ci-joint:
#define TRIMMER 2                 // Potentiometer connected to ADC2
#define LED 2                                  // LED connected to I/O pin 2
#define BUTTON 3                            // pushbutton connected to I/O pin 3
#define PUSHED 1                            // Active low

int DELAY = 0;                    // This value is set by the trimer
unsigned long timeStamp;   // Time stamp value

void setup()
{
  pinMode(LED, OUTPUT);           // Sets the digital pin as output
  pinMode(BUTTON, INPUT_PULLUP);  // Sets the digital pin as input
}
void loop()
{
  if (digitalRead(BUTTON) == PUSHED)      // Read the input pin
  {
    DELAY = analogRead(TRIMMER) * 5;      // (5V=1024) * 5 -> 5V=5120ms
    digitalWrite(LED, 1);                 // Turn LED ON
    timeStamp = millis();                 // Reset timestamp
  }
  else
      if (millis() - timeStamp > DELAY)  // Check if delay finished
          digitalWrite(LED, 0);          // Output goes low
}
Titre: Re : Impulsion temporisée avec Attiny 85
Posté par: Fantasio le octobre 07, 2020, 09:18:33 pm
La code du monostable était destiné à un Arduino Uno. Je le présentais juste à titre d'exemple et il doit être adapté pour un Attiny85. ;)
Titre: Re : Re : Impulsion temporisée avec Attiny 85
Posté par: Yann le octobre 07, 2020, 09:20:31 pm
La code du monostable était destiné à un Arduino Uno. Je le présentais juste à titre d'exemple et il doit être adapté pour un Attiny85. ;)
Ah il y a qqch à adapter? Dans ce cas je ne sais pas quoi faire alors... car mon code fonctionne sur les 2.
Titre: Re : Impulsion temporisée avec Attiny 85
Posté par: msport le octobre 07, 2020, 10:12:07 pm
Un sketch ATTiny tournera sur un UNO, mais pas l'inverse. Il faut adapter les entrées / sorties. Et il n'y a pas de lien série.

#define TRIMMER 2                 // Potentiometer connected to ADC2
#define LED 2                                  // LED connected to I/O pin 2
#define BUTTON 3                            // pushbutton connected to I/O pin 3
#define PUSHED 1                            // Active low

const byte led = 13; // devient 2
const byte button = 2; // devient 3

soit
const byte led = 2;
const byte button = 3;

et il faut supprimer les print et println et le serial begin = commenter avec //

...
Titre: Re : Impulsion temporisée avec Attiny 85
Posté par: Yann le octobre 07, 2020, 11:35:41 pm
Bonjour,

Ok "msport" je vais modifier et adapter ce code.

Entre temps j'ai essayé de modifier le mien comme suit:
#define TRIMMER 2                // Potentiometer connected to ADC2
#define LED 2                   // LED connected to I/O pin 2
#define BUTTON 3               // pushbutton connected to I/O pin 3
#define PUSHED 1                // Active low

int DELAY = 0;                    // This value is set by the trimer
unsigned long timeStamp;          // Time stamp value

void setup()
{
  pinMode(LED, OUTPUT);           // Sets the digital pin as output
  pinMode(BUTTON, INPUT_PULLUP);  // Sets the digital pin as input
}
void loop()
{
  if (digitalRead(BUTTON) == PUSHED)      // Read the input pin
  {
    DELAY = analogRead(TRIMMER) * 5;      // (5V=1024) * 5 -> 5V=5120ms
    timeStamp = millis();                 // Reset timestamp
  }
  else if (timeStamp == DELAY)        // Check if delay finished
  {
    digitalWrite(LED, 1);          // Output goes low
    delay(1000);                    // Time of the output pulse
    digitalWrite(LED, 0);          // Output goes high
  }
}
Mais rien ne se passe... la sorite ne s'active pas...
Titre: Re : Impulsion temporisée avec Attiny 85
Posté par: Fantasio le octobre 08, 2020, 05:30:13 pm
Bonjour Yann

J'ai repris ton programme et modifié en insérant la partie monostable.
Il fonctionne sur Arduino et compatible avec un Attiny85.
Quelques points importants:
-la commande se fait par l'arrivée d'une masse sur la pin3
-la durée de l'état haut de la sortie en pin2 peut être modifiée si besoin.  (int dureePulse = 2000; )

const byte TRIMMER = A2;                 // Potentiometer connected to ADC2
const byte LED = 2;                      // LED connected to I/O pin 2
const byte BUTTON = 3;                   // pushbutton connected to I/O pin 3
 
unsigned long tempo ;                 // This value is set by the trimer
unsigned long debut_tempo;
int dureePulse = 2000;                // durée allumage LED a modifier si besoin
byte dernier_appui;
byte etatMonostable;
                 

void setup()
{
  pinMode(LED, OUTPUT);                 // Sets the digital pin as output
  pinMode(BUTTON, INPUT_PULLUP);        // Sets the digital pin as input
  byte dernier_appui = digitalRead(BUTTON); // au démarrage =1
}
void loop()
{
  byte appui = digitalRead(BUTTON);         // au démarrage =1
  tempo = analogRead(TRIMMER) * 5;        // (5V=1024) * 5 -> 5V=5120ms
   
  if (!appui)                               // si il est appuyé alors appui = 0 et !appui =1
  {             
   
    if (appui != dernier_appui)         //
    { 
      etatMonostable = 1;   
      debut_tempo = millis();
    }
  }
  dernier_appui = appui;
  if (etatMonostable)
  {
    if (millis() - debut_tempo >= tempo)
    {
      digitalWrite(LED, HIGH);
      delay (dureePulse);
      digitalWrite(LED, LOW);
      etatMonostable = 0;     
    }
  }
}

Bonne continuation
 
Titre: Re : Impulsion temporisée avec Attiny 85
Posté par: Yann le octobre 09, 2020, 12:11:43 pm
Bonjour Fantasio,

Merci beaucoup pour le code que je viens de tester et qui fonctionne. Franchement je n'aurai vraiment pas trouvé tout seul ou après plusieurs jours et quelques cachets d'Aspirine...!

Merci encore!
Titre: Re : Impulsion temporisée avec Attiny 85
Posté par: Yann le octobre 09, 2020, 12:48:46 pm
Re,

Petite question concernant le code:

Y'a t'il moyen de clarifier ou simplifier l'imbrication des IF ? avec une structure ELSE IF...?

Merci pour vos éclaircissements.
Titre: Re : Impulsion temporisée avec Attiny 85
Posté par: Fantasio le octobre 09, 2020, 02:26:38 pm
Bonjour Yann

Content que ce programme te convienne.

Travaillant souvent sur les Attiny85, effectivement pour les constantes, en particulier pour les pins, je préfère utiliser byte pour économiser de la mémoire.

Pour "if(etatmonostable) c'est exactement ça!

Concernant la simplification, étant encore débutant, je pense que quelqu'un de plus expérimenté pourrait te faire...

Bonne continuation
Titre: Re : Impulsion temporisée avec Attiny 85
Posté par: Tony04 le octobre 09, 2020, 03:07:47 pm
Bonjour Fantasio,

voici comment simplifier le second if en faisant bien attention aux parenthèses, il suffit d'appliquer la même syntaxe pour le premier if:
  if (etatMonostable and (millis() - debut_tempo >= tempo))
  {
digitalWrite(LED, HIGH);
delay (dureePulse);
digitalWrite(LED, LOW);
etatMonostable = 0;     
  }

Cordialement
Antoine
Titre: Re : Re : Impulsion temporisée avec Attiny 85
Posté par: Thierry le octobre 09, 2020, 03:21:43 pm
Y'a t'il moyen de clarifier ou simplifier l'imbrication des IF ? avec une structure ELSE IF...?

On peut directement spécifier if (etatMonostable > 0) ou if (etatMonostable == 1) à la place de if (etatMonostable)mais grouper les deux tests en un seul force à réfléchir en lisant le code, et n'améliore ni la vitesse de traitement, ni l'occupation mémoire...
Titre: Re : Impulsion temporisée avec Attiny 85
Posté par: Fantasio le octobre 09, 2020, 03:21:54 pm
Merci Antoine pour ton aide.

Je suis honteux de n'avoir pas pensé à cela. Comme quoi, moi aussi, j'ai encore beaucoup à apprendre!
C'est aussi tout le bénéfice d'être inscrit sur ce forum...

Bonne continuation à toi
Titre: Re : Impulsion temporisée avec Attiny 85
Posté par: Fantasio le octobre 09, 2020, 03:23:39 pm
...et à Thierry également :)
Titre: Re : Re : Impulsion temporisée avec Attiny 85
Posté par: Tony04 le octobre 09, 2020, 04:54:44 pm
Je suis honteux de n'avoir pas pensé à cela

Le tout dernier sentiment à avoir sur notre site favori  :) .
Titre: Re : Impulsion temporisée avec Attiny 85
Posté par: Fantasio le octobre 09, 2020, 05:21:18 pm
@Antoine

Suite à ta réponse:
  if (etatMonostable and (millis() - debut_tempo >= tempo))
 ...
Tu utilises "and" et pas "&&" pour l'instruction "et logique" (comme le précise le langage Arduino), et cela ne provoque aucune erreur retournée par l'IDE. Donc "and" est valide.

Ma question est la suivante: D'autres instructions de ce type seraient elles alors compatibles avec le langage de l'Arduino?
Titre: Re : Impulsion temporisée avec Attiny 85
Posté par: Tony04 le octobre 09, 2020, 08:55:17 pm
à ma connaissance le or à la place du || mais les 2 (and et or) à confirmer par les "pros"
Titre: Re : Impulsion temporisée avec Attiny 85
Posté par: Thierry le octobre 10, 2020, 08:26:51 pm
Et à ma connaissance, le C ou le C++ n'ont jamais permis d'utiliser des mots clé 'and' et 'or' qui sont plutôt des mots clé du Basic ou du VB... Je serais curieux de voir un code qui se compile bien avec ça.
Titre: Re : Impulsion temporisée avec Attiny 85
Posté par: Fantasio le octobre 10, 2020, 11:17:01 pm
... Je serais curieux de voir un code qui se compile bien avec ça.

Essaye celui ci testé sur UNO avec l'IDE 1.8.10:
int x = 1;
int y = 2;


void setup()
{
  pinMode(LED_BUILTIN, OUTPUT);
}

void loop()
{
 if (x == 1 and y == 2)
  {
    digitalWrite(LED_BUILTIN, HIGH);
    delay (1000);

La LED clignote bien ;D
Titre: Re : Impulsion temporisée avec Attiny 85
Posté par: Tony04 le octobre 10, 2020, 11:26:26 pm
Bonsoir Thierry,

je viens d'avoir un petit choc avec ta réponse.
Il est vrai que je viens du monde du basic puis de l'assembleur mais depuis une dizaine d'année de pratique de l'Arduino et quelques milliers de lignes de code j'ai toujours utilisé les "and" et "or" sans n'avoir jamais rencontré de problèmes.

Je viens de faire le test de ce que j'ai proposé à Fantasio avec le code suivant (3 possibilités) sur un UNO:

const byte led = 13;
const byte button = 2;
unsigned long interval = 5000;
unsigned long startTime;
byte lastPress;

void setup()
{
  pinMode(led, OUTPUT);
  pinMode(button, INPUT_PULLUP);
  Serial.begin (38400);
}

void loop()
{
  byte pressed = digitalRead(button);
  Serial.print("pressed = ");
  Serial.println(pressed);
/*
// version d'origine
  if (pressed)
  {
    if (pressed != lastPress)
    {
      digitalWrite(led, HIGH);
      startTime = millis();
    }
  }
  lastPress = pressed;
  if (digitalRead(led))
  {
    if (millis() - startTime >= interval)

    {
      digitalWrite(led, LOW);
    }
  }
*/
// version Antoine
  if (pressed and (pressed != lastPress))
  {
digitalWrite(led, HIGH);
startTime = millis();
  }
  lastPress = pressed;
  if (digitalRead(led) and (millis() - startTime >= interval))
  {
    digitalWrite(led, LOW);
  }
/*
// version avec respect du C++
  if (pressed && (pressed != lastPress))
  {
digitalWrite(led, HIGH);
startTime = millis();
  }
  lastPress = pressed;
  if (digitalRead(led) && (millis() - startTime >= interval))
  {
    digitalWrite(led, LOW);
  }
*/
}

Et il se trouve que les 3 possibilités fonctionnent exactement de la même manière.

Alors où se cache le loup ?
Est-ce que le C++ serait plus permissif que prévu ?

Je suis impatient d'en apprendre d'avantage sur ce sujet et en remercie par avance tous les participants.

Bien cordialement
Antoine

Titre: Re : Impulsion temporisée avec Attiny 85
Posté par: Thierry le octobre 11, 2020, 01:19:32 pm
Bonjour,

J'avoue, je ne connaissais pas cette syntaxe, mais il semble qu'elle soit effectivement disponible (https://en.cppreference.com/w/cpp/keyword). Autant pour  moi.
Titre: Re : Impulsion temporisée avec Attiny 85
Posté par: Yann le octobre 11, 2020, 03:58:38 pm
Bonjour,

Je reviens sur le sujet d'origine et l'optimisation du code. Merci à Antoine et Thierry pour leurs propositions. Je vais les tester et les intégrer.