Címke: ATmega644P


2017. Április 28.

Etetőhajó vezérlő összerakva

írta: Xaint

Gondoltam megosztok néhány gondolatot a már majdnem teljesen készre szerelt hajóvezérlőről. Volt néhány szabad délutánom, és már alig vártam, hogy végre összeállíthassam az egészet, a legnagyobb kérdés ilyenkor ugyanis mindig az, vajon a végén működni fog-e? laugh

Szóval, a vezérlőhöz egy KM 53 G típusú, füles műszerdobozt választottam. Ez 36 x 115 x 90 mm-es nagyságú, ebbe kellett beleférjen a GPS modul, az RF adó-vevő, a motorvezérlő IC stb.

A GPS modul egy Arduino UNO kompatibilis shield, ami megközelítőleg akkora, mint egy UNO. Mivel a hajóban bőven van hely mindenféle elektronikának, új és kisebb GPS egységet rendelni pedig nem akartam, így gondoltam itt felhasználom ezt. Mivel ez szépen beleül a vezérlőpanelen számára kialakított foglalatba, ezért némileg magasabb házra volt szükség, de annyi baj legyen, amúgy is az RF modult is cserélhetőre terveztem.. A GPS modulon egyébként integrált SD kártya foglalat van, a hozzá tartozó jelszint illesztővel együtt, illetve külső, aktív antennával rendelkezik.
 


A választott adó-vevőt már említettem egy korábbi cikkben, ami egy NRF-8PA-LNA (nrf24l01), 2.4GHz-en működő, kimeneti erősítővel ellátott és ezért >1Km hatótávolság elérésére képes modul, külső antennával. Ehhez be kellett szereznem még egy antenna hosszabbító kábelt, hogy az antennát a hajótesten kívülre tudjam vezetni. Az adó-vevő a GPS modul mellett foglal helyet a vezérlőn.
 


A motorvezérlő IC L298N Dual Full Bridge Motor Driver IC lett, melynek két független kimenetét párhuzamosan kötöttem, így megnövelve a maximális terhelhetőséget. Ez egy akkus fúró 12 voltos motorját hajtja majd meg, ez kerül ugyanis a hajóba (ami ha nem válik be, később még változhat).

A vezérlőn több szenzorcsatlakozási lehetőség is kialakításra került. Például egy GY-65 (BMP085) nyomás és hőfokmérő számára kialakított hely, amelyet vezetékkel csatlakoztathatunk, és amit egy jól kigondolt helyre kellene tennem, hogy a hajótesten kívüli levegő hőmérsékletét mérhesse. Ennek még ki kell alakítanom valamilyen vízhatlan burkolatot is.
 

 

Vízhőmérőnek egy LM335Z hőmérő IC-t  választottam, melyet epoxival egy rozsdamentes acélkupakba ragasztottam be. Ez kerül majd beépítésre a hajótest aljába fúrt lyukba.

Itt megjegyezném, hogy a vezérlőpanelen az ATmega644P minden szabad analóg és digitális lába kivezetésre került, így azokra további érzékelőket lehet kötni. Terveztem például a motorvezérlő IC hőmérsékletét figyelő hőmérő csatlakoztatását is, amely hőmérőt egyszerű 1N4148-as diódából elkészítve olcsó és kellő pontosságú eredményt ad.
 


 

A hajóban két szervóra is szükség van, az egyik a kormánylapátot vezérli, a másik az etetőanyag-tartó rekesz ajtaját nyitja. Erre a feladatra Futaba S3003 általános felhasználásra szánt szervókat választottam. A szervókat PWM-jellel a mikrovezérlő egy-egy lába vezérli. A tápellátásukról eredetileg két darab AMS1117 5 voltos feszültségszabályozó IC gondoskodott (volna). Ezek közül az egyik a kezdeti élesztés során megadta magát (a szervók terheletlenek voltak). Ez a szabályozó IC szolgáltatta a stabil 5V tápfeszt az ATmega644P mikrovezérlő számára is. A másik egyébként a GPS vevőről gondoskodott. Sajnos olyan módon lehelte ki a lelkét a kis drága, hogy a ki és bemenetét rövidre zárta, amivel a bemeneti 12V szépen megjelent a kimeneten is. Mondanom sem kell, ennek sem a mikrovezérlő, sem én nem örültem. Az előbbi az örök vadászmezőkre távozott, az utóbbi meg rendelhetett egy újabb mikrovezérlőt. angel

Olvastam, hogy ezeket a tápfeszültség szabályozó IC-ket is hamisítják... Mert gyakorlatilag lehetetlenség kinyírni őket, annyiféle védelemmel vannak ellátva (túlterhelés, túlmelegedés), melyek élesedésük esetén automatikusan lekapcsolják az IC-t. A hamisítványok viszont inkább rövidre zárják a ki és bemenetüket.

Mivel nem akartam tovább kísérletezni a kétes eredetű AMS1117 IC-kkel, így szépen kiforrasztottam őket, majd a NYÁK-on végzett kisebb módosítások után bedobtam egy LM2596 DC-DC step down szabályozót a buliba. Ez hatékonyabb is mint lineáris társaik, maximális hatásfoka ennek a modulnak 92% is lehet. Ez persze több tényezőtől is függ. A modul viszont már a vezérlő házán kívül kerül elhelyezésre, valahol az akkumulátorok felől érkező kábelre építve. Így az eddigi 12V helyett, onnan érkezik majd a stabil 5V-os tápfeszültség is.

A vezérlőn helyet kapott egy PIEZO buzzer is, ez a GPS shield alatt foglal helyet. Van még rajta továbbá egy az élesztés és hibakeresés során nagy segítséget nyúltó LED, ami egy tüskesor csatlakozóval bármire ráköthető a panelen. Illetve egy másik LED, mely fixen a mikrovezérlőre van csatlakoztatva, és ez is használható hibakeresésre, információ kijelzésre.
 

    
 

Természetesen a modellboltból rendelt alkatrészek is megérkeztek már.

A tönkcső felfogatására gyárilag kialakított furatok pontosan megegyeznek a motoron lévőkkel, így ezzel nem kell foglalkoznom. Ez valami szabvány lehet? smiley

Legközelebb igyekszem valamit a hajóról is megosztani.



2016. December 08.

Etetőhajó távirányító építés

írta: Xaint

Ugyan az etetőhajó távirányítójába szánt nyomtatott áramkör már régebb óta tervezés alatt állt, ám a gyártásához szükség volt még néhány alapanyag beszerzésére, illetve azok tesztelésére is. Ezek után azonban nem maradt más hátra, mint a távirányító összeszerelése / beüzemelése, amiről alant olvashatsz néhány gondolatot.

Nos a távirányítónak nem sikerült minden egyes funkciója azonnal működőképesre. Azonban, ahogy a hobbielektronikával foglakozók körében emlegetni szokás: szerencsére, ugyanis a hibákból rengeteget tanul az ember.

Sikerült elrontanom például az USB-TTL átalakításához használt PL2303 modul lábkiosztását a NYÁK-on. Illetve egyéb dolgokat is sikerült felcserélnem itt-ott, de semmi olyan amit egy kis átvezetékeléssel ne lehetne megoldani.

Ha az ilyen problémákra már csak az építést / élesztést követően derül fény, akkor általában megpróbálok élni velük és valamilyen megoldást találni rájuk, például az imént említett átvezetékeléssel. Természetesen, ha nagyüzemi gyártásról beszélnénk, akkor ez csak egy amolyan prototípuspanel lenne, amin a felfedezett hibák a végleges gyártósorra kerülés előtt még javíthatók. Itt azonban sorozatgyártásról nem beszélhetünk, ez egy one-off termék, így amennyire csak lehet, törekedni kell az elsőre történő hibátlan kivitelezésre (ami általában nem szokott sikerülni cheeky).

Az elkészült NYÁK tartalmaz tehát egy-két hekkelést, utólagos módosítást, de egyelőre nem gondolkodom az újragyártáson, mert az esztétikai összképet leszámítva minden tervezett funkció működik. (Viszont ez már lehetne egy olyan projekt, ami megérdemelne egy rendes nyomtatott áramkör-gyártó által készített panelt, persze csak a NYÁK-terv hibajavításai után. NYÁK-ot legyártatni még amúgysem próbáltam.)
 

 

A fenti képre tekintve nem sok változás látszik a távirányító eredeti kinézetéhez képest, a különbségeket természetesen a ház belsejében kell keresni. cheeky A kijelzőnek, illetve a tőle balra található két gombnak helyt adó területre még gyártanom kellene valamilyen dizájnos kis előlapot. Ez elfedné a kijelző feleslegesen kilátszó részeit, illetve a távirányítón eredetileg helyet foglaló potenciométer furatát is. Ez utóbbi ugyanis nem került visszaépítésre, nem láttam értelmét. A távirányítón így is 11 gomb, vagy billenő kapcsoló van, amelyek támogatása mind beépítésre került az általam tervezett NYÁK-ba. Ne feledjük, hogy ez eredetileg egy R/C helikopter távirányítója volt, ahol a billenő kapcsolók valószínűleg a különböző trimmelési funkciókat látták el. Nekünk az etetőhajó vezérléséhez ugyan biztosan nem lesz szükségünk mindre, de mivel olyan nagy gondot nem okozott a tervezésnél, így beépítettem őket.

11 gomb kezelése egyébként már önmagában is okozhat némi átláthatatlanságot a kódban, ennek elkerülése érdekében, a gombkezelés számára külön osztályokat hoztam létre:

// Button object responsible for all the button's events handling 
class SButton
{
public:
	bool isPressed() { return is_pressed; }
	bool isHeldDown() { return is_held_down; }

	// Values between lower and upper will set the button's state to pressed
	SButton(int lower, int upper) : lower_thres(lower), upper_thres(upper), 
	hold_down_min_ms(1000), is_released(true) {}

	// Values between lower and upper will set the button's state to pressed
	void setButtonThresholds(int lower, int upper)
	{
		lower_thres = lower;
		upper_thres = upper;
	}

	void setMinHoldDownTime(short min_ms) { hold_down_min_ms = min_ms; }
	short getMinHoldDownTime() { return hold_down_min_ms; }

	void Update(int raw_value)
	{
		// Detect button press
		if (raw_value > lower_thres && raw_value < upper_thres && is_released == true)
		{
			is_pressed = true;
			is_released = false;
		}
		// Detect button hold down (if it is being held down for more than hold_down_min_ms)
		else if (raw_value > lower_thres && raw_value < upper_thres)
		{
			is_pressed = false;
			if (millis() - last_time > hold_down_min_ms)
			{
				is_held_down = true;
			}
		}
		else
		{
			is_pressed = false;
			is_held_down = false;
			is_released = true;
			last_time = millis();
		}
	}
private:
	bool is_pressed;
	bool is_released;
	bool is_held_down;

	unsigned long last_time; // how long the button was held down

	int raw_pin_value;
	short lower_thres, upper_thres;
	short hold_down_min_ms; // The minimum time a button needs to be held down before it sets is_held_down to true
};

 

A 11 gombot tartalmazó, és azok inicializálásáról gondoskodó SButtons osztály:

class SButtons
{
public:
	SButton Button_Red;
	SButton Button_Left_Vertical_Up;
	SButton Button_Left_Vertical_Down;

	SButton Button_Left_Horizontal_Left;
	SButton Button_Left_Horizontal_Right;

	SButton Button_Left_Bottom_Up;
	SButton Button_Left_Bottom_Down;

	SButton Button_Right_Vertical_Up;
	SButton Button_Right_Vertical_Down;

	SButton Button_Right_Horizontal_Left;
	SButton Button_Right_Horizontal_Right;

	SButtons() :
		Button_Red(-1, 1),
		Button_Left_Vertical_Up(500, 520),
		Button_Left_Vertical_Down(680, 710),
		Button_Left_Horizontal_Right(805, 855),
		Button_Left_Horizontal_Left(910, 950),
		Button_Left_Bottom_Up(500, 520),
		Button_Left_Bottom_Down(680, 710),
		Button_Right_Vertical_Up(480, 520),
		Button_Right_Vertical_Down(680, 710),
		Button_Right_Horizontal_Left(900, 950),
		Button_Right_Horizontal_Right(800, 860)

	{}
};

 

Persze a gombok kezelése az egyszerűbb dolgok közé tartozik, hiszen a kódban ezen kívül olyan feladatokkal kell foglalkoznunk mint pl.: 

  • az adó/vevő modul kezelése (megszakítás vezérelten vagy pollozással)
  • különböző adatok küldése a hajó felé (pl.: joystick-ok állása)
  • hajó felől érkező adatok fogadása, kezelése, kijelzése, (GPS, hőmérséklet és légnyomás, stb.)
  • töltésvezérlő IC, akkumulátor figyelés
  • SD kártya kezelés (adatmentés, betöltés)
  • Rajzolás a kijelzőre
  • stb.

A fenti feladatok ellátására már össze is raktam egy kezdetleges kódot, amiben minden működik, már csak valami intuitív módon kellene komplett rendszert alkotni belőlük cool.
 

     


A fenti képen bal oldalt a főképernyő egy lehetséges megvalósítása látható. A radar alján a parttól való távolság, a radar tetején pedig a kiválasztott etetési pont (ha van) távolsága látható. A kis piros pötty jelzi a célt, ami a hajó aktuális haladási irányának megfelelően elfordulhat a kör szélén, illetve, ha a cél közelebb van mint mondjuk 10 méter, akkor a távolságnak megfelelően elindul a kör közepe felé. Látható még rajta a GPS által használt műholdak száma, a HDOP azaz kb. a GPS felbontása (minél kisebb ez a szám, annál jobb), az akkumulátor töltöttség ikon, és annak százalékos kijelzése, illetve az egyéb szenzoroktól érkező adatok (jelenleg csupán random számok). Arra is gondoltam, hogy a beállítások menüben például több előre létrehozott képernyő-elrendezés közül is lehetne választani. (Lehetne éjszakai mód képernyőtéma is...).

Az alapoktól megtervezni egy ilyen összetett rendszert nem könnyű feladat... Mindent magunknak kell kitalálni, például az információáramlás menetét. A kimenő adatcsomagok csoportosítását, küldésük gyakoriságát (mi fontos, és mi nem), vagy  a beérkező adatok kezelését, megjelenítését (mit, mikor, és hogyan jelenítsünk meg), stb. Szükség lesz egy letisztult felhasználói felületre is (bár a mostani sem annyira rossz). A lista hosszú, és még korántsem értem a végére...

Egyébként a hajó vezérlője is készülget már. Lesz benne léghőmérő, vízhőmérő, légnyomásmérő, GPS egység, SD kártya foglalat, meg egyéb nyalánkságok. A beépített GPS segítségével akár egy "return to home" funkciót is meg lehetne valósítani, vagy az etetőanyag / csali automatikus bejuttatását a kijelölt etetési pontra. Persze abban mi az élvezet...smiley

Ha egy halradar szonárját valahogyan be tudnám építeni a hajóba, akkor a távirányítóra érkező vízmélység adataiból egy egyszerűbb halradar funkciót is meg lehetne valósítani. Ha csak a medertörések látszódnak a kijelzőn már az is nagy előnyt jelentene (ezt a medertörést kirajzoló, mozgó grafikont egyébként már meg is valósítottam, a hajó felől egy ultrahangos távolságmérő szenzor adataival tesztelve egész jó lett). Az ilyen extra funkciók későbbi beépítésének lehetőségére is gondoltam, nem szeretem a mikrovezérlők kihasználatlan lábait kivezetés nélkül hagyni, ezért az összes használható láb kapott valamilyen rácsatlakozási lehetőséget. Így a NYÁK utólag is könnyen bővíthető marad.

Akkuként egy 3.7V 1730mAh kapacitású mobiltelefon akkumulátor teljesít szolgálatot, ez éppen befér az eredeti 3 AAA elem helyére. Persze elemek is bármikor használhatóak a tápellátáshoz, az USB-n keresztüli akku töltés ilyenkor nem aktív. A távirányító egy feltöltéssel történő üzemelésének idejéről sajnos csak éles tesztek után fogod többet tudni, az adó-vevő ugyanis az adóteljesítmény függvényében veszi fel az áramot, ami pedig dinamikusan változhat. (A kijelző fényereje is változtatható, ez most jutott eszembe smiley).
 

 

A stabil tápfeszültség előállításáról eredetileg egy TPS61090 DC-DC kapcsolóüzemű IC gondoskodott volna, ami beépítésre is került, ám a tesztek során valahogyan kiszökött belőle az a bizonyos "mágikus füst", ami után nem volt hajlandó tovább működni, ezért a teljes kapcsolóüzemű részt eltávolítottam, és egy készre szerelt kapcsolóüzemű tápegység modult építettem be a helyére. Hogy mi történhetett, abban sajnos nem vagyok teljesen biztos. Az tuti, hogy a VQFN tokozású IC (4mm x 4mm!!!) beforrasztása nem volt egyszerű feladat, illetve a NYÁK-ot a kezdeti élesztés és hibajavítások során többször is kivettem, majd visszaszereltem a házba, amiben az egy picikét szorult is, és az egyik ilyen beszerelés alkalmával picit meghajolhatott a NYÁK-lemez. Ekkor történhetett a baj...

Mindegy, íme a NYÁK-terv, illetve a kapcsolási rajz (ez utóbbi sajnos nem látható valami jól, később töltök majd fel PDF verziót is):
 

   


A hajóról is igyekszem írni nemsokára.cheeky