Skocz do zawartości

Granathar

Użytkownicy
  • Zawartość

    13
  • Rejestracja

  • Ostatnio

Reputacja

0 Neutralna

O Granathar

  • Ranga
    2/10

Informacje

  • Płeć
    Mężczyzna
  1. Generalnie tak, ale musiałbym wtedy raczej przerobić dosyć mocno ten program. Problem jest właśnie w tym, że on ma czujniki wrzucone w przerwanie - więc zawsze jest "up to date" (a już nie chciałem tego zmieniać). Wtedy też pasowałoby mu dać priorytety na czujnikach, żeby nie zaczął wariować którą dyrektywę ma wykonać. Ot najprostszą metodą było po prostu wrzucenie dodatkowej pętli w przerwanie (wtedy eliminujemy to, że zawsze ma aktualne informacje z czujników i w ten sposób się zachowuje), bo pokonuje wszystkie zakręty - za wyjątkiem właśnie czystego 90 stopni.
  2. Już nieaktualne Wprowadziłem dodatkowe warunki do przerwania i jeśli widzą trzy czujniki z lewa albo prawa, to wpada w nieskończoną pętlę, która trwa tak długo, aż nie znajdzie linii czujnikiem z drugiej strony. Działa jak burza.
  3. W jaki sposób sprawić, by robot był w stanie pokonywać zakręty 90 stopni? Zakładam, że pasowałoby mu wrzucić coś, co sprawi, by wykonywał ostatnią znaną dyrektywę, ale nie bardzo wiem jak to zrobić na tym etapie. Obecnie robot chodzi na tym programie (UWAGA! To są silniki BLDC!), przepraszam za to, że jest dosyć słabo czytelny: #include <avr/io.h> #include <avr/interrupt.h> #include <util/delay.h> #define LED_ON_0 PORTD |= _BV(0) ; #define LED_ON_1 PORTD |= _BV(1) ; PORTD |= _BV(5) #define LED_ON_2 PORTD |= _BV(2) ; PORTD |= _BV(5) ; PORTD |= _BV(6) #define LED_ON_3 PORTD |= _BV(3) ; PORTD |= _BV(6) #define LED_ON_4 PORTD |= _BV(4) ; #define LED_OFF PORTD &= ~_BV(0) ; PORTD &= ~_BV(1); PORTD &= ~_BV(2); PORTD &= ~_BV(3); PORTD &= ~_BV(4) ; PORTD &= ~_BV(5); PORTD &= ~_BV(6) //int vL; //int vP; volatile unsigned char polozenie_wirnika_L = 1; volatile unsigned char polozenie_wirnika_P = 1; volatile int pomiar[5]; volatile uint8_t kanal = 0; ISR(ADC_vect) //przerwanie od ADC { pomiar[kanal] = ADCH; // 8 starszych bitów jako wynik ++kanal; // przejdź do następnego kanału if (kanal > 4) // jeżeli czujnik PP to przejdź do LL konwersja leci od nowa { kanal = 0; } switch (kanal) // wybór kanału do odczytu { case (0): //LL - lewy skrajny ADMUX &= ~_BV(0); ADMUX &= ~_BV(1); ADMUX &= ~_BV(2); break; case (1): //L - lewy wewnetrzny ADMUX |= _BV(0); ADMUX &= ~_BV(1); ADMUX &= ~_BV(2); break; case (2): // C - centralny ADMUX &= ~_BV(0); ADMUX |= _BV(1); ADMUX &= ~_BV(2); break; case (3): // P - prawy wewnetrzny ADMUX |= _BV(0); ADMUX |= _BV(1); ADMUX &= ~_BV(2); break; case (4): // PP - prawy stakjny ADMUX &= ~_BV(0); ADMUX &= ~_BV(1); ADMUX |= _BV(2); break; } ADCSRA |= _BV(ADSC); // start konwersji } void bldc_komutacja_L(void) { switch (polozenie_wirnika_L++) { case (1): //komutacja 1 PORTB |= _BV(0); PORTB |= _BV(1); PORTB &=~_BV(2); break; case (2): //komutacja 2 PORTB |= _BV(0); PORTB &=~_BV(1); PORTB &=~_BV(2); break; case (3): //komutacja 3 PORTB |= _BV(0); PORTB &=~_BV(1); PORTB |= _BV(2); break; case (4): //komutacja 4 PORTB &=~_BV(0); PORTB &=~_BV(1); PORTB |= _BV(2); break; case (5): //komutacja 5 PORTB &=~_BV(0); PORTB |= _BV(1); PORTB |= _BV(2); break; case (6): //komutacja 6 PORTB &=~_BV(0); PORTB |= _BV(1); PORTB &=~_BV(2); polozenie_wirnika_L = 1; //komutacja od początku break; } //_delay_ms(vL); } void bldc_komutacja_P(void) { switch (polozenie_wirnika_P++) { case (1): //komutacja 1 PORTB &=~_BV(3); PORTB |= _BV(4); PORTB &=~_BV(5); break; case (2): //komutacja 2 PORTB &=~_BV(3); PORTB |= _BV(4); PORTB |= _BV(5); break; case (3): //komutacja 3 PORTB &=~_BV(3); PORTB &=~_BV(4); PORTB |= _BV(5); break; case (4): //komutacja 4 PORTB |= _BV(3); PORTB &=~_BV(4); PORTB |= _BV(5); break; case (5): //komutacja 5 PORTB |= _BV(3); PORTB &=~_BV(4); PORTB &=~_BV(5); break; case (6): //komutacja 6 PORTB |= _BV(3); PORTB |= _BV(4); PORTB &=~_BV(5); polozenie_wirnika_P = 1; //komutacja od początku break; } //_delay_ms(vP); } void init_adc(void) //KONFIGURACJA ADC { ADCSRA |= _BV(ADPS2) | _BV(ADPS1); // preskaler 64 ADCSRA |= _BV(ADIE); // przerwania aktywne ADMUX |= _BV(REFS0); // napięcie odniesienia z AVCC ADMUX |= _BV(ADLAR); // wynik w postaci 8-bitowej ADCSRA |= _BV(ADEN); // przetwornik aktywny } void port_conf(void) //konfiguracja portów { DDRC = 0x00; // wszystkie linie wejścia, aktywne ADC PORTC = 0x00; DDRB = 0xff; // wyjścia - silniki DDRD = 0xff; // wyjścia - led } int main(void) { sei(); //globalne odblokowanie przerwan port_conf(); init_adc(); ADCSRA |= _BV(ADSC); //start konwersji /*OCR1A = 30000; //Określenie do ilu ma zliczać timer T1 zmiana tej wartości powoduje zmianę częstotliwości komutacji TCCR1A = 0x00; //Ustawienie trybu pracy timera T1 TCCR1B = (1 << WGM12) | (1 << CS12); //Ustawienie trybu pracy timera T1 TIFR = (1 << OCF1A); //Ustawienie flagi OCF1A w stan wysoki TIMSK = (1 << OCIE1A); //Uaktywnienie przerwania zgodne porównianie A dla timera T1 */ while(1) { if (pomiar[0] > 150) //jeśli zmierzone napięcie jest większe niż ustawiona czułość to znaczy że pod czujnikiem jest czarna linia - czujnik wyrył czarną linię { LED_ON_0; // dioda led ON // vL=7; // vP=12; bldc_komutacja_L(); _delay_ms(6); // bldc_komutacja_P(); // _delay_ms(15); } else if (pomiar[1] > 150) { LED_ON_1; // dioda led ON // vL=8; // vP=10; bldc_komutacja_L(); _delay_ms(7); // bldc_komutacja_P(); // _delay_ms(15); } else if (pomiar[2] > 150) { LED_ON_2; // dioda led ON // vL=8; // vP=8; bldc_komutacja_L(); bldc_komutacja_P(); _delay_ms(9); } else if (pomiar[3] > 150) { LED_ON_3; // dioda led ON // vP=8; // vL=10; bldc_komutacja_P(); _delay_ms(7); // bldc_komutacja_L(); // _delay_ms(15); } else if (pomiar[4] > 150) { LED_ON_4; // dioda led ON // vP=7; // vL=12; bldc_komutacja_P(); _delay_ms(6); // bldc_komutacja_L(); // _delay_ms(15); } else //czujnik nie wykrył czarnej linii { LED_OFF; // diody led OFF // vL=8; // vP=8; bldc_komutacja_L(); bldc_komutacja_P(); _delay_ms(9); } } return 0; } Co można zmienić w tym programie, by umożliwić mu pokonywanie zakrętów 90 stopniowych? Sprawa jest o tyle bardziej skomplikowana, że są to silniki BLDC. Na daną chwilę robot fajnie śmiga nawet po ostrych zakrętach, ale niestety zakręt 90 stopni (bez żadnego zaokrąglenia linii) jest poza jego możliwościami.
  4. No ale na pałę, to ja mam w tej chwili wszystkie komutacje http://elabz.com/brushless-dc-motor-with-arduino/ Zgodnie z tym. Po prostu mam ustawiony delay 6 ms pomiędzy kolejnymi krokami i tyle. EDIT. Udało mi się rozwiązać problem drgań - zwiększyłem mu delay na 8 ms. Dzięki temu zmiany kierunku pola nie wyprzedzają tak bardzo wirnika. Tym nie mniej siły wciąż za mało. Z popychu pójdzie i to całkiem nieźle. Ale to musi być "fest" popych. Z miejsca sam nie ruszy. EDIT2. Po podłączeniu pod 6 paluszków i zwiększeniu delay pomiędzy komutacjami - jest w stanie sam ruszyć. Prawdopodobnie będzie działał, ale ciężar tych baterii nie jest mu obojętny. Potrzebne mi źródło prądu na jakieś około 8,5 V (bo tyle w praktyce mają te baterie) i o wydajności 2,5 A i w górę. http://www.militaria.pl/gfc/akumulator_do_g608_-_8_4v_1100mah_nimh_(g608-aku)_g_p8070.xml Jak myślicie, dźwignie taki akumulator to? Bo kolega ma dwa takie. Tylko też nie wiem ile one ważą. Jak przytrzyma mu się baterie w ręce, to rusza niemalże z piskiem opon
  5. No z tego co zauważyłem, to bez halotronów tym silnikiem się nie ujedzie. Czy tam innego czujnika, który wykrywa aktualne położenie wirnika. Niestety nie znam rosyjskiego
  6. Oo jak dobrze, że wykładowca nie poinformował nas o tym, że te silniki - tak jak myślałem, nie nadają się do tego
  7. Cholera, to robi BARDZO duży problem. Bo co jak jedno koło się zatrzyma, aby drugie nadgoniło za linią? Znowu rozruch? I tak za każdym razem? Przecież to nie ma prawa działać bez bardzo dużych komplikacji. Bo nie da się przewidzieć jaki manewr nadejdzie po jakim (czasem wypada po prostu połowa komutacji jednego silnika - zwalnia o połowę względem drugiego, aby zbierać mniej ostre zakręty). Więc pasowałoby przy każdej możliwości dokonywać na nowo rozruchu silnika Jak jeszcze weźmiemy pod uwagę, że to jest wszystko wrzucone w nieskończone pętle, to rozruch (poza tym pierwszym) musiałby być wykonywany za każdym przebiegiem algorytmu. Mówiąc krótko - masakra. Coraz bardziej utwierdzam się w przekonaniu, że silniki BLDC nie nadają się do napędzania takich maszynek.
  8. Jeszcze jeden problem jest z tym BLDC - mianowicie trzeba go popchnąć zanim w ogóle zacznie się obracać. Jeśli się tego nie zrobi - silnik drga lewo-prawo i nie ma ruchu obrotowego. I to jest problem z samym wirnikiem. Jak się tego pozbyć? Bo ten silnik jest bezużyteczny póki się tych drgań nie wyeliminuje. Za mały prąd aby go zerwało z miejsca?
  9. Te silniki mają bardzo duże wirniki, tam nie bardzo jest miejsce na zrobienie przekładni. Jeszcze jedno pytanie. Czy można na wyjściach ze sterowników wrzucić jeszcze dodatkowe tranzystory, żeby dołożyć większe napięcie? Po trzy na sterownik? Aczkolwiek nie wiem czy czasem nie zrobi to problemu z masą (bo sterownik puszcza masę jak dostanie logiczne 0, tranzystor na logicznym 0 chyba po prostu się nie otwiera).
  10. A ile mogę dać maksymalnie na BLDC prądu +/- na te sterowniki z nadzieją, że się nie upali? Bo sprawdziłem silniki ze stacji dyskietek - ale nadal są raczej za słabe. Konstrukcja jest szkieletem z aluminiowych kątowników i cała masa to praktycznie dwie płytki stykowe + silniki. Na silnik jest puszczone 6 V bez oporników, one mają 5,5 oma rezystancji, to jest około 1,1 A - i to nadal chyba nie uciągnie :/ I tak są z 2x mocniejsze od poprzednich a konstrukcja odchudzona tak bardzo, że bardziej się nie da. I to nadal może być za mało. Można mu tam podpiąć 7,5 V z 5 baterii 1,5 V? EDIT. Dupa. Trzeba się pogodzić - bez popychu nie wystartuje. A nawet z popychem nie przejdzie przez zakręt. Za mała moc silników, po prostu. Nawet po podpięciu zasilacza 7,5 V po prostu nie daje rady. Stosunek masy do limitu prądu driverów jest nie do przeskoczenia. Lżejsza konstrukcja, wymienione silniki - pomogły, ale nadal jest za słaby. Linię widzi świetnie, program z tego co zauważyłem reaguje zgodnie ze wszelkimi przewidywaniami. Jedyny mankament - brak mocy. Po prostu płytki stykowe są za ciężkie. Nie wiadomo ile tam jest oporu przez te wszystkie kable itd. Wcześniej nie znałem się zupełnie na zagadnieniu - toteż nie bawiłem się w lutowanie na płytce uniwersalnej lżejszej o jakieś 10x od dwóch płytek stykowych. Teraz jakbym miał to robić to tylko lutowanie na uniwersalnej w celu zmniejszenia masy. A na sterownik to nie wiem czy w ogóle dawałbym mu te układy L293D, czy od razu kupiłbym zestaw 6 tranzystorów na silnik i puścił mu tego prądu 2 A bez oglądania się czy coś się spali czy nie. No w każdym razie - błąd założeń, konstrukcja wymaga gruntownej przebudowy, silniki BLDC nie za bardzo nadają się do tego w połączeniu z układami L293D, aczkolwiek zależy od masy układu (u mnie znacznie za duża). Tym nie mniej facet raczej to zaliczy, bo działa wszystko - tylko moc za mała. A tego przewidzieć po prostu nie bardzo mogłem pierwszy raz w życiu robiąc taki projekt
  11. W stacji dyskietek jest silnik BLDC na 4 fazach. Akurat 4 fazy na tym driverze się jeszcze obrobi. Wewnętrzna rezystancja to około 5 om, czyli 6V można mu zapakować bez dokładania oporników i sam powinien uciągnąć. Problem jest w tym, że jest duży i chyba trzeba mu będzie i tak dorobić jakieś przełożenie. Nadal pytam o te tranzystory. Jaki model tranzystora, konkretna nazwa katalogowa - zrobi to o czym mówiłem. Czyli przełoży sygnał z procesora na koszyczek baterii 6V albo 9V.
  12. Właśnie o tych silniczkach od wysuwania tacki pomyślałem. I wiem też, że przekładnię trzeba mu zrobić - duża prędkość, mniejsza siła. Ale jaki to typ tranzystora, który posiada akurat takie parametry? Bo mogę przyjść do elektronicznego i tam nie będą wiedzieli co ja chcę za model jak im nie podam pełnej nazwy. Zmiana kierunku nie jest konieczna, on ma jechać do przodu, po w miarę nieskomplikowanej linii Nie mam czasu na zabawę z dodatkowymi bajerami, bo po ogarnięciu napędu trzeba go jeszcze skalibrować jakoś (czy są czujniki w odpowiedniej kolejności powpinane itd). Jeszcze spróbuję tego napędu ze stacji dyskietek. Może on wygeneruje więcej mocy.
  13. Mam pytanie, jakie tranzystory mogą być użyte do kontroli prądu przepływającego przez silnik? W miarę możliwości chciałbym to zrobić na pojedynczym tranzystorze AVR -> tranzystor -> silnik, przy czym silnik pod 6-9 V podpięty. Obecnie mam taki problem, że silnik wyciągnięty z CD-romu (czyli BLDC) jest o wiele za słaby aby uciągnąć konstrukcję (dwie płytki stykowe + obecnie trochę konstrukcji, ale będę odchudzał do minimum). No po prostu nie da rady go dźwignąć. Problem jest w tym, że zastosowane są drivery L293D, które mają górny limit prądu 1,2 A. A podejrzewam, że nawet tyle - to nadal będzie za słabo. Obecnie pracując na "bezpiecznym" pułapie ~0,6 A -> silnik jest tak słaby, że wystarczy dotknąć go palcem, aby zatrzymać. Nie bardzo widzę w ogóle możliwość, aby trzymając się w limicie 1,2 A ten silnik dawał radę (on wygląda jakby sam siebie wyhamowywał, nie ma halotronów włączonych). Spróbuję jeszcze z silnikami BLDC ze stacji dyskietek, z tego co wiem mogą być w tym przypadku nieco mocniejsze i może one na podkręceniu prądu do 1 A (zmienię z koszyka baterii 6 V na 1 baterię 9 V, opór w sumie około 9 omów -> po jednym oporniku 3,3 om 5W na kabel, wewnętrzna rezystancja około 2,4 om -> ~9 om w sumie) będą w stanie to udźwignąć. Nie mniej jednak już teraz zadaję pytanie o tranzystory (na wszelki wypadek). Potrzebny jest taki który przyjmie sygnał z procesora i potem będzie na wyjściu w stanie dźwignąć - no na pewno więcej niż 1,2 A (po co ryzykować, wolę zapas mieć -> przekładnię najwyżej się zrobi). Wtedy zastosuję po prostu zwykłe silniczki na dwa kabelki, a sterowanie przeprogramuję na PWM, albo zwykłe on/off. Chyba, że macie pomysł co zrobić z tym dziadem BLDC. Obecnie jest tak słaby, że ledwo obraca silnikiem z zamontowanym kołem. Robot to robota na zaliczenie, które jest w Środę, więc nie mam już niestety czasu na dopieszczanie tego Facio chciał abyśmy to zrobili na silnikach wymontowanych z CD-Romu, ale wygląda na to, że te silniki są zwyczajnie za słabe - chyba, że macie na nie jakiś sposób. Niestety do dzisiaj nie miałem jak tego stwierdzić a czas mi się kończy Czujniki z tego co zauważyłem są dosyć w miarę zaprogramowane, cały algorytm w sumie gotowy - pozostały same testy - no i klapa. Silnik nie dźwignie na tych słabiutkich driverkach. EDIT. Jeszcze jedno - jakby co, to na driverach są radiatory na paście termoprzewodzącej, zaopatrzyłem się na wszelki wypadek jakby trzeba było je "podkręcić". Ale trudno mi powiedzieć czy czasem driver nie zrobi "pyk" natychmiast po przekroczeniu górnego progu natężenia.
×
×
  • Utwórz nowe...