mardi 20 octobre 2015

Extenseur de port I2c - Compatible Arduino, Pic

Introduction :

Un extenseur de port permet d'ajouter à un microcontrôleur un port supplémentaire grâce au bus i2c.
Si vous avez un projet qui requiert une multitude de connexion et que vous ne voulez pas utiliser un microcontrôleur haut de gamme (par exemple Arduino Mega ou PIC32). Grâce au bus I2c, vous allez pouvoir connecter jusqu’à 7 extenseurs de port. Chaque extenseurs à ça propre adresse I2c et dispose de 8 entrées / sorties.

Le PCF8574 :

L'adresse I2c varie de 0100 xxx. Les x représente les 3 bits configurable A0, A1, A2. Il dispose d'un port de 8 bits nommé P0 à P7, chaque bit peut être configuré en entrée ou en sortie. Il dispose aussi d'un sortie d'interruption celle-ci permet d'informer le microcontrôleur (Arduino ou Pic) qu'une des entrées du port à changé d'état.
Tension de fonctionnement 2.5V à 6V, Courant de sortie maximum 100mA pour le port entier (8 bits)

Diagramme représentant le PCF8574
Si on connecte A0, A1, A2 à la masse (GND) comme sur le digramme ci-dessus l'adresse I2c sera donc 0100 000.


Les différents boitier du PCF8574




Pour les microcontrôleur PIC :

void I2cInit(){
    SSPADD = 0x63;
    OpenI2C(MASTER, SLEW_OFF);
}


#define Ad_PCF8574 0x70            // Adresse pour le PCF8574A
ou
#define Ad_PCF8574 0x40           // Adresse pour le PCF8574

Pour lire le port :

unsigned char Lecture_PCF8574(){
    char r;
   
    StartI2C();
    WriteI2C(Ad_PCF8574 + 1);
    r = ReadI2C();
    StopI2C();

    return r;
}

Remarque : Si on veut utiliser l'interruption, il suffit d'appeler la fonction Lecture_PCF8574 a chaque interruption.

Pour écrire sur le port :

void Ecriture_PCF8574(unsigned char PORT){
    signed char S;
    char dummy;

    StartI2C();
    S = WriteI2C(Ad_PCF8574);
    if(S == -1){                // Collision sur le bus ?
        dummy = SSPBUF;         // clear the buffer,
        SSPCON1bits.WCOL = 0;   // clear collision status bit
    }
    WriteI2C(PORT);             // P7 à P0
    StopI2C();
}



Pour Arduino :


const int ad = 0x70;         // Adresse pour le PCF8574A
ou
const int ad = 0x40;         // Adresse pour le PCF8574

Wire.begin();

Pour lire le port :

char port;

Wire.beginTransmission(ad);
Wire.requestFrom(ad,1, true);
port = Wire.read();

Pour écrire sur le port :

Wire.beginTransmission(ad);
Wire.write(0x50);                                   // Ecrit 0x50 sur le port expander
Wire.endTransmission(true);


Remarque :

Ce composant peut être utilisé pour contrôler un écran 16*2 lignes grâce à l'I2c.

J'ai choisi de présenter ce composant, car il est disponible en boitier DIP qui permet d'utiliser des plaquettes d'essai

Il est disponible en échantillon gratuit sur le site https://store.ti.com/

Cliquez-ici pour voir la documentation.

jeudi 14 mai 2015

Prototype - Robot Aspirateur
(Application android de cartographie)

Introduction :

Pour le robot aspirateur, j'ai créé une application qui permet de suivre les mouvements de celui-ci en temps réel. Cette application a été créée avec app inventor 2.

Première étape : Création de tous les composants nécessaires

- Un canvas est utilisé pour afficher un quadrillage
- Une image en mouvement nommé Robot qui est une ImageSprite.

Ensuite, il y a trois boutons :

-  Go : permet d'activer le robot (envoi d'un message au robot)
-  Reset : permet de déplacer l'image du Robot au centre du canvas
-  Connexion : ListPicker qui permet de lister les périphériques Bluetooth et de se connecter

Éléments non visible :

-  Un BluetoothClient
-  Un timer nommé Clock1 qui permet de gérer la réception des trames Bluetooth
-  Un notifier permet d'indiquer des messages à l'utilisateur


Deuxième étape : Partie logique

Voici les éléments a déposer pour que le bouton Connexion affiche la liste des périphériques Bluetooth.


Exemple pour le bouton Go :

Tout d'abord, on vérifie si le Bluetooth est connecté. Puis on envoie le texte "Go" grâce à la commande SendText.

Exemple pour gérer la réception d'un message Bluetooth :

Les éléments dans le block Timer vont être appelés régulièrement (temps à définir dans la partie Designer).

Il faut d'abord vérifier que le Bluetooth est connecté



puis on test s'il y a des octets de disponibles.


On enregistre les octets dans une variable globale


On test le contenu de la variable.


Si le contenu de la variable est égale à RA on affiche RA à l'écran


Fonctionnement de l'application :

Liste des commandes que le robot doit envoyer en Bluetooth (liaison UART) :

RA : Le robot a avancé d'une "case"
RD : Le robot a effectué une rotation de 90° à droite
RG : Le robot a effectué une rotation de 90° à gauche
RR : Le robot recule

Le robot utilisé est mon robot aspirateur, il se déplace à l'aide de deux moteurs pas à pas. Ils sont contrôlés grâce à un microcontrôleur ce qui permet le contrôle "précis" des pas. Dans mon cas une case équivaut à 200 impulsions c'est-à-dire un tour de roue. Mon robot envoie RA toutes les 200 impulsions, ce qui permet de suivre son mouvement.


Cliquez-ici pour télécharger le fichier aia et le fichier apk, n'oublie pas que pour installer le fichier apk, il faut activer les sources inconnu dans les paramètres d'Android.

Je ne peut en aucun être tenu pour responsable des éventuelles dommage causé par l'application. Le point apk à été téléchargé depuis le site ai2.appinventor.mit.edu.

Sponsors