Ana sayfa Çözümler Arduino ve OLED Knob Display ile Custom CAN ID Smart Display Kontrolü

Arduino ve OLED Knob Display ile Custom CAN ID Smart Display Kontrolü

Mar 01,2024

Tanıtım

Custom CAN ID protokolü, endüstriyel otomasyon uygulamalarında cihaz kontrolü için kullanılan iletişim yöntemlerinden biridir. Bu tür uygulamalarda Arduino kartı, sistem entegrasyonu için bir host kontrolcü olarak kullanılabilir ve özellikle dokunmatik özelliği bulunmayan Smart Display'lerin kontrolünde pratik bir çözüm sunar. Custom CAN ID protokolü üzerinden Arduino kartı ile dokunmatik olmayan Smart Display'ler kontrol edilebilir.

Bu makalede, Arduino UNO ve CAN bus shield kullanılarak Custom CAN ID protokolü üzerinden bir Smart Display'in OLED Knob Display ile nasıl kontrol edilebileceğini gösteren örnek bir uygulama ele alınmaktadır. Demo programı, dokunmatik olmayan Smart Display üzerinde farklı işlevlerin ve işlemlerin nasıl gerçekleştirilebileceğini göstermektedir. Bu örnek, OLED Knob Display kullanarak dokunmatik ve dokunmatik olmayan ekranların kontrolü, host programlama ve sistem entegrasyonu hakkında daha fazla bilgi edinmek isteyen geliştiriciler için pratik bir referans sunmaktadır. Uygulamanın sistem yapısı aşağıdaki şemada gösterilmektedir.

Bu uygulama için aşağıdaki bileşenler gereklidir:

  1. 10.1” Smart Display Custom CAN ID
  2. ARDUINO UNO
  3. ARDUINO UNO için CAN bus shield
  4. OLED Display Knob Rotator modülü
  5. ST-Link CAN bus Dongle
  6. GUI Builder v0.4.2 veya üzeri
  7. Arduino IDE v2.0.4
 

Demo üç ana bölümden oluşmaktadır:

  1. GUI Builder'da demo projesinin tasarlanması
  2. Projenin oluşturulması ve cihaza yüklenmesi
  3. Arduino host'un programlanması
 

GUI Builder'da Demo Projesinin Tasarlanması

İlk olarak, güncel bir GUI Builder sürümünü açın ve yeni bir proje oluşturun. Proje adını girin ve proje klasörünün otomatik olarak seçildiğini doğrulayın. Ardından cihaz tipini seçin; bu örnekte 10.1" ekran kullanılmaktadır. İlgili protokolü seçin ve ekran yönünü varsayılan yatay (landscape) modda bırakın. Boş bir kullanıcı arayüzü şablonu seçtikten sonra “Create” düğmesine tıklayarak projeyi oluşturun. Bu adımlar aşağıdaki görselde gösterilmektedir.

Proje oluşturulduktan sonra aşağıdaki sayfa açılır.

Demo senaryosunu oluşturmak için toplam dört sayfa gereklidir. Bu nedenle mevcut sayfaya üç yeni sayfa daha eklenmelidir. Bunun için “Page” düğmesine tıklayın ve ardından artı (+) düğmesini kullanarak üç yeni sayfa ekleyin.

Bir sonraki adımda özel bir arka plan eklenir. Resource bölümüne gidin ve Background seçeneğini bulun. 2 numaralı alanda Industry, Medical ve Vehicle sayfaları için önceden tanımlanmış üç farklı arka plan bulunmaktadır. Yeni bir arka plan eklemek için 3 numaralı alandaki “Add Widget” düğmesine tıklayın. Ardından 4 numaralı alanda Reset düğmesinin solunda bulunan üç nokta (...) düğmesini seçin. Bu seçenek üzerinden bilgisayarınızdaki özel bir arka plan görselini ekleyebilir ve ilk sayfada kullanılacak varsayılan arka planı değiştirebilirsiniz.

Ardından Pages bölümündeki mevcut seçenekler arasından kullanılacak arka plan tasarımını seçebilirsiniz. Seçim işlemi aşağıdaki görselde gösterilmektedir.

Şimdi özel bir widget ekleme işlemine geçebiliriz. Demo senaryosunda Industry, Medical ve Vehicle sayfaları arasında seçim yapmak için özelleştirilmiş bir Multistate widget kullanılmaktadır. İlk sayfadaki Controls bölümüne geri dönün, ardından Resource bölümüne giderek Multistate widget seçeneğini bulun. 2 numaralı alandaki “Add Widget” düğmesine, ardından 3 numaralı alandaki “Modify” düğmesine tıklayın. Dördüncü adımda widget ile ilişkili tüm varsayılan görselleri silin. Beşinci adımda 5 numaralı alandaki “Add” düğmesine tıklayın ve altıncı adımda bilgisayarınızdaki klasörden özel widget görsellerini tek tek seçin. Son olarak yedinci adımda “OK” düğmesine tıklayarak özel görselleri Multistate widget listesine ekleyin. İşlem aşağıdaki görselde gösterilmektedir.

İlk sayfadaki Controls bölümüne tekrar dönün. Demo senaryosuna uygun olarak Industry, Medical ve Vehicle sayfaları arasında seçim yapmak için oluşturduğunuz özel Multistate widget'ı seçin. Widget'ı sürükleyip sayfa düzenindeki ilgili alana bırakın. Böylece ilk sayfanın tasarımı tamamlanmış olur.

Aynı işlemi oluşturduğunuz diğer üç sayfa için de uygulayın. İkinci sayfada endüstriyel uygulamalarla ilgili widget'ları, üçüncü sayfada medikal uygulamalarla ilgili widget'ları ve dördüncü sayfada araç uygulamalarıyla ilgili widget'ları seçin. İlgili widget'ları sürükleyip karşılık gelen sayfa düzenlerine yerleştirin.

Projeyi Derleme ve Cihaza Yükleme

Dört farklı sayfayı oluşturup ilgili widget'ları her sayfaya yerleştirdikten sonra, başlangıç sayfasında Industry, Medical ve Vehicle sayfaları arasında seçim yapmak için özelleştirilmiş Multistate widget'ın bulunduğundan emin olun. Ardından projeyi derleme ve cihaza yükleme işlemine geçebilirsiniz. Page Information bölümünden “Device” düğmesine tıklayın ve “Device Properties” seçeneğini açın. Protokol ayarlarının doğru olduğunu kontrol ettikten sonra uygun COM portunu seçin ve kullanılacak baud rate değerini belirleyin. “Connect to Device” düğmesine tıklayarak cihaz bağlantısını kurun. Son olarak aşağıdaki görselde gösterildiği gibi “Upload” düğmesine tıklayarak projeyi cihaza yükleyin. Yükleme işleminin tamamlanmasını bekleyin.

Proje yükleme işlemi tamamlandığında, aşağıdaki görselde gösterildiği gibi “OK” düğmesine tıklayın.

Yükleme tamamlandıktan sonra aşağıdaki görselde gösterilen başlangıç ekranı görüntülenir.

Başlangıç ekranının ardından sistem ilk sayfaya geçer. Böylece GUI Builder üzerinden proje oluşturma ve yükleme işlemleri tamamlanmış olur.

Arduino Host'un Programlanması

Aşağıdaki kod örneği, programın çalışması için gerekli kütüphane ve header dosyalarının içe aktarıldığı “includes” bölümüyle başlar. Bunlar arasında Adafruit_SSD1327, Adafruit_FT6206, Adafruit_GFX ve SPI gibi kütüphanelerin yanı sıra mcp2515_can.h, lcdgfx_gui.h ve lcdgfx.h gibi özel header dosyaları da bulunmaktadır.

“Includes” bölümünün ardından, programda kullanılacak sabitlerin ve pin yapılandırmalarının tanımlandığı “defines” bölümü gelir. Bu bölümde rotary encoder pinleri, OLED ekran boyutları, CAN bus ayarları, widget ayarları ve diğer gerekli parametreler tanımlanır.

Son bölümde ise kullanılan mikrodenetleyici türünü kontrol eden koşullu bir yapı bulunmaktadır. Program bir SAMD mikrodenetleyici üzerinde çalışıyorsa SerialUSB arayüzü, diğer durumlarda ise standart Serial arayüzü kullanılır.

Özetle, aşağıdaki kod bölümü gerekli kütüphaneleri programa dahil eder, temel sabitleri ve pin yapılandırmalarını tanımlar ve kullanılan mikrodenetleyiciye göre uygun seri haberleşme arayüzünü seçer.

Ardından programda kullanılacak gerekli değişkenler ve pinler tanımlanıp başlatılır. Örneğin:

SPI_CS_PIN: Değeri 9 olarak tanımlanan bu sabit, SPI haberleşmesi için chip select pinini belirtir.
CAN_INT_PIN: Değeri 2 olarak tanımlanan bu sabit, CAN bus için interrupt pinini belirtir.
CAN: mcp2515_can sınıfının bir örneği oluşturulur ve SPI_CS_PIN değeri kullanılarak başlatılır. Bu nesne CAN bus üzerinden haberleşme için kullanılır.
ts: Adafruit_FT6206 sınıfının bir örneğidir ve dokunmatik ekran işlevlerini yönetmek için kullanılır.
display: DisplaySSD1327_128x128_SPI sınıfının bir örneği oluşturulur ve SSD1327 ekran ile SPI haberleşmesi için gerekli pin yapılandırmalarıyla başlatılır.

Aşağıdaki kod bölümünde, unsigned char türünde elemanlardan oluşan birden fazla dizi tanımlanıp başlatılır. Bu dizilerin işlevleri aşağıdaki gibidir:

“configMsg”: Yapılandırma mesajını temsil eden 8 adet unsigned char elemanından oluşan bir dizidir.
`PageIndex_0` ile `PageIndex_3`: Her biri 8 adet unsigned char elemanından oluşur ve 0 ile 3 arasındaki sayfa indekslerini temsil eder.
“displayMode”: Ekran modunu belirten 8 adet unsigned char elemanından oluşan bir dizidir.

Bunlara ek olarak `stmp`, `stmp1`, `stmp2` ile başlayıp `stmp12`'ye kadar devam eden çeşitli diziler bulunmaktadır. Bu dizilerin her biri 8 adet unsigned char elemanından oluşur ve farklı widget'lara veya bileşenlere ait veri baytlarını saklamak için kullanılır.

Özetle bu diziler; yapılandırma mesajları, sayfa indeksleri, ekran modu ve widget'lara ait veriler gibi programın çalışması için gerekli veri gruplarını saklar.

Bu bölümde, “imageIndex” adlı integer parametresini alan “bitmapDemo” fonksiyonu tanımlanmaktadır. Bu fonksiyon, OLED Knob Display üzerinde ilgili görseli görüntülemek için kullanılır.
Görseller ile bunların ekrandaki konum ve boyut bilgileri “Image.h” header dosyasında tanımlanmıştır.

Aşağıdaki fonksiyon, belirli aralıklarla bekleyerek ve `Recv` flag değişkeninin değerini kontrol ederek CAN bus üzerinden gelecek yanıtı bekler. Yanıt alındığında `Recv` flag değeri tekrar 0 olarak ayarlanır.

Bu kodda, CAN bus haberleşme sisteminde görüntülenen sayfayı değiştirmek için kullanılan `changePageFunction` fonksiyonu tanımlanmaktadır. Fonksiyon, kendisine verilen `pageValue` parametresine göre CAN bus üzerinden ilgili mesajı göndererek sayfa değerini değiştirir. Gönderilecek mesaj, `pageValue` değerine göre belirlenir ve ilgili `PageIndex` dizisi kullanılır.

“handleTouchEvents” fonksiyonu, dokunmatik ekrandaki dokunma olaylarını yönetir. Dokunma girişini algılar, koordinatları dönüştürür ve dokunmanın süresine bağlı olarak ilgili işlemi gerçekleştirir. Ayrıca dokunma girişine göre mevcut sayfayı değiştirmek için `changePageFunction` fonksiyonunu kullanır. Örneğin uzun basma algılandığında ana sayfaya dönmek için `changePageFunction` çağrılır. Kısa basma algılandığında ise seçilen sayfaya geçiş yapılır.

Aşağıdaki kod bölümü Arduino'daki “setup” fonksiyonunu göstermektedir. Bu fonksiyon program başlatıldığında yalnızca bir kez çalışır ve pinlerin başlatılması, seri haberleşmenin kurulması, ekranın yapılandırılması, CAN bus'ın başlatılması ve dokunmatik ekran kontrolcüsünün devreye alınması gibi işlemleri gerçekleştirir.

İlk olarak pinA, pinB, pinC ve EN_Pin pinlerinin çalışma modları belirlenir. İlgili pinler pull-up dirençleri etkinleştirilmiş giriş veya çıkış olarak yapılandırılır. EN_Pin çıkışı HIGH seviyesine ayarlanır.

Ardından seri haberleşme 115200 baud rate ile başlatılır ve bağlantı kurulana kadar beklenir.

Daha sonra display nesnesi başlatılır; font ve renk gibi ilgili ekran ayarları yapılandırılır. Belirlenen konumda bir bitmap görseli ekrana çizilir ve ardından 2 saniyelik bir bekleme uygulanır.

CAN_INT_PIN pinine bir interrupt atanır ve interrupt oluştuğunda çalıştırılacak fonksiyon olarak MCP2515_ISR belirlenir. Interrupt, sinyalin düşen kenarında tetiklenir.

CAN bus, 250 kbit/s haberleşme hızıyla başlatılır. Başlatma işlemi başarısız olursa program belirli bir gecikmenin ardından tekrar dener. Başarılı olduğunda CAN bus normal çalışma moduna alınır ve seri çıkış üzerinden başarılı başlatma mesajı gönderilir.

Ardından filter mask ve filter ayarları, extended frame'ler dahil olmak üzere tüm frame'leri kabul edecek şekilde yapılandırılır.

Dokunmatik ekran kontrolcüsü başlatılır. Başlatma başarısız olursa seri çıkışa bir hata mesajı gönderilir ve program sonsuz döngüye girer.

Dokunmatik ekran başarıyla başlatıldığında seri çıkış üzerinden başarılı başlatma mesajı görüntülenir.

Bu fonksiyon, MCP2515 CAN kontrolcüsü için kullanılan interrupt service routine (ISR) işlevini görür. Interrupt tetiklendiğinde ilgili flag değerini ayarlar ve seri çıkış üzerinden bir mesaj gönderir.

Bu fonksiyonlar knob durumunun yönetilmesiyle ilgilidir. “setKnobState” fonksiyonu knob durumunu günceller ve idle durumunun algılanması için kullanılan zamanlayıcıyı ayarlar. “isKnobIdle” fonksiyonu ise zamanlayıcı değerine göre knob'un o anda idle durumda olup olmadığını kontrol eder.

“redrawScreen()” fonksiyonu, knob'un mevcut durumuna göre ekran içeriğini günceller. Fonksiyon durum değişikliğini kontrol eder, ekranı temizler ve knob durumuna karşılık gelen bitmap görselini ekrana çizer.

“loop()” fonksiyonunun aşağıdaki bölümü üç pinin durumunu okur ve bu değerlere göre yeni bir durum belirler. Yeni durum önceki durumdan farklıysa sayaç, “MultiStateValue”, “GaugeValue” ve diğer widget değişkenlerinin değerlerinin güncellenmesi dahil olmak üzere ilgili işlemler gerçekleştirilir.

“loop()” fonksiyonundaki önceki kod bloğunun ardından bu bölüm, knob'un belirli bir yönde döndürüldüğü durumu işler. İlgili değişkenler güncellenir ve gerekli fonksiyonlar çağrılır. Daha sonra bir sonraki `loop()` döngüsünde kullanılmak üzere önceki durum değişkeni güncellenir.

Bu bölüm, “loop()” fonksiyonunun kalan kısmını göstermektedir. Önceki kod bloğunun ardından aşağıdaki işlemler gerçekleştirilir.

`oldState` değişkeni, `newState` değişkeninin mevcut değeriyle güncellenir.

`nowPage` değeri 0 olduğunda, yani Page 1 görüntülenirken, kod `MultiStateValue` değerinin `LastMultiStateValue` değerinden farklı olup olmadığını kontrol eder. Değer değişmişse `LastMultiStateValue`, yeni `MultiStateValue` değeriyle güncellenir ve `MultiStateValue` değeri `stmp1` dizisine kaydedilir. Ardından bu değeri içeren mesaj, 0x716 Multi-State ID'si kullanılarak CAN bus üzerinden gönderilir.

`nowPage` değeri 1 olduğunda, yani Page 2 görüntülenirken, farklı widget'lara ait `CircleProgressValue`, `HorizontalSliderValue`, `VerticalSliderValue`, `TemperatureValue`, `GaugeValue`, `FixedWidgetValue` ve `IndicatorValue` değişkenleri için benzer kontroller gerçekleştirilir. Bu değerlerden herhangi biri önceki değerinden farklıysa ilgili son değer güncellenir ve yeni değeri içeren mesaj uygun ID kullanılarak CAN bus üzerinden gönderilir.

`nowPage` değeri 2 olduğunda, yani Page 3 görüntülenirken, bu sayfada bulunan `CircleProgressValue`, `HorizontalSliderValue`, `GraphValue` ve `AnimationValue` gibi widget değişkenleri için benzer kontroller gerçekleştirilir. Değerlerden herhangi biri önceki değerinden farklıysa ilgili son değer güncellenir ve yeni değeri içeren mesaj uygun ID kullanılarak CAN bus üzerinden gönderilir.

`nowPage` değeri 3 olduğunda, yani Page 4 görüntülenirken, `HorizontalSliderValue`, `GaugeValue`, `FixedWidgetValue`, `AnimationValue`, `IndicatorValue` ve `ToggleButtonValue` gibi bu sayfada kullanılan widget değişkenleri için aynı kontrol işlemleri uygulanır. Değerlerden herhangi biri önceki değerinden farklıysa ilgili son değer güncellenir ve yeni değeri içeren mesaj uygun ID kullanılarak CAN bus üzerinden gönderilir.

“loop()” fonksiyonundaki önceki kod bloğunun ardından, dokunma olaylarını işlemek üzere `handleTouchEvents()` fonksiyonu çağrılır.

Knob idle durumundaysa (`isKnobIdle()` değeri 1 ise), `setKnobState()` fonksiyonu kullanılarak knob durumu `KNOB_IDLE` olarak ayarlanır. Ardından ekranı yeniden çizmek için `redrawScreen()` fonksiyonu çağrılır. Böylece demo projesinin program kodu tamamlanmış olur.

Program Arduino IDE üzerinden başarıyla doğrulanıp yüklendikten sonra OLED Knob Display'in ekran içeriği değişir. Ekrandaki Smart Display görselinin yerini Touch veya Rotate görseli alır. Bu aşamada hem Smart Display hem de OLED Knob Display varsayılan ana sayfayı görüntüler.

Artık demo senaryolarını çalıştırabilirsiniz. Ana sayfada knob'u döndürerek aşağıdaki görselde gösterildiği gibi Industry, Medical ve Vehicle olmak üzere üç farklı sayfadan birini seçebilirsiniz.

Sayfa seçildikten sonra OLED Knob Display'e kısa bir dokunuş yapıldığında Smart Display doğrudan seçilen sayfaya geçer.

Demo senaryosunu bir kez daha inceleyelim. Ana sayfadan başlayarak knob'u döndürün ve diğer üç sayfadan birini seçin. Aşağıdaki örnekte Medical sayfası seçilmektedir.

Medical sayfasını seçtikten sonra OLED Knob Display'e kısa bir dokunuş yaparak Smart Display üzerinde seçilen Medical sayfasına geçebilirsiniz.

OLED Knob Display üzerindeki knob'u sola veya sağa döndürerek, aşağıdaki görselde gösterildiği gibi ilgili sayfada bulunan widget'ları kontrol edebilirsiniz.

OLED Knob Display'e uzun süre dokunulduğunda sistem otomatik olarak Page 1 olarak tanımlanan ana sayfaya döner. Ayrıca OLED Knob Display üzerinde 10 saniye boyunca herhangi bir döndürme veya dokunma işlemi yapılmazsa ekran sıfırlanır ve sistem tekrar ana sayfaya döner.

Böylece 10.1” Smart Display ve OLED Knob Rotator Display için hazırlanan demo tamamlanmış olur. Bu demo ile OLED Knob Rotator Display üzerinde kısa veya uzun dokunma işlemleri kullanılarak farklı sayfalar kontrol edilebilir ve sayfalar arasında geçiş yapılabilir. Ayrıca her sayfada bulunan çeşitli widget'larla etkileşim kurulabilir ve ilgili değerler kontrol edilebilir.

Yukarıda açıklanan programı indirmek ve demo projesi hakkında daha fazla bilgi edinmek için GitHub bağlantısını kullanabilirsiniz.

Demo için kullanılan gerçek donanım kurulumu aşağıdaki görselde gösterilmektedir.

Bu program, Arduino kartı, OLED Knob Rotator Display ve Custom CAN ID protokolünün birlikte kullanılarak farklı Smart Display sayfalarının nasıl yönetilebileceğini uygulamalı olarak göstermektedir. Kısa ve uzun dokunma işlemleriyle sayfalar arasında geçiş yapılabilir, ayrıca her sayfada bulunan farklı widget'larla etkileşim kurulabilir ve bunlar kontrol edilebilir. Demo, özellikle dokunmatik özelliği bulunmayan Smart Display'lerin host controller üzerinden kontrol edilmesini ve host programlamanın bu tür uygulamalarda nasıl kullanılabileceğini öğrenmek isteyen geliştiriciler için pratik bir referans sunar.

İşletmenize yönelik ekran çözümleri hakkında sorularınız mı var? Bize Ulaşın!

Abone Ol

Winstar'dan haber güncellemeleri hakkında e-posta alın

Bize Ulaşın

Fiyat/Veri sayfası/Genel bilgi talebi

Teknik Destek

Her türlü teknik bilgi için bize ulaşın

go top
İletişim
close

Gizliliğinize değer veriyoruz

"Tüm Çerezlere İzin Ver" seçeneğine tıklayarak, site gezinmesini geliştirmek, site kullanımını analiz etmek ve pazarlama ve performans çalışmalarımıza yardımcı olmak amacıyla cihazınıza çerezlerin kaydedilmesini kabul etmiş olursunuz. Bu konu hakkında daha fazla bilgiye politikamızda ulaşabilirsiniz. Gizlilik Politikası

Gizliliğinize değer veriyoruz

Winstar ve bazı üçüncü taraflar www.winstar.com.tw adresinde çerezler kullanmaktadır. Çerez türleri, amaçları ve ilgili üçüncü taraflar hakkındaki ayrıntılar aşağıda ve Çerez Politikamızda açıklanmaktadır. Web sitemizde en iyi deneyimi yaşamak için çerez kullanımına izin vermek amacıyla “Hepsine İzin Ver” düğmesine tıklayabilirsiniz. Ayrıca tercihlerinizi ayarlayabilir veya zorunlu olanlar haricindeki çerezleri reddedebilirsiniz.

Rıza tercihlerini yönet

Her zaman aktif
Gerekli Çerezler

Bu çerezler, web sitesinde gezinmenizi ve gizlilik tercihlerinizi ayarlamak, oturum açmak veya formları doldurmak gibi özellikleri kullanmanızı sağlamak için gereklidir.

Analitik Çerezler

“İstatistik çerezleri” olarak da bilinen bu çerezler, bir web sitesini nasıl kullandığınız hakkında bilgi toplar; örneğin, hangi sayfalara girdiğinizi ve hangi bağlantılara tıkladığınızı. Ayrıntılara bakın.