Ako ste tipku spojili na Arduino ili ESP32, a ulaz se sam uključivao i isključivao, kôd je vjerojatno bio u redu. Pin je bio plutajući.
Pull-up otpornik to rješava. On spaja pin na napajanje preko otpornika, tako da pin ostaje na poznatom stanju HIGH dok je tipka otvorena. Pritisnite tipku i pin se spaja direktno na masu, što prevladava, i pin očitava LOW.
Što je pull-up otpornik?
Pull-up otpornik je otpornik između linije signala i pozitivnog napajanja, bilo 3.3 V ili 5 V. On drži liniju u stanju HIGH kad god je ništa drugo ne pogoni.
Bez njega, ulazni pin s otvorenim prekidačem nije spojen ni na napajanje ni na masu, pa mu je napon nedefiniran. Ploča i dalje javlja HIGH ili LOW, ali odgovor dolazi od šuma, a ne iz vašeg sklopa.
Zašto otpornik, a ne žica? Žica do napajanja također bi držala pin u stanju HIGH, ali pritiskanjem tipke došlo bi do kratkog spoja napajanja s masom. Otpornik od 10 kΩ ograničava tu struju na pola miliampera, tako da ga tipka sigurno može nadvladati.
Što je plutajući pin?
Plutajući pin nema referentni napon, pa reagira na sve u blizini: mrežni šum, ruku blizu matične ploče, motor koji se pokreće negdje drugdje u projektu. U kodu to izgleda kao greška u vašoj logici. Ono što vidite je:
- LED koja se sama uključuje i isključuje.
- Registracija pritiska tipke kada nitko nije dotaknuo tipku.
- Brojač koji se sam povećava.
- Serijski izlaz koji se prebacuje između 0 i 1 dok sklop miruje.
Ako vaš projekt radi nešto od navedenog, provjerite ožičenje ulaza prije nego što dirnete kôd.
Kako radi pull-up otpornik?
- Tipka otvorena. Mala struja teče od napajanja kroz otpornik u pin. Ulazni pin gotovo ništa ne troši, pa je pad napona preko otpornika zanemariv i pin je na gotovo naponu napajanja. Ploča očitava HIGH.
- Tipka zatvorena. Pin je spojen izravno na masu preko kontakata prekidača. Taj put ima gotovo nulti otpor, otpornik od 10 kΩ ne može se natjecati, i pin se povlači na 0 V. Ploča očitava LOW.
Dakle, logika očitava obrnuto, što sve iznenadi prvi put. Nije pritisnuto je HIGH, pritisnuto je LOW, a vaš kod testira LOW kako bi detektirao pritisak.
Pull-up otpornik vs pull-down otpornik
| Otpornik | Spaja se između | Nije pritisnuto | Pritisnuto | Tipična upotreba |
|---|---|---|---|---|
| Pull-up | Pina i pozitivnog napajanja, s prekidačem prema masi | HIGH | LOW | Tipke, mikro prekidači, I2C, sve što koristi ugrađeni pull-up |
| Pull-down | Pina i mase, s prekidačem prema pozitivnom napajanju | LOW | HIGH | Sklopovi gdje pritisak treba očitati HIGH, neki senzori i logički ulazi |
Niti jedan nije bolji. Pull-up otpornici su češći jer ih mikrokontroleri imaju ugrađene, a pull-down otpornici se moraju dodati ručno.
Pull-up otpornik s Arduinom
Arduino ploče imaju pull-up unutar čipa na svakom digitalnom pinu, 20 kΩ do 50 kΩ na ATmega328, tako da većina projekata s tipkama ne treba otpornik na matičnoj ploči. Omogućite ga s INPUT_PULLUP umjesto INPUT, i spojite tipku između ulaznog pina i GND-a bez ičega drugog.
const int buttonPin = 2;
void setup() {
pinMode(buttonPin, INPUT_PULLUP);
Serial.begin(9600);
}
void loop() {
if (digitalRead(buttonPin) == LOW) {
Serial.println("Button pressed");
} else {
Serial.println("Button not pressed");
}
delay(200);
}
Dvije pogreške uzrokuju većinu problema s tipkama. Ostale ostavljaju pin u običnom INPUT stanju, što je gore navedeni plutajući slučaj. Spajanje tipke na napajanje umjesto na masu ostavlja pin HIGH u oba stanja. Ako želite objašnjenje vodova rupu po rupu, pogledajte naš vodič o tome što je matična ploča i kako je koristiti.
Pull-up otpornik s ESP32
ESP32 čipovi također imaju unutarnje pull-up otpornike, oko 45 kΩ, omogućene istim INPUT_PULLUP. Dvije stvari se razlikuju od Una. Logika je 3.3 V, pa dovođenje 5 V na GPIO pin oštećuje ga. I odabir pina je bitan: neki GPIO-i su strapping pinovi koji odlučuju kako se čip pokreće, neki su samo ulazni bez unutarnjeg pull-upa, a na klasičnom ESP32 pinovi na drugom ADC-u prestaju raditi kada Wi-Fi radi.
Razlog za korištenje ESP32 za prekidač je ono što se događa nakon pritiska, kada kontakt postane Home Assistant entitet putem Wi-Fi-ja. Naš ESPHome i MQTT vodič pokriva softver, a ESP32 projekti za početnike imaju radne primjere.
Na baterijskom napajanju, imajte na umu da unutarnji pull-up s zatvorenim prekidačem kontinuirano troši struju, oko 70 µA pri 3.3 V kroz 45 kΩ. To je ništa u usporedbi s aktivnim radiom, a puno u usporedbi s dubokim spavanjem, pa prekidač spojite tako da je u mirovanju otvoren.
Pull-up otpornik s tipkom ili mikro prekidačem
Za mikrokontroler, tipkalo i mikro prekidač su isti dijelovi: par kontakata koji se ili dodiruju ili ne. Ni jedno ni drugo ne generira napon, zbog čega oboje trebaju pull-up ili pull-down da bi uopće bili čitljivi.
Mikro prekidač vam daje izbor kontakta. Spojite COM na GND i NO na ulazni pin i ponaša se kao tipkalo, očitavajući LOW dok je poluga pritisnuta. Premjestite tu žicu s NO na NC i stanja se zamijene, što je ono što senzor vrata želi. Naš vodič o tome što je mikro prekidač detaljno pokriva priključke.
Ono što pull-up ne popravlja je "odbijanje kontakata". Kontakti zveckaju nekoliko milisekundi dok se zatvaraju, a brza petlja to očitava kao nekoliko pritisaka, pa to riješite u kodu ignoriranjem daljnjih promjena 20 ms do 50 ms.
Pull-up otpornici i I2C
Uređaji na I2C sabirnici nikada ne pogone SDA ili SCL visoko. Oni povlače liniju na masu ili je puštaju, što je ono što čini sigurnim da desetak čipova dijeli dvije žice. Pull-up otpornici su jedino što vraća svaku liniju u stanje HIGH, tako da su dio signalizacije, a ne mjera opreza. Vrijednosti su 4.7 kΩ ili 2.2 kΩ, niže od pull-upa za tipke jer sabirnica mora brzo napuniti kapacitet kabela.
Gotovo svaki breakout ima svoje pull-up otpornike, tako da prvi projekt radi bez ikakvih dodataka. Problemi počinju na četvrtom ili petom modulu, jer ti otpornici sjede paralelno: pet pull-up otpornika od 4.7 kΩ ponašaju se kao jedan otpornik od 940 Ω, i na kraju nijedan uređaj ne može povući liniju dovoljno nisko da se registrira. Ploče koje to očekuju stavljaju pull-up otpornike na lemne skakače tako da ih možete prekinuti. Naš vodič o tome kako I2C radi pokriva stranu adresiranja.
Unutarnji vs vanjski pull-up otpornici
| Aspekt | Unutarnji pull-up | Vanjski pull-up |
|---|---|---|
| Vrijednost | Fiksirano čipom, 20 kΩ do 50 kΩ | Što god ugradite |
| Ožičenje | Nema, jedna linija koda | Jedan otpornik po ulazu |
| Aktivno | Tek nakon pokretanja pinMode()
|
U trenutku primjene napajanja |
| Prikladno za | Tipke i prekidači na kratkim žicama | Dugi kabeli, šum, I2C, sve definirano pri pokretanju |
Vremenska linija je ona koja grize. Unutarnji pull-up je isključen dok se čip pokreće, tako da pin pluta tih prvih milisekundi. Dobro za tipku, ne za reset ili enable liniju koja mora biti HIGH od trenutka kad stigne napajanje.
Duljina kabela je drugi razlog za vanjski. Metar žice ponaša se kao antena, a unutarnji pull-up od 47 kΩ dovoljno je slab da se šum koji pokupi može registrirati kao pritisak. Nakon nekoliko metara na I2C-u, sam kapacitet kabela postaje ograničenje, a proširivač sabirnice to ispravno rješava.
Kolika bi trebala biti vrijednost pull-up otpornika?
Za tipku, 10 kΩ. Previsoka vrijednost i otpornik ne može držati liniju protiv šuma i curenja. Previše niska vrijednost i trošite struju kad god se prekidač zatvori: pri 5 V, pull-up od 10 kΩ košta 0.5 mA dok se tipka drži, onaj od 220 Ω koštao bi 23 mA.
- Tipke i prekidači: 10 kΩ, ili unutarnji pull-up i nikakav otpornik.
- I2C, jedan do tri modula: 4.7 kΩ, obično već na breakoutu.
- I2C na 400 kHz ili na dugom kabelu: 2.2 kΩ.
- Prekidač na metar ili više kabela: 4.7 kΩ vanjski, umjesto unutarnjeg.
Ideje za početničke projekte s pull-up otpornicima
1. LED kontrolirana tipkom
Jedna tipka, jedna LED i INPUT_PULLUP. Najkraći sklop u kojem možete pratiti obrnutu logiku: serijski monitor ispisuje HIGH dok prst ne sleti.
2. Mikro prekidač detektor vrata
Montirajte mikro prekidač tako da ladica ili poklopac pritišće polugu kada se zatvori, COM na GND i NO na ulaz. Dodajte zujalicu i to je alarm; bilježite promjene i to je brojač korištenja.
3. ESP32 obavijest o poštanskom sandučiću
Isti prekidač na ESP32 napajanom baterijom. Spava dok se kontakt ne promijeni, pošalje jednu poruku i ponovno spava, gdje je struja pull-up-a zapravo važna.
4. Fizička tipka za Home Assistant
Tipka na ESP32 koja koristi ESPHome postaje entitet prekidača za bilo koju automatizaciju. Dvije žice i bez otpornika.
5. I2C prikaz senzora
Senzor temperature i 16x2 I2C LCD na ista dva pina. Ovdje vam ništa ne treba otpornik, što je najjasniji način da vidite da breakoutovi već sadrže pull-up otpornike.
Zašto je Soldered dobro mjesto za početak učenja osnova elektronike
Pull-up otpornik uči pravilo koje većina početničkih grešaka krši: svaki ulaz mora biti spojen na nešto određeno. Jednom kada se to shvati, tipke, mikro prekidači, ulazi senzora, reset linije i I2C sabirnice prestaju tajanstveno otkazivati, a vi provjeravate ožičenje umjesto da prepisujete petlju.
Soldered prodaje ploče, komplete, breakout module i zaslone za izgradnju toga redom, od tipke i LED-a na matičnoj ploči do senzora napajanog baterijom koji šalje podatke Home Assistentu. Svaki breakout modul ima Qwiic konektor i održavanu Arduino biblioteku.
Često postavljana pitanja
Što je pull-up otpornik?
Otpornik između signalne linije i pozitivnog napajanja. Drži ulazni pin na stanju HIGH kada ga ništa drugo ne pogoni.
Zašto tipke trebaju pull-up otpornike?
Nepritisnuta tipka ostavlja pin spojenim ni na što, pa očitava šum i sam se prebacuje između HIGH i LOW.
Što je plutajući pin?
Ulazni pin bez određene veze na HIGH ili LOW. Bez referentnog napona reagira na električni šum i očitanja su nasumična.
Kako radi pull-up otpornik?
S otvorenim prekidačem, malena struja kroz otpornik drži pin na naponu napajanja: HIGH. S zatvorenim prekidačem, pin je spojen izravno na masu, što prevladava nad otpornikom: LOW.
Koja je razlika između pull-up i pull-down otpornika?
Pull-up ide na pozitivno napajanje i drži pin u stanju HIGH. Pull-down ide na masu i drži ga u stanju LOW. Oboje sprječavaju plutanje pina.
Ima li Arduino unutarnje pull-up otpornike?
Da, na svakom digitalnom pinu. Omogućite ga s pinMode(pin, INPUT_PULLUP). Na ATmega328 to je 20 kΩ do 50 kΩ.
Ima li ESP32 unutarnje pull-up otpornike?
Da, oko 45 kΩ na većini GPIO pinova. Pinovi samo za ulaz nemaju, a neki pinovi utječu na pokretanje, pa provjerite raspored pinova vaše ploče.
Zašto moja tipka očitava LOW kada je pritisnuta?
To je točno za pull-up ožičenje. Testirajte na LOW kako biste detektirali pritisak.
Koju vrijednost otpornika bih trebao koristiti za pull-up otpornik?
10 kΩ za tipke i prekidače, 4.7 kΩ za I2C. Za jednostavnu tipku, unutarnji pull-up uklanja potrebu za vanjskim.
Trebaju li I2C uređaji pull-up otpornike?
Da. Uređaji uvijek samo povlače SDA i SCL na nisko, pa bez pull-up otpornika ništa ih ne vraća na visoko. Većina breakout modula ih ima ugrađene.
Mogu li koristiti pull-up otpornik s mikro prekidačem?
Da. Spojite COM na GND i NO na ulazni pin, i on će očitavati LOW dok je poluga pritisnuta. Koristite NC za inverziju.
Trebaju li početnici koristiti unutarnje ili vanjske pull-up otpornike?
Počnite s unutarnjim. Prijeđite na vanjske kada žica do prekidača postane duga, okolina je bučna, ili linija mora biti HIGH prije nego što se vaš kôd pokrene.
Može li pull-up otpornik spriječiti dvostruko okidanje tipke?
Ne. To je "odbijanje kontakata", i potrebno je uklanjanje odbijanja u kodu ili mali kondenzator.