STM32 ile Mbed Studio Kullanımı
|Merhabalar,
Bu konuda Mbed Studio isimli bir Ide’ den bahsedeceğim. İsminden de anlaşıldığı üzere bu ide Mbed OS nin offline olarak kullanılabilmesi için Mbed firması tarafından geliştirilmiş bir ide. STM32 başta olmak üzere Mbed Online Compiler ile kullanabildiğimiz hemen her denetleyici için Mbed Stuido kullanılabilir. Ancak ide henüz açık beta sürecinde ve bazı sorunlar çıkartabilmekte. Ayrıca debug işlemi için çok az denetleyici desteklemekte. Ama yine de hızlı çözüm gerektiren uygulamalarda çok faydalı olabiliyor. Ben yaşadığım bir kaç sorunu ve çözümünü sizinle paylaşacağım.
Mbed STUDIO
Mbed Stuido’ nun resmi sitesine buradan ulaşabilirsiniz. Visual Code kullanıcılarına bu ide görünüş olarak tanıdık gelecektir. Açık kaynaklı Theia ide’ si üzerine oluşturulmuştur. Kendi içerisinde proje oluşturma, kütüphane ekleme, debug yapma ve mbed online üzerinden versiyon kontrol etme özelliklerine sahiptir. İlerleyen zamanlarda daha da çok kullanışlı hale gelecektir. Ancak kütüphane ekleme kısmında ben sorun yaşadım. Kütüphane ekleme işlemini farklı bir şekilde çözdüm. Çözümden birazdan bahsedeceğim.
İlk tanıtım uygulaması olarak çok karmaşık olmayan bir uygulama seçelim. Bu uygulamada 128*32 oled ekran, DHT11 ve enkoder kullanalım. Ekran üzerindeki Sıcaklık, nem ve analog değeri farklı sayfalar halinde yazdıralım. İlk sayfada ADC’ den ölçülen değer, ikinci sayfada sıcaklık değeri, üçüncü sayfada ise nem değeri gösterilsin. Ekran geçişlerini de enkoder ile yaptıralım. Daha önceden ADC ve DHT11 ile ilgili uygulamalar paylaşmıştım. Ancak enkoder ile ilgili hiç uygulama paylaşmadım. O yüzden bu konuda sadece enkoder üzerinde duracağım. Kullanacağımız enkoder piyasada çokca bulunan “rotary encoder” isimli potansiyometreye benzer bir devre elemanıdır. Şekilleri benzesede kullanım amaçları çok farklıdır.
Soldaki şekilde bir potansiyometre görünmekte. Potansiyometre gerilim bölücü olarak çalışacağı için A ve C uçlarından verilen gerileme göre konumu sıfırda olmadığı her zaman bir gerilime sahiptir. Bu da belirli sayıda dönmesi istediğiniz konum kontrollü sistemler için çok kullanışlı olmayabilir. Çünkü sisteme güç verdiğinizde eğer sıfıra çekilmemişse bir değeri olacak bu da işleri baya zorlaştıracaktır. Ayrıca resimde görülen potansiyometreler genellikle 270 derece dönebilirler. Enkoderlerde ise bu şekilde bir sınırlama yoktur. Kendi etraflarında sürekli dönebilirler.
Sağdaki resimde görünen ise yaygın kullanılan bir enkodir. Enkoderler motor sistemlerinde motorun ne kadar döndüğünü takip edebilmek için sıklıkla kullanılırlar. Motor sistemlerinde enkoderlerin görünüşleri biraz daha farklıdır. Ancak çalışma mantıkları ve kullanım şekilleri oldukça benzerdir. Burda görülen enkoder ise 3D Printer kullanmış olanların aşina olduğu 128*64 grafik lcd panellerde bulunan bir enkoderdir. Ekranlı sistemlerde kontrol amacı ile de sıklıkla kullanılırlar.
Şimdi gelelim enkoderin çalışma mantığına. Üzerinde besleme ve toprak hariç 3 adet çıkış bulunur (resimde görünen için). Bu çıkışlardan ikisi enkoderin konum bilgisini algılamakta diğeri ise enkoderin buton gibi kullanımı içindir. Her enkoderde bu özellik olmadığından bu pinde olmayabilir. Hatta bazı enkoderlerde yön algılama da olmadığından sadece tek çıkış bile bulunabilir. Bizim kullanacağımız enkoder de ise iki çıkışı kullanacağız. Bu çıkışlardan, enkoder döndükçe iki adet fazı kaymış kare dalga üretilir.
Resimde enkoder saat yönünde ve saat yönünün tersinde dönerken iki çıkışdan üretilen işaretler görülmekte. Oluşturulacak yazılımda çıkışlardan biri referans alınıp düşen yada yükselen kenar olması durumunda diğer çıkışa bakılıp dönme olayının hangi yönde olduğu rahatlıkla anlaşılabilir. Ayraca her düşen yada yükselen kenar değişimi enkoderin bir adım dönmesi anlamına gelmeltedir.
Yapacağımız uygulamada daha öncede belirttiğim gibi ekrandaki sayfayı enkoder ile değiştirmeyi amaçlıyoruz. Bu uygulama için gerekli bağlantılar aşağıdaki gibi olmalıdır. Ben Nucleo-F767 kartı kullandığım için örneği de onun üzerinden veriyorum. Siz elinizdeki karta göre değişiklik yaparken potansiyometre bağlıyacağınız ADC pinlerine ve ekranı bağlayacağınız I2C pinlerine dikkat etmelisiniz. Fritzing’ de F767 olmadığından devre elemanlarının bağlantılarını yazılı şekilde veriyorum.
Bağlantılar
——– OLED ——————-
VCC –> 3.3 V
GND –> GND
SDA –> PB_9(D14)
SCL –> PB_8(D15)
——– ENCODER ——————-
+ –> 3.3V
– –> GND
CLK –> PF_13(D7)
DT –> PE_9(D6)
SW –>
——– DHT11 ——————-
VCC –> 3.3V
GND –> GND
DATA–> PF_14(D4)
——– POT ——————-
PIN1–> 3.3V
PIN2–> PA_3(A0)
PIN3–> GND
Bu kısımdan sonra sıra geldi yazılıma. Yazılımı daha önce de belirttiğimiz gibi Mbed Stuido’ da oluşturacağız. Mbed stuido’ yu yukarıdaki bağlantıdan indirip kurduktan sonra yeni bir proje oluşturalım. Yeni proje oluşturmak oldukça basit ama anlamadığınız yerler için aşağıdaki resimdeki adımları takip edebilirsiniz.
Ide henüz beta aşamasında olduğundan çok fazla özelliğe sahip değil. Bu yüzden yapılacak işlemlerde çok karmaşık değil. “File” menüsü altında “New Program” dedikten sonra bir proje şablonu seçip, proje ismini belirleyip, oluşturulan yeni projeyi aktif program olarak seçiyoruz. Burada bahsi geçen aktif program birden fazla proje oluşturmanız durumunda derleme ve yükleme işlemlerinin gerçekleşeceği projenin belirlenmesi içindir. En son “Add Program” diyerek projeyi oluşturmuş oluyoruz.
Daha sonra yükleme işlemini yapacağımız kartı seçmeliyiz. Bunu solda görülen resimdeki “Target” kısmından yapabilirsiniz. Onun hemen altında bulunan ise “Build Profile” yapılacak olan derleme işlemi için bazı opsiyonlar sunmakta. Varsayılan olarak “Debug” ayarlanmış olsa da Mbed Stuido şu an çok az kart için Debug özelliğini desteklemekte. Elinizdeki kartın Mbed Studio’ nun Debug özelliği tarafından desteklenip desteklenmediğini öğrenmek için bağlantıdaki sayfaya bakabilirsiniz. Yada daha kolay bir yok olarak Mbed Studio açıkken kartınızı bilgisayara bağlayın, güç geldikten 1 – 2 saniye sonra kartınız debug desteklemiyorsa Ide size bir uyarı verecektir.
Daha sonra gelelim build işlemine. Bu işlem için yine solda görülen resimdeki çekic benzeri sembole tıklayacağız. Projeyi oluşturduktan sonraki ilk derleme için bu işlem bilgisayarınızın da performansına bağlı olarak birkaç dakika sürebiliyor. Ancak sonraki derlemeler çok daha kısa sürüyor. Derleme işlemi bittikten sonra da çekic sembolünün yanındaki yükleme butonuna basıyoruz ve yüklemeyi gerçekleştirebiliyoruz.
Oluşturmak istediğimiz projede çalışacak yazılım için bazı kütüphaneler kullanacağız. Bu kütüphaneler, “DHT11”, “mRotaryEncoder” ve “Adafruit_SSD1306” isimli kütüphanelerdir. Adından da anlaşılacağı üzere biri DHT11′ i diğeri enkoderi sonuncu ise oled ekranı kontrol etmek için gerekli kütüphanelerdir. Bunları projeye dahil etmek için aşağıdaki adımları izleyebilirsiniz.
“Add Library” dedikten sonra git repo bağlantısını sizin vermeniz gerekiyor. Bu linki Mbed’ in kendi sitesinde bulunan kütüphanelerden alabilirsiniz. Kullanmak istediğiniz her kütüphane için bu bağlantıyı bulabilirsiniz. Site üzerinden ilgili kütüphaneye gittikten sonra sağ üstte bulunan “Import Mbed Studio” seçeneğine tıklayarak bağlantıyı elde edebilirsiniz. Bağlantıyı yazdıktan sonra “Next” butonuna basarak “branch” seçimi yapacağız. Ancak bu branch’ lerin gelmesi bazen çok uzun sürebiliyor hatta hiç gelmeyebiliyor. Bu durumda kütüphaneyi farklı bir yöntem ile yükleyebilirsiniz. Bu yöntem de kütüphaneyi daha önce de gösterdiğimiz “tortoisehg” yada bağlantıdaki araç üzerinden yükleyeceğiz. Bu araçlardan herhangi birisini kurduktan sonra aşağıdaki resimde görünen bağlantıyı kopyalayıp terminal üzerinden proje dosyalarının oraya gelip yapıştırıyoruz ve kütüphaneyi indiriyoruz.
Yazılım
Şimdi oluşturacağımız yazılıma gelelim. Yazılımda enkoder ile oled üzerindeki sayfayı değiştirmek istiyoruz. Sayfa içeriklerimiz basit. İlk sayada ADC değeri, ikinci sayfada sıcaklık, üçüncü sayfada ise nem değerini göstermek istiyoruz. Enkoderin değiştiğini anlamak içinse bir callback kullanacağız. Bu callback her enkoder döndüğünde çalışacak. Böylece ekranı değiştirme işlemini rahatlıkla gerçekleştirebileceğiz. Ancak enkder’ in bir adım dönmesi çok hızlı gerçekleşen bir olay. Bu yüzden bunu 3 sefer tetik gelemsi yaparak daha kullanışlı hale getirebiliriz. Bunu basitçe şu şekilde yapabiliriz.
// This function will run every encoder turns void encoderCallback() { pulseCount = encoder.Get(); // get counter value if(pulseCount > lastPulseCount + 3) // check is counter value increased { led1 = !led1; // toggle led1 screenCount++; // increase screen counter if(screenCount > 2) screenCount = 2; lastPulseCount = pulseCount; // save encoder counter value }else if(pulseCount < lastPulseCount - 3){ // check is counter value decreased led3 = !led3; // toggle led3 screenCount--; // decrease screen counter if(screenCount < 0) screenCount = 0; lastPulseCount = pulseCount; // save encoder counter value } }
Daha sonra loop içerisinde “screenCount” değişkenine göre gösterilecek ekranı ayarlayabiliriz. Bunu basit bir switch – case metodu ile yapabiliriz.
display.clearDisplay(); // clear oled display switch (screenCount) // switch screen using counter value { case 0: display.printf("ADC: %4d", (int)(pot.read() * 1023)); // print analog value break; case 1: display.printf("Temp: %4d", (int)(temp)); // print temperature value break; case 2: display.printf("Hum: %4d", (int)(hum)); // print humidity value break; } display.display(); // show screen
Bunun dışında ek olarak DHT’ den yaptığımız okumayı 1 saniye de bir olması için bir timer kullandık. DHT11 onewire ile haberleştiği için arka arkaya çok hızlı olarak veri transferi gerçekleştirmede sorunlar çıkartabiliyor. Sıcaklık ve nem verisi de gerçek zamanlı çok hızlı değişen veriler olmadığı için 1 saniye gibi bir süre bizim için ideal. Saniyede 1 kez okuma işlemini de Mbed’ de timer kullanarak basit olarak şu şekilde gerçekleştirebiliriz.
if(t1.read_ms () > 1000) // check is 1 secod passed { sensor.readData(); // read DHT sensor value temp = sensor.ReadTemperature(CELCIUS); hum = sensor.ReadHumidity(); t1.reset(); // reset timer value }
Son olarak da yazılım tamamına bağlantıdan ulaşabilirsiniz. Ancak burada ufak bir durumdan bahsetmek istiyorum. Bu yazıyı yazmaya başladığımda bilgisayarımda yüklü olan Mbed Studio sorunsuz çalışıyordu. Ancak şu anda henüz çözemediğim bir sorun sebebi ile yeni projeleri derleyemiyorum. Ancak eski projelerde sorun yok. Çözümünü bulunca onu da konunun sonuna ekleyeceğim.
Yukarıda bahsettiğim sorunu Mbed Studio içerisindeki Mbed OS versiyonunu güncelleyerek çözdüm.
İyi çalışmalar dilerim…