-
Notifications
You must be signed in to change notification settings - Fork 290
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Problem with Arduino Due #15
Comments
Hello, I think I have the same problem. Did you had to comment the SPI.begin() and endSPI() lines in order to work? Does it work fine with this lines commented? |
Never mind. It is working fine with those lines commented. |
You may add solution to repo via macro or "isArduinoDue" flag in object |
Arduino Uno also works with those lines commented. |
On an arduino zero it doesnt boot up the board unless you comment SPI.begin(). |
I canno't make this work with an Arduino Due and a MCP2515, even if i comment the lines you mentioned. After mcp2515.reset(); its blocked. Any advice would be greatly appreciated, Térence |
Tengo el mismo problema, el programa me funciona correctamente, en un Arduino Every, en el Due se compila sin errores, pero se queda colgado. const int SPI_CS_PIN = 10; // Define el pin CS del MCP2515 void setup() { void loop() { // Ejemplo de recepción de un mensaje CAN: |
Conexión: Conecta los pines del MCP2515 a los pines del Arduino Due de la siguiente manera: MCP2515 VCC a 5V del Arduino Due. |
El Arduino Due tiene 54 pines digitales y 12 pines analógicos disponibles. Algunos de estos pines están reservados para funciones específicas, como UART, SPI y PWM, por lo que debes elegir pines disponibles para conectar el MCP2515. Además, el Arduino Due tiene soporte para interrupciones en varios de sus pines digitales y analógicos, lo que podría ser útil si deseas utilizar la función de interrupción del MCP2515. La elección de los pines dependerá de tu proyecto y de los pines disponibles en tu placa. Aquí hay algunas sugerencias: SPI (SCK, MISO, MOSI): Estos pines son fijos en el Arduino Due y están ubicados en los pines 75 (SCK), 74 (MISO) y 76 (MOSI). Chip Select (CS): Elije un pin digital disponible para el CS del MCP2515, como el pin 10, 52 o cualquier otro pin disponible en tu placa. Interrupción (INT): Utiliza un pin que admita interrupciones. Por ejemplo, el pin digital 2 o 3 se pueden utilizar para la interrupción del MCP2515. Asegúrate de configurar correctamente la interrupción en tu código. Asegúrate de modificar el código de configuración para que coincida con los pines específicos que hayas elegido para conectar el MCP2515. Además, ten en cuenta cualquier cambio necesario en la configuración de máscaras y filtros CAN según las necesidades de tu aplicación. |
Lo he implementado en éste programa. He dejado comentado la versión que funciona en un Arduino Every. Programa |
/* const int SPI_CS_PIN = 10; // Define el pin CS del MCP2515 U8G2_SSD1309_128X64_NONAME0_F_4W_SW_SPI u8g2(U8G2_R0, /* clock=/5, / data=/6, / cs=/7, / dc=/9, / reset=*/8); MCP_CAN CAN(SPI_CS_PIN); // Reemplaza SPI_CS_PIN con el número de pin que estás utilizando como chip select ///unsigned long lastAvisoRvTime = 0; unsigned long currentMillisEv = millis(); // Obtener el tiempo actual // Declarar una variable para almacenar el tiempo del último cambio en el valor de lecturas por segundo (L:) // Variables globales Cotrol activaEv // Inicio encendido control // Volores control A0 A1 y D3, D4 // Variables para el control de la salida A0 (Rele Voltaje) // Refresco de pantalla // Definición de pines para salidas const int botonPin = A2; // Pin del botón en la entrada A2 const int debounceDelay = 50; // Retardo de rebote en milisegundos int lastButtonState = LOW; // Estado anterior del botón // Definir las coordenadas para ubicar el ícono de la batería en la pantalla OLED // Variables para mostrar el estado en la pantalla // Declara una variable global para almacenar el estado de EV // Otras variables int decimalValue = 0; // Acelerador posicon // Control de tiempo y recuento // Variables para el control de tiempo y ciclos por segundo void setup() { if (CAN.begin(MCP_STDEXT, CAN_125KBPS, MCP_16MHZ) == CAN_OK) { // Inicialización de las salidas digitales // Configura las entradas y salidas según la descripción proporcionada // Inicializa las salidas según lo que mencionaste /* // Inicialización de la comunicación SPI para el módulo CAN // Esperar tiempoEspera antes de continuar if (newButtonState != lastState) { if ((currentTime - lastDebounceTime) > debounceDelay) { return false; void borraError() { void avisoRv() { // Aviso rele control voltaje bateria
}
} void control(int value) { // Control por pantalla(BANDERA) void drawCurrentIcon(uint8_t y, int value) { // Calcular el ancho de la barra // Dibujar la barra void drawThrottleBar(uint8_t decimalValue) { // Mapea el valor de entrada al ancho de la barra // Dibuja el marco de la barra // Dibuja la barra de acuerdo al valor de aceleración CAN.sendMsgBuf(canId, 0, 8, canData); // Envía el mensaje CAN CAN.sendMsgBuf(canId, 0, 8, canData); // Envía el mensaje CAN mcp2515.sendMessage(&canMsg); CAN.sendMsgBuf(canId, 0, 8, canData); // Envía el mensaje CAN mcp2515.sendMessage(&canMsg); CAN.sendMsgBuf(canId, 0, 8, canData); // Envía el mensaje CAN mcp2515.sendMessage(&canMsg); CAN.sendMsgBuf(canId, 0, 8, canData); // Envía el mensaje CAN mcp2515.sendMessage(&canMsg); CAN.sendMsgBuf(canId, 0, 8, canData); // Envía el mensaje CAN mcp2515.sendMessage(&canMsg); CAN.sendMsgBuf(canId, 0, 8, canData); // Envía el mensaje CAN mcp2515.sendMessage(&canMsg); CAN.sendMsgBuf(canId, 0, 8, canData); // Envía el mensaje CAN mcp2515.sendMessage(&canMsg); CAN.sendMsgBuf(canId, 0, 8, canData); // Envía el mensaje CAN mcp2515.sendMessage(&canMsg); CAN.sendMsgBuf(canId, 0, 8, canData); // Envía el mensaje CAN mcp2515.sendMessage(&canMsg); CAN.sendMsgBuf(canId, 0, 8, canData); // Envía el mensaje CAN mcp2515.sendMessage(&canMsg); CAN.sendMsgBuf(canId, 0, 8, canData); // Envía el mensaje CAN mcp2515.sendMessage(&canMsg); CAN.sendMsgBuf(canId, 0, 8, canData); // Envía el mensaje CAN mcp2515.sendMessage(&canMsg); CAN.sendMsgBuf(canId, 0, 8, canData); // Envía el mensaje CAN mcp2515.sendMessage(&canMsg); CAN.sendMsgBuf(canId, 0, 7, canData); // Envía el mensaje CAN mcp2515.sendMessage(&canMsg); CAN.sendMsgBuf(canId, 0, 7, canData); // Envía el mensaje CAN mcp2515.sendMessage(&canMsg); // Dibujar el rectángulo que representa la barra de SOC // Dibujar las marcas en las posiciones 60% y 80% dentro del ícono de la batería // Rellenar el rectángulo que representa la barra de SOC hasta el valor correspondiente void updateu8g2() { // Mostrar el porcentaje de carga de la batería en la posición (100, 10) de la pantalla LCD // Mostrar la intensidad de corriente en la posición (0, 33) de la pantalla LCD // Mostrar el voltaje en la posición (92, 33) de la pantalla LCD // Mostrar el valor de EV en la posición (50, 33) de la pantalla LCD // Mostrar el estado de la salida A0 (R.Bat.H o R.Bat.L) en la posición (80, 54) de la pantalla LCD // Mostrar si el SOC Esta o no en rango // Mostrar si se puede parar o no en la posición (0, 64) de la pantalla LCD //Mostrar los valores de lecturas y envíos por segundo en las posiciones (0, 54) y (30, 54) de la pantalla LCD // Mostrar el valor de mensajes enviados por segundo (E:) en la posición (38, 54) de la pantalla LCD int switchState = digitalRead(interruptorPin); // Intensidad barra ----- // Declaración de la función para actualizar el estado de la salida A0 if (CAN.checkReceive() == CAN_MSGAVAIL) {
} /* // SOC
}
} // Acelerador posicion
}
} /* // Calcular el tiempo desde la última recepción de datos // Verificar si hay una activación pendiente basada en EV y el tiempo de espera if (activacionPendiente && currentMillisEv - ultimaActivacion >= evTiactivado) { // Actualiza el tiempo de última aplicación /* // Calcular el tiempo desde la última recepción de datos if (canMsg.can_id == 0x529) { if (EV == "NO") { if (activacionPendiente && currentMillisEv - ultimaActivacion >= evTiactivado) { // Variable para realizar un seguimiento del último estado de salida A0 if (lastHvSocValue <= marcaBaja) { void lecSegundo() { // Actualizar el recuento de mensajes enviados por esperaRef unsigned long currentMillislec = millis();
} void controlSoc() { // Define una variable para indicar si la condición se cumple // Establece la duración máxima del ciclo en milisegundos // Registra el tiempo de inicio while (!condicionCumplida) {
} void loop() { // Comprueba si A4 o A5 han cambiado de estado // Actualiza el estado anterior de A4 y A5 // Verifica si A4 o A5 están en estado de activación ///////////////////////////////////////////////////////////////////// // Comprueba si el interruptor está en la posición correcta // Actualiza el estado anterior del botón y el interruptor ///////////////////////////////////////////////////////////////////// |
I'm trying to use your library with Arduino Due and it won`t work.
I spent some time to make it working and I found solution.
Two line were commented in the file mcp2515.cpp
MCP2515::MCP2515(const uint8_t _CS)
{
//SPI.begin(); //<==Commented
SPICS = _CS;
pinMode(SPICS, OUTPUT);
//endSPI(); //<==Commented
}
After this change Due successfully works with your samples and Can Hacker works too.
Are you sure SPI.begin() is needed here? All your examples also contains SPI.begin() in Setup.
The text was updated successfully, but these errors were encountered: