jeu coopératif

Un lieu pour discuter des composants et de leur utilisation. Un passage obligé si vous devez interfacer votre Raspberry Pi avec le monde extérieur. On y trouvera aussi les cartes type commande de moteur pas à pas, continu, servo...

Modérateurs : Francois, smba38

Répondre
Avatar du membre
esope60
Messages : 15
Enregistré le : dim. 28 janv. 2018 11:05

jeu coopératif

Message par esope60 » dim. 28 janv. 2018 11:29

Bonjour à tous,

J'ai un projet en cours (déjà bien entamé) de jeu coopératif pour mes petits de 4 ans et demi et 2 ans et demi.
Je présente le jeu avant de poser ma question.
Il s'agit de deux pupitre connectés (câble) comportant chacun un certains nombre d'interrupteurs, LED, etc.
il y a en tout 11 modules. Pour chaque module, une recherche coopérative est menée par les deux joueurs. Exemple :
Un des modules consiste à faire sonner un téléphone, le joueur 1 répond et écoute les consignes (suite de couleurs lancées par un synthétiseur vocal en boucle). Il devra transmettre les informations au joueur 2 qui lui appuiera sur les boutons de couleurs.
Tous les modules sont dans ce style, certains plus simples que d'autre.
Ma question :
J'utilise un certains nombre de composants (dont les fameux MCP23017, je les adore). J'en ai deux dans chaque pupitre.
J'aimerais qu'au démarrage, je puisse vérifier que le câble est bien relié entre les deux pupitres (câble type RJ45) qui fait passer 8 fils (+5V, GN, SDA, SCL, shift register en cascade, son, etc.).
Pour cela je pense qu'il est envisageable de vérifier la présence d'un des MCP avec un genre de "i2cdetect -y 1" qui chercherais 0x22 ou 0x23 ( sachant que 0x20 et 0x21 sont forcément sur pupitre 1).
Auriez vous une idée de comment intégrer ça en python ?
Merci d'avance !

jelopo
Raspinaute
Messages : 307
Enregistré le : mer. 11 oct. 2017 10:23

Re: jeu coopératif

Message par jelopo » dim. 28 janv. 2018 13:11

Bonjour,

Quelques propositions ici :
https://www.raspberrypi.org/forums/view ... p?t=114401

A+

Bud Spencer
Raspinaute
Messages : 1089
Enregistré le : lun. 15 août 2016 21:38

Re: jeu coopératif

Message par Bud Spencer » dim. 28 janv. 2018 20:21

Il suffit juste de faire une eval du registre IOCON sur l'adresse de chaque 23017 susceptible d'être connecté. La valeur du bit 3 du registre indique clairement à elle seule si le chip est connecté (accessible) ou pas.
Le premier ennemi de la connaissance n’est pas l’ignorance, c’est l’illusion de la connaissance (S. Hawking).

Avatar du membre
esope60
Messages : 15
Enregistré le : dim. 28 janv. 2018 11:05

Re: jeu coopératif

Message par esope60 » dim. 28 janv. 2018 21:54

jelopo a écrit :Bonjour,

Quelques propositions ici :
https://www.raspberrypi.org/forums/view ... p?t=114401

A+
Merci, je vais voir si je peux me servir de ça.
Bud Spencer a écrit :Il suffit juste de faire une eval du registre IOCON sur l'adresse de chaque 23017 susceptible d'être connecté. La valeur du bit 3 du registre indique clairement à elle seule si le chip est connecté (accessible) ou pas.
Euh... Désolé je vois ce que tu veux dire mais techniquement aucune idée de comment on fait
:roll:

Bud Spencer
Raspinaute
Messages : 1089
Enregistré le : lun. 15 août 2016 21:38

Re: jeu coopératif

Message par Bud Spencer » mar. 30 janv. 2018 14:06

En fait, j’ai écrit une connerie. D’après la datasheet le bit HAEN(3) du registre IOCON est fixé à 0 sur les modèles i2c et l’adressage est systématique (logique puiqu'I2C). Perso, je n’utilise ces composant qu’en SPI mais si je travaillais avec des modèles I2C, je ferais mon évaluation sur le registre IORDIA qui est initialisé à 255 au reset.

Ceci dit, si tu ne sais pas comment aller lire et écrire dans les registres de tes composants, ça ne change pas grand-chose et je ne vois vraiment pas à quoi ils peuvent te servir.

Si tu utilises smbus avec python : Res = smbus.SMBus(1).read_byte_data(0x20,0x00)
Si tu utilises I2C-tools tu peux essayer un truc du genre : I2cget 1 0x20 0x00
1 correspond au n° de bus utilisé, 0x20 est l’adresse du composant visé et 0x00 l’adresse du registre IODIRA.
Le premier ennemi de la connaissance n’est pas l’ignorance, c’est l’illusion de la connaissance (S. Hawking).

Avatar du membre
esope60
Messages : 15
Enregistré le : dim. 28 janv. 2018 11:05

Re: jeu coopératif

Message par esope60 » mar. 30 janv. 2018 19:28

Merci de ta reponse.
Oui le 23017 fonctionne sur le bus I2C et le 23S17 fait la même chose via le SPI.
Pour ce qui est de lire le registre, ce qui est bien avec les raspberry c'est qu'on n'a pas besoin de connaître grand chose pour faire des trucs sympas :D .
Je m'en sers uniquement pour ajouter des GPIO d'entrée à mon RPI. Dans ce projet j'ai 120 sorties (shift register) et une cinquantaine d'entrée (MCP).
Et ces derniers me servent uniquement avec la résistance de pull up active avec un interrupteur à capter une chute de tension (appui sur bouton), pour mon IHM.
C'est tout ce que je leur demande et ils le font très bien, je n'ai pas d'utilisation poussée de ces CI.
Après les avoir initialisés je fait une boucle while dans laquelle je fais une action si le MCP.input(n) est à False.
Je viens de regardé sur le net cette histoire de IORDIA et IORDIB je vois en fait ce que c'est, c'est juste que j'utilise une librairie pour initialiser mes MCP, qui gère déjà le "bas niveau", j'utilise donc des fonctions qui me facilitent la vie ( pas besoin d'indiquer le port B avec telle adresse, etc. J'indique juste MCP(14) par exemple. Je comprends mieux mon incomprehension.

Je vais regarder ce que tu m'as dit avant ce week end si je peux.
Merci en tout cas

Bud Spencer
Raspinaute
Messages : 1089
Enregistré le : lun. 15 août 2016 21:38

Re: jeu coopératif

Message par Bud Spencer » mer. 31 janv. 2018 13:07

esope60 a écrit :... ce qui est bien avec les raspberry c'est qu'on n'a pas besoin de connaître grand chose pour faire des trucs sympas ...
..j'utilise donc des fonctions qui me facilitent la vie...
Ce semblant de facilité, c’est juste une illusion (DIY business oblige). La réalité est tout autre : aucune maitrise de la logique et des limites fonctionnelles des périphériques, des possibilités inaccessibles (souvent les plus intéressantes) et pire que tout, exemption d'apprendre comment cela fonctionne. Tout ça est généralement compensé par du hardware inadapté, de très mauvais programme et souvent des projets qui tombent a l’eau (ce forum est un nid d’exemples de ce que cela donne).

Une autre solution guère plus exigeante est d’utiliser une libraire qui prend en charge uniquement le transport et apprendre à adresser explicitement tes composants. Ici on parle d'I2C, mais c'est valable pour toutes les autres types de liaison hard. Forcement, cela oblige à te documenter sur chacun des composant que tu utilises. L'intérêt, c'est que quand tu as compris le fonctionnement du composant avec qui tu dialogues, tu ne te pose plus la question de savoir ce que tu peux faire ou pas et comment le faire. Si c’est faisable, tu le sais et tu sais comment le faire. C’est ça la vraie facilité ;)
Le premier ennemi de la connaissance n’est pas l’ignorance, c’est l’illusion de la connaissance (S. Hawking).

Avatar du membre
esope60
Messages : 15
Enregistré le : dim. 28 janv. 2018 11:05

Re: jeu coopératif

Message par esope60 » jeu. 30 août 2018 18:52

Bonjour,

Je reprends le projet.
J'ai enfin testé ce que tu m'a dis, même si je ne savais pas trop comment m'y prendre.
En effet tout le monde cherche à lire les valeurs des registres d'un composant connecté, mais personne ne cherche à savoir s'il l'est. Et comme la lecture d'un composant non connecté renvoi une erreur de type "IOERROR" et stoppe le script j'ai fait comme ça, si ça peut servir à quelqu'un :

Code : Tout sélectionner

#!/usr/bin/python
# -*- coding: latin-1 -*-

import smbus

try :
    val = smbus.SMBus(1).read_byte(0x20)
    print ("connecté")
except (IOError):
    print("non connecté")
    pass
Déterrage de topic mais pas aux oubliettes ;)
Merci

Répondre

Retourner vers « L'électronique et le Raspberry Pi »