Elektroda.pl
Elektroda.pl
X

Wyszukiwarki naszych partnerów

Wyszukaj w ofercie 200 tys. produktów TME
Proszę, dodaj wyjątek elektroda.pl do Adblock.
Dzięki temu, że oglądasz reklamy, wspierasz portal i użytkowników.

Czujnik kolorów TCS3200D - PROGRAM Arduino Uno

Bator11 04 Sie 2017 19:42 636 14
  • #1 04 Sie 2017 19:42
    Bator11
    Poziom 4  

    Witam.
    Ostatnio zakupiłem czujnik TCS3200D do rozpoznawania kolorów . Jednak pojawił się pewne problemu otóż kod zaczerpnięty z poradnika Botlandu wskazuje na porcie monitora szeregowego tylko liczby składowe RGB . Chciałbym uzyskać kod w któym w momencie podłożenia przedmiotu koloru czerwonego mikrokontroler obrócił np serwem o 90 stopni a w tym kodzie nie potrafie tego wykonać . Jeśli ktoś już używał tego czujnika lub wie jak to zrobić będę wdzięczny za opdowiedź .

    Kod: c
    Zaloguj się, aby zobaczyć kod

  • Pomocny post
    #2 05 Sie 2017 04:34
    JacekCz
    Poziom 32  

    Czego oczekujesz po tym kodzie?
    Wg mnie nie ma nic wspólnego z docelową ideą.

    Pomijam zbyt duża algorytmikę w przerwaniach, to się wcześniej czy później zemści (a zupełnie pusta pętla główna)
    Wybory algorytmu (opcje) nie określa się w komentarzach, ale przez znaczące nazwy zmiennych, np nic nie mówiąca nazwa flag, zadeklarowana i inkrementowana nie tak, jak powinno się pisać przerwania.

    EDIT: inaczej mówiąc nie umiem odróżnić co jest przypadkowym copy & paste, a co jest próbą osiągnięcia twoich założeń.

  • #3 05 Sie 2017 13:54
    Bator11
    Poziom 4  

    Kod jest wstawiony tylko jako przykład , którego użyłem od sprzedającego moduł (trudno znaleźć coś konkretnego na ten temat w internecie) . Czy możliwe jest aby użyć tutaj w pętli programu instrukcji np. If wartość red > green/blue? i po tym stwierdzać jaki jest kolor czy może jak wyżej napisałeś kod nie nadaję się do tego . Będę wdzięczny jeśli ktoś wytłumaczy mi tutaj jak powinien wyglądać taki program , jego skład , budowa tak abym mógł uzyskać zamierzony efekt .

  • #4 05 Sie 2017 21:47
    ASMnauka_
    Poziom 14  

    Bator11 napisał:
    Chciałbym uzyskać kod w któym w momencie podłożenia przedmiotu koloru czerwonego mikrokontroler obrócił np serwem o 90 stopni a w tym kodzie nie potrafie tego wykonać . Jeśli ktoś już używał tego czujnika lub wie jak to zrobić będę wdzięczny za opdowiedź .

    Kolego, składowa RGB składa się z trzech podstawowych kolorów.
    RED - zakres 0 - 255
    GREEN - zakres 0 - 255
    BLUE - zakres 0 - 255
    Łącznie daje nam to 255*255*255 = 16581375
    Zatem paleta kolorów jest wręcz ogromna.
    W Twoim przypadku priorytetem jest kolor czerwony (RED).
    Pomyśl jak napisać program, by w pętli głównej sprawdzał każdą składową RGB i jeśli kolor R jest większy od pozostałych kolorów wysłał wiadomość do podprogramu, który uruchomi serwo.
    Istotną rzeczą jest, by program wiedział czy kolor czerwony ma wartość na przykład 100 - 200.
    Trzeba zrobić kalibrację.
    Przypuśćmy, że czujnik czyta kolor skrzynki na piwo.
    Owa skrzynka może być brudna, zakurzona itp.
    Tak więc wynik pomiaru będzie błędny.
    Wbrew pozorom nie jest to takie proste.

  • #5 06 Sie 2017 13:55
    Bator11
    Poziom 4  

    Okey . Czy program zamieszczony do góry może zostać i wystarczy do niego dopisać w pętli głownej odpowiednie instrukcje czy jednak trzeba go przebudować? . Przyjmijmy , że przedmiot badany przez czujnik po kalibracji zawsze wskazuje wartość red większą od 200 . Czy w takim razie program : Jeśli wartość red jest większa od wartość blue oraz green to jeśli wartość red jest większa od 200 to - np. zapal diode 9.
    zapisane w porgramie jako :
    if (countR > countB && countG ) {
    if (countR > 200) {
    digitalWrite(9 , HIGH);
    }
    }

  • #6 06 Sie 2017 14:22
    Marek_Skalski
    Poziom 33  

    To ma szansę zadziałać.

    Kod: C
    Zaloguj się, aby zobaczyć kod
    \W tym co napisałeś jest błąd. Kiedy warunek if(wartosc1>wartosc2 && wartosc3) będzie spełniony? Kiedy wartosc1 > wartosc2 i jeżeli wartosc3 != 0.

  • #7 06 Sie 2017 14:58
    Bator11
    Poziom 4  

    Niestety , ale na pinie 9 nie pojawia się stan wysoki można zauważyć na monitorze portu szeregowego , że wszystkie wymogi są spełnione.( w kodzie zmieniłem na countR>150
    red=174ttgreen=8tblue=147tn
    red=176ttgreen=8tblue=152tn
    red=180ttgreen=11tblue=144tn
    red=183ttgreen=11tblue=147tn
    red=182ttgreen=12tblue=146tn
    red=182ttgreen=12tblue=150tn
    red=183ttgreen=16tblue=146tn
    red=185ttgreen=18tblue=146tn
    red=186ttgreen=18tblue=146tn
    red=187ttgreen=12tblue=152tn
    red=188ttgreen=17tblue=147tn
    red=187ttgreen=17tblue=151tn
    red=189ttgreen=16tblue=148tn
    red=188ttgreen=19tblue=150tn
    red=189ttgreen=16tblue=153tn

  • #8 06 Sie 2017 16:20
    zster

    Poziom 17  

    Czy skonfigurowałeś pin 9?

  • #9 06 Sie 2017 16:31
    Bator11
    Poziom 4  

    Tak skonfigurowałem jeśli chodzi o to dałem pinMode(9, OUTPUT); a później żeby nie szukać potem po numerkach #define dioda 9 i zmieniłem 9 w kodzie na "dioda"

  • #10 06 Sie 2017 17:11
    zster

    Poziom 17  

    Wklej proszę program który teraz wykorzystujesz do testowania. Przyjmuje, że dioda jest dobrze podłączona i jeśli w pętli loop() ustawisz pin 9 na stan wysoki to świeci?

  • #11 06 Sie 2017 19:25
    Bator11
    Poziom 4  

    Używam tego programu. Dioda jest sprawna sprawdzałem , połączenie też dla pewności sprawdziłem jeszcze multimetrem podłączonym do wyjscia 9 nie pojawia sie stan wysoki.

    Kod: c
    Zaloguj się, aby zobaczyć kod

  • #12 06 Sie 2017 20:07
    Marek_Skalski
    Poziom 33  

    0. A co to jest??? :D

    Kod: C
    Zaloguj się, aby zobaczyć kod

    while(1); i tutaj program się kręci, przerwania się wykonują, przez port szeregowy coś leci, ale warunek "if..." poniżej nigdy nie jest sprawdzany.

    1. Jesteś pewien, że dobrym pomysłem jest wysyłanie danych przez port szeregowy z prędkością 9600 w przerwaniu wywoływanym co 10ms? To nie ma prawa działać prawidłowo.

  • #13 06 Sie 2017 20:14
    JacekCz
    Poziom 32  

    Marek_Skalski napisał:
    0. A co to jest??? :D
    ...
    1. Jesteś pewien, że dobrym pomysłem jest wysyłanie danych przez port szeregowy z prędkością 9600 w przerwaniu wywoływanym co 10ms? To nie ma prawa działać prawidłowo.


    przerwania tu to jakieś copy-paste, bez zrozumienia

  • #14 08 Sie 2017 23:35
    Bator11
    Poziom 4  

    Yhy rozumiem .
    1.Panie Jacku właśnie po to tutaj piszę żeby uzyskać jak najwięcej informacji i zrozumieć zasadę .
    2.Czy mogę usunać pętle while , czy jednak trzeba będzie go przesunąć na koniec.
    3.Aktualnie nie sprawdzę ewentualnych poprawek dopóki nie kupię nowego arduino , ponieważ podczas tworzenia lampki zmierzchowej z kursu forbota nie wiem jakim cudem ale musiałem uszkodzić bodajże stabilizator (element zaraz pod kwarcem) , który podczas pracy mocno się nagrzewa.Sprawdziłem płytkę pod wzgledem zwarć aczkolwiek raczej nie sądzę żebym gdzieś je zrobił ponieważ zawsze rygorystycznie "koloruje" kable połączeniowe .

  • #15 09 Sie 2017 01:36
    zster

    Poziom 17  

    Usuń while(1) gdyż program główny zatrzymuje się w tym miejscu i kręci w kółko nie wykonując nic poza przerwaniami.
    I nie bardzo rozumiem sens wywoływania funkcji TCS() co 500ms z pętli głównej ....

 Szukaj w ofercie
Zamknij 
Wyszukaj w ofercie 200 tys. produktów TME