Skocz do zawartości

Panicz74

Użytkownicy
  • Zawartość

    22
  • Rejestracja

  • Ostatnio

  • Wygrane dni

    1

Panicz74 wygrał w ostatnim dniu 12 maja 2015

Panicz74 ma najbardziej lubianą zawartość!

Reputacja

2 Neutralna

O Panicz74

  • Ranga
    2/10

Informacje

  • Płeć
    Mężczyzna
  • Lokalizacja
    Opole
  • Zainteresowania
    Elektronika
  1. Tak, zgadzam się. Zbudowałem robota z tego co miałem pod ręką. Jeszcze pomyślę nad rampą aby było płynniej. Źle napisałem, że cały kod w przerwaniu. Tylko pętla główna wykonuje sie w przerwaniu. Raczej nie będę upychał funkcji gry do mikrokontrolera. Spróbuję połączyć przez RS232 lub USB i tak próbować to robić. Może nie na dniach ale wkrótce
  2. Witam ponownie Chciałbym przedstawić własnej konstrukcji manipulator, który ze względu na kinową premierę nosi nazwę "Terminator_Hand". Robot posiada funkcję sterowania ręcznego oraz gotową funkcję "idź,złap-przenieś-upuść". Układ składa się z: - Atmega644P 16MHz, - 3x serwo TowerPro SG-5010 standard, 50Hz, - 1x serwo TowerPro SG-92 micro, 50Hz, - przerobiony ATX PowerSupply 420W z użyciem wszystkich wiązek 3,3V(16A); 5V(16A); 12V(15A), PS-ON zwarte przez włącznik I/0, - stabilizator liniowy 7805 pod wiązką 12V, - klawiatura złożona z 13 przycisków typu microswitch. Zasilanie układu: 1. 3,3V - Zasilanie diod sygnalizacyjnych pojawienie się napięcia w układzie. Funkcja bezpieczeństwa. 2. 5V - Zasilanie serwomechanizmów. Łączny pobór prądu przez wszystkie 4 silniki wynosi max. 3A. Zasilanie filtrowane dla każdego silnika po 100nF. 3. 12V - Zasilanie układu logicznego. Napięcie zostało obniżone do 5V(1A) po użyciu stabilizatora liniowego 7805 z parą kondensatorów 100nF. Układ logiczny: 1. Zasilanie filtrowane przy pinach VCC-GND i AVCC-GND przez pary kondensatorów 3,3uF(elektrolit) i 100nF(ceramik). 2. RST podciągnięte do VCC przez rezystor 10K. 3. Wyjścia MISO, MOSI, SCK, RST posiadają stałą możliwość korzystania z programatora. 4. Nieużywane piny zaprogramowane jako wejście ze stanem wysokim dla wytłumienia zakłóceń. Oprogramowanie: 1. Tryb FastPWM korzystający z dwóch rejestrów kontrolnych TCCR1A/B. 2. Sterownik działa programowo, cały kod wykonuje się przerwaniu. Zastosowano wektor przerwania TIMER_OVF_VECT. 3. Całość wykonano w języku C. Wykonany został na zapotrzebowanie koła naukowego PO jako praca dyplomowa. Jest to moja pierwsza taka konstrukcja, w przyszłej fazie rozwoju robot będzie grać w kółko/krzyżyk, warcaby, jeśli starczy czasu i sił, to może i szachy. Konstrukcja może nie jest zbyt skomplikowana, lecz jest podwaliną do ciągłego rozwoju. Robot powstał dzięki ogromnej pomocy, którą otrzymałem, m.in, na tym forum. Z tego powodu, jeśli któryś z użytkowników zechce zbudować podobnego robota, chętnie udostępnię cały kod oraz pomogę w problemach, przez które prawie wyłysiałem Tymczasem, chciałbym was zapytać o wasze uwagi dotyczące tego projektu. Wszelka krytyka mile widziana Film: Zdjęcia:
  3. Błędem w kodzie, a raczej w fusbitach był fus CKDIV8... Spowalniał procka x8. Potem już zmiana bitów z CS10 na CS11, ICR1 na 40000, trochę przeliczania... i śmiga. Jak pupa niemowlęcia Innymi słowy, 100Hz to niedobry pomysł dla serwomechanizmów
  4. Przepraszam was, że tak długo. Uruchomiłem program. Jedyne co należało zrobić to zwiększyć ilość warunków i w ten sposób puszczać serwa po kolei Jak nie spełnia jednego warunku to nie jedzie. Jeśli ktoś będzie potrzebował to udostępnię cały kod. Tymczasem jest problem z zakłóceniami. To jest dopiero ciekawa sprawa. Patrzcie na wyniki z oscyloskopu. Dźwięk i obraz idealnie oddają postać rzeczy: Może ktoś wie jak ten problem rozwiązać???
  5. A możecie mi wytłumaczyć jeszcze jedną kwestię prescalera? Rozumiem, że ustawienie tego bitu daje nam prescaler = 1. A jeśli chciałbym ustawić prescaler = 8 lub prescaler = 16? Jakie bity wtedy ustawić? CS11? CS12? Rozumuje to tak, że jeśli mam prescaler = 1, to serwo będzie szukało jak najbardziej bliskiego miejsca pomiędzy liczbami całkowitymi. Czyli jeśli zwiększę na prescaler = 8 to serwo zatrzyma się między, np. 0 - 8, ale też przestanie drgać bo nie będzie musiało już szukać tego bardzo wąskiego zakresu prescaler = 1 (0 - 1). Czy dobrze rozumuję???
  6. No własnie, już próbowałem. Zmieniłem te wartości nawet 5000ms i nic. Po tej zmianie program po prostu w ogóle nie rusza...
  7. M. in. tak: while(1) { if(key_flag) // jeśli flaga = 0, wykonaj program { key_flag = 0; if (KEY1_DOWN) //klawisz 1 wcisniety { servo1 = SERVO_MAX; _delay_ms(50); servo2 = SERVO_MIN; _delay_ms(50); servo3 = SERVO_MAX; _delay_ms(50); servo4 = SERVO_MIN; _delay_ms(50); servo5 = SERVO_MAX; } if (KEY2_DOWN) //klawisz 2 wcisniety { servo1 = SERVO_MIN; _delay_ms(50); servo2 = SERVO_MAX; _delay_ms(50); servo3 = SERVO_MIN; _delay_ms(50); servo4 = SERVO_MAX; _delay_ms(50); servo5 = SERVO_MIN; } if (KEY3_DOWN) //klawisz 3 wcisniety { servo1 = SERVO_MID; _delay_ms(50); servo2 = SERVO_MID; _delay_ms(50); servo3 = SERVO_MID; _delay_ms(50); servo4 = SERVO_MID; _delay_ms(50); servo5 = SERVO_MID; } }
  8. Witam, Pewnie sprawa będzie dla was banalna ale ja się z nią zmagam już jakiś czas. Poniższy kod steruje 5 serwami: #include <avr/io.h> #include <avr/interrupt.h> #include <util/delay.h> #define KEY1 (1<<PA0) // definicja przycików #define KEY2 (1<<PA1) #define KEY3 (1<<PA3) #define KEY1_DOWN ( !(PINA & KEY1) ) // definicja wciśniętego przycisku #define KEY2_DOWN ( !(PINA & KEY2) ) #define KEY3_DOWN ( !(PINA & KEY3) ) #define SERVO1 (1<<PB0) // definicja silników #define SERVO2 (1<<PB1) #define SERVO3 (1<<PB2) #define SERVO4 (1<<PB3) #define SERVO5 (1<<PB4) #define SERVO_MID 1500 // definicja położenia silnika #define SERVO_MIN 1000 #define SERVO_MAX 2000 uint16_t servo1, servo2, servo3, servo4, servo5; volatile uint8_t key_flag; // zmienna pomijana przez kompilator int main(void) { servo1 = servo2 = servo3 = servo4 = servo5 = SERVO_MID; // ustawienie początkowe silników PORTA |= KEY1 | KEY2 | KEY3; // wyjścia - przyciski DDRB |= SERVO1 | SERVO2 | SERVO3 | SERVO4 | SERVO5; // wyjścia do silników TCCR1A |= 1<<WGM11; TCCR1B |= 1<<WGM12 | 1<<WGM13 | 1<<CS10;//rejestry odpowiedzialne za PWM TIMSK1 |= 1<<OCIE1A; // timer dla TCCR1B & TCCR1A ICR1 = 19999;//rozciagnij, zawez okres sei();//uruchomienie przerwań while(1) { if(key_flag) // jeśli flaga = 0, wykonaj program { key_flag = 0; if (KEY1_DOWN) //klawisz 1 wcisniety { servo1 = SERVO_MAX; servo2 = SERVO_MIN; servo3 = SERVO_MAX; servo4 = SERVO_MIN; servo5 = SERVO_MAX; } if (KEY2_DOWN) //klawisz 2 wcisniety { servo1 = SERVO_MIN; servo2 = SERVO_MAX; servo3 = SERVO_MIN; servo4 = SERVO_MAX; servo5 = SERVO_MIN; } if (KEY3_DOWN) //klawisz 2 wcisniety { servo1 = SERVO_MID; servo2 = SERVO_MID; servo3 = SERVO_MID; servo4 = SERVO_MID; servo5 = SERVO_MID; } } if(TCNT1 >= servo1) PORTB &= ~SERVO1; //nakierowanie mechanizmu przerwania if(TCNT1 >= servo2) PORTB &= ~SERVO2; if(TCNT1 >= servo3) PORTB &= ~SERVO3; if(TCNT1 >= servo4) PORTB &= ~SERVO4; if(TCNT1 >= servo5) PORTB &= ~SERVO5; } } ISR (TIMER1_COMPA_vect) { PORTB |= SERVO1 | SERVO2 | SERVO3 | SERVO4 | SERVO5; key_flag = 1; // jeśli flaga = 1, program sie wykonał } Wszystko działa dobrze, tylko chciałbym aby serwa ruszały po kolei, od SERVO1 do SERVO5. W tym momencie wszystkie wykonują zadany ruch jednocześnie. Zabiegi z "delay" nic nie pomagają. Czy mogę liczyć na wasza pomoc?
  9. Wstawiłem linijkę 2 linijki: if(TCNT1 > servo1) PORTB &= ~SERVO1; if(TCNT1 < servo2) PORTB &= ~SERVO2; Serwo zaczęło reagować, ale tylko to na pinie PB0, serwo na PB1 stoi. Poza tym serwo nie porusza się tak powinno. [ Dodano: 11-05-2015, 20:34 ] Problem rozwiązany, powodem były braki w kodzie: /* * main.c * * Created on: 11 maj 2015 * Author: Radek */ #include <avr/io.h> #include <avr/interrupt.h> #include <util/delay.h> #define KEY1 (1<<PA0) // definicja przycików #define KEY2 (1<<PA1) #define KEY1_DOWN ( !(PINA & KEY1) ) // definicja wciśniętego przycisku #define KEY2_DOWN ( !(PINA & KEY2) ) #define SERVO1 (1<<PB0) // definicja silników #define SERVO2 (1<<PB1) #define SERVO_MID 1500 // definicja położenia silnika #define SERVO_MIN 1000 #define SERVO_MAX 2000 uint16_t servo1, servo2; volatile uint8_t key_flag; // zmienna pomijana przez kompilator int main(void) { servo1 = servo2 = SERVO_MID; // ustawienie początkowe silników PORTA |= KEY1 | KEY2; // wyjścia - przyciski DDRB |= SERVO1 | SERVO2; // wyjścia do silników TCCR1A |= 1<<WGM11; TCCR1B |= 1<<WGM12 | 1<<WGM13 | 1<<CS10;//rejestry odpowiedzialne za PWM TIMSK1 |= 1<<OCIE1A; // timer dla TCCR1B & TCCR1A ICR1 = 19999;//rozciagnij, zawez okres sei();//uruchomienie przerwań while(1) { if(key_flag) // jeśli flaga = 0, wykonaj program { key_flag = 0; if (KEY1_DOWN) //klawisz 1 wcisniety { servo1 = SERVO_MAX; //ustawienia odpowiednio servo1 i servo2 servo2 = SERVO_MIN; } if (KEY2_DOWN) //klawisz 2 wcisniety { servo1 = SERVO_MIN; //ustawienia odpowiednio servo1 i servo2 servo2 = SERVO_MAX; } } if(TCNT1 > servo1) PORTB &= ~SERVO1; //nakierowanie mechanizmu przerwania if(TCNT1 > servo2) PORTB &= ~SERVO2; } } ISR (TIMER1_COMPA_vect) { PORTB |= SERVO1 | SERVO2; key_flag = 1; // jeśli flaga = 1, program sie wykonał }
  10. Witam, Napisałem taki program: Przycisk KEY1 daj obrót 2 serw w przeciwnych kierunkach o 180stopni, przycisk KEY2 to samo w drugą stronę. Program bez problemu się kompiluje i wgrywa, Eclipse nie pokazuje żadnych błędów. Po naciśnięciu któregokolwiek przycisku serwa jednak nie reagują. /* * main.c * * Created on: 11 maj 2015 * Author: Radek */ #include <avr/io.h> #include <avr/interrupt.h> #include <util/delay.h> #define KEY1 (1<<PA0) #define KEY2 (1<<PA1) #define KEY1_DOWN ( !(PINA & KEY1) ) #define KEY2_DOWN ( !(PINA & KEY2) ) #define SERVO1 (1<<PB0) #define SERVO2 (1<<PB1) #define SERVO_MID 1500 #define SERVO_MIN 600 #define SERVO_MAX 4500 uint16_t servo1, servo2; volatile uint8_t key_flag; int main(void) { DDRB |= SERVO1 | SERVO2; TCCR1A |= 1<<WGM11; TCCR1B |= 1<<WGM12 | 1<<WGM13 | 1<<CS10; TIMSK1 |= 1<<OCIE1A; ICR1 = 19999;//rozciagnij, zawez okres sei();//uruchomienie przerwań while(1) { if(key_flag) { key_flag = 0; if (KEY1_DOWN) //klawisz 1 wcisniety { servo1 = SERVO_MAX; servo2 = SERVO_MIN; } if (KEY2_DOWN) //klawisz 2 wcisniety { servo1 = SERVO_MIN; servo2 = SERVO_MAX; } } } } ISR (TIMER1_COMPA_vect) { PORTB |= SERVO1 | SERVO2; key_flag = 1; } Czy ktoś wie co znowu źle zrobiłem w kodzie? Połączenia są na pewno ok bo bardzo podobny program do sterowanie ręcznego działa.
  11. Panie Złoty!!! Odłączyłem VCC od programatora i włączyłem do 5V zasilacza. Serwo śmiga aż mu się uszy trzęsą To się nie popisałem, taka pierdoła ....
  12. Zrobiłem jak radzisz. Niestety, serwo teraz w ogóle nie reaguje Jakieś inne pomysły?
  13. Po podpięciu RESET - 10K Ohm - +5V, układ w ogóle nie reaguje bo jest ciągle w stanie resetu
  14. Witam, Mam taki problem, gdy układ pracuje z podłączonym programatorem wszystko działa elegancko. Jak odłączam taśmę (nie usb) to układ zaczyna robić co mu się podoba. Pewnie coś zmaściłem w schemacie. Oto schemat: Zasilacz to popularny "YwRobot MB102 3,3/5V". Dodatkowo podaję kod programu (steruje on 5 serwami ale do testów na schemacie wystarczy jedno serwo): /* * main.c * * Created on: 8 maj 2015 * Author: Radek */ #include <avr/io.h> #include <avr/interrupt.h> #include <util/delay.h> #define KEY1 (1<<PA0) #define KEY2 (1<<PA1) #define KEY3 (1<<PA2) #define KEY4 (1<<PA3) #define KEY5 (1<<PA4) #define KEY6 (1<<PA5) #define KEY7 (1<<PA6) #define KEY8 (1<<PA7) #define KEY9 (1<<PB6) #define KEY10 (1<<PB7) #define KEY1_DOWN ( !(PINA & KEY1) ) #define KEY2_DOWN ( !(PINA & KEY2) ) #define KEY3_DOWN ( !(PINA & KEY3) ) #define KEY4_DOWN ( !(PINA & KEY4) ) #define KEY5_DOWN ( !(PINA & KEY5) ) #define KEY6_DOWN ( !(PINA & KEY6) ) #define KEY7_DOWN ( !(PINA & KEY7) ) #define KEY8_DOWN ( !(PINA & KEY8) ) #define KEY9_DOWN ( !(PINB & KEY9) ) #define KEY10_DOWN ( !(PINB & KEY10) ) #define SERVO1 (1<<PB0) #define SERVO2 (1<<PB1) #define SERVO3 (1<<PB2) #define SERVO4 (1<<PB3) #define SERVO5 (1<<PB4) #define SERVO_MID 1500 #define SERVO_MIN 1000 #define SERVO_MAX 2500 uint16_t servo1, servo2, servo3, servo4, servo5; volatile uint8_t key_flag;//informacja dla kompilatora zeby mi sam nie zmienil tej zmiennej int main(void) { servo1 = servo2 = servo3 = servo4 = servo5 = SERVO_MID; PORTA |= KEY1 | KEY2 | KEY3 | KEY4 | KEY5 | KEY6 | KEY7 | KEY8; //podciagnięcie wejsc PORTB |= KEY9 | KEY10; DDRB |= SERVO1 | SERVO2 | SERVO3 | SERVO4 | SERVO5; //wyjscia TCCR1A |= 1<<WGM11; TCCR1B |= 1<<WGM12 | 1<<WGM13 | 1<<CS10;//wszystkie rejestry wyjasnie w gotowej pracy TIMSK1 |= 1<<OCIE1A; ICR1 = 6000;//rozciagnij, zawez okres sei();//uruchomienie przerwań while(1) { if(key_flag) { key_flag = 0; if (KEY1_DOWN) //klawisz 1 wcisniety { if(servo1 < SERVO_MAX) servo1++; } if (KEY2_DOWN) //klawisz 2 wcisniety { if(servo1 > SERVO_MIN) servo1--; } if (KEY3_DOWN) //klawisz 3 wcisniety { if(servo2 < SERVO_MAX) servo1++; } if (KEY4_DOWN) //klawisz 4 wcisniety { if(servo2 > SERVO_MIN) servo2--; } if (KEY5_DOWN) //klawisz 5 wcisniety { if(servo3 < SERVO_MAX) servo3++; } if (KEY6_DOWN) //klawisz 6 wcisniety { if(servo3 > SERVO_MIN) servo3--; } if (KEY7_DOWN) //klawisz 7 wcisniety { if(servo4 < SERVO_MAX) servo4++; } if (KEY8_DOWN) //klawisz 8 wcisniety { if(servo4 > SERVO_MIN) servo4--; } if (KEY9_DOWN) //klawisz 9 wcisniety { if(servo5 < SERVO_MAX) servo5++; } if (KEY10_DOWN) //klawisz 10 wcisniety { if(servo5 > SERVO_MIN) servo5--; } } if(TCNT1 > servo1) PORTB &= ~SERVO1; //nakierowanie mechanizmu przerwania if(TCNT1 > servo2) PORTB &= ~SERVO2; if(TCNT1 > servo3) PORTB &= ~SERVO3; if(TCNT1 > servo4) PORTB &= ~SERVO4; if(TCNT1 > servo5) PORTB &= ~SERVO5; } } ISR (TIMER1_COMPA_vect) { PORTB |= SERVO1 | SERVO2 | SERVO3 | SERVO4 | SERVO5; key_flag = 1; } Dodatkowo wrzucam film z działaniem z i bez programatora: Czy ktoś wie co źle zrobiłem?
  15. Zasilanie mam 5V z zasilacza sieciowego D-Link. Mam podłączone tylko to serwo do układu więc tylko ono może generować spadek napięcia. [ Dodano: 07-05-2015, 21:46 ] Wojciechu, to znaczy, że przykładowo dla 1mgh jak by te obliczenia wygladały? Wiem, że dla was to proste ale ja się dopiero tego uczę
×
×
  • Utwórz nowe...