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

Arduino - Transoptor szczelinowy

06 Mar 2014 17:41 4101 7
  • Poziom 17  
    Witam!

    Posiadam transoptor szczelinowy, który zamierzam podłączyć do Arduino.
    Podłączyłem go, póki co w ten sposób:

    Dioda IR - zgodnie ze sztuką, przez opornik (180ohm) do 5v.
    C (kolektor) do 5v, E (emiter) na nogę arduino.

    Takie rozwiązanie, oczywiście nie działa, ponieważ na emiterze napięcie spada bardzo powoli albo i w ogóle.

    Domyślam się, że brakuje mi podstawowej wiedzy w tej kwestii. Czy mógłbym prosić o rady jak to właściwie podłączyć?

    Transoptor wymontowany ze skanera.

    Pozdrawiam!

    Dodano po 23 [minuty]:

    Wygląda na to, że E powinno być podłączone do masy,
    C przez opornik (w oryginale 20k) do 5V.

    Zgadza się?
    Jak w ów czas zaprogramować arduino?
  • Poziom 24  
    W tej konfiguracji którą podałeś dodaj dodatkowo rezystor np. 100KΩ pomiędzy emiter a masę (GND). Resztę ukłądu pozostaw taką jaką miałeś.

    Możesz też zrobić inaczej: podłącz emiter fototranzystora do GND, a kolektor do pinu Arduino, i ustaw go na wewnętrzne podciąganie do VCC:
    Kod: cpp
    Zaloguj się, aby zobaczyć kod

    Tylko pamiętaj, że wyniki będziesz miał niejako zanegowane. Czyli dla przysłoniętego transoptora będziesz miał stan HIGH, a dla odsłoniętego LOW. Ale pod względem algorytmu nie ma to żadnego znaczenia.
  • Poziom 17  
    olelek napisał:
    W tej konfiguracji którą podałeś dodaj dodatkowo rezystor np. 100KΩ pomiędzy emiter a masę (GND). Resztę ukłądu pozostaw taką jaką miałeś.


    Rozumiem, że mowa o 'pierwszej' konfiguracji.

    olelek napisał:
    Możesz też zrobić inaczej: podłącz emiter fototranzystora do GND, a kolektor do pinu Arduino, i ustaw go na wewnętrzne podciąganie do VCC

    To zaś przypomina tę drugą opcję:
    Gloomwing napisał:
    Wygląda na to, że E powinno być podłączone do masy,
    C przez opornik (w oryginale 20k) do 5V.


    Rozumiem, że niezależnie od opcji, ustawianie arduino wygląda tak samo:
    olelek napisał:
    pinMode(1,INPUT_PULLUP);


    Dobrze wszystko rozumiem?

    Dodano po 1 [minuty]:

    20k zamiast 100k wystarczy?

    Dodano po 41 [minuty]:

    Kod: cpp
    Zaloguj się, aby zobaczyć kod


    Program pokrótce wygląda tak.
    Niestety, konsola wypluwa same jedynki.
  • Pomocny post
    Poziom 24  
    Post widziałem przed Twoją edycją. Wybierz jedną wersję. Jeżeli stosujesz zewnętrzny rezystor, nie stosuj wewnętrznego PullUp'a.
    Rezystor 20KΩ może być o zbyt małej wartości, ale możesz spróbować eksperymentalnie.

    Zalecam Ci zrobić od początku do końca tak:
    -Emiter (E) fototranzystora do masy (GND);
    -Kolektor (C) fototranzystora do pinu Arduino (dla przykładu pin 1);
    -Kolektor (C) fototranzystora poprzez rezystor do VCC;

    Teraz w programie:
    Kod: cpp
    Zaloguj się, aby zobaczyć kod
  • Poziom 17  
    Działa rewelacyjnie.

    Mój program wygląda mniej więcej tak:
    Kod: c
    Zaloguj się, aby zobaczyć kod


    Program ma na celu 'oczekiwanie' na to, aż zostanie 'zliczona' określona liczba zębów.
    Jak widać, jest tu funkcja warunkowa, a jest tu ona z tej przyczyny, że - mniej więcej - co trzeci 'pomiar' zwraca wartość 0.

    Żeby było zabawniej, suma czasów (9 to połowa liczby zębów) jest praktycznie taka sama, niezależnie od zerowych odczytów.

    Czasem też pulseIn() sczytuje dziwne wartości, w tym ujemne!

    olelek, masz może i na to rady?

    Temat samego podłączenia transoptora uważam za doskonale zaspokojony, pozostawiam jednak wątek otwarty ze względu na kwestie programowe, mam nadzieję, że nikomu to nie przeszkadza.
  • Pomocny post
    Poziom 24  
    Funkcja pulseIn zwraca wartość w postaci unsigned long. Ty natomiast przypisujesz jej wartość do (signed) int. Czyli:
    -odczytana wartość może się nie zmieścić;
    -jeżeli odczytana wartość przekroczy połowę "pojemności" typu int, to zostanie zinterpretowana jako liczba ujemna.

    Pytanie, jakie długości czasów mierzysz? Ile mija czasu pomiędzy kolejnymi impulsami z enkodera? Bo funkcja podobno mierzy w mikrosekundach.
    Pamiętaj też że transmisja poprzez Serial może trwać dosyć długo.

    Proponowałbym Ci wykorzystać przerwania oraz znacznik czasu, który udostępnia ARduino IDE.
  • Poziom 17  
    aż mi wstyd, że na to nie wpadłem...
    między 0,1 a 0,01 sekundy - przyznam szczerze, że się nie przyglądałem.

    Cytat:
    Pamiętaj też że transmisja poprzez Serial może trwać dosyć długo.

    mam to na uwadze, chociaż zazwyczaj problemy leżały w innym miejscu.

    jutro sprawdzę tego unsigned long'a.

    czy Arduino IDE zatrzymuje PWM podczas debugowania?