Kérdés:
Hogyan tudok különbséget tenni több áramkör között?
Jonathan Dautrich
2018-07-10 09:19:52 UTC
view on stackexchange narkive permalink

Rejtvényt építek egy menekülési helyiség számára. 6 vezetéket és 6 csatlakozót akarok adni a felhasználónak, majd meg kell erősítenem, hogy a megfelelő vezetékeket csatlakoztatták a megfelelő csatlakozókhoz (egy az egyhez).

Első (sikeres) kísérletem ennek megvalósítására A rejtvény az volt, hogy a vezetékeket 6 különböző PWM analóg kimenethez csatlakoztassák, amelyek különböző szintekre vannak állítva, és a csatlakozókat 6 analóg bemeneti tűhöz. A bemeneti tüskék leolvasásának időátlagolásával meg tudtam állapítani, hogy mely vezeték (ek) melyik sorkapcsokhoz vannak csatlakoztatva, ha vannak ilyenek.

Jelenleg nincs ellenállásom az áramkörökben.

Mivel a rejtvény jelenleg megtervezett, a felhasználó furcsa dolgokat tehet, például:

  • Csatlakoztasson több vezetéket ugyanahhoz a terminálhoz.
  • Csatlakoztasson több vezetéket egymáshoz , anélkül, hogy bármelyik terminálhoz csatlakoztatná őket.
  • Érintsen meg több szabadon lévő vezetéket és / vagy kivezetést.

A kérdéseim kettőre süllyednek:

  • Veszélyes a jelenlegi megközelítésem, akár az Arduino, akár a felhasználóim számára, és vannak-e ajánlott óvintézkedések, amelyeket meg kell tennem?
  • Van-e jobb (biztonságosabb, egyszerűbb vagy erőteljesebb) módszer a rejtvény megvalósítására?

Szoftvermérnök vagyok, de teljes noob, ha a valódi elektronikáról és az Arduinóról van szó, ezért nyugodtan feltételezhetem, hogy nem tudok semmit.

Kettő válaszokat:
Edgar Bonet
2018-07-10 13:06:10 UTC
view on stackexchange narkive permalink

Először vegyük figyelembe a program logikáját. Két csapos csoportja van: 6 érintkező csatlakozik a vezetékekhez, és 6 érintkező csatlakozik a terminálokhoz. Az első dolog, amit tennék, elfelejteném, hogy ezek két különféle csoport. Fontolja meg, hogy csak 12 érintkezõje van, amelyeket a felhasználó speciális módon csatlakoztat. Így a legtöbb furcsa dolog, amelyet a használó megtehet, például a vezetékek összekapcsolása nem különösebb eset. Csak egy érvénytelen kombináció. Most az van, hogy a 12 közül minden csapra meghatározhatja, hogy össze vannak-e kötve. Ha olyan pár csatlakozik, amelynek nem szabad, akkor érvénytelen kombinációja van. Ha bármelyik pár nincs összekapcsolva, annak lennie kell, akkor ez ismét érvénytelen kombináció. Ha minden pár a várt állapot (vagy csatlakoztatva van, vagy nincs csatlakoztatva), akkor a felhasználó megoldotta a feladványt.

Most a hardver oldalról. Egyszerű módja annak, hogy megtudja, hogy két érintkező nincs-e összekapcsolva, az, ha egyiküket INPUT_PULLUP -ra állítja, a másikat pedig OUTPUT LOW -ra. Ez a második tű legyen a csak hozzáférhető a felhasználó számára, aki LOW -t ad ki. Az összes többi kitett lábat INPUT vagy INPUT_PULLUP értékként kell beállítani. Most, ha az első beolvassa a LOW -t, akkor tudod, hogy van kapcsolatod. Ha a HIGH feliratot olvassa, akkor a két érintkező nincs összekapcsolva.

Itt van egy példa program, amely bemutatja ezt az elvet. Összekapcsolja a 66 lehetséges párot, hogy ellenőrizze, hogy kapcsolódnak-e. Csak ki kell cserélnie a belső if kódot, amely érvényesíti a kombinációt.

  const int PIN_COUNT = 12; const uint8_t pins [PIN_COUNT] = {...}; void setup () {Serial.begin (9600); // Állítsa az összes csapot INPUT_PULLUP értékre. for (int i = 0; i < PIN_COUNT; i ++) pinMode (csapok [i], INPUT_PULLUP);} void loop () {// Hurkoljon az összes csappárra (csapok [i], csapok [j]).
// Állítsa az [i] csapokat OUTPUT LOW értékre, majd olvassa el a [j] csapokat. for (int i = 0; i < PIN_COUNT - 1; i ++) {pinMode (csapok [i], OUTPUT); digitalWrite (csapok [i], LOW); for (int j = i + 1; j < PIN_COUNT; j ++) {if (digitalRead (csapok [j]) == ALACSONY) {Serial.print ("csapok"); Soros nyomtatás (csapok [i]); Soros nyomtatás ("és"); Soros nyomtatás (csapok [j]); Serial.println ("össze vannak kötve."); }} pinMode (csapok [i], INPUT_PULLUP); }}  

Ami a biztonságot illeti, jól kell lenned mindaddig, amíg a felhasználóknak nincs semmilyen alacsony impedanciájú föld- vagy feszültségforrásuk. Különösen a GND és az 5V érintkezők ne legyenek hozzáférhetők a felhasználók számára. A fokozott védelem érdekében 1 kΩ-os ellenállást sorozatosan lehet elhelyezni az egyes csapokhoz, de akkor az összes aktívan nem tesztelt csapot INPUT helyett INPUT_PULLUP kell beállítani, különben több A párhuzamos húzások elkezdhetik versenyezni a soros ellenállást.

Pontosan ezt a módszert használom a fejlesztő táblák tesztelésére. Olyan árnyékolás van csatlakoztatva, amely a csapok 50% -át 100r ellenállásokon keresztül összeköti a többi 50% -kal. A csapok beolvasása egy meghatározott alacsony ellenõrzéssel, mind a megfelelõ folytonosság, mind a rövidnadrág más csapok ellen.
Gyönyörű. Ez a paradigma hiányzott. Teljesen nem jutott eszembe, hogy gyorsan tudnék mérni különböző konfigurációkban, gyorsan egymás után. A dolgok építésének lehetőségei csak felrobbantak. Ki probalom.
Ez csodálatosan működött. Sokkal jobban szeretem, mint az analóg megközelítést, mivel nem kell aggódnom az egyes bemenetek várható feszültségtartományainak meghatározása miatt. És természetesen nem kellett ellenőriznem mind a 12 * 11/2 kombinációt, mivel csak azt kell tudnom, hogy melyik vezeték csatlakozik az egyes csatlakozókhoz (6 * 6 ellenőrzés) - ha két kapcsot vagy két vezetéket csatlakoztattak, akkor szükségszerűen az adott terminálhoz csatlakoztatott vezetékek helytelen kombinációját eredményezné. Fontos azonban ellenőrizni, hogy a vártnál 6-nál több kapcsolat van-e, annak érdekében, hogy a felhasználó valamilyen módon áthidalja az összes terminált. Köszönöm!
sa_leinad
2018-07-10 10:52:19 UTC
view on stackexchange narkive permalink

Azt is csatlakoztatnám a sorkapcsokat a 6 analóg bemeneti csatlakozóhoz, és 6 egyedi feszültségem lenne, vezetékenként egy. Az Arduino csak akkor biztosítja a kimenetet, ha a 6 vezeték a megfelelő sorkapcsokra kerül. Más szavakkal, amikor az Arduino a megfelelő analóg feszültséget látja a megfelelő csapokon.

Én személy szerint hozzáadnék egy RC aluláteresztő szűrőt a PWM kimenetéhez. További információ itt. A PWM kimenete a Vin-be kerül, azután pedig a Vout a vezetékéhez (azaz az analóg bemenethez). Csatornánként egy szűrő.

Basic RC filter

Az RC szűrő megvédi az Arduinót a rövidektől a + ve, Gnd és a többi csapokig, valamint egy kis védelmet nyújt a statikus ellen. Ez egyszerűsíti a kódodat is.

Jelenleg divatos kódot kell bevezetned az analóg csapok feszültségének átlagolásához. Az RC-szűrő lényegében szükségtelenné teszi ezt a kódot.

A szükséges ellenállás és kondenzátor értékének kiszámításához: Az All About Circuits oldalon egy nagyon jó cikk található, amely ebben a témában található. részlet.

Az érték kiszámításához tudnunk kell a frekvenciát:

A PWM jel frekvenciája a legtöbb érintkezőnél körülbelül 490 Hz. Az Uno és hasonló táblákon az 5. és 6. érintkezõ frekvenciája megközelítõleg 980 Hz. - Arduino Analog Write

A http://sim.okawa-denshi.jp/en/PWMtool.php fájlt használtam a számításhoz az R & C értékei nagyon alacsony hullámzással (< 60mV) szükségesek, közös értékek felhasználásával. Számításaimat a 490Hz körül alapoztam, mivel az alacsony frekvenciák az aluláteresztő szűrőknél teljesítenek a legrosszabbul.

Azt javaslom, hogy használja a R = 10k és a C = 4.7uF értékeket. Addig játszhat ezekkel az értékekkel, amíg meg nem kapja a kívánt eredményt.

Utolsó dolognak tartanám, hogy némi védelmet biztosítsak az analóg csapokhoz csatlakozó terminálokon. Ez lehet egy soros kis ellenállás, vagy párhuzamosan egy 5,1 V-os zener (lehet, hogy a tűnek már van ilyen?), Vagy párhuzamosan némi kapacitás.


SZERKESZTÉS:
Éppen agyhullámom volt - A különböző analóg értékek kimenetéhez nem kell a PWM-eket használni - használhat inkább feszültségosztó áramkört. Nincs szükség RC szűrőre. Például:

schematic

szimulálja ezt az áramkört - sematikusan létrehozva a CircuitLab


# 2 szerkesztése:

Jonathan írta:
Az egyetlen apróbb hátrány, amelyet észreveszek, az az, hogy ha a felhasználó két vezeték csatlakozik ugyanahhoz a terminálhoz, ez hatással van a többi terminálon leolvasott összes feszültségre, megnehezíti a felhasználó inkrementális visszajelzését arról, hogy hány vezeték van megfelelően csatlakoztatva.

Ez könnyen megoldható 6 egyedi feszültségosztó hálózat biztosításával, az alábbiak szerint. Figyelje meg, hogy az egyes feszültségosztóknak milyen aránya van.

schematic

szimulálja ezt az áramkört

@sa-leinad Remek ötlet a feszültségosztó áramkörről.
Menő. Tehát az az elvárás, hogy a második ötleteddel képesek legyek látni a tényleges különböző (stabil) feszültségeket a különböző vezetékeken, ami kiküszöböli az időátlagolás szükségességét, igaz? Ki probalom.
Kipróbáltam, és úgy tűnik, hogy ez (a feszültségosztó áramkörrel rendelkező második ötlet) jól működik. Az egyetlen apróbb hátrány, amelyet észreveszek, az az, hogy ha a felhasználó két vezetéket csatlakoztat ugyanahhoz a terminálhoz, akkor ez hatással van a többi terminálon leolvasott összes feszültségre, ami megnehezíti a felhasználó növekményes visszajelzését arról, hogy hány vezeték van megfelelően csatlakoztatva. Köszönöm mégegyszer!
Ahhh, nem voltam tisztában azzal, hogy növekményes visszajelzést kell adnom. Ebben az esetben 6 különböző feszültségosztó hálózatra lesz szüksége. Szerkesztem a válaszomat, hogy ez szerepeljen.


Ezt a kérdést és választ automatikusan lefordították angol nyelvről.Az eredeti tartalom elérhető a stackexchange oldalon, amelyet köszönünk az cc by-sa 4.0 licencért, amely alatt terjesztik.
Loading...