Arduino pomoc

Odpovědět
Uživatelský avatar
packa
Příspěvky: 6946
Registrován: 7. 2. 2007, 6:42
Bydliště: Královehradecký kraj

15. 12. 2014, 8:18

jsou tam požitý všechny piny , ale nepotřebuju ovládat podsvícení takže mám pin volný , jen si nevím rady s tou knihovnou , zatím ji studuju
Mex
Příspěvky: 10287
Registrován: 6. 2. 2014, 10:29

15. 12. 2014, 9:08

Co to je za chip?
A co to znamená, že jsou použité všechny piny?
Ten integráč má pouzdro 16pin, LCD se dá i s podsvícením ovládat po 7 drátech (ve 4-bit režimu).
Takže vyšetřit nějaký pin se možná dá.
Uživatelský avatar
packa
Příspěvky: 6946
Registrován: 7. 2. 2007, 6:42
Bydliště: Královehradecký kraj

16. 12. 2014, 5:12

Je tam tenhle šváb: PCF8574 a první tři piny jsou pro nastavení adresy
PCF8574 lcd.png
PCF8574 lcd.png (59.48 KiB) Zobrazeno 5999 x
Mex
Příspěvky: 10287
Registrován: 6. 2. 2014, 10:29

16. 12. 2014, 9:24

Pokud nechceš obětovat to řízení podsvícení, tak klidně odpoj signál R/W a použij ho pro to druhé Enable.
Signál R/W se často nezapojuje, protože číst data z LCD je celkem k ničemu, a bez BUSY flagu dá taky snadno obejít.
Uživatelský avatar
packa
Příspěvky: 6946
Registrován: 7. 2. 2007, 6:42
Bydliště: Královehradecký kraj

17. 12. 2014, 12:45

ok děkuji za radu , a nechtěl by ses kouknout na tu knihovnu ?
Mex
Příspěvky: 10287
Registrován: 6. 2. 2014, 10:29

17. 12. 2014, 4:35

Zběžně jsem se na tu knihovnu díval, je to předpokládám to http://www.xs4all.nl/~hmario/arduino/Li ... al_I2C.zip" onclick="window.open(this.href);return false; .
Tady se pin R/W nepoužívá, takže ho můžeš na displeji klidně uzemnit a ušetřený pin používat pro Enable2.
Pokud nebudeš používat kurzor, tak se to výrazně zjednoduší.
Pokud bys kurzor používal, tak budeš muset udržovat informaci jestli je kurzor zobrazený, na kterém z displejů je zobrazený a při přechodech mezi nimi bys ho musel přepínat. V tomto případě by to bylo víc práce.
Pokud nebudeš používat kurzor a nějaké to různé podivné rolování textu (podle mě v praxi absolutně nevyužitelné), tak by mělo stačit upravit snad jen rutiny "setCursor" a pak nejnižší funkci "pulseEnable", kde podle čísla řádku budeš aktivovat Enable1 nebo Enable2.
Příkazy asi můžeš posílat současně na oba displeje, takže tady můžeš vždy aktivovat Enable1 i Enable2.

Nějak takhle:

Kód: Vybrat vše

void LiquidCrystal_I2C::setCursor(uint8_t col, uint8_t row){
	int row_offsets[] = { 0x00, 0x40, 0x14, 0x54 };
	if ( row > _numlines ) {
		row = _numlines-1;    // we count rows starting w/0
	}
	command(LCD_SETDDRAMADDR | (col + row_offsets[row % 2]));
}

void LiquidCrystal_I2C::pulseEnable(uint8_t _data){
uint8_t enable_x;

	if (_data & Rs) {
		if (row < 2) {
			enable_x = En;
		} else {
			enable_x = En2;
		}
	} else {
		enable_x = En | En2;
	}
	expanderWrite(_data | enable_x);	// En high
	delayMicroseconds(1);		// enable pulse must be >450ns
	
	expanderWrite(_data & ~enable_x);	// En low
	delayMicroseconds(50);		// commands need > 37us to settle
} 
V LiquidCrystal_I2C.h si pak přidej definici:

Kód: Vybrat vše

#define En2 B00100000  // Enable2 bit
Nemám to jak vyzkoušet, takže je to jen teoretický nástřel.
Možná se to bude muset ještě někde přiohnout, ale rozhodně to realizovatelné je.
Uživatelský avatar
Hades
Příspěvky: 1206
Registrován: 11. 10. 2012, 10:59
Bydliště: Praha; Mimoň

17. 12. 2014, 10:09

Mex píše:Pokud nechceš obětovat to řízení podsvícení, tak klidně odpoj signál R/W a použij ho pro to druhé Enable.
Signál R/W se často nezapojuje, protože číst data z LCD je celkem k ničemu, a bez BUSY flagu dá taky snadno obejít.
to je dobrej nápad...
z LCD se nečte, taky k čemu, když ho ovládáš...
další volný signál...

se přiznám, že jsem podsvícení LCD vyřešil prasácky "samo domo"...
zbyl mi jeden volnej pin, a protože stejně volám v cyklu klávesnici, tak "nábojová pumpa", kde při každé stisknuté klávese pošlu impuls... tranzistor nabije kondík, a pak je to jen otázkou dalšího C-MOS, co drží podsvícení (jasně že je to prasárna, ale funkční...)
Uživatelský avatar
packa
Příspěvky: 6946
Registrován: 7. 2. 2007, 6:42
Bydliště: Královehradecký kraj

19. 12. 2014, 5:20

Mex píše:Zběžně jsem se na tu knihovnu díval, je to předpokládám to http://www.xs4all.nl/~hmario/arduino/Li ... al_I2C.zip" onclick="window.open(this.href);return false; .
Tady se pin R/W nepoužívá, takže ho můžeš na displeji klidně uzemnit a ušetřený pin používat pro Enable2.
Pokud nebudeš používat kurzor, tak se to výrazně zjednoduší.
Pokud bys kurzor používal, tak budeš muset udržovat informaci jestli je kurzor zobrazený, na kterém z displejů je zobrazený a při přechodech mezi nimi bys ho musel přepínat. V tomto případě by to bylo víc práce.
Pokud nebudeš používat kurzor a nějaké to různé podivné rolování textu (podle mě v praxi absolutně nevyužitelné), tak by mělo stačit upravit snad jen rutiny "setCursor" a pak nejnižší funkci "pulseEnable", kde podle čísla řádku budeš aktivovat Enable1 nebo Enable2.
Příkazy asi můžeš posílat současně na oba displeje, takže tady můžeš vždy aktivovat Enable1 i Enable2.

Nějak takhle:

Kód: Vybrat vše

void LiquidCrystal_I2C::setCursor(uint8_t col, uint8_t row){
	int row_offsets[] = { 0x00, 0x40, 0x14, 0x54 };
	if ( row > _numlines ) {
		row = _numlines-1;    // we count rows starting w/0
	}
	command(LCD_SETDDRAMADDR | (col + row_offsets[row % 2]));
}

void LiquidCrystal_I2C::pulseEnable(uint8_t _data){
uint8_t enable_x;

	if (_data & Rs) {
		if (row < 2) {
			enable_x = En;
		} else {
			enable_x = En2;
		}
	} else {
		enable_x = En | En2;
	}
	expanderWrite(_data | enable_x);	// En high
	delayMicroseconds(1);		// enable pulse must be >450ns
	
	expanderWrite(_data & ~enable_x);	// En low
	delayMicroseconds(50);		// commands need > 37us to settle
} 
V LiquidCrystal_I2C.h si pak přidej definici:

Kód: Vybrat vše

#define En2 B00100000  // Enable2 bit
Nemám to jak vyzkoušet, takže je to jen teoretický nástřel.
Možná se to bude muset ještě někde přiohnout, ale rozhodně to realizovatelné je.
Tak jsem upravyl knihovny , jak jsi poslal , ale vyhazuje hlášku : error: 'row' was not declared in this scope
jak jej mám nadefinovat ?
Dík
Packa
Mex
Příspěvky: 10287
Registrován: 6. 2. 2014, 10:29

19. 12. 2014, 6:08

Jsem na cestách, tak mám internet jenom na mobilu. Takže jenom stručně.
Máš pravdu, on si tam nepamatuje adresu řádku. Takže do *.h do definice třídy budeš muset doplnit něco jako "uint8_t _row;".
V proceduře setCursor do ní uložíš adresu řádku (na konci přidej "_row = row;"). V proceduře home pak bude "_row = 0;".
No a v té proceduře write místo "row" použiješ "_row".
Pokud bys dělal nějaké víceřádkové výpisy, tak bys ještě musel i v té proceduře write testovat přechod na nový řádek a tedy případně i na druhý displej. Ale to asi nebude nutné, víceřádkový výpis na takhle malý displej se většinou nepoužívá. Zvlášť proto, že pak by to bylo navrdo zamčené pro displej téhle konkrétní velikosti.
Uživatelský avatar
packa
Příspěvky: 6946
Registrován: 7. 2. 2007, 6:42
Bydliště: Královehradecký kraj

19. 12. 2014, 7:16

Mex ty jsi hlava
chodí to naprosto parádně ,
Velice děkuji
Uživatelský avatar
Hades
Příspěvky: 1206
Registrován: 11. 10. 2012, 10:59
Bydliště: Praha; Mimoň

19. 12. 2014, 7:37

A pak že to nepojede :D
Uživatelský avatar
packa
Příspěvky: 6946
Registrován: 7. 2. 2007, 6:42
Bydliště: Královehradecký kraj

19. 12. 2014, 7:56

Hades píše:A pak že to nepojede :D
Nojo jede , ale co to dalo , a hlavně bez vás bych to nedal . Takže ještě jednou děkuji všem za pomoc
Uživatelský avatar
Hades
Příspěvky: 1206
Registrován: 11. 10. 2012, 10:59
Bydliště: Praha; Mimoň

19. 12. 2014, 8:03

Mex u tebe má "jedno významné plus"...
Já ti nepomohl, protože mimo web, a Mex byl rychlejší.

sakra, nechci bejt na MEX-íka jedovatej, ale dělá on něco jiného, než že sedí za klábosnicí? :oops:

To: Mex
dobrej vodstřel "z debila" :clap:

njn, velký potlesk.

p.s.
taky už by mohl "Sám Náš Nejvyžší" přidat tuhle ikonku
Mex
Příspěvky: 10287
Registrován: 6. 2. 2014, 10:29

19. 12. 2014, 9:24

packa píše:chodí to
Dík žes napsal, když něco funguje to vždycky potěší. :-)
Uživatelský avatar
packa
Příspěvky: 6946
Registrován: 7. 2. 2007, 6:42
Bydliště: Královehradecký kraj

21. 12. 2014, 2:33

Tak se pomalu pouštím do dalšího projektu , koupil jsem za pár šprdliků akumulátorovou vřetenovou sekačku , bez aku , ale to je to nejmenší , dá se použít i bez aku na ruční postrk v kolech jsou převody s volnoběžkama ty nahradím motory a budu z ní dělat robotickou sekačku , na netu je kupa různých pokusů , ale u žádné mě nenadchla orientace v prostoru , mám doma robotický vysavač IROBOT a tam se dá mluvit o plánování trasy a výpočtech - IROBOT je asi to nejlepší na trhu .
Ale všechny projekty co jsou kde na netu tak robot jede k překážce po dotyku se otočí třeba o 40° a jede dál až znovu narazí díky čemuž dříve či později možná pokreje celý prostor , ale kupu míst projede třeba desetkrát a neefektivně .
Nemáte nebo nevíte o nějakém použitelném algoritmu který by se dal pro tuhle aplikaci použít ?
Odpovědět

Zpět na „Ostatní elektronika“