IL led RX dell'ard nano (nuovo) blinka di rosso quando faccio l'upload sketch

Buongiorno,

stamane ho trovato un progetto pilota interessante in howtomechatronics.com in cui si realizza una comunicazione bidirezionale tra due moduli wireless.
La comunicazione monodirezionale dall’arduino uno al nano funziona perfettamente (ho pilotato il servo in modalità wireless attraverso un joystick).
Le dolenti note ci sono quando voglio dall’arduino nano accendere un led posizionato sull’arduino uno attraverso un interruttore a pulsante.
Ho notato che quando faccio l’upload dello sketch (che allego per completezza) il led rx dell’arduino nano blinka di rosso mentre quello tx verde.
Non è che per caso si è fritto qualcosa, o c’è qualche difetto di fabbricazione…
L’arduino nano è nuovo e per giunta originale.

Grazie per la collaborazione

Buona giornata

Riccardo

Servo_wireless_receiver_modified_5.ino (1.23 KB)

Allego anche il link del progetto e il file .ino del transmitter

Buona giornata

Servo_wireless_transmitter_modified2.ino (1.21 KB)

per l'autore:
ad una prima occhiata non ho trovato nulla di strano

perché hai modificato la dichiarazione degli indirizzi?

hai controllato sul receiver che il bottone vada?

invece per chi ne sa più di noi:
ho letto il sito, e non capisco alcune cose:
perché per l'indirizzo usa un array di byte e non di char?

perché per trasmettere una stringa passa l'indirizzo dell'array di char?

 const char text[] = "Hello World";
 radio.write(&text, sizeof(text));

text è già l'indirizzo dell'array, o ricordo male?
è un array, non una variabile singola, il suo nome riferisce all'indirizzo, infatti viene passato come puntatore senza bisogno di referenziarlo, giusto? come qui

 const char text[] = "Hello World";
 Serial.print(text);

non mi serve di passarli l'indirizzo
questo non capisco

Ducembarr:
... perché per l'indirizzo usa un array di byte e non di char?

perché per trasmettere una stringa passa l'indirizzo dell'array di char?

 const char text[] = "Hello World";

radio.write(&text, sizeof(text));




text è già l'indirizzo dell'array, o ricordo male?

Infatti bastava passare solo 'text' ... il metodo write è difatti definito come:

bool write( const void* buf, uint8_t len );

... quindi vuole il puntatore al buffer e la sua lunghezza e 'text' è già il puntatore al buffer.

In questo caso comunque la cosa non dovrebbe comportare problemi, salvo non vengano poi fatte operazioni matematiche su quel pointer, difatti:

  • 'text' è il pointer al PRIMO elemento dell'array (quindi incrementando di 1 il pointer si avanza di una quantità pari alla dimensione del singolo elemento)

  • '&text' è il pointer a TUTTO l'array (quindi incrementando di 1 il pointer si avanza di una quantità pari alla dimensione di tutto l'array)

E' cosa piuttosto subdola e può dare adito facilmente ad errori :wink:

Guglielmo

Ciao.
Per quanto riguarda il colore del led, guardando lo schematics, i colori corrispondono, è proprio fatto così.

NanoV3.3_sch.pdf (97.5 KB)

Buongiorno,

il problema non è ancora risolto.
Ho provato:
1 - A far comunicare una string di testo dal nano (transmitter) all’uno (receiver) una string di testo e funziona.
Sulla COM3 dell’Arduino Uno ricevo la string (funziona anche il viceversa (con la COM8)).
2 - Ho verificato il funzionamento di tutti i pin coinvolti (Pin 4 del receiver e Pin 4 del transmitter) con dei semplici sketch led e lavorano perfettamente (ovviamente ho inserito una resistenza da 220 ohm per limitare la corrente ad un valore cautelativo)
3 - Ho verificato la 5 v del nano e funziona.

Allora ho modificato gli sketch originali con il seguente scopo:
schiacciando un pushbutton sul nano mando un segnale high di input sul pin 4(del nano).
Questo segnale di input dovrebbe essere trasmesso all’Uno e una volta arrivato se HIGH mette il pin 4 (dell’uno) su HIGH altrimenti il pin 4 rimane low (e il led non si accende).

Se provo a caricare i due sketch (che riporto in allegato) noto che già a monte (sul nano (transmitter) nel monitor seriale non ricevo nessun numero nè 1 nè 0.
Quindi sembrerebbe che commetto qualche errore

Wireless_da_nano_a_uno_solo_led_transmitter.ino (964 Bytes)

Wireless_da_nano_a_uno_receiver_led.ino (904 Bytes)

Ma sulla UNO ... a che pin hai collegato il modulo radio ? ? ?

Guglielmo

Buongiorno

I pin collegati al modulo radio sulla uno sono i seguenti:
3.3 V uno - 3.3 v modulo radio
gnd uno - gnd modulo radio
8 sulla uno - CSN radio
7 sulla uno - CE radio
13 sulla uno - SCK radio
11 sulla uno- MOSI radio
12 sulla uno- MISO radio

Come detto il modulo funziona controllando un servomotore(sulla nano) dalla uno e funziona mandando string di testo sia in una direzione che nell'altra.

Grazie

Buona giornata

Riccardo

ardschrcr1987:
Se provo a caricare i due sketch (che riporto in allegato) noto che già a monte (sul nano (transmitter) nel monitor seriale non ricevo nessun numero nè 1 nè 0.
Quindi sembrerebbe che commetto qualche errore

infatti

tu sul trasmettitore trasmetti solo se hai "radio.available()"

ma siccome il ricevitore non trasmette mai, il trasmettitore non avrà mai "radio.available()"

ripensa al diagramma di flusso

Grazie per il suggerimento,

non ho ancora ottenuto la comunicazione bidirezionale però sono riuscito a tramettere dal nano all’uno e accendere il led.
Allego gli sketch se a qualcuno possono servire…

Grazie

Buona giornata

Riccardo

Wireless_da_nano_a_uno_solo_led_transmitter_prova2_funziona.ino (866 Bytes)

Wireless_da_nano_a_uno_receiver_led.ino (904 Bytes)

Ciao,

mi fate un favore?

mi provate questo codice?

#include <SPI.h>
#include <nRF24L01.h>
#include <RF24.h>
#define LED 13
#define LOCALED 14
#define PULS 12
RF24 radio(7, 8); // CE, CSN

void setup()
{
    pinMode(LED, OUTPUT);
    pinMode(PULS, INPUT);
    pinMode(LOCALED, OUTPUT)
    radio.begin();
    radio.openWritingPipe(00002);
    radio.openReadingPipe(1, 00001);
    radio.setPALevel(RF24_PA_MIN);
}
void loop()
{
    static boolean old = !digitalRead(PULS);
    boolean pulsante = digitalRead(PULS);

    if (pulsante != old)
    {
        delay(5);
        radio.stopListening();
        digitalWrite(LOCALED, pulsante);
        radio.write(pulsante, 1);
        delay(5);
        radio.startListening();
    }

    if (radio.available())
    {
        boolean ricevuto = 0;
        radio.read(ricevuto, 1);
        digitalWrite(LED, ricevuto);
    }
}

è previsto per essere ambidestro, uguale tra trasmettitore e ricevitore, non ci sono differenze, basta girare i due indirizzi alle righe 15 e 16 della setup
se da un arduino si preme il pulsante al pin 12 si accende il led al pin 14 qui e quello al pin 13 sull’arduino lontano
e viceversa, spero

però io non ho quei moduli, l’autore mi farebbe una cortesia se provasse, così magari imparo qualcosina

Ok, nei prossimi giorni faccio il circuito e lo provo.

Buona serata

Riccardo