====== Arduino LCD pro X-Plane ======
===== Zapojení LCD =====
* podle [[https://www.arduino.cc/en/Tutorial/HelloWorld|moc pěkné stránky]]
* na ebay jsem koupil za kilo LCD Winstar 2004A {{ :arduino-lcd-schema.png?250|}}
* 20 znaků, 4 rádky
* response time: 200ms Rise, 200ms Fall (celkem tedy odezva 400ms - pomalé překreslování!!)
* pozorovací úhly V/H 20/60
* připojuje se přes standardních 16 vývodů:
* VSS - napájení obvodu (GND)
* VD0 - napájení obvodu (+5V)
* V0 - napájení pixelů (kontrast)
* RS - výběr registru, do kterého se bude zapisovat
* R/W - výběr režimu čtení/zápis
* E - signalizace zápisu do registru
* D0-D7 - datové linky, primárně pro předávání kódu znaku
* A,K - ovládání podsvícení (+anoda, -katoda)
* existuje i verze s i2c rozhraním (na vývody napojen další čip)
* 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.
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() {}
==== 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í
void setup()
{
Serial.begin(9600);
}
void loop() {
if(Serial.available() > 0) {
char c = Serial.read();
Serial.write("Received: ");
Serial.write(c);
Serial.write('\n');
}
}
* 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 - tj. poč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/