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

Monski Pong na Arduino [Uno] w IDE Processing

RebellionArts 17 Mar 2020 04:27 1929 3
  • Witam,

    W tym DIY Konstrukcje chciałbym zaprezentować urządzenie do gry w Monski Pong.
    Cały projekt składa się z dwóch programów, modułu Arduino Uno i płytki PCB.
    Do zbudowania tego urządzenia zachęcam wszystkich początkujących jako dobry wstęp do podstaw komunikacji Arduino z komputerem z pomocą portu szeregowego.

    Monski Pong na Arduino [Uno] w IDE Processing


    Spoiler:
    Cały projekt miał być zbudowany na konkurs Forbot-a, ale niestety czas nie pozwolił mi to skończyć przed 15.03 więc postanowiłem owoc prac przedstawić forumowiczom.


    Płytka PCB składa się głównie z gniazd GoldPin żeńskich i męskich i paru rezystorów.
    Złącza AC (analogowe) i DC (cyfrowe) są ustawione tak na płytce, żeby wchodziły bezpośrednio w moduł Arduino (wraz z PWR - zasilaniem).
    Reszta gniazd jest ułożona szeregowo, która jest wykorzystana do podłączenia przycisku i sterowania. GoldPin P1_SER i P2_RST są przeznaczone do przycisków serw i reset gry, gdzie sterują wejściem DC. Natomiast C2_CZ i C1_N (CZ - czerwony, N - niebieski) są wejściami dla dwóch potencjometrów, którymi będziemy sterować rakietkami w naszej grze - doprowadzone do wejść AC.

    Monski Pong na Arduino [Uno] w IDE Processing Monski Pong na Arduino [Uno] w IDE Processing


    PCB wyszło jak wyszło, postanowiłem zrobić wszystko na laminacie, ponieważ na płytce stykowej występowały przerywania, styki nie zawsze zwierały, miałem sporo kłopotu żeby dociskać elementy i kręcić potencjometrem naraz :) .

    Monski Pong na Arduino [Uno] w IDE Processing Monski Pong na Arduino [Uno] w IDE Processing Monski Pong na Arduino [Uno] w IDE Processing

    Żeby umieścić PCB w Arduino musiałem już przytwierdzić mój układ do podstaw obudowy. Wszystko jest przedstawione na poniższych zdjęciach.

    Monski Pong na Arduino [Uno] w IDE Processing Monski Pong na Arduino [Uno] w IDE Processing Monski Pong na Arduino [Uno] w IDE Processing Monski Pong na Arduino [Uno] w IDE Processing Monski Pong na Arduino [Uno] w IDE Processing Monski Pong na Arduino [Uno] w IDE Processing Monski Pong na Arduino [Uno] w IDE Processing Monski Pong na Arduino [Uno] w IDE Processing Monski Pong na Arduino [Uno] w IDE Processing Monski Pong na Arduino [Uno] w IDE Processing

    Często słyszę od młodszych kolegów lub mniej doświadczonych: skąd brać materiały na obudowy i akcesoria?
    Więc tak: podstawki ze starego routera, ścianki i podstawa (ta biała plexi pleksi) ze starych lamp rastrowych, dystanse z dekoderów starych lub z elektronicznego sklepu , śrubki z demontażu wszystkiego :) .
    DIY to MacGyver, polecam się rozejrzeć.

    Na ten moment to już wszystko z budowy urządzenia, zostają jeszcze zdjęcia z przykrywy i działania - to na końcu.
    Teraz trudniejsza rzecz, program.

    Na pewno wszyscy którzy używają Arduino na pewno używają też Arduino IDE.
    Program do Arduino jest przedstawiony poniżej:
    Kod: c
    Zaloguj się, aby zobaczyć kod


    Nie robię opisu jako komentarz w kodzie bo zrobię to tutaj :)
    Program nie jest wymagający dla naszego Uno, tylko 37 linijek. Pierwsze 4 zmienne deklarują stałe dla wszystkich czujników, przypisując im indeks na fizycznych pinach. Kolejne 4 zmienne przechowują wartości czujników. W setup() deklarujemy cyfrowe piny resetButton i serveButton jako wejscia (i tez jako wejścia cyfrowe, bo nigdzie tego nie zrobiliśmy przecież) - żeby odbierać sygnały z przycisku.
    W pętli loop() przypisujemy zmienne wartości czujników z konkretnych wejść. analogRead() służy do odczytywania analogowych wartości z wejścia leftSensor i rightSensor, natomiast digitalRead() odczytuje cyfrowe sygnały. Kolejne linijki kodu wypisują w komunikacji szeregowej wartości czujników. Jak na razie - to wszystko, nie ma co opisywać, w tym kodzie dla wsadu Arduino Uno to wszystko.

    Czas na IDE Processing.

    Precessing to multimedialne środowisko programowania (coś jak IDE Arduino). Jest ono oparte na języku Java stąd można używać w nim klas i metod z Javy , ale zostało tak stworzone żeby ,,działać" bez zagłębiania się w szczegóły programowania. Co najważniejsze jest ono darmowe i działa na wszystkich urządzeniach. Używa składni języka C, zatem jest bardzo bardzo podobny do języka C++ z naszego IDE Arduino.

    Teraz pierwszy kod (nie finałowy) potrzebny do pewnych testów. Można oczywiście wszystko sprawdzić przed ale zalecam zrobić to z programem (patrzcie, co trzeba sprawdzić w programie i inne).
    Kod: c
    Zaloguj się, aby zobaczyć kod


    Niby jakieś komentarze są, jednak podkreślę parę rzeczy.
    import processing.serial.* - biblioteka dla Processing do obsługi wirtualnych portów w komputerze. W setup() mamy linijkę z size(480, 130) - to wielkość okna jaka ma się pojawić przy uruchomieniu naszego programu. Cała procedura draw() dzieje się w tym oknie, myślę że nic nie muszę z niej tłumaczyć, text(resultString, 10, height/2) - prosta składnia ==> https://processing.org/reference/text_.html.
    Wracamy do setup() bo tu będą schody. W nagłówku mamy coś takiego: Serial myPort - jest to deklaracja zmiennej do której zostanie zapisany nasz port COM (ten wirtualny). Wracając do setup() :) ponownie mamy println(Serial.list()) - drukuje nam to (w tle, na dole widać porty w konsoli jakie znalazł) porty COM jakie są dostępne, trzeba to zrobić aby program załadował je do ,,siebie". Później String portName = Serial.list()[X] - czemu X jest pogrubiony, ano dlatego, że w jego miejsce trzeba wstawić numer portu pod jakim występuje nasze Arduino, zmienna String portName pobiera ,,adres" wirtualnego portu. Teraz wspomniane wcześniej ,,schody". U mnie w komputerze wirtualny port od Arduino wynosił COM20, ale jak widać w programie jest wpisane [1], dlatego, że nie wiem :) , program -po wpisaniu 20 - dawał błąd o podaniu wartości z poza tablicy portów szeregowych. Na każdym komputerze sprawdziłem i działa tylko pod 1, na jednym pod 0 (sprawdzałem na 7 kompach), nie znalazłem zależności. Jak ktoś wie od czego to zależy to chętnie go tu zacytuje.
    myPort = new Serial(this, portName, 9600) wszystko jest opisane tutaj, this to this (według zaleceń strony producenta), portName jako numer portu szeregowego, 9600 prędkość transmisji danych.
    Następnie myPort.bufferUntil('\n') - jest opisany w programie, czeka na znak kończący wiersz.

    Wychodzimy już z setup(), draw() jest już opisany, zatem ostatnia rzecz: serialEvent(Serial myPort) - funkcja wykorzystująca dane z myPort (myPort = new Serial(this, portName, 9600) ) otwiera operację dla portu szeregowego.
    Myślę, że lepiej nie opiszę tego jak strona Processing:
    https://processing.org/reference/trim_.html

    A dla zawiłego polecenia split też mam wyjaśnienie:
    https://processing.org/reference/split_.html
    Cytat:
    Syntax

    split(value, delim)

    Parameters

    value - String: the String to be split
    delim - char: the character or String used to separate the data


    Tworzymy tablicę int sensors[] z której dane wycinamy po przecinku (możesz wrócić do programu z IDE Arduino i zobaczyć czym przez serial port rozdzielałem dane wyjściowe). split() dzieli nam dane w tablicy, dzięki czemu w pętli for() - sensors.length nie wypisze nam więcej danych niż byśmy chcieli. Zatem pętla for() powtarza się tyle razy ile danych jest na wyjściu (pomiędzy ,, , " do \n. Na końcu println() drukuje nam wyniki.

    Mamy za sobą 51 linijek kodu testowego, finałowy kod ma około 200 :)
    Jeśli z grubsza wszystko zostało omówione to możemy uruchomić nasz program w IDE Processing. Ważne jest to, ponieważ za pomocą tego programu możemy sprawdzić czy następuje komunikacja z programem oraz jakie wartości przyjmują czujniki.



    Jak widać, mój układ ma maks wartości na potencjometrze od około 550 - 1023 (kwestia podłączenia), te wartości będą dla nas ważne do podawania ich w stałych. Też dobra praktyka (ten program) by sprawdzić stany wejść cyfrowych, odporność układu na lekkie trącenia, itp.

    Kiedy wszystko działa nam w tym programie (próba mikrofonu), to możemy przystąpić do finałowego programu (główny Monk).

    Kod: c
    Zaloguj się, aby zobaczyć kod


    Skupię się głównie na trudnościach jakie napotkałem i o jakich myślę, że wymagają wyjaśnienia. Od początku. Doszło 17 zmiennych (linijek), w zmiennych float leftMinimum, rightMinimum, leftMaximum i rightMaximum musimy podać swoje wartości odczytane z potencjometrów (lub innych elementów elektronicznych którymi będziesz sterować rakietkami) z tego właśnie testowego programu.
    Powiem szczerze, że to chyba wszystko, co było związane z trudnością obsługi komunikacji i ogólnego działania aplikacji. Wciąż trzeba podać zamiast X numer 1 dla String portName = Serial.list()[X] i to tyle, tak naprawdę doszło kodu do tego programu testowego, co jest wynikiem tego, finałowego. Zachowałem opisy podczas pisania więc można się samemu zapoznać, a dodatkowa ilość kodu nie jest czymś trudnym już, tylko rysowanie i wprawianie w ruch rakietek i piłeczki. Widzimy tylko zmiany w funkcji serialEvent() gdzie rakietki są zmapowane co do wartości podanych przez nas, a idąc z wcześniejszymi przykładami, można łatwo sprawdzić co oznacza kolejno zmienna/wartość w nawiasach funkcji map() https://processing.org/reference/map_.html
    Najważniejsze to podać zmienne ze swojego zakresu. A oto efekt:



    Na końcu specjalnie nie odbiłem, żeby można było sprawdzić jak to działa w przypadku punktacji. Też można zauważyć (drugie odbicie) że czasem paletka odbije ale po jakimś czasie. Myślę (bo paletka lekko drży) że jest to wina drgania styków przez gniazda goldpin. Nie dodałem kodu który by to uspokoił ponieważ, gra była by za łatwa, tak to trzeba cały czas się ruszać żeby paletka była stabilna i gotowa na przyjęcie piłeczki.

    Monski Pong na Arduino [Uno] w IDE Processing Monski Pong na Arduino [Uno] w IDE Processing Monski Pong na Arduino [Uno] w IDE Processing


    Pozdrawiam i miłej zabawy.

    PS
    Załącznik zawiera pliki z Eagle (schemat/płytka), jest poprawiona pozycja pinów PWR (informuje żeby nie było zdziwienia) pierwotnie miałem poślizg o jeden pin w przód.

    Fajne! Ranking DIY
    Potrafisz napisać podobny artykuł? Wyślij do mnie a otrzymasz kartę SD 64GB.
    O autorze
    RebellionArts
    Poziom 20  
    Offline 
    Specjalizuje się w: alarmy/włamania, hacker, cyberbezpieczeństwo
    RebellionArts napisał 402 postów o ocenie 67, pomógł 34 razy. Mieszka w mieście Poznań. Jest z nami od 2015 roku.
  • Computer ControlsComputer Controls
  • #2
    rdt
    Poziom 24  
    bardzo fajny projekt - zaczynam zbierać materiały na wypadek domowej kwarantanny, żeby było co robić.
    Mam tylko malutką prośbę - dąłoby radę wydrukować do PDF ??
  • Computer ControlsComputer Controls
  • #4
    Alek-01
    Poziom 10  
    Ciekawostkę mogę dodać, że grę Pong widziałem zrobioną na układzie FPGA Spartan 3 (płytka rozwojowa Elbert V2). Na pokładzie tej płytki jest wyjście VGA, gdzie można monitor podłączyć. Natknąłem się na ten projekt gry, gdy szukałem informacji na temat obsługi monitorów VGA.