Auteur Sujet: Impulsion temporisée avec Attiny 85  (Lu 23276 fois)

Yann

  • Newbie
  • *
  • Messages: 10
    • Voir le profil
    • La technique ferroviaire en modélisme
Impulsion temporisée avec Attiny 85
« 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.
Meilleures salutations
Yann

Fantasio

  • Newbie
  • *
  • Messages: 40
    • Voir le profil
Re : Impulsion temporisée avec Attiny 85
« Réponse #1 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...
     

Fantasio

  • Newbie
  • *
  • Messages: 40
    • Voir le profil
Re : Impulsion temporisée avec Attiny 85
« Réponse #2 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

msport

  • Global Moderator
  • Hero Member
  • *****
  • Messages: 2217
  • HO avec DCC++ en DIY Réseaux très éphémères
    • Voir le profil
Re : Impulsion temporisée avec Attiny 85
« Réponse #3 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.
« Modifié: octobre 07, 2020, 04:11:03 pm par msport »
Cordialement

Yann

  • Newbie
  • *
  • Messages: 10
    • Voir le profil
    • La technique ferroviaire en modélisme
Re : Re : Impulsion temporisée avec Attiny 85
« Réponse #4 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
}
« Modifié: octobre 07, 2020, 08:50:24 pm par Yann »
Meilleures salutations
Yann

Fantasio

  • Newbie
  • *
  • Messages: 40
    • Voir le profil
Re : Impulsion temporisée avec Attiny 85
« Réponse #5 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. ;)

Yann

  • Newbie
  • *
  • Messages: 10
    • Voir le profil
    • La technique ferroviaire en modélisme
Re : Re : Impulsion temporisée avec Attiny 85
« Réponse #6 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.
Meilleures salutations
Yann

msport

  • Global Moderator
  • Hero Member
  • *****
  • Messages: 2217
  • HO avec DCC++ en DIY Réseaux très éphémères
    • Voir le profil
Re : Impulsion temporisée avec Attiny 85
« Réponse #7 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 //

...
Cordialement

Yann

  • Newbie
  • *
  • Messages: 10
    • Voir le profil
    • La technique ferroviaire en modélisme
Re : Impulsion temporisée avec Attiny 85
« Réponse #8 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...
Meilleures salutations
Yann

Fantasio

  • Newbie
  • *
  • Messages: 40
    • Voir le profil
Re : Impulsion temporisée avec Attiny 85
« Réponse #9 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
 

Yann

  • Newbie
  • *
  • Messages: 10
    • Voir le profil
    • La technique ferroviaire en modélisme
Re : Impulsion temporisée avec Attiny 85
« Réponse #10 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!
Meilleures salutations
Yann

Yann

  • Newbie
  • *
  • Messages: 10
    • Voir le profil
    • La technique ferroviaire en modélisme
Re : Impulsion temporisée avec Attiny 85
« Réponse #11 le: octobre 09, 2020, 12:48:46 pm »
Re,

Petite question concernant le code:
  • pourquoi déclarer les constantes en byte et non en integer? c'est pour gagner de la place?
  • "if (etatMonostable)" je suppose que dans ce test si "etatMonostable" vaut 0 on n'execute pas ce qu'il y a dans le IF et si il vaut 1 alors on exécute ce qu'il y a dans le IF.

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

Merci pour vos éclaircissements.
« Modifié: octobre 09, 2020, 12:50:46 pm par Yann »
Meilleures salutations
Yann

Fantasio

  • Newbie
  • *
  • Messages: 40
    • Voir le profil
Re : Impulsion temporisée avec Attiny 85
« Réponse #12 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

Tony04

  • Hero Member
  • *****
  • Messages: 569
    • Voir le profil
Re : Impulsion temporisée avec Attiny 85
« Réponse #13 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

Thierry

  • Global Moderator
  • Hero Member
  • *****
  • Messages: 810
    • Voir le profil
Re : Re : Impulsion temporisée avec Attiny 85
« Réponse #14 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...