jeudi 27 mars 2014

CNC avec Arduino et GRBL

Je vous propose de vous donner quelques tuyaux pour la réalisation d'une CNC avec Arduino et GRBL.  J'ai déjà réalisé ma CNC, mon graveur laser et mon imprimante 3D e vous mettrait donc quelques photos.

La mécanique


Concernant la partie mécanique, je pense que vous avez tous votre idée et surement un budget.
Voici des idées de montage

Ma première CNC bois, alu et tôle



(ne faites pas attention au bordel lol)

Pour la réalisation de celle-ci, j'ai utilisé des coulisses de tiroirs supportant 35Kgrs, des tiges filetées standard de 8, des moteurs NEMA 23 basiques et des 2M542 et drivers. La broche est une KRESS FME1, malgré une ossature et des guides pas vraiment prévus pour ce genre d'utilisation, j'ai fait des tas de choses comme la structure de mon laser en plexy.

Quelques réalisations avec cette machine



Voici quelques détails mécaniques de ma dernière fraiseuse CNC




























Désolé pour les clopes lol !!!








J'éspère que cela va vous donner des idées !!!

L'électronique


Le choix concernant cette partie est assez délicat car les drivers doivent supporter la puissance des moteurs, certains drivers ont tendance a sauter des pas lorsque la machine force un peu.
Voici le modèles les plus répandus pour arduino

Très connu, il est constitué d'un circuit ULN2003 qui ne sert qu'a permettre a Arduino de piloter des sorties jusqu'a 500mA.
Le code permute les deux enroulement l'un après l'autre a une certaine fréquence. On peut réaliser des choses sympa mais ne conviens pas pour une CNC.


Celui-ci est semblable a celui-ci dessus mais plus puissant donc idem pas top pour une CNC a moins de lui adjoindre un deuxième module.



Easy driver est déjà un bon départ pour des petits moteurs jusqu'a 0.7A. Il est composé d'un circuit de puissance et permet de gérer les moteurs pas a pas avec simplement deux fils DIR et STEPS

Le dernier né qu'on retrouve actuellement un peu partout et surtout sur les imprimantes 3D. Il existe également avec un petit dissipateur de température. Malgré sa petite taille, il permet de piloter des moteurs jusqu’à 2A.


Pour ce dernier driver, il existe des cartes qui sont en fait des supports et adaptation pour carte Arduino MEGA, celle-ci évite simplement le câblage a réaliser entre les drivers et l'Arduino. Sur la photo on voit les drivers enfichés dessus et la MEGA en-dessous.


Un exemple de câblage de moteur avec easydriver





Nous verrons un peu plus tard les programmes de pilotage des moteurs pas a pas avec Arduino.
Allons directement a la partie la plus intéressante de ce sujet.


Le schéma de câblage

Ici, nous ne sommes pas dans le cas d'une imprimante 3D qui gère les différents élements chauffants ainsi que le moteur de l'extrudeur. Une carte UNO suffit donc amplement. pour la gestion de moteurs et fins de courses.



J'utilise des drivers A4988 avec des moteurs NEMA 17. Comme vous pouvez le constater, il n'y a pas beaucoup de câblage a réaliser. J'ai réalisé un petit circuit imprimé du style shield qui va s'enficher directement sur la carte UNO.


Le typon









Un petit double face et le tour est joué.

Programme

Test de GRBL

Dans la vidéo ci-dessous, vous pouvez voir le fonctionnement ( ce montage a été réalisé pour un laser donc pas de Z), la led représente le fonctionnement du laser.



Des tas de questions et problèmes !!

1) Le meilleur compromis pour le pilotage de la CNC avec GRBL est GRBLcontroler, je l'utilise depuis quelques années maintenant et je n'ai jamais eu de problèmes. La version la mieux aboutie est la 3.6.1

2) Pour configurer la machine, ne pas passer par le mode configuration de GRBLcontroler car souvent les paramètre ne sont pas envoyés dans la mémoire flash de l'arduino. Préférer d'envoyer les paramètres un par un en ligne de commande.

exemple : $0 = 40   (pas par mm axe x) etc....




mercredi 26 mars 2014

Arduino texte défilant

Je vous propose aujourd'hui la fabrication d'un texte défilant avec des matrices a leds et des circuits MAX7219.

Le schéma


Je pourrais vous proposer de créer un circuit imprimé mais il existe des modules tout prêts intégrant le circuit MAX7219, l'afficheur et la connectique permettant leurs mise en série et ça ne coute que quelques euros.





 

Attention, sur la matrice que j'utilise, il n'y a que 5 broches donc commencez le câblage depuis la droite comme sur mon schéma. Le connecteur du bas est celui qui se trouve sous le circuit intégré.

Je me suis limité a deux afficheurs, mais rien n'empêche d'en mettre plusieurs, il faut simplement les déclarer dans le programme.



Le programme

Je vous met ici deux programmes, dans le premier le texte enregistrées dans le module Arduino et le second programme permettra d'envoyer des messages via le moniteur série de Arduino.

Textes préprogrammés

/*
################################################################################
Texte défilant
                   
################################################################################
*/



#include <MaxMatrix.h>
#include <avr/pgmspace.h>

PROGMEM prog_uchar CH[] = {
3, 8, B00000000, B00000000, B00000000, B00000000, B00000000, // space
1, 8, B01011111, B00000000, B00000000, B00000000, B00000000, // !
3, 8, B00000011, B00000000, B00000011, B00000000, B00000000, // "
5, 8, B00010100, B00111110, B00010100, B00111110, B00010100, // #
4, 8, B00100100, B01101010, B00101011, B00010010, B00000000, // $
5, 8, B01100011, B00010011, B00001000, B01100100, B01100011, // %
5, 8, B00110110, B01001001, B01010110, B00100000, B01010000, // &
1, 8, B00000011, B00000000, B00000000, B00000000, B00000000, // '
3, 8, B00011100, B00100010, B01000001, B00000000, B00000000, // (
3, 8, B01000001, B00100010, B00011100, B00000000, B00000000, // )
5, 8, B00101000, B00011000, B00001110, B00011000, B00101000, // *
5, 8, B00001000, B00001000, B00111110, B00001000, B00001000, // +
2, 8, B10110000, B01110000, B00000000, B00000000, B00000000, // ,
4, 8, B00001000, B00001000, B00001000, B00001000, B00000000, // -
2, 8, B01100000, B01100000, B00000000, B00000000, B00000000, // .
4, 8, B01100000, B00011000, B00000110, B00000001, B00000000, // /
4, 8, B00111110, B01000001, B01000001, B00111110, B00000000, // 0
3, 8, B01000010, B01111111, B01000000, B00000000, B00000000, // 1
4, 8, B01100010, B01010001, B01001001, B01000110, B00000000, // 2
4, 8, B00100010, B01000001, B01001001, B00110110, B00000000, // 3
4, 8, B00011000, B00010100, B00010010, B01111111, B00000000, // 4
4, 8, B00100111, B01000101, B01000101, B00111001, B00000000, // 5
4, 8, B00111110, B01001001, B01001001, B00110000, B00000000, // 6
4, 8, B01100001, B00010001, B00001001, B00000111, B00000000, // 7
4, 8, B00110110, B01001001, B01001001, B00110110, B00000000, // 8
4, 8, B00000110, B01001001, B01001001, B00111110, B00000000, // 9
2, 8, B01010000, B00000000, B00000000, B00000000, B00000000, // :
2, 8, B10000000, B01010000, B00000000, B00000000, B00000000, // ;
3, 8, B00010000, B00101000, B01000100, B00000000, B00000000, // <
3, 8, B00010100, B00010100, B00010100, B00000000, B00000000, // =
3, 8, B01000100, B00101000, B00010000, B00000000, B00000000, // >
4, 8, B00000010, B01011001, B00001001, B00000110, B00000000, // ?
5, 8, B00111110, B01001001, B01010101, B01011101, B00001110, // @
4, 8, B01111110, B00010001, B00010001, B01111110, B00000000, // A
4, 8, B01111111, B01001001, B01001001, B00110110, B00000000, // B
4, 8, B00111110, B01000001, B01000001, B00100010, B00000000, // C
4, 8, B01111111, B01000001, B01000001, B00111110, B00000000, // D
4, 8, B01111111, B01001001, B01001001, B01000001, B00000000, // E
4, 8, B01111111, B00001001, B00001001, B00000001, B00000000, // F
4, 8, B00111110, B01000001, B01001001, B01111010, B00000000, // G
4, 8, B01111111, B00001000, B00001000, B01111111, B00000000, // H
3, 8, B01000001, B01111111, B01000001, B00000000, B00000000, // I
4, 8, B00110000, B01000000, B01000001, B00111111, B00000000, // J
4, 8, B01111111, B00001000, B00010100, B01100011, B00000000, // K
4, 8, B01111111, B01000000, B01000000, B01000000, B00000000, // L
5, 8, B01111111, B00000010, B00001100, B00000010, B01111111, // M
5, 8, B01111111, B00000100, B00001000, B00010000, B01111111, // N
4, 8, B00111110, B01000001, B01000001, B00111110, B00000000, // O
4, 8, B01111111, B00001001, B00001001, B00000110, B00000000, // P
4, 8, B00111110, B01000001, B01000001, B10111110, B00000000, // Q
4, 8, B01111111, B00001001, B00001001, B01110110, B00000000, // R
4, 8, B01000110, B01001001, B01001001, B00110010, B00000000, // S
5, 8, B00000001, B00000001, B01111111, B00000001, B00000001, // T
4, 8, B00111111, B01000000, B01000000, B00111111, B00000000, // U
5, 8, B00001111, B00110000, B01000000, B00110000, B00001111, // V
5, 8, B00111111, B01000000, B00111000, B01000000, B00111111, // W
5, 8, B01100011, B00010100, B00001000, B00010100, B01100011, // X
5, 8, B00000111, B00001000, B01110000, B00001000, B00000111, // Y
4, 8, B01100001, B01010001, B01001001, B01000111, B00000000, // Z
2, 8, B01111111, B01000001, B00000000, B00000000, B00000000, // [
4, 8, B00000001, B00000110, B00011000, B01100000, B00000000, // \ backslash
2, 8, B01000001, B01111111, B00000000, B00000000, B00000000, // ]
3, 8, B00000010, B00000001, B00000010, B00000000, B00000000, // AT
4, 8, B01000000, B01000000, B01000000, B01000000, B00000000, // _
2, 8, B00000001, B00000010, B00000000, B00000000, B00000000, // `
4, 8, B00100000, B01010100, B01010100, B01111000, B00000000, // a
4, 8, B01111111, B01000100, B01000100, B00111000, B00000000, // b
4, 8, B00111000, B01000100, B01000100, B00101000, B00000000, // c
4, 8, B00111000, B01000100, B01000100, B01111111, B00000000, // d
4, 8, B00111000, B01010100, B01010100, B00011000, B00000000, // e
3, 8, B00000100, B01111110, B00000101, B00000000, B00000000, // f
4, 8, B10011000, B10100100, B10100100, B01111000, B00000000, // g
4, 8, B01111111, B00000100, B00000100, B01111000, B00000000, // h
3, 8, B01000100, B01111101, B01000000, B00000000, B00000000, // i
4, 8, B01000000, B10000000, B10000100, B01111101, B00000000, // j
4, 8, B01111111, B00010000, B00101000, B01000100, B00000000, // k
3, 8, B01000001, B01111111, B01000000, B00000000, B00000000, // l
5, 8, B01111100, B00000100, B01111100, B00000100, B01111000, // m
4, 8, B01111100, B00000100, B00000100, B01111000, B00000000, // n
4, 8, B00111000, B01000100, B01000100, B00111000, B00000000, // o
4, 8, B11111100, B00100100, B00100100, B00011000, B00000000, // p
4, 8, B00011000, B00100100, B00100100, B11111100, B00000000, // q
4, 8, B01111100, B00001000, B00000100, B00000100, B00000000, // r
4, 8, B01001000, B01010100, B01010100, B00100100, B00000000, // s
3, 8, B00000100, B00111111, B01000100, B00000000, B00000000, // t
4, 8, B00111100, B01000000, B01000000, B01111100, B00000000, // u
5, 8, B00011100, B00100000, B01000000, B00100000, B00011100, // v
5, 8, B00111100, B01000000, B00111100, B01000000, B00111100, // w
5, 8, B01000100, B00101000, B00010000, B00101000, B01000100, // x
4, 8, B10011100, B10100000, B10100000, B01111100, B00000000, // y
3, 8, B01100100, B01010100, B01001100, B00000000, B00000000, // z
3, 8, B00001000, B00110110, B01000001, B00000000, B00000000, // {
1, 8, B01111111, B00000000, B00000000, B00000000, B00000000, // |
3, 8, B01000001, B00110110, B00001000, B00000000, B00000000, // }
4, 8, B00001000, B00000100, B00001000, B00000100, B00000000, // ~
};

int data = 10;   
int load = 9;   
int clock = 8; 

int maxInUse = 2;    //A modifier pour changer le nombre d'afficheur, ici on en a deux

MaxMatrix m(data, load, clock, maxInUse);

byte buffer[10];

// Les lignes de texte vous pouvez en rajoutez mais attention a la limite de la mémoire
char string1[] = " Jojo Bricolo ...        ";
char string2[] = " Vous souhaite la bienvenue        ";
char string3[] = " sur arduino-creations-blogspot.fr     ";

void setup(){
  m.init(); // initialisation du MAX7219
  m.setIntensity(10); // Règlage de l'intensité lumineuse de 0 a 15
  Serial.begin(9600); // initialisation du prot série
}

void loop(){

 

  printStringWithShift(string1, 100); // 100 = vitesse de défilement soit 100ms
  printStringWithShift(string2, 100);
  printStringWithShift(string3, 100);

}

void printCharWithShift(char c, int shift_speed){
  if (c < 32) return;
  c -= 32;
  memcpy_P(buffer, CH + 7*c, 7);
  m.writeSprite(32, 0, buffer);
  m.setColumn(32 + buffer[0], 0);
 
  for (int i=0; i<buffer[0]+1; i++)
  {
    delay(shift_speed);
    m.shiftLeft(false, false);
  }
}

void printStringWithShift(char* s, int shift_speed){
  while (*s != 0){
    printCharWithShift(*s, shift_speed);
    s++;
  }
}

void printString(char* s)
{
  int col = 0;
  while (*s != 0)
  {
    if (*s < 32) continue;
    char c = *s - 32;
    memcpy_P(buffer, CH + 7*c, 7);
    m.writeSprite(col, 0, buffer);
    m.setColumn(col + buffer[0], 0);
    col += buffer[0] + 1;
    s++;
  }
}

Textes via le moniteur série

/*
Texte moniteur série
 */


#include <MaxMatrix.h>
#include <avr/pgmspace.h>

PROGMEM prog_uchar CH[] = {
3, 8, B00000000, B00000000, B00000000, B00000000, B00000000, // space
1, 8, B01011111, B00000000, B00000000, B00000000, B00000000, // !
3, 8, B00000011, B00000000, B00000011, B00000000, B00000000, // "
5, 8, B00010100, B00111110, B00010100, B00111110, B00010100, // #
4, 8, B00100100, B01101010, B00101011, B00010010, B00000000, // $
5, 8, B01100011, B00010011, B00001000, B01100100, B01100011, // %
5, 8, B00110110, B01001001, B01010110, B00100000, B01010000, // &
1, 8, B00000011, B00000000, B00000000, B00000000, B00000000, // '
3, 8, B00011100, B00100010, B01000001, B00000000, B00000000, // (
3, 8, B01000001, B00100010, B00011100, B00000000, B00000000, // )
5, 8, B00101000, B00011000, B00001110, B00011000, B00101000, // *
5, 8, B00001000, B00001000, B00111110, B00001000, B00001000, // +
2, 8, B10110000, B01110000, B00000000, B00000000, B00000000, // ,
4, 8, B00001000, B00001000, B00001000, B00001000, B00000000, // -
2, 8, B01100000, B01100000, B00000000, B00000000, B00000000, // .
4, 8, B01100000, B00011000, B00000110, B00000001, B00000000, // /
4, 8, B00111110, B01000001, B01000001, B00111110, B00000000, // 0
3, 8, B01000010, B01111111, B01000000, B00000000, B00000000, // 1
4, 8, B01100010, B01010001, B01001001, B01000110, B00000000, // 2
4, 8, B00100010, B01000001, B01001001, B00110110, B00000000, // 3
4, 8, B00011000, B00010100, B00010010, B01111111, B00000000, // 4
4, 8, B00100111, B01000101, B01000101, B00111001, B00000000, // 5
4, 8, B00111110, B01001001, B01001001, B00110000, B00000000, // 6
4, 8, B01100001, B00010001, B00001001, B00000111, B00000000, // 7
4, 8, B00110110, B01001001, B01001001, B00110110, B00000000, // 8
4, 8, B00000110, B01001001, B01001001, B00111110, B00000000, // 9
2, 8, B01010000, B00000000, B00000000, B00000000, B00000000, // :
2, 8, B10000000, B01010000, B00000000, B00000000, B00000000, // ;
3, 8, B00010000, B00101000, B01000100, B00000000, B00000000, // <
3, 8, B00010100, B00010100, B00010100, B00000000, B00000000, // =
3, 8, B01000100, B00101000, B00010000, B00000000, B00000000, // >
4, 8, B00000010, B01011001, B00001001, B00000110, B00000000, // ?
5, 8, B00111110, B01001001, B01010101, B01011101, B00001110, // @
4, 8, B01111110, B00010001, B00010001, B01111110, B00000000, // A
4, 8, B01111111, B01001001, B01001001, B00110110, B00000000, // B
4, 8, B00111110, B01000001, B01000001, B00100010, B00000000, // C
4, 8, B01111111, B01000001, B01000001, B00111110, B00000000, // D
4, 8, B01111111, B01001001, B01001001, B01000001, B00000000, // E
4, 8, B01111111, B00001001, B00001001, B00000001, B00000000, // F
4, 8, B00111110, B01000001, B01001001, B01111010, B00000000, // G
4, 8, B01111111, B00001000, B00001000, B01111111, B00000000, // H
3, 8, B01000001, B01111111, B01000001, B00000000, B00000000, // I
4, 8, B00110000, B01000000, B01000001, B00111111, B00000000, // J
4, 8, B01111111, B00001000, B00010100, B01100011, B00000000, // K
4, 8, B01111111, B01000000, B01000000, B01000000, B00000000, // L
5, 8, B01111111, B00000010, B00001100, B00000010, B01111111, // M
5, 8, B01111111, B00000100, B00001000, B00010000, B01111111, // N
4, 8, B00111110, B01000001, B01000001, B00111110, B00000000, // O
4, 8, B01111111, B00001001, B00001001, B00000110, B00000000, // P
4, 8, B00111110, B01000001, B01000001, B10111110, B00000000, // Q
4, 8, B01111111, B00001001, B00001001, B01110110, B00000000, // R
4, 8, B01000110, B01001001, B01001001, B00110010, B00000000, // S
5, 8, B00000001, B00000001, B01111111, B00000001, B00000001, // T
4, 8, B00111111, B01000000, B01000000, B00111111, B00000000, // U
5, 8, B00001111, B00110000, B01000000, B00110000, B00001111, // V
5, 8, B00111111, B01000000, B00111000, B01000000, B00111111, // W
5, 8, B01100011, B00010100, B00001000, B00010100, B01100011, // X
5, 8, B00000111, B00001000, B01110000, B00001000, B00000111, // Y
4, 8, B01100001, B01010001, B01001001, B01000111, B00000000, // Z
2, 8, B01111111, B01000001, B00000000, B00000000, B00000000, // [
4, 8, B00000001, B00000110, B00011000, B01100000, B00000000, // \ backslash
2, 8, B01000001, B01111111, B00000000, B00000000, B00000000, // ]
3, 8, B00000010, B00000001, B00000010, B00000000, B00000000, // hat
4, 8, B01000000, B01000000, B01000000, B01000000, B00000000, // _
2, 8, B00000001, B00000010, B00000000, B00000000, B00000000, // `
4, 8, B00100000, B01010100, B01010100, B01111000, B00000000, // a
4, 8, B01111111, B01000100, B01000100, B00111000, B00000000, // b
4, 8, B00111000, B01000100, B01000100, B00101000, B00000000, // c
4, 8, B00111000, B01000100, B01000100, B01111111, B00000000, // d
4, 8, B00111000, B01010100, B01010100, B00011000, B00000000, // e
3, 8, B00000100, B01111110, B00000101, B00000000, B00000000, // f
4, 8, B10011000, B10100100, B10100100, B01111000, B00000000, // g
4, 8, B01111111, B00000100, B00000100, B01111000, B00000000, // h
3, 8, B01000100, B01111101, B01000000, B00000000, B00000000, // i
4, 8, B01000000, B10000000, B10000100, B01111101, B00000000, // j
4, 8, B01111111, B00010000, B00101000, B01000100, B00000000, // k
3, 8, B01000001, B01111111, B01000000, B00000000, B00000000, // l
5, 8, B01111100, B00000100, B01111100, B00000100, B01111000, // m
4, 8, B01111100, B00000100, B00000100, B01111000, B00000000, // n
4, 8, B00111000, B01000100, B01000100, B00111000, B00000000, // o
4, 8, B11111100, B00100100, B00100100, B00011000, B00000000, // p
4, 8, B00011000, B00100100, B00100100, B11111100, B00000000, // q
4, 8, B01111100, B00001000, B00000100, B00000100, B00000000, // r
4, 8, B01001000, B01010100, B01010100, B00100100, B00000000, // s
3, 8, B00000100, B00111111, B01000100, B00000000, B00000000, // t
4, 8, B00111100, B01000000, B01000000, B01111100, B00000000, // u
5, 8, B00011100, B00100000, B01000000, B00100000, B00011100, // v
5, 8, B00111100, B01000000, B00111100, B01000000, B00111100, // w
5, 8, B01000100, B00101000, B00010000, B00101000, B01000100, // x
4, 8, B10011100, B10100000, B10100000, B01111100, B00000000, // y
3, 8, B01100100, B01010100, B01001100, B00000000, B00000000, // z
3, 8, B00001000, B00110110, B01000001, B00000000, B00000000, // {
1, 8, B01111111, B00000000, B00000000, B00000000, B00000000, // |
3, 8, B01000001, B00110110, B00001000, B00000000, B00000000, // }
4, 8, B00001000, B00000100, B00001000, B00000100, B00000000, // ~
};

int data = 10;   
int load = 9;   
int clock = 8; 

int maxInUse = 2;    //nombre de modules

MaxMatrix m(data, load, clock, maxInUse);

byte buffer[10];

void setup(){
  m.init(); // module initialize
  m.setIntensity(10); // de 0 a 15
  Serial.begin(9600);
}

void loop(){
 

  while (Serial.available() > 0){
    byte c = Serial.read();
    Serial.println(c, DEC);
    printCharWithShift(c, 100);
  }
  delay(100);
  m.shiftLeft(false, true);
 
}

void printCharWithShift(char c, int shift_speed){
  if (c < 32) return;
  c -= 32;
  memcpy_P(buffer, CH + 7*c, 7);
  m.writeSprite(32, 0, buffer);
  m.setColumn(32 + buffer[0], 0);
 
  for (int i=0; i<buffer[0]+1; i++)
  {
    delay(shift_speed);
    m.shiftLeft(false, false);
  }
}

void printStringWithShift(char* s, int shift_speed){
  while (*s != 0){
    printCharWithShift(*s, shift_speed);
    s++;
  }
}

void printString(char* s)
{
  int col = 0;
  while (*s != 0)
  {
    if (*s < 32) continue;
    char c = *s - 32;
    memcpy_P(buffer, CH + 7*c, 7);
    m.writeSprite(col, 0, buffer);
    m.setColumn(col + buffer[0], 0);
    col += buffer[0] + 1;
    s++;
  }
}


En vidéo



Saisie directe


Pas de moquerie svp, dur dur de taper un texte en filmant LOL

Si cela vous intéresse, je suis en mesure de vous faire un kit ou même vous réaliser ce montage !!!



dimanche 2 mars 2014

Arduino et les afficheurs

Je propose des montages avec des afficheurs LCD ou autre, voici une petite explication concernant leur mise en œuvre. Avec les librairies qu'on peut télécharger, c'est très simple, mais il faut parfois en modifier suivant l'afficheur et le brochage.

Afficheur LCD standard

On trouve dans le commerce pour quelques euros des afficheur de 1 a 4 lignes et de 4 a 20 caractères par lignes.

Lorsqu'on utilise un simple afficheur, pas besoin de télécharger la librairie "LiquidCrystal", elle est déjà incluse dans l'IDE Arduino.


Le programme comportant un afficheur doit commencer par ces lignes.

#include <LiquidCrystal.h>  // librairie pour l'afficheur LCD

LiquidCrystal lcd( 7, 8, 9, 10, 11, 12);   // définition des broches RS/E/D4/D5/D6/D7
, elles seront toujours dans cet ordre coté afficheur, il faut vérifier le doc du constructeur mais en général c'est identique a l'image ci-dessous


Vous constaterez que lors de la définition des broches, on utilise pas toutes les bornes de l'afficheur, celles-ci seront mise a la masse.

Après les déclaration, on configure l'afficheur

void setup()   { 

 lcd.begin(20,4); // initialisation de l'afficheur type soit ici 20 caractères et 4 lignes
  delay(10); // délai 10 ms pour l'initialisation
  lcd.clear(); // rafraichissement de l'afficheur
  delay(10); // délai de rafraichissement
  }


Viens ensuite l'affichage proprement dit

void loop(void) {

lcd.setCursor(0,0); // on positionne le curseur caractère 0 ligne 0 cela aurait également put être 10,3
 lcd.print ("Bonjour"); // le texte a afficher on appel l'afficheur "lcd" puis on lui demande d'écrire "print" soit afficheur.écris "Bonjour"

}

Si vous écrivez ces quelques lignes de programme ( sans mes commentaires), votre afficheur vous dira bonjour.

Le schéma de base



Un petit code simple



#include <LiquidCrystal.h> 
LiquidCrystal lcd( 1, 2, 3, 4, 5, 6);   // définition des broches RS/E/D4/D5/D6/D7



void setup()   { 

 lcd.begin(16,2); // initialisation de l'afficheur type soit ici 16 caractères et 2 lignes
  delay(10); // délai 10 ms pour l'initialisation
  lcd.clear(); // rafraichissement de l'afficheur
  delay(10); // délai de rafraichissement
  }

void loop() {

lcd.setCursor(0,0); // on positionne le curseur caractère 0 ligne 0
 lcd.print ("Bonjour"); 

lcd.setCursor(0,1);
lcd.print("je m appel joel");
}

Affichage de l'appui sur un bouton poussoir

On garde le même schéma, on rajoute simplement un bouton poussoir









Vous noterez que le BP est raccordé a la masse et non a +, simplement parce que j'utilise la résistance interne de l'arduino.


Le sketch


#include <LiquidCrystal.h> 
LiquidCrystal lcd( 1, 2, 3, 4, 5, 6);   // définition des broches RS/E/D4/D5/D6/D7

int BP = 7; // broche sur laquelle est raccordée le BP

void setup()   { 

 lcd.begin(16,2); // initialisation de l'afficheur type soit ici 16 caractères et 2 lignes
  delay(10); // délai 10 ms pour l'initialisation
  lcd.clear(); // rafraichissement de l'afficheur
  delay(10); // délai de rafraichissement

pinMode(BP,INPUT_PULLUP); // déclaration du Bouton en entrée avec résistance interne
  }

void loop() {

lcd.setCursor(0,0); // on positionne le curseur caractère 0 ligne 0
 lcd.print ("Bonjour");  // on conserve la première ligne

lcd.setCursor(0,1);
if (digitalRead (BP) == HIGH) // si BP appuyé
{
lcd.print("Bouton appuye"); // texte affiché
}
else // ou si BP non appuyé
{
lcd.print("Bouton relache");
}


A bientôt pour la suite affichage d'une valeur !!!





Variation de couleur d'un bandeau de leds RGB avec un potentiomètre ou une sonde de température

Petit montage permettant de faire varier la couleur d'une ou plusieurs leds RGB.

Ce programme a été réalisé a la suite d'une demande faite sur le blog, j'ai mis deux versions, l'une ou l'on fait varier les couleur a l'aide d'un potentiomètre. Pour la seconde c'est une sonde de température qui fait varier les couleurs, étant donné que je ne fais pas de conversion tension / température, il suffit de remplacer le potentiomètre par la sonde.

Le schéma

Le schéma est très simple, il vous faut
- un potentiomètre 10 Kohms ou une TMP36
- 3 résistances 1 Kohms
- 3 transistors MOSFET canal N ( BUZ11 par exemple)

Variation avec un potentiomètre



Variation avec une sonde TMP36

Variation avec une TMP36 ou LM35 (c'est la même sonde, la seule chose qui change entre les deux est la précision)



On utilise ici 3 sorties PWM qui vont piloter les 3 transistors de puissance.




Le code

Le code est également très simple, on fait un découpage de la valeur de l'entrée analogique (0 à 1023)
puis une lui affecte une gamme de couleur.



/*
  Variation RGB by Jojo Bricolo
 
  Voici un lien vers un site qui donne la convertion des couleur en codes
 http://www.proftnj.com/RGB3.htm  exemple blanc // 255 (rouge),255 (bleu) ,255 (vert)
*/

// Définition des broches
int ledRouge = 10;
int ledVerte = 9;
int ledBleu = 11;

// Broche potentiomètre ou TMP36
int Tmpin = A1;



// Variable des leds
byte RougeVal = 0;
byte VertVal = 0;
byte BleuVal = 0;


int TmpVal; // Mesure de tension du potentiomètre ou de la TMP36 (pas de conversion pour la sonde, la valeur se situe donc entre 0 et 1023 cela permet plus de possibilité )


void setup()
{
  pinMode(ledRouge, OUTPUT);
  pinMode(ledVerte, OUTPUT);
  pinMode(ledBleu, OUTPUT);

}

void loop()

  {
   TmpVal = analogRead(A1);


  // Teinte 1 >>>>>>>> Les teintes varient selon les leds
 
  // Mélange rouge vert

   if (TmpVal > 0 && TmpVal < 170) { // si la valeur de la TMP est supérieur a 0 et inférieur a 170
     RougeVal = 255; // Rouge au max
     //BleuVal = 0; // bleu a 0 avec possibilité d'en rajouter un peu valeur a donner entre 0 et 255.
     analogWrite(ledRouge, RougeVal);
     VertVal = map(TmpVal, 0, 170, 0, 255); // variation du vert par la fonction de conversion map on dit donc que 0 a 170 (maxi 1023) est égal a 0 a 255, 255 étant la puissance max de la couleur séléctionnée.
     analogWrite(ledVerte, VertVal);
     //analogWrite(ledBleu, BleuVal);
   }

   // // Teinte 2
   if (TmpVal > 170 && TmpVal < 341) {
     VertVal = 255; // vert max
    // BleuVal = 0;
     analogWrite(ledVerte, VertVal);
     RougeVal = map(TmpVal, 341, 170, 0, 255); // variation rouge
     analogWrite(ledRouge, RougeVal);
    // analogWrite(ledBleu, BleuVal);
   }

    // Teinte 3
    if (TmpVal > 341 && TmpVal < 511) {
      VertVal = 255; // vert max
      //RougeVal = 0;
      analogWrite(ledVerte, VertVal);
      BleuVal = map(TmpVal, 341, 511, 0, 255); //variation du bleu
      analogWrite(ledBleu, BleuVal);
      //analogWrite(ledRouge, RougeVal);
   }

   // Teinte 4 
   if (TmpVal > 511 && TmpVal < 681) {
     BleuVal = 255;
     //RougeVal = 0;
     analogWrite(ledBleu, BleuVal);
     VertVal = map(TmpVal, 682, 511, 0, 255);
     analogWrite(ledVerte, VertVal);
     //analogWrite(ledRouge, RougeVal);
   }

   // // Teinte 5
   if (TmpVal > 682 && TmpVal < 852) {
     BleuVal = 255;
     //VertVal = 0;
     analogWrite(ledBleu, BleuVal);
     RougeVal = map(TmpVal, 682, 852, 0, 255);
     analogWrite(ledRouge, RougeVal);
     //analogWrite(ledVerte, VertVal);
   }

   // // Teinte 6
   if (TmpVal > 852 && TmpVal < 1023) {
     RougeVal = 255;
    // VertVal = 0;
     analogWrite(ledRouge, RougeVal);
     BleuVal = map(TmpVal, 1023, 852, 0, 255);
     analogWrite(ledBleu, BleuVal);
     //analogWrite(ledVerte, VertVal);
   }
    }
 

En vidéo



Si cela vous intéresse, je suis en mesure de vous faire un kit ou même vous réaliser ce montage !!!