Skocz do zawartości

Fałszywy stan pinów INPUT z użyciem ekspandera MCP23017 oraz ESP8266


MisiekD

Pomocna odpowiedź

Hej,

piszę do Was w sprawie problemu z ekspanderem MCP23017. Próbuję od kilku dni rozgryźć jakim cudem ekspander MCP23017 odczytuje poprzez piny INPUT różne wartości (inne niż powinien). Zauważyłem, że dzieje się to losowo, zazwyczaj, gdy wgrywam nowe oprogramowanie przez kabel (tak jakby ekspander przed flashowaniem oprogramowania zapamiętał ostatnie wartości INPUT i trzymał je w pamięci wysyłając takie stany do mikrokontrolera). Ekspander podaje mi do mikrokontrolera wartości np. 0 (pin INPUT połączony z GND) w momencie, gdy pin INPUT jest odłączony od pinu GND (brak przewodzenia).

Dodam także, iż stosuje zasilanie zewnętrzne 5V do ESP8266, jednakże wartości odczytują się poprawnie, gdy odłączę całkowicie mikrokontroler od zasilania (przez kabel jak i zewnętrznego), a następnie podłączę na nowo (taki jakby "RESET"). Gdy podłączę zasilanie na nowo do mikrokontrolera, stany INPUT zaczynają pojawiać się poprawnie na mikrokontrolerze (sprawdzam stany INPUT przez Serial).

Tak nawiasem, zapytam się jeszcze czy dobrze zrobiłem podłączając pin RESET z MCP23017 do 3.3V z NodeMCU? Ciężko mi na ten temat było cokolwiek wyczytać i zrozumieć, co dzięki takiemu połączeniu zyskam. Natomiast próbowałem połączenie układu z pinem RESET jak i bez - niestety błędny odczyta stanów INPUT pojawia się nadal.

Kod programu:

#include <Arduino.h>
#include <Wire.h>
#include <Adafruit_MCP23017.h>

// MCP23017
Adafruit_MCP23017 mcp;

// INPUT
int fotokomorkaStanSlupekPrzyBramie = 2;      // MCP23017 A2
int fotokomorkaStanNaWyjazdzie = 3;           // MCP23017 A3
int przekaznikStanOdbiornikPilota = 4;        // MCP23017 A4

// OUTPUT
int optoizolatorOtwieranieCalejBramy = 0;     // MCP23017 A0
int optoizolatorOtwieranieFurtki = 1;         // MCP23017 A1


void setup() {
  Serial.begin(9600);

  // MCP23017
  mcp.begin();

  // INPUT
  mcp.pinMode(fotokomorkaStanSlupekPrzyBramie, INPUT);
  mcp.pinMode(fotokomorkaStanNaWyjazdzie, INPUT);
  mcp.pinMode(przekaznikStanOdbiornikPilota, INPUT);
  mcp.pullUp(fotokomorkaStanSlupekPrzyBramie, HIGH);
  mcp.pullUp(fotokomorkaStanNaWyjazdzie, HIGH);
  mcp.pullUp(przekaznikStanOdbiornikPilota, HIGH);
}

void loop() {
  // Serial.println(millis());
  // delay(10);
  if(millis() % 1000 == 0 || millis() % 1000 == 1 || millis() % 1000 == 2) {
    Serial.println("");
    Serial.println("millis(): " + String(millis()));
    Serial.println("fotokomorkaStanSlupekPrzyBramie: " + String(mcp.digitalRead(fotokomorkaStanSlupekPrzyBramie)));
    Serial.println("fotokomorkaStanNaWyjazdzie:      " + String(mcp.digitalRead(fotokomorkaStanNaWyjazdzie)));
    Serial.println("przekaznikStanOdbiornikPilota:   " + String(mcp.digitalRead(przekaznikStanOdbiornikPilota)));
  }


  if (mcp.digitalRead(fotokomorkaStanSlupekPrzyBramie) == !HIGH) {
  } else {
  }
  if (mcp.digitalRead(fotokomorkaStanNaWyjazdzie) == !HIGH) {
  } else {
  }
  if (mcp.digitalRead(przekaznikStanOdbiornikPilota) == !HIGH) {
  } else {
  }
}

 

Budowa układu (bez wyjść OUTPUT A0 i A1):

X.thumb.jpg.56b7afadf8d1fe568daae16f43fe82a2.jpg

 

Przykładowy problem z niepoprawnym odczytem w krokach:

1. Podłączam układ (zasilanie zewnętrzne 5V jak i USB), stany INPUT poprzez MCP23017 odczytują się poprawnie (1 - brak zwarcia między pinem INPUT, a GND; 0 - pin INPUT zwarty z GND):

millis(): 5000
fotokomorkaStanSlupekPrzyBramie: 1
fotokomorkaStanNaWyjazdzie:      0
przekaznikStanOdbiornikPilota:   1

2. Zmieniam przykładowe połączenia między GND, a stykami INPUT A2, A3, A4 (odczyt wciąż poprawny):

millis(): 7000
fotokomorkaStanSlupekPrzyBramie: 0
fotokomorkaStanNaWyjazdzie:      1
przekaznikStanOdbiornikPilota:   1

3. Minimalnie zmieniam kod (np. dodaję przekaźnik jako OUTPUT do mikrokontrolera) i flashuję kod do mikrokontrolera ESP8266 przez kabel, po czym mikrokontroler na nowo wczytuję procedurę setup() jak i następnie loop(), stany INPUT z MCP8266 odczytywane przez mikrokontroler są jak "zamrożone" (dokładnie takie same jakie wcześniej przed flashowaniem). Odłączając oraz łącząc przewody między INPUT A2, A3, A4 oraz pinem GND nie ma żadnej różnicy, jako dane z MCP8266 zwracane są cały czas takie same jak przez flashowaniem z różnicą millis():

millis(): 2000
fotokomorkaStanSlupekPrzyBramie: 0
fotokomorkaStanNaWyjazdzie:      1
przekaznikStanOdbiornikPilota:   1

4. Odłączam zewnętrzne zasilanie 5V (zasilanie z kabla USB wciąż podłączone), ten sam stan pinów INPUT A2, A3, A4 (niezależnie od stykania pinów INPUT z pinem GND):

millis(): 4000
fotokomorkaStanSlupekPrzyBramie: 0
fotokomorkaStanNaWyjazdzie:      1
przekaznikStanOdbiornikPilota:   1

5. Odłączam zasilanie z USB (całkowite odłączenie zasilania od mikrokontrolera (a także MCP23017)), podłączam zasilanie 5V i USB do ESP8266, stany między INPUT A2, A3, A4 oraz GND wczytały się na nowo (teraz są poprawne):

millis(): 7000
fotokomorkaStanSlupekPrzyBramie: 1
fotokomorkaStanNaWyjazdzie:      1
przekaznikStanOdbiornikPilota:   1

 

Tak wygląda działanie mojego układu, co bardzo mi przeszkadza (nie jestem w stanie zmieniać kodu na żywo, po czym flashować i sprawdzać jak funkcjonuje urządzenie sterowane). Dodam także, iż nie miałem tego problemu odczytując stany INPUT bezpośrednio z mikrokontrolera ESP8266, jednak PIN-ów tam jest zdecydowanie za mało i potrzebowałem rozszerzyć o kolejne. Wyczytałem w internecie o ekspanderze MCP23017 i postanowiłem zamówić kilka sztuk. Natomiast po podłączeniu i skonfigurowaniu zaczęły pojawiać się takie problemy.

Bardzo bym prosił o pomoc, pomysły mi już upadły co tu jeszcze może być grane, a takie funkcjonowanie na pewno nie jest "normalne". Zaczynam się też zastanawiać czy aby problem nie sprawiają wbudowane rezystory w MCP23017.

Być może macie jakieś rady, bardzo prosiłbym o pomoc 🙂 Bardzo zależy mi na zbudowaniu tego układu, a im dłużej się z tym męczę, tym bardziej tracę chęci do kontynuowania dalszego rozwijania się z elektroniką i mikrokontrolerami 😕 

Link do komentarza
Share on other sites

6 godzin temu, MisiekD napisał:

Ekspander podaje mi do mikrokontrolera wartości np. 0 (pin INPUT połączony z GND) w momencie, gdy pin INPUT jest odłączony od pinu GND (brak przewodzenia).

To jest całkowicie normalne i spodziewane. Jak nóżka nie jest podłączona do niczego, to zachowuje się jak antena i może mieć dowolną wartość — zależną od otoczenia, ładunku który się mógł zebrać, fabrycznych różnic konkretnego czipu, etc. Dlatego stosuje się oporniki podciągające lub ściągające.

Link do komentarza
Share on other sites

2 godziny temu, deshipu napisał:

To jest całkowicie normalne i spodziewane. Jak nóżka nie jest podłączona do niczego, to zachowuje się jak antena i może mieć dowolną wartość — zależną od otoczenia, ładunku który się mógł zebrać, fabrycznych różnic konkretnego czipu, etc. Dlatego stosuje się oporniki podciągające lub ściągające.

To co w takim razie polecasz, abym mógł odczytać np. sygnał na zewnątrz (różne warunki pogodowe) poprzez styk w przekaźniku?

I zauważ też, że ja w projekcie użyłem podciągających oporników (100K, pin.pullUp) i nadal mam ten problem 😕

Link do komentarza
Share on other sites

Zarejestruj się lub zaloguj, aby ukryć tę reklamę.
Zarejestruj się lub zaloguj, aby ukryć tę reklamę.

jlcpcb.jpg

jlcpcb.jpg

Produkcja i montaż PCB - wybierz sprawdzone PCBWay!
   • Darmowe płytki dla studentów i projektów non-profit
   • Tylko 5$ za 10 prototypów PCB w 24 godziny
   • Usługa projektowania PCB na zlecenie
   • Montaż PCB od 30$ + bezpłatna dostawa i szablony
   • Darmowe narzędzie do podglądu plików Gerber
Zobacz również » Film z fabryki PCBWay

46 minut temu, deshipu napisał:

Nie widzę nigdzie żadnych oporników na twoim schemacie.

Tak, ja je odłączyłem (wcześniej piny INPUT miałem bezpośrednio do ESP8266 wraz z opornikami 10k), teraz piny INPUT podłączyłem do MCP23017 i wzorowałem się schematami innych osób w internecie, a Ci - podłączają złącza INPUT od razu do MCP23017 i łączą je z GND, bez żadnych oporników dodatkowych, natomiast z ustawionym pin.pullUp.

Projekty z internetu z użyciem pin.pullUp:

Max23017_bb-1024x427.thumb.jpg.ab87bd2f8ac0493bd39b8556bf956273.jpgkl_mcp23017_v1_1.thumb.png.9c0397b68e8a3b290cbe9a1a4721faf9.png

Co zatem źle tu robię? Jak "poprawne" są takie metody z interntu ze zdjęć powyżej i jakie rozwiązanie byłoby lepsze?

Link do komentarza
Share on other sites

Myślę, że to poprawna komenda. Na 100% nie jestem pewien, bo dopiero zaczynam zabawę z MCP23017, ale... Na internecie z tą biblioteką też używają mojej metody (posty z 2020/2021 roku). Ponadto, ja jak testowałem pierwszy raz ekspander MCP23017 to podłaczyłem na wyjściu także diodę i bez komendy pin.pullUp ta dioda migała bardzo szybko, tak jakby były losowe stany. Dodałem komendę pin.pullUp i świeciła jednolicie w zależności od połączenia z GND, więc myślę, że działa poprawnie.

Natomiast na innym serwisie, czytając o pin.pullUp natrafiłem o ciekawą zagadkę odnośnie wewnętrznego opornika podciągającego. Mianowicie układ jest do 5V i może ta wartość 100K jest za duża dla napięcia 3.3V (ESP8266)? Przy pinach INPUT w ESP8266 używałem oporników 10K i działało to dobrze.

Co o tym myślisz?

Link do komentarza
Share on other sites

(edytowany)

@deshipu Znaczy myślę, że nie wyszłoby na to samo, bo nawet jak pin INPUT z komendą pin.pullUp był połączony z GND to i tak pokazywał na mikrokontrolerze, że nie ma połączenia (wartość 1).

Edytowano przez MisiekD
Link do komentarza
Share on other sites

Jak długie przewody prowadzą od styków do ekspandera? Masz jakieś filtrowanie zasilnia tego ekspandera? czy to ulepione na stykówce tylko. Dodatkowo dla świętego spokoju dodałbym zewnętrzne rezystory podciągające na liniach i2c

Edytowano przez _LM_
Link do komentarza
Share on other sites

2 godziny temu, _LM_ napisał:

Jak długie przewody prowadzą od styków do ekspandera?

Myślę, że tak do 7m nawet, ale fałszywe stany miałem już z przewodem ~1m.

 

2 godziny temu, _LM_ napisał:

Masz jakieś filtrowanie zasilnia tego ekspandera? czy to ulepione na stykówce tylko.

Nie rozumiem jakie filtrowanie masz na myśli. Ogólnie ten zestaw jest zlutowany na płytce PCB i wyprowadzone PINy na złączach typu terminal. Natomiast na pewno te przewody działały bez problemu jak były wpięte bezpośrednio do pinów INPUT w mikrokontrolerze ESP8266 (NodeMCU v3). Tylko z tym ekspanderem takie jajca 😕

Link do komentarza
Share on other sites

2 godziny temu, _LM_ napisał:

Dodatkowo dla świętego spokoju dodałbym zewnętrzne rezystory podciągające na liniach i2c

A co to da właściwie? Pytam, bo chciałbym zrozumieć zamysł tych oporników na liniach, może rzeczywiście warto (ja w tej kwestii bez wiedzy, pierwszy raz skorzystałem z protokołu I2C).

Link do komentarza
Share on other sites

Dołącz do dyskusji, napisz odpowiedź!

Jeśli masz już konto to zaloguj się teraz, aby opublikować wiadomość jako Ty. Możesz też napisać teraz i zarejestrować się później.
Uwaga: wgrywanie zdjęć i załączników dostępne jest po zalogowaniu!

Anonim
Dołącz do dyskusji! Kliknij i zacznij pisać...

×   Wklejony jako tekst z formatowaniem.   Przywróć formatowanie

  Dozwolonych jest tylko 75 emoji.

×   Twój link będzie automatycznie osadzony.   Wyświetlać jako link

×   Twoja poprzednia zawartość została przywrócona.   Wyczyść edytor

×   Nie możesz wkleić zdjęć bezpośrednio. Prześlij lub wstaw obrazy z adresu URL.

×
×
  • Utwórz nowe...

Ważne informacje

Ta strona używa ciasteczek (cookies), dzięki którym może działać lepiej. Więcej na ten temat znajdziesz w Polityce Prywatności.