[Programmation] robot , ATmega328 , interruptions , temporisation
Répondre à la discussion
Affichage des résultats 1 à 8 sur 8

robot , ATmega328 , interruptions , temporisation



  1. #1
    juju_du_26

    robot , ATmega328 , interruptions , temporisation


    ------

    Bonjour a tous
    Je suis sur la réalisation d' un robot a 2 roues évitant les obstacles , avec capteurs IR , capteur ultra son , ...
    J' utilise un ATmega328 et programme avec le soft Arduino ...

    J 'ai des capteurs détectant la présence / absence du sol devant les roues .
    Les capteurs en eux même fonctionnent bien ( sort env. 1V en présence du sol , et 4V dans le vide )
    J ' ai connecté ses capteurs sur les entrées digital 2 et 3 , pour utiliser les interruptions INT0 , INT1

    Code:
    const int SOL_D = 2 ;      // Capteur Sol Avant Droit sur entrée digitale 2
    const int SOL_G = 3 ;      // Capteur Sol Avant Gauche sur entrée digitale 3
    Puis dans le setup()

    Code:
     pinMode ( SOL_D , INPUT) ;                                // entree capteur presence sol a droite
     attachInterrupt ( 0 , Capteurs_Sol , RISING ) ;     // valid. interruption INT0
     pinMode ( SOL_G , INPUT) ;                                 // entree capteur presence sol a gauche
     attachInterrupt ( 1 , Capteurs_Sol , RISING ) ;      // valid. interruption INT1
    Dans le programme principal , pour l' instant je ne fais que Avancer .

    Je voudrais que lorsque un des capteurs détecte le vide , le robot recule immediatement
    pendant un certain temp ( encore a déterminer ) puis tourne sur place .
    J'ai cru comprendre que les tempo ( delay() , millis() ... ) ne fonctionnent pas dans les interruptions
    J' ai donc essayé une boucle For () comme ceci

    Code:
    void Capteurs_Sol()  
    {
     Recule () ;
     for ( int i=0 ; i<=50 ; i++ )
         {
          Recule () ;
          }
    }
    Le programme entre bien dans la boucle d' interruption ( moteurs en arrière ) mais reste la indéfiniment .
    Comment lui faire durer cette boucle ( marche arrière ) seulement un certain temp
    avant de revenir au programme principal ?

    Merci , bonne journée

    -----

  2. #2
    juju_du_26

    Re : robot , ATmega328 , interruptions , temporisation

    Bonjour

    Comment faire exécuter une action pendant un certain temp ( ou un nombre de fois ) pendant une interruption ?
    On peut toujours trouver une entourloupe externe mais c'est pas top .

    Je précise que les 2 moteurs sont contrôlés en pwm autant en marche avant qu' en arrière

    Merci

  3. #3
    antek

    Re : robot , ATmega328 , interruptions , temporisation

    Citation Envoyé par juju_du_26 Voir le message
    Comment faire exécuter une action pendant un certain temp ( ou un nombre de fois ) pendant une interruption ?
    On sort le plus vite possible d'un programme de traitement des interruptions.
    On positionne des variables pour effectuer les actions en dehors.

  4. #4
    juju_du_26

    Re : robot , ATmega328 , interruptions , temporisation

    Citation Envoyé par antek Voir le message
    On positionne des variables pour effectuer les actions en dehors.
    Merci de ta réponse .
    Cela veut dire aussi que dans le loop() , il faut venir scruter en permanence ses variables ?

    Sinon , je pensais " transformer " les fronts montants des capteurs en niveau bas temporisés en externes
    ( transistors , capas ... ) et du coup faire

    Code:
     pinMode ( SOL_D , INPUT) ;                                    // entree capteur presence sol
     attachInterrupt( 0 , Capteurs_Sol , LOW ) ;              // interruption sur NIVEAU BAS
     pinMode ( SOL_G , INPUT) ;                                   // entree capteur presence sol
     attachInterrupt( 1 , Capteurs_Sol , LOW ) ;              // interruption sur NIVEAU BAS
    Et dans la boucle d' interruption , je me contente de reculer en tournant .
    Je n' ai plus besoin de m' occuper de tempo .

    Bonne aprem

  5. A voir en vidéo sur Futura
  6. #5
    Vincent PETIT
    Animateur Électronique

    Re : robot , ATmega328 , interruptions , temporisation

    Salut,
    antek t'invite a réaliser une machine a état.


    Ça ressemble a un truc comme ça. Une variable globale qui est modifiée par un programme d'interruption, dans le programme principal on regarde en boucle cette variable globale et suivant sa valeur on exécute une action.
    Tu peux combiner des actions, modifier l'état de la variable globale dans la machine a état etc.... bref
    Code:
    fonction_interruption_appui_bouton_avance(void)
    {
    	etat = 1;
    }
    
    fonction_interruption_detection_vide(void)
    {
    	etat = 4;
    }
    
    
    recule_un_certain_temps(void)
    {
    	recule();
    	tempo(10s);
    }
    
    int main (void) 
    {
    	...
    	while(1) 
    	{
    		switch (etat)
    		{
    			case 0 : stop (); break; 
    
    			case 1 : avance(); break;
    	
    			case 2 : recule(); break;
    
    			case 3 : avance_un_certain_temps(); break;
    
    			case 4 : recule_un_certain_temps(); break;
    
    			default: etat = 0;
    
    			etat = 0;
    
       		}
    	}
    }

  7. #6
    juju_du_26

    Re : robot , ATmega328 , interruptions , temporisation

    Salut !
    Ah oui !! Merci Vincent PETIT et toi aussi antek
    Je n' avais pas pensé au " Switch / case ... "

    Si j'ai bien compris , a chaque action sur le robot , obstacle devant , présence / absence de sol , etc
    on modifie la variable ( etat dans ton exemple ) et en fonction de cette variable , on viens exécuter
    le case0 , case 1 ..... Très bonne idée !!

    Un grand merci a vous deux
    Bonne soiree

  8. #7
    Vincent PETIT
    Animateur Électronique

    Re : robot , ATmega328 , interruptions , temporisation

    L'avantage d'une machine a état, c'est la facilité à retranscrire un organigramme (ton algo) en programme.
    Tu as cas essayer et tu verra

  9. #8
    juju_du_26

    Re : robot , ATmega328 , interruptions , temporisation

    Pour ceux que ca intéresse , je met une photo ..
    Encore merci
    Images attachées Images attachées  

Discussions similaires

  1. [Numérique] Pin AREF arduino atmega328
    Par invite5b777b38 dans le forum Électronique
    Réponses: 3
    Dernier message: 23/05/2016, 06h23
  2. Atmega328 + ACS712
    Par invite106ce3b0 dans le forum Électronique
    Réponses: 4
    Dernier message: 31/10/2013, 16h48
  3. Utilisation de PCINT sur ATmega328
    Par invitea2fbcca3 dans le forum Électronique
    Réponses: 3
    Dernier message: 09/08/2012, 11h18
  4. Chargement Atmega328
    Par invitedd1dd413 dans le forum Électronique
    Réponses: 5
    Dernier message: 19/12/2011, 18h47
  5. Interruption ATmega328
    Par invitea2fbcca3 dans le forum Électronique
    Réponses: 4
    Dernier message: 10/10/2011, 11h32
Dans la rubrique Tech de Futura, découvrez nos comparatifs produits sur l'informatique et les technologies : imprimantes laser couleur, casques audio, chaises gamer...