| Autor |
Wiadomość |
Temat: Dobór materiału |
jogurt_wisniowy
Odpowiedzi: 4
Wyświetleń: 1024
|
Forum: Pozostałe Wysłany: 16 Mar 07 11:27 Temat: Dobór materiału |
Zabieram się za zrobienie pierwszego robota i pojawiły się pierwsze problemy
Jeżeli chodzi o konstrukcję będzie on wyglądał mniej więcej tak:
i teraz zastanawiam się z czego go wykonać aluminium czy pcv (a może jakeś inne propozycje?) Co byście doradzali? Jaka powinna być orientacyjna grubość któregoś z tych materiałów żeby miało to odpowiednią sztywność? Prawdopodobnie wenątrz i tak zrobię jakąś małą kratownicę dla zwiększenia sztywności ale jestem ciekaw jak to orientacyjnie powinno wyglądać. Robot w całości na pełnym wysięgu (z chwytakiem którego tu nie ma) będzie miał ok 25-30 cm Łączenia będą klejone, pasuje żeby materiał dobrze kleił się ze stalą (łożyska przy osiach) |
Temat: Dobór materiału |
jogurt_wisniowy
Odpowiedzi: 4
Wyświetleń: 1024
|
Forum: Pozostałe Wysłany: 16 Mar 07 04:20 Temat: Dobór materiału |
| korzystałem z Google SketchUp świetne narzędzie gdy trzeba zamodelować szybko coś prostego, A jakieś konkretniejsze rady co do materiału? Bo bez tego nie dobiorę mocy serw. |
Temat: Funkcja "CONFIG SERVOS" w Bascomie |
jogurt_wisniowy
Odpowiedzi: 10
Wyświetleń: 1132
|
Forum: Mikrokontrolery Wysłany: 16 Mar 07 04:22 Temat: Funkcja "CONFIG SERVOS" w Bascomie |
| Małe pytanie co do tej instrukcji, jaki minimalny kąt obrotu można uzyskać za jej pomocą? |
Temat: Funkcja "CONFIG SERVOS" w Bascomie |
jogurt_wisniowy
Odpowiedzi: 10
Wyświetleń: 1132
|
Forum: Mikrokontrolery Wysłany: 24 Mar 07 06:52 Temat: Funkcja "CONFIG SERVOS" w Bascomie |
ok już sobie z grubsza poradziłem, kod wygląda tak:
| Kod: |
$regfile = "m8def.dat"
$crystal = 10000000
$baud = 9600
Config Servos = 4 , Servo1 = Portc.0 , Servo2 = Portc.1 , Servo3 = Portc.2 , Servo4 = Portc.3 , Reload = 2
Config Portc = Output
Config Portd.0 = Input
Enable Interrupts
'Dla reload 2 i 10 Mhz od 126-250 kąt 1.45 stopnia
Servo(1) = 126
Servo(2) = 150
Servo(3) = 150
Servo(4) = 250
Dim Servo_pos(4) As Byte
Do
Servo_pos(1) = Servo(1)
Servo_pos(2) = Servo(2)
Servo_pos(3) = Servo(3)
Servo_pos(4) = Servo(4)
Dim A$ As String * 1
A$ = Waitkey()
If A$ = "z" And Servo_pos(1) > 126 Then
Servo(1) = Servo_pos(1) - 1
End If
If A$ = "x" And Servo_pos(1) < 250 Then
Servo(1) = Servo_pos(1) + 1
End If
If A$ = "c" And Servo_pos(2) > 126 Then
Servo(2) = Servo_pos(2) - 1
End If
If A$ = "v" And Servo_pos(2) < 250 Then
Servo(2) = Servo_pos(2) + 1
End If
If A$ = "b" And Servo_pos(3) > 126 Then
Servo(3) = Servo_pos(3) - 1
End If
If A$ = "n" And Servo_pos(3) < 250 Then
Servo(3) = Servo_pos(3) + 1
End If
If A$ = "m" And Servo_pos(4) > 126 Then
Servo(4) = Servo_pos(4) - 1
End If
If A$ = "," And Servo_pos(4) < 250 Then
Servo(4) = Servo_pos(4) + 1
End If
Loop
End
|
Precyzja sterowania serwem zależy od częstotliwości kwarcu i parametru reload, udało mi się dojść do wielkości rzędu 0.8 stopnia (16MHz, reload = 1) ale brakuje mi zakresu w przypadku instrukcji servo() (jest ona typu BYTE i obsługuje wartości do 255) i serwo nie wykonuje obrotu w pełnym zakresie swoich możliwości. Czy można to ominąć pisząc swoją procedure obsługi serwa, i do jakich wielkości można dojść. Jak bardzo to jest skomplikowane do napisania? I pytanie z innej beczki, próbuje dogadać się z mikroprocesorem przez rs232 ale nie bardzo mi wychodzi, na dole widać kawałek kodu który wymyśliłem posiłkując się googlem i helpem, ale to bydle nie chce działać, można prosić o jakieś wskazówki?
//zmieniłem kod na taki jaki mam obecnie, żeby nie wklejać kolejnego prawie że identycznego kawałka kodu w kolejnym poście. Transmisja rs232 działa już jak należy |
Temat: Funkcja "CONFIG SERVOS" w Bascomie |
jogurt_wisniowy
Odpowiedzi: 10
Wyświetleń: 1132
|
Forum: Mikrokontrolery Wysłany: 31 Mar 07 08:08 Temat: Funkcja "CONFIG SERVOS" w Bascomie |
| Teraz kolejne pytanie jak widać w mojej poprzedniej wiadomości zmiana kątu serwa jest dokonywana co jeden krok po wykryciu naciśnięcia odpowiedniego znaku. Chciałbym jednak żeby obrót był dokonywany przy pomocy jakiejś dłuższej sekwencji znaków (np: A10 wtedy mógłbym to przerobić takżeby serwo A obróciło się za jednym zamachem o 10 kroków) Jaką instrukcję do tego użyć? bo kombinowałem z inkey, input i jakoś niespecjalnie mi to wychodzi. Nie wiem czy to ma jakieś znaczenie ale układ na razie testuje nie na rzeczywistym modelu lecz w Proteusie. |
Temat: PWM na atmega32 w C |
jogurt_wisniowy
Odpowiedzi: 3
Wyświetleń: 1138
|
Forum: Mikrokontrolery Wysłany: 15 Lut 08 02:11 Temat: PWM na atmega32 w C |
witam, potrzebuję pomocy przy rozgryzieniu PWM dla atmega32 (16MHz) docelowo jest to potrzebne do sterowania prędkością silników z wykorzystaniem mostka H. Chciałbym to napisać w C, mam gotowy kod w bascomie z ks ekspert, ale w żaden sposób nie mogę przenieść tego do C. Tak w ogóle to dopiero zaczynam moją przygodę z elektroniką i programowaniem, poprzeglądałem już kilka kodów źródłowych w których był stosowany pwm, ale nie mogę wyciągnąć żadnego wspólnego mianownika. Widziałem źródła programów w których cały pwm miescił sie w 4 krótkich linijkach, a były też kobyły które ciągnęły się jak makaron do spaghetti. Mój układzik wygląda tak:
http://www.wynajem-maszyn.pl/poligon/sumo/sumo.gif
a kod źródłowy który na razie udało mi się do tego stworzyć prezentuje się tak:
| Kod: | #include <avr/io.h>
#include <util/delay.h>
#include <avr/interrupt.h>
#include <avr/signal.h>
#include <stdlib.h>
#include "lcd.c"
#define cbi(sfr, b) (sfr &= ~(1<<b)) // bit 0 na pin portu
#define sbi(sfr, b) (sfr |= (1<<b)) // bit 1 na pin portu
// lewe kolo PortB 7,6
// prawe kolo PortB 4,5
// lewe kolo enable PORTD 5
// prawe kolo enable PORTD 4
long i2=0;
void delay_ms(uint16_t ms)
{
while(ms)
{
_delay_ms(1);
ms--;
}
}
// sterowanie kolami
void lkp() { cbi(PORTB,7); sbi(PORTB,6); sbi(PORTD,5); } // lewe koło przód
void lkt() { sbi(PORTB,7); cbi(PORTB,6); sbi(PORTD,5); } // lewe koło tył
void lks() { cbi(PORTB,7); cbi(PORTB,6); cbi(PORTD,5); } // lewe koło stop
void pkt() { sbi(PORTB,5); cbi(PORTB,4); sbi(PORTD,4); } // prawe koło tył
void pkp() { cbi(PORTB,5); sbi(PORTB,4); sbi(PORTD,4); } // prawe koło przód
void pks() { cbi(PORTB,5); cbi(PORTB,4); sbi(PORTD,4); } // prawe koło stop
//sterowanie jazdą
void przod() { lkp(); pkp(); } // jazda do przodu
void tyl() { lkt(); pkt(); } // jazda do tyłu
void lewo() { lkt(); pkp(); } // skręt w lewo
void prawo() { lkp(); pkp(); } // skręt w prawo
void stop() { lks(); pks(); } // wyłącz silniki
int main(void)
{
DDRD = 0xff; // port D jako wyjscie
DDRB = 0xff; // port B jako wyjscie
//lcd_init(LCD_DISP_ON);
przod(); // jedz do przodu
//lcd_puts("Przod");
delay_ms(2000); // przez 2 sekundy
stop(); // stop
delay_ms(2000); // przez 2 sekundy
lewo(); // skret w lewo
delay_ms(2000); // przez 2 sekundy
prawo(); // skret w prawo
delay_ms(2000); // przez 2 sekundy
tyl();
stop(); // zatrzymaj silniki
} |
To są moje początki w C także wszelkie optymalizacje mile widziane, ten kod powyżej nie jest do końca mojego autorstwa, jest wypadkową kilku rozwiązań jakie udało mi się znaleźć. Obszerne komentarze do ewentualnego kodu mile widziane |
Temat: PWM na atmega32 w C |
jogurt_wisniowy
Odpowiedzi: 3
Wyświetleń: 1138
|
Forum: Mikrokontrolery Wysłany: 17 Lut 08 11:02 Temat: PWM na atmega32 w C |
| yuuichi napisał/a: | | wydaje mi sie ze masz malutki blad przy funkcji do skretu w prawo, bedzie wtedy jechal do przodu bo masz wpisane lkp i pkp. |
faktycznie
dzięki abxyz za kod,wstępnie w proteusie coś tam się kręci próbuję rozgryźć jak to działa, na razie znalazłem takie coś:
Generating PWM signals using Timers in the ATMega chip myślę ze z pomocą Twojego kodu i tej strony jakoś sobie poradzę |
Temat: [C] ADC w atmega8 |
jogurt_wisniowy
Odpowiedzi: 3
Wyświetleń: 592
|
Forum: Mikrokontrolery Wysłany: 30 Sie 08 05:10 Temat: [C] ADC w atmega8 |
Dorobiłem się w końcu swojej własnej płytki testowej, zaczynam powoli programować na prawdziwym układzie, a nie symulatorze i pojawił się pierwszy problem, którego nie potrafię przeskoczyć sam.
Krótkie info:
uP: Atmega8 16MHz
Diody Led podpięte pod Portc.0 i PortC.1
Sharp podpiety pod Portc.3
W bascomie potrafię to obsłużyć, ponizszy kod (na podstawie kursu z Komputer Świata) działa:
| Kod: |
$regfile = "m8def.dat"
$crystal = 16000000
Config Pinc.0 = Output
Config Pinc.1 = Output
Led Alias Portc.0
Declare Function Sharp() As Word
Config Adc = Single , Prescaler = Auto , Reference = Avcc
Start Adc
Led = 0
Wait 1
Led = 1
Do
If Sharp() > 256 Then
Led = 0
Else
Led = 1
End If
Waitms 25
Loop
Function Sharp_odczyt() As Word
Sharp_odczyt = Getadc(4)
End Function
End
|
niestety w C, już nie, mój dotychczasowy kod (starałem się go robić na podstawie (http://www.tkdami.net/~vo...twornik_AC.html) kompiluje się, ale odmawia współpracy:
| Kod: | #define F_CPU 16000000L
#include <avr/io.h>
#include <util/delay.h>
unsigned int pomiar; // Zmienna do przechowywania wyniku pomiaru
void delay_ms(uint16_t ms)
{
while(ms)
{
_delay_ms(1);
ms--;
}
}
void Inicjalizacja(void)
{
DDRC = 0xC0;
PORTC= 0xFF;
ADMUX |= _BV(REFS0); //napięcie odniesienia
ADMUX |= _BV(REFS1);
// Wybranie sposobu zapisu wyniku z wyrównaniem do lewej (osiem starszych bitów wyniku w rejestrze ADCH)
ADMUX |= _BV(ADLAR);
// Zezwolenie na konwersję
ADCSRA |= _BV(ADEN);
// Wybranie częstotliwości dla taktowania przetwornika
ADCSRA |= _BV(ADPS0);
ADCSRA |= _BV(ADPS1);
ADCSRA |= _BV(ADPS2);
}
int main(void)
{
Inicjalizacja();
PORTC |= _BV(0);
PORTC |= _BV(1);
while(1)
{
ADCSRA |= _BV(ADSC); // Rozpoczęcie przetwarzania
delay_ms(25); // Oczekiwanie na zakończenie przetwarzania
pomiar=ADCH;
if (pomiar > 256)
{
PORTC |= _BV(0);
} else
{
PORTC &= ~_BV(0);
}
delay_ms(25);
}
} |
Mógłby ktoś pomóc mi przerobić ten bascomowy kod? Przede wszystkim jak powiedzieć uP że chcę odczytać dane z przetwornika ADC3? Z tego co pisze w dokumentacji służą do tego rejstry MUX3:0, ale nie wiem jak z nich skorzystać. Prosiłbym o obszerne komentarze, bede bardzo wdzięczny bo z C jestem zielony jak trawa na wiosnę, a mimo wszystko chciałbym opanować ten język. |
Temat: [C] ADC w atmega8 |
jogurt_wisniowy
Odpowiedzi: 3
Wyświetleń: 592
|
Forum: Mikrokontrolery Wysłany: 31 Sie 08 01:56 Temat: [C] ADC w atmega8 |
No niestety nie potrafię tego uruchomić, ostateczny kod:
| Kod: |
void Inicjalizacja(void)
{
DDRC = 0x3; //00000011
PORTC= 0xFF;
ADMUX |= _BV(REFS0);
// Wybranie sposobu zapisu wyniku z wyrównaniem do lewej (osiem starszych bitów wyniku w rejestrze ADCH)
ADMUX |= _BV(ADLAR);
// Wybór kanału wejścia - PC3 (ADC3)
ADMUX |= _BV(MUX1)|_BV(MUX0);
// Zezwolenie na konwersję
ADCSRA |= _BV(ADEN);
// Wybranie częstotliwości dla taktowania przetwornika
ADCSRA |= _BV(ADPS0);
ADCSRA |= _BV(ADPS1);
ADCSRA |= _BV(ADPS2);
}
int main(void)
{
Inicjalizacja();
PORTC |= _BV(0); //dioda żółta zgaszona
PORTC |= _BV(1); //dioda zielona
delay_ms(1000);
PORTC &= ~_BV(1); //zaświeć
PORTC &= ~_BV(0); //zaświeć
delay_ms(1000);
while(1)
{
ADCSRA |= _BV(ADSC);
delay_ms(25);
pomiar=ADCH;
if (pomiar > 256)
{
PORTC |= _BV(0);
PORTC &= ~_BV(1);
} else
{
PORTC &= ~_BV(0);
PORTC |= _BV(1);
}
delay_ms(100);
}
|
Mam nadzieję ze poprawiłem wszystko tak jak trzeba. |
Temat: Część 1-Kurs programowania uC AVR w C (WinAVR, Kurs AVR-GCC) |
jogurt_wisniowy
Odpowiedzi: 37
Wyświetleń: 2119
|
Forum: Ogłoszenia Wysłany: 02 Paź 08 10:15 Temat: Część 1-Kurs programowania uC AVR w C (WinAVR, Kurs AVR-GCC) |
| Jestem na razie pod wrażeniem, widać ze włożyliście w pierwszą część dużo pracy, mam nadzieję że dalej będzie tak samo dobrze. Mam tylko jedną uwagę i to natury estetycznej, a nie merytorycznej. U mnie pod firefoxem 3 listing kodu wyświetla się w Times new roman, pod wszystkimi innymi przeglądarkami (opera chrome, IE) jest ok. Moglibyście to poprawić? |
| |