Potřeboval jsem udělat jednoduché menu pro Dinduino a během hledání jsem narazil na knihovnu MENUSYSTEM z webové stránky : github.com/jonblack/arduino-menusystem
Nejen, že má jednoduché vytváření menu pomocí pár příkazů, ale hlavně jako jedna z mála knihoven umí periodicky zobrazit menu. To je důležité pro zobrazení aktuálních dat (čas, teplota, ...).
Tady je příklad je jednoduchého menu s podrobnějšícm komentářem:
#include <MenuSystem.h> // promenne pro menu MenuSystem ms; // instance objektu ms Menu mm(""); // nazev menu (root) MenuItem mm_mi1("Item 1"); // 1.polozka MenuItem mm_mi2("Item 2"); // 2.polozka MenuItem mm_mi3("Item 3"); // 3.polozka // nastavene funkce pro vyber polozky // nutne nasatvit pred udani struktury menu //----------------------------------------- // co se provede pri vyberu 1. polozky void on_item1_selected(MenuItem* p_menu_item) { Serial.println("Item1 Selected"); } // co se provede pri vyberu 2. polozky void on_item2_selected(MenuItem* p_menu_item) { Serial.println("Item2 Selected"); } // co se provede pri vyberu 3. polozky void on_item3_selected(MenuItem* p_menu_item) { Serial.println("Item3 Selected"); } // uvodni nastaveni void setup() { Serial.begin(9600); // nastaveni struktury menu // add.item pridava dalsi polozku do menu (nazev polozky menu, & + jmeno volane funkce pri vyberu) mm.add_item(&mm_mi1, &on_item1_selected); mm.add_item(&mm_mi2, &on_item2_selected); mm.add_item(&mm_mi3, &on_item3_selected); ms.set_root_menu(&mm); // zobraz napovedu help(); } // nekonecna smycka programu void loop() { // volani funkce pro pohyb v menu ovladani(); // zobrazeni menu Menu const* cp_menu = ms.get_current_menu(); Serial.println("----------------"); Serial.println(cp_menu->get_selected()->get_name()); Serial.println("----------------"); Serial.println(""); // Wait for two seconds so the output is viewable delay(2000); } void ovladani() { // resi pohyb po menu // aktualne z prikazoveho radku if (Serial.available()) { byte read = Serial.read(); switch (read) { case 'w': ms.prev(); break; // nahoru case 's': ms.next(); break; // dolu case 'a': ms.back(); break; // zpet - nepouzito case 'd': ms.select(); break; // vyber - nepouzito case 'h': help(); break; // napoveda } } } void help() { Serial.println("*"); Serial.println("* w - nahoru *"); Serial.println("* s - dolu *"); Serial.println("* a - zpet *"); Serial.println("* d - vyber *"); Serial.println("* h - napoveda *"); Serial.println("*"); } |
A jakpak tomu vdechnout život?
Použil jsem tady programování přes SPI/ISP/ICSP. Podrobnější popis tohoto řešní je zde:
arduino.cc/en/Tutorial/ArduinoISP
Zapojení Arduina jako programatoru:
Ještě textově:
Arduino | DINDUINO |
POPIS |
10 | RST | RESET |
11 | MOSI | DATA |
12 | MISO | DATA |
13 | SCK | HODINY |
GND | GND | ZEM |
Mám navíc vypnutý automacký Reset (to standaradní Arduino neumí a musí se u něj dát kondenzátor 10-470u mezi Reset (+) a zem (-)).
Používám prostředí Arduino 1.01 a 1.05 a jako typ Arduina mám Arduino MINI /w Atmega 328.
Typ programatoru Arduino as ISP.
Nahrávám pomoci File > Upload Using Programmer .
První program : www.pise.cz/blog/ftp/posjirka/dinduino_6_2014_zakl.ino
Jak tedy na sestaveni?
Takhle vypadá návrh PCB a osazeni:
Jelikož jsem trochu limitovaný velikostí obrázků je vše ve velikosti formátu A5.
Tady máme PCB :
www.pise.cz/blog/ftp/posjirka/dinduino_6_2014_bott.pdf
a osazení součástek + čelni panel
www.pise.cz/blog/ftp/posjirka/dinduino_6_2014_souc.png
Začal jsem nejdřív panelem LCD:
- první na řadě jsou drátové propojky (je jich tady celkem 5 !!!)
- osadil jsem odpory (R1-R8) a odporovou síť (R10) , kterou jsem musel upravit protože nechi zbytečně ztrácet 5 mA tak jsem odstřihul 2. pin a taky 9. pin protože jsem sehnal pouze 8 odporovou síť
- potom kondenzátory (C1, C2) a krystal (Q1)
- další byly hřebínky pro LCD display (ty jsem posadil o 1 mm níž a po zapájení oddělal plastové držáky)
- hřebínky pro X1 (4. pin později odstranit, bude sloužit jako zámek konektoru)
- potom LED diody (LED1 - LED3)
- tlačítka (SW1 - SW4) - SW2/RESET je schválně nižší aby nedošlo k resetu.
- nakonec přijde Atmega 328 (bez patice přímo do PCB).
Po otestování funkce (nahráním prvního programu přes SPI/ISP ale o tom až později v oživování) jsem připájel ze strany spojů izolované drátky jako X2.
Je to sice trochu nešťastné řešení, ale nesehnal jsem dost dlouhý hřebínek.
Další na řadě je modul BASE:
- tady je to podobné, nejdřív drátová propojka, potom odpory (R11, R12) pak keramické kondenzátory
- další jsou svorkovnice a patice na pojistku
- stabilizátory a el. kondenzátory a nakonec trafo + propojky s LCD panelem.
Výsledek je asi takový (ještě nemám podsvícený LCD, správnou velikost dist. sloupků a trafo ma 3VA):
Ještě by to chtělo seznam součástek:
LCD1 | WH0802A1-YGH-ET | 2x8 zn | LCD | 1 |
LCD1 | XINYA BL820GD | zabrousit na 7mm | PATICE LCD | 1 |
LCD1 | XINYA S1G20 | 1x20 pin | PATICE PCB | 1 |
IO1 | ATMEGA328P-PU | PROCESOR | 1 | |
LED1 | LED 3MM RED 3000/30° | 3mm RED | CHYBA | 1 |
LED2 | LED 3MM YELLOW 5000/20° | 3mm YELLOW | RELE1 | 1 |
LED3 | LED 3MM YELLOW 5000/20° | 3mm YELLOW | RELE2 | 1 |
R1 | RR W1 33R | 33R | 1 | |
R2 | RR W1 10K | 10k | 1 | |
R3 | RR W1 470R | 470R | 1 | |
R4 | RR W1 470R | 470R | 1 | |
R5 | RR W1 470R | 470R | 1 | |
R6 | RR W1 10K | 10k | 1 | |
R7 | RR W1 10K | 10k | 1 | |
R8 | RR W1 10K | 10k | 1 | |
R10 | RR 8X4K7 2% | (8)7x4k7 | 1 | |
SW1 | TACTM-619P-F | MENU | 1 | |
SW2 | TC-0102-T-A00 | RESET | 1 | |
SW3 | TACTM-619P-F | PLUS | 1 | |
SW4 | TACTM-619P-F | MINUS | 1 | |
x2 | viz LCD1 | SPI | 1 | |
x1 | IZOLOVANÝ DRÁT | PROPOJ | 1 | |
C1 | CK 18p/50V | 18p | 1 | |
C2 | CK 18p/50V | 18p | 1 | |
Q1 | QM 16.000MHZ | 16MHz | KRYSTAL | 1 |
viz DPS BASE | 40x80mm | DPS | 1 | |
SKM3X16 | 3mm/16mm | ŠROUBY | 2 | |
SKM3K | 3mm | MATICE | 2 | |
Izolační podložka 7/3,2mm,tloušťka 1,5mm | 8mm/3mm | PODLOŽKY | 2 | |
KDR07 | pr.6/3mm, delka 7mm | DISTANČNÍ SLOUPEC | 2 | |
IZOLOVANÝ DRÁT | PROPOJ | 1 | ||
X10 | ARK705V 2P | 2P / 7,5mm | 230V | 1 |
X11 | ARK705V 2P | 2P / 7,5mm | RELE1 | 1 |
X12 | ARK705V 2P | 2P / 7,5mm | RELE2 | 1 |
X21 | ARK500/3EX | 3P / 5mm | 1 | |
X22 | ARK500/3EX | 3P / 5mm | 1 | |
X23 | ARK500/3EX | 3P / 5mm | 1 | |
X24 | ARK500/3EX | 3P / 5mm | 1 | |
X25 | ARK500/3EX | 3P / 5mm | 1 | |
FU1 | KS-PTF78+BS232 | POJISTKOVE POUZDRO | 1 | |
FU1 | F 50mA 5x20 | POJISTKA | 1 | |
TR1 | HAHN BV EI 302 2005 | TRAFO | 230V/2x6V 1,8VA | 1 |
RE1 | JV-5S-KT | JV-5S-KT | 1 | |
RE2 | JV-5S-KT | JV-5S-KT | 1 | |
D1 | 1N4007 | 1 | ||
D2 | 1N4007 | 1 | ||
D3 | 1N4007 | 1 | ||
D4 | 1N4007 | 1 | ||
C3 | CE 1000u/25V | 1m/16V | 1 | |
C4 | CK 100n/63V | 100n | 1 | |
C5 | CE 470u/10V | 470u/16V | 1 | |
C6 | CK 100n/63V | 100n | 1 | |
C7 | CE 470u/10V | 470u/16V | 1 | |
C8 | CK 100n/63V | 100n | 1 | |
R11 | RR W1 10K | 10k | 1 | |
R12 | RR W1 10K | 10k | 1 | |
T1 | BC337-25 CDIL | RELE1 | 1 | |
T2 | BC337-25 CDIL | RELE2 | 1 | |
IO2 | SEMTECH 78L05/SEMT | 78L05 | STABILIZATOR 5V | 1 |
IO3 | SEMTECH 78L05/SEMT | 78L05 | STABILIZATOR 5V | 1 |
Cuprextit 160x100x1,5 | JEDNOVRSTVÝ | DPS | 1 | |
Z-109F | KPDIN07 | KRABICE | 1 | |
KDA6M3X35 | DISTANČNÍ SLOUPEC | 4 | ||
SB812965 | DRŽÍ DPS | ŠROUBY | 4 | |
1 |
Celkem bez poštovného cca 610 Kč + programovací kabel.
Konečně jsem dostal "vývoj" Dinduina do podoby , která se mi líbí.
Oproti původnímu zámeru jsem zrušil UART a procesor je zpět ATMEGA328P.
Je to jednoduché zapojení :
V tuto chvíly má tyto parametry:
- programování přes SPI / ISP
- LCD 2x8 znaků
- procesor ATMEGA 328 P s krystalem 16MHz
- 3 tlačítka (ENTER, PLUS, MINUS) + reset
- napájení 230V / AC
- max. příkon 1,8W
- nezávislý zdroj 5V/100mA vyvedený na svorky
- 2 relé 250V/5A ze signalizací sepnutí.
- 6 univerzálních vstupů / výstupů s PULL-UP odpory 4k7. (jsou využity analogové vstupy: A0-A5, které se dají adresovat jako digitalni I/O: 14-19)
- vše v DIN krabici šíře 89mm.
Jako komunikační protokol lze využít I2C/IIC, 1-WIRE, SW SERIAL, ...
Vstupy jsou připraveny pro : termistory (2-10k Ohm), tlačítka/relé, 1-WIRE (např DS18b20), I2C (LCD, ARDUINO,...), ...
Pro delší vedeni je vhodne připojit k cidlum paralelně kondenzator v řadech pF.
Arduino I2C LCD
Dneska se podíváme na můj boj Arduina s rozhraním I2C pro LCD display.
Na EBAY jsem si objednal modul :
http://www.ebay.com/itm/141146290709?ssPageName=STRK:MEWNX:IT&_trksid=p3984.m1497.l2649
Ten se připojí (v mém případě přes hřebínky přiletuje) na LCD display, pomocí 4 drátků propojí s Arduinem (+5V, GND, SDA, SCL) a mělo by vše fungovat.
Stahnul jsem si z internetu první knihovnu na kterou jsem narazil a zkusil své štěstí. => nevyšlo to.
První problém byl v ardesování. Samotný modul nemá na začátku propojen žádný adresovací pad (A0, A1, A2) a tudíž má adresu "0x27"
Druhá věc je správná knihovna. Nakonec jsem si stáhnul tuto:
http://www.play-zone.ch/en/fileuploader/download/download/?d=0&file=custom%2Fupload%2FFile-1345667375.zip
a po nahrání examplu už display vesele funguje.
Arduino ATMEGA328 bez bootloaderu
dodatek ze dne 5.6.2014:
Při delším zkoušení a hledání jsem zjistil, že tuto funkci umí jakékoliv Arduino IDE 1.0x.
Zvolíš si správný HW (např.Arduino MINI w/328), správný port a jako programátor si vebereš Arduino as ISP (samozřejmě že musíš mít Arduino, které má nahraný program Arduino as ISP).
Když klikneš a UPLOAD, skončí to nejspíš chybou.
Musíš použít File > Upload whit user programmer.
Tím pádem, žádné úpravy Board.txt, preference.txt, ... jednoduše a funkčně.
----------------------------------------------------------------------------------------------------------------------------------------------------------------------
původní text:
Tak se mi stalo že odešel převodník USB/UART.
Jasně že jsem si hned objednal nový, ale chtěl jsem zkusit jestli to půjde i bez něj - mám přece druhé Arduino tak jej použiju jako ISP programator.
Je třeba použít Arduino 0022 nebo obdobné (s 1.0x nefunguje) a do arduino-0022hardwarearduino souboru boards.txt vložit tento kod
##############################################################
DINDUINO_MINI.name=ISP DINUDINO Mini ATmega328
DINDUINO_MINI.upload.protocol=stk500
DINDUINO_MINI.upload.maximum_size=32768
DINDUINO_MINI.upload.speed=57600
DINDUINO_MINI.upload.using=arduino:arduinoisp
DINDUINO_MINI.bootloader.low_fuses=0xff
DINDUINO_MINI.bootloader.high_fuses=0xdf
DINDUINO_MINI.bootloader.extended_fuses=0x05
DINDUINO_MINI.bootloader.path=optiboot
DINDUINO_MINI.bootloader.file=optiboot_atmega328.hex
DINDUINO_MINI.bootloader.unlock_bits=0x3F
DINDUINO_MINI.bootloader.lock_bits=0x0F
DINDUINO_MINI.build.mcu=atmega328p
DINDUINO_MINI.build.f_cpu=16000000L
DINDUINO_MINI.build.core=arduino
##############################################################
a najednou můžete programovat přes ISP ....
aneb DINDUINO plné života :)
Co je to Bootloader ?
Bootloader někde počeštěn jako ZAVADĚČ je program uvnitř arduina, který umožnuje sdělit IDE ARDUINU že je připojen a je díky tomuto programu schopen přijmout kod a naprogramovat jej do arduina.
Co budeme potřebovat?
Při hledání možností arduina jsem narazil na článek, kde se místo klasických čipů ATMEGA168/328 používá vyšší verze ATMEGA1284P-PU.
http://maniacbug.wordpress.com/2011/11/27/arduino-on-atmega1284p-4/
https://github.com/maniacbug/mighty-1284p
To mě vedlo k myšlence "vymyslet" vlastní verzi arduina, které bude mít dostatek paměti pro základní
Tady budu dávat knihovny, které jsem vytvořil nebo upravil pro svoje potřeby pro SW Fritzing:
FRITZING LIBRARY:
Co dnes?
Dneska se podíváme na zoubek připojení LCD z mobilu NOKIA 5110 a 3310 k Arduinu.
Nebudu tu zatím řešit jak použít LCD přímo z mobilu, ale podíváme se na varintu kitu, který již display obsahuje a má výstupy přímo přes piny.
Já jsem si koupil na ebay.com tento: