Возникли проблемы с миганием светодиода на Arduino с использованием информации, передаваемой по шине CAN - PullRequest
0 голосов
/ 05 апреля 2019

Я возился с шиной CAN, чтобы попытаться выучить основы, чтобы использовать ее в будущем проекте. У меня есть 2 arduinos с чипами MCP2515, между которыми я отправляю сообщения. Я был в состоянии подключить чипы и отправлять сообщения между Arduinos просто отлично, но когда я пошел, чтобы изменить код, чтобы мигать светодиод, если первый байт 0x00 или 0x01, он не будет мигать. Я добавил операторы печати, чтобы проверить, что он входит в цикл, и, используя последовательный монитор, я могу видеть его как yet, так и yote, но цифровой вывод 3 остается на уровне ~ 0 В.

Вероятно, это скорее вопрос arduino, чем вопрос шины CAN, но может ли кто-нибудь помочь мне понять, почему мой светодиод не мигает? Код входит в цикл, поэтому он должен обрабатывать команду, и я инициализировал вывод, чтобы он был выходом, но я по-прежнему не мигаю.

Как примечание, передающий arduino отправляет чередующиеся пакеты данных, сначала пакет с 0X01 в качестве первого байта данных, затем с 0x00 в качестве первого байта данных. Эти пакеты данных разделены на 5000 мс.

Я сейчас использую библиотеку CAN, доступную здесь https://github.com/autowp/arduino-mcp2515

код для получения arduino

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

struct can_frame canMsg;
MCP2515 mcp2515(10);

int LED_PIN = 3;
void setup() {
  Serial.begin(115200);
  SPI.begin();
  pinMode(LED_PIN, OUTPUT);
  mcp2515.reset();
  mcp2515.setBitrate(CAN_125KBPS);
  mcp2515.setNormalMode();

  Serial.println("------- CAN Read ----------");
  Serial.println("ID  DLC   DATA");
}

void loop() {

  if (mcp2515.readMessage(&canMsg) == MCP2515::ERROR_OK) {

    Serial.print(canMsg.can_id, HEX); // print ID
    Serial.print(" "); 
    Serial.print(canMsg.can_dlc, HEX); // print DLC
    Serial.print(" ");
    if(canMsg.data[0] == 0x00){
      digitalWrite(LED_PIN,HIGH);
      Serial.print("YEET");
    }
    if(canMsg.data[0] == 0x01){
      digitalWrite(LED_PIN,LOW);
      Serial.print("YOTE");
    }
    for (int i = 0; i<canMsg.can_dlc; i++)  {  // print the data

      Serial.print(canMsg.data[i],HEX);
      Serial.print(" ");

    }

    Serial.println();      
  }

}

и код для передачи arduino для полноты

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

struct can_frame canMsg1;
struct can_frame canMsg2;
MCP2515 mcp2515(10);


void setup() {

  canMsg1.can_id  = 0x0F6;
  canMsg1.can_dlc = 8;
  canMsg1.data[0] = 0x01;
  canMsg1.data[1] = 0x87;
  canMsg1.data[2] = 0x32;
  canMsg1.data[3] = 0xFA;
  canMsg1.data[4] = 0x26;
  canMsg1.data[5] = 0x8E;
  canMsg1.data[6] = 0xBE;
  canMsg1.data[7] = 0x86;

  canMsg2.can_id  = 0x036;
  canMsg2.can_dlc = 8;
  canMsg2.data[0] = 0x00;
  canMsg2.data[1] = 0x00;
  canMsg2.data[2] = 0x00;
  canMsg2.data[3] = 0x08;
  canMsg2.data[4] = 0x01;
  canMsg2.data[5] = 0x00;
  canMsg2.data[6] = 0x00;
  canMsg2.data[7] = 0xA0;

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

  mcp2515.reset();
  mcp2515.setBitrate(CAN_125KBPS);
  mcp2515.setNormalMode();

  Serial.println("Example: Write to CAN");
}

void loop() {

  mcp2515.sendMessage(&canMsg1);
  delay(5000);
  mcp2515.sendMessage(&canMsg2);

  Serial.println("Messages sent");

  delay(5000);

}

1 Ответ

0 голосов
/ 05 апреля 2019

Извините, я идиот.Я забыл, что линии электропередач не подключены к плате.Я подключил Arduino к соответствующему участку макета, чтобы получить питание и заземление, но подключил светодиод к незаземленному контакту заземления.

...