Robotik Kodlama

Robotik Kodlama
Ana Sayfa

İLGİNİZİ ÇEKEBİLECEK LİNKLER :

29 Haziran 2021 Salı

Arduino ile I2C LCD kullanımı

 Arduino ile I2C LCD kullanımı

Daha önce bir Arduino ile bir LCD ekran bağlamayı denediyseniz, Arduino'da çok fazla pin tükettiğini fark etmiş olabilirsiniz. 4-bit modunda bile, Arduino hala toplam yedi bağlantıya ihtiyaç duyar - bu, Arduino'nun mevcut dijital I / O pinlerinin yarısıdır.

Çözüm, bir I2C LCD Ekran kullanmaktır. Bir dizi dijital G / Ç pini bile olmayan yalnızca iki G / Ç pini tüketir ve diğer I2C aygıtlarıyla da paylaşılabilir.

I2C LCD Donanımına Genel Bakış

Tipik bir I2C LCD ekranı, HD44780 tabanlı karakterli bir LCD ekran ve bir I2C LCD adaptöründen oluşur. Onları tek tek tanıyalım.

Karakter LCD Ekran

Adına sadık kalarak, bu LCD'ler yalnızca metinleri / karakterleri görüntülemek için idealdir. Örneğin 16 × 2 karakterli bir LCD, bir LED arka ışığına sahiptir ve her satırda 16 karakter olmak üzere iki satırda 32 ASCII karakter görüntüleyebilir.

karakterli lcd dahili piksel ızgara yapısı

Yakından bakarsanız, ekrandaki her karakterin küçük dikdörtgenlerini ve bir karakteri oluşturan pikselleri gerçekten görebilirsiniz. Bu dikdörtgenlerin her biri 5 × 8 piksellik bir ızgaradır.

I2C LCD Adaptörü

Adaptörün kalbinde 8-Bit G / Ç Genişletici çipi - PCF8574 bulunur. Bu çip, I2C verilerini bir Arduino'dan LCD ekranın gerektirdiği paralel verilere dönüştürür.

i2c lcd'de pcf8574 çip

Kart ayrıca, ekranın kontrastına ince ayar yapmak için küçük bir trimpot ile birlikte gelir.

i2c lcd adaptör donanımına genel bakış

Ek olarak, kart üzerinde arka ışığa güç sağlayan bir jumper vardır. Arka ışığın yoğunluğunu kontrol etmek için, atlama telini çıkarabilir ve 'LED' olarak işaretlenen başlık pimine harici bir voltaj uygulayabilirsiniz.

LCD I2C Adresi

Aynı I2C veriyolunda birden fazla cihaz kullanıyorsanız, başka bir I2C cihazıyla çakışmaması için kart için farklı bir I2C adresi ayarlamanız gerekebilir.

Bunu yapmak için, kartta üç adet lehim köprüsü (A0, A1 ve A2) veya lehim pedleri bulunur.

i2c lcd'de i2c adres seçimi atlama telleri

Bunların her biri adresi sabit kodlamak için kullanılır. Bir jumper bir lehim bloğu ile kısaltılmışsa, adresi belirler.

Burada önemli bir nokta, birçok şirketin aynı PCF8574 yongasını üretmesidir: Texas Instruments ve NXP Semiconductors bunlardan birkaçıdır. Ve LCD'nizin I2C adresi çip üreticisine bağlıdır.

LCD'nizde Texas Instruments'tan bir PCF8574 yongası varsa:

Göre Texas Instruments veri sayfası , üç adres seçim bitleri (A0, A1 ve A2) 7 bit I2C adresi kayıttaki ucuna yerleştirilir.

texas Instruments pcf8574 i2c adres kaydı

YÜKSEK / DÜŞÜK olmak üzere 2 durum alabilen 3 adres girişi olduğundan, 8 (2 3 ) farklı kombinasyon (adres) oluşturabiliriz.

Varsayılan olarak, 3 adres girişinin tümü, yerleşik pullups kullanılarak YÜKSEK çekilir ve PCF8574'e varsayılan olarak 0100111 Binary veya 0x27 Hex I2C adresi verir.

Lehim atlama tellerini kısaltarak, adres girişlerine DÜŞÜK atılır. Üç jumper'ı da kısa devre yaparsanız, adres 0x20 olacaktır. Olası tüm adreslerin aralığı 0x20 ile 0x27 arasındadır. Lütfen aşağıdaki resme bakın.

ti için i2c lcd adres seçimi jumper tablosu

LCD'nizde NXP Semiconductors'dan bir PCF8574 yongası varsa:

Göre NXP yarı iletkenler veri sayfası , üç adres seçim bitleri (A0, A1 ve A2), aynı zamanda, 7 bit I2C adresi kayıttaki ucuna yerleştirilir. Ancak Adres Kaydındaki diğer bitler farklıdır.

nxp semiconductors pcf8574 i2c adres kaydı

Tekrar! 3 adres girişi, bize 8 (2 3 ) farklı kombinasyon veren YÜKSEK / DÜŞÜK olmak üzere 2 duruma sahip olabilir .

Varsayılan olarak, 3 adres girişinin tümü, yerleşik pullups kullanılarak YÜKSEK çekilir ve PCF8574'e varsayılan 0111111 İkili veya 0x3F Hex I2C adresi verir.

Lehim atlama tellerini kısaltarak, adres girişlerine DÜŞÜK atılır. Üç jumper'ı da kısa devre yaparsanız, adres 0x38 olacaktır. Olası tüm adreslerin aralığı 0x38 ile 0x3F arasındadır. Lütfen aşağıdaki resme bakın.

nxp için i2c lcd adres seçimi atlama tablosu

I2C LCD ekran Pinout

Bir I2C LCD, kendisini dış dünyaya arayüzleyen yalnızca 4 pime sahiptir. Bağlantılar aşağıdaki gibidir:

i2c lcd ekran pin çıkışı

GND bir toprak pimidir ve Arduino'nun toprağına bağlanmalıdır.

VCCmodüle ve LCD'ye güç sağlar. Arduino'nun 5V çıkışına veya ayrı bir güç kaynağına bağlayın.

SDASeri Veri pinidir. Bu hat hem gönderme hem de alma için kullanılır. Arduino'daki SDA pinine bağlayın.

SCLbir Seri Saat pinidir. Bu, Bus Master cihazı tarafından sağlanan bir zamanlama sinyalidir. Arduino'daki SCL pinine bağlayın.

Arduino Uno'yu bir I2C LCD ekrana bağlama

Bir I2C LCD bağlamak, standart bir LCD bağlamaktan çok daha kolaydır. Sadece 12 yerine 4 pin bağlamanız gerekir. VIN pinini Arduino'daki 5V çıkışa bağlayarak başlayın ve GND'yi toprağa bağlayın.

Şimdi I2C iletişimi için kullanılan pinlerde kaldık. Her Arduino Board'un uygun şekilde bağlanması gereken farklı I2C pinlerine sahip olduğunu unutmayın. R3 düzenine sahip Arduino kartlarında, SDA (veri hattı) ve SCL (saat hattı), AREF pinine yakın pin başlıkları üzerindedir. A5 (SCL) ve A4 (SDA) olarak da bilinirler.

Farklı bir Arduino kartı kullanıyorsanız, lütfen aşağıdaki tabloya bakın.

SCLSDA
Arduino UnoA5A4
Arduino NanoA5A4
Arduino Mega2120
Leonardo / Mikro32

Aşağıdaki şema, her şeyi nasıl bağlayacağınızı gösterir.

arduino ile i2c lcd ekran kablolama

LCD Kontrastını Ayarlama

LCD'yi bağladıktan sonra, ekranın kontrastını ayarlamanız gerekecektir. I2C modülünde, küçük bir tornavidayla çevirebileceğiniz bir potansiyometre bulacaksınız.

LCD'ye güç sağlamak için Arduino'nun USB konektörünü takın. Arka ışığın yandığını görmelisiniz. Şimdi potansiyometreyi dikdörtgenin ilk satırı görünene kadar döndürün.

Potansiyometreyi çevirerek i2c karakterli lcd kontrastını test etme

Bu yapıldıktan sonra, LCD'yi programlamaya başlayabiliriz.

Kütüphane Kurulumu

Sonraki çizimleri çalıştırmak için LiquidCrystal_I2C adlı bir kitaplık kurmanız gerekir. Bu kitaplık, Arduino IDE'nizle birlikte gelen LiquidCrystal kitaplığının geliştirilmiş bir sürümüdür.

Kitaplığı kurmak için Sketch> Dahil Et> Kitaplıkları Yönet'e gidin  Kitaplık Yöneticisinin kitaplıklar dizinini indirmesini ve kurulu kitaplıkların listesini güncellemesini bekleyin.

Arduino Kitaplığı Kurulumu - Arduino IDE'de Kitaplıkları Yönetmeyi Seçme

Aramanızı 'liquidcrystal' yazarak filtreleyin Birkaç giriş olmalı. Frank de Brabander'in LiquidCrystal I2C kitaplığını arayın Bu girişe tıklayın ve ardından Yükle'yi seçin.

Liquidcrystal_i2c kütüphane kurulumu

I2C Adresinin Belirlenmesi

LCD'nizin I2C adresi, daha önce belirtildiği gibi üreticiye bağlıdır. LCD Texas Instruments bir PCF8574 yongası varsa, varsayılan I2C adresi 0x27 olan Hex . LCD NXP yarı iletkenler bir PCF8574 yongası varsa, varsayılan I2C adresi 0x3F olan Hex .

Dolayısıyla, LCD'nizin muhtemelen bir I2C adresi 0x27 Hex veya 0x3F Hex vardır . Yine de kullanmadan önce LCD'nin gerçek I2C'sini bulmanız önerilir. Neyse ki, Nick Gammon'un harika çalışması sayesinde bunu yapmanın basit bir yolu var.

Nick, I2C veriyolunuzu tarayan ve bulduğu her I2C cihazının adresini size geri veren basit bir I2C tarayıcı taslağı yazdı.

#include <Wire.h>

void setup() {
  Serial.begin (9600);

  // Leonardo: wait for serial port to connect
  while (!Serial) 
    {
    }

  Serial.println ();
  Serial.println ("I2C scanner. Scanning ...");
  byte count = 0;
  
  Wire.begin();
  for (byte i = 8; i < 120; i++)
  {
    Wire.beginTransmission (i);
    if (Wire.endTransmission () == 0)
      {
      Serial.print ("Found address: ");
      Serial.print (i, DEC);
      Serial.print (" (0x");
      Serial.print (i, HEX);
      Serial.println (")");
      count++;
      delay (1);  // maybe unneeded?
      } // end of good response
  } // end of for loop
  Serial.println ("Done.");
  Serial.print ("Found ");
  Serial.print (count, DEC);
  Serial.println (" device(s).");
}  // end of setup

void loop() {}

Bu çizimi Arduino'nuza yükleyin ve ardından seri monitörünüzü açın. I2C LCD ekranınızın I2C adresini göreceksiniz.

i2c adres tarayıcı çıktısı

Lütfen bu adresi not edin. Sonraki çizimlerde ihtiyacınız olacak.

Temel Arduino Sketch - Hello World

Aşağıdaki test taslağı "Merhaba Dünya!" LCD'nin ilk satırında ve ikinci satırda 'LCD eğitimi'.

Ancak, taslağı yüklemeye başlamadan önce, işinize yaraması için bazı değişiklikler yapmanız gerekir. LCD'nizin I2C adresini ve ekranın boyutlarını (ekranın sütunları ve satırları) girmeniz gerekir. 16 × 2 karakter LCD kullanıyorsanız, 16 ve 2; 20 × 4 LCD kullanıyorsanız, 20 ve 4 parametrelerini iletin.

// enter the I2C address and the dimensions of your LCD here
LiquidCrystal_I2C lcd(0x3F, 16, 2);

İşiniz bittiğinde, devam edin ve taslağı deneyin.

#include <LiquidCrystal_I2C.h>

LiquidCrystal_I2C lcd(0x3F,16,2);  // set the LCD address to 0x3F for a 16 chars and 2 line display

void setup() {
  lcd.init();
  lcd.clear();         
  lcd.backlight();      // Make sure backlight is on
  
  // Print a message on both lines of the LCD.
  lcd.setCursor(2,0);   //Set cursor to character 2 on line 0
  lcd.print("Hello world!");
  
  lcd.setCursor(2,1);   //Move cursor to character 2 on line 1
  lcd.print("LCD Tutorial");
}

void loop() {
}

Her şey yolunda giderse, ekranda aşağıdaki çıktıyı görmelisiniz.

Arduino Hello World Program çıkışı ile 16x2 karakter LCD arabirimi

Kod Açıklaması:

Taslak, LiquidCrystal_I2C kitaplığını dahil ederek başlar.

#include <LiquidCrystal_I2C.h>

Daha sonra LiquidCrystal_I2C sınıfının bir nesnesi oluşturulur. Bu nesne 3 parametre kullanır LiquidCrystal_I2C(address,columns,rows)Bu, farklı olması durumunda daha önce bulduğunuz adresle varsayılan adresi ve ekranın boyutlarını değiştirmeniz gereken yerdir.

LiquidCrystal_I2C lcd(0x3F,16,2);

LiquidCrystal_I2C nesnesi bildirildikten sonra, LCD'ye özgü özel yöntemlere erişebilirsiniz.

'Kurulum' fonksiyonunda: init()fonksiyon, lcd nesnesini başlatmak için çağrılır. Ardından clear()işlev çağrılır. Bu işlev, LCD ekranı temizler ve imleci sol üst köşeye hareket ettirir. backlight()Fonksiyonlu LCD arka ışığını açmak için kullanılır.

lcd.init();
lcd.clear();         
lcd.backlight();

Daha sonra, fonksiyon çağırılarak imleç konumu üçüncü sütuna ve LCD'nin ilk satırına ayarlanır lcd.setCursor(2,0)İmleç konumu, yeni metnin LCD'de görüntülenmesini istediğiniz konumu belirtir. Sol üst köşe col = 0, row = 0 olarak kabul edilir.

lcd.setCursor(2,0);

Ardından, 'Merhaba Dünya!' print()işlevi çağırarak yazdırılır .

lcd.print("Hello world!");

Benzer şekilde, sonraki iki satır, imleç konumunu üçüncü sütunda ve ikinci satırda ayarlayacak ve LCD'de 'LCD Eğitimi' yazdıracaktır.

lcd.setCursor(2,1);
lcd.print("LCD Tutorial");

Kitaplığın diğer yararlı işlevleri

LiquidCrystal_I2C nesnesiyle kullanabileceğiniz birkaç yararlı işlev vardır. Bunlardan birkaçı aşağıda listelenmiştir:

  • home() - ekranı temizlemeden imleci LCD'nin sol üst köşesine konumlandırır.
  • cursor() - LCD imlecini, yazdırılacak sonraki karakterin konumunda bir alt çizgi (satır) görüntüler.
  • noCursor() - LCD imlecini gizler.
  • blink() - Yanıp sönen blok stilinde bir LCD imleç oluşturur: yazdırılacak sonraki karakterin konumunda 5 × 8 piksellik yanıp sönen bir dikdörtgen.
  • noBlink() - yanıp sönen blok tarzı LCD imlecini devre dışı bırakır.
  • display() - LCD ekranı açar ve ekranda daha önce yazdırılan karakterleri görüntüler.
  • noDisplay()- LCD ekranı kapatır. Sadece LCD ekranın kapatılması, LCD hafızasındaki verileri temizlemez. Bu, display () işlevi çağrıldığında yeniden gösterileceği anlamına gelir.
  • scrollDisplayLeft()- ekranın içeriğini bir boşluk sola kaydırır. Metni sürekli olarak kaydırmak istiyorsanız, bu işlevi bir döngü içinde kullanmanız gerekir.
  • scrollDisplayRight() - ekranın içeriğini bir boşluk sağa kaydırır.
  • autoscroll()- LCD'nin otomatik kaydırılmasını açar. Mevcut metin yönü soldan sağa (varsayılan) ise, ekran sola kayar, mevcut yön sağdan sola ise ekran sağa kayar.
  • noAutoscroll() - otomatik kaydırmayı kapatır.

Özel Karakterler Oluşturun ve Gösterin

Ekrandaki karakterleri donuk ve heyecan verici bulmuyorsanız, LCD'niz için kendi özel karakterlerinizi (glif) ve sembollerinizi oluşturabilirsiniz. Standart ASCII karakter kümesinin parçası olmayan bir karakteri görüntülemek istediğinizde son derece kullanışlıdırlar .

CGROM ve CGRAM

Hitachi HD44780 kontrol cihazına dayalı tüm LCD ekranlar, CGROM ve CGRAM (Karakter Üreteci ROM ve RAM) adı verilen tanımlanmış karakterleri depolayan iki tür belleğe sahiptir. CGROM belleği uçucu değildir ve değiştirilemez, oysa; CGRAM belleği uçucudur ve herhangi bir zamanda değiştirilebilir.

CGROM, ASCII kodu kullanılarak görüntülenebilen tüm kalıcı yazı tiplerini depolamak için kullanılır. Örneğin, 0x41 yazarsak, LCD'de 'A' karakterini alırız. CGRAM, kullanıcı tanımlı karakterleri saklamak için kullanılabilen başka bir bellektir.

Bu RAM 64 bayt ile sınırlıdır. Anlamı, 5 × 8 piksel tabanlı LCD için; CGRAM'da en fazla 8 kullanıcı tanımlı karakter saklanabilir. Ve 5 × 10 piksel tabanlı LCD için sadece 4 kullanıcı tanımlı karakter saklanabilir.

Özel bir karakter tanımlamak için createChar()işlev kullanılır. Bu işlev 8 baytlık bir diziyi kabul eder. Dizideki her bayt (yalnızca 5 bit dikkate alınır), 5 × 8 matristeki karakterin bir satırını tanımlar. Oysa bayttaki 0'lar ve 1'ler, satırdaki hangi piksellerin kapalı ve hangilerinin açılması gerektiğini belirtir.

Özel Karakter Üreticisi

Özel karakter oluşturmak şimdiye kadar kolay değildi! Özel karakterlerinizi oluşturmanıza yardımcı olacak küçük bir uygulama oluşturduk. Belirli bir pikseli ayarlamak / temizlemek için aşağıdaki 5 × 8 pikselden herhangi birine tıklayabilirsiniz. Piksellere tıkladığınızda, karakterin kodu ızgaranın yanında oluşturulur. Bu kod doğrudan Arduino taslağınızda kullanılabilir.

bayt Karakter [8] =
{
0b00000, 0b00000, 0b01010, 0b11111, 0b11111, 0b01110, 0b00100, 0b00000
};

Aşağıdaki çizim, özel karakterleri nasıl oluşturabileceğinizi ve bunları LCD'de nasıl yazdırabileceğinizi gösterir.

#include <LiquidCrystal_I2C.h>

LiquidCrystal_I2C lcd(0x3F, 16, 2);  // set the LCD address to 0x3F for a 16 chars and 2 line display

// make some custom characters:
byte Heart[8] = {
0b00000,
0b01010,
0b11111,
0b11111,
0b01110,
0b00100,
0b00000,
0b00000
};

byte Bell[8] = {
0b00100,
0b01110,
0b01110,
0b01110,
0b11111,
0b00000,
0b00100,
0b00000
};


byte Alien[8] = {
0b11111,
0b10101,
0b11111,
0b11111,
0b01110,
0b01010,
0b11011,
0b00000
};

byte Check[8] = {
0b00000,
0b00001,
0b00011,
0b10110,
0b11100,
0b01000,
0b00000,
0b00000
};

byte Speaker[8] = {
0b00001,
0b00011,
0b01111,
0b01111,
0b01111,
0b00011,
0b00001,
0b00000
};


byte Sound[8] = {
0b00001,
0b00011,
0b00101,
0b01001,
0b01001,
0b01011,
0b11011,
0b11000
};


byte Skull[8] = {
0b00000,
0b01110,
0b10101,
0b11011,
0b01110,
0b01110,
0b00000,
0b00000
};

byte Lock[8] = {
0b01110,
0b10001,
0b10001,
0b11111,
0b11011,
0b11011,
0b11111,
0b00000
};

void setup() 
{
  lcd.init();
  // Make sure backlight is on       
  lcd.backlight();

  // create a new characters
  lcd.createChar(0, Heart);
  lcd.createChar(1, Bell);
  lcd.createChar(2, Alien);
  lcd.createChar(3, Check);
  lcd.createChar(4, Speaker);
  lcd.createChar(5, Sound);
  lcd.createChar(6, Skull);
  lcd.createChar(7, Lock);

  // Clears the LCD screen
  lcd.clear();

  // Print a message to the lcd.
  lcd.print("Custom Character");
}

// Print All the custom characters
void loop() 
{ 
  lcd.setCursor(0, 1);
  lcd.write(0);

  lcd.setCursor(2, 1);
  lcd.write(1);

  lcd.setCursor(4, 1);
  lcd.write(2);

  lcd.setCursor(6, 1);
  lcd.write(3);

  lcd.setCursor(8, 1);
  lcd.write(4);

  lcd.setCursor(10, 1);
  lcd.write(5);

  lcd.setCursor(12, 1);
  lcd.write(6);

  lcd.setCursor(14, 1);
  lcd.write(7);
}

LCD'de aşağıdaki çıktıyı görmelisiniz:

Arduino Özel Karakter Oluşturma Programı çıkışı ile 16x2 LCD arabirim

Kod Açıklaması:

Kitaplığı dahil edip LCD nesnesini oluşturduktan sonra, özel karakter dizileri tanımlanır. Her dizi, 5 × 8 ledli matrisin her satırı için 1 bayt olmak üzere 8 bayttan oluşur. Bu taslakta 8 özel karakter oluşturulmuştur.

Heart[8]Örnek olarak diziyi inceleyelim Bitlerin gerçekte 0'lar ve 1'ler olan bir kalp şeklini nasıl oluşturduğunu görebilirsiniz. Bir 0 pikseli kapatır ve bir 1 pikseli açar.

byte Heart[8] = {
0b00000,
0b01010,
0b11111,
0b11111,
0b01110,
0b00100,
0b00000,
0b00000
};

Kurulumda, özel karakter createChar()işlev kullanılarak oluşturulur Bu işlev iki parametre alır. İlki, desteklenen 8 özel karakterden birini ayırmak için 0 ile 7 arasında bir sayıdır. İkinci parametre, bayt dizisinin adıdır.

lcd.createChar(0, Heart);

Bir sonraki döngüde, kullandığımız özel karakteri görüntülemek için write()işlevi ve bir parametre olarak görüntülemek istediğimiz karakterin numarasını kullanıyoruz.

lcd.setCursor(0, 1);
lcd.write(0);

ANA SAYFAYA DÖN

Bahadır ÖZGEN
Electronic Robotic Coding Research and Development 1975 - ∞
Learn Forever
If you want, let's learn together...
https://roboticcode2020.blogspot.com/
bahadirozgen1975@gmail.com
facebook    robotic.code
instagram    @roboticcode


Sayfalarımı ziyaret ettiğiniz için teşekkür ederim.Bu sitede mevcut olan içerikler kendi oluşturduğum projeler yazı,resim ve videolardan oluşmaktadır.İçerik oluşturmak çok uzun sürdüğü için bazı projelerde yurtdışı kaynaklardan faydalandım.Buradaki amacım ticari değildir.Kaynağı belli olan ve bizim kaynağına ulaşabildiğimiz materyal (yazı, fotoğraf, resim, video v.b.) için ilgili konularda fotoğraflarda logo varsa v.b. not olarak gösterilecektir.Sitemizde yayınlanan tüm içerik, bizim tarafımızdan ve internet üzerinden youtube, facebook ve blog gibi paylaşıma sunulmuş kaynak sitelerden alındığı için, sitemiz yasal yükümlülüğe tabi tutulamaz. Sitemizde telif haklarının size ait olduğu bir içerik varsa ve bunu kaldırmamızı isterseniz, iletişim sayfamızdan bizimle iletişime geçtiğiniz takdirde içerik yayından kaldırılacaktır.Bu konu ve modüller ile uğraşarak, ileride çok güzel makine ve elektronik aletler yapabilirsiniz.