Poker Sorter

Poker Sorter

Lubię obserwować mechanizmy w ruchu. Od pewnego czasu fascynowały mnie urządzenia sortujące kolorowe cukierki, jednak takich rozwiązań jest już sporo w internecie, a ja chciałem skonstruować coś oryginalnego. Wybór padł na żetony do gry w pokera. Założenie było takie, aby wykorzystać jak najmniej elementów mechanicznych i jak najprostsze elementy. Tak powstał Poker Sorter, którego działanie najlepiej pokazuje film [6].

Zgodnie z nazwą, zadaniem zaprezentowanego mechanizmu jest sortowanie żetonów do pokera. Rozdzielane są one na cztery kategorie na podstawie odczytu z czujnika.

Jak to działa?

Sorter ma jeden ruchomy element: tarczę z wyciętym otworem. Jak widzimy na rysunku 1, otwór składa się z dwóch połączonych kół o średnicy żetonu. Pierwsze znajduje się bliżej, a drugie dalej od środka tarczy. Gdy tarcza obraca się zgodnie z ruchem wskazówek zegara, żeton będzie znajdował się w odległości r1 od środka tarczy. Gdy zmienimy kierunek obrotu, żeton przesunie się do drugiego koła i będzie się poruszał w odległości r2.

Rysunek 1. Tarcza z wyciętym otworem – jedyny ruchomy element urządzenia

Nasza tarcza obraca się po stole, w którym w odległości r2 mamy cztery otwory. Podajnik żetonów umieszcza pojedynczy krążek w bliższym otworze (r1). Teraz następuje ruch tarczy, który przesuwa żeton w odległości r1, a więc nie spadnie on ze stołu. Po przesunięciu za dziurę, do której powinien spaść, następuje zmiana kierunku obrotu tarczy. Żeton przesuwa się do drugiego otworu na odległość r2 i rozpoczyna powrót. Jednak tym razem napotka otwór w stole, przez który spadnie.

Rysunek 2. Szkic pokazujący rolę podajnika

Tarcza, już bez żetonu, wraca do pozycji startowej pod podajnik. Jest to ostatni element, któremu się przyjrzymy. Jego schemat został pokazany na rysunku 2. Aby za każdym razem był zabierany dokładnie jeden żeton, tarcza musi być cieńsza niż grubość żetonu.

Zadaniem podajnika jest zatrzymanie żetonów stojących na nim. W tym celu musi się on zaczynać nie wyżej niż grubość dwóch żetonów, ale wyżej niż grubość pojedynczego.

W stole, pod podajnikiem umieszczony jest czujnik CNY70, którego zadaniem jest rozróżnienie żetonów. Jako napęd zastosowałem silnik prądu stałego. Musimy więc mieć czujniki wykrywające położenie tarczy. Użyte są tu dwa kolejne CNY70. Pierwszy wykrywa pozycję początkową, a drugi liczy, nad którym otworem obecnie znajduje się tarcza.

Rysunek 3. Stół i tarcza widziane od góry, z zaznaczonymi otworami i czujnikami

Rysunek 3 pokazuje stół i tarczę widzianą od góry. Czujniki zamontowane są w stole w jednej linii z podajnikiem. Pierwszy otwór znajduje się 90° od podajnika, a pozostałe trzy są oddalone od siebie o 60°. Na wysokości czujnika startu znajduje się tylko jeden znacznik (1). Natomiast dla licznika otworów są ich cztery (2). Jak widzimy na schemacie, są one umieszczone w połowie odległości pomiędzy dziurami.

Do sterowania całością posłużył moduł Arduino Nano. Schemat połączenia pokazuje rysunek 4. Diody nadawcze czujników CNY70 są podłączone do zasilania przez rezystory ograniczające prąd. Natomiast fototranzystory wraz z rezystorami 10 kΩ tworzą dzielniki napięcia. Są one podłączone bezpośrednio do wejść analogowo-cyfrowych mikrokontrolera. Silnik jest sterowany przez scalony mostek H oznaczony jako L293D. Użyty jest tylko jeden z dwóch mostków dostępnych w układzie. Niewykorzystane wejścia zostały podciągnięte do masy.

Rysunek 4. Schemat układu sterującego

Montaż i uruchomienie

Pierwszy prototyp został wycięty z kartonu i sklejony klejem na gorąco (fotografia 1). Jednak po sprawdzeniu, czy sama idea ma szansę działać, zaprojektowałem Sorter w programie Onshape. Jest to działający w przeglądarce program CAD. Projekt znajduje się pod linkiem [1], natomiast pliki STL można znaleźć w repozytorium [2]. Zostały one wydrukowane na drukarce 3D.

Fotografia 1. Pierwszy prototyp urządzenia wycięty z kartonu i sklejony klejem na gorąco

Gdy mamy gotowe elementy, przygotowujemy trzy czujniki CNY70 oraz silnik, dolutowując do nich około 30-centymetrowe przewody. Do napędu wybrałem silnik z przekładnią. Jego prędkość to 25 obrotów na minutę. Na oś silnika zakładamy hub widoczny na fotografii 2.

Fotografia 2. Silnik z przekładnią oraz odpowiedni hub

Następnie silnik montujemy w otworze znajdującym się w środku stołu. Jego przekrój widzimy na rysunku 5.

Rysunek 5. Przekrój konstrukcji stołu

Najpierw w otworach (1) wkładamy nakrętki i od zewnątrz wkręcamy śruby o średnicy 3 mm i długości 14 mm. Następnie przez otwór (2) przeciągamy przewody zasilające silnik. Teraz wkładami silnik i umieszczamy go tak, aby hub minimalnie (mniej niż milimetr) wystawał ponad stół. Dokręcamy śruby, aby utrzymały silnik w ustalonej pozycji.

Czujniki CNY70 przyklejamy od spodu stołu za pomocą kleju na gorąco. Uważamy przy tym, aby nie zakleić elementów światłoczułych. Efekt pokazuje fotografia 3.

Fotografia 3. Stół z zamontowanym silnikiem i czujnikami

Następnie przechodzimy do tarczy. Musimy pomalować znaczniki, aby były widoczne dla czujników. Wydrukowane są one w formie niewielkich wgłębień, które musimy pomalować na kolor biały za pomocą korektora. Można także wkleić w nie kawałek białego papieru.

Przygotowaną tarczę widzimy na fotografii 4. Przykręcamy ją do osi silnika za pomocą czterech śrub o długości 8 mm i średnicy 3 mm.

Fotografia 4. Gotowa tarcza

Ostatnim elementem jest dokręcenie podajnika. W tym celu używamy dwóch śrub o długości 14 mm. Gotowy model pokazuje fotografia 5.

Fotografia 5. Stół, tarcza i zamontowany podajnik

Teraz składamy układ elektroniczny. Może przydać się opis wyjść czujnika CNY70 zamieszczony na rysunku 6.

Rysunek 6. Opis wyjść czujnika CNY70

Ja złożyłem elektronikę na płytce stykowej. Wygląd mojego układu pokazuje fotografia 6. Gdy jesteśmy gotowi, możemy przejść do uruchomienia i kalibracji.

Fotografia 6. Zmontowana cała konstrukcja

Kalibracja czujników położenia

Wgrywamy szkic testCNY70 [3]. Otwieramy monitor portu szeregowego. Silnikiem sterujemy za pomocą następujących poleceń:
1 – stop,
2 – obrót zgodnie z ruchem wskazówek zegara,
3 – obrót przeciwnie do ruchu wskazówek zegara.

Jeżeli komendy 2 i 3 są zamienione, odwracamy polaryzację silnika. Kolejnym krokiem jest sprawdzenie, jak czujniki reagują na znaczniki położenia. W tym celu włączamy ruch zgodnie z ruchem wskazówek zegara i przesyłamy polecenie s. Na monitorze pojawią się odczyty z wszystkich trzech czujników. Po około trzech obrotach znowu przesyłamy s, co wyłączy przesyłanie danych. Kopiujemy zebrane dane do arkusza kalkulacyjnego. Moje wyniki znajdują się w [4], na arkuszu cny70_test.

Rysunek 7. Dane z kalibracji pokazane na wykresie

Zebrane przeze mnie dane są pokazane na wykresie z rysunku 7. Najpierw interesują nas kolumny: location odpowiedzialna za zliczanie dziur oraz end służąca do znalezienia początku. Widzimy, że pomimo dość znacznego szumu i tak bez problemu można wykryć moment, gdy znacznik znajdzie się nad czujnikiem. Ciekawą rzecz można także zauważyć dla czujnika koloru żetonu. Widzimy, że gdy jest on odsłonięty, otrzymujemy maksymalne możliwe wskazanie, czyli 1023. Posłuży nam to później do ustalenia, czy w Sorterze znajdują się jakiekolwiek żetony.

Przechodzimy teraz do głównego programu, który znajdziemy w szkicu Sorter.ino [5]. Na początku musimy ustalić współczynniki, dla których uznamy, że nastąpiło wejście znacznika nad sensor sensor_set_th, oraz zejście znacznika znad sensora sensor_reset_th. Ja na podstawie rysunku 7 uznałem, że dla mnie sprawdzą się odpowiednio wartości 300 i 700. Dzięki różnym progom otrzymamy tzw. histerezę i nie będziemy mieli problemu z drganiami stanu czujnika w okolicy przełączania.

Musimy także wstępnie dobrać wartość color_empty. Jest to próg, powyżej którego odczyt z czujnika koloru będzie oznaczał, że nie ma żadnego żetonu. W tej chwili powinna to być wartość niewiele niższa niż to, co dostajemy z odsłoniętego czujnika koloru. W moim przypadku jest to 970. Wrócimy jeszcze do tej nastawy po zmierzeniu odczytu dla różnych kolorów żetonu. Po ustawieniu odpowiednich wartości budujemy szkic i programujemy mikrokontroler.

Kalibracja kolorów

Po wgraniu kodu Sorter powinien wykonać bazowanie na pozycji startowej i czekać na włożenie żetonów. Otwieramy monitor portu szeregowego i przesyłamy komendę c, która powoduje przesyłanie wartości zmierzonej dla kolejnych żetonów. Wkładamy więc do podajnika wszystkie żetony w danym kolorze. Sorter powinien dla każdego z nich odczytać wartość, a następnie wypluć do którejś z przegródek. Gdy skończą się żetony, kopiujemy wyniki do kolejnych kolumn w arkuszu kalkulacyjnym. Moje dane znajdują się w [4] w arkuszu chips_color. Zmierzyłem dane dla żetonów czerwonych, białych, zielonych, niebieskich i czarnych. Uzyskane wyniki widzimy na wykresie z rysunku 8.

Rysunek 8. Zmierzone wartości dla żetonów czerwonych, białych, zielonych, niebieskich i czarnych

Uzyskałem go, wybierają typ wykresu na XY i przypisując wszystkim danym 0 dla wartości Y. Widzimy tu, że pomiary dla białego, czerwonego i czarnego tworzą osobne grupy. Natomiast odczyty dla żetonów niebieskich i zielonych pokrywają się. Jeszcze lepiej idać to, gdy dla każdego koloru wyrysujemy histogramy (jak je utworzyć dowiemy się z dokumentacji funkcji CZĘSTOŚĆ pokazanej na rysunku 9).

Rysunek 9. Histogramy wykonane dla każdego koloru

Dla innych żetonów uzyskane wyniki będą się różnić. W moim przypadku zdecydowałem, że będę sortował jedynie żetony białe, czerwone, niebieskie i czarne. Ostatnim krokiem jest ustalenie progów rozdzielających poszczególne kolory. Formalnie można je przyjąć jako środek pomiędzy skrajnymi odczytami dla różnych grup. Ja dobrałem je tak:

const int color_white = 600;
const int color_red = 760;
const int color_blue = 900;
const int color_empty = 970;

Ustalamy także wartość dla color_empty taką, aby rozdzielała skrajną grupę żetonów od pustego okna.

Rozwiązywanie problemów

Gdyby nasz Sorter zachowywał się w dziwny sposób, możemy zbierać jego pełny stan, wpisując polecenie s. Wtedy w każdym kroku będą wypisywane odczyty z czujników oraz decyzje podejmowane przez program. Ponieważ kolejne kroki są wykonywane co 10 ms, otrzymamy dużą ilość danych. Aby je przeanalizować, warto je skopiować do arkusza kalkulacyjnego i przygotować wykresy. Przykładowe znajdziemy w [4] w arkuszu sensor_data. Działanie gotowego projektu można zobaczyć na filmie [6].

Możliwości zmian

Projekt części mechanicznych można zmodyfikować, na przykład zmieniając liczbę różnych grup. Należy jednak uważać, aby nie wykonać ruchu, który spowoduje, że żetony będą wpadać do tarczy przy obsłudze ostatniej dziury w stole. Można także eksperymentować z innym czujnikiem koloru niż CNY70. Dostępne są sensory pozwalające na odczyt poszczególnych składowych koloru: czerwonej, zielonej i niebieskiej, co mogłoby pozwolić na lepsze rozróżnianie żetonów.

Rafał Kozik
rafkozik@gmail.com

[1] http://bit.ly/3VzkJuW
[2] http://bit.ly/3GNqkJF
[3] http://bit.ly/3GMOaW4
[4] http://bit.ly/3icre8p
[5] http://bit.ly/3AQPVxI
[6] https://youtu.be/9AqeCRwTqwE

Wykaz elementów:
Rezystory:
  • R1...R3: 512 Ω
  • R4...R6: 10 kΩ
Kondensatory:
  • C1: 100 nF
  • C2: 100 μF
Półprzewodniki:
  • D1...D3: CNY70
  • U1: L293D
Pozostałe:
  • M1: silnik z przekładnią 25 rpm
  • Arduino Nano
  • Płytka stykowa
  • Ośka do silnika
  • 4× śruba średnica 3 mm, długość 14 mm
  • 4× śruba średnica 3 mm, długość 8 mm
  • 4× nakrętka 3 mm
Artykuł ukazał się w
Elektronika Praktyczna
grudzień 2022
Elektronika Praktyczna Plus lipiec - grudzień 2012

Elektronika Praktyczna Plus

Monograficzne wydania specjalne

Elektronik grudzień 2024

Elektronik

Magazyn elektroniki profesjonalnej

Raspberry Pi 2015

Raspberry Pi

Wykorzystaj wszystkie możliwości wyjątkowego minikomputera

Świat Radio styczeń - luty 2025

Świat Radio

Magazyn krótkofalowców i amatorów CB

Automatyka, Podzespoły, Aplikacje listopad - grudzień 2024

Automatyka, Podzespoły, Aplikacje

Technika i rynek systemów automatyki

Elektronika Praktyczna grudzień 2024

Elektronika Praktyczna

Międzynarodowy magazyn elektroników konstruktorów

Elektronika dla Wszystkich styczeń 2025

Elektronika dla Wszystkich

Interesująca elektronika dla pasjonatów