2015-10-10 1 views
2

J'ai un projet Arduino qui utilise un module radio nRF24l01 + sur SPI (en utilisant cette bibliothèque: http://tmrh20.github.io/RF24/) et un lecteur RFID sur logiciel. Je dors mon Arduino et je les ai réveillés par interruption lorsqu'un message a été reçu ou qu'une étiquette RFID est prête à être lue. Le RFID est sur les broches 4 et 5, tandis que le nRF couvre les broches 9 - 13 ainsi que le numéro 2 pour son interruption.Softwareserial Arduino s'affrontant avec SPI?

Ces deux modules fonctionnent correctement avec le code de veille et d'interruption séparément, mais lorsqu'ils sont combinés dans une seule esquisse, l'Arduino se réveille à cause d'une étiquette RFID, le lit, puis essaie d'envoyer quelque chose par radio et alors il suffit de se bloquer en attendant l'appel de la librairie write() pour retourner.

Je me suis un peu penchée sur les deux bibliothèques, mais je ne peux pas faire la tête ou la queue de la bibliothèque de logiciels. Il semble peut-être utiliser les mêmes ISR dans les coulisses que mon module nRF, mais je ne vois pas immédiatement pourquoi cela devrait être un gros problème, et je ne comprends pas pourquoi cela devrait provoquer le blocage de la radio.

Je sais que cela peut être long, mais est-ce que quelqu'un a une idée de ce qui pourrait se passer? Peut-être que quelqu'un connaît ces bibliothèques? Des pensées sur un travail autour? Merci.

+0

voulez-vous dire le logiciel SPI avec le lecteur RFID? –

+0

Le lecteur RFID utilise le logiciel logiciel, donc utilise le protocole de type UART. Le nRF utilise SPI. – MaxStrange

+0

donc je prends les ports série du matériel sont tous pris? Quoi qu'il en soit, ils devraient travailler ensemble très bien. Comment la radio est-elle alimentée? une fourniture séparée? Est-ce un uno? si c'est uno et que vous utilisez le 3.3v, j'utiliserais une alimentation 3.3v séparée car la capacité actuelle est assez petite et l'ajout d'un autre périphérique par exemple pourrait l'empêcher de fonctionner. Cependant, si ce n'est pas le cas, alors après avoir lu depuis la RFID, désactivez la série logicielle afin qu'elle ne désactive pas les interruptions (au cas où elle en recevrait une autre pendant que vous essayez de transmettre). voir si ça marche. c'est un problème de logiciel ou de puissance avec la radio –

Répondre

0

J'ai rencontré les mêmes symptômes et le problème s'est avéré être un débordement de tampon dans mon code. Le dépassement lui-même était dû à SoftwareSerial octets de largage parce que la bibliothèque RF24 était interrompue avec sa gestion d'interruption.

Le code en question est lu à partir d'un récepteur GPS à l'aide de SoftwareSerial, analyse les phrases NMEA et extrait les informations de latitude et de longitude pour l'envoi par radio en utilisant RF24. Il va quelque chose comme ceci:

if (gpsSerial.available()) { 
    int c = gpsSerial.read(); 
    if (c == '\r') { 
    buf[bdx] = '\0'; 
    // process buf here, which contains a null terminated NMEA sentence 
    // and then send via RF24 
    bdx = 0; 
    else if (c != '\n' && bdx < BUFLEN) buf[bdx++] = c; 
} 

BUFLEN a été dimensionné de manière à être plus grande que toute peine NMEA unique.

Le lecteur expérimenté reprendra sur la ligne problématique:

buf[bdx] = '\0';

qui écrit à BUF sans vérification de gamme. En fonctionnement normal, avec un flux ininterrompu de caractères du module GPS, ce code fonctionne bien, car nous rencontrerons toujours un \r avant de manquer d'espace dans buf. Toutefois, l'envoi d'informations sur RF24 entraîne un délai suffisant pour que les caractères soient supprimés ou endommagés par SoftwareSerial, et cette hypothèse n'est plus valable.

Alors maintenant ce qui se passe est ceci:

  1. un \r est manqué, et la phrase précédente NMEA n'est pas mis au rebut
  2. la phrase suivante NMEA est lu dans buf
  3. bdx avance jusqu'à l'arrêt par la plage de vérification dans le else
  4. \r de la phrase suivante NMEA est contrée
  5. buf[bdx] = '\0'; écrit après la fin de buf

A ce stade, l'Arduino cesse de répondre, et il semble que write bloque.

Le correctif est cette ligne ajoutée avant la if:

if (bdx >= BUFLEN) bdx = 0; 

le code a fonctionné pendant plus de 5 heures sans problème, alors qu'auparavant il ne serait pas avec aucune autre modification que cette ligne, durer plus de 30 secondes avant write "blocs".