Elektroda.pl
Elektroda.pl
X
Proszę, dodaj wyjątek www.elektroda.pl do Adblock.
Dzięki temu, że oglądasz reklamy, wspierasz portal i użytkowników.

Napięcia wyjściowe w Arduino

Krakers2000 06 Gru 2018 22:38 150 8
  • #1 06 Gru 2018 22:38
    Krakers2000
    Poziom 3  

    Witam, mam problem z napięciami wyj z Arduino. Zaprogramowałem 3 piny cyfrowe jako wejście. Każdy z nich po uzyskaniu niskiego stanu powinien wysterować napięcie wyj na daną parę innych pinów cyfrowych. Wszystko działa, kiedy każdy z nich po kolei otrzymuje niski stan, to wysyła sygnał napięciowy na przypisaną swoją parę pinów. Tylko że te napięcia są różne, nie są 5V tylko jeden ma 4,5V natomiast drugi ma 3V. Kolejna para jeszcze inne zróżnicowanie napięć. Trzecia para jeszcze inne.
    Jeżeli zaprogramuje tylko jeden pin jako wej to jego para pinów wyj ma napięcia takie jakie być powinno, czyli po 5V. Dlaczego tak się dzieje? Czy źle npisałem kod programu?? Przesyłam ten kod poniżej.
    void setup() {
    pinMode(0, OUTPUT);
    pinMode(1, OUTPUT);
    pinMode(2, OUTPUT);
    pinMode(4, OUTPUT);
    pinMode(6, INPUT_PULLUP);
    pinMode(7, INPUT_PULLUP);
    pinMode(8, INPUT_PULLUP);
    digitalWrite(0, LOW);
    digitalWrite(1, LOW);
    digitalWrite(2, LOW);
    digitalWrite(4, LOW);
    }
    void loop()
    {
    if (digitalRead(6) == LOW) {
    digitalWrite(0, HIGH);
    digitalWrite(1, HIGH);
    } else {
    digitalWrite(0, LOW);
    digitalWrite(1, LOW);
    }
    if (digitalRead(7) == LOW) {
    digitalWrite(1, HIGH);
    digitalWrite(4, HIGH);
    } else { digitalWrite(1, LOW);
    digitalWrite(4, LOW);
    }
    if (digitalRead(8) == LOW) {
    digitalWrite(2, HIGH);
    digitalWrite(4, HIGH);
    } else {
    digitalWrite(2, LOW);
    digitalWrite(4, LOW);
    }
    }

    0 8
  • #2 06 Gru 2018 23:41
    LChucki
    Poziom 18  

    Masz błąd w kodzie. Zanim go znajdziesz, czym mierzysz napięcie? Miernikiem za 15zł? Oscyloskopem?

    0
  • #3 07 Gru 2018 03:54
    emarcus
    Poziom 35  

    Krakers2000 napisał:
    Witam, mam problem z napięciami wyj z Arduino. Zaprogramowałem 3 piny cyfrowe jako wejście. Każdy z nich po uzyskaniu niskiego stanu powinien wysterować napięcie wyj na daną parę innych pinów cyfrowych. Wszystko działa, kiedy każdy z nich po kolei otrzymuje niski stan, to wysyła sygnał napięciowy na przypisaną swoją parę pinów. Tylko że te napięcia są różne, nie są 5V tylko jeden ma 4,5V natomiast drugi ma 3V. Kolejna para jeszcze inne zróżnicowanie napięć. Trzecia para jeszcze inne.
    Jeżeli zaprogramuje tylko jeden pin jako wej to jego para pinów wyj ma napięcia takie jakie być powinno, czyli po 5V. Dlaczego tak się dzieje? Czy źle npisałem kod programu?? Przesyłam ten kod poniżej.
    void setup() {
    pinMode(0, OUTPUT);
    pinMode(1, OUTPUT);
    //. . . . . . . . .
    }


    Przyglądnij się dokladniej swojej płytce arduino; zauważ dodakowe oznaczenia przy numerach pinów..., w szczególnosci Pin0 i Pin1.
    Doczytaj co do nich jest już podłaczone.
    Na poczatek, staraj się nie używac tych pinów (tak jakby ich nie było).
    Kiedyś gdy się dowiesz , zaczniesz je używac....

    e marcus

    0
  • #4 07 Gru 2018 11:18
    Krakers2000
    Poziom 3  

    Niestety miernikiem za 15 zl. Wiem że nie jest tak dokładny jak trzeba, ale wpisując ten kod:
    void setup() {
    pinMode(2, OUTPUT);
    pinMode(3, OUTPUT);
    pinMode(6, INPUT_PULLUP);
    }
    void loop() {
    if (digitalRead(6) == LOW) {
    digitalWrite(3, HIGH);
    digitalWrite(2, HIGH);
    } else {
    digitalWrite(3, LOW);
    digitalWrite(2, LOW);
    }
    }
    to działa wszytko jak należy. Czyli jeżeli podłącze GND do pinu 6, to na pinach 2 i 3 pojawia się napięcie (ten miernik pokazuje po 4,9VDC) Natomiast jeżeli dodam chociaż jeszcze jeden pin wejściowy, to już dzieje się bałagan i tak jak pisałem na wstępie pojawiają się różne napięcia na pinach. Zmiana pinów nic nie daje bo próbowałem różne od 0 - 13

    0
  • #5 07 Gru 2018 11:40
    LChucki
    Poziom 18  

    Krakers2000 napisał:
    Niestety miernikiem za 15 zl.

    Jakbyś robił to oscyloskopem to byś wiedział co jest granie. Ustaw miernik na pomiar napięcia AC, co pokazuje?

    Przeanalizuj kod z pierwszego postu (pętla loop) krok po kroku. Nic nie widzisz?

    0
  • #6 07 Gru 2018 12:00
    Krakers2000
    Poziom 3  

    Miernik pokazuje bardzo niskie napięcia. Jeżeli chodzi o sam kod, to naprawdę nic nie widzę jeżeli chodzi o pomyłkę (kiepski ze mnie programista :) )

    0
  • #7 07 Gru 2018 12:37
    LChucki
    Poziom 18  

    Krakers2000 napisał:
    Jeżeli chodzi o sam kod, to naprawdę nic nie widzę

    To podpowiem, z mojej analizy wynika, ze masz na wyjściach przebieg prostokątny a nie stały poziom logiczny.

    0
  • #8 07 Gru 2018 13:07
    JohnReese
    Poziom 10  

    Krakers2000 napisał:

    void loop()
    {
    if (digitalRead(6) == LOW) {
    digitalWrite(0, HIGH);
    digitalWrite(1, HIGH);
    } else {
    digitalWrite(0, LOW);
    digitalWrite(1, LOW);
    }
    if (digitalRead(7) == LOW) {
    digitalWrite(1, HIGH);
    digitalWrite(4, HIGH);
    } else { digitalWrite(1, LOW);
    digitalWrite(4, LOW);
    }
    if (digitalRead(8) == LOW) {
    digitalWrite(2, HIGH);
    digitalWrite(4, HIGH);
    } else {
    digitalWrite(2, LOW);
    digitalWrite(4, LOW);
    }
    }


    Nie bardzo rozumiem co chcesz osiagnac ale program dziala np. tak: Chcesz wlaczyc 1 i 4 wiec wciskasz przycisk 7 (zwierasz input z gnd):
    - warunek pierwszego if nie zostaje spelniony wiec 0 i 1 zostaja ustawione na LOW
    - drugi warunek zostaje spelniony wiec 1 i 4 zostaja ustawione na HIGH
    -trzeci warunek nie zostaje spelniony wiec program ustawia 2 na LOW (Nic sie nie zmienia) ale ustawia tez 4 na LOW i tu juz jest zmiana bo chcemy by to bylo HIGH.

    dalej petla wykonuje sie od nowa i problem z trzeciego if pojawia sie teraz tez przy pierwszym.

    0
  • #9 07 Gru 2018 15:37
    emarcus
    Poziom 35  

    Krakers2000 napisał:
    Niestety miernikiem za 15 zl. Wiem że nie jest tak dokładny jak trzeba, ale wpisując ten kod:
    void setup() {
    pinMode(2, OUTPUT);
    pinMode(3, OUTPUT);
    pinMode(6, INPUT_PULLUP);
    }
    void loop() {
    if (digitalRead(6) == LOW) {
    digitalWrite(3, HIGH);
    digitalWrite(2, HIGH);
    } else {
    digitalWrite(3, LOW);
    digitalWrite(2, LOW);
    }
    }
    to działa wszytko jak należy. Czyli jeżeli podłącze GND do pinu 6, to na pinach 2 i 3 pojawia się napięcie (ten miernik pokazuje po 4,9VDC) Natomiast jeżeli dodam chociaż jeszcze jeden pin wejściowy, to już dzieje się bałagan.....


    Bo w warunku tego dodatkowego pinu wprowadasz ten twój własny bałagan, a szczególnie druga częśc:
    else{}
    Petla void loop() {}
    nie kończy się na pierwszej napotkanej i wykonanej kommendzie/funkcji /instrukcji warunkowej; program biegnie dalej i wykonuje to co ma zadane.
    Jeżeli w którejś kolejnej funkcji masz referencje do pinów już wcześniej obsłużonych (ustawonych lub zerowanych), to ta kolejna, je koryguje zgodnie z 'recepturą' zamieszczona w funkcji.
    Samo dodanie pinu wejściowego nie wprowadadza żadnego efektu na przebieg programu, dopuki nie zaczniesz go odczytywac przypisując mu funkcje wprowadzające ten rzekomy 'bałagan'.

    e marcus

    0