Connessione wireless Arduino - PC con NRF24LU1 e NRF24L01

Salve, avendo la necessità di far comunicare il mio Arduino Leonardo con il pc tramite porta seriale via wireless ho acquistato questo kit: http://www.elechouse.com/elechouse/index.php?main_page=product_info&cPath=&products_id=2218

Nella descrizione è specificato che funziona con tutte le piattaforme Arduino eccetto la Due, ora provandolo con il mio (Arduino Leonardo) nel momento in cui vado a caricare lo sketch ricevo questo errore:

Found programmer: Id = "B¯e"; type = Software Version = . ; Hardware Version = . avrdude: error: buffered memory access not supported. Maybe it isn't a butterfly/AVR109 but a AVR910 device?

Forse dovrei riprogrammare il modulo tramite ISP? Se fosse così, sapreste dirmi come farlo.

Grazie in anticipo.

Nessuno sa aiutarmi?

Ma quando cerchi di caricare lo sketch hai anche attaccato quel dispositivo? Se quello è attaccato logicamente il PC sente su RX e TX anche lui e cerca di dialogare con lui e non con la Leonardo.

nid69ita: Ma quando cerchi di caricare lo sketch hai anche attaccato quel dispositivo? Se quello è attaccato logicamente il PC sente su RX e TX anche lui e cerca di dialogare con lui e non con la Leonardo.

Ho provato a caricare lo sketch sia con il dispositivo sia tramite cavo, naturalmente nel primo caso il caricamento è fallito.

Poi ho caricato lo sketch tramite cavo ed ho provato a ricevere ed inviare i dati tramite il dispositivo, ma non funziona nulla.

Non ti seguo. L'errore della tua immagine mi pareva fosse un problema di upload su Leonardo di uno sketch. Ora dici che lo sketch lo hai caricato su Leonardo. Chiedi se riprogrammare dispositivo con ICSP, quale dispositivo? Non capisco quali sono i soggetti. Ma vuoi usare quei moduli per comunicare wireless o per fare upload wireless? Tra Arduino e Slave, hai incrociato TX con RX e viceversa?

Scusami se sono stato poco chiaro. Allora a me quello che interessa è avere una comunicazione wireless tra arduino ed il pc, in particolare ho la necessità di inviare ad arduino dei comandi provenienti da un joystick. La cosa tramite cavo funziona perfettamente, ma se provo ad usare il dispositivo non riesco ad inviare alcun dato.

Allora per verificare che ci sia un qualche "collegamento" ho provato a fare l'upload tramite il dispositivo (che tra l'altro dovrebbe funzionare ugualmente da quanto riportato nella descrizione) ma non funziona. Leggendo sempre la descrizione dell'oggetto ho visto che è possibile riprogrammarlo. Non vorrei che ci sia bisogno di caricare il bootloader di arduino leonardo sul dispositivo.

Queste sono solo mie ipotesi e potrebbero anche essere sbagliate, per questo chiedo a qualcuno più esperto se sa aiutarmi.

EDIT: si ho incrociato RX e TX tra arduino (pin 0 e 1 giusto?) e slave

Nessun altro aiuto?

Io non ho altre idee. Sorry

Ricominciamo da capo … e vediamo se ne usciamo … :roll_eyes:

domanda numero 1 … che versione di IDE stai usando ?

domanda numero 2 … sul PC hai caricato i driver per Arduino DUE ?

Guglielmo

La versione dell'IDE è la 1.0.5. No non ho caricato i driver di Arduino DUE, come dovrei fare?

Sono necessari solo se usi Windows. Sono presenti nella cartella /drivers all'interno dell'IDE di Arduino. Se Windows ti ha installato dei driver predefiniti, toglili materialmente dal computer, poi ricollegando la scheda scegli di specificare la cartella da cui installare i driver e punta al suddetto percorso. Nel caso invece di Linux/Mac, i driver non servono.

Ok, allora i driver erano già installati comunque ho provato a disinstallarli ed a rimetterli ma continua a non funzionare.

… mmm walter4991 … da quello che dici dimostri di aver letto però superficialmente il link che hai dato. :roll_eyes:

… è chiaramente specificato : "Plug in this module into PC USB port. This device could be Arduino DUE. If you don’t have driver, install the driver of DUE: “C:*arduino-1.5.2*\drivers\Arduino Due Programming Port.inf”

… quindi, dato che per la DUE si deve usare l’IDE versione 1.5.x e che l’ultima versione è la 1.5.6-r2, comincia a scaricarti QUESTO ed ad installare l’ultima versione del driver.

A quel punto il modulo master dovrebbe venir riconosciuto dal PC come un Arduino DUE (… come te lo mostra già adesso, ma con i driver sicuramente aggiornati).

Step successivo … cosa vuoi fare ? Comunicare o programmare Arduino ? Perché, come puoi leggere, sono necessari collegamenti leggermente differenti (per la programmazione occorre collegare il segnale di RESET) …

Guglielmo

Grazie delle informazioni, bene ora ho aggiornato l'IDE con la versione che mi hai fornito. Comunque continua a non funzionare.

Ho provato a scegliere sia Programming Port che Native USB Port per Arduino Due, ma nulla.

Comunque il mio scopo è di comunicare con Arduino.

... NON è li che devi scegliere la porta, quello schermata, come vedi è relativa alla "Board", dove devi scegliere la "Leonardo", poi devi andare alla voce "Port" e scegliere la stessa COMx che nelle risorse del sistema hai visto riconosciuta come Arduino DUE !

Se scegli da li di sicuro non funziona ... :roll_eyes:

Guglielmo

Avevo già fatto questa prova. Comunque come puoi vedere il dispositivo usa la porta COM17, ed io ho selezionato questa porta e come scheda Arduino Leonardo, ma non ricevo nessun dato.

Naturalmente se seleziono la porta COM19, che è quella usata dal cavo USB, tutto funziona normalmente.

Ok ... quindi "Board = Leonardo", "Port = COM17" ... ... ora, dato che più occhi vedono meglio di due, il passo successivo per provare a capirci qualche cosa è che tu metta una foto (... nitida mi raccomando XD) del tutto ;)

Guglielmo

P.S. : Ho solo dubbi sulla differente tecnica di programmazione della Leonardo ...

... anche se, il gioco con il "Reset" dovrebbe comunque funzionare, come leggibile sul reference, alla sezione "Automatic (Software) Reset and Bootloader Initiation" :

"Rather than requiring a physical press of the reset button before an upload, the Leonardo is designed in a way that allows it to be reset by software running on a connected computer. The reset is triggered when the Leonardo's virtual (CDC) serial / COM port is opened at 1200 baud and then closed. When this happens, the processor will reset, breaking the USB connection to the computer (meaning that the virtual serial / COM port will disappear). After the processor resets, the bootloader starts, remaining active for about 8 seconds. The bootloader can also be initiated by pressing the reset button on the Leonardo. Note that when the board first powers up, it will jump straight to the user sketch, if present, rather than initiating the bootloader. Because of the way the Leonardo handles reset it's best to let the Arduino software try to initiate the reset before uploading, especially if you are in the habit of pressing the reset button before uploading on other boards. If the software can't reset the board you can always start the bootloader by pressing the reset button on the board."

... sulla Leonardo, la porta Serial (pin 0 e 1) è cosa diversa dalla porta di programmazione (la USB). Difatti, leggendo la sezione "Communication" si trova :

"The Leonardo has a number of facilities for communicating with a computer, another Arduino, or other microcontrollers. The ATmega32U4 provides UART TTL (5V) serial communication, which is available on digital pins 0 (RX) and 1 (TX). The 32U4 also allows for serial (CDC) communication over USB and appears as a virtual com port to software on the computer. The chip also acts as a full speed USB 2.0 device, using standard USB COM drivers. On Windows, a .inf file is required. The Arduino software includes a serial monitor which allows simple textual data to be sent to and from the Arduino board. The RX and TX LEDs on the board will flash when data is being transmitted via the USB connection to the computer (but not for serial communication on pins 0 and 1)."

NON sono quindi sicuro che quel tuo modulo possa essere utilizzato per programmare la Leonardo, visto che si collega tramite i pin RX e TX !

Guglielmo

Ma a me non serve programmare la Leonardo, i potrei pure programmarla collegandola col cavo usb, l'importatante è che possa ricevere ed inviare dati.

Comunque queste sono le foto dei collegamenti (le metto come link altrimenti occuperei troppo spazio nel post)

Grazie per l'aiuto.

PS: potrebbe essermi d'aiuto QUESTO ?

walter4991: Comunque queste sono le foto dei collegamenti (le metto come link altrimenti occuperei troppo spazio nel post)

Ok, i collegamenti mi sembrano regolari ... verifica il buon contatto dei jumper, ma non credo sia li il problema ... ... non trovo indicazioni sulla velocità della porta seriale ... tu le hai trovate ? A che velocità ci stai colloquiando ?

walter4991: PS: potrebbe essermi d'aiuto QUESTO ?

Se tu fossi stato su una UNO sarebbe stata la prima cosa che ti avrei suggerito, sulla Leonardo ... non dovrebbe essere necessaria ... comunque definire una SoftwareSerial, ad esempio sui pin 10 (RX) e 11 (TX) è cosa rapida e puoi sempre fare la prova ;)

Guglielmo

I collegamenti andavano bene. Comunque io subito dopo aver scritto il post precedente avevo provato ad usare la SoftwareSerial ma non funzionava ugualmente.
Adesso ho riprovato e sta funzionando tutto alla perfezione! :smiley: Forse prima avevo sbagliato qualcosa nel codice.

Comunque posso usare come pin di RX e TX dal numero 8 in poi, se ad esempio impostassi il 7 per l’RX e il numero 8 per il TX non funziona! :expressionless:

Vabbè comunque ora finalmente sono riuscito sia ad inviare dati (per ora tramite la tastiera del pc) che a riceverli (leggo le distanze misurate da un sensore ad ultrasuoni HC-SR04) XD Questo è lo sketch che ho usato:

#include <SoftwareSerial.h>

SoftwareSerial mySerial( 8, 9 );

char input=' ';

// PIN DEL SENSORE HC-SR04
int triggerP = 3;
int echoP = 2;

void setup()  
{
  pinMode(triggerP, OUTPUT );
  pinMode(echoP, INPUT );
  mySerial.begin( 9600 );
}

void loop()
{
  if( mySerial.available() )
    input = mySerial.read();
  
  // INIZIO CALCOLO DISTANZA
  digitalWrite(triggerP, LOW );
  digitalWrite(triggerP, HIGH );
  delayMicroseconds( 10 );
  digitalWrite(triggerP, LOW );
   
  long durata = pulseIn(echoP, HIGH );
  
  long r = durata / 58;
  // FINE CALCOLO DISTANZA
  
  mySerial.print(input);
  mySerial.print(": ");
  mySerial.println(r);
  
  delay(500);
}

Ti ringrazio ancora per tutti i consigli e l’aiuto che mi hai dato! :wink: