Vraag:
Voeg een passieve hardware-token toe met een 3,5 mm-aansluiting
Besi
2019-12-22 05:48:49 UTC
view on stackexchange narkive permalink

Ik heb een doos die ik voor mijn nichtje heb gemaakt, waarmee ze spraakberichten met mij kan uitwisselen. Het wordt aangedreven door een Raspberry Pi en heeft twee knoppen, een LED, een microfoon en een luidspreker.

the box

Met Kerstmis wil ik dat mijn nichtje deze spraakberichten kan uitwisselen met verschillende vrienden (4, 8 of 16) en familieleden door een hardware-token op het apparaat aan te sluiten met een foto van die persoon.

Ik ben nu op zoek naar de meest eenvoudige manier om deze functionaliteit toe te voegen.

  • Gebruik bij voorkeur een 3,5 mm jack-aansluiting omdat deze direct beschikbaar is via gebruikte apparaten / koptelefoons
  • Bij voorkeur een passief apparaat (condensatoren + weerstanden)
  • Bij voorkeur door hem rechtstreeks op de Raspberry Pi te bevestigen
  • Bij voorkeur zonder een AD-converter te gebruiken, aangezien de Raspberry Pi deze niet heeft ingebouwd.
  • Gemakkelijk te gebruiken door een 3-jarige

Dus met behulp van een 3,5 mm-stekker met 3 pinnen zou ik stroom kunnen toevoegen aan één pin en de andere twee van die pin kunnen verbinden of loskoppelen, waardoor ik met twee bits zou overblijven, wat resulteert in 4 mensen (naast mij als standaard, als het stopcontact een schakelaar heeft wanneer een stekker wordt ingestoken).

Als ik een analoog-digitaalomzetter had, zou ik een spanningsdeler aan de drie pinnen kunnen toevoegen en de spanning als indicator kunnen gebruiken. De Raspberry Pi heeft dat echter niet ingebouwd, dus ik ben op zoek naar een slimme manier om dit te bereiken met een van de GPIO-pinnen.

relatives-plug

Dat is een heel leuk speeltje dat je hebt gebouwd!
Bedankt @MarcusMüller.Het is leuk om mijn nichtje zo met me te laten praten.Ik ben van plan de bron en instructies naar github te uploaden en ik zal die hier dan mogelijk posten.Fijne vakantie ;-)
Wat je ook doet, zorg ervoor dat je geen andere apparaten frituurt met de 3,5 mm-aansluitingen die erin kunnen worden gestoken!(Koptelefoons, microfoons, enz.)
@flawr zeer goed punt.Het feit dat ik parasitaire kracht gebruik, zou voor dit probleem moeten zorgen.De chip trekt de opgetrokken spanning naar GND en de GPIO-ingang heeft een hoge impedantie.En het enige dat in dat scenario kan gebeuren, is dat de GPIO4 naar de grond wordt getrokken.
Daarom heeft de passieve R de voorkeur.effectief.eenvoudig, passief.
Zoals ik en anderen al hebben gezegd, denk ik dat passieve RC optimaal is.U kunt de waarde van de componenten verkrijgen door alleen de timingkarakteristieken op twee draden te gebruiken, waarbij u de A2D RPi-kant omzeilt en elke behoefte aan een aangedreven, statisch gevoelige apparaattoken-kant omzeilt.De code is ook vrij triviaal.Win-Win-Win.
Acht antwoorden:
VillageTech
2019-12-22 06:42:36 UTC
view on stackexchange narkive permalink

Gebruik 1-draads bus en een willekeurige 1-draads chip in de knop. Ik schreef "elke", omdat elke 1-draads chip zijn eigen, unieke hardware-adres heeft, dus alles wat je aan RPi-kant nodig hebt, is controleren of de chip is gedetecteerd, bijvoorbeeld met het bash-commando:

  ls / sys / bus / w1 / devices /
 

en het controleren van de uitvoer op het bestaan ​​van een submap met dezelfde naam als dit hardware-adres.

Aan de RPi HW-kant hoeft u alleen een extra jack-aansluiting aan te sluiten op de juiste I / O-pinnen (GND + DATA). Het is hier niet nodig om een ​​stroomaansluiting te gebruiken, dus het lijkt het veiligst voor RPi dan een vergelijkbare oplossing, die I2C gebruikt (I2C moet een speciale stroomlijn hebben, wat het risico op beschadiging van RPi in geval van kortsluiting maakt). / p>

EDIT: voor betrouwbaar werk moet u de pull-up-weerstand 4.7kOhm toevoegen tussen de DATA-lijn en Vcc (3.3V).

U kunt de meest populaire en goedkope DS18B20-chip gebruiken, die bovendien de mogelijkheid biedt om de kamertemperatuur te meten;), of DS2401, die bovendien een uniek serienummer biedt.

Dit is heel elegant.Bedankt voor het delen!
Ik vond een duitse tutorial een tutorial die uitlegt hoe je de 1-draads chips instelt: https://tutorials-raspberrypi.de/raspberry-pi-temperatur-mittels-sensor-messen/
De DS18B20 heeft drie pinnen, weet je zeker dat de VCC zomaar weggelaten kan worden?Bekijk de tutorial om 2:10 minuten https://youtu.be/OBu1weMecbY?t=130
Ja, het kan worden weggelaten - in dat geval moet deze pin met aarde worden verbonden.Dus pinnen 1 + 3 = aarde, pin 2 = gegevens.U moet een pull-upweerstand van 4,7 kOhm toevoegen tussen de DATA-lijn en Vcc (3,3 V).Zie figuur 6 hier: https://datasheets.maximintegrated.com/en/ds/DS18B20.pdf
Geen belediging, maar -1: dit is waarschijnlijk kwetsbaar voor statische elektriciteit.
Natuurlijk, maar het kan eenvoudig worden beschermd met diodes.Bovendien beschermt het ontwerp van de jack-aansluiting hier eenvoudig tegen - GND wordt altijd als eerste aangesloten.
Andere methoden hebben de diodes echter niet eens echt nodig, dus ... Het is niet alsof het niet kan werken, ik ben het er gewoon niet mee eens dat dit het best * mogelijke * antwoord is.
De hardwaretoken moet worden beschermd tegen gemakkelijk kopiëren.
A: Ik zie dit niet als een vereiste van het OP.Waar haal je dit idee vandaan?B: Hoe weet u dat een 1-draads hardware-adres moeilijk te kopiëren is?
Oké, als het niet nodig is om te beschermen, waarom zou u dan geen eenvoudige jackplug met kort verbonden pinnen gebruiken om de stroom aan / uit te zetten?Denk je dat dat slecht is?Waarom?En, van HW-kant: voor 1-draads hebben we een chip nodig, een pull-up-weerstand, misschien 2 diodes om te beschermen.Dat is alles.Met een passieve oplossing (R / C) zal de sleutel iets goedkoper zijn, maar hoe zit het met hardware aan de kant van RPi?Heb je hier over nagedacht?Hoe de weerstand te onderscheiden?Vergelijkers?Tijdconstante met S / W-teller?Is dit gemakkelijker en goedkoper?Werkelijk?
(a) OP heeft meer dan twee tokens nodig, schakelaar geeft aan / uit als enige optie.(b) Er is geen extra hardware RPI-kant, GPIO-ingangen hebben drempels om '1' naar '0' en terug naar '1' te gaan, de rest is allemaal code en meettijd: 'GPIO.wait_for_edge (kanaal, GPIO.RISING);terwijl GPIO.input (kanaal) == GPIO.HIGH: counter ++;time.sleep (0,01);if counter
(a) Twee tokens (of meer) zijn geen probleem.Ze kunnen allemaal worden opgespoord en - bovendien - BETROUWBAAR geïdentificeerd en gedifferentieerd.(b) Ok, misschien een vergelijkbare inspanning, misschien niet.Ik hou van mijn oplossing, jij vindt de jouwe leuk.En dan?Verwacht je dat ik mijn antwoord zal verwijderen, of wat?
(a) Gebruikt u 1-draads hardware-ID's?Absoluut geen probleem.Gebruik je alleen een aan / uit-schakelaar?Nee. (B) Weet dat het niet alleen om jou en mij gaat, maar ook om het OP, de andere mensen die de RC-oplossing voorstellen, de anderen die jouw oplossing voorstellen, en de 1000+ mensen die dit in de toekomst zullen lezen op zoek naarhun eigen antwoord, en mogelijk niet in staat om het uwe te gebruiken.En nee, ik wil absoluut niet dat u uw antwoord verwijdert.Het heeft alle verdiensten die het geldig maken.Ik wil alleen meer gewicht geven aan het concept van * OPTIES HEBBEN * Zoals het nu is, trekt uw oplossing het probleem oneerlijk aan.
@VillageTech Ik heb uw oplossing geïmplementeerd en mijn stappen gedocumenteerd.Zie mijn antwoord hieronder.Bedankt en een fijn 2020 gewenst
Scott Seidman
2019-12-22 06:00:32 UTC
view on stackexchange narkive permalink

Ik zou van elk "token" een I2C-apparaat maken.Als u een jack met tip-ring-ring-schacht gebruikt, krijgt u 4 geleiders: aarde, stroom, data en klok.Elk token zou zijn eigen I2C-adres moeten hebben, en je zou een functie moeten schrijven die apparaten op een I2C-bus opspoort.

Als je de standaard pinout voor een headsetstekker volgt - `Tip = speaker, Ring1 = speaker, Ring2 = ground, Sleeve = power + mic` - dan is er mogelijk geen schade als het voor één wordt verward.(Opmerking: stroom is een stroombron, geen spanningsbron. Hierdoor kan het microfoonsignaal bestaan als een AC-gekoppelde spanning, net als de luidsprekers.)
Hetzelfde als bij het geaccepteerde antwoord.Geen belediging, maar -1: dit is waarschijnlijk kwetsbaar voor statische elektriciteit.
@Charlie,, net als elk digitaal circuit ter wereld.
@Scott, Praktisch gesproken wel.Technisch gezien alleen echt CMOS, dus nogmaals, praktisch ja.Het gaat meer om het feit dat een TRS-aansluiting de leads blootlegt.Hoe vaak wordt dit in de winter in en uit polyester jaszakken getrokken?
TRS is zeker een zorg.Het is niet de connector die ik zou kiezen, niet vanwege statische elektriciteit, maar meer vanwege alle ongepaste make / breaks tijdens het inbrengen.Zoals veel circuits, zou dit bescherming nodig hebben.
EinarA
2019-12-22 14:17:28 UTC
view on stackexchange narkive permalink

Dit kan worden gedaan met een set parallel geschakelde weerstanden en condensator, elk paar met een ander RC-product.U zou de gpio-uitgang voldoende lang hoog zetten, deze vervolgens naar een ingang draaien en meten hoe lang het duurt voordat de dop is ontladen.Met tijdconstanten die variëren van microseconden tot milliseconden, kunt u een willekeurig aantal mensen onderscheiden.

Charlie
2019-12-23 18:38:23 UTC
view on stackexchange narkive permalink

Voor de duidelijkheid. Ik haat het idee van 1-draads token niet. Ik vind het echt leuk. Het op deze manier gebruiken van 1-draads is precies het soort waarvoor de 1-draads bus is gemaakt. Mijn zorg is dat het project van speelgoedkwaliteit is; lage beveiliging / budget. Wanneer u vervolgens de duurzaamheidsoverwegingen toevoegt, wordt het duidelijk dat er mogelijk behoefte is aan andere opties waarbij geen speciale chips betrokken zijn. Dat brengt het volgende naar voren.


Zoals anderen al hebben gezegd, is het bijna optimale antwoord om RC-tijdvertraging te gebruiken. De enige component-tokenzijde zou een condensator zijn.

schematic

simuleer dit circuit - Schema gemaakt met CircuitLab

Waarom? Omdat RC-tokens ...

  • zijn niet kwetsbaar voor ESD. (Bewerken: als we eerlijk en praktisch zijn)
  • kan slechts twee draden gebruiken.
  • zal spotgoedkoop en eenvoudig zijn.
  • ruimte genoeg hebben voor 8+ personen.

Voor de elektronica aan de Pi-zijde heb je slechts twee GPIO-pinnen nodig; een oplaadpen en een meetpen. Je zult ook een snellaadcircuit willen / nodig hebben, dat zal ik na de afbeelding uitleggen.

schematic

simuleer dit circuit

Het snellaadcircuit omzeilt de timingweerstand met een veel kleinere weerstand. Hierdoor kan de condensator in het token vrijwel onmiddellijk worden opgeladen (nou ja, voor zover de gebruikers hoe dan ook zien). Het zorgt er ook voor dat de detectiepin de oplaadpin niet rechtstreeks ziet. In plaats daarvan zal het strikt de spanning van de condensatoren zien. Waarden zijn niet kritisch, maar de diode moet echt een Schottky / kleine signaaldiode zijn, anders snijdt hij veel van de bovenkant van de 3.3v af. Dit kan ook worden vervangen door een transistor naar 5v, maar de ingangspen moet mogelijk worden beschermd.

Daarna is het allemaal code, wat ook vrij triviaal is.

(Opmerking: kwam hiermee ter plaatse. Het is totaal niet getest. Standaard disclaimers zijn van toepassing; betreden op eigen risico, aanpassen aan smaak, etc. etc.)

  importeer RPi.GPIO als GPIO
import tijd
# Stel enkele pinnen in
GPIO.setup (<charging_pin>, GPIO.OUT)
GPIO.setup (<sensing_pin>, GPIO.IN)

# Stel de "oplaad" pin in op 3.3v
GPIO.output (<charging_pin>, TRUE)

# Wacht enige tijd totdat de condensator volledig is opgeladen
time.sleep (1.0)

# Zet de oplaadpin op 0v
GPIO.output (<charging_pin>, FALSE)

#count hoe lang de detectiepin hoog blijft
teller = 0
terwijl GPIO.input (<sensing_pin>) == GPIO.HIGH:
    teller + = 1
    time.sleep (0,01)

# Eindelijk krijgt onze teller een waarde die evenredig is met de RC
# vertraging van ons token. Venster past het bij de grenzen, en we zijn gouden.

if (counter > a) en (counter < b):
    print "Is persoon X"

if (counter > b) en (counter < c):
    print "Is persoon Y"

[...]

 

Ten slotte (en alleen als een terzijde / na gedachte) zou ditzelfde ding niet al te erg zijn, opnieuw gebruikt als een condensatortester / meter, want dat is eigenlijk alles wat we hier doen.


Kritiek

Dit is zoveel moeilijker dan een 1-draads oplossing. De 1-draads oplossing is gewoon plug-and-play. RC heeft een hoop bedrading en solderen enzovoort. Alleen het Pi-zijcircuit zal zo complex zijn dat de totale kosten hoger zullen zijn dan alleen het gebruik van 1-draads.

Helemaal niet waar.

Ik denk dat ik hierboven heb laten zien hoe triviaal de RC-oplossing is; ~ 13 regels code, 3 componenten Pi-zijde en 1 condensator per persoon. Eigenlijk best simpel.

1-draads is weliswaar even tamelijk triviaal om op te zetten, maar dat komt omdat je een uitweg koopt. Elk 1-draads token voegt nog een chip van $ 0,5 toe, terwijl elk toegevoegd RC-token slechts een condensator van $ 0,01 is.

Bijna net zo eenvoudig, maar een fractie van de kosten. Vrij duidelijk wie hier de winnaar is.

Uw idee is kwetsbaar voor statische elektriciteit. De Raspberry Pi is kwetsbaar voor statische elektriciteit. Dit is kwetsbaar voor statische elektriciteit. Dat is kwetsbaar voor statische elektriciteit. Uw hond is kwetsbaar voor statische elektriciteit. etc. etc. etc.

Nieuwsflits! Alles is technisch kwetsbaar voor statische elektriciteit / ESD, zelfs jij! Geloof me niet? Val op in een open veld met een paraplu en bewijs dat ik gelijk heb. (PS. Doe dit niet)

Als we echter niet slim zijn @ $$, dan hebben we duidelijke lijnen die we trekken. Het gezonde verstand is bij CMOS IC's, want dat is wat - in een zeer reële en praktische zin - eigenlijk kwetsbaar is voor statische elektriciteit. Het leuke is dat we dit probleem volledig voor het token kunnen oplossen door helemaal geen IC te gebruiken!

Passieven zijn net zo gemakkelijk voor de gepresenteerde taak en robuuster tegen ESD. periode. Dit is de reden waarom men de andere methoden misschien wil heroverwegen.

Nu zal de Pi natuurlijk altijd kwetsbaar zijn voor statische elektriciteit, dat kan alleen als je de Pi verwijdert. Dat is natuurlijk ook niet praktisch. Dus het beste wat we kunnen doen, is doen wat alle anderen doen met die citroenen. Eerst plaatsen we de socket aan de Pi-kant met een goede beschermring op aarde. Ten tweede kunnen we gek worden met TVS-diodes enzovoort. Kort gezegd ...

We hoeven nu maar één (1) apparaat te beschermen tegen ESD, dus word gek als je wilt!

Simpele passives zijn niet veilig. Ze zijn gemakkelijk te vervalsen / kopiëren / hacken / enz.

(-_-) ... dit is een kinderspeelgoed FFS ... waarom brengen we hier informatiebeveiliging in? Maar denk je eigenlijk dat 1-draads hardware-adressen (of erger nog, SPI / I2C-adressen) een goed mechanisme zijn om beveiliging af te dwingen? Werkelijk? Meen je dat !?

Oké, hoe zit dit dan ... breng dat idee naar security.SE. en kijk wat ze zeggen. (Protip: breng verband mee, je krijgt een nieuwe gescheurd.)

Nee. De ALLEEN keer dat 1-draads veilig is, is als je een echt beveiligde token / authenticator [ 1] gebruikt. Dan kan het beveiligd zijn door een nationale staat ... behalve het feit dat de aanvaller zeker fysieke toegang heeft tot het authenticatieapparaat ...

Beveiliging is hier geen probleem, het is totaal buiten het onderwerp.


Bewerken: breek de rest uit in zijn eigen antwoord, want dat was het;een ander antwoord.

ga je de GPIO-pin gebruiken?Hoe zit het met RPi-bescherming tegen statische elektriciteit?En hoe zit het met de mogelijkheid om de variabele weerstand te gebruiken om deze bescherming te hacken?
Dank u voor uw reacties.Ik dacht aan bluetooth-bakens, maar heb besloten om in plaats daarvan voor de plug-in te gaan.Het is dus altijd glashelder welk contact er is geselecteerd.
@VillageTech: (a) Het zou GPIO gebruiken, ja.(b) De RPi zou worden beschermd door de vrouwelijke connector (socket) aan de RPi-zijde te hebben.Dit is veilig, op voorwaarde dat symbolische contacten altijd over de GND strijken terwijl deze is geplaatst;wat sowieso al een kenmerk is van de meeste koptelefoonaansluitingen.(c) Als je derde vraag over informatiebeveiliging gaat, denk ik dat het nogal een afwijkend onderwerp is.Ik betwijfel of de doelgroep van het OP * elke * beveiliging zal dwarsbomen.Maar als ze ... meer macht voor ze doen?Ik zou zeker onder de indruk zijn als een kind de "beveiliging" van beide methoden zou hacken.
@Besi: (a) Geen probleem.(b) Begrepen.(c) Ja, Bluetooth zou problemen hebben met ambiguïteit.Vooral omdat het bereik van Bluetooth tegen u zou werken.De "arme man's RFID" die ik noem, zou dit probleem echter niet hebben, aangezien u het token recht op een "detectiegebied" zou moeten hebben om het zelfs maar te zien.In feite zou het zijn als "Tap and go" contactloze betalingssystemen (Google Near Field Communication). Een andere manier om erover na te denken is alsof je een metaaldetector in de RPi hebt en verschillende metalen in je token.Alleen vervangen we het andere metaal door afgestemde elektromagnetische spoelen.
Om uw herhaaldelijk aandringen op de duurzaamheid van uw oplossing en de onaanvaardbaarheid van eenvoudige digitale apparaten in andere antwoorden tegen te gaan, kunt u [Resistor Sensitivity to Electrostatic Discharge (ESD)] (http://www.vishaypg.com/docs/63129/esd_tn.pdf).
Dat artikel weerlegt echter uw eigen impliciete bewering.Als je de figuren op pagina 2 bekijkt, blijkt duidelijk dat alleen zeer kleine dunne film SMD-weerstanden op afstand kwetsbaar zijn voor ESD.Dikke film SMD-weerstanden veranderden met minder dan 200k ppm na 4500v ESD-gebeurtenissen en folieweerstanden met een niet-meetbare hoeveelheid.Het komt niet eens in doorlopende weerstanden, want dat zou een komisch verhaal zijn.
Of, beknopter: CMOS is standaard kwetsbaar voor ESD, passieven niet.periode.De enige RC-oplossingen die zelfs maar enigszins kwetsbaar zouden kunnen zijn voor ESD, zouden op die manier moeten worden bedacht.Aan de andere kant * ELKE * 1-draads oplossing zou standaard kwetsbaar zijn en zou moeten worden "gepatcht" om veilig te zijn.Elk tegenargument dat anders zegt, lijkt veel op het tegenargument van de beveiliging;veel hand zwaaien en grijpen naar rietjes.
Hoe zit het met de nauwkeurigheid van time.sleep (x), die gegarandeerd * minstens * x slaapt, maar aanzienlijk meer zou kunnen zijn als Raspbian besloot iets anders te doen?Ik denk dat deze oplossing veel beter geschikt is voor een microcontroller die een hardwareteller / timer gebruikt dan een Pi.
@ Scott: Dit is een terechte kritiek.In mijn eigen tests, hoe anekdotisch ook, was het ergste geval zeldzaam.Dat was met PWM voor een RC-servo, een veel moeilijkere RT-taak.Dat was een paar jaar geleden ook met de eerste Pi.De situatie is zeker verbeterd?Er bestaan nu veel kern-RPi's en stabiele Hard RT-kernels, niet dat een van deze dingen IMO nodig zou zijn.Maar nogmaals ... Russells theepot ... Ik ben degene die dat beweert.Praktisch gezien is de oplossing eenvoudig.Men hoeft maar een paar keer te bemonsteren en de werkelijke gemiddelde waarde te bepalen.neem bijvoorbeeld 3x en gooi de oneven blip weg.
Perfect geldige oplossing. (+ 1) Ingebouwde 2-traps R-diode ESD-bescherming kan worden verbeterd met extra 10k serie res.kies vervolgens het doel 100k
Besi
2020-01-02 03:52:18 UTC
view on stackexchange narkive permalink

Zo heb ik eindelijk de fantastische aanpak geïmplementeerd die is geschetst door VillageTech.

Hardware

Bedrading

De standaardpin voor Onewire-apparaten op de Pi is GPIO 4 . Dus ik bedraad GND naar de huls van de stekker en verbond de punt met de genoemde GPIO-pin.

hardware

Een token

Alles wat ik nodig heb voor een token is de DS18B20-chip en een 3,5 mm jack. Soldeer vervolgens de GND- en VCC-pin van de chip aan elkaar en sluit deze aan op de hoes. Voeg wat krimpkous toe aan de middelste pin om kortsluiting te voorkomen en sluit deze aan op het uiteinde van de aansluiting.

Beide krikken werken met twee ringen en met alleen de punt.

token

Trek weerstand

Ik heb besloten geen externe pull-up-weerstand te gebruiken, aangezien de Pi interne pull-up-weerstanden heeft.

Laten we geen koptelefoon bakken

Zoals fout terecht werd opgemerkt, is het feit dat mensen in de verleiding kunnen komen om een ​​koptelefoon aan te sluiten als het eruitziet als een 3,5 mm audio-aansluiting.

Zolang we parasitaire stroom gebruiken, waarbij alleen een aardedraad en een GPIO-uitgang met hoge impedantie wordt blootgesteld aan het stopcontact, zouden we veilig moeten zijn, aangezien we geen V DD sub hebben > lijn die kortsluiting kan veroorzaken door de lage weerstand van de hoofdtelefoon.

Configuratie

Voeg de volgende regel toe aan /boot/config.txt :

  dtoverlay = w1-gpio
 

Er zijn meer opties. Je kunt meer vinden in de / boot / overlays / README van je Pi.

Sommige bronnen stelden voor om de twee modules w1-gpio en w1_therm toe te voegen aan / etc / modules , maar ik ontdekte dat het apparaat -tree overlay-invoer in de boot / config.txt was voldoende voor mijn doeleinden.

Start het apparaat nu opnieuw op.

Voeg een pullup toe via software in python:

  importeer RPi.GPIO als GPIO
GPIO_PIN_NUMBER = 14
GPIO.setmodus (GPIO.BCM)
GPIO.setup (GPIO_PIN_NUMBER, GPIO.IN, pull_up_down = GPIO.PUD_UP)
 

Zodra ik deze pull-up had gemaakt, kon ik de tokens detecteren in / sys / bus / w1 / devices / met het voorvoegsel 28 in een ander terminalvenster:

  $ ls / sys / bus / w1 / devices /
28-00000aabbccd w1_bus_master1
 

Na ongeveer 10 seconden zouden de vermeldingen in devices verdwijnen. Ik moest de volgende configuratie maken, zodat de apparaten na een seconde of zo zouden verdwijnen:

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

Voeg nu de inhoud toe aan het bestand en start het apparaat opnieuw op:

  opties draad timeout = 1 slave_ttl = 1
 

In mijn setup bestond dit bestand niet eerder.

Software

Ik heb een python-klasse gemaakt die naar veranderingen in het bestandssysteem zou zoeken en me zou vertellen of een nieuw token was verbonden of dat alle tokens waren losgekoppeld.

  import os
draad importeren
import tijd
van datetime import datetime, timedelta


klasse W1Service (object):
    __instance = Geen

    def __new __ (cls):
        # Singleton initializer
        als W1Service .__ instantie geen is:
            W1Service .__ instantie = object .__ nieuw __ (cls)
        retourneer W1Service .__ instantie

    on_all_token_removed = Geen
    on_token_added = Geen
    is_scanning = False

    def start_scan (zelf, vertraging = 10):
        return thread.start_new_thread (self.scan, (delay,))

    def scan (zelf, vertraging = 10):
        W1Service.is_scanning = Waar
        last_token = Geen
        current_token = ''
        current_token_timestamp = datetime.now () - timedelta (dagen = 1)

        terwijl W1Service.is_scanning:
            file = open ('/ sys / devices / w1_bus_master1 / w1_master_slaves')
            all_tokens = file.readlines ()
            bestand.close ()

            no_token_attached = len (all_tokens) == 0 of 'niet gevonden. \ n' in all_tokens
            if no_token_attached en self.on_all_token_removed en current_token! = last_token:
                self.on_all_token_removed ()
                current_token = Geen
                last_token = Geen
voor regel in all_tokens:
                current_token = line.split ("\ n") [0]
                time_diff = datetime.now () - current_token_timestamp
                if self.on_token_added en last_token! = current_token en time_diff.seconds > = 3:
                    # Test of het token nog steeds is bevestigd
                    if os.path.exists ('/ sys / bus / w1 / devices /' + current_token + '/ w1_slave'):
                        self.on_token_added (current_token)
                        last_token = huidig_token
                    anders:
                        current_token = Geen
                anders:
                    current_token = Geen

            time.sleep (vertraging)

    def stop_scan (zelf):
        W1Service.is_scanning = False
 

Het gebruik van de gemaakte service is nu vrij eenvoudig:

  importtijd
importeer w1_service

def token_added (token):
    print ("Verbonden% s"% token)

def all_token_removed ():
    print ('Alle tokens zijn verwijderd')

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

terwijl waar:
    # De scan loopt in een aparte thread
    time.sleep (1)
 

Dit levert de volgende uitvoer op bij het invoegen van verschillende tokens

  Alle tokens zijn verwijderd
Verbonden 28-00000aabbccd
Alle tokens zijn verwijderd
Verbonden 28-00000ffddeea
Alle tokens zijn verwijderd
Verbonden 28-00000bbddaa1
Verbonden 28-00000ffddeea
Alle tokens zijn verwijderd
Verbonden 28-00000bbddaa1
Alle tokens zijn verwijderd
 

Houd er rekening mee dat mijn code rekening houdt met het feit dat in mijn setup slechts één token tegelijk kan worden toegevoegd. Dus alleen het nieuwste token is interessant voor mij. Als er meerdere tokens zouden moeten worden toegevoegd, wat het onewire-protocol goed ondersteunt, zou de code moeten worden bijgewerkt.

Applicatie

Telkens wanneer een token wordt ingevoegd, wordt deze gekoppeld aan een persoon van wie mijn aardige berichten kunnen verzenden en ontvangen van

application

Opmerkingen en andere overwegingen

De Onewire-tokens zouden in theorie parallel kunnen worden toegevoegd, wat nieuwe mogelijkheden zou bieden, zoals groepschat en dergelijke. U kunt dus tien tokens op één GPIO aansluiten.

Ik hou ook van de aanpak met de passieve R / C-benadering, die erg pragmatisch is en ook eenvoudig op te zetten. Ik zou dit in een ander project kunnen proberen. Een vriend had er echter een paar

Ik heb overwogen om iBeacons toe te voegen als tokens, maar dan zou ik rekening moeten houden met verschillende RSSI van de tokens en het zou niet 100% duidelijk zijn welk token op een bepaald moment actief was.

Een vriend stelde voor om een ​​kaartlezer toe te voegen en oude foto-SD-kaarten van 1 GB te gebruiken waarvan de foto op de voorkant zou kunnen blijven plakken. De kaart kan alle informatie over de persoon bevatten plus een persoonlijke begroeting of iets dergelijks. Hetzelfde zou werken met oude USB-sticks als tokens.

Het was ontzettend leuk om dit te implementeren en om te zien hoeveel interesse mijn vraag bij mensen opriep. Ik dank jullie allemaal en wens jullie een fijne 0x1414 (= 2020) :-)

Fantastisch werk en bedankt voor het melden.+1.Ik heb geen spijt.Het was leuk om hiermee te helpen, en je hebt een resultaat gekregen dat werkt.Dat is het beste waar we op kunnen hopen.
Charlie
2019-12-25 14:52:00 UTC
view on stackexchange narkive permalink

TL; DR: arme man RFID / NFC / "metaaldetector".

Als je een beetje verfijnd wilt zijn, kun je een afgestemd (R) CL-circuit gebruiken. Het idee zou zijn om een ​​LC-tankcircuit elektromagnetisch op te laden en vervolgens de oscillaties van ring / verval te bekijken. Waar elk token zou worden geïdentificeerd door een unieke frequentie. Dan heb je niet eens contacten nodig!

Dit idee is als primitieve near field-communicatie, of een primitieve metaaldetector. Het zou zoiets als het volgende zijn opgebouwd ...

schematic

simuleer dit circuit - Schema gemaakt met CircuitLab

(PI) De Pi heeft een elektromagnetische spoel, aangedreven door een simpele transistordriver. Dit wordt bekrachtigd met een synthetisch AC- of gepulseerd DC-signaal. Deze kant werkt als de primaire kant van een transformator.

(Token) Het token is een identieke elektromagnetische spoel, met ten minste een condensator eraan bevestigd. Hiermee zou het moeten resoneren met de bekende LC-resonantieformule wanneer het wordt geactiveerd. Deze zijde werkt als de secundaire zijde van een transformator.

Operatie

Als je de twee spoelen dicht bij elkaar brengt (echt heel dichtbij ... zoals .. eigenlijk aanraken), wordt de kracht overgedragen van de Pi-kant naar de token-kant. Dit zal (met betrekking tot compatibele octaven van de geleverde frequentie!) Het token met oscillaties van energie voorzien. Wanneer u het primaire zijaandrijfsignaal verwijdert, blijft het token "een tijdje doorgaan", wat op zijn beurt detecteerbaar is door uw primaire zijspoel.

Als alternatief heeft het toevoegen van de tweede spoel ook het effect dat het in feite gewoon de condensator van de token parallel aan de RPi-zijcondensator toevoegt. Dit verlaagt de resonantiefrequentie van de LC-tank aan de RPi-zijde met de hoeveelheid capaciteit die het token vasthoudt.

Beide methoden zijn mogelijk geschikt voor het scheiden van tokens.

Andrew
2019-12-24 07:22:33 UTC
view on stackexchange narkive permalink

U kunt een laagdoorlaatfilter gebruiken (pin1-resistor-pin2-capacitor-ground), pin1 configureren om 1 en monitor / sample pin2 uit te voeren totdat deze wordt ingesteld op 1.

Draai nu pin1 naar 0 en monitor pin2 (sample - houd in de gaten hoe lang het duurt) totdat het wordt ingesteld op 0.

Door de waarden van weerstand en condensator te veranderen, krijg je verschillende time vertragingen waarmee je distinguish verschillende tokens geassocieerd met een bepaalde persoon.

Deze oplossing werd gebruikt lang voordat ADC een onderdeel werd van MCU's.

Nou, voor dit soort projecten zou ik Arduino gebruiken (of gewoon Atmega8 / 16 / 32-chip) - minimale kosten en gemakkelijk om mee te werken.

Raspbery Pi heeft zoveel kracht dat het zeer wasteful kan gebruiken voor zo'n eenvoudig project.

+1 voor het bovenste gedeelte, want dit gaat nog steeds over wat ik denk dat de beste aanpak is.Maar -1 voor het onderste gedeelte.Hoewel ik het 100% met je eens ben dat de RPi overdreven is, is het nog steeds niet gepast om kritiek te leveren op het gebruik ervan voor deze toepassing.(1) Het doet andere dingen die je waarschijnlijk niet gemakkelijk zou kunnen doen met de AVR-aangedreven Arduino (namelijk fatsoenlijke audio opnemen en afspelen) (2) Als we zouden mogen bekritiseren op prestatie-verdiensten, zou ik de RPi als geheel bekritiserenals een Broadcom-publiciteitsstunt die kan worden uitgevoerd door elke vergelijkbaar geprijsde Android.(bijvoorbeeld TracFone Galaxy Sky / J3 - $ 35)
Tony Stewart Sunnyskyguy EE75
2019-12-22 07:09:41 UTC
view on stackexchange narkive permalink

U kunt veilig elke seconde 1% waarde kiezen en voor 15 cent per stuk aandelen krijgen van Digikey.

De 1 / 4W metaalfilmweerstand kan in een plastic schroef worden geschroefd tot een 3,5 mm-plug, gesoldeerd en vervolgens ingegoten met ondervloerlijm (polyurethaan) als je deze wilt verbergen.

Het gebruik van 10k tot 20k heeft voldoende waarden.Door een 100k Pullup naar Vref te gebruiken, kan dezelfde input worden gebruikt om een logische "0" te detecteren om de unit wakker te maken, met 10 tot 20% Vdd die zal werken.

Een keramische kap van 0.1uF kan tegen dezelfde pin worden geshunt om ESD-ontladingen te shunten en te voorkomen dat onderbroken contacten de spanning meer veranderen dan dV / dt = V / RC

hoe ga je de frambozen pi de weerstand laten meten?
@Jasen die een analoge poort gebruikt met 10k ~ 20k en 100k pullup en 8 bit ADC kan dit oplossen met een eenvoudig algoritme, net zoals Apple-producten dat ooit deden vóór ID-chips.
De Pi heeft geen analoge ingangen.
Deze oplossing zou goed werken voor een ESP32, die de vereiste ADC heeft.
Je hebt geen ADC nodig om weerstand te meten.Je kunt het ook doen met een condensator, een digitale IO-pin en een timer.


Deze Q&A is automatisch vertaald vanuit de Engelse taal.De originele inhoud is beschikbaar op stackexchange, waarvoor we bedanken voor de cc by-sa 4.0-licentie waaronder het wordt gedistribueerd.
Loading...