SPI : RPi en mode esclave ? Alternatives ?
Modérateur : Francois
SPI : RPi en mode esclave ? Alternatives ?
Bonjour,
Dans le cadre d'un projet, j'aimerais envoyer des données en SPI depuis une Arduino Uno vers un Raspberry Pi 3. Après m'être renseigné sur le sujet, je suis parti sur l'Arduino en mode maître et le RPi en mode esclave, mais apparemment le RPi ne peut être utilisé qu'en mode maître (article d'août 2012). Vu ce que je trouve sur le sujet en cherchant, je suppose que c'est toujours d'actualité en juillet 2017, mais pouvez-vous me le confirmer ?
Avec la forte probabilité que ce soit le cas, est-ce qu'inverser les rôles (Arduino esclave, RPi maître) est possible pour envoyer des données de l'Arduino au RPi ? Le fonctionnement du SPI décrit de manière simple sur Wikipédia indique que l'esclave répond aux requêtes du maître, et suggère donc que l'esclave seul ne peut pas communiquer avec le maître sans requête de sa part ; c'est au maître de "tirer" les informations depuis l'esclave : c'est bien ça ? Idéalement, j'aimerais envoyer des données en continu depuis l'Arduino, avec le Pi qui écoute en boucle sur la broche SS, sans qu'il y a de requête du RPi.
Actuellement, en me basant sur ce tuto, j'arrive à envoyer des données du RPi vers l'Arduino, mais c'est l'inverse que je souhaite faire.
Merci d'avance pour vos réponses à mes questions.
Dans le cadre d'un projet, j'aimerais envoyer des données en SPI depuis une Arduino Uno vers un Raspberry Pi 3. Après m'être renseigné sur le sujet, je suis parti sur l'Arduino en mode maître et le RPi en mode esclave, mais apparemment le RPi ne peut être utilisé qu'en mode maître (article d'août 2012). Vu ce que je trouve sur le sujet en cherchant, je suppose que c'est toujours d'actualité en juillet 2017, mais pouvez-vous me le confirmer ?
Avec la forte probabilité que ce soit le cas, est-ce qu'inverser les rôles (Arduino esclave, RPi maître) est possible pour envoyer des données de l'Arduino au RPi ? Le fonctionnement du SPI décrit de manière simple sur Wikipédia indique que l'esclave répond aux requêtes du maître, et suggère donc que l'esclave seul ne peut pas communiquer avec le maître sans requête de sa part ; c'est au maître de "tirer" les informations depuis l'esclave : c'est bien ça ? Idéalement, j'aimerais envoyer des données en continu depuis l'Arduino, avec le Pi qui écoute en boucle sur la broche SS, sans qu'il y a de requête du RPi.
Actuellement, en me basant sur ce tuto, j'arrive à envoyer des données du RPi vers l'Arduino, mais c'est l'inverse que je souhaite faire.
Merci d'avance pour vos réponses à mes questions.
- RPi 3 + LibreELEC / RPi 3 + RetroPie / RPi B+ + Sense HAT ou Framboisedorf ou module caméra
- Arduino Mega, Uno, Nano
- Freescale FRDM KL25Z
-
- Raspinaute
- Messages : 735
- Enregistré le : lun. 22 déc. 2014 16:50
- Localisation : 67380 LINGOLSHEIM
Re: SPI : RPi en mode esclave ? Alternatives ?
Je te redis bonjour car c'est un nouveau fil
D'où ma question sur l'autre fil de discussion sur le nombre de fils autorisés entre l'Arduino et le Pi.
Comme tu as droit à) autant de fils que nécessaires, pourquoi ne pas faire déclencher une interruption par l'Arduino sur un port GPIO du Raspberry ?
L’Arduino fait l'acquisition du signal, le mouline pour extraire l'intervalle et la durée, mets tout ça en buffer et lève le doigt en disant "M. Framboise, j’ai quelque chose pour vous"
Sylvain
D'où ma question sur l'autre fil de discussion sur le nombre de fils autorisés entre l'Arduino et le Pi.
Comme tu as droit à) autant de fils que nécessaires, pourquoi ne pas faire déclencher une interruption par l'Arduino sur un port GPIO du Raspberry ?
L’Arduino fait l'acquisition du signal, le mouline pour extraire l'intervalle et la durée, mets tout ça en buffer et lève le doigt en disant "M. Framboise, j’ai quelque chose pour vous"
Sylvain
Re: SPI : RPi en mode esclave ? Alternatives ?
Je n'ai que deux broches sur lesquelles utiliser des interruptions côté Arduino (pins 2 et 3), toutes deux étant utilisées : ça ne poserait pas de problème ? Ce serait côté RPi que l'interruption "attendrait" du coup, donc j'imagine que non.spourre a écrit :Comme tu as droit à) autant de fils que nécessaires, pourquoi ne pas faire déclencher une interruption par l'Arduino sur un port GPIO du Raspberry ?
L’Arduino fait l'acquisition du signal, le mouline pour extraire l'intervalle et la durée, mets tout ça en buffer et lève le doigt en disant "M. Framboise, j’ai quelque chose pour vous"
Dans le code ça se traduirait comment ? J'imagine mon interruption côté RPi qui attendrait, et une simple digitalWrite(pin, HIGH); côté Arduino pour déclencher quelque chose, ça y ressemble ?
- RPi 3 + LibreELEC / RPi 3 + RetroPie / RPi B+ + Sense HAT ou Framboisedorf ou module caméra
- Arduino Mega, Uno, Nano
- Freescale FRDM KL25Z
-
- Raspinaute
- Messages : 248
- Enregistré le : mar. 7 oct. 2014 09:46
- Localisation : Morsang / Orge - Essonne
- Contact :
Re: SPI : RPi en mode esclave ? Alternatives ?
Bonjour,
Je ne comprends pas ton problème, si tu veux que l'arduino envoie des données à ton RPI pourquoi ne pas utiliser une liaison USB ?
Avec un programme sur le RPI qui écoute l'arduino.
Je ne comprends pas ton problème, si tu veux que l'arduino envoie des données à ton RPI pourquoi ne pas utiliser une liaison USB ?
Avec un programme sur le RPI qui écoute l'arduino.
DS712+ 2x Western Digital WD10EADS-00L 1000 GB (SHR) - Firmware: DSM 6.1.6-15266
Raspberry - RFXTRX433 - Aeon Labs ZStick V2 - Domoticz
FreeBox v6
https://meteo.folcke.net
https://wiki.folcke.net
Raspberry - RFXTRX433 - Aeon Labs ZStick V2 - Domoticz
FreeBox v6
https://meteo.folcke.net
https://wiki.folcke.net
Re: SPI : RPi en mode esclave ? Alternatives ?
Bonjour ! Mes excuses, je suis sur un projet dont je présente le contexte depuis plusieurs sujets déjà, donc j'ai fait ici la version courte.mike913 a écrit :Je ne comprends pas ton problème, si tu veux que l'arduino envoie des données à ton RPI pourquoi ne pas utiliser une liaison USB ?
Avec un programme sur le RPI qui écoute l'arduino.
C'est dans le cadre d'un projet de stage, et on m'impose le SPI pour communiquer d'Arduino à RPi !
- RPi 3 + LibreELEC / RPi 3 + RetroPie / RPi B+ + Sense HAT ou Framboisedorf ou module caméra
- Arduino Mega, Uno, Nano
- Freescale FRDM KL25Z
-
- Raspinaute
- Messages : 735
- Enregistré le : lun. 22 déc. 2014 16:50
- Localisation : 67380 LINGOLSHEIM
Re: SPI : RPi en mode esclave ? Alternatives ?
Bonsoir,mike913 a écrit :Bonjour,
Je ne comprends pas ton problème, si tu veux que l'arduino envoie des données à ton RPI pourquoi ne pas utiliser une liaison USB ?
Avec un programme sur le RPI qui écoute l'arduino.
Outre que le SPI est imposé comme le dit Pinhapple, l'USB ne réglera pas le problème.
C'est une liaison série (comme le SPI) et faire tourner un programme qui "écoute" l'Arduino implique de faire tourner une boucle infinie.
Pour des raisons de timing et de charge CPU, c'est une très mauvaise solution car le programme va tourner en rond et dérouler des milliers de cycles en pure perte.
Ce point a été bien abordé par Bud Spencer dans la partie Blog (saga BP) et au cours des nombreux fils lancés par Pinhapple dans le cadre de son projet.
Sylvain
-
- Raspinaute
- Messages : 735
- Enregistré le : lun. 22 déc. 2014 16:50
- Localisation : 67380 LINGOLSHEIM
Re: SPI : RPi en mode esclave ? Alternatives ?
Petite précision (tu connais mon soucis du détail):Pinhapple a écrit : ....
Je n'ai que deux broches sur lesquelles utiliser des interruptions côté Arduino (pins 2 et 3), toutes deux étant utilisées : ça ne poserait pas de problème ? Ce serait côté RPi que l'interruption "attendrait" du coup, donc j'imagine que non.
Dans le code ça se traduirait comment ? J'imagine mon interruption côté RPi qui attendrait, et une simple digitalWrite(pin, HIGH); côté Arduino pour déclencher quelque chose, ça y ressemble ?
L'interruption est armée sur le Raspberry.
Côté Arduino, le programme (ou la thread) qui traite les signaux, fait le calcul et remplit le buffer de transmission, termine en mettant une pin (à déterminer) à 1 puis 0.
BTW, l'Arduino (et les récepteurs différentiels) est-il toujours alimenté en 5 V ? Si oui, il faudra encore une interface entre l'Arduino et le Raspberry pour revenir à 3.3V pour ne pas tuer le GPIO du Pi (résistance simple, pont, transistor, optocoupleur ..).
Sylvain
-
- Raspinaute
- Messages : 248
- Enregistré le : mar. 7 oct. 2014 09:46
- Localisation : Morsang / Orge - Essonne
- Contact :
Re: SPI : RPi en mode esclave ? Alternatives ?
Bonjour,spourre a écrit :Bonsoir,mike913 a écrit :Bonjour,
Je ne comprends pas ton problème, si tu veux que l'arduino envoie des données à ton RPI pourquoi ne pas utiliser une liaison USB ?
Avec un programme sur le RPI qui écoute l'arduino.
Outre que le SPI est imposé comme le dit Pinhapple, l'USB ne réglera pas le problème.
C'est une liaison série (comme le SPI) et faire tourner un programme qui "écoute" l'Arduino implique de faire tourner une boucle infinie.
Pour des raisons de timing et de charge CPU, c'est une très mauvaise solution car le programme va tourner en rond et dérouler des milliers de cycles en pure perte.
Ce point a été bien abordé par Bud Spencer dans la partie Blog (saga BP) et au cours des nombreux fils lancés par Pinhapple dans le cadre de son projet.
Sylvain
Ce n'est peut-être pas une bonne solution, mais cela fonctionne chez moi de puis plusieurs mois.
Un RPI3 écoute 3 Arduino et insert les données ainsi reçue dans une base de données externe. Les arduino sont alimentés par le RPI, certains de ces arduino sont relié avec un câble USB de 15 mètres.
Vous pouvez voir le résultat sur mon site météo: http://meteo.folcke.net/
Et je m'excuse je n' avais pas vu que pour son projet l'utilisation du SPI était imposé.
Cordialement
DS712+ 2x Western Digital WD10EADS-00L 1000 GB (SHR) - Firmware: DSM 6.1.6-15266
Raspberry - RFXTRX433 - Aeon Labs ZStick V2 - Domoticz
FreeBox v6
https://meteo.folcke.net
https://wiki.folcke.net
Raspberry - RFXTRX433 - Aeon Labs ZStick V2 - Domoticz
FreeBox v6
https://meteo.folcke.net
https://wiki.folcke.net
Re: SPI : RPi en mode esclave ? Alternatives ?
J'ai eu une épiphanie ce matin en me réveillant, et j'ai compris ce que tu voulais dire !spourre a écrit :Petite précision (tu connais mon soucis du détail):
L'interruption est armée sur le Raspberry.
Côté Arduino, le programme (ou la thread) qui traite les signaux, fait le calcul et remplit le buffer de transmission, termine en mettant une pin (à déterminer) à 1 puis 0.
Donc on aurait bien le RPi en maître et l'Arduino en esclave, sauf que c'est l'Arduino qui signalerait au RPi qu'il a quelque chose pour lui, donc requête du RPi, donc réponse de l'Arduino. ("M. Framboise, j’ai quelque chose pour vous" !) Cette méthode me plaît, et contourne un peu le problème du maître et de l'esclave.
Toujours en 5 V. J'ai déjà mon pont diviseur de tension sur la ligne MISO qui est installé.spourre a écrit :BTW, l'Arduino (et les récepteurs différentiels) est-il toujours alimenté en 5 V ? Si oui, il faudra encore une interface entre l'Arduino et le Raspberry pour revenir à 3.3V pour ne pas tuer le GPIO du Pi (résistance simple, pont, transistor, optocoupleur ..).
Comme le MISO est la seule ligne qui va de l'Arduino au RPi, les autres faisant l'inverse, c'est la seule sur laquelle j'ai installé un pont diviseur de tension (5 V -> 3,3 V) : c'est suffisant ? Ou dois-je prendre des précautions sur les autres lignes ?
Ça peut être éventuellement une solution alternative à proposer. Ton site est bloqué ici au travail, je regarderai ça chez moi !mike913 a écrit :Un RPI3 écoute 3 Arduino et insert les données ainsi reçue dans une base de données externe. Les arduino sont alimentés par le RPI, certains de ces arduino sont relié avec un câble USB de 15 mètres.
Vous pouvez voir le résultat sur mon site météo: http://meteo.folcke.net/
Y a pas de souci, c'est surtout moi qui ne l'avais pas précisé dans ce sujet !mike913 a écrit :Et je m'excuse je n' avais pas vu que pour son projet l'utilisation du SPI était imposé.
Merci pour tes suggestions !
- RPi 3 + LibreELEC / RPi 3 + RetroPie / RPi B+ + Sense HAT ou Framboisedorf ou module caméra
- Arduino Mega, Uno, Nano
- Freescale FRDM KL25Z
-
- Raspinaute
- Messages : 735
- Enregistré le : lun. 22 déc. 2014 16:50
- Localisation : 67380 LINGOLSHEIM
Re: SPI : RPi en mode esclave ? Alternatives ?
Oh put* le c*n, j'ai failli lire autre chosePinhapple a écrit : ...
J'ai eu une épiphanie ce matin en me réveillant...
Tu as bien compris ma proposition (honnête).Pinhapple a écrit : Donc on aurait bien le RPi en maître et l'Arduino en esclave, sauf que c'est l'Arduino qui signalerait au RPi qu'il a quelque chose pour lui, donc requête du RPi, donc réponse de l'Arduino. ("M. Framboise, j’ai quelque chose pour vous" !) Cette méthode me plaît, et contourne un peu le problème du maître et de l'esclave.
....
Toujours en 5 V. J'ai déjà mon pont diviseur de tension sur la ligne MISO qui est installé.
Comme le MISO est la seule ligne qui va de l'Arduino au RPi, les autres faisant l'inverse, c'est la seule sur laquelle j'ai installé un pont diviseur de tension (5 V -> 3,3 V) : c'est suffisant ? Ou dois-je prendre des précautions sur les autres lignes ?
...
Tu peux aussi avoir une autre approche:
Le SPI du Raspberry peut gérer 2 esclaves , par un signal CS (chip Select). Tu peux utiliser ce signal pour demander la transmission à intervalle régulier (timer ? thread ?). C'est mieux que le polling et c'est le Pi qui garde le contrôle.
Dans le sens Arduino (5V) vers Pï (3.3V), un pont diviseur est suffisant.
Dans le sens Pi (3.3V) vers Arduino (5V), tu n'as pas besoin de pont diviseur mais, comme dé"jà expliqué (hé hé), il y a un risque de mauvais fonctionnement très difficile à déceler: En logique CMOS les niveaux H(ight) et L(ow) sont définis respectivement à 2/3 et 1/3 de Vcc (alimentation). Entre ces 2 niveaux, il y a indétermination, et le circuit peut prendre n'importe quel état.
Sylvain.
Modifié en dernier par spourre le jeu. 13 juil. 2017 16:41, modifié 1 fois.