Question:
Ajoutez un jeton matériel passif à l'aide d'une prise jack 3,5 mm
Besi
2019-12-22 05:48:49 UTC
view on stackexchange narkive permalink

J'ai une boîte que j'ai fabriquée pour ma nièce, qui lui permet d'échanger des messages vocaux avec moi. Il est alimenté par un Raspberry Pi et comporte deux boutons, une LED, un microphone et un haut-parleur.

the box

Maintenant, pour Noël, je veux que ma nièce puisse échanger ces messages vocaux avec divers amis (4, 8 ou 16) et parents en branchant un jeton matériel sur l'appareil, avec une photo de cette personne.

Je recherche maintenant le moyen le plus simple d'ajouter cette fonctionnalité.

  • Utiliser de préférence une prise jack 3,5 mm car ils sont facilement disponibles à partir d'appareils / écouteurs usagés
  • De préférence un appareil passif (condensateurs + résistances)
  • De préférence en l'attachant directement au Raspberry Pi
  • De préférence sans utiliser de convertisseur AD, car le Raspberry Pi n'a pas cette fonction intégrée.
  • Facile à utiliser par un enfant de 3 ans

Donc, en utilisant une fiche de 3,5 mm avec 3 broches, je pourrais ajouter une alimentation à une broche et soit connecter ou déconnecter les deux autres de cette broche, ce qui me laisserait deux bits, ce qui donnerait 4 personnes (en plus de moi comme par défaut, si la prise fournit un interrupteur lorsqu'une prise est insérée).

Si j'avais un convertisseur analogique-numérique, je pourrais ajouter un diviseur de tension aux trois broches et utiliser la tension comme indicateur. Cependant, le Raspberry Pi n'a pas cela intégré, donc je cherche un moyen intelligent d'y parvenir en utilisant l'une des broches GPIO.

relatives-plug

C'est un très joli jouet que vous avez construit!
Merci @MarcusMüller.C'est amusant d'avoir ma nièce bavarder avec moi comme ça.Je prévois de télécharger la source et les instructions sur github et je publierai peut-être cela ici alors.Joyeuses fêtes ;-)
Quoi que vous fassiez, assurez-vous de ne pas faire frire d'autres appareils avec les prises 3,5 mm qui pourraient y être branchés!(Casques, micros, etc.)
@flawr très bon point.Le fait que j'utilise un pouvoir parasite devrait régler ce problème.La puce tirera la tension tirée vers le haut jusqu'à GND et l'entrée GPIO est à haute impédance.Et tout ce qui peut arriver dans ce scénario, c'est que le GPIO4 est abattu au sol.
C'est pourquoi le R passif est préféré.efficace.simple, passif.
Comme je l'ai dit et d'autres, je pense que la RC passive est optimale.Vous pouvez obtenir la valeur des composants en utilisant uniquement les caractéristiques de synchronisation sur deux fils, en contournant tout besoin du côté A2D RPi et en contournant tout besoin d'un côté de jeton de périphérique alimenté et sensible à l'électricité statique.Le code est également assez trivial.Gagnant-gagnant-gagnant.
Huit réponses:
#1
+49
VillageTech
2019-12-22 06:42:36 UTC
view on stackexchange narkive permalink

Utilisez un bus 1 fil et n'importe quelle puce 1 fil à l'intérieur du bouton. J'ai écrit "any", car chaque puce 1 fil a sa propre adresse matérielle unique, donc tout ce dont vous avez besoin du côté RPi est de vérifier que la puce a été détectée, par exemple en utilisant la commande bash:

  ls / sys / bus / w1 / périphériques /
 

et vérifier sa sortie pour l'existence d'un sous-répertoire nommé exactement comme cette adresse matérielle.

Côté RPi HW, il vous suffit de connecter une prise jack supplémentaire aux broches d'E / S appropriées (GND + DATA). Il n'est pas nécessaire d'utiliser une connexion d'alimentation ici, il semble donc être plus sûr pour RPi qu'une solution similaire, qui utilise I2C (I2C doit avoir une ligne d'alimentation dédiée, ce qui fait risque d'endommager le RPi en cas de court-circuit).

EDIT: Pour un travail fiable, vous devez ajouter la résistance pull-up 4.7kOhm entre la ligne DATA et Vcc (3.3V).

Vous pouvez utiliser la puce DS18B20 la plus populaire et la moins chère, qui offre en outre la possibilité de mesurer la température ambiante;), ou DS2401, qui fournit en outre un numéro de série unique.

C'est très élégant.Merci d'avoir partagé ça!
J'ai trouvé un tutoriel allemand un tutoriel qui explique comment configurer les puces 1 fil: https://tutorials-raspberrypi.de/raspberry-pi-temperatur-mittels-sensor-messen/
Le DS18B20 a trois broches, êtes-vous sûr que le VCC peut simplement être omis?Jetez un œil au tutoriel à 2 h 10 https://youtu.be/OBu1weMecbY?t=130
Oui, cela peut être omis - dans ce cas, cette broche doit être connectée à la terre.Ainsi, les broches 1 + 3 = masse, la broche 2 = données.Vous devez ajouter une résistance de rappel de 4,7 kOhm entre la ligne de données et Vcc (3,3 V).Voir la figure 6 ici: https://datasheets.maximintegrated.com/en/ds/DS18B20.pdf
Aucune infraction, mais -1: ce sera probablement vulnérable à l'électricité statique.
Bien sûr, mais il peut être simplement protégé avec des diodes.De plus, la conception de la prise jack protège simplement contre cela - GND sera connecté comme le premier toujours.
Cependant, d'autres méthodes n'ont même pas vraiment besoin de diodes, alors ... Ce n'est pas comme si cela ne pouvait pas fonctionner, je ne suis pas d'accord pour dire que c'est la meilleure * possible * réponse.
Le jeton matériel doit être protégé contre une copie facile.
R: Je ne vois pas cela comme une exigence du PO.D'où tenez-vous cette idée?B: Comment pensez-vous qu'une adresse matérielle à 1 fil est difficile à copier?
Ok, s'il n'y a pas besoin de protéger, pourquoi ne pas utiliser une simple prise jack avec des broches courtes connectées pour allumer / éteindre l'alimentation?Pensez-vous que c'est mauvais?Pourquoi?Et, du côté HW: pour 1 fil, nous avons besoin d'une puce, d'une résistance de pull-up, peut-être de 2 diodes à protéger.C'est tout.En utilisant une solution passive (R / C), la clé sera légèrement moins chère, mais qu'en est-il du matériel côté RPi?Avez-vous pensé à ça?Comment discriminer la résistance?Comparateurs?Constante de temps avec compteur S / W?Est-ce plus facile et moins cher?Vraiment?
(a) OP a besoin de plus de deux jetons, l'interrupteur donne marche / arrêt comme seules options.(b) Il n'y a pas de matériel supplémentaire côté RPI, les entrées GPIO ont des seuils pour aller de '1' à '0' et revenir à '1', le reste est tout code et mesure du temps: `GPIO.wait_for_edge (channel, GPIO.RISING);tandis que GPIO.input (canal) == GPIO.HIGH: counter ++;time.sleep (0,01);if counter
(a) Deux jetons (ou plus) ne sont pas un problème.Tous peuvent être détectés et - en plus - FIABLES identifiés et différenciés.(b) Ok, peut-être un effort similaire, peut-être pas.J'aime ma solution, vous aimez la vôtre.Et alors?Vous attendez-vous à ce que je supprime ma réponse, ou quoi?
(a) Vous utilisez des identifiants matériels à 1 fil?Absolument pas un problème.Vous utilisez uniquement un interrupteur marche / arrêt?Non. (B) Sachez qu'il ne s'agit pas seulement de vous et moi, mais de l'OP, des autres personnes qui suggèrent la solution RC, des autres qui suggèrent votre solution et des 1000+ personnes qui liront ceci à l'avenir à la recherche deleur propre réponse, et peut-être pas en mesure d'utiliser la vôtre.Et non, je ne veux absolument pas que vous supprimiez votre réponse.Il a tout ce qu'il a de mérite qui le rend valable.Je veux simplement donner plus de poids au concept de * AVOIR DES OPTIONS * Tel qu'il est maintenant, votre solution déforme injustement le problème.
@VillageTech J'ai implémenté votre solution et documenté mes étapes.Voir ma réponse ci-dessous.Merci et bonne année 2020
#2
+8
Scott Seidman
2019-12-22 06:00:32 UTC
view on stackexchange narkive permalink

Je ferais de chaque "jeton" un appareil I2C.L'utilisation d'une prise de type pointe-anneau-anneau-tige vous donnerait 4 conducteurs - terre, alimentation, données et horloge.Chaque jeton devrait avoir sa propre adresse I2C, et vous écririez une fonction qui détecte les périphériques sur un bus I2C.

Si vous suivez le brochage standard pour une prise de casque - `Tip = haut-parleur, Ring1 = haut-parleur, Ring2 = masse, Sleeve = puissance + micro` - alors il se peut qu'il n'y ait aucun dommage s'il est confondu pour un.(Remarque: l'alimentation est une source de courant, pas une source de tension. Cela permet au signal du micro d'exister en tant que tension couplée CA, tout comme les haut-parleurs.)
Identique à la réponse acceptée.Aucune infraction, mais -1: ce sera probablement vulnérable à l'électricité statique.
@Charlie, comme tous les circuits numériques du monde.
@Scott, Concrètement, oui.Techniquement, seulement vraiment CMOS, donc, encore une fois, pratiquement oui.C'est plus sur le fait qu'une prise TRS expose les leads.Combien de fois cela sera-t-il tiré dans et hors des poches de manteau en polyester pendant l'hiver?
TRS est certainement une préoccupation.Ce n'est pas le connecteur que je choisirais, pas à cause de l'électricité statique, mais plus à cause de toutes les interruptions / ruptures inappropriées lors de l'insertion.Comme de nombreux circuits, cela nécessiterait une protection.
#3
+6
EinarA
2019-12-22 14:17:28 UTC
view on stackexchange narkive permalink

Cela peut être fait avec un ensemble de résistances et de condensateurs en parallèle, chaque paire avec un produit RC différent.Vous tournez la sortie gpio à un niveau élevé pendant un temps suffisant, puis tournez-la vers une entrée et mesurez le temps qu'il faut au capuchon pour se décharger.Avec des constantes de temps allant de microsecondes à millisecondes possibles, vous pouvez distinguer n'importe quel nombre de personnes.

#4
+6
Charlie
2019-12-23 18:38:23 UTC
view on stackexchange narkive permalink

Pour être clair comme du cristal. Je ne déteste pas l'idée de jeton à 1 fil. Je l'aime vraiment. Utiliser 1 fil de cette manière est exactement le genre de chose pour laquelle le bus 1 fil a été conçu. Ma préoccupation est que le projet est de qualité jouet; faible sécurité / budget. Lorsque vous ajoutez ensuite les considérations de durabilité, il devient clair qu'il peut y avoir un désir pour d'autres options qui n'impliquent pas de puces spécialisées. Ce qui évoque ce qui suit.


Comme d’autres l’ont dit, la réponse presque optimale est d’utiliser la temporisation RC. Le seul côté du jeton de composant serait un condensateur.

schematic

simuler ce circuit - Schéma créé à l'aide de CircuitLab

Pourquoi? Parce que les jetons RC ...

  • ne sont pas vulnérables aux ESD. (Modifier: si nous sommes honnêtes et pratiques)
  • ne peut utiliser que deux fils.
  • sera très simple et bon marché.
  • ont beaucoup de place pour plus de 8 personnes.

Pour l'électronique côté Pi, vous avez juste besoin de deux broches GPIO; une broche de charge et une broche de détection. Vous voudrez / aurez également besoin d'un circuit de charge rapide, que j'expliquerai après le graphique.

schematic

simuler ce circuit

Le circuit de charge rapide contourne la résistance de synchronisation avec une résistance beaucoup plus petite. Cela permet au condensateur du jeton de se charger presque instantanément (enfin, pour autant que les utilisateurs voient de quelque manière que ce soit). Cela permet également à la broche de détection de ne pas voir directement la broche de charge. Au lieu de cela, il verra strictement la tension des condensateurs. Les valeurs ne sont pas critiques, cependant, la diode doit vraiment être une diode de signal Schottky / petite, sinon elle coupera beaucoup le haut du 3.3v. Cela pourrait également être remplacé par un transistor à 5v, mais la broche d'entrée peut avoir besoin d'être protégée.

Après cela, c'est tout du code, ce qui est également assez trivial.

(Remarque: c'est arrivé sur place. Ce n'est pas du tout testé. Des clauses de non-responsabilité standard s'appliquent; marchez à vos risques et périls, ajustez-vous au goût, etc.)

  importer RPi.GPIO en tant que GPIO
temps d'importation
#Configurez quelques broches
GPIO.setup (<charging_pin>, GPIO.OUT)
GPIO.setup (<sensing_pin>, GPIO.IN)

# Réglez la broche de "charge" sur 3,3 V
GPIO.output (<charging_pin>, TRUE)

# Attendez un peu que le condensateur soit complètement chargé
time.sleep (1.0)

# Réglez la broche de charge sur 0v
GPIO.output (<charging_pin>, FALSE)

#count combien de temps la broche de détection reste haute
compteur = 0
tandis que GPIO.input (<sensing_pin>) == GPIO.HIGH:
    compteur + = 1
    time.sleep (0.01)

# Enfin notre compteur va avoir une valeur proportionnelle au RC
# délai de notre token. La fenêtre correspond aux limites, et nous sommes en or.

if (compteur > a) et (compteur < b):
    print "Est la personne X"

if (compteur > b) et (compteur < c):
    print "Est la personne Y"

[...]

 

Enfin (et seulement à part / après réflexion), cette même chose ne serait pas trop terrible réutilisée comme testeur / mètre de condensateur, car c'est essentiellement tout ce que nous faisons ici.


Critique

C'est tellement plus difficile qu'une solution à 1 fil. La solution 1 fil est simplement plug-and-play. RC aura un tas de câblage et de soudure et ainsi de suite. Le circuit côté Pi seul sera si complexe que le coût total sera plus élevé que l'utilisation d'un seul fil.

Pas du tout vrai.

Je pense avoir montré ci-dessus à quel point la solution RC est triviale; ~ 13 lignes de code, 3 composants côté Pi et 1 condensateur par personne. Assez simple en fait.

Un fil est, certes, tout aussi assez simple à installer, mais c'est parce que vous achetez votre solution. Chaque jeton à 1 fil ajoute une autre puce de 0,5 $, alors que chaque jeton RC ajouté n'est qu'un condensateur de 0,01 $.

Presque aussi simple, mais une fraction du coût. Il est assez clair qui est le gagnant ici.

Votre idée est vulnérable à l'électricité statique. Le Raspberry Pi est vulnérable à l'électricité statique. Ceci est vulnérable à l'électricité statique. C'est vulnérable à l'électricité statique. Votre chien est vulnérable à l'électricité statique. etc. etc. etc.

Flash info! Tout est techniquement vulnérable à l'électricité statique / ESD, même vous! Tu ne me crois pas? Allez vous démarquer dans un champ ouvert avec un parapluie et donnez-moi raison. (PS. Ne faites pas ça)

Cependant, si nous ne sommes pas intelligents @ $$, alors nous avons des lignes évidentes que nous dessinons. Le point de bon sens est au CMOS IC, car c'est ce qui - dans un sens très réel et pratique - est en fait vulnérable à l'électricité statique. Ce qui est amusant, c'est que nous pouvons supprimer complètement ce problème pour le jeton en n'utilisant pas d'IC ​​DU TOUT!

Les passifs sont à peu près aussi faciles pour la tâche présentée et plus robustes contre l'ESD. période. C'est pourquoi on peut vouloir reconsidérer les autres méthodes.

Maintenant, bien sûr, le Pi sera toujours vulnérable à l'électricité statique, pas moyen de contourner cela à moins que vous ne supprimiez le Pi. Bien sûr, ce n'est pas pratique non plus. Donc, le mieux que nous puissions faire est de faire ce que tout le monde fait avec ces citrons. Tout d'abord, nous mettons la prise côté Pi avec un anneau de garde approprié à la terre. Deuxièmement, nous pouvons devenir fous avec les diodes TVS et ainsi de suite. En bout de ligne ici ...

Nous n'avons plus qu'à protéger un (1) appareil contre les décharges électrostatiques, alors devenez fou si vous le souhaitez!

Les passifs simples ne sont pas sécurisés. Ils sont faciles à simuler / copier / pirater / etc.

(-_-) ... c'est un FFS jouet pour enfants ... pourquoi y apportons-nous la sécurité de l'information? Même ainsi, pensez-vous réellement que les adresses matérielles 1-wire (ou pire encore, les adresses SPI / I2C) sont un bon mécanisme pour renforcer la sécurité? Vraiment? Êtes-vous sérieux!?

OK, que diriez-vous alors ... apportez cette idée à security.SE. et voyez ce qu'ils disent. (Protip: apportez des bandages avec vous, vous en aurez un nouveau déchiré.)

Non. Le SEUL temps où 1-wire est sécurisé, est si vous utilisez un véritable jeton / authentificateur sécurisé [ 1] . Ensuite, il peut être sécurisé par l'État-nation ... autre que le fait que l'attaquant a certainement un accès physique au dispositif d'authentification ...

La sécurité n'est pas un problème ici, c'est totalement hors sujet.


Edit: répartissez le reste dans sa propre réponse, car c'est ce que c'était;une réponse différente.

allez-vous utiliser la broche GPIO?Qu'en est-il de la protection RPi contre l'électricité statique?Et qu'en est-il de la possibilité d'utiliser la résistance variable pour pirater cette protection?
Merci pour vos commentaires.J'ai pensé aux balises Bluetooth, mais j'ai plutôt opté pour la version plug-in.Le contact sélectionné est donc toujours clair.
@VillageTech: (a) Il utiliserait GPIO, oui.(b) Le RPi serait protégé en ayant le connecteur femelle (prise) du côté RPi.Ceci est sûr à condition que les contacts de jeton frottent toujours sur le GND lorsqu'il est inséré;qui est déjà une caractéristique de la plupart des prises casque de toute façon.(c) Si votre troisième question porte sur la sécurité de l'information, je pense que ce n'est pas du tout le sujet.Je doute que le groupe cible du PO va contrecarrer * toute * sécurité.Mais, s'ils le font ... plus de pouvoir pour eux?Je serais certainement impressionné si un enfant piratait la «sécurité» de l'une ou l'autre méthode.
@Besi: (a) Pas de problème.(b) Compris.(c) Oui, Bluetooth aurait des problèmes d'ambiguïté.Surtout parce que la portée de Bluetooth fonctionnerait contre vous.La RFID du "pauvre homme" que je mentionne n'aurait cependant pas ce problème, car vous auriez besoin d'avoir le jeton directement sur une "zone de détection" pour qu'il soit même vu.Fondamentalement, ce serait comme des systèmes de paiement sans contact «Tap and go», (Google Near Field Communication) Une autre façon de penser est comme avoir un détecteur de métaux dans le RPi et différents métaux dans votre jeton.Seulement, nous remplaçons les différents métaux par des bobines électromagnétiques accordées.
Pour contrer votre insistance répétée sur la durabilité de votre solution et le caractère inacceptable de simples appareils numériques dans d'autres réponses, considérez [Sensibilité de la résistance aux décharges électrostatiques (ESD)] (http://www.vishaypg.com/docs/63129/esd_tn.pdf).
Cet article réfute cependant votre propre assertion implicite.Si vous regardez les figures de la page 2, cela montre clairement que seules les très petites résistances SMD à couche mince sont vulnérables à distance aux décharges électrostatiques.Les résistances CMS à couche épaisse ont changé de moins de 200 000 ppm après des événements ESD de 4500 V, et les résistances en aluminium d'une quantité non mesurable.Il n'entre même pas dans les résistances à trous traversants, car ce serait un récit comique.
Ou, plus succinctement: par défaut, CMOS est vulnérable aux ESD, les passifs ne le sont pas.période.Les seules solutions RC qui pourraient être même à distance vulnérables à l'EDD devraient être conçues de cette façon.D'un autre côté, * TOUTE * solution 1-wire serait vulnérable par défaut, et devrait être "patché" pour être sûre.Tout contre-argument disant le contraire ressemble beaucoup à l'argument du compteur de sécurité;beaucoup de main agitant et saisissant des pailles.
Qu'en est-il de la précision de time.sleep (x), qui est garanti pour dormir pendant * au moins * x, mais qui pourrait être considérablement plus si Raspbian décidait de faire autre chose?Je pense que cette solution est bien mieux adaptée à un microcontrôleur utilisant un compteur / minuterie matériel qu'un Pi.
@ Scott: C'est une critique valable.Dans mes propres tests, même anecdotiques, le pire des cas était peu fréquent.C'était avec PWM pour un servo RC, une tâche RT beaucoup plus difficile.C'était aussi il y a quelques années avec le premier Pi.La situation s'est certainement améliorée?Beaucoup de noyaux RPis et de noyaux Hard RT stables existent maintenant, non pas que l'une ou l'autre de ces choses serait nécessaire IMO.Encore une fois ... La théière de Russell ... C'est moi qui fais cette affirmation.En pratique, la solution de contournement est simple.Il suffirait d'échantillonner quelques fois et de décider de la valeur moyenne réelle.Par exemple, prenez 3x et jetez le blip impair.
Solution parfaitement valable. (+ 1) La protection ESD intégrée à 2 étages à diode R peut être améliorée avec une résolution supplémentaire de 10k.puis choisissez la cible 100k
#5
+3
Besi
2020-01-02 03:52:18 UTC
view on stackexchange narkive permalink

C'est ainsi que j'ai finalement mis en œuvre la fabuleuse approche décrite par VillageTech.

Matériel

Câblage

La broche par défaut pour les appareils Onewire sur le Pi est GPIO 4 . J'ai donc câblé GND au manchon de la prise et connecté la pointe à la broche GPIO mentionnée.

hardware

Un jeton

Tout ce dont j'ai besoin pour un jeton est la puce DS18B20 et un jack 3,5 mm. Soudez ensuite les broches GND et VCC de la puce ensemble et connectez-la au manchon. Ajoutez un tube rétractable à la broche du milieu pour éviter les courts-circuits et connectez-le à la pointe de la prise.

Les deux jacks fonctionnent ceux avec deux anneaux et celui avec juste la pointe.

token

Résistance de rappel

J'ai décidé de ne pas utiliser de résistance pull up externe, car le Pi possède des résistances Pull up internes.

Ne faisons pas frire les écouteurs

Comme flawr l'a correctement souligné, c'est le fait que si cela ressemble à une prise audio 3,5 mm, les gens pourraient être tentés d'insérer des écouteurs.

Tant que nous utilisons une alimentation parasite, où seuls un fil de terre et une sortie GPIO haute impédance sont exposés à la prise, nous devrions être en sécurité, car nous n'avons pas de V DD sub > ligne qui pourrait créer un court-circuit en raison de la faible résistance du casque.

Configuration

Ajoutez la ligne suivante à /boot/config.txt :

  dtoverlay = w1-gpio
 

Il y a plus d'options. Vous pouvez en trouver plus dans le / boot / overlays / README de votre Pi.

Certaines sources ont suggéré d'ajouter les deux modules w1-gpio et w1_therm à / etc / modules , mais j'ai découvert que l'appareil L'entrée de superposition d'arbre dans le boot / config.txt était suffisante pour mes besoins.

Redémarrez maintenant l'appareil.

Ajouter un pullup via un logiciel en python:

  importer RPi.GPIO en tant que GPIO
GPIO_PIN_NUMBER = 14
GPIO.setmode (GPIO.BCM)
GPIO.setup (GPIO_PIN_NUMBER, GPIO.IN, pull_up_down = GPIO.PUD_UP)
 

Dès que j'ai créé ce pull up, j'ai pu détecter les jetons dans / sys / bus / w1 / devices / avec le préfixe 28 dans une autre fenêtre de terminal:

  $ ls / sys / bus / w1 / périphériques /
28-00000aabbccd w1_bus_master1
 

Après environ 10 secondes, les entrées dans appareils disparaissaient. J'ai dû créer la configuration suivante, pour que les appareils disparaissent au bout d'une seconde environ:

  sudo nano /etc/modprobe.d/w1.conf
 

Ajoutez maintenant le contenu au fichier et redémarrez l'appareil à nouveau:

  options wire timeout = 1 slave_ttl = 1
 

Dans ma configuration, ce fichier n'existait pas auparavant.

Logiciel

  importation du système d'exploitation
importer un fil
temps d'importation
à partir de date / heure importation date / heure, timedelta


classe W1Service (objet):
    __instance = Aucun

    def __new __ (cls):
        # Initialiseur singleton
        si l'instance W1Service .__ est None:
            W1Service .__ instance = objet .__ nouveau __ (cls)
        retourne l'instance W1Service .__

    on_all_token_removed = Aucun
    on_token_added = Aucun
    is_scanning = Faux

    def start_scan (self, delay = 10):
        return thread.start_new_thread (self.scan, (délai,))

    def scan (self, delay = 10):
        W1Service.is_scanning = Vrai
        last_token = Aucun
        current_token = ''
        current_token_timestamp = datetime.now () - timedelta (jours = 1)

        tandis que W1Service.is_scanning:
            file = open ('/ sys / devices / w1_bus_master1 / w1_master_slaves')
            all_tokens = fichier.readlines ()
            fichier.close ()

            no_token_attached = len (all_tokens) == 0 ou 'not found. \ n' in all_tokens
            if no_token_attached et self.on_all_token_removed et current_token! = last_token:
                self.on_all_token_removed ()
                current_token = Aucun
                last_token = Aucun
pour la ligne dans all_tokens:
                jeton_actuel = line.split ("\ n") [0]
                time_diff = datetime.now () - current_token_timestamp
                si self.on_token_added et last_token! = current_token et time_diff.seconds > = 3:
                    # Tester si le token est toujours attaché
                    si os.path.exists ('/ sys / bus / w1 / devices /' + current_token + '/ w1_slave'):
                        self.on_token_added (jeton_actuel)
                        last_token = jeton_actuel
                    autre:
                        current_token = Aucun
                autre:
                    current_token = Aucun

            time.sleep (délai)

    def stop_scan (auto):
        W1Service.is_scanning = Faux
 

Maintenant, utiliser le service créé est assez simple:

  heure d'importation
import w1_service

def token_added (jeton):
    print (jeton% "connecté% s")

def all_token_removed ():
    print ('Tous les jetons ont été supprimés')

service = w1_service.W1Service ()
service.on_token_added = token_added
service.on_all_token_removed = all_token_removed
service.start_scan (0)

tandis que Vrai:
    # L'analyse s'exécute dans un thread séparé
    time.sleep (1)
 

Cela produira la sortie suivante lors de l'insertion de différents jetons

  Tous les jetons ont été supprimés
Connecté 28-00000aabbccd
Tous les jetons ont été supprimés
Connecté 28-00000ffddeea
Tous les jetons ont été supprimés
Connecté 28-00000bbddaa1
Connecté 28-00000ffddeea
Tous les jetons ont été supprimés
Connecté 28-00000bbddaa1
Tous les jetons ont été supprimés
 

Veuillez noter que mon code tient compte du fait que dans ma configuration, un seul jeton peut être ajouté à la fois. Donc, seul le jeton le plus récent est intéressant pour moi. Si plusieurs jetons doivent être ajoutés, ce que le protocole onewire prend en charge correctement, le code devra être mis à jour.

Application

Désormais, chaque fois qu'un jeton est inséré, il correspond à une personne que ma gentille peut envoyer et recevoir des messages de

application

Remarques et autres considérations

Les jetons Onewire pourraient en théorie être ajoutés en parallèle, ce qui offrirait de nouvelles fonctionnalités comme le chat de groupe ou autres. Vous pouvez donc connecter dix jetons sur un seul GPIO.

J'aime aussi l'approche avec l'approche R / C passive, qui est également très pragmatique et simple à mettre en place. Je pourrais essayer ceci dans un autre projet. Cependant, un ami en avait

J'ai envisagé d'ajouter des iBeacons en tant que jetons, mais je devrais alors tenir compte des différents RSSI des jetons et il ne serait pas clair à 100% quel jeton était actif à un moment donné.

Un ami suggérait d'ajouter un lecteur de carte et d'utiliser d'anciennes cartes SD photo de 1 Go qui pourraient avoir l'image coincée sur le devant. La carte peut contenir toutes les informations sur la personne plus une salutation personnalisée ou similaire. La même chose fonctionnerait avec les anciennes clés USB comme jetons.

C'était très amusant de mettre cela en œuvre et de voir à quel point ma question suscitait l'intérêt des gens. Je vous remercie tous et vous souhaite une belle 0x1414 (= 2020) :-)

Un travail fantastique et merci pour votre rapport.+1.Je n'ai pas de regrets.C'était amusant d'aider et vous avez obtenu un résultat qui fonctionne.C'est le mieux que nous puissions espérer.
#6
+2
Charlie
2019-12-25 14:52:00 UTC
view on stackexchange narkive permalink

TL; DR: détecteur RFID / NFC / "métal" du pauvre.

Si vous voulez être un peu sophistiqué, vous pouvez utiliser un circuit (R) CL accordé. L'idée serait de charger un circuit de réservoir LC par voie électromagnétique, puis d'observer les oscillations anneau / décroissance. Où chaque jeton serait identifié par une fréquence unique. Ensuite, vous n'auriez même pas besoin de contacts!

Cette idée est comme une communication primitive en champ proche ou un détecteur de métaux primitif. Ce serait construit quelque chose comme ce qui suit ...

schematic

simuler ce circuit - Schéma créé à l'aide de CircuitLab

(PI) Le Pi a une bobine électromagnétique, alimentée par un simple pilote de transistor. Celui-ci est alimenté par un signal CA synthétique ou CC pulsé. Ce côté agit comme le côté primaire d'un transformateur.

(Token) Le token est une bobine électromagnétique identique, avec au moins un condensateur attaché. Avec juste cela, il devrait résonner avec la formule de résonance LC bien connue lorsqu'il est sous tension. Ce côté agit comme le secondaire d'un transformateur.

Opération

Lorsque vous rapprochez les deux bobines l'une de l'autre (vraiment assez proches ... comme ... essentiellement en se touchant), la puissance est transférée du côté Pi au côté du jeton. Cela (par rapport aux octaves compatibles de la fréquence fournie!) Alimentera le jeton avec des oscillations. Lorsque vous supprimez le signal d'entraînement du côté principal, le jeton "continuera pendant un certain temps" qui, à son tour, sera détectable par votre bobine latérale principale.

Alternativement, l'ajout de la deuxième bobine a également pour effet d'ajouter simplement le condensateur du jeton au condensateur côté RPi en parallèle. Cela réduira la fréquence de résonance du réservoir LC côté RPi de la quantité de capacité que le jeton contient.

Les deux méthodes sont potentiellement viables pour séparer les jetons.

#7
+1
Andrew
2019-12-24 07:22:33 UTC
view on stackexchange narkive permalink

Vous pouvez utiliser un filtre passe-bas (pin1-resistor-pin2-capacitor-ground), configurer pin1 pour sortir 1 et monitor / sample pin2 jusqu'à ce qu'il se règle sur 1.

Maintenant, tournez la broche1 vers 0 et surveillez la broche2 (sample - contrôlez le temps nécessaire) jusqu'à ce qu'elle se règle sur 0.

En modifiant les valeurs de résistance et de condensateur, vous obtiendrez différents délais time qui vous permettront d'distinguerish différents tokens associés à une personne en particulier.

Cette solution a été utilisée bien avant que l'ADC ne fasse partie des MCU.

Eh bien, pour un projet de ce genre, j'utiliserais Arduino (ou juste Atmega8 / 16 / 32) - coût minime et facile à travailler.

Raspbery Pi a tellement de pouvoir qu'il est très wasteful à utiliser pour un projet aussi simple.

+1 pour la partie supérieure, car il s'agit toujours de ce que je pense être la meilleure approche.Mais -1 pour la partie inférieure.Bien que je convienne à 100% avec vous que le RPi est excessif, il n'est toujours pas approprié de critiquer son utilisation pour cette application.(1) Il fait d'autres choses que vous ne pourriez probablement pas faire facilement avec l'Arduino alimenté par l'AVR (à savoir, enregistrer et lire un son décent) (2) Si nous étions autorisés à critiquer les performances, je critiquerais le RPi dans son ensemble.comme un coup de pub Broadcom qui peut être fait par n'importe quel Android à prix comparable.(par exemple TracFone Galaxy Sky / J3 - 35 $)
#8
  0
Tony Stewart Sunnyskyguy EE75
2019-12-22 07:09:41 UTC
view on stackexchange narkive permalink

Vous pouvez choisir en toute sécurité une valeur de 1% sur deux et obtenir des actions de Digikey pour 15 cents chacun.

La résistance à film métallique 1 / 4W peut entrer dans une fiche en plastique à visser sur une fiche de 3,5 mm, soudée puis recouverte d'un adhésif de sous-plancher (polyuréthane) si vous souhaitez la cacher.

L'utilisation d'un 10k à 20k a suffisamment de valeurs.L'utilisation d'un 100k Pullup to Vref permet d'utiliser la même entrée pour détecter un "0" logique pour réveiller l'unité, avec 10 à 20% de Vdd qui fonctionnera.

Un capuchon en céramique de 0,1 uF peut être shunté contre la même broche pour shunter les décharges ESD et empêcher les contacts intermittents de changer la tension de plus de dV / dt = V / RC

comment comptez-vous faire mesurer la résistance du Raspberry Pi?
@Jasen utilisant un port analogique avec 10k ~ 20k et 100k pullup et ADC 8 bits peut résoudre ce problème avec un algorithme simple, tout comme les produits Apple l'ont fait à un moment donné avant les puces d'identification.
Le Pi n'a pas d'entrées analogiques.
Cette solution fonctionnerait bien pour un ESP32, qui a l'ADC requis.
Vous n'avez pas besoin d'un ADC pour mesurer la résistance.Vous pouvez également le faire avec un condensateur, une broche IO numérique et une minuterie.


Ce Q&R a été automatiquement traduit de la langue anglaise.Le contenu original est disponible sur stackexchange, que nous remercions pour la licence cc by-sa 4.0 sous laquelle il est distribué.
Loading...