Yrobot

Pochlubte se svým robotem ostatním!
Odpovědět
Baworek

Re: Yrobot

Příspěvek od Baworek »

Ahoj.
V pohode som sa veľmi dosť toho naučil síce to moc nevidno ale vážim si toho :)
Mne toho moc nešlo do hlavy čo pod "switch_read" mam pozerať... :D
Akurát

No čo to robí:
No ak je pod stredným snímačom čierna páska tak svietia obe ledky...
Lavy/Pravý tak isto svieti pod ich smerom ledka Prava=prava led...

Ešte sa k tomu bude niečo dopisovať ? :)
Raz som počul že keď sa bude ten robotík hýbať po čiare a niejak sa to nakoduje tak si zapametá to ako išiel a spraví to aj bez senzora :D

Skúsil som upraviť aj jeho chod...
Nakoľko nemám toľko čiernej izolačky skúsim to zajtra kúpim ju..

Kód: Vybrat vše

  	while(1)
  	{
	  	// zakladni nekonecna smycka
	  	if (cara_je(UPROSTRED)) {led_on(LED_7|LED_8); motor_run(100, -100);}
	  	else if (cara_je(VLEVO)) { led_on(LED_7); led_off(LED_8); motor_run(100, 0); }
	  	else if (cara_je(VPRAVO)) { led_off(LED_7); led_on(LED_8); motor_run(0, -100); }
  	}

Akurát rozmýšľam čo ti dám za pomoc :)
No ešte si lámem nad jedným hlavu :) Ak si trúfaš mi pomôcť :)

Troška ti to popíšem...
Pod každým jedným koleskom je senzor...
(Na kolese z nútornej strany čierno-bieli pásik...)

Ja sa snažím aby mi po dajme tomu 20otáčkach zastavil...
Ototočil sa o 90stupňov a pokračoval zas 30krokov a zas zastavil... a tak...

Tu je môj prvý krok stým no som len na začiatku... :D

Kód: Vybrat vše

int main(void)
{
	init_led_motor();							// Initializacia motorov a lediek.
	init_encoder();								// Initializacia koderov.
	
	initSegDisplay();							// Initializacia displeja.
	display_dec(0);								// Nastavenie pociatocnej hodnoty na zobrazenie.
    while(1)
    {
		
         if(is_low(PINB,PB2))			// Stlacenim tlacidla SW2 sa zapnu motory.
         {	
	         motor_run_increment(100, -100);		
			 				
	         while(is_low(PINB,PB2)){}	// Protizakmitove cakanie.
			
         }
		 
		 if (g_encoder.left==20)
		 {
			 motor_set(0, 0);
			 encoder_reset();
		 }
		 
		if(is_low(PINB,PB3))			// Stlacenim tlacidla SW3 sa kodery resetuju. 
		{
			tbi(GICR,INT0);				// Zmena povolenia externeho prerusenia.
			tbi(GICR,INT1);
			encoder_reset();			
			display_dec(0);
			while(is_low(PINB,PB3)){}	// Protizakmitove cakanie.
			
			
		}
		
    }
AlesH
Příspěvky: 323
Registrován: 25 úno 2013, 09:18

Re: Yrobot

Příspěvek od AlesH »

OK, Tvůj popis očekávaného chování LED je solidní. Zkus ale ještě doplnit, co by ty LED měly ukazovat nad bílou plochou (když pod žádným z čidel není čára).

Doplnění programu o řízení motorů je také v principu dobře (použití funkce "motor_run"). Proč si ale myslíš, že Yrobot pojede rovně zrovna po příkazu "motor_run(100, -100)"? Už jsi program reálně otestoval? Podle mne se robot hýbat bude, ale čáru moc sledovat nebude (spíš se jí bude vyhýbat a ani dopředu moc nepojede). Napiš sem výsledky svého reálného experimentu.

Zapamatování tratě a využití enkoderů na kolech jsou zajímavé náměty, ale doporučuji nejprve dotáhnout základní použitelný "sledovač čáry".

P.S. (edit): Zjistil jsem, že při použití "motor_run" zřejmě LEDky blikají samy (indikují chod enkoderů), takže se to bude prát s naší LED signalizací (tu naši LED signalizaci tedy můžeme z programu odstranit ... místo toho ale můžeme případně použít signalizaci na sedmisegmentovkách 8-) )
Baworek

Re: Yrobot

Příspěvek od Baworek »

Ledky na bielej...
Ak je Lavy/stredný na bielej svieti len LED_8 a naopak z LED_7... :)

Motor_run(100, -100) prečo to tak je ?
Ak nechám (100, 100) tak sa točí dokola... keď dám tam -100 ide rovno... :D
To preto že sú motory obrátené zrhadlovo...

Reálny experiment... (Aj ti ho dám na YT cca poobede...)

Robot ide rovno v pohodičke po čiernej paske... Asi 2-5sec. :D
Akonáhle však odíde stredný snímač z čiary ide si jak chce...
Ale ak mu pomáham... Že ak vide moc z čiary tak ho vrátim tak prejde v pohode :D

Čo si myslím že prečo to tak je...

Ak napíšem jednoduchý program while aby išiel len rovno teda motor_run (100, -100);
On nejde rovno... Obe kolesá sa točia ale ide buď troška doprava alebo dolava...
Opisuje doslova kružnicu...
Preto som premýšlal že použiť encoder na to aby mu senzory pod kolesami ratal otačky jednotlivých koliesok... Aby sa zbytočne nestrácal kdesi :D

P.S : LED signalizáciu som odstránil a rýchlosť zmenil na 150 :) a segmentovku :D fuu skusim :D
Čo povieš ?

Kód: Vybrat vše

		if (cara_je(UPROSTRED)) {
			u16 adc_res = adc_read();
			motor_run(150, -100); 
			led_display_hex(adc_res>>2); 
			delay_ms(100);
			}
AlesH
Příspěvky: 323
Registrován: 25 úno 2013, 09:18

Re: Yrobot

Příspěvek od AlesH »

Zajímavé výsledky.

Popis LED nad bílou je OK. V zásadě záleží na tom, který ze snímačů byl předtím nad černou. Pokud bys začal na bílém papíře, nerozsvítila by se ani jedna LED (záleží ale na celém programu, který jsi tu ještě nezveřejnil [úplně celý kód]).

Ohledně "motor_run(100, -100)" je to zajímavé. V tom ukázkovém Demu to mají zapsané jinak (jako 100,100), takže z toho odvozuji, že to jejich Demo zřejmě funguje špatně (jinak než mají v komentářích). Ale OK, beru Tvoji informaci jako ověřenou (od toho je právě to reálné experimentování).

Ohledně sledování čáry si musíš uvědomit, že když je čára vlevo, tak musíš točit víc pravým kolem (aby ses vracel nad čáru). Ve svém programu to máš přesně obráceně (když je čára vlevo, točíš jen levým motorem, takže ve skutečnosti zatáčíš vpravo, tedy "od čáry"). Když to "zatáčení" otočíš, mělo by to fungovat solidně (a to dokonce i nezávisle na enkodérech a na vzájemné přesnosti točení kol). Enkodéry zatím opravdu nemusíme řešit.

Nakonec ještě k té signalizaci na sedmisegmentovkách. Tvůj návrh by "něco" zobrazoval, ale nebylo by to nic moc užitečného. Pokoušíš se znovu měřit hodnotu čidla a pak ji zobrazovat. To při jízdě podle mne už nemá smysl (a také si musíš uvědomit, že každé volání "adc_read" trochu "zdržuje program", což nechceme [hlavně tam, proboha, nedávej to "delay_ms(100)"]). Myslel jsem spíš zobrazovat něco jako 11, 01 a 10 podle už vyhodnoceného stavu snímačů. Dal jsem ale také k tomu svému "signalizačnímu námětu" smajlík, takže to neber moc vážně a klidně se na tu signalizaci komplet vykašli.
Baworek

Re: Yrobot

Příspěvek od Baworek »

Tu je ten kodik:

Kód: Vybrat vše

/*
 * Robot_yellow.c
 *
 * Created: 17. 3. 2015 8:39:21
 *  Author: Baworek
 */ 


#include "yellow_robot.h"

#define VLEVO	PA0
#define UPROSTRED	PA1
#define VPRAVO	PA2
#define OPT_PORT	PORTA
#define OPT_DDR		DDRA

void initOPT() {            
	OPT_DDR  &= ~((1<<VLEVO)|(1<<UPROSTRED)|(1<<VPRAVO));  
}

u8 cara_je(u8 snimac) {    
	adc_channel_set(snimac);  
	u16 adc_res = adc_read();     
	if (adc_res>500) return 1;    
	return 0;                 
}

int main() {
	init();  
	initOPT(); 

	while(1) {  
		if (cara_je(UPROSTRED)) {motor_run(150, -150); }
		else if (cara_je(VLEVO)) { motor_run(0, -150); }
		else if (cara_je(VPRAVO)) { motor_run(150, 0); }
	}
}
Ohľadom toho dema že tam je motor_run (100, 100) ak nahram to demo tak ako je tak sa robot točí po stlačení SW_3 tuším dokola :) preto tam je to -100 :D

Tak pomenil som aj to čo si písal že to mam naopak... Je to v kode už v tomto čo tu máš upravené...

Jediný effekt zaberá že sníma čiaru keď tam je 100vka bo ide pomalšie a stíha si ešte uvedomiť že ide po nej ale len rovno to vie isť :D nie dlho...
Pri 150tke to ide jak chce...
AlesH
Příspěvky: 323
Registrován: 25 úno 2013, 09:18

Re: Yrobot

Příspěvek od AlesH »

Díky za celý kód. Je z něj vidět, že pokud při zapnutí bude stát Yrobot na bílé ploše (zcela mimo čáru), tak se nerozjede. To je ale asi OK a může to tak zůstat.

Pokud Yrobot při sledování čáry "hapruje", tak to je špatné a musíme to "odladit". Příčin problému může být více. Například:
- program funguje jinak, než očekáváme ("cara_je" nebo "motor_run" se chová jinak, než si myslíme)
- při jízdě dochází k rušení a "adc_read" vrací nestabilní hodnoty
- program běží pomaleji než je nutné a uhýbající čára tedy není včas zaregistrována
- možná bude výhodnější v programu preferovat zatáčení, než jízdu rovně

Řekl bych, že pro ladění bude dobré do programu přece jen přidat nějakou signalizaci. Nejprve zkusme tu nejjednodušší, pomocí sedmisegmentovek, jak jsem popisoval minule. Třeba takto:

Kód: Vybrat vše

      if (cara_je(UPROSTRED)) {
        motor_run(150, -150);
        led_display_hex(0x11);  // signalizace jizdy rovne
      }
      else if (cara_je(VLEVO)) {
        motor_run(0, -150);
        led_display_hex(0x10);  // signalizace toceni vlevo
      }
      else if (cara_je(VPRAVO)) {
        motor_run(150, 0);
        led_display_hex(0x01);  // signalizace toceni vpravo
      }
Zkus to upravit a natočit (nebo popsat) výsledek, tedy co to dělá při jízdě. Pokud by příčinou problémů bylo rušení, mělo by to být poznat i na této základní signalizaci (rychlé problikávání nul a jedniček na sedmisegmentovce). Uvidíme. Podle výsledku to budeme dál řešit.
Baworek

Re: Yrobot

Příspěvek od Baworek »

Dobre zmenim ten kodik...

Na jedno som však prišiel aj ti to natočim ak sa mi podarí...
Ak nastavím rýchlosť na 90... Nie uplne presne alebo furt... Prejde po okruhovej dráhe len trochu čudne a vyletí z nej...

Ďalšia vec... Ak ho zapnem a držím v ruke tak sa mu točia kolieska :D

Tak tu je video ako to frčí keď tam je motor_run(150, -150)...
https://m.youtube.com/watch?v=0RDFhnFchk4
Neskôr ti ukaže ako to ide aj zo segmentovkami na ryclosti 90 :)
AlesH
Příspěvky: 323
Registrován: 25 úno 2013, 09:18

Re: Yrobot

Příspěvek od AlesH »

Možná by se situace mohla zlepšit změnou rozhodovací úrovně v "cara_je". Třeba z 500 na 600 nebo i 700 (nebo naopak méně?). Jestli to bude mít smysl uvidíme podle výsledků testů. Zkus případně ještě snížit rychlost na 50 nebo i méně (pokud to pak ještě jede).

Edit1: Teď jsem si teprve prohlédnul to Tvoje dnešní video a připadá mi to tak, že je problém s levým čidlem čáry. Obával jsem se toho ovlivňování trimrem z Yrobota a pořád se toho bojím. Neotáčel jsi v posledních dnech s tím trimrem? Každopádně to vypadá tak, že pro levé čidlo zřejmě budeme muset nastavit extra jinou rozhodovací úroveň. Přesto ještě zkus ten pokus se signalizací na sedmisegmentovkách.

Edit2: Pokud dobře vidím chování čidel a točení kol, tak to teď reaguje opačně, než by mělo (uhýbá to od čáry). Není tedy jisté, jestli máme dobře pojmenovaná ta čidla (jestli VLEVO je opravdu vlevo a VPRAVO je opravdu vpravo). Navrhoval jsem to podle dokumentace, ale ta může být nepřesná. I to by se ale mělo ukázat tou signalizací.
Baworek

Re: Yrobot

Příspěvek od Baworek »

Takže skúšal som meniť aj tú hodnotu...
Najprv 600,700 a potom 400,300 no nevidel som žiaden viditeľný rozdiel maximálne že pri 300 mi to viac vynechávalo...

Tu máš výsledok testu...
Je tam nahodená aj segmentovka je to tam aj vidieť že to funguje a ukazuje hodnoty čo má pri snímaní...
Motor bol nastavený (60, -60)...

https://www.youtube.com/watch?v=cPzzz8uipio
AlesH
Příspěvky: 323
Registrován: 25 úno 2013, 09:18

Re: Yrobot

Příspěvek od AlesH »

OK, vypadá to docela nadějně, jen je to hodně nespolehlivé. Zatím mi není moc jasné, proč to tu druhou zatáčku nezaregistrovalo (když první zatáčku to projelo dobře).

Jako první "opravný pokus bych zkusil preferovat zatáčení (místo preference jízdy rovně). Toho lze dosáhnout např. tak, že z podmínek vyhodíme "else" což znamená, že "vyhraje" ta poslední splněná podmínka (a ne ta první jak to bylo předtím). V následujícím kódu je to provedeno (a navíc jsem tam udělal i výraznější signalizaci zatáčení, aby to bylo lépe vidět):

Kód: Vybrat vše

      if (cara_je(UPROSTRED)) {
        motor_run(60, -60);
        led_display_hex(0x11);  // signalizace jizdy rovne
      }
      if (cara_je(VLEVO)) {
        motor_run(0, -60);
        led_display_hex(0xEE);  // signalizace toceni vlevo
      }
      if (cara_je(VPRAVO)) {
        motor_run(60, 0);
        led_display_hex(0x33);  // signalizace toceni vpravo
      }
Uvidíme, jaký bude výsledek.

P.S.: Jako rozhodovací hodnotu zkus teď třeba až těch 700.
P.S.2: Nech Yrobota jet po čáře oběma směry (i do levých zatáček), abychom viděli, jestli nehapruje jenom některý ze senzorů.
Odpovědět