{"id":2191,"date":"2019-11-28T18:42:07","date_gmt":"2019-11-28T18:42:07","guid":{"rendered":"http:\/\/physics.uwb.edu.pl\/wf\/fi-bot\/?p=2191"},"modified":"2019-11-28T18:56:19","modified_gmt":"2019-11-28T18:56:19","slug":"komunikacja-i2c-oraz-spi-lcd-i-nrf24-2","status":"publish","type":"post","link":"https:\/\/physics.uwb.edu.pl\/wf\/fi-bot\/?p=2191","title":{"rendered":"komunikacja I2C (LCD na hd44780)"},"content":{"rendered":"<p><em>(Wpis ten jest reaktywacj\u0105 <a href=\"http:\/\/physics.uwb.edu.pl\/wf\/fi-bot\/?p=683\">wpisu z 2017<\/a> r. Okaza\u0142o si\u0119, \u017ce warto podzieli\u0107 oryginalny wpis na dwie mniejsze cz\u0119\u015bci &#8211; jedna dotycz\u0105ca komunikacji I2C w\u0142a\u015bnie, druga SPI).<\/em><\/p>\n<h2>Komunikacja I2C<\/h2>\n<p>To bardzo popularny interface komunikacyjny, obs\u0142uguj\u0105cy za pomoc\u0105 tylko 2 linii a\u017c 127 urz\u0105dze\u0144! tymi pinami s\u0105 SDA (w Arduino pin A4) oraz SDC (w Arduino pin A5). Oznacza to, \u017ce gdy pod\u0142\u0105czamy co\u015b na I2C &#8222;tracimy&#8221; piny A4 i A5. Trudno &#8211; co\u015b za co\u015b. Zreszt\u0105, to nic nowego &#8211; podobnie jest z komunikacj\u0105 UART &#8211; Serial.begin(xxx) &#8211; &#8222;zabiera&#8221; nam cyfrowe piny #o (TX) i #1 (RX). Przy czym UART to tylko komunikacja z jednym urz\u0105dzeniem &#8211; a tutaj 2 piny i mo\u017cliwo\u015b\u0107 obs\u0142ugi do 127 urz\u0105dze\u0144!<\/p>\n<h2>HD44780 i LCD 16&#215;2<\/h2>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-medium wp-image-697\" src=\"http:\/\/physics.uwb.edu.pl\/wf\/fi-bot\/wp-content\/uploads\/sites\/6\/2017\/05\/Konwerter_I2C_do_wywietlacza_LCD_HD44780-300x300.jpg\" alt=\"\" width=\"300\" height=\"300\" srcset=\"https:\/\/physics.uwb.edu.pl\/wf\/fi-bot\/wp-content\/uploads\/sites\/6\/2017\/05\/Konwerter_I2C_do_wywietlacza_LCD_HD44780-300x300.jpg 300w, https:\/\/physics.uwb.edu.pl\/wf\/fi-bot\/wp-content\/uploads\/sites\/6\/2017\/05\/Konwerter_I2C_do_wywietlacza_LCD_HD44780-150x150.jpg 150w, https:\/\/physics.uwb.edu.pl\/wf\/fi-bot\/wp-content\/uploads\/sites\/6\/2017\/05\/Konwerter_I2C_do_wywietlacza_LCD_HD44780.jpg 585w\" sizes=\"auto, (max-width: 300px) 100vw, 300px\" \/><\/p>\n<p>Jako przyk\u0142ad komunikacji I2C u\u017cyli\u015bmy wy\u015bwietlacza LCD 16&#215;2 z dodatkowym sterownikiem <strong>hd44780<\/strong>. Po co ten sterownik? wszak to bardzo popularny wy\u015bwietlacz i mo\u017cna go pod\u0142\u0105czy\u0107 w ten spos\u00f3b:<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"alignnone wp-image-695 size-large\" src=\"http:\/\/physics.uwb.edu.pl\/wf\/fi-bot\/wp-content\/uploads\/sites\/6\/2017\/05\/LCD_Base_bb_Fritz-1024x566.png\" alt=\"\" width=\"640\" height=\"354\" srcset=\"https:\/\/physics.uwb.edu.pl\/wf\/fi-bot\/wp-content\/uploads\/sites\/6\/2017\/05\/LCD_Base_bb_Fritz-1024x566.png 1024w, https:\/\/physics.uwb.edu.pl\/wf\/fi-bot\/wp-content\/uploads\/sites\/6\/2017\/05\/LCD_Base_bb_Fritz-300x166.png 300w, https:\/\/physics.uwb.edu.pl\/wf\/fi-bot\/wp-content\/uploads\/sites\/6\/2017\/05\/LCD_Base_bb_Fritz-768x425.png 768w, https:\/\/physics.uwb.edu.pl\/wf\/fi-bot\/wp-content\/uploads\/sites\/6\/2017\/05\/LCD_Base_bb_Fritz.png 1845w\" sizes=\"auto, (max-width: 640px) 100vw, 640px\" \/>Przypatrzmy si\u0119 uwa\u017cnie co my tu widzimy &#8211; zwracam uwag\u0119 na liczb\u0119 pin\u00f3w potrzebnych do obs\u0142ugi wy\u015bwietlacza przez Arduino. Uwa\u017cne oko uczestnika sdanaszych spotka\u0144 zauwa\u017cy, \u017ce potrzeba <strong>a\u017c 6 cyfrowych pin\u00f3w<\/strong>. To sporo! Wszystko jest OK, gdy robimy proste programy, poznajemy modu\u0142y (w tym w\u0142a\u015bnie taki LCD) wi\u0119c tych 6 pin\u00f3w nie robi problemu. Ale my mamy ju\u017c nasz pojazd i wykorzystanych 6 pin\u00f3w do jego sterowania (a w planach kolejne rozbudowy). Jak wi\u0119c poradzi\u0107 sobie z problemem (powoli) ko\u0144cz\u0105cych si\u0119 pin\u00f3w w Arduino UNO? Zakupi\u0107 Megasa? A mo\u017ce u\u017cy\u0107 w\u0142a\u015bnie sterownika na I2C &#8211; w\u00f3wczas potrzeba jedynie 2 pin\u00f3w!<\/p>\n<p>My skorzystali\u015bmy z wymienimego sterownika PLUS biblioteki&nbsp;<strong>Liqui<\/strong><strong>dCrystal_I2C<\/strong>&nbsp;autorstwa <strong>Franka de Brabander<\/strong>-a. Sporo jest podobnych bibliotek, wi\u0119c doinstalowywuj\u0105c j\u0105 sobie warto zwr\u00f3ci\u0107 uwag\u0119 na t\u0105 u\u017cyt\u0105 przeze mnie, a nie inn\u0105. Na szybko poznali\u015bmy kilka metod nowego obiektu do obs\u0142ugi wy\u015bwietlacza:<\/p>\n<pre class=\"lang:arduino decode:true\" title=\"LCD16x2 sterowany przez I2C\">include &lt;Wire.h&gt;   \/\/ standardowa biblioteka Arduino\n#include &lt;LiquidCrystal_I2C.h&gt; \/\/ dolaczenie pobranej biblioteki I2C dla LCD\n\nLiquidCrystal_I2C lcd(0x27, 16, 2);\n\/\/LiquidCrystal_I2C lcd(0x3f, 16, 2);\n\n\nvoid setup(){\n  lcd.init();\n  lcd.begin(16,2);   \/\/ Inicjalizacja LCD 2x16\n  \n  lcd.backlight(); \/\/ zalaczenie podwietlenia \n  lcd.setCursor(0,0); \/\/ Ustawienie kursora w pozycji 0,0 (pierwszy wiersz, pierwsza kolumna)\n  lcd.print(\"pomidor!\");\n  delay(500);\n  lcd.setCursor(0,1); \/\/Ustawienie kursora w pozycji 0,0 (drugi wiersz, pierwsza kolumna)\n  lcd.print(\"LCD 16x2 I2C -- hd44780\");\n\n}\n\nint nico=7;\nvoid loop() \n{\n   lcd.backlight(); \/\/ zalaczenie podswietlenia\n   lcd.setCursor(10,1);\n   lcd.print(millis()\/1000);\n   delay(1000);\n   lcd.noBacklight(); \/\/ wylaczenie podswietlenia\n   lcd.setCursor(0,0);\n   lcd.print(nico);\n   nico=nico*2;\n   delay(1000);\n}<\/pre>\n<p>Warto j\u0105 pozna\u0107 dok\u0142adniej, czytaj\u0105c <a href=\"https:\/\/github.com\/fdebrabander\/Arduino-LiquidCrystal-I2C-library\">dokumentacj\u0119<\/a>.<\/p>\n<h2>Adresacja u\u017c\u0105dze\u0144 I2C&nbsp;<\/h2>\n<p>Skoro do tych samych pin\u00f3w SDA i SDC mo\u017cna pod\u0142\u0105czy\u0107 do 127 urz\u0105dze\u0144, to sk\u0105d wiadomo, kto co nadaje? Np. je\u015bli chcemy u\u017cy\u0107 dw\u00f3ch LCD-k\u00f3w, na jedynym wy\u015bwietla\u0107 pewne informacje a na innym inne to jak kierowa\u0107 napisy na r\u00f3\u017cne urz\u0105dzenia?<\/p>\n<p>Wa\u017cne jest poznanie adresu naszego u\u017c\u0105dzenia &#8211; w tym celu nale\u017cy wygoogla\u0107 \u015bwietny programik <strong>i2c_scanner<\/strong> i wgra\u0107 do Arduino z pod\u0142\u0105czonym wy\u015bwietlaczem (zreszt\u0105, nie tylko wy\u015bwietlaczem &#8211; czymkolwiek na I2C).<\/p>\n<p>A jak zmieni\u0107 adres w omawianym sterowniku hd44780? Bo gdy kupiny sobie dwa takie i chcemy je wykorzysta\u0107 razem to b\u0119dzie to niemo\u017cliwe &#8211; oba b\u0119d\u0105 mie\u0107 fabrycznie te same adresy (albo <strong>0x27<\/strong>&nbsp;&#8211; gdy to modu\u0142 PCF8574\/PCF8574T lub <strong>0x3f<\/strong> &#8211; dla modu\u0142\u00f3w PCF8574A). Jest mo\u017cliwo\u015b\u0107 zmiany adresu zwieraj\u0105c ze sob\u0105 (lutuj\u0105c) piny A012 na spodzie modu\u0142u:<\/p>\n<p><a href=\"https:\/\/alselectro.wordpress.com\/2016\/05\/12\/serial-lcd-i2c-module-pcf8574\/\"><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-medium wp-image-698\" src=\"http:\/\/physics.uwb.edu.pl\/wf\/fi-bot\/wp-content\/uploads\/sites\/6\/2017\/05\/jumper_thumb-300x217.png\" alt=\"\" width=\"300\" height=\"217\" srcset=\"https:\/\/physics.uwb.edu.pl\/wf\/fi-bot\/wp-content\/uploads\/sites\/6\/2017\/05\/jumper_thumb-300x217.png 300w, https:\/\/physics.uwb.edu.pl\/wf\/fi-bot\/wp-content\/uploads\/sites\/6\/2017\/05\/jumper_thumb.png 423w\" sizes=\"auto, (max-width: 300px) 100vw, 300px\" \/><\/a><\/p>\n<p>Kliknij obrazek by dowiedzie\u0107 si\u0119 co i jak.<\/p>\n<p style=\"text-align: right;\"><em>(c) K.G. 2017, 2019<\/em><\/p>\n<p>&nbsp;<\/p>\n","protected":false},"excerpt":{"rendered":"<p>(Wpis ten jest reaktywacj\u0105 wpisu z 2017 r. Okaza\u0142o si\u0119, \u017ce warto podzieli\u0107 oryginalny wpis na dwie mniejsze cz\u0119\u015bci &#8211; jedna dotycz\u0105ca komunikacji I2C w\u0142a\u015bnie, druga SPI). Komunikacja I2C To bardzo popularny interface komunikacyjny, obs\u0142uguj\u0105cy za pomoc\u0105 tylko 2 linii a\u017c 127 urz\u0105dze\u0144! tymi pinami s\u0105 SDA (w Arduino pin A4) oraz SDC (w Arduino [&hellip;]<\/p>\n","protected":false},"author":5,"featured_media":55,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"ngg_post_thumbnail":0,"footnotes":""},"categories":[1],"tags":[141,25,26,144,143,138],"class_list":{"0":"post-2191","1":"post","2":"type-post","3":"status-publish","4":"format-standard","5":"has-post-thumbnail","6":"hentry","7":"category-uncategorized","8":"tag-hd44780","9":"tag-i2c","10":"tag-lcd","11":"tag-scl","12":"tag-sda","13":"tag-twi","15":"post-with-thumbnail","16":"post-with-thumbnail-large"},"_links":{"self":[{"href":"https:\/\/physics.uwb.edu.pl\/wf\/fi-bot\/index.php?rest_route=\/wp\/v2\/posts\/2191","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/physics.uwb.edu.pl\/wf\/fi-bot\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/physics.uwb.edu.pl\/wf\/fi-bot\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/physics.uwb.edu.pl\/wf\/fi-bot\/index.php?rest_route=\/wp\/v2\/users\/5"}],"replies":[{"embeddable":true,"href":"https:\/\/physics.uwb.edu.pl\/wf\/fi-bot\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=2191"}],"version-history":[{"count":3,"href":"https:\/\/physics.uwb.edu.pl\/wf\/fi-bot\/index.php?rest_route=\/wp\/v2\/posts\/2191\/revisions"}],"predecessor-version":[{"id":2202,"href":"https:\/\/physics.uwb.edu.pl\/wf\/fi-bot\/index.php?rest_route=\/wp\/v2\/posts\/2191\/revisions\/2202"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/physics.uwb.edu.pl\/wf\/fi-bot\/index.php?rest_route=\/wp\/v2\/media\/55"}],"wp:attachment":[{"href":"https:\/\/physics.uwb.edu.pl\/wf\/fi-bot\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=2191"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/physics.uwb.edu.pl\/wf\/fi-bot\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=2191"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/physics.uwb.edu.pl\/wf\/fi-bot\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=2191"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}