• ATtiny85 LCD en i2C

    ATtiny85 LCD en i2C

     

    Voici comment vous pouvez ajouter un petit afficheur à vos projets sur base d'ATtiny + IDE arduino.

     

    Le matériel:

    - Un ATtiny ( ici j'ai seulement pu essayer avec un 85, mais à priori ça devrait marcher avec d'autres modèles)

    - Un afficheur LCD avec un module i2c de type LCM1602 sur base de PCF8574 (un PCF8574 avec deux résistances de 4.7K suffissent)

    - Un programmeur d'AVR (carte arduino, usbtiny, usbasp ect... )

    - L'IDE arduino ici la "version 1.6.0"

    - et des librairies arduino... :)

     

    Note : "Pour les librairies ; Voici les librairies modifiées:

    Télécharger « Lib modifier ATtiny_i2C_LCD.zip »

    Vous pouvez vous contentez de copier simplement les librairies. Ce qui suit vous explique simplement ce que j'ai modifié pour arriver à faire fonctionner le bazar. "

     

    Si vous voulez modifier vous même les librairies voici une des marches à suivre.

    On commence dessuite par télécharger les librairies il nous en faut deux ici:

    - Une pour l'afficheur avec le module LCM1602. Cette librairie pourra toujours vous servir avec un ATmega. Je vous invite à vous rendre sur: LCD-Blue-I2C

    Télécharger la librairie elle ce trouve en haut de page.

    - Puis Il nous faut la librairie TinyWireM ( M pour master )

    Télécharger l'archive "TinyWire.zip".

     

    On va devoir modifier ces librairies.

    - Rendez vous là ou ce trouve vos librairies.

    - Décompresser "LiquidCrystal_V1.2.1.zip".

    - Aller dans le dossier "LiquidCrystal" et ouvrer avec un éditeur de texte le fichier "I2CIO.cpp".

    On va ajouter ces quelques lignes en haut de page :

    #if defined(__AVR_ATtiny85__) || (__AVR_ATtiny2313__)
    #include "TinyWireM.h" // include this if ATtiny85 or ATtiny2313
    #define Wire TinyWireM
    #else
    #include <Wire.h> // original lib include
    #endif

     

    ATtiny85 LCD en i2C

     

    Vous pouvez supprimer cette ligne:

    #include <../Wire/Wire.h>

     

    Note : "Ces quelques lignes demandent à l'IDE arduino d'inclure la librairie TinyWireM à la librairie liquidecrystal à la place la librairie Wire si on sélectionne un ATtiny en tant que processeur ( ouf... ça fait beaucoup de librairie tout ça XD ). Et elles remplacent la class wire par TinyWireM.  "

     

    - Enregistrer et vous pouvez fermer.

     

    - Décompresser "TinyWireM.zip"

    - Rentrer dans le dossier et ouvrer le fichier "TinyWire.h"

    - Remplacer à la ligne 57 :

    void send(uint8_t); 
    par :
    void write(uint8_t);

     

    et à la ligne 60 :

    void receive(uint8_t);
    par :
    void read(uint8_t);

    Pour obtenir ceci:

    ATtiny85 LCD en i2C

     

    - Enregistrer et fermer.

     

    - Ouvrer maintenant "TinyWire.cpp"

    - et remplacer la ligne 49 :

    void USI_TWI::send(uint8_t data){ // buffers up data to send
    par :
    void USI_TWI::write(uint8_t data){ // buffers up data to send

    Ligne 71:

    if (xferOK) return 0;
    par :
    if (xferOK) return 1;

    puis ligne 83:

    uint8_t USI_TWI::receive(){ // returns the bytes received one at a time
    par :
    uint8_t USI_TWI::read(){ // returns the bytes received one at a time

     

    Note : "Dans les librairies i2C les fonctions 'receive' et 'send' ont été remplacées par 'write' et 'read'. Le return 0  à La ligne 71... pas trop compris pourquoi mais en envoyant 1 ça règle le problème ( ceci n'est pas de moi )."

     

    on obtient ceci:

    ATtiny85 LCD en i2C

    - Enregistrer et fermer.

    Pour notre ATtiny85 programmer avec son horloge interne 8Mhz il faut aussi modifier les fichiers: "USI_TWI_Master.cpp" et "USI_TWI_Master.h"

    - Ouvrer la fichier "USI_TWI_Master.cpp"

    - Aller à la ligne 23 et remplacer:

    #define F_CPU 1000000UL          // Sets up the default speed for delay.h
    par :
    #define F_CPU 8000000UL          // Sets up the default speed for delay.h

    -Enregistrer et fermer.

    - Ouvrer "USI_TWI_Master.h"

    - Aller à la ligne 23 et remplacer:

    #define SYS_CLK   1000.0  // [kHz]    Default for ATtiny2313
    par :
    #define SYS_CLK   8000.0  // [kHz]    Default for ATtiny2313

     

    Note : "Ici on règle la fréquence de l'horloge de notre ATtiny, ajuster si vous utilisez autre chose..."

     

    -Enregistrer et fermer.

     

    Une foie vos librairies modifiées:

    - placer les dans le dossier "libraries" de votre IDE arduino, là ou ce trouve toute vos librairies...

    Pour "LiquideCrystal" vous pouvez tout remplacer par la nouvelle. Elle garde les mêmes fonctions! 

    Par contre pour la librairie "TinyWireM" vous risquez de vous recevoir une erreur comme quoi il ne trouve pas la librairie. Il faut juste placer vos fichiers ".cpp" et ".h" dans un dossier "src" comme ceci:

    ATtiny85 LCD en i2C

    Si y veux vraiment pas ajouter un fichier "library.properties"

    avec ceci à l'intérieur:

    name=TinyWireM
    version=1.0
    author=Arduino
    maintainer=Arduino <info@arduino.cc>
    sentence=Allows the communication between devices or sensors connected via Two Wire Interface Bus. For all Arduino boards, BUT Arduino DUE.
    paragraph=
    url=http://arduino.cc/en/Reference/Wire
    architectures=avr

     

    /!\ IMPORTANT : Si c'est la première foie que vous utilisez un ATtiny il vous faudra ajouter un fichier d'extension pour l'IDE arduino.  aller voir "ICI" C'est tout en bas de la page suivre les instructions.

     

    Bien la partie logiciel est prête!

     

    Câbler votre montage, un exemple qui peut marcher avec du 3.3v ou du 5V:

    ATtiny85 LCD en i2C

     

    ATtiny85 LCD en i2C

    Le potentiomètre règle le contraste.

    Note : "Le bus i2C est très sensible de mauvaises connexions ou l'oublie des résistances de pull-up peuvent entraîner des dysfonctionnements."

    Pour la déclaration des pins:

    //                    addr,en,rw,rs,d4,d5,d6,d7,bl, blpol
    LiquidCrystal_I2C lcd(0x20, 2, 1, 0, 4, 5, 6, 7, 3, POSITIVE);

    Exemple avec rs: rs est relier à la pin 4 du PCF qui est P0 on déclare -> 0

    Pour rw: rw est relier à la pin 5 du PCF qui est P1 on déclare -> 1 ect...

    Dans la déclaration, "bl" correspond à "backlight" soit le retro éclairage et POSITIVE la polarisation de celui-ci. Si vous en avez pas ne mettez rien.

    L'adresse de votre PCF8574  est donnée par l'état des pins 1, 2, 3 soit A0, A1, A2.

    Dans l'exemple elles sont toutes à l’état bas car elles sont connecté au moins de notre alimention.

    pour vous donnez une idée de comment on connait l'adresse du PCF8574 voici un petit tableau:

    ATtiny85 LCD en i2C

     

    Régler dans "outils"-> ATtiny n'oublier de régler l'horloge et le type d'ATtiny.

    vous pouvez essayer d'envoyer ceci:

    #include <TinyWireM.h>          // librairies modifiées 
    #include <LiquidCrystal_I2C.h> //
    TinyWireM et LiquiCrystal

    // Déclaration de notre afficheur, attention ces
    // valeurs peuvent changées! Si vous faite le cablage de
    // l'exemple remplacer 0x27 par 0x20.
    // Vous pouvez vous aider du site :
    LCD-Blue-I2C
    // addr,en,rw,rs,d4,d5,d6,d7,bl, blpol
    LiquidCrystal_I2C lcd(0x27, 2, 1, 0, 4, 5, 6, 7, 3, POSITIVE); 


    void setup()   
    {

    //initialisation de l'afficheur 16 colonnes et 2 lignes 
    lcd.begin(16,2);

    //petite intro: 3 clignotements du rétro éclairage
      for(int i = 0; i< 3; i++)
      {
        lcd.backlight();
        delay(150);
        lcd.noBacklight();
        delay(150);
      }
      lcd.backlight();

    // Affichage du texte 
      lcd.setCursor(2,0);
      lcd.print(">Hello Tiny<");
      lcd.setCursor(6,1);
      lcd.print("...");
     
    }

    void loop() 
    {
    }

     

    ATtiny85 LCD en i2C

     

     

    Enjoy ;)

     

    Les pages qui mon servis:

    http://arduino-info.wikispaces.com/LCD-Blue-I2C (librairie "liquidecrystal" très complète avec des exemples pour différent modules LCM1602)

    http://playground.arduino.cc/Code/USIi2c (librairie "TinyWire" pour communiquer en i2C)

    http://forum.arduino.cc/index.php?topic=183924.15 (post d'une personne qui à trouver pour l'histoire du "return 1" merci beaucoup!)