Mbed Projenizi VSCode a aktararak Derleme İşlemi


Mbed Arm firması tarafından geliştirilen Arm çekirdeğine sahip işlemci ve mikrodenetleyicileri programlamak için geliştirilmiş bir C++ uygulama geliştirme platformudur.


Tarayıcınızı açarak Mbed web sitesi üzerinden compiler sekmesine giriş yaparak geliştirme yapmak istediğiniz kartınızı seçerek kodlamaya başlayabilirsiniz. Bunun yanında tarayıcıda kod yazmak istemeyenler ve offline internet olmadan da çalışmak isteyenlerin kullanabileceği mbed-cli de bulunmaktadır. Bu istemci yazılım mbed ve mbed-os kütüphanelerini github üzerinden çekerek projenizi pc nizde oluşturmanızı sağlar. 


Deneyimlediğimiz Mbed Online Compiler çok stabil çalışsa da tarayıcı üzerinde çalışmanın verdiği bir yavaşlık var ve Ctrl+Z gibi geriye alma biraz sıkıntılı. Girintileri otomatik formatlayabiliyor ama parantez başlangıç ve sonunu anlayamıyorsunuz. Gözlerinize yazık. Bizde Visual Studio Code ile nasıl yapabiliriz diye biraz araştırma yapınca karşımıza PlatformIO çıktı. Yine testlerimize göre PlatformIO  Mbed, Arduino ve STM32Cube gibi framework uygulama çatılarını desteklese de compile ettiğimiz kendi tasarım kartımızda (custom board) da verimli sonuç alamadık. PlatformIO’ nun desteklediği diğer gömülü sistem kart ve framework ları daha önce şu https://blog.mesebilisim.com/2020/01/platformio-nedir.html yazıda paylaşmıştık. Arayışımız devam ederken Visual Studio üzerinde başarılı olduk ve .bin dosyamızı kartımıza yüklediğimizde çalıştırdık. 

Mbed projemizi Visual Studio ya nasıl export ettiğimizi adım adım anlatmaya çalışacağım.

2- Mbed online compiler üzerinde “VSCode_Mbed_Template” isminde projemizi oluşturalım,





3- Projemizde mouse sağ tık ile export penceremizi açalım,

4- Export toolchain olarak VSCode-GCC-ARM seçelim,


5- Export butonuna basarak projeyi indirelim,
6- İndirdiğimiz Zip dosyasını klasöre çıkaralım,
7- Proje klasörünün içerisine girelim ve burada cmd yi açalım,
8- Visual Studio Code u açarak klasörümüzü açalım ve main.cpp dosyamızı açalım.
9- cmd üzerinde “mbed deploy” komutunu verelim, bu işlem 2-3 dakika sürmektedir.
10- İşlem bittiğinde “mbed compile -m NUCLEO_F410RB -t GCC_ARM -v” komutunu verelim. Burada -m ile compile edilecek hedef MCU i seçiyoruz. -t ile toolchain i seçiyoruz. Windows üzerinde compile yapıyorsak “GCC_ARM“ olmalıdır. En sondaki -v ile yapılan işlemler için ekrana bilgi yazılmasını sağlıyoruz.
11- Derleme işlemi bittiğinde proje klasöründe “BUILD” isminde bir klasör oluşacak. İçerisinde MCU isminde yine bir klasör ve içindede “ARMC6” isminde bir klasör daha oluşuyor. Oluşan bu klasörün altında “VSCode_Mbed_Template.bin” isminde compile edilmiş dosyanızı görebilirsiniz.










STM32 Yazılım Geliştirme Araçları Nelerdir?


32-bit Arm® Cortex® çekirdek tabanlı olan STM32 mikrodenetleyici ailesi kapsamlı bir yazılım araç seti tarafından desteklenmektedir.

Üçüncü parti tedarikçiler tarafından geliştirilen C/C++ derleyicileri ve hata ayıklayıcıları 64 Kbyte'a kadar  ücretsiz olarak kullanabilirsiniz.

Gömülü yazılım kütüphanelerini içeren geleneksel entegre geliştirme ortamları (IDE) ile compile ve debug işlemlerini gerçekleştirebilirsiniz.


STM32 geliştirme araçları aşağıda sıralanmıştır.

Kullanım istatislikleri dikkate alınmadan sıralanmıştır!

1- IAR Embedded Workbench https://www.iar.com

2- Keil Embedded Development Tools for Arm, Cortex-M, Cortex http://www.keil.com/

3- System Workbench for MCU: Embedded - ac6-tools https://www.ac6-tools.com/

4- Atollic - ST https://atollic.com/

5- Arduino https://www.arduino.cc/

6- Mbed https://www.mbed.com

7- ARM Cortex-M Software Development Toolset - Tasking https://www.tasking.com/products/arm

8- Embedded Studio for ARM | SEGGER - The Embedded Experts https://www.segger.com/products/development-tools/embedded-studio/editions/arm/

9- CrossWorks for ARM - Rowley Associates https://www.rowley.co.uk/arm/index.htm

10- Sysprogs https://sysprogs.com/

11- RAISONANCE, MCU application development solutions http://www.raisonance.com/

12- CoIDE - CooCox CoIDE, a free and highly-integrated software http://www.coocox.org/  ve https://www.st.com/en/development-tools/coide.html

13- iSYSTEM - iSYSTEM - Enabling Safer Embedded Systems https://www.isystem.com/

14- Emprog http://www.emprog.com/emprog/

15- STM32CubeMX - STM32Cube initialization code generator https://www.st.com/en/development-tools/stm32cubemx.html yeni ismi ve yetenekleri ile STM32CubeIDE https://www.st.com/en/development-tools/stm32cubeide.html


Arduino ve W5100 Ethernet Shield ile IOT Server a Veri Gönderme

Arduino kütüphaneleri ile ethernet kartı üzerinden internet sunucumuza veri göndermek oldukça kolaydır. Örneğimizde iothook.com sitesine HTTP GET metodu ile veri göndereceğiz. field_1 ve field_2 olarak kullandığımız 2 alan sayısı 8 e kadar yükseltilebilir. Yani en fazla 8 veri alanı kullanabiliriz. Bu alanların her birinde ayrı bir değişkeni iot sunucusuna get metodu ile gönderebiliriz.

IOTHOOK server larına veri göndermek için öncelikle hesap açarak cihaz eklemek gerekmektedir. Cihaz ekledikten sonra okuma ve yazma API KEY elde edeceğiz. Bu KEY ile ile iothook sunucusunda işlem yapabiliriz.

Arduino kodunda kullanılan "Ethernet.h" isimli kütüphane gerekli olan "EthernetClient" istemcisini oluşturarak verileri göndermemizi sağlayacaktır.

Arduino Ethernet Shield örneğine https://github.com/electrocoder/IOThook/tree/master/examples/python/arduino adresinden de ulaşabilirsiniz.

/*
  Server Odasi Sicaklik ve Nem Takibi
  electrocoder@gmail.com
  sahin@mesebilisim.com
  mesebilisim.com
  13.01.2020
*/
#include <SPI.h>
#include <Ethernet.h>
#include <dht.h>

#define pin 2
dht DHT;
byte mac[] = {
  0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED
};
IPAddress ip(192, 168, 1, 177);
IPAddress myDns(192, 168, 1, 1);
EthernetClient client;
char server[] = "iothook.com";
unsigned long lastConnectionTime = 0;
const unsigned long postingInterval = 20 * 1000;

void setup() {
  Serial.begin(9600);
  while (!Serial) {
    ;
  }
  Serial.println("Initialize Ethernet with DHCP:");
  if (Ethernet.begin(mac) == 0) {
    Serial.println("Failed to configure Ethernet using DHCP");
    if (Ethernet.hardwareStatus() == EthernetNoHardware) {
      Serial.println("Ethernet shield was not found.  Sorry, can't run without hardware. :(");
      while (true) {
        delay(1);
      }
    }
    if (Ethernet.linkStatus() == LinkOFF) {
      Serial.println("Ethernet cable is not connected.");
    }
    Ethernet.begin(mac, ip, myDns);
    Serial.print("My IP address: ");
    Serial.println(Ethernet.localIP());
  } else {
    Serial.print("  DHCP assigned IP ");
    Serial.println(Ethernet.localIP());
  }
  delay(1000);
}

void loop() {
  //int readData = DHT.read22(pin);
  float t = 5; //DHT.temperature;
  float h = 12; //DHT.humidity;
  if (client.available()) {
    char c = client.read();
    Serial.write(c);
  }
  if (millis() - lastConnectionTime > postingInterval) {
    httpRequest(t, h);
  }
}

void httpRequest(float t, float h) {
  client.stop();

  if (client.connect(server, 80)) {
    Serial.println("connecting...");
    client.println("GET /api/update/?api_key=1c623cec154a45c6158d8681&field_1=" + String(t) + "&field_2="+ String(h) +" HTTP/1.1");
    client.println("Host: www.iothook.com");
    client.println("User-Agent: arduino-ethernet");
    client.println("Connection: close");
    client.println();

    lastConnectionTime = millis();
  } else {
    Serial.println("connection failed");
  }
 
}