Uživatelské nástroje

Nástroje pro tento web


arduino-lcdxpl

Rozdíly

Zde můžete vidět rozdíly mezi vybranou verzí a aktuální verzí dané stránky.

Odkaz na výstup diff

Obě strany předchozí revizePředchozí verze
Následující verze
Předchozí verze
arduino-lcdxpl [2016/02/22 21:48] – [Zapojení LCD] djbuldogarduino-lcdxpl [2025/08/28 10:09] (aktuální) – upraveno mimo DokuWiki 127.0.0.1
Řádek 4: Řádek 4:
  
   * podle [[https://www.arduino.cc/en/Tutorial/HelloWorld|moc pěkné stránky]]   * podle [[https://www.arduino.cc/en/Tutorial/HelloWorld|moc pěkné stránky]]
-  * na ebay jsem koupil za kilo LCD Winstar 2004A+  * na ebay jsem koupil za kilo LCD Winstar 2004A  {{ :arduino-lcd-schema.png?250|}}
     * 20 znaků, 4 rádky     * 20 znaků, 4 rádky
     * response time: 200ms Rise, 200ms Fall (celkem tedy odezva 400ms - pomalé překreslování!!)     * response time: 200ms Rise, 200ms Fall (celkem tedy odezva 400ms - pomalé překreslování!!)
     * pozorovací úhly V/H 20/60     * pozorovací úhly V/H 20/60
-  * připojuje se přes standardních 16 vývodů: +  * připojuje se přes standardních 16 vývodů:
     * VSS - napájení obvodu (GND)     * VSS - napájení obvodu (GND)
     * VD0 - napájení obvodu (+5V)     * VD0 - napájení obvodu (+5V)
Řádek 15: Řádek 15:
     * R/W - výběr režimu čtení/zápis     * R/W - výběr režimu čtení/zápis
     * E - signalizace zápisu do registru     * E - signalizace zápisu do registru
-    * D0-D7 - datové linky, primárně pro předávání kódu znaku (pro EN znaky stačí D4-D7)+    * D0-D7 - datové linky, primárně pro předávání kódu znaku
     * A,K - ovládání podsvícení (+anoda, -katoda)     * A,K - ovládání podsvícení (+anoda, -katoda)
   * existuje i verze s i2c rozhraním (na vývody napojen další čip)   * existuje i verze s i2c rozhraním (na vývody napojen další čip)
-  zapojení podle schématu + 
-  * {{::arduino-lcd-schema.png?400|}}+  * rozdíl mezi 4 bit (D4-D7) a 8 bit (D0-D7) režimem by měl být v rychlosti 
 +  * pokud se ale předávají celé znaky (ne custom symboly), tak je to [[http://forum.arduino.cc/index.php?topic=125347.msg942556#msg942556|prý]] zanedbatelné 
 +  * prováděné instrukce (kurzívou jsou označeny instrukce navíc v 4 bit režimu): 
 +    * put the data in a register 
 +    * //output the upper four bits of datadata// 
 +    * //pulse the enable line// 
 +    * //(IMPORTANT: no delay is needed here)// 
 +    * //shift or otherwise manipulate the data// 
 +    * output the data 
 +    * pulse the enable line 
 +    * wait until the controller is ready for the next byte of information 
 +===== kód pro LCD ===== 
 + 
 +  opět podle [[https://www.arduino.cc/en/Tutorial/HelloWorld|moc pěkné stránky]] 
 +  * s využitím [[https://www.arduino.cc/en/Reference/LiquidCrystal|LiquidCrystal knihovny]] je to velice snadné 
 +  * konstruktor LiquidCrystal má několik variant 
 +    * LiquidCrystal(rs, enable, d4, d5, d6, d7)  
 +    * LiquidCrystal(rs, rw, enable, d4, d5, d6, d7)  
 +    * LiquidCrystal(rs, enable, d0, d1, d2, d3, d4, d5, d6, d7)  
 +    * LiquidCrystal(rs, rw, enable, d0, d1, d2, d3, d4, d5, d6, d7) 
 +  * jako číslo pinu se dává označení z destičky plošných spojů. Lze použít i analogové piny A1-A6. 
 + 
 +<code cpp> 
 +LiquidCrystal lcd(2, 3, 4, 6, 8, 9); 
 + 
 +void setup() 
 +{ 
 +  lcd.begin(20,4); 
 +  lcd.print("    Hello   "); 
 +  lcd.setCursor(0,1); 
 +  lcd.print("   World!!  "); 
 +
 + 
 +void loop() {
 +</code> 
 + 
 +==== problémy ==== 
 +  * občas se mi stává, že z LCD zmizí všechny znaky 
 +  * udělá to při překreslení obrazovky (po stisku tlačítka nebo otočení enkodéru) 
 +  * většinou tomu předchází delší neaktivita 
 +  * nepřišel jsem na příčinu, ale opravuji to pomocí zavolání ''lcd.begin(20,4)'' (po stisku dvou tlačítek současně) 
 +===== Sériová linka ===== 
 + 
 +  * arduino se připojuje k PC přes USB, které v sobě obsahuje rovnou sériovou linku 
 +  * hardwarové není tedy potřeba nic přepojovat 
 +  * práce se [[https://www.arduino.cc/en/Reference/SoftwareSerial|sériovou linkou]] je hodně intuitivní 
 + 
 +<code cpp> 
 +void setup() 
 +
 +  Serial.begin(9600);  
 +
 + 
 +void loop() { 
 + 
 +  if(Serial.available() > 0) { 
 +    char c = Serial.read(); 
 +    Serial.write("Received"); 
 +    Serial.write(c); 
 +    Serial.write('\n'); 
 +  } 
 +
 +</code> 
 + 
 +  * sériová linka má vyrovnávací paměť cca 70 znaků 
 +  * funkce ''available'' kontrolu obsah tohoto bufferu 
 +  * existují i funkce pro čtení více znaků najednou 
 +  * lepší je ale možná číst znaky postupně do nějakého svého bufferu, aby se dlouho nečekalo 
 +  * pro zápis existuje i funkce ''print'' nebo ''println''. Podporuje více datových typů než obyčejný ''write''
 + 
 +==== problémy ==== 
 + 
 +  * pokud se k arduinu připojím přes sériovou linku a zase odpojím, tak se něco změní 
 +  * zápis na linku přes arduino začne blokovat další kód (čekat) 
 +  * zjistil jsem, že wirte buffer sériové linky je 64 znaků 
 +  * jakmile jej vyčerpám, zápis čeká na nějaký timeout 
 +  * situaci lze detekovat pomocí ''!Serial.availableForWrite())'' 
 + 
 +===== Rotační enkodéry ===== 
 + 
 +  * zkusil jsem použit knihovnu [[https://www.pjrc.com/teensy/td_libs_Encoder.html#polling|Encoder]] 
 +  * je k dispozici ve správci knihoven v Arduino IDE 
 +  * použití je velice jednoduché, vesměs pouze tři příkazy 
 +    * ''Encoder myEnc(pin1, pin2)'' vytvoření objektu, enkodérů může být víc.  
 +    * ''myEnc.read()'' - přečtení hodnoty čítače tjpočet otáček doprava (+) nebo doleva (-) 
 +    * ''myEnc.write(newPosition)'' - nastavení hodnoty, například po přečtení hodnoty 
 +  * doporučuje se oba piny připojit na digitální vstup s interrept 
 +    * u leonarda (pro micro) [[https://www.arduino.cc/en/Reference/AttachInterrupt|to jsou prý]] piny 0 (TX), 1 (RX), 2 (SDA), 3 (SDL), 7 
 +  * knihovna je velice chytrá a sama pozná, zda zadané piny jsou interrupt ready :) 
 + 
 +  * čítač počítá všechny přechody,  
 +    * tzn. že jedno lupnutí odpovídá vlastně číslu 4 
 +    * abych eliminoval chyby, tak číslo 4 beru jako jednu otáčku 
 +    * u AVR ATmega8 jsem používal jen jeden přechod, ten nejlepší 
 +  * k interrupt pinu mám připojen jen jeden rotační enkodér, jedním drátem, a chová se to fakt lépe 
 +  * na druhém jsem měl připojeny kondenzátory a mám pocit, že to bez nich funguje lépe (u ATmega8 to bylo naopak) 
 + 
 + 
 +===== Více tlačítek ===== 
 + 
 +  * připojit na analog (ADC) 
 +    * na analog pin lze připojit reálně až 20 tlačítek 
 +    * stačí každé připojit přes jiný odpor (na zem) - stisk generuje jiné napětí 
 +    * nelze detekovat stisk více tlačítek - detekuje se to s nejnižším odporem 
 +    * je třeba počítat s tím, že napětí kolísá - například podle množství odebíraného proudu, takže se musí stanovit určitý rozsah napětí 
 +    * průběh stisku nebývá dokonalý (odpor při nedomáčknutí), nejvhodnější jsou tlačítka s mikrospínačem 
 +    * zdroje 
 +      * http://www.instructables.com/id/How-to-access-5-buttons-through-1-Arduino-input/ 
 +      * http://electronics.stackexchange.com/questions/101409/how-to-debouce-six-buttons-on-one-analog-pin-with-arduino 
 +      * http://tronixstuff.com/2011/01/11/tutorial-using-analog-input-for-multiple-buttons/ 
 +      * http://forum.arduino.cc/index.php?topic=8558.0 
 +      * https://blog.adafruit.com/2009/10/20/example-code-for-multi-button-checker-with-debouncing/
arduino-lcdxpl.1456174139.txt.gz · Poslední úprava: (upraveno mimo DokuWiki)

Donate Powered by PHP Valid HTML5 Valid CSS Driven by DokuWiki