Skocz do zawartości

Skynet


OldSkull

Pomocna odpowiedź

Podoba Ci się ten projekt? Zostaw pozytywny komentarz i daj znać autorowi, że zbudował coś fajnego!

Masz uwagi? Napisz kulturalnie co warto zmienić. Doceń pracę autora nad konstrukcją oraz opisem.

Widziałem na żywo, mogę się wypowiedzieć 😅

Niestety w połączeniu z gęstwiną kabli robot jest przez to po prostu brzydki

Przez grzeczność nie zaprzeczam 😋

Nie widziałem podczas samej walki, ale widziałem filmiki, robot rzeczywiście bardzo się chwieje podczas ataku, ale nie wiem czy celowo, ma fajny algorytm zajeżdżania robotów od tyłu (tak, tak, bierze je od tyłu 😃 ) Z podobnymi robotami radzi sobie całkiem dobrze.

Tylko ja zadałem pytanie: co to jest i do czego to służy? Mnie to 2 giwery przypomina 😃

Czy był on kiedyś podobny do tego z projektu z inwentora?

- 2x CNY70 - awaryjne, więc odłączyłem ich wtyczki od elektroniki

Jak CNY70 uważasz za awaryjne to obczaj sobie TCRT5000 😃

Dzięki za miłe dotrzymywanie towarzystwa na RA 😃 Bo bym się przy tym stoliku na śmierć zanudził, dodatkowo Skynet przyczyniał się chyba do ściągania nowych oglądających 😃

[ Dodano: 24-11-2010, 16:40 ]

Zastanawiam się ile gwiazdek, przekonasz mnie czymś jeszcze że zasługuje na 4? 😃 Jakiś filmik?

Link do komentarza
Share on other sites

Filmik z pierwszych testów:

tutaj jest jeszcze bardzo podobny, a CNY jeszcze działają 😉

Aktualny filmik:

jakość niestety słabiutka, robiony przy słabym świetle. Z zawodów nie mam filmów, bo jakoś tak to jest, że jak się startuje to się nei myśli o robieniu filmów własnego robota.

Z tym zajeżdżaniem od tyłu było tak, że on się szybko obraca, ale wolno startuje - musiałem mu ograniczyć ze względu na chwianie szybkość podczas szarży (przy obrocie tego problemu nie ma) i roboty, które go nie zauważą i wymijają, on atakuje z boku.

Zresztą program to ciekawostka: w pierwszym programie użyłem tylko tyle pamięci RAM ile potrzebowałem do zrobienia opóźnienia, reszta programu nie korzystała z żadnej zmiennej tylko bezpośrednio sprawdzałem zawartości rejestrów i stany nóżek. Potem trochę się zmienił, ale ogólnie jest bardzo prosty - pomimo praktycznie braku komentarzy po roku potrzebowałem 5 minut aby się połapać w kodzie.

Aktualny kod poniżej, przy okazji każdy może sobie zobaczyć 2 przydatne rzeczy:

- obsługa działającego czujnika na TSOP1736 (jak słuchałem na zawodach to nei takie oczywiste)

- działający, dokładny delay na pętli - u mnie wbudowane w gcc funkcje opóźniające zawsze generują błędy przy kompilowaniu

#include <avr/io.h>
#include <avr/interrupt.h>
#include <stdbool.h>


#ifndef F_CPU
#define F_CPU 8000000UL
#endif

#define sbi(PORT,PIN) ((PORT)|=1<<(PIN))
#define cbi(PORT,PIN) ((PORT)&=~(1<<(PIN)))

#define Pprzod sbi(PORTD, PD4);
#define Ptyl cbi(PORTD, PD4);
#define Lprzod sbi(PORTD, PD5);
#define Ltyl cbi(PORTD, PD5);

#define tyl Ptyl; Ltyl;
#define przod Pprzod; Lprzod;

#define pwmICR 2500
#define pwmstopP OCR1B=0;
#define pwmstopL OCR1A=2500;
#define pwmmaxP OCR1B=1667;
#define pwmmaxL OCR1A=833;
#define pwm50P OCR1B=833;
#define pwm50L OCR1A=1667;
#define pwm75P OCR1B=1250;
#define pwm75L OCR1A=1250;
#define pwm25P OCR1B=417;
#define pwm25L OCR1A=2083;
#define pwm33P OCR1B=556;
#define pwm33L OCR1A=1944;
#define pwm15P OCR1B=250;
#define pwm15L OCR1A=2250;

#define Lstop pwmstopL;
#define Pstop pwmstopP;
#define Stop pwmstopP; pwmstopL;

#define czas_tyl_linii 300

#define Llinii bit_is_clear(PIND,7)
#define Plinii bit_is_clear(PIND,6)
//#define Lstyk bit_is_clear(PINC,2)
//#define Pstyk bit_is_clear(PINC,3)
#define LINIA (Llinii||Plinii)

#define widziL bit_is_clear(PINC,0)
#define widziP bit_is_clear(PINC,1)

void delay(unsigned int ms);


unsigned char nr_adc, jak_dlugo_widzi;
unsigned int licznik_pomiarow;

#define widzi (widziL || widziP)
bool z_tylu;
unsigned char i=0;

void delay(unsigned int ms)	//na 8MHz działa w symulatorze z dokładnością 0.05%
{
unsigned int i;
unsigned int j;
for (i=0;i<ms;i++)
{
for (j=0;j<398;j++) 
	{
	asm volatile (
                       "WDR"::);

	}
}
}

void udelay(unsigned int ms)	//, 1 = 100us, na 8MHz działa w symulatorze z dokładnością 0.06%
{
unsigned int i;
unsigned int j;
for (i=0;i<ms;i++)
{
for (j=0;j<40;j++) 
	{
	asm volatile (
                       "WDR"::);

	}
}
}

unsigned char licznik0 = 0;
unsigned char tsopL = 0;
unsigned char tsopP = 0;
unsigned char tsop_dioda = 0;	//0 - żadna, 1 - lewa, 2 - prawa
#define TSOP_widzi bit_is_clear(PINC, PC2)
#define RED_LED1_ON sbi(PORTC,PC4);
#define RED_LED1_OFF cbi(PORTC,PC4);
#define RED_LED2_ON sbi(PORTC,PC5);
#define RED_LED2_OFF cbi(PORTC,PC5);
#define GREEN_LED_ON sbi(PORTC,PC3);
#define GREEN_LED_OFF cbi(PORTC,PC3);

ISR(TIMER0_OVF_vect)
{
licznik0++;
licznik0 %= 30;	//122/4 to 1s
TCNT0 = 0;

if (TSOP_widzi)
{
tsopL = 0;
tsopP = 0;
RED_LED1_OFF
RED_LED2_OFF
if (tsop_dioda == 1) tsop_dioda = 2;
	else tsop_dioda = 1;
return;
//break;
}	
if (tsop_dioda == 1)
{
cbi(PORTB,PB4);
}
else
{
cbi(PORTB,PB5);
}

udelay(4);	//wysyłam w sumie 21-22 impulsy
if (!TSOP_widzi)
{
switch(tsop_dioda)
	{
	case 1: tsopL = 0; tsop_dioda = 2; RED_LED1_OFF break;
	case 2: tsopP = 0; tsop_dioda = 1; RED_LED2_OFF break;
	default: tsop_dioda = 1; break;
	}
//wyłączenie nadawania
sbi(PORTB,PB4);
sbi(PORTB,PB5);
return;
//break;
}	
udelay(2);
if (!TSOP_widzi)
{
switch(tsop_dioda)
	{
	case 1: tsopL = 0; tsop_dioda = 2; RED_LED1_OFF break;
	case 2: tsopP = 0; tsop_dioda = 1; RED_LED2_OFF break;
	default: tsop_dioda = 1; break;
	}
//wyłączenie nadawania
sbi(PORTB,PB4);
sbi(PORTB,PB5);
return;
//break;
}	
//wyłączenie nadawania
sbi(PORTB,PB4);
sbi(PORTB,PB5);
udelay(4);
if (TSOP_widzi)
{
switch(tsop_dioda)
	{
	case 1: tsopL = 0; tsop_dioda = 2; break;
	case 2: tsopP = 0; tsop_dioda = 1; break;
	default: tsop_dioda = 1; break;
	}
return;
//break;
}
else
{
switch(tsop_dioda)
	{
	case 1: tsopL = 1; tsop_dioda = 2; RED_LED1_ON break;
	case 2: tsopP = 1; tsop_dioda = 1; RED_LED2_ON break;
	default: tsop_dioda = 1; break;
	}
}	
}

int main(void)
{
  DDRB = 0b00111110;	//czujnik 36kHz i  pwm na wyjście
  DDRD = 0b00110000;	
  DDRC = 0b00111000;	//posrt C na wejście, jedynie diody na wy
  PORTC = 0b00000100;	//podciągnięcie TSOPa do 5V
  PORTB = 0x00;
  PORTB = 0b00110000;
  PORTD = 0x00;

  //włącznaie pwma
  TCCR1A =_BV(COM1A1)|_BV(COM1B1)|_BV(WGM11)|_BV(COM1A0);
  TCCR1B =_BV(CS11)|_BV(WGM13);
  pwmstopL;
  pwmstopP;
  ICR1=pwmICR;
  Lstop
  Pstop


sbi(PORTB, PB0);			//podciagniecie przycisku	

sbi(PORTC, PC0);			//podciagniecie sharpa	
sbi(PORTC, PC1);			//podciagniecie sharpa	
sbi(PORTC, PC2);			//podciagniecie przycisku	
sbi(PORTC, PC3);			//podciagniecie przycisku	
while (bit_is_set(PINB,0));	//czekanie na wcisniecie przycisku startu


delay(5000);


pwmmaxP;
pwmmaxL;
Ptyl;
Ltyl;
delay(250);
Pprzod;
Lprzod;
Pstop;
Lstop;

/*	koniec bloku uruchamiania przetwornika ADC	*/

TCCR0 = _BV(CS02)|_BV(CS00); //preskaler 1024	256
TIMSK |= _BV(TOIE0);
TCNT0 = 0;

//ustawianie generatora 36kHz
TCCR2 = _BV(WGM21)|_BV(COM20)|_BV(CS20);	//preskaler 1, tryb CTC toggle
OCR2 = 110;
tsop_dioda = 1;


  sei();		//zezwolenie na przerwania globalne

  while(1)
{
Lprzod;
Pprzod;
Ltyl

if (!widzi&&!LINIA)
{
GREEN_LED_OFF

if (tsopL && (tsopP == 0) && !LINIA)
{
Lprzod;
Pprzod;
pwm75L
pwm15P
}
else if (tsopP&& (tsopL == 0) && !LINIA)
{
Lprzod;
Pprzod;
pwm75P
pwm15L
}
else if (licznik0 > 15)		//niech jedzie wężykiem
{
Pprzod
Ltyl
pwmmaxL;
pwm25P;
}
else
{
Lprzod
Ptyl
pwmmaxP;
pwm25L;
//pwm15L;
}	//if (licznik_pomiarow > 4500)
}	//if (!widzi)
else if (!LINIA)
{
Lprzod;
Pprzod;
GREEN_LED_ON
pwm75L;
pwm33P;
//jeżeli widzi jednym to jedzie po łuku, jeżeli obydwoma to szarżuje
if (widziL)
	{
	//pwm50P;
	}
if (widziP)
	{
	//pwmmaxL;
	}
delay(350);
}

if (Plinii) 
{
Ptyl;
Ltyl;

delay (czas_tyl_linii);
Pprzod;
delay (200);

for (i=0; i<35;i++)
{
if (!widzi) delay (3);
else break;
}
Pprzod;
Lprzod;
}


if (Llinii) 
{
Ptyl;
Ltyl;
delay (czas_tyl_linii);
Lprzod;
delay (200);
for (i=0; i<35;i++)
{
if (!widzi) delay (3);
else break;
}


Lprzod;
Pprzod;

}

}	//while(1)


}	//main()

PS: nie zwinę kodu, widziałem na kilku forach skrypty które to robiły 😋

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

A ja widziałem 😉 Urodą nie grzeszy 😋 ale był godnym przeciwnikiem ( przegrałem...) 😋 nawet raz obydwoje żeśmy się zawiesili (znaczy roboty) 😉 też mam jakąś walkę więc potem mogę wrzucić (w dobrej jakości) 😉 hehe do zobaczenia na kolejnych zawodach 😎

Link do komentarza
Share on other sites

Miałeś jakieś problemy z sharpem? Nie jest przypadkiem tak, że trochę za szybko się krecisz? Co za tym idzie, nie możesz wycelować w przeciwnika? Popracuj nad estetyką kodu 😉

Link do komentarza
Share on other sites

Powiem tak: więcej problemów wynika z tego, że mu sie unosi przód niż z tego, że się kręci.

No, ale robot ma wyraźny problem, żeby wycelować w przeciwnika.

A kod jest przecież bardzo czytelny, nie wiem o co Ci chodzi 😋

Żartujesz prawda? 🙂

Link do komentarza
Share on other sites

Nie żartuję. Co tutaj jest nieczytelnego? Przyznaję, że w paru miejscach brakuje wcięć i w kilku zostały resztki początkowego kodu, ale poza tym jest moim zdaniem bardzo czytelny.

Link do komentarza
Share on other sites

Bądź aktywny - zaloguj się lub utwórz konto!

Tylko zarejestrowani użytkownicy mogą komentować zawartość tej strony

Utwórz konto w ~20 sekund!

Zarejestruj nowe konto, to proste!

Zarejestruj się »

Zaloguj się

Posiadasz własne konto? Użyj go!

Zaloguj się »
×
×
  • 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.