Problema al encender un led a través de CAN BUS

Buenas, este es mi primer post y es mi primer proyecto Arduino y mi primer acercamiento a la programación, así que si hay algún problema obvio por favor díganme.
Además agregar que gran parte está basado en CHAT GPT e INFO de youtube.
La idea es crear unas PDM Can Bus para vehículos con diferentes estrategias, aunque por ahora, ya que estoy recién aprendiendo a programar me conformo con que encienda la salida indicada por el interrruptor. (si todo sale bien, la idea es pasarlo a stm32, que según lo poco que entiendo es mejor para trabajos de tiempo real y aparte trae CAN BUS incorporado)
Tengo un problema con los siguientes códigos. (librería de CAN BUS
(GitHub - autowp/arduino-mcp2515: Arduino MCP2515 CAN interface library))

//CODIGO 1 (EMISOR)
'''

#include <SPI.h>
#include <mcp2515.h>
//lights
 int parkl = 17; 
 int lbeam = 18;
 int hbeam = 19;
 int brake =  43;
 int reverse = 25;
 
//turnlights
 int hazard = 23;
 int tleft = 20;
 int tright= 21;

//keyswitch
 int acc = 14; 
 int on = 15;
 int start = 16;

//blower
 int blowl = 27;
 int blowh = 29;

//wiper
 int wiperl = 31 ;
 int wiperh = 33;
 int wiperwash = 35;

//doorswitch
 int leftdoor = 37;
 int rightdoor = 39;

//bocina
 int bocina = 41;



 const int interval = 500;

bool blinkHazard = false;
bool blinkLeft = false;
bool blinkRight = false;








struct can_frame lights;
struct can_frame keyswitch;
struct can_frame blower;
struct can_frame wiper;
struct can_frame doorswitch;
struct can_frame horn; 
struct can_frame turnlights;
struct can_frame watertemp;

MCP2515 mcp2515(53);


void setup() {
//lights
  pinMode(parkl, INPUT) ;
  pinMode(lbeam, INPUT) ;
  pinMode(hbeam, INPUT) ;
  pinMode(brake, INPUT) ;
  pinMode(reverse, INPUT) ;

//turnlights
  pinMode(hazard, INPUT) ;
  pinMode(tleft, INPUT) ;
  pinMode(tright, INPUT) ;

//keyswitch
  pinMode(acc, INPUT) ;
  pinMode(on, INPUT) ;
  pinMode(start, INPUT) ;



//blower
  pinMode(blowl, INPUT) ;
  pinMode(blowh, INPUT) ;



//wiper
  pinMode(wiperl, INPUT) ;
  pinMode(wiperh, INPUT) ;
  pinMode(wiperwash, INPUT) ;


//doorswitch
  pinMode(leftdoor, INPUT) ;
  pinMode(rightdoor, INPUT) ;
  
//bocina
  pinMode(bocina, INPUT);


  


//lights
  lights.can_id = 0x101;
  lights.can_dlc = 5;
  lights.data[0] = 0x00;
  lights.data[1] = 0x00;
  lights.data[2] = 0x00;
  lights.data[3] = 0x00;
  lights.data[4] = 0x00;

//turnlights
  turnlights.can_id = 0X107;
  turnlights.can_dlc= 2;
  turnlights.data[0] = 0x00;
  turnlights.data[1] = 0x00;



//keyswitch
  keyswitch.can_id = 0x102;
  keyswitch.can_dlc = 3;
  keyswitch.data[0] = 0x00;
  keyswitch.data[1] = 0x00;
  keyswitch.data[2] = 0x00;

//blower
  blower.can_id = 0x103;
  blower.can_dlc = 2;
  blower.data[0] = 0x00;
  blower.data[1] = 0x00;


//wiper
  wiper.can_id = 0x104;
  wiper.can_dlc = 3;
  wiper.data[0] = 0x00;
  wiper.data[1] = 0x00;
  wiper.data[2] = 0x00;


//doorswitch
  doorswitch.can_id = 0x105;
  doorswitch.can_dlc = 2;
  doorswitch.data[0] = 0x00;
  doorswitch.data[1] = 0x00;

//bocina
  horn.can_id = 0x106;
  horn.can_dlc = 1;
  horn.data[0] = 0x00;


 while (!Serial);
  Serial.begin(115200);
  
  
//Inicializacion del MCP2515
 mcp2515.reset();
 mcp2515.setBitrate(CAN_500KBPS);
 mcp2515.setNormalMode();



}

void loop() {

  if ((hazard) = HIGH){
    unsigned long currentMillis = millis();
    unsigned long previousMillis;
    if ((currentMillis - previousMillis) < interval){
      blinkLeft = true;
      blinkRight = true;
    } else if ((currentMillis - previousMillis) < (2 * interval)) {
      blinkLeft = false;
      blinkRight = false;
    } else {
      blinkLeft = false;
      blinkRight = false;

    }



  }
  if ((tleft) = HIGH){
    unsigned long currentMillis = millis();
    unsigned long previousMillis;
    if ((currentMillis - previousMillis) < interval){
      blinkLeft = true;
    } else if ((currentMillis - previousMillis) < (2 * interval)) {
      blinkLeft = false;
    } else {
      blinkLeft = false;

    }



  }
  if ((tright) = HIGH){
    unsigned long currentMillis = millis();
    unsigned long previousMillis;
    if ((currentMillis - previousMillis) < interval){
      blinkRight = true;
    } else if ((currentMillis - previousMillis) < (2 * interval)) {

      blinkRight = false;
    } else {
      blinkRight = false;

    }



  }





 //lights
  lights.data[0] = digitalRead(parkl);
  lights.data[1] = digitalRead(lbeam);
  lights.data[2] = digitalRead(hbeam);
  lights.data[3] = digitalRead(brake);
  lights.data[4] = digitalRead(reverse);


  mcp2515.sendMessage(&lights);


//turnlights

  turnlights.data[0] = (blinkLeft);
  turnlights.data[1] = (blinkRight);

  mcp2515.sendMessage(&turnlights);
//keyswitch
 
  keyswitch.data[0] = digitalRead(acc);
  keyswitch.data[1] = digitalRead(on);

  keyswitch.data[2] = digitalRead(start);
  
  mcp2515.sendMessage(&keyswitch);

//blower
  blower.data[0] = digitalRead(blowl);
  blower.data[1] = digitalRead(blowh);
  
  mcp2515.sendMessage(&blower);

//wiper

  wiper.data[0] = digitalRead(wiperl);
  wiper.data[1] = digitalRead(wiperh);
  wiper.data[2] = digitalRead(wiperwash);

  mcp2515.sendMessage(&wiper);

//doorswitch
  doorswitch.data[0] = digitalRead(leftdoor);
  doorswitch.data[1] = digitalRead(rightdoor);
  
  mcp2515.sendMessage(&doorswitch);

//bocina
  horn.data[0] = digitalRead(bocina);

  mcp2515.sendMessage(&horn);



 /* if (mcp2515.readMessage(&watertemp) && watertemp.can_id == 0x108){

    for (int i = 0; i<watertemp.can_dlc; i++)  {  // print the data
      Serial.print(watertemp.data[i],HEX);
      Serial.print(" ");
  }
  }*/

}

CÓDIGO 2: RECEPTOR

#include <SPI.h>
#include <mcp2515.h>

MCP2515 mcp2515(53);

struct can_frame lights;
struct can_frame keyswitch;
struct can_frame blower;
struct can_frame wiper;
struct can_frame doorswitch;
struct can_frame horn;
struct can_frame turnlights;
//struct can_frame watertemp;



//INPUT PINS
 //int waterTemp = A0;

// Define output pins
//lights
 int parkl = 23; 
 int lbeam = 25;
 int hbeam = 27;
 int brake = 29;
 int reverse = 31;

//turnlights

 int tleft = 35;
 int tright= 37;

//keyswitch
 int acc = 39; 
 int on = 41;
 int start = 43;

//blower
 int blowl = 13;
 int blowh = 12;

//wiper
 int wiperl = 11 ;
 int wiperh = 9;
 int wiperwash = 8;

//doorswitch
 int leftdoor = 45;
 int rightdoor = 47;

//horn
 int bocina = 22;


// Variables para el control de intermitencia
unsigned long previousMillis = 0;
const long interval = 500;  // Intervalo de tiempo en milisegundos
bool tleftActive;
bool trightActive;



void setup() {


 //lights
  pinMode(parkl, OUTPUT) ;
  pinMode(lbeam, OUTPUT) ;
  pinMode(hbeam, OUTPUT) ;
  pinMode(brake, OUTPUT) ;
  pinMode(reverse, OUTPUT) ;

//turnlights
  pinMode(tleft, OUTPUT) ;
  pinMode(tright, OUTPUT) ;

//keyswitch
  pinMode(acc, OUTPUT) ;
  pinMode(on, OUTPUT) ;
  pinMode(start, OUTPUT) ;



//blower
  pinMode(blowl, OUTPUT) ;
  pinMode(blowh, OUTPUT) ;



//wiper
  pinMode(wiperl, OUTPUT) ;
  pinMode(wiperh, OUTPUT) ;
  pinMode(wiperwash, OUTPUT) ;


//doorswitch
  pinMode(leftdoor, OUTPUT) ;
  pinMode(rightdoor, OUTPUT) ;
  
//horn
  pinMode(bocina, OUTPUT);



//Input

 /* pinMode(waterTemp, INPUT);

  watertemp.can_id = 0x108;
  watertemp.can_dlc = 1;
  watertemp.data[0] = 0x00;*/

  while (!Serial);
  Serial.begin(115200);

  mcp2515.reset();
  mcp2515.setBitrate(CAN_500KBPS);
  mcp2515.setNormalMode();
}

/*void blinkHazard() {

  unsigned long currentMillis = millis();
    if ((currentMillis - previousMillis) < interval){
      digitalWrite(tleft, HIGH);
      digitalWrite(tright, HIGH);
    } else {
      tleft = !tleft;
      tright = !tright;
    }
    previousMillis = currentMillis;
  
  


}
void blinkLeft() {
   unsigned long currentMillis = millis();
   if ((currentMillis - previousMillis) > (2 * interval)) {
    previousMillis = currentMillis;

   }  else if ((currentMillis - previousMillis) < interval) {
      // Encender intermitentes
        tleftActive = true;
      } else if ((currentMillis - previousMillis) < (2 * interval)) {
        tleftActive = true;
      }
      previousMillis = currentMillis;


      digitalWrite(tleft, tleftActive ? HIGH : LOW);



    
  
    
}


void blinkRight() {

   unsigned long currentMillis = millis();
   if ((currentMillis - previousMillis) > (2 * interval)) {
    previousMillis = currentMillis;

   }  else if ((currentMillis - previousMillis) < interval) {
      // Encender intermitentes
        digitalWrite(tright, HIGH);
      } else if ((currentMillis - previousMillis) < (2 * interval)) {
        digitalWrite(tright, LOW);
      }
      previousMillis = currentMillis;
    
    
  
}*/




void loop() {


 /* if (mcp2515.readMessage(&turnlights) && turnlights.can_id == 0x107) {
    if (turnlights.data[0] == HIGH) {
      blinkHazard();
      }
      else {
      
    digitalWrite(tleft, LOW);
    digitalWrite(tright, LOW);
    }
  }*/

    if (mcp2515.readMessage(&turnlights) && turnlights.can_id == 0x107) {
      digitalWrite(tleft, turnlights.data[0]);
    }
   

   /* if (mcp2515.readMessage(&turnlights) && turnlights.can_id == 0x107) {
    if (turnlights.data[2] == HIGH) {
      blinkRight();
      }
      else {
      
    digitalWrite(tright, LOW);
      }
    } */
  



 /* if (mcp2515.readMessage(&lights) && lights.can_id == 0x101) {
    digitalWrite(parkl, lights.data[0]);
    digitalWrite(lbeam, lights.data[1]);
    digitalWrite(hbeam, lights.data[2]);
    digitalWrite(brake, lights.data[3]);
    digitalWrite(reverse, lights.data[4]);
 
  }



  if (mcp2515.readMessage(&keyswitch) && keyswitch.can_id == 0x102) {
    digitalWrite(acc, keyswitch.data[0]);
    digitalWrite(on, keyswitch.data[1]);
    digitalWrite(start, keyswitch.data[2]);

  }

  if (mcp2515.readMessage(&blower) && blower.can_id == 0x103) {
    digitalWrite(blowl, blower.data[0]);
    digitalWrite(blowh, blower.data[1]);
  
  }

  if (mcp2515.readMessage(&wiper) && wiper.can_id == 0x104) {
    digitalWrite(wiperl, wiper.data[0]);
    digitalWrite(wiperh, wiper.data[1]);
    digitalWrite(wiperwash, wiper.data[2]);
    
  }

  if (mcp2515.readMessage(&doorswitch) && doorswitch.can_id == 0x105) {
    digitalWrite(leftdoor, doorswitch.data[0]);
    digitalWrite(rightdoor, doorswitch.data[1]);
    
  }

  if (mcp2515.readMessage(&horn) && horn.can_id == 0x106) {
    digitalWrite(bocina, horn.data[0]);
   
  }

 // watertemp.data[0] = analogRead(waterTemp);

  //mcp2515.sendMessage (&watertemp);*/

}

La idea del código es hacer que lea el estado de los interruptores y envíe esta información por CAN BUS, esto funciona bien, el problema surge con los intermitentes, ya que no me encienden cuando apreto el interruptor, probé colocando el código de parpadeo en el receptor, pero me generaba un pequeño delay al apretar el boton ya que previousmillis siempre va a ser menor desde la primera vez que se apreta el botón y yo necesito que el encendido sea instantaneo.

Me faltó añadir que con el codigo EMISOR actual prende por medio segundo la salida de los blinkers cuando enciendo todo, pero no funciona cuando apreto el interruptor

Cabe mencionar que revisé tres veces las conexiones y estan bien. Gracias

Si es tu primer código hasta acá lo has hecho mas que bien. ahora deja esto y ve a otro código que maneje pulsadores y presete simples datos en el monitor serie.
Cuando lo logres reemplaza esos carteles

Serial.print("Cartel") 

por tus tramas CAN:

1 Like

HOLA!
Gracias, lo haré en cuando tenga tiempo lo haré y comentaré como me va-

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.