Yrobot

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

Re: Yrobot

Příspěvek od Baworek »

Takže mi odpísal:

V tom navode to bolo na scheme nakreslene chybne (cisla pinov), tie infra-led potrebujete napajat neustale (prepojim priamo na napajanie, nie cez tranzistor - ten je tam iba ak by sme chceli aplikovat nejake pokrocilejsie algoritmy - vypinat/zapinat), co sa ultrazvuku tyka, prepajate K3/5 s K2/3.

Z toho asi tak rozumiem že:

Tranzistor t.j. zapojenie (3a2) je na pokročilé funkcie...
Takže sa budeme držať pri spojení (1a2) t.j. senzory+sonar :)
AlesH
Příspěvky: 323
Registrován: 25 úno 2013, 09:18

Re: Yrobot

Příspěvek od AlesH »

OK, propoj 1-2 a můžeme pokračovat.
Baworek

Re: Yrobot

Příspěvek od Baworek »

Ahoj.

Už som konečne doma. Dnes ak sa mi to podarí tak to prepojím...
A môžeme už na tom pracovať vlastne :)
AlesH
Příspěvky: 323
Registrován: 25 úno 2013, 09:18

Re: Yrobot

Příspěvek od AlesH »

Takže budu předpokládat, že spojení plošek 1-2 u propojky S1 zajistí trvalé napájení IR LED snímačů na OPT modulu (i když to neodpovídá schématu). To zatím stačí, sonaru se můžeme věnovat někdy později. Rozhodně by bylo užitečné to spojení Ucc a středu S1 "propísknout" multimetrem.

Ke zprovoznění sledovače čáry nám pak chybí dva body (podle návrhu z 25.2.2015):
3. Otestovat funkčnost OPT modulu programem pro čtení stavu snímačů a signalizací stavu pomocí LED. [OPT modul je snad funkční, ale nemáme SW]
4. Doplnit signalizaci o reálné ovládání motorů Yrobota a zprovoznit základní algoritmus sledování čáry. [algoritmus navržen, ale chybí funkční čtení OPT modulu]

Pro bod 3. potřebujeme:
- rozumně nadefinovat vhodné názvy (VLEVO, UPROSTRED, VPRAVO, OPT_DDR)
- nastavit správně piny portu, na kterém je připojen OPT modul
- napsat funkci "cara_je(snimac)", která určí, jestli je pod daným snímačem čára, nebo ne
- použít výsledku funkce "cara_je" k signalizaci stavu snímačů pomocí LED na Yrobotu (nebo pomocí LED sedmisegmentovek na Yrobotu)

Názvy jsou jasné a můžeme je nadefinovat např. takto:

Kód: Vybrat vše

#include "yellow_robot.h"   // vlozeni HAL knihovny pro abstrakci od HW Yrobota (tim ziskame i radu uzitecnych funkci)
#define VLEVO	PA0         // OPT snimac vlevo (vstup, ADC0)
#define UPROSTRED	PA1     // OPT snimac uprostred (vstup, ADC1)
#define VPRAVO	PA2         // OPT snimac vpravo (vstup, ADC2)
#define OPT_PORT	PORTA   // OPT modul je na portu A
#define OPT_DDR		DDRA    // registr pro nastaveni smeru pinu pro OPT modul
Pro správné nastavení pinů je třeba vědět, že pokud u AVR (atmega16) chceme nastavit pin jako vstupní, musíme příslušný pin jeho řídicího DDR registru nastavit na nulu. Přitom je vhodné nezměnit nastavení ostatních pinů řídicího registru. Toho lze dosáhnout používáním tzv. "přátelského kódu" ("friendly code"). Tento způsob využívá při přiřazování logické OR (|=), AND (&=) a negaci (~) pro opatrné a přesné ovládání jednotlivých bitů portu. Pokud tedy například chceme nastavit bit 1 registru OPT_DDR na nulu (a přitom zachovat nastavení ostatních bitů), tak použijeme zápis "OPT_DDR &= ~(0b00000010);" [bity se počítají zprava a od nuly, negace otočí hodnotu každého bitu a logické AND (&=) pak vynuluje jen ten bit, který je vpravo na nule, ostatní bity nechá bez změny]. Tento způsob zápisu je docela dobrý i proto, že je z něj jasné, který bit ovládáme (proto je tam ta negace). Dalším možným zápisem pro přehlednost je použití shift operátoru pro nastavení bitu podle jeho čísla, takže třeba zápis (1<<5) nastaví na jedničku 5. bit bytu (posune jedničku o 5 pozic vlevo, tedy výsledkem je 0b00100000). Místo čísla můžeme využít i definovaného nazvu, např. (1<<PA2) nastaví 2. bit bytu, protože PA2 je vlastně pojmenovaná "dvojka". Více bitů se nastavuje logickým OR (|). Třeba zápis (1<<0)|(1<<1) nastaví na jedničku bity 0 a 1, takže výsledkem je 0b00000011 (nebo v HEXA ... 0x03).

Jak tedy můžeme nastavit piny VLEVO, UPROSTRED a VPRAVO jako vstupní? To je "domácí úkol" pro zápis funkce "initOPT()":

Kód: Vybrat vše

void initOPT() {            // funkce pro inicializaci portu pro OPT modul
    // v prislusnem DDR registru nastavime nuly na bitech pro vstupy (0,1 a 2)
}
Po nastavení směru pinů budeme moci pokročit k funkci na čtení stavu snímačů. Původně jsem myslel, že zkusíme začít jednodušším binárním čtením, ale řekl bych, že přesnější a zajímavější bude rovnou zkusit analogové čtení hodnoty pomocí interního ADC převodníku v atmega16 (protože na to máme dobré funkce z vnořené knihovny "yellow_robot"). Nejprve ale musíme mít rozumně napsaný ten "initOPT()".
Baworek

Re: Yrobot

Příspěvek od Baworek »

Ešte na začiatok...

V noci mi písal autor Yrobota alebo jeden z členov vývoja toho a poslal mi správne schémy a zapojenie senzora+sonara.

Môžeš si ich aj pozrieť :)
http://uloz.to/xctpUhJM/schemy-rar

Ešte mi doplnil krátkou vetou že:
Pre využitie senzorov+sonar treba využiť zapojenie 2&3 :D :D
(vlastne sa to dá vyčítať zo schémy čo poslal)

Tak zas to prepajkovávam... :D

No už pracujem na tom čo si mi poslal...
Jedine kde sa sekám je že číslicovku som ešte na takéj urovni nepreberal preto budem troška hádať a ideálne by sa mi zdalo využiť toto: (1<<5/PA5)...
To v zátvorkách (0b00000010) je moc zložité :D či ?
AlesH
Příspěvky: 323
Registrován: 25 úno 2013, 09:18

Re: Yrobot

Příspěvek od AlesH »

Díky za nové schéma. Pokud budu předpokládat, že je správné, tak v těch původních dokumentech bylo (a je) špatně nejen schéma, ale i popis propojení. To je "fascinující" (ostudné). Přesto tu pořád dokola budu opakovat, že nejlepší je vždycky to "propísknout" multimetrem. Pro jistotu.

Jinak ohledně toho "domácího úkolu" Ti moc nerozumím, protože očekávám jen jediný řádek programu s příkazem pro nastavení portu A tak, jak je popsáno v komentáři (způsobů řešení i zápisu je celá řada a je mi jedno, jaký použiješ, hlavně abys věděl co děláš a proč).

Nevím, co si mám představit pod Tvým slovem "číslicovka", ale pokud "sedmisegmentovku", tak tu zatím můžeme nechat až na další krok. Pokud tím slovem ale myslíš "číslicovou techniku" obecně, tak jsem mimo a tvůj "slang" asi nikdy nepochopím.
Baworek

Re: Yrobot

Příspěvek od Baworek »

Ahoj...

Tak prepajkoval som to pokračujeme.
10.3.2015 Idem na "Školenie kde budú preberať tento projekt Yrobot"
Ak by si chcel niečo vedieť ohľadom tohto robotíčka stačí povedať :)

Tu je dúfam to čo si myslel že mám spraviť:

Kód: Vybrat vše

   
void initOPT(void) { // void znamena neco jako "nic" (tato funkce tedy nevraci zadnou navratovou hodnotu)
      // zatim ta funkce nedela vubec nic, ale pozdeji bude inicializovat porty a piny pro modul OPT
	  
	  DDRA = (1<<PA0)|(1<<PA1)|(1<<PA2);
	  PORTA&=~(1<<PA0)|(1<<PA1)|(1<<PA2);
	  
   }
Dúfam že to je dobre! :D
Nič iné ma nenapadá ako ich zapnúť teda myslím že to je správne. Alebo ak máš lepší nápad stačí povedať.


Číslicová technika=Číslicovka
To je to čo za zaoberá obvodami Xor,Nand a pod. vlastne to čo si mi opisoval... :D
Môj slang... :D no tak snažím sa dúfam že nemáš problémy to nie jak pochopiť... ?
Tiež si občas hovorím teda hlavne ak čítam niečo od teba tak si to prečítam aj 10x kým mi to dopne ale to preto že som v tom nový a ešte sa len začínam orientovať v tom... :)
AlesH
Příspěvky: 323
Registrován: 25 úno 2013, 09:18

Re: Yrobot

Příspěvek od AlesH »

No, bohužel, podle mne to správně není. Takže prosím, zkus popsat, proč jsi to napsal zrovna takto (tedy co by to mělo dělat a proč).
Baworek

Re: Yrobot

Příspěvek od Baworek »

Ejha nieje ?

No napadlo ma to kedže pri LEDkách čo som robil 1x som na začiatok písal niečo podobné a chápem to takto:
Aby bolo možné používať senzory. Porty PA0-3 musíme nastaviť ako výstupné piny. Tak som rátal z tým že to je ono... :D

Možno že som spravil chybu v názvoch DDRA/PORTA tam malo byť asi OPT_DDR / OPT_PORT všimol som si to v #define...


Ak už tam nie tak by sa mi asi mozog rozpadol kým by som na to prišiel... :D

Možno jeden z týchto napadov je správne:

Kód: Vybrat vše

void initOPT(void) { // void znamena neco jako "nic" (tato funkce tedy nevraci zadnou navratovou hodnotu)
      // zatim ta funkce nedela vubec nic, ale pozdeji bude inicializovat porty a piny pro modul OPT
     
     OPT_DDR = (1<<PA0)|(1<<PA1)|(1<<PA2);
     OPT_PORT&=~(1<<PA0)|(1<<PA1)|(1<<PA2);
alebo

OPT_DDR = (1<<PA0)|(1<<PA1)|(1<<PA2);
OPT_PORT&=~0xFF;
     
   }
AlesH
Příspěvky: 323
Registrován: 25 úno 2013, 09:18

Re: Yrobot

Příspěvek od AlesH »

Jdeš na to docela rozumně, ale děláš chybu v základní úvaze o nastavení pinů pro senzory. Na rozdíl od LED, je třeba tyto piny nastavit jako vstupní a to se dělá tak, že příslušné piny DDR registru se nastaví na nulu (nikoliv na jedničku jako ve všech Tvých pokusech). Napsal jsem to i do komentáře svojí "novější verze" té kostry funkce initOPT(). Musíš opravdu důkladně chápat cíl, jakého potřebuješ dosáhnout. Použití názvu OPT_DDR je lepší, ale spokojil bych se i s DDRA.

Samotné nastavení portu A (OPT_PORT nebo PORTA) má u vstupních pinů jen ten efekt, že nastavení na jedničky "1" by aktivovalo interní pull-up odpory, což pro účely IR senzorů není žádoucí. Doufám, že implicitní hodnota je "0", takže nastavení PORTA snad můžeme úplně vynechat (stačí nastavit DDRA).

Přesto ještě nechám na Tobě, abys našel použitelný způsob zápisu pro "vynulování" těch pinů pro snímače čáry. Napiš to tak, aby Ti to připadalo jednoduché a srozumitelné (je třeba vynulovat piny 0,1 a 2 DDRA, ale zbytek pinů DDRA je třeba nechat bez změny). Zkus si ještě jednou přečíst můj příspěvek z 5.3.2015 ve 20:29 (nebo třeba ty informace najdi a pochop někde jinde na internetu).

Kód: Vybrat vše

void initOPT() {            // funkce pro inicializaci portu pro OPT modul
    // v prislusnem DDR registru nastavime nuly na bitech pro vstupy (0, 1 a 2)
}
Uznávám, že pro začátečníka je to těžké, ale je to klíčové, a pak už to snad půjde snáze.
Odpovědět