Prezentuję konstrukcję, którą wykonałem z myślą o zajęciach z robotyki dla uczniów szkoły podstawowej. Powstała w ekspresowym tempie 4 godzin – włącznie z projektowaniem PCB i trawieniem.
Efekt końcowy powinien być taki, że pozycja potencjometru jest stała i niezależna od obrotów zębatek przekładni. Po usunięciu blokady mechanicznej z przekładni, mamy serwo pracujące inaczej niż tradycyjne – wysyłając impulsy co 20ms, określamy już nie wychylenie, a kierunek obrotów orczyka. Dwa zdjęcia z modyfikacji można znaleźć w galerii.
Zyskaliśmy dzięki temu wiele wolnych portów I/O – sterujemy jednym silnikiem poprzez jeden pin, utraciliśmy za to możliwość płynnej zmiany prędkości. Niektórzy mogą się kłócić, że w okolicy sygnału odpowiadającego za pozycję neutralną, serwo obraca się wolniej – fakt jest taki, że jest to spowodowane „szarpaniem”, ciężko to nazwać płynną regulacją, a dodatkowo drastycznie spada nam moment obrotowy.
Widoczne na PCB złącze to wyprowadzone piny ADC x3, VCC i GND – dzięki temu łatwo można podłączyć np. moduł z trzema transoptorami odbiciowymi (czujnikami linii) i zamienić robota w linefollowera z wykrywaczem przeszkód (kategoria Line Follower Enhanced).
Zdjęcia były robione wieczorem przy pomocy aparatu wbudowanego w telefon – stąd słaba jakość.
Schemat i projekt PCB wykonałem w programie EAGLE.
Uwaga! Schemat i PCB powstały w czasach, kiedy pojęcie na temat pracy mikrokontrolera miałem dość mgliste… Z tego względu nie są do końca zgodne ze sztuką – brakuje chociażby filtrowania i podciągnięcia linii resetu. Próbujących zbudować tego robota uspokajam – będzie działać. Chodzi jedynie o to, żebyście nie bazowali na moich rozwiązaniach przy tworzeniu własnych. Większość sposobów podłączenia mikrokontrolerów jest wspólna dla moich konstrukcji, ewoluowała w trakcie zdobywania wiedzy i doświadczenia, więc łatwo możecie zaobserwować zmiany porównując tego robota z którymś z najnowszych.
Kod BASCOM (starałem się napisać jak najprzejrzyściej, w razie wątpliwości – pytajcie w komentarzach):
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 |
$regfile = "m8def.dat" $crystal = 4000000 'EDUbot v.1 - Damian Nowak 'PortD.5 - lewa dioda; PortD.4 - środkowa dioda; PortD.3 - prawa dioda 'PortD.6 - prawe serwo; PortD.7 - lewe serwo 'PortD.0 - wąs prawy; PortB.0 - wąs lewy 'Zmienne: Dim I As Integer Dim Pomocnicza As Integer 'Konfiguracja portów: Config Portd.3 = Output Config Portd.4 = Output Config Portd.5 = Output Config Portd.6 = Output Config Portd.7 = Output Config Portd.0 = Input Config Portb.0 = Input 'Ustawienia początkowe: Reset Portd.3 Reset Portd.4 Reset Portd.5 Reset Portd.6 Reset Portd.7 'Główna pętla programu: Do If Pind.0 = 0 And Pinb.0 = 0 Then 'Jeśli żaden czujnik nie wciśnięty: Gosub Jedz_do_przodu Elseif Pind.0 = 1 And Pinb.0 = 0 Then 'Jeśli wciśnięty czujnik prawy: Gosub Cofnij Gosub Obrot_w_prawo Elseif Pind.0 = 0 And Pinb.0 = 1 Then 'Jeśli wciśnięty czujnik lewy: Gosub Cofnij Gosub Obrot_w_lewo Else 'Jeśli wciśnięte oba czujniki: Gosub Cofnij Gosub Obrot_w_prawo Gosub Obrot_w_prawo End If Loop End 'Funkcje: Jedz_do_przodu: Set Portd.4 'Zapala diodę środkową For I = 1 To 15 Pulseout Portd , 6 , 360 Pulseout Portd , 7 , 360 Waitms 20 Next Reset Portd.4 'Gasi diodę środkową Return Cofnij: For I = 1 To 15 Pulseout Portd , 6 , 200 Pulseout Portd , 7 , 200 Waitms 20 Next Return Obrot_w_prawo: Set Portd.3 'Zapala diodę prawą For I = 1 To 15 Pulseout Portd , 6 , 200 Pulseout Portd , 7 , 360 Waitms 20 Next Reset Portd.3 'Gasi diodę prawą Return Obrot_w_lewo: Set Portd.5 'Zapala diodę lewą For I = 1 To 15 Pulseout Portd , 6 , 360 Pulseout Portd , 7 , 200 Waitms 20 Next Reset Portd.5 'Gasi diodę lewą Return |