Bonjour,
Je rencontre un soucis dont je n'arrive pas à m'extirper.
Je souhaite faire communiquer deux modules (dans un premier temps) via le bus CAN.
Chaque module est composé d'un Arduino, d'un MCP2515 et d'un MCP2551. Chaque module a bien son quartz de 16Mhz et sa résistance de terminaison de 120 Ohm (voir schéma).
Sur le 1er module, j'ai 4 boutons poussoirs et un 74LS14(pour la gestion des rebonds des BPs). Sur l'autre module, j'ai 3 LEDs.
J'essaie de faire ceci:
BP1 allume LED1
BP2 allume LED2
BP3 allume LED3
BP4 les éteint toutes
Côté émetteur, je crée un message d'un octet dans lequel je place l'identifiant du BP (de 1 à 4) que j'envoie au récepteur.
#include <mcp_can.h>
#include <SPI.h>
// Définition des pins
#define BP1 2
#define BP2 3
#define BP3 4
#define BP4 5
#define CS_PIN 10
// Définition des paramètres du CAN
#define DATA_LENGHT 1
#define ADDR_MODULE_CAN 0x30
// Initialitation de l'objet CAN
MCP_CAN CAN(CS_PIN);
/*
* ***********************************************************************************************************************
* Fonction : Setup *
* Args: - *
* Return: - *
* ***********************************************************************************************************************
*/
void setup()
{
// Configuration des pins
pinMode(BP1 , INPUT);
pinMode(BP2 , INPUT);
pinMode(BP3 , INPUT);
pinMode(BP4 , INPUT);
Serial.begin(115200);
// Initialisation du bus CAN
while (CAN_OK != CAN.begin(CAN_500KBPS))
{
Serial.println("Echec de l'initialisation du contrôleur CAN");
Serial.println("Reessayez!");
delay(100);
}
Serial.println("Contrôleur CAN ok!");
}
/*
* ***********************************************************************************************************************
* Fonction : Loop *
* Args: - *
* Return: - *
* ***********************************************************************************************************************
*/
void loop()
{
// Création du tableau de variables à envoyer
unsigned char donnees_BP[DATA_LENGHT] = {};
if(digitalRead(BP1) == HIGH)
{
Serial.println("BP1 pressé!");
// MAJ et envoi de la donnée
donnees_BP[0] = 1;
CAN.sendMsgBuf(ADDR_MODULE_CAN, 0, DATA_LENGHT, donnees_BP);
delay(200);
}
if(digitalRead(BP2) == HIGH)
{
Serial.println("BP2 pressé!");
// MAJ et envoi de la donnée
donnees_BP[0] = 2;
CAN.sendMsgBuf(ADDR_MODULE_CAN, 0, DATA_LENGHT, donnees_BP);
delay(200);
}
if(digitalRead(BP3) == HIGH)
{
Serial.println("BP3 pressé!");
// MAJ et envoi de la donnée
donnees_BP[0] = 3;
CAN.sendMsgBuf(ADDR_MODULE_CAN, 0, DATA_LENGHT, donnees_BP);
delay(200);
}
if(digitalRead(BP4) == HIGH)
{
Serial.println("BP4 pressé!");
// MAJ et envoi de la donnée
donnees_BP[0] = 4;
CAN.sendMsgBuf(ADDR_MODULE_CAN, 0, DATA_LENGHT, donnees_BP);
delay(200);
}
}
Côté récepteur, je lis le message reçu, vérifie si l'ID est le bon et en fonction de la valeur envoyée, j'effectue le traitement correspondant.
Le hic, c'est que ca plante! Dès que j'allume plus de deux LEDs, l'Arduino se bloque systématiquement. Si j'ouvre et je ferme la fenêtre série, l'Arduino reboote! Je peux par contre appuyer autant de fois sur le bouton 4 (celui qui met à off toutes les LEDs) sans que cela ne fasse bloquer l'Arduino. Plus étrange encore, si je mets les "digitalWrite" en commentaire, le système ne plante pas et j'ai bien la valeur du BP appuyé qui s'affiche dans la console.
On dirait que ce sont les "digitalWrite" mis à 1 qui font planter le système.
J'ai essayé avec une autre carte, cela ne change rien.
Voici le code côté récepteur:
#include <SPI.h>
#include "mcp_can.h"
// Définition des pins
#define LED1 5
#define LED2 6
#define LED3 7
#define CS_PIN 10
#define BUFF_SIZE 8
// Définition de l'objet CAN
MCP_CAN CAN(CS_PIN);
/*
* ***********************************************************************************************************************
* Fonction : Setup *
* Args: - *
* Return: - *
* ***********************************************************************************************************************
*/
void setup()
{
// Configuration des pins
pinMode(LED1 , OUTPUT);
pinMode(LED2 , OUTPUT);
pinMode(LED3 , OUTPUT);
Serial.begin(115200);
// Initialisation du bus CAN
while (CAN_OK != CAN.begin(CAN_500KBPS))
{
Serial.println("Echec de l'initialisation du contrôleur CAN");
Serial.println("Reessayez!");
delay(100);
}
Serial.println("Contrôleur CAN ok!");
}
/*
* ***********************************************************************************************************************
* Fonction : Loop *
* Args: - *
* Return: - *
* ***********************************************************************************************************************
*/
void loop()
{
unsigned char len = 0;
unsigned char donnees_recues[BUFF_SIZE];
// Attente de l'arrivée d'une donnée
if(CAN_MSGAVAIL == CAN.checkReceive())
{
CAN.readMsgBuf(&len, donnees_recues); // read data, len: data length, buf: data buf
unsigned int canId = CAN.getCanId();
if(canId == 0x30)
{
Serial.println(donnees_recues[0]);
if(donnees_recues[0]==1)
{
Serial.println ("LED1 allumee");
if(digitalRead(LED1)==LOW)digitalWrite(LED1, HIGH);
}
if(donnees_recues[0]==2)
{
Serial.println ("LED2 allumee");
if(digitalRead(LED2)==LOW)digitalWrite(LED2, HIGH);
}
if(donnees_recues[0]==3)
{
Serial.println ("LED3 allumee");
if(digitalRead(LED3)==LOW)digitalWrite(LED3, HIGH);
}
if(donnees_recues[0]==4)
{
Serial.println ("All off");
digitalWrite(LED1, LOW);
digitalWrite(LED2, LOW);
digitalWrite(LED3, LOW);
}
}
}
}
Ai-je commis une faute? Ma méthode est elle mauvaise?
Merci de votre aide!
Raph
Centrale.ino (3.02 KB)
Controleur_6BP.ino (2.96 KB)