Page 1 sur 2

SPI : RPi en mode esclave ? Alternatives ?

Posté : mer. 12 juil. 2017 18:21
par Pinhapple
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.

Re: SPI : RPi en mode esclave ? Alternatives ?

Posté : mer. 12 juil. 2017 19:23
par spourre
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

Re: SPI : RPi en mode esclave ? Alternatives ?

Posté : mer. 12 juil. 2017 19:57
par Pinhapple
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 ?

Re: SPI : RPi en mode esclave ? Alternatives ?

Posté : mer. 12 juil. 2017 20:06
par mike913
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.

Re: SPI : RPi en mode esclave ? Alternatives ?

Posté : mer. 12 juil. 2017 20:32
par Pinhapple
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 ! ;)

Re: SPI : RPi en mode esclave ? Alternatives ?

Posté : mer. 12 juil. 2017 23:02
par spourre
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

Re: SPI : RPi en mode esclave ? Alternatives ?

Posté : mer. 12 juil. 2017 23:12
par spourre
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

Re: SPI : RPi en mode esclave ? Alternatives ?

Posté : jeu. 13 juil. 2017 07:31
par mike913
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

Re: SPI : RPi en mode esclave ? Alternatives ?

Posté : jeu. 13 juil. 2017 10:17
par Pinhapple
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 !

Re: SPI : RPi en mode esclave ? Alternatives ?

Posté : jeu. 13 juil. 2017 10:53
par spourre
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.