Présentation :
On va rendre bi-directionnelle cette communication
En envoyant une commande logique de la carte Raspberry vers la carte Arduino, elle permettra d'allumer ou d'éteindre une Del (Del: Diode Electroluminescente).
Pour réaliser cette communication on va modifier les programmes "A0_i2c_VotreNom.ino" et "A0_i2c_VotreNom.py"
Le premier "A0_i2c_VotreNom.ino", ce programme implanté dans le calculateur de la carte Arduino (ATMEGA2560) doit pouvoir maintenant recevoir un octet de commande.
Cette octet sera stocké dans une variable nommée "dataReceived" dans une procédure de réception "receiveData".
On sauvegardera le programme sous le nom: "A0_i2c_Led_VotreNom.ino" .
On pourra ensuite exploiter sa valeur dans le programme principale pour commander la Del.
Le deuxième "A0_i2c_VotreNom.py" sera dupliquer en 2 procédures :
"A0_i2c_CommandLed_On_VotreNom.py" pour allumer la Del,
"A0_i2c_CommandLed_Off_VotreNom.py" pour l'éteindre.
Prototypage :
Documents implantation de la Del sur la sortie N°13 de la carte Arduino.
Réaliser avec le logiciel Fritzing l'implantation de la Del (reprendre votre schéma)
Le résistor en série avec la Del a été fixée à 470Ω.
Photo du prototypage:
Logiciel :
Les modifications du programme son en rouge dans le listing qui suit.
Elles concernent quatre points:
1: Déclarer le numéro de pin sur laquelle on va connecter la Del.
Déclarer une variable "dataReceived" pour stocker la commande reçue.
2: Dans l'initialisation on fixe la pin en sortie.
3: Dans le programme principale on applique la commande sur la Del.
4: Sous-programme de réception de la commande.
Programme Arduino: Ouvrir le logiciel "Arduino" et copier/coller les lignes suivantes dans l'interface utilisateur.
/* Nom du programme : "A0_i2c_Led_VotreNom.ino"
* Programme test de la liaison I2C entre la carte Raspberry et la carte Arduino.
* Auteur:
* Date:
* Le Raspberry est maitre de la communication et l'Arduino esclave.
* Utilisation de la librairie Wire:
* https://www.arduino.cc/en/Reference/Wire
* http://www.mon-club-elec.fr/pmwiki_reference_arduino/pmwiki.php?n=Main.LibrairieWire
* Le Programme suivant fait l'acquisition de l'entrée analogique A0 dans son programme principale, il commande une Del connectée à sortie numérique N°13 de la carte Arduino.
* Il intègre deux sous-programmes "sendData" et "receiveData" pour répondre aux sollicitations de la carte Raspberry via le bus i2c.
* L'utilisation de la librairie "Wire"
* L'adresse de la carte Arduino est déclaré en hexadécimale.
*/
#include <Wire.h>
#define SLAVE_ADDRESS 0x10 // Déclaration de l'adresse de la carte Arduino ici 16 en décimale.
int valA0 = 0; // valeur de conversion de l'entrée A0 sur 16 bits
byte valA0h = 0; // Octet de poids fort de valA0
byte valA0l = 0; // Octet de poids faible de valA0
int tabcap[2] = {valA0h,valA0l}; //tableau de 2 valeurs
int i=0; //index du tableau
const byte Led = 13; // Déclaration du N° de la sortie logique commandée par la carte Raspberry
int dataReceived = 0; // Déclaration et initialisation de la variable "dataReceived" qui contiendra la commande reçue.
// Initialisation
void setup() {
Wire.begin(SLAVE_ADDRESS); // Initialisation de la liaison i2c
Wire.onRequest(sendData); // init sous-programme émission sur le bus i2c
Wire.onReceive(receiveData); // initialisation sous-programme réception sur le bus i2c
Serial.begin(9600); // Initialisation vitesse de communication de la liaison serie (USB) 9600 baud
pinMode(Led, OUTPUT); // La pin N°13 est déclarée en sortie pour piloter la Del
}
// Programme principal
void loop() {
valA0 = analogRead(A0); // Conversion de l’entrée A0, converti en un integer sur 16 bits (int val=).
Serial.println (valA0); // Écriture de la valeur "val" sur le terminal (via la liaison serie).
valA0h = (char)highByte(valA0); // Isolation de l'octet de poids fort.
tabcap[0] = valA0h; // Stockage dans le tableau, attention [0] correspond au premier emplacement du tableau.
valA0l = (char)lowByte(valA0); // Isolation de l'octet de poids faible.
tabcap[1] = valA0l; // Stockage dans le tableau, attention [1] deuxième emplacement.
digitalWrite(Led, dataReceived); // Commande appliquée à la Del
delay(20); // Pause 20 ms
}
// Sous-programme émission bus i2c
void sendData(){
int envoi = tabcap[i]; // envoi contient l'octet à transmettre
if (i==0) { // écrire dans la console Arduino l'octet transmis
Serial.print("valA0h = "); // son nom
}
if (i==1) {
Serial.print("valA0l = "); // son nom
}
Serial.println(tabcap[i]); // sa valeur
Wire.write(envoi); // émission de l'octet sur le bus
i=i+1; // pointe l'octet suivant
if (i==2) { // initialiser le pointeur
i=0; // si on dépasse le tableau
}
}
// Sous-programme Réception bus i2c
void receiveData(int byteCount){
while(Wire.available()) {
dataReceived = Wire.read(); // Sauvegarde de la commande reçue dans la variable "dataReceived"
Serial.print("Commande reçue : "); // Écriture dans la console de la commande reçue
Serial.println(dataReceived);
}
}
Sauvegarder votre fichier sous le nom: "A0_i2c_Led_VotreNom.ino"
Téléverser votre programme dans la carte Arduino.
Programme Python (carte Raspberry)
Les modifications des programmes sont en rouge dans les listing qui suivent.
On va écrire deux procédures, une pour allumer la Del et une pour l'éteindre.
"A0_i2c_CommandLed_On_VotreNom.py" pour allumer la Del,
"A0_i2c_CommandLed_Off_VotreNom.py" pour l'éteindre.
La modification du programme "A0_i2c_VotreNom.py" ne présente aucune difficulté.
On a besoin de déclarer une variable "commadLed", si commandLed=0 extinction de la Del et si commandLed=1 allumage.
Dans le programme on envoie la commande grâce à la commande "bus.write_byte(address, commandLed)"
Cette commande peut être introduite avant la boucle ou dans la boucle en fonction de vos besoins!
Premier programme extinction de la Del:
Copier/coller le listing qui suis dans un éditeur de texte.
Sauvegarder ce fichier sous le nom : « A0_i2c_CommandLed_Off_VotreNom.py »
Utiliser WinSCP pour stocker ce fichier dans le répertoire "home/pi/" de votre carte Raspberry
Listing procédure "A0_i2c_CommandLed_Off_VotreNom.py "
#!/usr/bin/python
# -*- coding: ISO-8859-1 -*-
import smbus
import time
valA0h = 0 # Déclaration et initialisation des variables du programme
valA0l = 0
valA0 = 0
commandLed = 0 # Commande d'extinction de la Del
bus = smbus.SMBus(1) # Déclaration du bus i2c et initialisation de l'adresse de la carte Arduino (esclave) ici 0x10 soit 16 en décimale
address = 0x10
bus.write_byte(address, commandLed)
time.sleep(0.05)
while 0==0:
reponse = bus.read_byte(address) #Lecture du premier octet valA0h
valA0h = reponse
reponse = bus.read_byte(address) #Lecture du deuxième octet valA0l
valA0l = reponse
valA0 = valA0h*256 + valA0l # On calcul la valeur 16bits valA0
print "valA0 =", valA0 # On affiche dans le console le résultat du calcul et les deux valeurs reçues valA0h et valA0l
print "valA0h =", valA0h
print "valA0l =", valA0l
time.sleep(0.05) # Temporisation avant de relancer une acquisition
Deuxième programme allumage de la Del:
Copier/coller le listing qui suis dans un éditeur de texte.
Sauvegarder ce fichier sous le nom : « A0_i2c_CommandLed_On_VotreNom.py »
Utiliser WinSCP pour stocker ce fichier dans le répertoire "home/pi/" de votre carte Raspberry
Listing procédure "A0_i2c_CommandLed_On_VotreNom.py "
#!/usr/bin/python
# -*- coding: ISO-8859-1 -*-
import smbus
import time
valA0h = 0 # Déclaration et initialisation des variables du programme
valA0l = 0
valA0 = 0
commandLed = 1 # Commande d'allumage de la Del
bus = smbus.SMBus(1) # Déclaration du bus i2c et initialisation de l'adresse de la carte Arduino (esclave) ici 0x10 soit 16 en décimale
address = 0x10
bus.write_byte(address, commandLed)
time.sleep(0.05)
while 0==0:
reponse = bus.read_byte(address) #Lecture du premier octet valA0h
valA0h = reponse
reponse = bus.read_byte(address) #Lecture du deuxième octet valA0l
valA0l = reponse
valA0 = valA0h*256 + valA0l # On calcul la valeur 16bits valA0
print "valA0 =", valA0 # On affiche dans le console le résultat du calcul et les deux valeurs reçues valA0h et valA0l
print "valA0h =", valA0h
print "valA0l =", valA0l
time.sleep(0.05) # Temporisation avant de relancer une acquisition
Résultats des simulations :
Présenter dans une même image les consoles Raspberry (LXTerminal) et Arduino lors de l'exécution des deux scripts python.
Commande Del=1
Commande Del=0
Créé avec HelpNDoc Personal Edition: Éditeur complet de livres électroniques ePub