Page 1 sur 1

jeu coopératif

Posté : dim. 28 janv. 2018 11:29
par esope60
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 !

Re: jeu coopératif

Posté : dim. 28 janv. 2018 13:11
par jelopo
Bonjour,

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

A+

Re: jeu coopératif

Posté : dim. 28 janv. 2018 20:21
par Bud Spencer
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.

Re: jeu coopératif

Posté : dim. 28 janv. 2018 21:54
par esope60
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:

Re: jeu coopératif

Posté : mar. 30 janv. 2018 14:06
par Bud Spencer
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.

Re: jeu coopératif

Posté : mar. 30 janv. 2018 19:28
par esope60
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

Re: jeu coopératif

Posté : mer. 31 janv. 2018 13:07
par Bud Spencer
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é ;)

Re: jeu coopératif

Posté : jeu. 30 août 2018 18:52
par esope60
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