Module FlashLed, landing_light

Modérateur : Dehas

Avatar du membre
manu_86
Quadricopter
Messages : 205
Enregistré le : mer. 9 oct. 2013 11:26
Réputation : 0

Module FlashLed, landing_light

Message non lu par manu_86 »

Salut,
ayant aimé la bidouille de Will autour du Attiny, j'ai intégré son code au mien pour avoir un petit module plus "rigolo" que "méga fonctionnel".

J'avais une carte I2C_NAV_GPS et un SONAR SR04 qui ne me servait plus depuis que je suis passé en MegaPirate...
En revanche la fonction LandingLight du MultiWii me manquait un peu...

La carte I2C_NAV_GPS intègre un µc le 328P, les broches d'interface avec le SONAR sont déjà existantes (pas besoin de soudures), et des entrées/sorties sont dispo sur le connecteur ISP...après si on est hyper minutieux on peut aussi venir souder sur le µc d'autres entrées-sorties.
I2C_NAV_GPS.jpg
Donc là il s'agit juste d'une bidouille avec le SONAR connecté, une LED (on peut utiliser l'étage de puissance à base de transistor donné par Will), et un buzzer (même punition que pour les LEDs)...

Déjà voilà le PinOut du µc embarqué sur la carte I2C_NAV_GPS :
atmega328-tqfp-arduino-pinout.jpg
Voici le Pinout de la prise ISP (6broches) dispo sur la carte :
ISP.jpg
à noter que dans le code, j'ai "câbler" :
- la broche MOSI pour : l'entrée radio
- la broche MISO pour : la sortie commande buzzer (attention ce n'est pas une sortie de puissance : ne pas connecter le buzzer directement)
- La broche SCK était déjà câblé sur la sortie Led (en parallèle une LED est montée d'origine sur le PCB de la carte)

Il faudra aussi ajouter la librairie NewPing dans les librairies de l'environnement ARDUINO, pour gérer sans problème le SONAR.

voici la librairie :
NewPing.7z
Le code est fait de la façon suivante :

Si le signal venant de la radio (qui doit être compris entre 1000ms et 2000ms) est inexistant ou <800ms : flashage spécifique de la Led et déclenchement buzzer.

Si le signal venant de la radio est compris entre 1350 et 1650ms (position milieu d'un inter 3 positions) et que l'altitude est supérieure au seuil du "landing_led": flashage différent de la led...

Si le signal venant de la radio est supérieur à 1650ms (position haute d'un inter 3 positions) ou que l'on se situe en dessous du seuil de "landing_led" : Led allumé full.

Si le signal est entre 800ms et 1350ms (position basse de l'inter 3 positions) : on ne fait rien...

Pour changer le seuil de déclenchement du "landing_led" il faut modifier la valeur de :

"
int landing_alt = 150; //initialisation variable utilisateur pour seuil allumage fixe en fonction de l altitude en cm (150 = 150cm)
"

Ci joint le code qui va bien.

Code : Tout sélectionner

/*
    RC LED CONTROL
    Contrôlez une LED via une voie de la radiocommande
    3 états: OFF/ON Blink/ON full
    Jouez avec les valeurs ch1 (entre 1000 et 2000) pour déterminer la position des 3 états sur la voie
    Jouez avec les valeurs de délais pour modifier l'état ON Blink (séquence de flash)
    DATE 17/02/2015 --> By Willmodelisme
*/

//PinOut de la carte I2C_NAV_GPS
/*        pinMode(A2, OUTPUT);    //ECHO_PIN      -- PC2  -- A2      -- dispo sans soudure sur la carte I2C_NAV_GPS
          pinMode(A3, OUTPUT);    //TRIGGER_PIN   -- PC3  -- A3      -- dispo sans soudure sur la carte I2C_NAV_GPS
          pinMode(A4, OUTPUT);    //SDA_PIN       -- PC4  -- A4  I2C
          pinMode(A5, OUTPUT);    //SCL_PIN       -- PC5  -- A5  I2C
          pinMode(11, OUTPUT);   //MOSI_PIN      -- PB3  -- D11      -- dispo sans soudure sur la carte I2C_NAV_GPS
          pinMode(12, OUTPUT);   //MISO_PIN      -- PB4  -- D12      -- dispo sans soudure sur la carte I2C_NAV_GPS
          pinMode(13, OUTPUT);   //SCK_PIN       -- PB5  -- D13      -- dispo sans soudure sur la carte I2C_NAV_GPS      */

//ajout de la fonctionnalité SONAR pour passer en full eclairage en dessous d'une certaine altitude
        
#include <NewPing.h>

#define TRIGGER_PIN  A3        // Arduino pin tied to trigger pin on the ultrasonic sensor (A3 for I2C_NAV_GPS card).
#define ECHO_PIN     A2        // Arduino pin tied to echo pin on the ultrasonic sensor (A2 for I2C_NAV_GPS card).
#define MAX_DISTANCE 350       // Maximum distance we want to ping for (in centimeters). Maximum sensor distance is rated at 400-500cm.

NewPing sonar(TRIGGER_PIN, ECHO_PIN, MAX_DISTANCE);         // NewPing setup of pins and maximum distance.
        
int ch1 = 0;            //initialisation variable largeur creneau voie rx (en ms)
int led = 13;           //set the LED on on the I2C_NAV_GPS card and SCK_PIN (PIN number = 13)
int rx = 11;            //rx on pin D11 (MOSI_PIN) -- (PIN number = 11)
int buzzer = 12;        //buzzer on pin D12 (MISO_PIN) -- (PIN number = 12)
int alt_value = 0;      //intialisation variable altitude mesuree en cm
int landing_alt = 150;   //initialisation variable utilisateur pour seuil alumage fixe en fonction de l altitude en cm (150 = 150cm)
       
void setup() 
        {
          pinMode(rx, INPUT);           //ici affectation de la broche D11 (MOSI_PIN) en entree radio
          pinMode(led, OUTPUT);         //ici affectation de la broche digital 13 (SCK_PIN) en sortie LED sur la carte I2C_NAV_GPS
          pinMode(buzzer, OUTPUT);      //ici affectation de la broche D12 (MISO_PIN) en sortie Buzzer
          //Serial.begin(115200);         // Open serial monitor at 115200 baud to see ping results. //only use for debug
        }

void loop() 
        {
         //mesure de la distance avec le SONAR
         delay(50);                              // Wait 50ms between pings (about 20 pings/sec). 29ms should be the shortest delay between pings.
         unsigned int uS = sonar.ping();         // Send ping, get ping time in microseconds (uS).
         if (uS <= 700*58)                       // test si valeur invalide car si altitude=0 ou altitude=infini meme resultat ... alt_value=0
             {
                   alt_value = uS / US_ROUNDTRIP_CM ;     // Convert ping time to distance in cm
             }
         else if (uS > 700*58)                   // si valeur tend vers infini ... alt_value=700
             {
                   alt_value = 700;
             }
         //Serial.print("Distance: ");            //only use for debug
         //Serial.print(alt_value);               //only use for debug
         //Serial.println("cm");                  //only use for debug

         //acquisition creneau radio
         ch1 = pulseIn(rx, HIGH, 25000);    

         //detection de l'absence d'un creneau radio valide (<800ms), declenchement buzzer, flash LED specifique
         if (ch1<800){
                // pas de creneau radio valide donc pb
                digitalWrite(buzzer, HIGH);        //buzzer alimente jusqu au retour radio
                //séquence de flash failsafe, jouez a modifiez les valeurs de delay du ON et du OFF
                digitalWrite(led, HIGH);
                delay(100);
                digitalWrite(led, LOW);          //flashage en cas de failsafe
                delay(100);
                digitalWrite(led, HIGH);
                delay(100);
                digitalWrite(led, LOW);
                delay(100);
                digitalWrite(led, HIGH);
                delay(100);
                digitalWrite(led, LOW);
                delay(400);
         }
        
        //detection valeur creneau autour de 1500ms : defini ici pour la position milieu sur un inter 3 position, ET altitude superieure landing_alt
        //donc flashage si inter 3 positions au milieu et altitude superieure à landing_alt
        //quelque part condition de vol normale :)
        if ((ch1>1350) && (ch1<1650) && (alt_value>landing_alt))
         {
                digitalWrite(buzzer, LOW);        //buzzer eteint
                //séquence de flash, jouez a modifiez les valeurs de delay du ON et du OFF
                digitalWrite(led, HIGH);
                delay(40);
                digitalWrite(led, LOW);
                delay(50);
                digitalWrite(led, HIGH);
                delay(40);
                digitalWrite(led, LOW);
                delay(50);
                digitalWrite(led, HIGH);
                delay(40);
                digitalWrite(led, LOW);
                delay(800);
         }

        //detection valeur creneau au dessus de 1650ms : defini ici pour la position haute sur un inter 3 positions, OU altitude mesuree inferieure landing_alt
        //donc allumage fixe lors de l atterissage, ou allumage fixe manuel
          if ((ch1>1650) || (alt_value<landing_alt)){    
                 digitalWrite(buzzer, LOW);        //buzzer eteint
                 digitalWrite(led, HIGH);      //led full
                 delay(800);
          }
        //règle la position de la voie pour un autre état de la led, ici OFF et inter 3P en position basse (boucle vide led éteinte)...mais landing_light fonctionnel
          else {
                 digitalWrite(led, LOW);      //led full
               }
        }
Je vais faire une vidéo pour illustrer le fonctionnement du montage.

@+ [yahoo.gif]
Vous n’avez pas les permissions nécessaires pour voir les fichiers joints à ce message.


Répondre

Retourner vers « Modules et Montages DIY »