Mes bricolages électroniques

Mes bricolages électroniques

Velleman MK176 (4 chevrons à leds) avec Trinket (Arduino compatible de AdaFruit)

Il est possible d'utiliser le MK176 avec un Trinket (ou équivalent). Cependant, le kit doit être modifié au niveau de certains composants et des pistes car le µCPU d'origine possède 6 E/S tandis que le Trinket n'en a que 5.

Notez que ces modifications ne permettront plus l'utilisation du µCPU fournie avec le kit!

Il n'est pas possible d'utiliser le kit depuis l'alimentation 5V, les leds étant raccordées sur le 9V.

 

Fonctionnement:

A l'allumage, le chevron 3 s'allume. C'est normal, c'est dut au bootloader du Trinket. Une fois le délai écoulé, les 4 chevrons s'allument (test des leds). Seulement après, le programme est réellement démarré.

L'animation chargée est la dernière qui a été lue (enregistrée en EEPROM).

Pour changer l'animation, appuyer sur le bouton poussoir. L'animation va se mettre en pause le temps de l'appui. Une fois le bouton relaché, l'animation va se terminer et la suivante sera chargée.

Il est possible de changer la vitesse de chaque animation en tournant RV1.

 

Composants à modifier:

A) Supprimer C1, R5, R14 (aux alentours du bouton poussoir).

B) Supprimer C2 et le remplacer par un pontage.

C) Remplacer R16 par une résistance de 560 ohms (Vert-Bleu-Marron).

D) Supprimer IC1 (a vous de voir, remplacez le par des fils, un connecteur, mais le µCPU ne doit pas rester dessus!!! Sinon il y aura conflit entre lui et le Trinket)

Dsc_1010 MOD.jpg 

(Cliquez sur l'image pour l'agrandir)

 

Coté piste: (vue depuis ce coté pour les explications!)

1) Supprimer la piste qui part de la sortie de RV1 (pin du bas) et qui retourne vers une de ses bornes.

2) Relier cette sortie à la borne correspondante de IC1 (colonne de droite, 2ième borne) en mettant une résistance de 130kOhms en série.

3) Ajouter une diode Zener 3,6V entre la borne de RV1 (celle de gauche, qui est maintenant soudée avec une résistance de 560 ohms (voir B au dessus)) et la masse. La Zener se monte à l'envers! Càd que le coté avec le trait noir (coté cathode, -) doit se souder à la borne +5v du potar, donc celle avec la résistance de 560 ohms. L'autre coté se met à la masse (borne de droite de RV1).

4) Supprimer la piste qui part de la 3ième pin de RV1 (borne de droite) et qui va à IC1. Cette pin de RV1 est mise à la masse via le pontage qui remplace C2.

5) Ajouter un socket sur IC1, ou souder des fils vers le Trinket, un connecteur,... Si vous optez pour un socket (comme dans mon cas, il vous faudra créer un adaptateur)

6) Relier le bouton poussoir au +5V (coté de droite).

Note: le cablage de RV1 s’effectue comme dans mon article.

Dsc_1007.jpg

 (Cliquez sur l'image pour l'agrandir)

 

 Exemple pour l'adaptateur:

Trinket MK.jpg

(Cliquez sur l'image pour l'agrandir)

 

Connexion PIC12F <--> Trinket:

Sans titre.jpg

 

Vidéo de démo: ( http://youtu.be/Tv7J71Lzyaw)


 

Code: ! Copier ce code dans un nouveau sketch Arduino pour le lire correctement !

 

  /*#########################################################################
  #                         Velleman MK176: Chevrons                        #
  ###########################################################################
  #Programme de remplacement pour le µCPU du MK176. Ce sketck est conçu pour#
  # un Triket 5V. Notez que le PCB Velleman doit être modifié vu que le     #
  # Trinket n'a que 5 E/S au lieu des 6 utilisées pour le kit. Le bouton et #
  # le potentiomètre sont donc raccordés sur la même entrée analogique via  #
  # l'ajout de quelques composants.                                         #
  #                                                                         #     
  # Afin d'économiser de la place dans le programme et pour le rendre plus  #
  #  compréhensible, les sorties sont commandées en bloc (PORTB=Bxxxxxxxx)  #
  #  au lieu de l'habituel 'digitalWrite'.                                  #
  #                                                                         #    
  #                                                                         #  
  #Par LANDRAIN Arnaud, https://nono7380.blog4ever.com                       #
  #Crée le 25/01/2015. Version: 1.00                                        #
  #Taille: 1.680 octets (max 5.310)                                         #
  #N. de ligne: 338                                                         #
  #CPU: Adafruit Trinket 5V (Attiny 85)                                     #
  #Compatibilité(s): Néant                                                  #  
  #Dernière modification: 03 /02/15                                         #
  #Dernier upload carte : 03 /02/15                                         #  
  #                                                                         #    
  #Remarque(s):                                                             #  
  #                                                                         #
  #                                                                         #    
  #                                                                         #   
  #########N######################O###############N###################O####*/  
 
 
//###########  Declaration librairies  #############
#include <EEPROM.h>            //Gestion EEPROM

//###########     Déclarations variables Entrées  ###########
//Déclaration de port utilisée dans SETUP.
//const byte TR1 = 0;   //Chevron 1
//const byte TR2 = 1;   //Chevron 2 (+led sur Trinket)
//const byte ENT = 2;   //Bouton + potar
//const byte TR3 = 3;   //Chevron 3
//const byte TR4 = 4;   //Chevron 4

//##########  Variables a configurer  ###################
//Néant

//##########  Variables Divers  ###################
byte anim;      //N° animation en cours
int tempo;      //Valeur de la tempo

//############  Initialisations diverses  #####################
//Néant


//###############  SETUP  ##################
void setup() {
//*** Definitions ENTREES & SORTIES ***
  DDRB = B00011011;    //0,1,3,4 en sortie, 2 en entrée
 
//*** Activation(s) IMMEDIATES ***
  PORTB = B00011011;  //Test des leds
  delay(1000);
 
  anim = EEPROM.read(0);  //Charge la dernière animation lue
 
}//Fin Setup



//###############  PROGRAMME PRINCIPAL  ##################
void loop() {
  lireAnim(anim);
}//fin loop

void lireAnim(byte nanim) {  
switch(anim) {
  //Créer une animation:
  //  PORTB = B00010000;  //Allume uniquement le chevron 4 (à droite)
  //  PORTB = B00001000;  //Allume uniquement le chevron 3
  //  PORTB = B00000010;  //Allume uniquement le chevron 2
  //  PORTB = B00000001;  //Allume uniquement le chevron 1  (à gauche)
  //  PORTB = B00010001;  //Allume le chevron 4 et 1 ensemble
  //  lireEntree();       //C'est la routine qui lit le BP et le potentiomètre et qui
                          //détermine la temporisation.
  case 0:
    PORTB = B00010000;  
    lireEntree();
    PORTB = B00001000;
    lireEntree();
    PORTB = B00000010;  
    lireEntree();
    PORTB = B00000001;
    lireEntree();
    break;
  case 1:
    PORTB = B00010000;  
    lireEntree();
    PORTB = B00000000;  
    lireEntree();     
    PORTB = B00001000;
    lireEntree();
    PORTB = B00000000;  
    lireEntree();  
    PORTB = B00000010;  
    lireEntree();
    PORTB = B00000000;  
    lireEntree();  
    PORTB = B00000001;
    lireEntree();
    PORTB = B00000000;  
    lireEntree();      
    break;     
  case 2:
    PORTB = B00000011;  
    lireEntree();
    PORTB = B00011000;  
    lireEntree();
    break;  
  case 3:
    PORTB = B00011010;  
    lireEntree();
    PORTB = B00011001;  
    lireEntree();
    PORTB = B00010011;  
    lireEntree();
    PORTB = B00001011;  
    lireEntree();
    break;
  case 4:
    PORTB = B00010001;  
    lireEntree();
    PORTB = B00000000;  
    lireEntree();
    break;
  case 5:
    PORTB = B00001010;  
    lireEntree();
    PORTB = B00000000;  
    lireEntree();
    break;  
  case 6:
    PORTB = B00011011;  
    lireEntree();
    PORTB = B00000000;  
    lireEntree();
    break;  
  case 7:    //Tétris
    PORTB = B00000000;  
    lireEntree();  
    PORTB = B00010000;  
    lireEntree();
    PORTB = B00001000;  
    lireEntree();
    PORTB = B00000010;  
    lireEntree();
    PORTB = B00000001;  
    lireEntree(); //fin part 1
    PORTB = B00010001;  
    lireEntree();  
    PORTB = B00001001;   
    lireEntree();
    PORTB = B00000011;  
    lireEntree();
    PORTB = B00010011;  
    lireEntree();
    PORTB = B00001011;  
    lireEntree();
    PORTB = B00011011;   
    lireEntree();
    break;
  case 8:  //idemn anim 5 mais avec départ
    PORTB = B00000000;  
    lireEntree();  
    PORTB = B00010000;  
    lireEntree();
    PORTB = B00001000;  
    lireEntree();
    PORTB = B00000010;  
    lireEntree();
    PORTB = B00000001;  
    lireEntree(); //fin part 1
    PORTB = B00010001;  
    lireEntree();  
    PORTB = B00001001;   
    lireEntree();
    PORTB = B00000011;  
    lireEntree();
    PORTB = B00010011;  
    lireEntree();
    PORTB = B00001011;  
    lireEntree();
    PORTB = B00011011;   
    lireEntree();
    PORTB = B00011010;  
    lireEntree();  
    PORTB = B00011001;  
    lireEntree();
    PORTB = B00011000;  
    lireEntree();
    PORTB = B00010010;  
    lireEntree();
    PORTB = B00010001;  
    lireEntree();
    PORTB = B00010000;  
    lireEntree();  
    PORTB = B00001000;   
    lireEntree();   
    PORTB = B00000010;   
    lireEntree();   
    PORTB = B00000001;   
    lireEntree();      
    PORTB = B00000000;   
    lireEntree();    
    break;
  case 9:
    PORTB = B00001010;  
    lireEntree();   
    PORTB = B00010001;  
    lireEntree();
    break;
  case 10:
    PORTB = B00010001;  
    lireEntree();
    PORTB = B00000000;  
    lireEntree();   
    PORTB = B00001010;  
    lireEntree();
    PORTB = B00000000;  
    lireEntree();
    break;
  case 11:
    PORTB = B00001001;  
    lireEntree();
    PORTB = B00010010;  
    lireEntree();
    break;
  case 12:
    PORTB = B00011011;  
    lireEntree();
    lireEntree();
    lireEntree();
    PORTB = B00000000;  
    lireEntree();
    PORTB = B00011011;  
    lireEntree();
    PORTB = B00000000;  
    lireEntree();  
    PORTB = B00011011;  
    lireEntree();
    PORTB = B00000000;  
    lireEntree();
    break;
  case 13:
    PORTB = B00000000;  
    lireEntree();   
    PORTB = B00010000;    
    lireEntree();
    PORTB = B00011000;  
    lireEntree();   
    PORTB = B00011010;  
    lireEntree();   
    PORTB = B00011011;  
    lireEntree();   
    PORTB = B00000000;  
    lireEntree();    
    PORTB = B00011011;  
    lireEntree();  
    PORTB = B00000000;  
    lireEntree();
    PORTB = B00011011;  
    lireEntree();     
    break;
  case 14:
    PORTB = B00000000;  
    lireEntree();   
    PORTB = B00010000;    
    lireEntree();
    PORTB = B00011000;  
    lireEntree();   
    PORTB = B00011010;  
    lireEntree();   
    PORTB = B00011011;  
    lireEntree();   
    PORTB = B00001011;  
    lireEntree();   
    PORTB = B00000011;    
    lireEntree();
    PORTB = B00000001;  
    lireEntree();     
    break;
  case 15:
    PORTB = B00000000;  
    lireEntree();   
    PORTB = B00010000;  
    lireEntree();   
    PORTB = B00011000;    
    lireEntree();
    PORTB = B00011010;  
    lireEntree();   
    PORTB = B00011011;  
    lireEntree();   
    break;         
  case 16:
    PORTB = B00010000;  
    lireEntree();   
    PORTB = B00011000;    
    lireEntree();
    PORTB = B00011010;  
    lireEntree();   
    PORTB = B00011011;  
    lireEntree();   
    break;
  case 17:
    PORTB = B00011011;  
    lireEntree();
    break;  
  default:
    PORTB = B00000000;  
    lireEntree();
  break;    
}//Fin switch
}//Lecture Anim


void lireEntree () {
  if(analogRead(1) >= 950) {  //Bouton pressé car valeur superieure à la valeur du potar
    anim += 1;
    if(anim > 17) {    //Nombre d'animation programmée atteint, ==> on repart à 0
      anim = 0;
    }   
    EEPROM.write(0,anim);  //Enregistre l'animation en EEPROM, emplacement 0
    while(analogRead(1) >= 950) {  //Boucle d'anti-rebond
      delay(500);
    }
  } else {
    tempo = map(analogRead(1),0,690,1500,250); //Réglage de la temporisation
    //map(analogRead(1),0,690,tempo max,tempo min); //TEMPO MAX: 32768 milli-secondes (32,7 sec)
    delay(tempo);
  }
}//fin void lireEntree
 
 

 



01/02/2015
0 Poster un commentaire

A découvrir aussi


Inscrivez-vous au blog

Soyez prévenu par email des prochaines mises à jour

Rejoignez les 2 autres membres