Elektroda.pl
Elektroda.pl
X

Search our partners

Find the latest content on electronic components. Datasheets.com
Elektroda.pl
Please add exception to AdBlock for elektroda.pl.
If you watch the ads, you support portal and users.

Wykrywanie obiektów w robocie hobbystycznym

Mikimause9 18 Sep 2021 10:27 738 50
Computer Controls
  • #1
    Mikimause9
    Level 3  
    Witam,
    Ostatnio kolega pożyczył mi robota, żebym się nim pobawił. To ja chętnie go przygarnąłem, i zacząłem się mu przyglądać. Posiada on microcontroller atmega 8a, sterownik silników l293d, czujniki linii, i najważniejsze(na tą chwilę): Dwie diody ir wraz z dwoma czujnikami v4836
    Wykrywanie obiektów w robocie hobbystycznym
    Diody podłączone są do pinu 11, a odbiorniki kolejno do pinów 12 i 19. Oryginalnie robot "przyszedł" do mnie z programem śledzącym rękę (za pomocą wymienionych czujników) Niestety robot zbudowany był na zajęciach, więc mam dostęp tylko do skompilowanego programu ściągniętego z robota. Próbowałem odtworzyć efekt, ale biblioteka, którą znalazłem pozwala wysyłać sygnał podczerwony tylko przez pin 9. Czy dałoby się napisać program wykorzystujący te czujniki, najlepiej bez użycia bibliotek? Chodzi mi o najprostszy program wysyłający w kółko te same dane, i wykrywający czy dane wróciły, i do którego czujnika.
    Pozdrawiam
  • Computer Controls
  • #2
    MocnyAmper
    Level 14  
    Pewnie by się i dało, ale czy prościej bez użycia bibliotek - to wątpię. Wszak biblioteki właśnie po to są, żeby nie klepać kodu do obsługi danego urządzenia za każdym razem od nowa.
  • #3
    Mikimause9
    Level 3  
    pomysł był taki, że biblioteka, którą mam, używa pinu 9 do wysyłania, a z tego co mi wiadomo, to tego pinu nie da się tak łatwo zmienić. Oczywiście jak uda się użyć jakiejś biblioteki, to też będzie ok :D
  • #5
    Mikimause9
    Level 3  
    MocnyAmper wrote:
    Używa pinu 9 bo tam jest wyjście PWM.

    A diody są na pinie 11, i to jest problem.
  • Computer Controls
  • #6
    MocnyAmper
    Level 14  
    Czekaj chwilę, bo chyba się trochę zagalopowałem :D W Arduino pin 9 (między innymi) daje PWM i tak z rozpędu pomyślałem.
    ATMEGA8 ma wyjście PWM na pinie 11, nie na 9. W zasadzie pin 9 to zwykły pin IO (ewentualnie jeden z pinów do oscylatora kwarcowego) więc powinno dać się go zmienić bez większego problemu na inny. Jeśli w głównym kodzie nie ma nigdzie deklaracji pinów to poszukaj w plikach samej biblioteki.
  • #7
    Mikimause9
    Level 3  
    W kodzie mam coś takiego
    Code: c
    Log in, to see the code


    gdzie na przykład dla atmegi32u4
    Code: c
    Log in, to see the code
  • #8
    MocnyAmper
    Level 14  
    Czekaj chwilę, bo ja się już pogubiłem.
    Ty mówisz o pinach fizycznych czy cyfrowych?

    Chyba o cyfrowych (tych z komentarzy w kodzie) - wtedy wszystko pasuje. Piny cyfrowe 9 i 11 są wyjściami timerów odpowiednio pierwszego i drugiego. Z tym, że timera drugiego Atmega8 nie posiada...
    Tak czy inaczej, w tym wypadku nie możesz zamienić pinów jak Ci się podoba. Mógłbyś ewentualnie zamienić procesor na Atmega88 - rozkład pinów ten sam, ale on już posiada timer drugi więc mógłbyś użyć tego pinu 11.

    Natomiast 32u4 posiada dwa timery 16-bitowe i jeden 10-bitowy - stąd możliwość wyboru jednego z trzech.

    Tak w sumie to po co chcesz zamieniać te piny?
  • #9
    Mikimause9
    Level 3  
    Chodzi o to, że auto zrobione jest z wytrawionych płytek pcb, i tam jakoś było to rozwiązane.Problem jest taki, że nie mam dostępu do kodu, tylko do skompilowanej wersji. No i oczywiście chciałem obejść się bez fizycznych modyfikacji.

    Dodano po 2 [minuty]:

    Żeby nie było niejasności nie chodzi mi o wysyłanie specyficznego kodu. Cel jest taki, żeby dwa odbiorniki mogły mi powiedzieć, czy przed nimi jest jakiś obiekt czy nie, czyli żeby złapały wysłany i odbity kod, nieważne jaki on by nie był.
  • Helpful post
    #11
    ekoservice
    Level 10  
    No i co stoimy? A może kupcie sobie taką zabawkę z Chin i przetrenujecie ten temat fizycznie? To chyba będzie najprostsze rozwiązanie …
  • Helpful post
    #13
    ekoservice
    Level 10  
    No faktycznie bez wsadu ani rusz
  • #14
    Mikimause9
    Level 3  
    A to może zapytam troszkę inaczej, czy jest możliwość wygenerowania sygnału ok. 38kHz na pinie 11 procesora Atmega 8a?
  • Helpful post
    #15
    MocnyAmper
    Level 14  
    Tzn, wiesz - sam pwm możesz wygenerować w zasadzie na dowolnym pinie przy użyciu biblioteki SoftPWM czy chociażby generując przerwania od timera i w obsłudze przerwań zmieniać stany danego pinu, ale to nie o to chyba chodzi.
    Ten sygnał 38kHz musi być chyba odpowiednio zmodulowany, nie? W sensie, on ma nieść jakąś konkretną informację czy tylko "jest/nie ma"?
  • #16
    Mikimause9
    Level 3  
    tak właściwie to musi być "informacja" jest/nie ma, która będzie możliwa do wykrycia przez czujnik v4836.
  • #18
    Mikimause9
    Level 3  
    Niestety z tego co mi wiadomo, to kolega był na jakichś zajęciach na politechnice, i tam oni lutowali te roboty, a potem wgrywali gotowy program, żeby sprawdzić, czy roboty działają. To było bardziej na lutowanie :D. A co do skompilowanego programu, to wstawiam go w załączniku
    robot.hex Download (4.86 kB)
  • Helpful post
    #19
    MocnyAmper
    Level 14  
    @redcap16 ciekawe jak chcesz, hakerze, rozkodować kod maszynowy :D
    @mikimause9 coś takiego uskrobałem na szybko:

    Code: c
    Log in, to see the code


    Spróbuj czy to w ogóle zadziała. Nie wiem jakiego kwarcu używasz (czy w ogóle jakiegoś używasz, czy generator wewnętrzny) więc tam w setupie masz dwie wersje OCR1A - 104 dla oscylatora 8Mhz i 209 dla 16MHz. Niepotrzebne zakomentuj. Numer pinu, na którym powinien pojawić się przebieg zmieniasz na początku, w tej definicji.

    Tak przy okazji; jesteś pewien, że ten sygnał powinien mieć 38kHz, a nie 36kHz? (standard RC5)
  • #20
    Mikimause9
    Level 3  
    Na tym etapie mogę zamknąć temat, ponieważ sygnał z programu w poście #19 jest bez problemu wykrywalny przez odbiornik. Dziękuje wszystkim za pomoc.

    Dodano po 2 [godziny] 1 [minuty]:

    Ogólnie następnym razem postaram się najpierw wszystko sprawdzić, a potem zamknąć temat… Ale do rzeczy, Program działa, ale tylko przy starcie (resecie) atmegi. Więc już jest nieźle, ale to jeszcze nie to.
  • #22
    Mikimause9
    Level 3  
    Już wyjaśniam. Z moich eksperymentów wyszło, że czujnik wykrywa sygnał tylko przy starcie programu. Potem cisza aż do kolejnego restartu programu.
  • #23
    MocnyAmper
    Level 14  
    Mój kod powinien generować przebieg tak długo, aż go wyłączysz ustawiając stan niski w zmiennej, którą podałem w funkcji loop(), więc to raczej coś z obsługą czujnika.
    Może dałeś funkcję odczytującą sygnał w sekcji setup() i wykonuje się tylko raz?
  • #24
    Mikimause9
    Level 3  
    @mocnyamper Sprawdzałem trzy razy. Ale jak troszkę grzebałem w tym kodzie, to zmieniając funkcję loop na
    Code: c
    Log in, to see the code

    to wtedy czujnik pokazuje mi "ciągłe" przychodzenie danych.
  • #26
    Mikimause9
    Level 3  
    Do wykrywania sygnału używam osobnej płytki Arduino z podłączonym czujnikiem v4836. Na początku używałem biblioteki irremote i funkcji blink13 (zaświeć diodę, kiedy będzie sygnał) ale potem okazało się, że taki sam rezultat osiągam poprzez odczytanie danych z czujnika funkcją digitalRead().
  • #27
    MocnyAmper
    Level 14  
    Może nie dokładnie taki sam, ale podobny. Pamiętaj, że sygnał generowany przez nadajnik nie jest sygnałem ciągłym, więc zależy czy ta funkcja digitalRead() trafi akurat na atan niski czy stan wysoki.

    Może pokaż cały ten Twój kod?
  • #28
    Mikimause9
    Level 3  
    Kod odbiornika
    Code: c
    Log in, to see the code


    pin 18 jest to odbiornik, a pin 12 to zwykła dioda led
  • #29
    MocnyAmper
    Level 14  
    Mikimause9 wrote:
    Code: c
    Log in, to see the code

    (...)

    pin 18 jest to odbiornik, a pin 12 to zwykła dioda led


    Chyba na odwrót? :|
    Generalnie w tym kodzie nie ma się co zepsuć. Może powiedz coś więcej w jaki sposób się to psuje? Działa zaraz po dostarczeniu zasilania do odbiornika, tak? I przez jak długo? Zawsze po takim samym czasie przestaje?

    Druga sprawa, do której zapomniałem się odnieść:
    Mikimause9 wrote:
    @mocnyamper Sprawdzałem trzy razy. Ale jak troszkę grzebałem w tym kodzie, to zmieniając funkcję loop na
    Code: c
    Log in, to see the code

    to wtedy czujnik pokazuje mi "ciągłe" przychodzenie danych.


    Prawdopodobnie czujnik pokazuje dobrze, tylko Ty tego nie dostrzegasz. Zmień te opóźnienia z 100ms na np 1000ms i wtedy zobacz ;)
  • #30
    Mikimause9
    Level 3  
    Tutaj dokładnie wyjaśnię co robiłem krok po kroku, i jaki jest tego efekt

    Najpierw pobrałem kod z postu #19 i napisałem program do odbiornika
    Code: c
    Log in, to see the code
    (tak, dioda jest pod pinem 18, a czujnik pod 12 :D)
    Efekt tego jest taki:
    Wykrywanie obiektów w robocie hobbystycznym
    (film w załączniku)

    zmieniłem również nadajnik na zwykłego pilota ir, i wtedy dioda cały czas migała.