# CAN-bus R4 Minima

**URL:** <https://forum.arduino.cc/t/can-bus-r4-minima/1217504>\
**Category:** Software\
**Created:** [January 29, 2024, 6:31pm UTC](https://forum.arduino.cc/t/can-bus-r4-minima/1217504 "2024-01-29T18:31:23Z")\
**Posts on this page:** 20\
**Page:** 1

<div class="post-metadata">

**Author:** ![lucio\_lucio](https://dub1.discourse-cdn.com/arduino/user_avatar/forum.arduino.cc/lucio_lucio/32/1126520_2.png) [@lucio\_lucio](https://forum.arduino.cc/u/lucio_lucio)\
**Post date:** [January 29, 2024, 6:31pm UTC](https://forum.arduino.cc/t/can-bus-r4-minima/1217504/1 "2024-01-29T18:31:23Z")

</div>

Ciao a tutti!  
Sto lavorando ad un progetto con 3 (anche se saranno probabilmente di più alla fine) UNO R4 Minima collegati insieme attraverso la rete CAN (pilotata dal chip dell'Arduino e collegata ad un transceiver SN65HVD230). Sto attendendo che mi arrivino tutti i componenti ma stavo intanto pensando al funzionamento.

Allora, io vorrei che due Arduino leggessero dei dati dai sensori ad essi collegati e li inviassero sulla rete CAN in continuazione, sempre mantenendo lo stesso ID su ogni pacchetto (per identificarne la provenienza). L'Arduino "main" dovrebbe occuparsi di scrivere i dati in arrivo su di una SD, ciclando tra i vari messaggi in arrivo e prendendo soltanto quelli provenienti dal sensore desiderato.

Dal momento che nella documentazione della libreria non mi pare di aver visto che si possa passare l'ID alla funzione .read() come posso riuscire a filtrare i dati in arrivo? E ci sarebbe un conflitto tra dati se questi viaggiano contemporaneamente sulla linea? (non credo dato che il CAN è usato nelle automobili dove viaggiano molti pacchetti diversi allo stesso tempo).

EDIT: Per comunicare tra le varie schede, secondo voi, è meglio il CAN o l'I2C?

Grazie in anticipo a tutti e buona serata!  
Lucio

---

<div class="post-metadata">

**Author:** ![icio](https://dub1.discourse-cdn.com/arduino/user_avatar/forum.arduino.cc/icio/32/216469_2.png) [@icio](https://forum.arduino.cc/u/icio)\
**Post date:** [January 29, 2024, 10:24pm UTC](https://forum.arduino.cc/t/can-bus-r4-minima/1217504/2 "2024-01-29T22:24:12Z")

</div>

> [@lucio\_lucio](#):
>
> Per comunicare tra le varie schede, secondo voi, è meglio il CAN o l'I2C?

Non c'è paragone! Il CAN

---

<div class="post-metadata">

**Author:** ![nid69ita](https://dub1.discourse-cdn.com/arduino/user_avatar/forum.arduino.cc/nid69ita/32/901258_2.png) [@nid69ita](https://forum.arduino.cc/u/nid69ita)\
**Post date:** [January 30, 2024, 12:13pm UTC](https://forum.arduino.cc/t/can-bus-r4-minima/1217504/3 "2024-01-30T12:13:31Z")

</div>

> [@lucio\_lucio](#):
>
> Per comunicare tra le varie schede, secondo voi, è meglio il CAN o l'I2C?

Non puoi paragonarli. I2C è pensato per dialogo tra dispositivi elettronici mooooolto vicini, di solito MCU con sensori. Ma sempre molto vicini. Infatti esistono dei chip I2C extender.

---

<div class="post-metadata">

**Author:** ![lucio\_lucio](https://dub1.discourse-cdn.com/arduino/user_avatar/forum.arduino.cc/lucio_lucio/32/1126520_2.png) [@lucio\_lucio](https://forum.arduino.cc/u/lucio_lucio)\
**Post date:** [January 31, 2024, 2:03pm UTC](https://forum.arduino.cc/t/can-bus-r4-minima/1217504/4 "2024-01-31T14:03:35Z")

</div>

Grazie ad entrambi, ora sono sicuramente più certo della mia scelta.

Per l'altra domanda più tecnica avete qualche idea?

Lucio

---

<div class="post-metadata">

**Author:** ![nid69ita](https://dub1.discourse-cdn.com/arduino/user_avatar/forum.arduino.cc/nid69ita/32/901258_2.png) [@nid69ita](https://forum.arduino.cc/u/nid69ita)\
**Post date:** [January 31, 2024, 2:37pm UTC](https://forum.arduino.cc/t/can-bus-r4-minima/1217504/5 "2024-01-31T14:37:30Z")

</div>

Non ho provato CAN bus ma dalle librerie vedo che ci sono comandi tipo CAN.getCanId() e CAN.sendMsgBuf(id,...  
Perciò presumo nei msg ci siamo gli id

"[comunicazione CAN](https://forum.arduino.cc/t/comunicazione-can/696306)"

Comunque anche non ci fosse un id, puoi sempre stabilirlo tu. Esempio il primo char che spedisci stabilisci è sempre id del sensore.

---

<div class="post-metadata">

**Author:** ![lucio\_lucio](https://dub1.discourse-cdn.com/arduino/user_avatar/forum.arduino.cc/lucio_lucio/32/1126520_2.png) [@lucio\_lucio](https://forum.arduino.cc/u/lucio_lucio)\
**Post date:** [January 31, 2024, 2:39pm UTC](https://forum.arduino.cc/t/can-bus-r4-minima/1217504/6 "2024-01-31T14:39:30Z")

</div>

Mi potresti linkare le librerie? Perché da quello che ho cercato io non ho trovato granché...

Lucio

---

<div class="post-metadata">

**Author:** ![gpb01](https://dub1.discourse-cdn.com/arduino/user_avatar/forum.arduino.cc/gpb01/32/830685_2.png) [@gpb01](https://forum.arduino.cc/u/gpb01)\
**Post date:** [January 31, 2024, 2:44pm UTC](https://forum.arduino.cc/t/can-bus-r4-minima/1217504/7 "2024-01-31T14:44:23Z")

</div>

> [@lucio\_lucio](#):
>
> Mi potresti linkare le librerie?

Quali librerie? ... la UNO R4 vuole la [SUA](https://github.com/arduino/ArduinoCore-renesas/tree/main/libraries/Arduino_CAN) libreria ... è quella che occorre includere ed è quella dove occorre cercare gli esempi.

Guglielmo

---

<div class="post-metadata">

**Author:** ![lucio\_lucio](https://dub1.discourse-cdn.com/arduino/user_avatar/forum.arduino.cc/lucio_lucio/32/1126520_2.png) [@lucio\_lucio](https://forum.arduino.cc/u/lucio_lucio)\
**Post date:** [January 31, 2024, 3:00pm UTC](https://forum.arduino.cc/t/can-bus-r4-minima/1217504/8 "2024-01-31T15:00:11Z")

</div>

Esatto, è quello che ho visto anche io. Dato che @nid69ita citava un'altra libreria volevo rendermi conto di cosa fosse ma, come avevo già constatato, la R4 vuole la sua.  
Quello che non sono riuscito a capire dalla libreria nativa è se la funzione .read() accetti un valore ID per filtrare i messaggi...sai consigliarmi qualcosa @gpb01 ?

Ovviamente grazie ad entrambi!  
Lucio

---

<div class="post-metadata">

**Author:** ![nid69ita](https://dub1.discourse-cdn.com/arduino/user_avatar/forum.arduino.cc/nid69ita/32/901258_2.png) [@nid69ita](https://forum.arduino.cc/u/nid69ita)\
**Post date:** [January 31, 2024, 3:01pm UTC](https://forum.arduino.cc/t/can-bus-r4-minima/1217504/9 "2024-01-31T15:01:19Z")

</div>

Comunque anche non ci fosse un id, puoi sempre stabilirlo tu. Esempio il primo char che spedisci stabilisci è sempre id del sensore.

---

<div class="post-metadata">

**Author:** ![gpb01](https://dub1.discourse-cdn.com/arduino/user_avatar/forum.arduino.cc/gpb01/32/830685_2.png) [@gpb01](https://forum.arduino.cc/u/gpb01)\
**Post date:** [January 31, 2024, 3:20pm UTC](https://forum.arduino.cc/t/can-bus-r4-minima/1217504/10 "2024-01-31T15:20:55Z")

</div>

> [@lucio\_lucio](#):
>
> Quello che non sono riuscito a capire dalla libreria nativa è se la funzione .read() accetti un valore ID per filtrare i messaggi...

Allora, in fase di scrittura, come hai visto nell'esempio CANWrite.ino, il CAN Id va specificato nella creazione del messaggio:

`CanMsg const msg(CanStandardId(CAN_ID), sizeof(msg_data), msg_data);` , riga 47

Negli esempi che fanno di lettura NON lo vedo mai usato ed il metodo read() non lo prevede, però, leggendo i sorgenti, trovo questi due commenti (mi sembrano un po' poco chiari):

```arduino
, _can_mailbox_mask
{
  CAN_DEFAULT_MASK,
  CAN_DEFAULT_MASK,
  CAN_DEFAULT_MASK,
  CAN_DEFAULT_MASK,
  0, /* Use no id filtering -> a CAN frame with any ID will be stored in receive mailbox group #0. */
  CAN_DEFAULT_MASK,
  0, /* Use no id filtering -> a CAN frame with any ID will be stored in receive mailbox group #2. */
  CAN_DEFAULT_MASK
}

```

... e poi trovo due metodi:

```arduino
void R7FA4M1_CAN::setFilterId_Standard(size_t const mailbox, uint32_t const id)
{
  if (mailbox > CAN_MAX_NO_STANDARD_MAILBOXES)
    return;

  size_t const mailbox_idx = CAN_MAX_STANDARD_MAILBOX_OFFSET + mailbox;
  _can_mailbox[mailbox_idx].mailbox_id = id;
}

void R7FA4M1_CAN::setFilterId_Extended(size_t const mailbox, uint32_t const id)
{
  if (mailbox > CAN_MAX_NO_EXTENDED_MAILBOXES)
    return;

  size_t const mailbox_idx = CAN_MAX_EXTENDED_MAILBOX_OFFSET + mailbox;
  _can_mailbox[mailbox_idx].mailbox_id = id;
}

```

... che sembrerebbero servire ad impostare dei filtri sull'Id .. ma non so come vadano utilizzati.

Il [reference](https://docs.arduino.cc/tutorials/uno-r4-minima/can/) purtroppo NON specifica nulla sull'utilizzo del Id.

Ho idea che dovrai fare un po' di prove e studiarti bene i sorgenti della libreria 🙄

Guglielmo

---

<div class="post-metadata">

**Author:** ![gpb01](https://dub1.discourse-cdn.com/arduino/user_avatar/forum.arduino.cc/gpb01/32/830685_2.png) [@gpb01](https://forum.arduino.cc/u/gpb01)\
**Post date:** [January 31, 2024, 3:23pm UTC](https://forum.arduino.cc/t/can-bus-r4-minima/1217504/11 "2024-01-31T15:23:40Z")

</div>

Ci sono anche altri due metodi interessanti:

```arduino
void R7FA4M1_CAN::setFilterMask_Standard(uint32_t const mask)
{
  _can_mailbox_mask[6] = mask;
  _can_mailbox_mask[7] = mask;
}

void R7FA4M1_CAN::setFilterMask_Extended(uint32_t const mask)
{
  _can_mailbox_mask[4] = mask;
  _can_mailbox_mask[5] = mask;
}

```

... che permettono di impostare un "mask" ... 🙄

Ribadisco, tocca fare delle prove ... se scopri l'arcano, riporta qui che aiuti anche altri eventuali utilizzatori 🙂

Guglielmo

_P.S.: Note che è chiaramente indicato: "Arduino\_CAN support both 11-Bit (standard) and 29-Bit (extended) IDs."_

---

<div class="post-metadata">

**Author:** ![gpb01](https://dub1.discourse-cdn.com/arduino/user_avatar/forum.arduino.cc/gpb01/32/830685_2.png) [@gpb01](https://forum.arduino.cc/u/gpb01)\
**Post date:** [January 31, 2024, 3:38pm UTC](https://forum.arduino.cc/t/can-bus-r4-minima/1217504/12 "2024-01-31T15:38:35Z")

</div>

Ma hai visto l'esempio [CANReadFilter](https://github.com/arduino/ArduinoCore-renesas/blob/main/libraries/Arduino_CAN/examples/CANReadFilter/CANReadFilter.ino)? Mi sembra che usi i suddetti filtri ... 🙄

Nei commenti:

> Receive and read CAN Bus messages  
> Read ID 0x100 EXTENDED and ID 0x10 STANDARD

... quindi filtra le read().

Guglielmo

---

<div class="post-metadata">

**Author:** ![lucio\_lucio](https://dub1.discourse-cdn.com/arduino/user_avatar/forum.arduino.cc/lucio_lucio/32/1126520_2.png) [@lucio\_lucio](https://forum.arduino.cc/u/lucio_lucio)\
**Post date:** [January 31, 2024, 4:36pm UTC](https://forum.arduino.cc/t/can-bus-r4-minima/1217504/13 "2024-01-31T16:36:12Z")

</div>

Si avevo notato quei due metodi nella libreria, idem l'esempio, ma come hai notato tu non è molto chiaro.

Comunque aspetterò che venerdì mi arrivino i componenti ed inizierò facendo qualche prova...vi aggiorno!!

Buona serata e grazie ancora,  
Lucio

---

<div class="post-metadata">

**Author:** ![gpb01](https://dub1.discourse-cdn.com/arduino/user_avatar/forum.arduino.cc/gpb01/32/830685_2.png) [@gpb01](https://forum.arduino.cc/u/gpb01)\
**Post date:** [January 31, 2024, 4:44pm UTC](https://forum.arduino.cc/t/can-bus-r4-minima/1217504/14 "2024-01-31T16:44:50Z")

</div>

> [@lucio\_lucio](#):
>
> idem l'esempio, ma come hai notato tu non è molto chiaro.

Beh, no, l'esempio [CANReadFilter](https://github.com/arduino/ArduinoCore-renesas/blob/main/libraries/Arduino_CAN/examples/CANReadFilter/CANReadFilter.ino) **è piuttosto chiaro** , fa vedere esattamente come filtra i due ID di demo, sia quello standard (_usa il valore 0x10_) che quello extended (_usa il valore 0x100_).

Guglielmo

---

<div class="post-metadata">

**Author:** ![nid69ita](https://dub1.discourse-cdn.com/arduino/user_avatar/forum.arduino.cc/nid69ita/32/901258_2.png) [@nid69ita](https://forum.arduino.cc/u/nid69ita)\
**Post date:** [January 31, 2024, 4:58pm UTC](https://forum.arduino.cc/t/can-bus-r4-minima/1217504/15 "2024-01-31T16:58:47Z")

</div>

Secondo me il trucco è nell'oggetto CanMsg. L'id gli viene messo dentro come nell'esempio CANwrite.ino

Poi nella CANRead.ino dovrebbero specificarlo meglio, credo si usa getStandardId() oppure getExtendedId() (non so quale usare):

```arduino
uint32_t const CAN_ID = 0x20;
void loop()
{
  if (CAN.available())
  {
    CanMsg const msg = CAN.read();
    if( msg.getStandardId() == CAN_ID ) // filtro il 0x20
    { Serial.println(msg);
    }
  }
}

```

---

<div class="post-metadata">

**Author:** ![lucio\_lucio](https://dub1.discourse-cdn.com/arduino/user_avatar/forum.arduino.cc/lucio_lucio/32/1126520_2.png) [@lucio\_lucio](https://forum.arduino.cc/u/lucio_lucio)\
**Post date:** [January 31, 2024, 5:18pm UTC](https://forum.arduino.cc/t/can-bus-r4-minima/1217504/16 "2024-01-31T17:18:14Z")

</div>

@gpb01 si quella parte si, confonde un po' l'inizio dove parla di "mailbox"

@nid69ita potresti avere ragione...non vedo l'ora di riuscire a fare qualche esperimento

Lucio

---

<div class="post-metadata">

**Author:** ![lucio\_lucio](https://dub1.discourse-cdn.com/arduino/user_avatar/forum.arduino.cc/lucio_lucio/32/1126520_2.png) [@lucio\_lucio](https://forum.arduino.cc/u/lucio_lucio)\
**Post date:** [February 2, 2024, 2:37pm UTC](https://forum.arduino.cc/t/can-bus-r4-minima/1217504/17 "2024-02-02T14:37:30Z")

</div>

Ciao a tutti,  
ho montato i componenti e gli esempi funzionano alla grande.  
Ora, prima di filtrare i messaggi, dovrei capire come mandare sulla linea CAN testi e valori float...avete idee?

Lucio

---

<div class="post-metadata">

**Author:** ![nid69ita](https://dub1.discourse-cdn.com/arduino/user_avatar/forum.arduino.cc/nid69ita/32/901258_2.png) [@nid69ita](https://forum.arduino.cc/u/nid69ita)\
**Post date:** [February 2, 2024, 3:19pm UTC](https://forum.arduino.cc/t/can-bus-r4-minima/1217504/19 "2024-02-02T15:19:49Z")

</div>

Ni.  
Occhio che i messaggi CANbus sono al massimo di 8 byte !! MAX\_DATA\_LENGTH = 8  
quando crei o ricevi la variabile msg, essa è un oggetto che contiene:

- id (intero senza segno a 32 bit)
- data\_length (lunghezza messaggio max 8)
- data (gli 8 byte del mesaggio)

[CanMsg](https://github.com/arduino/ArduinoCore-API/blob/master/api/CanMsg.h) const msg(CanStandardId(CAN\_ID), sizeof(msg\_data), msg\_data);

msg.data[0] primo byte  
msg.data[1] secondo byte  
etc. fino a msg.data[7]  
ancora meglio da 0 a msg.data\_length

---

<div class="post-metadata">

**Author:** ![lucio\_lucio](https://dub1.discourse-cdn.com/arduino/user_avatar/forum.arduino.cc/lucio_lucio/32/1126520_2.png) [@lucio\_lucio](https://forum.arduino.cc/u/lucio_lucio)\
**Post date:** [February 2, 2024, 4:20pm UTC](https://forum.arduino.cc/t/can-bus-r4-minima/1217504/20 "2024-02-02T16:20:25Z")

</div>

Allora forse ci sono...  
`uint8_t const msg_data[] = {0,0,0,0,0,0,0,0};` con questo alloco la memoria con un array di 8 byte che se stampo mi ritornerà una stringa di 8 zeri.

Ora quello che sono riuscito a fare è spedire una stringa dichiarandola come `uint8_t const msg_data[] = "ciao";` e passandola direttamente a CanMsg. Ora quello che non mi torna è: a cosa mi serve la dichiarazione di prima? (direi a nulla).  
In ogni caso l'output che ottengo è sempre hex...come lo ritrasformo in dato leggibile? usando string()?

---

<div class="post-metadata">

**Author:** ![nid69ita](https://dub1.discourse-cdn.com/arduino/user_avatar/forum.arduino.cc/nid69ita/32/901258_2.png) [@nid69ita](https://forum.arduino.cc/u/nid69ita)\
**Post date:** [February 2, 2024, 4:35pm UTC](https://forum.arduino.cc/t/can-bus-r4-minima/1217504/21 "2024-02-02T16:35:45Z")

</div>

Se usi la Serial.print del msg, l'oggetto CanMsg stampa i singoli byte che compongono il messaggio  
Al link del mio post #19 hai il codice della classe [CanMsg](https://github.com/arduino/ArduinoCore-API/blob/master/api/CanMsg.h) e guarda la printTo() che è quella incaricata di stampare in generale un CanMsg con un print  
Ad un certo punto stampa i singoli byte in esa con snprintf(buf, sizeof(buf), "%02X", data[d])

Prova a fare Serial.println(msg.data); essendo data un array di byte (unsigned 8 bit) dovrebbe stamparlo come una stringa classica del C

string() credo sia un metodo della classe String, evitale su queste piccole MCU. Dobbiamo parlare di [stringhe classiche del C](https://www.xcoding.it/lezione/stringhe-in-c/) ovvero array di unsigned char o array di byte terminati da null (valore 0)

uint8\_t msg\_data[] = "ciao"; è una stringa classica del C di 5 elementi, ovvero hai un array di byte con dentro i valori ascii dei caratteri esempio 'c' è 99 (in esadecimale 0x63)  
msg\_data[0] = 99  
msg\_data[1] = 105  
msg\_data[2] = 97  
msg\_data[3] = 111  
msg\_data[4] = 0

[Next page](https://forum.arduino.cc/t/can-bus-r4-minima/1217504.md?page=2)
