Domanda:
Aggiungi un token hardware passivo utilizzando un jack da 3,5 mm
Besi
2019-12-22 05:48:49 UTC
view on stackexchange narkive permalink

Ho una scatola che ho fatto per mia nipote, che le permette di scambiare messaggi vocali con me. È alimentato da un Raspberry Pi e dispone di due pulsanti, un LED, un microfono e un altoparlante.

the box

Ora, per Natale, voglio che mia nipote possa scambiare questi messaggi vocali con vari amici (4, 8 o 16 anni) e parenti collegando un token hardware al dispositivo, con la foto di quella persona.

Sto ora cercando il modo più semplice per aggiungere questa funzionalità.

  • Utilizzare preferibilmente una presa jack da 3,5 mm perché sono prontamente disponibili da dispositivi / cuffie usati
  • Preferibile un dispositivo passivo (condensatori + resistori)
  • Preferibilmente collegandolo direttamente al Raspberry Pi
  • Preferibilmente senza utilizzare un convertitore AD, poiché il Raspberry Pi non dispone di questo integrato.
  • Facile da usare da un bambino di 3 anni

Quindi, utilizzando una spina da 3,5 mm con 3 pin, potrei aggiungere l'alimentazione a un pin e collegare o scollegare gli altri due da quel pin, il che mi lascerebbe con due bit, risultando in 4 persone (oltre a me come l'impostazione predefinita, se la presa fornisce un interruttore quando viene inserita una spina).

Se avessi un convertitore analogico-digitale potrei aggiungere un divisore di tensione ai tre pin e utilizzare la tensione come indicatore. Tuttavia, il Raspberry Pi non ha quello integrato, quindi sto cercando un modo intelligente per ottenere questo risultato utilizzando uno dei pin GPIO.

relatives-plug

Questo è un giocattolo molto carino che hai costruito!
Grazie @MarcusMüller.È divertente avere mia nipote chattare con me in questo modo.Ho intenzione di caricare il sorgente e le istruzioni su GitHub e probabilmente lo posterò qui.Buone vacanze ;-)
Qualunque cosa tu faccia, assicurati di non friggere altri dispositivi con i jack da 3,5 mm che potrebbero essere collegati lì!(Cuffie, microfoni, ecc.)
@flawr ottimo punto.Il fatto che io stia usando il potere parassitario dovrebbe risolvere questo problema.Il chip abbasserà la tensione fino a GND e l'ingresso GPIO è ad alta impedenza.E tutto ciò che può accadere in quello scenario è che la GPIO4 viene abbattuta a terra.
Ecco perché è preferibile la R passiva.efficace.semplice, passivo.
Come io e altri abbiamo detto, penso che l'RC passivo sia ottimale.È possibile ottenere il valore dei componenti utilizzando solo le caratteristiche di temporizzazione su due fili, bypassando qualsiasi necessità del lato A2D RPi e bypassando qualsiasi necessità di un lato token del dispositivo sensibile all'elettricità statica.Il codice è anche piuttosto banale.Win-Win-Win.
Otto risposte:
VillageTech
2019-12-22 06:42:36 UTC
view on stackexchange narkive permalink

Usa bus a 1 filo e qualsiasi chip a 1 filo all'interno del pulsante. Ho scritto "any", perché ogni chip a 1 filo ha il proprio indirizzo hardware univoco, quindi tutto ciò di cui hai bisogno sul lato RPi è controllare che il chip sia stato rilevato, ad esempio usando il comando bash:

  ls / sys / bus / w1 / devices /
 

e controllando il suo output per l'esistenza di una sottodirectory denominata esattamente come questo indirizzo hardware.

Sul lato HW di RPi è necessario collegare solo una presa jack aggiuntiva ai pin I / O appropriati (GND + DATA). Non è necessario utilizzare alcuna connessione di alimentazione qui, quindi sembra essere più sicura per RPi rispetto a una soluzione simile, che utilizza I2C (I2C deve avere una linea di alimentazione dedicata, ciò che rende il rischio di danni RPi in caso di cortocircuito). / p>

EDIT: per un lavoro affidabile dovresti aggiungere la resistenza pull-up 4.7kOhm tra la linea DATA e Vcc (3.3V).

È possibile utilizzare il chip DS18B20 più popolare ed economico, che fornisce inoltre la possibilità di misurare la temperatura ambiente;), o DS2401, che fornisce inoltre un numero di serie univoco.

Questo è molto elegante.Grazie per aver condiviso questo!
Ho trovato un tutorial tedesco un tutorial che spiega come configurare i chip a 1 filo: https://tutorials-raspberrypi.de/raspberry-pi-temperatur-mittels-sensor-messen/
Il DS18B20 ha tre pin, sei sicuro che il VCC possa essere semplicemente omesso?Dai un'occhiata al tutorial a 2:10 min https://youtu.be/OBu1weMecbY?t=130
Sì, può essere omesso - in tal caso questo pin dovrebbe essere collegato a terra.Quindi, pin 1 + 3 = terra, pin 2 = dati.È necessario aggiungere una resistenza pull-up da 4,7 kOhm tra la linea DATA e Vcc (3,3 V).Vedere la figura 6 qui: https://datasheets.maximintegrated.com/en/ds/DS18B20.pdf
Senza offesa, ma -1: probabilmente sarà vulnerabile all'elettricità statica.
Certo, ma può essere semplicemente protetto con diodi.Inoltre, il design della presa jack protegge semplicemente da questo: GND sarà sempre collegato come il primo.
Altri metodi non hanno nemmeno bisogno dei diodi, quindi ... Non è che non possa funzionare, semplicemente non sono d'accordo che sia la migliore * possibile * risposta.
Il token hardware dovrebbe essere protetto da una facile copia.
A: Non lo vedo come un requisito dell'OP.Da dove prendi questa idea?B: Come pensi che un indirizzo hardware a 1 filo sia difficile da copiare?
Ok, se non è necessario proteggere, perché non utilizzare una semplice presa jack con pin collegati in corto per accendere / spegnere l'alimentazione?Pensi che sia un male?Perché?E, dal lato HW: per 1 filo abbiamo bisogno di chip, resistenza pull-up, forse 2 diodi da proteggere.È tutto.Usando la soluzione passiva (R / C) la chiave sarà leggermente più economica, ma per quanto riguarda l'hardware sul lato RPi?Ci hai pensato?Come discriminare la resistenza?Comparatori?Costante di tempo con contatore S / W?È più facile ed economico?Veramente?
(a) OP necessita di più di due token, l'interruttore dà on / off come uniche opzioni.(b) Non c'è un lato RPI hardware aggiuntivo, gli input GPIO hanno soglie per andare da '1' a '0' e tornare a '1', il resto è tutto codice e tempo di misurazione: `GPIO.wait_for_edge (channel, GPIO.RISING);mentre GPIO.input (canale) == GPIO.HIGH: counter ++;time.sleep (0,01);if counter
(a) Due gettoni (o più) non sono un problema.Tutti possono essere rilevati e - inoltre - AFFIDABILI identificati e differenziati.(b) Ok, forse uno sforzo simile, forse no.Mi piace la mia soluzione, ti piace la tua.E allora?Ti aspetti che elimini la mia risposta o cosa?
(a) Usando ID hardware a 1 filo?Non è assolutamente un problema.Usi solo un interruttore di accensione / spegnimento?No. (b) Sappi che non si tratta solo di te e me, riguarda l'OP, le altre persone che suggeriscono la soluzione RC, gli altri che suggeriscono la tua soluzione e le oltre 1000 persone che leggeranno questo in futuro alla ricerca dila loro risposta e forse non in grado di usare la tua.E no, non voglio assolutamente che tu elimini la tua risposta.Ha merito tutto suo che lo rende valido.Voglio semplicemente dare più peso al concetto di * AVERE OPZIONI * Così com'è ora, la tua soluzione distorce il problema ingiustamente.
@VillageTech Ho implementato la tua soluzione e ho documentato i miei passaggi.Vedi la mia risposta di seguito.Grazie e buon 2020
Scott Seidman
2019-12-22 06:00:32 UTC
view on stackexchange narkive permalink

Renderei ogni "token" un dispositivo I2C.L'uso di un jack stile tip-ring-ring-shank ti darebbe 4 conduttori: terra, alimentazione, dati e orologio.Ogni token dovrebbe avere il proprio indirizzo I2C e tu scriveresti una funzione che fiuti i dispositivi su un bus I2C.

Se segui la piedinatura standard per un connettore per cuffie - `Tip = altoparlante, Ring1 = altoparlante, Ring2 = terra, Sleeve = alimentazione + microfono` - allora potrebbe non esserci alcun danno se viene confuso per uno.(Nota: l'alimentazione è una sorgente di corrente, non una sorgente di tensione. Ciò consente al segnale del microfono di esistere come tensione accoppiata in CA, proprio come gli altoparlanti.)
Lo stesso della risposta accettata.Senza offesa, ma -1: probabilmente sarà vulnerabile all'elettricità statica.
@Charlie, proprio come ogni circuito digitale del mondo.
@Scott, In pratica, sì.Tecnicamente, solo realmente CMOS, quindi, di nuovo, praticamente sì.Si tratta più del fatto che un jack TRS espone i cavi.Quante volte verrà tirato dentro e fuori dalle tasche del cappotto di poliestere durante l'inverno?
TRS è sicuramente una preoccupazione.Non è il connettore che sceglierei, non a causa della statica, ma più a causa di tutte le operazioni di chiusura / interruzione inappropriate durante l'inserimento.Come molti circuiti, questo richiederebbe protezione.
EinarA
2019-12-22 14:17:28 UTC
view on stackexchange narkive permalink

Questo può essere fatto con una serie di resistori e condensatori in parallelo, ogni coppia con un diverso prodotto RC.Dovresti alzare l'uscita gpio per un tempo sufficiente, quindi trasformarla in un input e misurare quanto tempo impiega il tappo a scaricarsi.Con possibili costanti di tempo che vanno da microsecondi a millisecondi, puoi distinguere qualsiasi numero di persone.

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

Per essere chiari. Non odio l'idea del token a 1 filo. Mi piace davvero. L'uso di un cavo in questo modo è esattamente il tipo di oggetto per cui è stato creato il bus a 1 cavo. La mia preoccupazione è che il progetto sia di qualità giocattolo; bassa sicurezza / budget. Quando poi si aggiungono le considerazioni sulla durabilità, diventa chiaro che potrebbe esserci il desiderio di altre opzioni che non coinvolgono chip specializzati. Il che fa apparire quanto segue.


Come altri hanno detto, la risposta quasi ottimale è usare il ritardo temporale RC. L'unico componente lato token sarebbe un condensatore.

schematic

simula questo circuito - Schema creato utilizzando CircuitLab

Perché? Perché gettoni RC ...

  • non sono vulnerabili all'ESD. (Modifica: se siamo onesti e pratici)
  • può utilizzare solo due cavi.
  • sarà semplice ed economico.
  • avere molto spazio per 8+ persone.

Per l'elettronica lato Pi, hai solo bisogno di due pin GPIO; un perno di ricarica e un perno di rilevamento. Avrai anche bisogno / bisogno di un circuito di ricarica rapida, che spiegherò dopo il grafico.

schematic

simula questo circuito

Il circuito di ricarica rapida bypassa il resistore di temporizzazione con un resistore molto più piccolo. Ciò consente al condensatore nel token di caricarsi quasi istantaneamente (beh, per quanto gli utenti vedranno in qualsiasi modo). Inoltre, fa in modo che il pin di rilevamento non veda direttamente il pin di ricarica. Invece, vedrà rigorosamente la tensione dei condensatori. I valori non sono critici, tuttavia, il diodo ha davvero bisogno di essere un diodo di segnale Schottky / piccolo, o taglierà molto la parte superiore del 3.3v. Questo potrebbe anche essere sostituito con un transistor a 5v, ma potrebbe essere necessario proteggere il pin di ingresso.

Dopodiché, è tutto codice, il che è anche piuttosto banale.

(Nota: è venuto fuori con questo sul posto. Non è totalmente testato. Si applicano le esclusioni di responsabilità standard; Procedi a tuo rischio e pericolo, regola i gusti, ecc.)

  importa RPi.GPIO come GPIO
tempo di importazione
#Setup alcuni pin
GPIO.setup (<charging_pin>, GPIO.OUT)
GPIO.setup (<sensing_pin>, GPIO.IN)

# Imposta il pin di "ricarica" ​​su 3.3v
GPIO.output (<charging_pin>, TRUE)

# Attendere un po 'di tempo affinché il condensatore sia completamente carico
time.sleep (1.0)

# Imposta il pin di ricarica su 0v
GPIO.output (<charging_pin>, FALSE)

#count per quanto tempo il perno di rilevamento rimane alto
contatore = 0
mentre GPIO.input (<sensing_pin>) == GPIO.HIGH:
    contatore + = 1
    time.sleep (0,01)

# Finalmente il nostro contatore avrà un valore proporzionale al RC
# ritardo di tempo del nostro token. Window abbinalo ai limiti e siamo d'oro.

se (contro > a) e (contro < b):
    print "È la persona X"

se (counter > b) e (counter < c):
    print "È la persona Y"

[...]

 

Infine (e solo a parte / dopo aver pensato) questa stessa cosa non sarebbe troppo terribile riproposta come tester / misuratore di condensatori, poiché è praticamente tutto ciò che stiamo facendo qui.


Critica

È molto più difficile di una soluzione a 1 filo. La soluzione a 1 filo è solo plug-and-play. RC avrà un sacco di cablaggi e saldature e così via. Il solo circuito del lato Pi sarà così complesso che il costo totale sarà più alto del semplice utilizzo di 1 filo.

Per niente vero.

Penso di aver mostrato sopra quanto sia banale la soluzione RC; ~ 13 righe di codice, 3 componenti lato Pi e 1 condensatore per persona. Abbastanza semplice in realtà.

1-wire è, certamente, ugualmente abbastanza banale da configurare, ma è perché stai acquistando la tua via d'uscita. Ogni token a 1 filo aggiunge un altro chip da $ 0,5, dove come ogni token RC aggiunto è solo un condensatore da $ 0,01.

Quasi altrettanto semplice, ma una frazione del costo. Abbastanza chiaro chi è il vincitore qui.

La tua idea è vulnerabile all'elettricità statica. Il Raspberry Pi è vulnerabile all'elettricità statica. Questo è vulnerabile all'elettricità statica. Questo è vulnerabile all'elettricità statica. Il tuo cane è vulnerabile all'elettricità statica. ecc. ecc. ecc.

Notizie flash! Tutto è tecnicamente vulnerabile all'elettricità statica / ESD, anche tu! Non mi credi? Vai a distinguerti in un campo aperto con un ombrello e dimostrami che ho ragione. (PS. Non farlo)

Tuttavia, se non siamo intelligenti @ $$, allora abbiamo linee ovvie che tracciamo. Il punto di buon senso è nei circuiti integrati CMOS, poiché questo è ciò che - in un senso molto reale e pratico - è effettivamente vulnerabile all'elettricità statica. La cosa divertente è che possiamo rimuovere completamente questo problema per il token non utilizzando UN IC A TUTTI!

I passivi sono altrettanto facili per il compito presentato e più robusti contro l'ESD. periodo. Questo è il motivo per cui si potrebbe voler riconsiderare gli altri metodi.

Ora, ovviamente, il Pi sarà sempre vulnerabile all'elettricità statica, in nessun modo a meno che non lo rimuovi. Ovviamente anche questo non è pratico. Quindi, il meglio che possiamo fare è fare quello che fanno tutti gli altri con quei limoni. Innanzitutto, mettiamo a terra la presa sul lato Pi con un anello di protezione adeguato. In secondo luogo, possiamo impazzire con i diodi TVS e così via. Conclusione qui ...

Dobbiamo proteggere ESD solo un (1) dispositivo ora, quindi impazzisci se vuoi!

I passivi semplici non sono sicuri. Sono facili da falsificare / copiare / hackerare / ecc.

(-_-) ... questo è un giocattolo per bambini FFS ... perché stiamo portando la sicurezza delle informazioni in questo? Anche così, pensi davvero che gli indirizzi hardware a 1 filo (o peggio ancora, gli indirizzi SPI / I2C) siano un buon meccanismo per rafforzare la sicurezza? Veramente? Dici sul serio !?

OK, che ne dici di questo allora ... porta quell'idea alla sicurezza. e guarda cosa dicono. (Suggerimento: porta con te le bende, ne verrai strappata una nuova.)

No. L ' SOLO tempo in cui 1-wire è sicuro, è se stai utilizzando un autentico token / autenticatore sicuro [ 1] . Quindi può essere protetto dallo stato nazionale ... a parte il fatto che l'aggressore ha sicuramente accesso fisico al dispositivo di autenticazione ...

La sicurezza qui non è un problema, è totalmente fuori tema.


Modifica: spezza il resto nella sua risposta, poiché è quello che era;una risposta diversa.

utilizzerai il pin GPIO?E la protezione RPi contro l'elettricità statica?E che dire della possibilità di utilizzare il resistore variabile per hackerare questa protezione?
Grazie per i tuoi commenti.Ho pensato ai beacon bluetooth ma ho deciso di optare per la versione plug-in.Quindi è sempre chiarissimo quale contatto è selezionato.
@VillageTech: (a) Userebbe GPIO, sì.(b) L'RPi sarebbe protetto avendo il connettore femmina (presa) sul lato RPi.Questo è sicuro a condizione che i contatti token sfiorino sempre il GND mentre è inserito;che è già una caratteristica della maggior parte dei jack per cuffie comunque.(c) Se la tua terza domanda riguarda la sicurezza delle informazioni, penso che sia abbastanza fuori tema.Dubito che il gruppo target dell'OP ostacolerà * qualsiasi * sicurezza.Ma se lo fanno ... più potere per loro?Sarei sicuramente impressionato se un bambino violasse la "sicurezza" di entrambi i metodi.
@Besi: (a) Nessun problema.(b) Capito.(c) Sì, il Bluetooth avrebbe problemi di ambiguità.Soprattutto perché la portata del Bluetooth funzionerebbe contro di te.Tuttavia, l '"RFID dei poveri" di cui parlo non avrebbe questo problema, poiché è necessario che il gettone si trovi proprio su una "area di rilevamento" per poterlo vedere.Fondamentalmente, sarebbe come un sistema di pagamento senza contatto "Tap and go", (Google Near Field Communication) Un altro modo di pensare è come avere un metal detector nell'RPI e diversi metalli nel tuo gettone.Solo, sostituiamo il diverso metallo con bobine elettromagnetiche sintonizzate.
Per contrastare la tua ripetuta insistenza sulla durabilità della tua soluzione e l'inaccettabilità di semplici dispositivi digitali in altre risposte, considera [Resistor Sensitivity to Electrostatic Discharge (ESD)] (http://www.vishaypg.com/docs/63129/esd_tn.PDF).
Quel documento smentisce la tua affermazione implicita, però.Se guardi le figure a pagina 2, mostra chiaramente che solo i resistori SMD a film sottile molto piccoli sono remotamente vulnerabili alle ESD.Resistori SMD a film spesso modificati di meno di 200k ppm dopo eventi ESD 4500v e resistori a foglio di una quantità non misurabile.Non entra nemmeno nei resistori del foro passante, poiché sarebbe comicamente fuori dalla narrativa.
O, più succintamente: per impostazione predefinita, CMOS è vulnerabile a ESD, i passivi no.periodo.Le uniche soluzioni RC che potrebbero essere anche lontanamente vulnerabili all'ESD dovrebbero essere concepite in questo modo.D'altra parte * QUALSIASI * soluzione a 1 filo sarebbe vulnerabile per impostazione predefinita e dovrebbe essere "patchata" per essere sicura.Qualsiasi controargomentazione che dica il contrario è molto simile all'argomento del contatore di sicurezza;molta mano che saluta e afferra le cannucce.
Che ne dici della precisione di time.sleep (x), che è garantito per dormire per * almeno * x, ma potrebbe essere notevolmente di più se Raspbian decidesse di fare qualcos'altro?Penso che questa soluzione sia molto più adatta a un microcontrollore che utilizza un contatore / timer hardware rispetto a un Pi.
@ Scott: questa è una critica valida.Nei miei test, per quanto aneddotici, il caso peggiore era raro.Era con PWM per un servo RC, un compito RT molto più difficile.È stato anche qualche anno fa con il primo Pi.Sicuramente la situazione è migliorata?Al momento esistono molti core RPis e kernel Hard RT stabili, non che entrambe queste cose sarebbero necessarie IMO.Poi di nuovo ... la teiera di Russell ... sono io a fare questa affermazione.In pratica, la soluzione è semplice.Sarebbe necessario campionare solo poche volte e decidere il valore medio effettivo.Ad esempio, prendi 3x e getta il blip dispari.
Soluzione perfettamente valida. (+ 1) La protezione ESD con diodo R a 2 stadi integrato può essere migliorata con ulteriori ris. Serie 10k.quindi scegli l'obiettivo 100k
Besi
2020-01-02 03:52:18 UTC
view on stackexchange narkive permalink

È così che ho finalmente implementato il favoloso approccio delineato da VillageTech.

Hardware

Cablaggio

Il pin predefinito per i dispositivi Onewire sul Pi è GPIO 4 . Quindi ho collegato GND alla manica della spina e ho collegato la punta al pin GPIO menzionato.

hardware

Un token

Tutto ciò di cui ho bisogno per un token è il chip DS18B20 e un jack da 3,5 mm. Quindi saldare insieme i pin GND e VCC del chip e collegarlo alla manica. Aggiungi un po 'di guaina termorestringente al perno centrale per evitare cortocircuiti e collegalo alla punta del jack.

Entrambi i jack funzionano quello con due anelli e quello con solo la punta.

token

Resistenza di pull up

Ho deciso di non utilizzare una resistenza di pull up esterna, poiché il Pi ha resistenze di pull up interne.

Non friggiamo le cuffie

Come flawr correttamente sottolineato è il fatto che se sembra un jack audio da 3,5 mm le persone potrebbero essere tentate di inserire le cuffie.

Finché utilizziamo un'alimentazione parassita, dove solo un filo di terra e un'uscita GPIO ad alta impedenza sono esposti alla presa, dovremmo essere al sicuro, poiché non abbiamo un V DD sub > linea che potrebbe creare un cortocircuito a causa della bassa resistenza delle cuffie.

Configurazione

Aggiungi la seguente riga a /boot/config.txt :

  dtoverlay = w1-gpio
 

Ci sono più opzioni. Puoi trovare altro nel / boot / overlays / README del tuo Pi.

Alcune fonti hanno suggerito di aggiungere i due moduli w1-gpio e w1_therm a / etc / modules , tuttavia ho scoperto che il dispositivo -tree overlay entry nel boot / config.txt era sufficiente per i miei scopi.

Ora riavvia il dispositivo.

Aggiungi un pullup tramite software in python:

  importa RPi.GPIO come GPIO
GPIO_PIN_NUMBER = 14
GPIO.setmode (GPIO.BCM)
GPIO.setup (GPIO_PIN_NUMBER, GPIO.IN, pull_up_down = GPIO.PUD_UP)
 

Non appena ho creato questo pull up, ho potuto rilevare i token in / sys / bus / w1 / devices / con il prefisso 28 in un'altra finestra del terminale:

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

Dopo circa 10 secondi le voci in devices scomparirebbero. Ho dovuto creare la seguente configurazione, in modo che i dispositivi scomparissero dopo circa un secondo:

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

Ora aggiungi il contenuto al file e riavvia nuovamente il dispositivo:

  opzioni wire timeout = 1 slave_ttl = 1
 

Nella mia configurazione questo file non esisteva in precedenza.

Software

Ho creato una classe python che cercava modifiche nel file system e mi diceva se un nuovo token era connesso o se tutti i token erano scollegati.

  import os
importare thread
tempo di importazione
da datetime import datetime, timedelta


classe W1Service (oggetto):
    __istanza = Nessuno

    def __new __ (cls):
        # Inizializzatore singleton
        se l'istanza W1Service .__ è Nessuno:
            W1Service .__ istanza = oggetto .__ new __ (cls)
        restituire l'istanza W1Service .__

    on_all_token_removed = Nessuno
    on_token_added = Nessuno
    is_scanning = False

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

    def scan (self, delay = 10):
        W1Service.is_scanning = True
        last_token = Nessuno
        current_token = ''
        current_token_timestamp = datetime.now () - timedelta (giorni = 1)

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

            no_token_attached = len (all_tokens) == 0 o 'non trovato. \ n' in all_tokens
            if no_token_attached e self.on_all_token_removed e current_token! = last_token:
                self.on_all_token_removed ()
                current_token = Nessuno
                last_token = Nessuno
per la riga in all_tokens:
                current_token = line.split ("\ n") [0]
                time_diff = datetime.now () - current_token_timestamp
                se self.on_token_added e last_token! = current_token e time_diff.seconds > = 3:
                    # Verifica se il token è ancora allegato
                    se os.path.exists ('/ sys / bus / w1 / devices /' + current_token + '/ w1_slave'):
                        self.on_token_added (current_token)
                        last_token = current_token
                    altro:
                        current_token = Nessuno
                altro:
                    current_token = Nessuno

            time.sleep (ritardo)

    def stop_scan (self):
        W1Service.is_scanning = False
 

Ora utilizzare il servizio creato è abbastanza semplice:

  ora di importazione
import w1_service

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

def all_token_removed ():
    print ("Tutti i token sono stati rimossi")

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

mentre True:
    # La scansione viene eseguita in un thread separato
    time.sleep (1)
 

Questo produrrà il seguente output quando si inseriscono diversi token

  Tutti i token sono stati rimossi
Collegato 28-00000aabbccd
Tutti i token sono stati rimossi
Collegato 28-00000ffddeea
Tutti i token sono stati rimossi
Collegato 28-00000bbddaa1
Collegato 28-00000ffddeea
Tutti i token sono stati rimossi
Collegato 28-00000bbddaa1
Tutti i token sono stati rimossi
 

Tieni presente che il mio codice tiene conto del fatto che nella mia configurazione è possibile aggiungere un solo token alla volta. Quindi solo il token più recente è interessante per me. Se si devono aggiungere più token, che il protocollo onewire supporta bene, il codice dovrebbe essere aggiornato.

Applicazione

Ora ogni volta che viene inserito un token, viene abbinato a una persona da cui il mio gentile può inviare messaggi e ricevere messaggi

application

Note e altre considerazioni

I token Onewire potrebbero in teoria essere aggiunti in parallelo, il che offrirebbe nuove funzionalità come chat di gruppo o simili. Quindi potresti collegare dieci token su un singolo GPIO.

Mi piace anche l'approccio con l'approccio R / C passivo, che è molto pragmatico e anche semplice da configurare. Potrei provarlo in un altro progetto. Tuttavia, un amico ne aveva un po '

Ho preso in considerazione l'aggiunta di iBeacons come token, ma poi avrei dovuto tenere conto di diversi RSSI dei token e non sarebbe chiaro al 100% quale token fosse attivo in un dato momento.

Un amico ha suggerito di aggiungere un lettore di schede e utilizzare vecchie schede SD fotografiche da 1 GB che potrebbero avere l'immagine bloccata sul davanti. La scheda potrebbe contenere tutte le informazioni sulla persona più un saluto personalizzato o simili. Lo stesso funzionerebbe con le vecchie chiavette USB come token.

È stato estremamente divertente implementarlo e vedere quanto interesse ha suscitato la mia domanda nelle persone. Vi ringrazio tutti e vi auguro un bel 0x1414 (= 2020) :-)

Lavoro fantastico e grazie per la segnalazione.+1.Non ho rimpianti.È stato divertente aiutare con questo e hai ottenuto un risultato che funziona.È il meglio che possiamo sperare.
Charlie
2019-12-25 14:52:00 UTC
view on stackexchange narkive permalink

TL; DR: rilevatore RFID / NFC / "metallo" dei poveri.

Se vuoi essere un po 'sofisticato, potresti usare un circuito (R) CL sintonizzato. L'idea sarebbe quella di caricare un circuito del serbatoio LC elettromagneticamente, quindi osservare le oscillazioni dell'anello / decadimento. Dove ogni token sarebbe identificato da una frequenza univoca. Quindi, non avresti nemmeno bisogno dei contatti!

Questa idea è come una primitiva comunicazione in campo vicino o un primitivo metal detector. Sarebbe costruito qualcosa di simile al seguente ...

schematic

simula questo circuito - Schema creato utilizzando CircuitLab

(PI) Il Pi ha una bobina elettromagnetica, alimentata da un semplice driver a transistor sporco. Questo è eccitato con un segnale CA sintetico o CC pulsato. Questo lato si comporta come il lato principale di un trasformatore.

(Token) Il token è una bobina elettromagnetica identica, con almeno un condensatore collegato. Con solo questo, dovrebbe risuonare con la ben nota formula di risonanza LC quando energizzato. Questo lato agisce come il secondario di un trasformatore.

Operazione

Quando avvicini le due bobine l'una all'altra (molto vicine ... come ... praticamente si toccano) la potenza si trasferirà dal lato Pi, al lato token. Questo (rispetto alle ottave compatibili della frequenza fornita!) Ecciterà il token con oscillazioni. Quando rimuovi il segnale di guida del lato primario, il token "continuerà a funzionare per un po '" che, a sua volta, sarà rilevabile dalla bobina del lato primario.

In alternativa, l'aggiunta della seconda bobina ha anche l'effetto di aggiungere fondamentalmente il condensatore del token al condensatore del lato RPi in parallelo. Ciò ridurrà la frequenza di risonanza del serbatoio LC lato RPi della quantità di capacità che il token detiene.

Entrambi i metodi sono potenzialmente utilizzabili per separare i token.

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

È possibile utilizzare un filtro passa-basso (pin1-resistor-pin2-capacitor-ground), configurare pin1 per l'uscita 1 e monitor / sample pin2 fino a quando non si imposta su 1.

Ora gira pin1 su 0 e monitora pin2 (sample - controlla il tempo quanto tempo impiegherà) finché non si imposta su 0.

Alterando i valori di resistenza e condensatore si ottengono diversi ritardi time che ti consentiranno di distinguish diversi tokens associati a una determinata persona.

Questa soluzione è stata utilizzata molto prima che ADC diventasse parte degli MCU.

Bene, per progetti di questo tipo userei Arduino (o solo Atmega8 / 16 / 32 chip) - costo minimo e facile da lavorare.

Raspbery Pi ha così tanto potere che è molto wasteful da utilizzare per un progetto così semplice.

+1 per la parte superiore, poiché si tratta ancora di quello che penso sia l'approccio migliore.Ma -1 per la parte inferiore.Anche se sono d'accordo con te al 100% sul fatto che RPi sia eccessivo, non è ancora appropriato criticare il suo utilizzo per questa applicazione.(1) Sta facendo altre cose che probabilmente non potresti fare facilmente con Arduino alimentato da AVR (vale a dire, registrare e riprodurre audio decente) (2) Se ci fosse permesso di criticare i meriti delle prestazioni, criticherei l'RPi nel suo complessocome una trovata pubblicitaria Broadcom che può essere fatta da qualsiasi Android di prezzo comparabile.(ad esempio TracFone Galaxy Sky / J3 - $ 35)
Tony Stewart Sunnyskyguy EE75
2019-12-22 07:09:41 UTC
view on stackexchange narkive permalink

Puoi tranquillamente scegliere ogni secondo un valore dell'1% e ottenere azioni da Digikey per 15 centesimi ciascuno.

Il resistore a film metallico da 1/4 W può essere inserito all'interno di una vite di plastica su un connettore da 3,5 mm, saldato e quindi sigillato con adesivo sottopavimento (poliuretano) se si desidera nasconderlo.

L'uso di un valore da 10k a 20k ha valori sufficienti.L'utilizzo di un pullup da 100k a Vref consente di utilizzare lo stesso input per rilevare uno "0" logico per riattivare l'unità, con il 10-20% di Vdd che funzionerà.

Un cappuccio in ceramica da 0,1uF può essere deviato sullo stesso pin per shuntare le scariche ESD e impedire ai contatti intermittenti di modificare la tensione più di dV / dt = V / RC

come pensate che il lampone pi misuri la resistenza?
@Jasen utilizzando una porta analogica con 10k ~ 20k e 100k pullup e ADC a 8 bit può risolvere questo problema con un semplice algoritmo, proprio come facevano i prodotti Apple una volta prima dei chip ID.
Il Pi non ha ingressi analogici.
Questa soluzione funzionerebbe bene per un ESP32, che ha l'ADC richiesto.
Non è necessario un ADC per misurare la resistenza.Puoi anche farlo con un condensatore, un pin IO digitale e un timer.


Questa domanda e risposta è stata tradotta automaticamente dalla lingua inglese. Il contenuto originale è disponibile su stackexchange, che ringraziamo per la licenza cc by-sa 4.0 con cui è distribuito.
Loading...