Controleur de Lumière

Révision de 22 avril 2014 à 21:58 par Cedric (discussion | contributions) (interruptions)

Révision de 22 avril 2014 à 21:58 par Cedric (discussion | contributions) (interruptions)


Une centrale de phares clignotants pour velomobile

JoliAfficheur.jpg

Contributeur·ice·s

Statut du projet

Prototype

Statut de la publication

License

CC-by-sa-3.0

Inspiration

Fichiers source

Machines

Matériaux

Lien





Sommaire

Résumé

Le travail de cette semaine à la fabacademy est de construire un circuit actionneur, et de le piloter avec un microcontrolleur.

J'en profite pour réaliser une centrale phares/clignotants pour mon vélomobile.

Pour exploiter un peu plus les possibilités du tiny (car sans ça j'aurais put fair tout ça sans microcontroleur), je vais créer des fonctionnalités de type code/phares (en PWM) et clignotants/warnings

Design du circuit

J'utilise FabModules pour dessiner le circuit  : make_cad_png

Il s'agit d'un ATTINY44, piloté par 3 interrupteurs, pour actionner 3 mosfets.

La carte est pourvue d'un régulateur de tension, ainsi, les lumières pourront être alimentés à différentes tensions.

D'après le datasheet du mosfet (N) , et du régulateur on peut alimenter le circuit jusquà 30V

Fichier:Light.central.44.cad

Light.central.traces.name.png Light.central.44.interior.holes.png

ATTENTION il n'ya pas de diode à l'entrée du régulateur ! si on branche l'alim à l'envers, il brule !

Light.central.board.png

Liste des composants

identifiant composant quantité
D1,D2,D3 Leds rouge 1206 cms 3
R1 Résistance 1206 cms 10Ko 1
R2,R3,R4 Résistance 1206 cms 100 Ohms 3
C1 condensateur 1206 cms 1uF 1
IC1 ATtiny44SSU 1
IC2 régulateur 5V/100mA LM3480IM3-5.0 1
T1,T2,T3 Mosfets N 30V 1.7A 3
J1 Connecteur ISP 6 broches 1
J2,J3,J4,J5 borniers à vis pas de 3.5mm 4

Fabrication

avec la modela..

Code

Je vais coder en C, en partant de l'exemple hello.video car j'ai le même tiny avec l'horloge interne

fonctionnement désiré

en entrée

3 interrupteurs sont câblés avec le connecteur ISP aux entrées PA4, PA5 et PA6 reglées en pullup


1 bouton poussoir (PA4) : à chaque relâchement du bouton on change de mode pour les phares : code > phares > éteint

pendant l'appui, on est en plein phares (pour faire des appels de phares)


2 interrrupteurs monostables (PA5 et PA6) : les clignotants

si on déclenche un clignotant alors que le bouton des phares est allumé, on passe en warnings.


en sortie

Les pins PA0 PA1 PA2 sont câblé sur les mosfets


le code

PA1 utilisera un PWM pour régler l'intensité des phares

Premier test

Pour valider le circuit

j'ai fait un code simple qui fait clignoter les sorties

Fichier:Hello.blink.3.44.zip

J'avais commencé avec une alimentation à découpage de récupération, mais le microcontroleur ne répondait pas bien

Finalement, j'ai mis une pile 9V et ça fonctionne bien

interruptions

Les clignotants...clignoteront, donc, ça serai judicieux d'utiliser des interruptions pour détecter les changements des boutons même pendant le delay de clignotement.

quelques ressources à propos des interruptions sur le tiny :

http://www.avrfreaks.net/index.php?name=PNphpBB2&file=viewtopic&t=105493

http://www.nongnu.org/avr-libc/user-manual/group__avr__interrupts.html


dans le datasheet, on voit que les trois entrées des boutons sont sur le même port d'interruption


J'ai pour l'instant pas implémenté la fonction warning.

Pour mettre en action les interruptions, j'ai renseigné la fonction ISR(PCINT0_vect) qui est appelée à chaque interruption sur les pins concernés.

Il faut donc écrire dans cette fonction les tests et les actions à effectuer en cas d'actionnement d'un des pins surveillés

ISR(PCINT0_vect) // interrupt service routine { // called when PCINT0 changes state


 /////////////BLINKERS
 if((!(button_pins & LeftBton_pin)) && blink_mode==0 ){      
     blink_mode=1;
 }
 
  if((!(button_pins & RightBton_pin)) && blink_mode==0  ){
     blink_mode=2;
 }
   
if((button_pins & RightBton_pin) && blink_mode==2){
    blink_mode=0;
    }
      
   if((button_pins & LeftBton_pin) && blink_mode==1){
    blink_mode=0;
    }
   
   
   /////////////////LIGHT
   if(!(button_pins & LightBton_pin) && btonLightState==0){
       //LightBton_pin rise up
       //
       btonLightState=1;
   }
   if((button_pins & LightBton_pin) && btonLightState==1){
       //LightBton_pin rise down
       btonLightState=0;
       //change light mode
       if(light_mode<2) {
           light_mode+=1;
       }else{
           light_mode=0;
       }       
   }
 
 
  return;

}


Ensuite, dans le début du programme, j'ai activé le port d'interruption lié aux pins 0 à 7, soit PCIE0

Puis réglé le masque de surveillance sur les pins qui m'interressent (pour ne pas que la routine se déclanche lorsque les sorties sont activées

enfin, j'ai activé le mode interrupt :

   GIMSK |= (1<<PCIE0);                             // enable PCIE0 interrupt 
   PCMSK0 = (1<<PCINT4)|(1<<PCINT5)|(1<<PCINT6);   // pin change mask: listen to portA 4, 5 and 6
   sei();				           //Enable Global Interrupt

pwm

pour régler l'intensité des lumières je compte utiliser du PWM

hélas, les sorties que j'ai utilisées n'on pas la fonction hardware

heureusement, on peut fabriquer un pwm en soft :

http://www.kobakant.at/DIY/?p=3393

La difficulté est de faire du PWM sur les phares sans perdre la temporisation des clignotants

le principe est le suivant :

Blink_delay correspond à la durée de clignotement des clignotants


  • on allume les clignotants si besoin
  • pendant 10 cycles d'une durée de (Blink_delay/10) on allume (et on étient si besoin) les phares
  • on étiend les clignotants
  • pendant 10 cycles d'une durée de (Blink_delay/10) on allume (et on étient si besoin) les phares


le code de ce pwm du pauvre est :

void poormanPWM(){//for lights int i;

    for (i=0; i<10; i++) {
          if(light_mode!=0){
              set(Lights_port,Light_pin); // Turn light on if necessary
          }else{
              clear(Lights_port,Light_pin);//else shut it
              }
          long_delay_ms(blink_delay/20);
          if(light_mode==1) clear(Lights_port,Light_pin); // Turn light off half time in low mode
          long_delay_ms(blink_delay/20);
          
       }
   

}