Skocz do zawartości

Światłolub - mnóstwo pytań i wątpliwości


ZaiZu

Pomocna odpowiedź

Witam wszystkich,

jako że od kilku dni pożeram wszelkiego rodzaju kursy, poradniki, pomoce dotyczące programowania w Arduino, stwierdziłem że czas na pierwszy projekt. Pewnie napiszę przydługi i nieciekawy wstęp, więc proponuję osobom niecierpliwym przejście do sekcji oznaczonej [****], gdzie będę wyjaśniał jakie problemy napotkałem. Postanowiłem stworzyć światłoluba, lecz zamiast zadowalać się przeciętną, mało estetyczną, i raczej nieciekawą budową, stwierdziłem że postaram się go w miarę moich możliwości ulepszyć.

Głównymi założeniami jakie sobie poczyniłem są:

1. Zwiększona ilość czujników światłoczułych - chcę by mój robot świadomy był natężenia światła 360 stopni wokół siebie. Koncepcja jest taka by zaopatrzyć go w minimum 3 czujniki (a nawet 4).

2. Dzięki większej ilości elementów światłoczułych chcę by robot miał możliwość obrotu w miejscu - czegoś co w projektach które ogladałem nie zauważyłem.

3. Modularna budowa - arduino jak i akumulator ma być łatwy do demontażu, jednocześnie nie będąc zmuszonym do rozbierania modelu.

4. Skalowanie czułości el. fotoczułych - to jest odległa myśl, i nie wiem czy starczy mi umiejętności by ją zrealizować. Chciałbym mieć możliwość sterowania wrażliwością mojego światłoluba na światło.

Niestety problemy napotkałem już w fazie projektowania i myślenia nad konstrukcją. W większości dotyczą one napędu i zasilania robota.

[**********]

1. Mam straszny mętlik w głowie jeśli chodzi zespół napędowy. Dwa tylne koła będą napędzane przez osobne mechanizmy, jednak nie mam zielonego pojęcia jakie zastosować.

Waham się między serwomechanizmem a silnikiem DC - który z nich będzie odpowiedni do robota ważącego, szacuję, ok 600g? Na kursie na stronie Forbotu dowiedziałem się że serwo mogę podłączyć przez Arduino, jednak muszę ją zasilić przez wejście 9V. Jak to się ma do dwóch serwomechanizmów? Nie chciałbym usmażyć Arduino. Dodatkowo problemem będzie zasilanie owych serwomechanizmów, ale o tym w następnym punkcie.

Nie wiem jaką moc takiego serwa dobrać, by spokojnie pracowały, a również nie było przerostu mocy. Jakiego rodzaju? Medium wystarczy? Super by było gdyby ktoś rzucił jakiś określony model, w którym zamknę się w ok. 25zł/sztukę.

Dodatkowo, znalazłem informację że takie serwo muszę "zmodyfikować" by działało w 360stopniach (obrót), i odłączyć od jego układu sterowania. Czy nie stwarza to bezpieczeństwa dla Arduino?

Rozważam jeszcze silniki kątowe, jednak mam wrażenie że moc może być niewystarczająca. Czy to dobry pomysł?

Jeśli chodzi o silniki, to przekraczają one mój budżet, dodatkowo wymagają wstawiania mostka H. Dobrze rozumiem że jeden mostek H może sterować jednym silnikiem? Dałbym radę zasilić je z takiego powerbanka?

2. Chciałbym by moim zasilaczem był powerbank 10000mAh. Dysponuję więc dwoma złączami 5V 1A, 2.1A. Czy mogę zasilić Arduino z jednego wejścia, a obwód silników z drugiego (2.1A)? Czy w razie użycia serwo, wystarczy zasilanie przez USB (Kurs temu zaprzeczał).

3. Jaka jest różnica między zastosowaniem fotorezystorów a fototranzystorów jeśli chodzi o jakość uzyskanego sygnału? W większości projektów widziałem że to fototranzystory są używane.

4. Czy znajdę jakąś plastikową listewkę, coś co uporządkuje mi piny przy Arduino. Chodzi mi o fakt, żebym odłączywszy arduino, i wpinawszy je np. po 2 miesiącach, nie musiał przypominać sobie który pin za co odpowiadał, tylko wpinać je całym pasmem. Da radę to załatwić goldpinem?

5. Na czym oprzeć układy mojego robota? Zakupić uniwersalną płytkę do której dolutuje wszystkie potrzebne elementy?

------

Wiem że pytań jest dużo, pewnie niektóre naprawdę elementarne, jednak nie mogę znaleźć tych określonych informacji. Bardzo dziękuję za pomoc. Na koniec dodam że konstrukcja będzie oparta na Lego Technics.

Link do komentarza
Share on other sites

1. Jeżeli chodzi o silniki, a serwa, to przeróbka serwa super prosta nie jest, a tu masz takie silniki (nie trzeba rzucać się na Pololu 😉):

http://allegro.pl/silnik-elektryczny-6v-kolko-kolo-modelarskie-65mm-i4913793875.html (silnik 48:1 6V + koło, sprzedający telmal-store)

Jest na nich zrobiony mój LF (600g) i bez problemu go "ciągną"

Wtedy do tych silników bierzesz mostek H (poszukaj artykułu o nim na Forbocie) - do tych silników w zupełności wystarczy jeden, 2-kanałowy mostek L293D za 3 PLN 😃

2. Wystarczy, że podepniesz się kablem USB z powerbanku do arduino (możesz wziąć z 2.1A), a potem wyprowadzisz z płytki GND i VCC

3. Nie jako takiej różnicy, poza tym, że fototranzystory mają polaryzację - do Twoich zastosowań nie musisz się martwić o jakość odczytu 🙂

4. Musiałbyś przylutować poszczególne przewody do tzw. goldpinów, ale patrz punkt 5.

5. Poszukaj odpowiednie "Proto Shield". Są to nakładki na arduino, gdzie nakładasz je i masz płytkę uniwersalną na wierzchu z wyprowadzonymi pinami, potem możesz wypiąć arduino, a układ na płytce pozostaje nietknięty

Link do komentarza
Share on other sites

Pomysł z polem widzenia 360° jest fajny więc przemyśl dobrze jak to zrobić. Możesz oczywiście wstawić dużo czujników, ale możesz też zrobić jeden czujnik na ciągle obracającej się wieżyczce. Ponieważ przekazanie sygnału z takiego elementu jest pewnym kłopotem - trzeba mieć specjalne złącza obrotowe, to rozwiązaniem może być proste serwo, które poruszając się w lewo i prawo, wahadłowo np. o 180° byłoby w stanie skanować całą przestrzeń dwoma czujnikami. Po dołożeniu prostej przekładni 1:2, nawet jednym czujnikiem 360°. Procesor musiałby w trakcie poruszania serwem czytać czujnik(i) i tworzyć mapę jasności. Potem znajdować najwyższą i tam kierować pojazd. Przemyśl to, moim zdaniem taki "radar" może być fajną ciekawostką.

Przy wielu czujnikach ważny będzie kąt widzenia każdego z nich. Jeżeli użyjesz fotooporników, musisz im zrobić rurki lub jakieś przysłony by widziały tylko taki wycinek kąta jaki sobie zaplanujesz. Fotooporniki patrzą praktycznie w 160-180° i same z siebie kiepsko nadają się do detekcji kierunku padania światła. Ich powierzchnia czynna maleje z kosinusem kąta (więc powoli) i tak samo zmniejsza się sygnał wraz z odchylaniem źródła od kąta prostego. Za to fototranzystory zwykle są wyposażone w gotowe soczewki. W pewnych granicach możesz więc wybrać kąt widzenia i dlatego takie rozwiązanie wydaje się sensowniejsze.

Jeżeli podłączysz czujniki do wejść analogowych procesora, masz od razu sygnały które możesz ze sobą porównywać. Prosty program może wybrać największą jasność i tam kierować pojazd. Jeżeli odetniesz sobie tę informację przez podpięcie do wejść cyfrowych, od razu tracisz możliwość analizy ilościowej. Z kilku wartości 0-1 trudno wybrać największą, prawda?

Zasilanie przez USB jest za słabe i kurs bardzo słusznie odradza napędzanie jednocześnie procesora i jakiegokolwiek napędu (np. serwa) z tego samej linii. Dochodzi jeszcze sprawa zakłóceń - dobrze jest rozdzielać elementy wykonawcze (silniki) od nieznoszących zakłóceń układów cyfrowych.

W przypadku zasilania z powerbanku problem mocy odpada, bo wyjście takiej kostki daje dużo więcej prądu/mocy niż gniazdko USB w komputerze. Niemniej jednak sprawa separacji od zakłóceń pozostaje: nie wiesz, czy w Twoim powerbanku gniazdka wyjściowe nie są wewnątrz po prostu zwarte na krótko. Kolejny problem to napięcie: 5V to mało dla takich mostków jak tanie L293. Dużo na nich tracisz więc silniki nie zobaczą więcej jak 3.5V. Jeżeli to Ci nie przeszkadza, to problem z głowy.

Co masz na myśli pisząc o jakości sygnału? Fotooporniki i fototranzystory to inne elementy więc wymagają trochę innego układu by je w pełni wykorzystać. Oporniki są wolne, nadają się jedynie do pomiaru jasności. Tranzystory są czulsze i szybsze. W przyszłości mógłbyś pokusić się o zrobienie specjalnej latarki z diody LED wysyłającej jakiś przerywany (modulowany) sygnał świetlny do robota. Mając na pokładzie fototranzystory, procesor mógłby odróżniać tę latarkę od wszystkich innych źródeł światła i kierować się na nią mimo, iż wcale nie byłaby najjaśniejsza.

Nie rozumiem tego rozróżnienia między "serwem" a silnikiem. Przecież nie możesz użyć serwomechanizmu jako takiego, bo on nie służy do ciągłego napędu. Wybierasz więc między silniczkiem DC z przekładnią zabudowanego w plastiku udającym serwo modelarskie lub silnikiem DC z przekładnią nieobudowanego lub w jakimś innym plastiku, czy tak? Do obu tych silników potrzebujesz mostek H. Trzecią drogą - pośrednią, jest przerobienie normalnego serwa (lub kupienie gotowego: http://botland.com.pl/361-serwa-praca-ciagla-360 ) by umiało kręcić się w kółko z wykorzystaniem istniejącej tam elektroniki. Sterujesz tym jak serwem (sygnał PPM) a dostajesz dwukierunkowy, dość wolny napęd. Zwykłe serwo będzie pewnie tańsze, ale jego przerobienie wymaga odrobiny wprawy i umiejętności. Każda ingerencja w środku oczywiście anuluje gwarancję. Jak coś pójdzie nie tak, wyrzucasz do kosza.

Napisz na co się zdecydowałeś albo jakie masz jeszcze wątpliwości 🙂

Link do komentarza
Share on other sites

Nie rozumiem tego rozróżnienia między "serwem" a silnikiem. Przecież nie możesz użyć serwomechanizmu jako takiego, bo on nie służy do ciągłego napędu. Wybierasz więc między silniczkiem DC z przekładnią zabudowanego w plastiku udającym serwo modelarskie lub silnikiem DC z przekładnią nieobudowanego lub w jakimś innym plastiku, czy tak? Do obu tych silników potrzebujesz mostek H. Trzecią drogą - pośrednią, jest przerobienie normalnego serwa (lub kupienie gotowego: http://botland.com.pl/361-serwa-praca-ciagla-360 ) by umiało kręcić się w kółko z wykorzystaniem istniejącej tam elektroniki. Sterujesz tym jak serwem (sygnał PPM) a dostajesz dwukierunkowy, dość wolny napęd. Zwykłe serwo będzie pewnie tańsze, ale jego przerobienie wymaga odrobiny wprawy i umiejętności. Każda ingerencja w środku oczywiście anuluje gwarancję. Jak coś pójdzie nie tak, wyrzucasz do kosza.

Z silnikami sprawa wygląda następująco: dzisiaj przyszły mi dwa serwa micro (z moich obliczeń wyszło że starczy im momentu z wielokrotnym zapasem). Mówiąc o serwach, cały czas miałem na myśli ich przeróbkę. Na ten moment mam poczucie że porwałem się z motyką na słońce, bo te serwa są maleńkie (nie wiem co sobie myślałem),a przerabianie ich może być faktycznie nieco ponad moje umiejętności. Teorię znam, jedyne co, to boję się lutowania tych 2ch rezystorów zamiast potencjometru.

EDIT: Udało się rozwiązać ten problem. Zostawiam moje głupoty dla innych początkujących. Żeby serwo działało, musi być połączone do wspólnej masy obu źródeł zasilania.

/*

Próbowałem zasilić takie serwo z ładowarki do komórki - także 5V (Zmierzyłem 5,02V - serwo pracuje na 4,8V). Wysyłam sygnał by serwo sobie tykało co 5 stopni (przez pin PWM), podpinam zasilanie, w momencie podpięcia serwo przeskakuje o kilka stopni, i na tym kończy się odpowiedź układu. Jak go odłączę od zasilania, to wraca na początkową pozycję. Dodam że kod jest na pewno poprawny, bo podpiąłem to serwo również przez złącza Vin/GND arduino, i zachowywało się normalnie, tj. wykonywało określoną wyżej sekwencję. W czym leży problem?

*/

Co do el. światłoczułych, zdecydowałem się na fototranzystory, ponieważ będą miały lepszą precyzję pomiaru.

Zakłóceniami mnie zmartwiłeś bo na tę chwilę nie mam pomysłu na zasilanie z dodatkowego źródła, a toporną baterię 9V do Arduino wolałbym uniknąć. Możesz trochę wątek rozwinąć? Wydaje mi się że Powerbank będzie miał osobne obwody, dla każdego gniazdka, bo obsługuje różne prądy (tj. 2.1A na jednym, 1A na drugim).

Ogólnie coraz więcej problemów natury technicznej wypełza, często takich których sam nie potrafię rozwiązać (jak wspomniane zasilanie serwa), i muszę Wam d...ę zawracać. Dużo ciekawych pomysłów mi rzuciłeś, tylko to jeszcze nie mój poziom.

Link do komentarza
Share on other sites

Zarejestruj się lub zaloguj, aby ukryć tę reklamę.
Zarejestruj się lub zaloguj, aby ukryć tę reklamę.

jlcpcb.jpg

jlcpcb.jpg

Produkcja i montaż PCB - wybierz sprawdzone PCBWay!
   • Darmowe płytki dla studentów i projektów non-profit
   • Tylko 5$ za 10 prototypów PCB w 24 godziny
   • Usługa projektowania PCB na zlecenie
   • Montaż PCB od 30$ + bezpłatna dostawa i szablony
   • Darmowe narzędzie do podglądu plików Gerber
Zobacz również » Film z fabryki PCBWay

Może mi ktoś sprawdzić ten kod i powiedzieć gdzie leży błąd? Program wykonuje się bezbłędnie do warunku Switch...case, wszystko jest wyjaśnione w komentarzach, a jak dochodzi do pętli switch case, to nie ma reakcji serw, jakby robot w ogóle takiego warunku w kodzie nie miał.

#include <Servo.h>
#define A 2
#define B 3
#define C 4
#define D 5
int ABCD = A0, E = A1, F = A2, G = A3, H = A4, Z[8];
Servo Lserwo, Rserwo;



void setup() 
{
 Serial.begin(9600);

 pinMode(A, OUTPUT); //piny do sterowania multiplekserem
 pinMode(B, OUTPUT);
 pinMode(C, OUTPUT);
 pinMode(D, OUTPUT);

 digitalWrite(A,LOW);
 digitalWrite(B,LOW);
 digitalWrite(C,LOW);
 digitalWrite(D,LOW);

 Lserwo.attach(9);  //Lewe serwo
 Rserwo.attach(10);  //Prawe serwo
}

void loop() 
{
 int temp=0, i;

 digitalWrite(A, HIGH);
 Z[0] = analogRead(ABCD);
 digitalWrite(A, LOW);

 digitalWrite(B, HIGH);
 Z[1] = analogRead(ABCD);
 digitalWrite(B, LOW);

 digitalWrite(C, HIGH);
 Z[2] = analogRead(ABCD);
 digitalWrite(C, LOW);

 digitalWrite(D, HIGH);
 Z[3] = analogRead(ABCD);
 digitalWrite(D, LOW);

 Z[4] = analogRead(E);
 Z[5] = analogRead(F);
 Z[6] = analogRead(G);
 Z[7] = analogRead(H);

 for(i=0; i<8; i++) //Znalezienie najwiekszej wartosci natezenia swiatla
 {     
    if(temp < Z[i])
       temp = Z[i];
 }

 if(temp > 400) //prog dzialalnosci ukladu (ponizej 400 robot ma nie reagowac na swiatlo)
 { 
   for(i=0; i<8; i++) //Znalezienie czujnika wskazujacego najwieksza wartosc
   {     
      if(temp == Z[i])
        temp = i;  //wpisanie za i numeru przyporzadkowanego do okreslonego czujnika  
   }

   //Lserwo.writeMicroseconds(1000);  //Jesli testowo dodam to polecenie do kodu, to w zaleznosci od swiatla kolo bedzie sie obracalo (a wiec dziala do tego momentu)

//*************KOD DO TEGO MOMENTU DZIALA POPRAWNIE - SWITCH CASE NIE DZIALA

   switch(i){
     case 0:{  //swiatlo z lewego boku
       Lserwo.writeMicroseconds(1540);  //1520 - neutrum, 1000 - tył, 2000 - przód (za wolno) 
       Rserwo.writeMicroseconds(1000); //1410 - neutrum, 2000 - tył, 1000 - przód (za szybko)
       break;
     }

     case 1:{  //swiatlo lewy tylny rog
       Lserwo.writeMicroseconds(1000);  //1520 - neutrum, 1000 - tył, 2000 - przód (za wolno) 
       Rserwo.writeMicroseconds(1000); //1410 - neutrum, 2000 - tył, 1000 - przód (za szybko)
       break;
     }

     case 2:{  //swiatlo tyl
       Lserwo.writeMicroseconds(1000);  //1520 - neutrum, 1000 - tył, 2000 - przód (za wolno) 
       Rserwo.writeMicroseconds(1000); //1410 - neutrum, 2000 - tył, 1000 - przód (za szybko)
       break;
     }

     case 3:{  //swiatlo prawy tylny rog
       Lserwo.writeMicroseconds(2000);  //1520 - neutrum, 1000 - tył, 2000 - przód (za wolno) 
       Rserwo.writeMicroseconds(2000); //1410 - neutrum, 2000 - tył, 1000 - przód (za szybko)
       break;
     }

     case 4:{  //swiatlo prawy bok
       Lserwo.writeMicroseconds(2000);  //1520 - neutrum, 1000 - tył, 2000 - przód (za wolno) 
       Rserwo.writeMicroseconds(1410); //1410 - neutrum, 2000 - tył, 1000 - przód (za szybko)
       break;
     }

     case 5:{  //swiatlo prawy przedni rog
       Lserwo.writeMicroseconds(2000);  //1520 - neutrum, 1000 - tył, 2000 - przód (za wolno) 
       Rserwo.writeMicroseconds(1410); //1410 - neutrum, 2000 - tył, 1000 - przód (za szybko)
       break;
     }

     case 6:{  //swiatlo przod
       Lserwo.writeMicroseconds(2000);  //1520 - neutrum, 1000 - tył, 2000 - przód (za wolno) 
       Rserwo.writeMicroseconds(1000); //1410 - neutrum, 2000 - tył, 1000 - przód (za szybko)
       break;
     }

     case 7:{  //swiatlo lewy przedni rog
       Lserwo.writeMicroseconds(1540);  //1520 - neutrum, 1000 - tył, 2000 - przód (za wolno) 
       Rserwo.writeMicroseconds(1000); //1410 - neutrum, 2000 - tył, 1000 - przód (za szybko)
       break;
     }
   }
 }else{  //brak swiatla, serwa nie kreca sie
    Lserwo.writeMicroseconds(1540);  //1520 - neutrum, 1000 - tył, 2000 - przód (za wolno) 
    Rserwo.writeMicroseconds(1410); //1410 - neutrum, 2000 - tył, 1000 - przód (za szybko)
 }
 delay(500);

}

__________

Komentarz dodany przez: Sabre

Następnym razem wrzuć kod na forum.

Link do komentarza
Share on other sites

ZaiZu, po co te nawiasy klamrowe przy każdym case?

Przyznam się że założyłem że przy więcej niż jednej instrukcji trzeba. Błąd już znalazłem, mianowicie powinno być switch(temp), szkoda gadać.

Link do komentarza
Share on other sites

Przyznam się że założyłem że przy więcej niż jednej instrukcji trzeba.

W przypadku konstrukcji switch "rolę nawiasów" przejmują słowa case oraz break, więc nawiasy nie są potrzebne 🙂

Link do komentarza
Share on other sites

Dołącz do dyskusji, napisz odpowiedź!

Jeśli masz już konto to zaloguj się teraz, aby opublikować wiadomość jako Ty. Możesz też napisać teraz i zarejestrować się później.
Uwaga: wgrywanie zdjęć i załączników dostępne jest po zalogowaniu!

Anonim
Dołącz do dyskusji! Kliknij i zacznij pisać...

×   Wklejony jako tekst z formatowaniem.   Przywróć formatowanie

  Dozwolonych jest tylko 75 emoji.

×   Twój link będzie automatycznie osadzony.   Wyświetlać jako link

×   Twoja poprzednia zawartość została przywrócona.   Wyczyść edytor

×   Nie możesz wkleić zdjęć bezpośrednio. Prześlij lub wstaw obrazy z adresu URL.

×
×
  • Utwórz nowe...

Ważne informacje

Ta strona używa ciasteczek (cookies), dzięki którym może działać lepiej. Więcej na ten temat znajdziesz w Polityce Prywatności.