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




    Hozzászólások:

Szólj hozzá!