SPI : RPi en mode esclave ? Alternatives ?

Des infos, des conseils sur les bus DSI,CSI, I2C, SPI... du Raspberry Pi

Modérateur : Francois

Pinhapple
Raspinaute
Messages : 125
Enregistré le : jeu. 23 févr. 2017 15:53
Localisation : Rouen

SPI : RPi en mode esclave ? Alternatives ?

Message par Pinhapple » mer. 12 juil. 2017 18:21

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.
  • RPi 3 + LibreELEC / RPi 3 + RetroPie / RPi B+ + Sense HAT ou Framboisedorf ou module caméra
  • Arduino Mega, Uno, Nano
  • Freescale FRDM KL25Z

spourre
Raspinaute
Messages : 729
Enregistré le : lun. 22 déc. 2014 16:50
Localisation : 67380 LINGOLSHEIM

Re: SPI : RPi en mode esclave ? Alternatives ?

Message par spourre » mer. 12 juil. 2017 19:23

Je te redis bonjour car c'est un nouveau fil :ugeek:

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

Pinhapple
Raspinaute
Messages : 125
Enregistré le : jeu. 23 févr. 2017 15:53
Localisation : Rouen

Re: SPI : RPi en mode esclave ? Alternatives ?

Message par Pinhapple » mer. 12 juil. 2017 19:57

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"
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 ?
  • RPi 3 + LibreELEC / RPi 3 + RetroPie / RPi B+ + Sense HAT ou Framboisedorf ou module caméra
  • Arduino Mega, Uno, Nano
  • Freescale FRDM KL25Z

mike913
Raspinaute
Messages : 109
Enregistré le : mar. 7 oct. 2014 09:46
Localisation : Morsang / Orge - Essonne
Contact :

Re: SPI : RPi en mode esclave ? Alternatives ?

Message par mike913 » mer. 12 juil. 2017 20:06

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.
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.fr

Pinhapple
Raspinaute
Messages : 125
Enregistré le : jeu. 23 févr. 2017 15:53
Localisation : Rouen

Re: SPI : RPi en mode esclave ? Alternatives ?

Message par Pinhapple » mer. 12 juil. 2017 20:32

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.
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. :oops:
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

spourre
Raspinaute
Messages : 729
Enregistré le : lun. 22 déc. 2014 16:50
Localisation : 67380 LINGOLSHEIM

Re: SPI : RPi en mode esclave ? Alternatives ?

Message par spourre » mer. 12 juil. 2017 23:02

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.
Bonsoir,

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

spourre
Raspinaute
Messages : 729
Enregistré le : lun. 22 déc. 2014 16:50
Localisation : 67380 LINGOLSHEIM

Re: SPI : RPi en mode esclave ? Alternatives ?

Message par spourre » mer. 12 juil. 2017 23:12

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 ?
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.

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

mike913
Raspinaute
Messages : 109
Enregistré le : mar. 7 oct. 2014 09:46
Localisation : Morsang / Orge - Essonne
Contact :

Re: SPI : RPi en mode esclave ? Alternatives ?

Message par mike913 » jeu. 13 juil. 2017 07:31

spourre a écrit :
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.
Bonsoir,

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
Bonjour,

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.fr

Pinhapple
Raspinaute
Messages : 125
Enregistré le : jeu. 23 févr. 2017 15:53
Localisation : Rouen

Re: SPI : RPi en mode esclave ? Alternatives ?

Message par Pinhapple » jeu. 13 juil. 2017 10:17

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.
J'ai eu une épiphanie ce matin en me réveillant, et j'ai compris ce que tu voulais dire ! :D
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. ;)
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 ..).
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 ?
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/
Ça peut être éventuellement une solution alternative à proposer. Ton site est bloqué ici au travail, je regarderai ça chez moi ! :)
mike913 a écrit :Et je m'excuse je n' avais pas vu que pour son projet l'utilisation du SPI était imposé.
Y a pas de souci, c'est surtout moi qui ne l'avais pas précisé dans ce sujet ! ;)
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

spourre
Raspinaute
Messages : 729
Enregistré le : lun. 22 déc. 2014 16:50
Localisation : 67380 LINGOLSHEIM

Re: SPI : RPi en mode esclave ? Alternatives ?

Message par spourre » jeu. 13 juil. 2017 10:53

Pinhapple a écrit : ...
J'ai eu une épiphanie ce matin en me réveillant...
Oh put* le c*n, j'ai failli lire autre chose :lol: :lol: :lol:
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 as bien compris ma proposition (honnête).
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.

Répondre

Retourner vers « Les BUS interfaces »