17 Mart 2024 Pazar

C++ for Embedded Development

Over the last three years, I am trying to use C++ as an embedded software developer. During the past year, I have fully used C++. I have watched lots of video and read lots of article in this period. I want to share what I have learnedmy notes and some important topics according to me. 

If you continue to read this, you likely want to learn C++. There is an excellent lecture on YouTube. In today’s world, anyone can complain many issues but cannot complain about not being able to find resources and information. There is an excellent lecture from University of Bohm. In my opinion, these ten-video lecture series are outstanding starting point for learning C++. Thanks Igor Bogoslavskyi to make these videos public.

 

Lecture: Modern C++ (Summer 2018, Uni Bonn)

 

 

He also has his own YouTube channel if you wanna subscribe: 


https://m.youtube.com/c/Codeforyourself

 

C++ is a complex language. It is not necessary to learn every concept. For example, I avoid using any standart library. My advice is not to read reference book written by Bjarne Stroustrup or any other. This is not an ideal way for an embedded software developer. This is a language and it is enough to just focus on learning the parts that you will use. Otherwise, you will be overwhelm by complexity of C++. For embedded side, my suggestion is also not to use RTTI and exceptions. However, if you are interested in exception handling, there is an excellent video:

 

C++ exception handling

 

 

Most current SDKs only supports a subset of C++ functionality. Generally, wcan use C++ to wrap the SDK's C-API.

 

Now, you watched all these ten-video lecture series prepared by Igor Bogoslavskyi and learn lots of concepts. You might wonder how to apply all of these concepts on embedded sideThere is an excellent video on youtube as a starting projectC++ for the Embedded Programmer

 

The video is using C++ to set up a pin by using ST’s SDK. But, you can use any other SDK’s like Nodic, Texas so on. I used Zephyr RTOS. You will see that it is possible to use C and C++ in tandem. In embedded world, all SDKs will continue to use C as a main language. At the same time, all of these SDKs will increasingly supports C++. You can use these SDKs to create your own C++ classes. I don’t expect to switch completely from C to C++ in the near future. On the other hand, I am waiting that usage of the C++ on embedded environment will grow day by day due to its advantages like rich language features, type safety, easy TDD support and so on. You can check my sample on this link: https://github.com/srcnert/Zephyr_GPIO_Cpp. I used operator overloading and I wrap Zephyr's GPIO API by using C++.

 

Let’s consider another example to show advantage of C++. Let's think that we have two temperature sensor like AHT20 and HDC3020 and we want to select these two accordingly. This is a good example of polymorpishm. It is so easy to maintain code through object-oriented design via C++. Of course, you can do same thing with C but it will be a little bit complex.

 

Firstly, we will create a general drvTEMP class:

 

#ifndef drvTEMP_H__

#define drvTEMP_H__

#include <stdint.h>

class drvTEMP

{

  public:

    virtual bool begin() = 0;

    virtual void getTemperatureHumidity(float *tempfloat *hum) = 0;

};

#endif

 

After that, you can crete specific classes for each sensor.

 

class HDC302x : public drvTEMP 

{

    private:

        uint8_t address = 0;

        drvI2C *i2c;

 

    public:

        HDC302x(uint8_t addressdrvI2C *i2c);

 

        bool begin();

        void getTemperatureHumidity(float *tempfloat *hum);

};

 

 

class AHT20 : public drvTEMP

{

  private:

    uint8_t address 0;

    drvI2C *i2c;

 

  public:

    AHT20(uint8_t addressdrvI2C *i2c);

    

    bool begin();

    void getTemperatureHumidity(float *tempfloat *hum);

};

 

Finally, you can select your temprature sensor at the beginning of your main file and there is no need to change your code for different setup inside all of your different files. C++ offers lots of advantages.

 

drvTEMP *temp_sensor = new AHT20(eAHT20Address_Low, &i2c0);

drvTEMP *temp_sensor = new HDC302x(HDC302X_ADDRESS1, &i2c0);

 

Are you using C++ as an embedded software developer? Do you know other advantages or have suggestions for other good concepts? I am still new for C++, so if you have corrections or input, please share them in comments section below.

 

Sources:

 

C++ for Embedded Development

C++Now 2018: Michael Caisse “Modern C++ in Embedded Systems”

Modern C++: C++ Patterns to Make Embedded Programming More Productive - Steve Bush - CppCon 2022

C++ in the World of Embedded Systems - Vladimir Vishnevskii - CppCon 2022

Composition on Tiny Embedded Systems in C++ - Luke Valenty - CppNow 2023

7 Eylül 2023 Perşembe

NRF9160-DK kartını Türkiye'de nasıl kullanabiliriz...

Aldığım NRF9160-DK kartını Türkiye'de nasıl kullanabileceğimize dair internet üzerinde hiçbir bilgi bulamadım. Bu nedenle neler yapılması gerektiğini bu yazıda özetlemek istedim.

İlk olarak, LTE-M kullanabilmek için Turkcell'den bir SIM kart almanız gerekiyor. NB-IoT kullanmak isterseniz hem Turkcell hem de Vodafone destek sunuyor. Ben LTE-M ile çalışacağım için Turkcell SIM kartı tercih ettim. https://www.gsma.com/iot/mobile-iot-map/#TR  GSMA’nın sitesine göre Turkcell, LTE-M de ulusal olarak kapsama alanı sunuyor gibi görünse de, buna aldanmayın. Desteklenen bölgeler oldukça kısıtlı.


Turkcell'den SIM kart almak için ilk adım olarak İzmir Bornova'daki Turkcell Global Bilgi binasına gitmem gerekti. Oradan sizi kurumsal iletişim birimine yönlendirecekler. Bu birim yürüyerek beş dakikalık mesafede. Ancak ilginç bir şekilde Turkcell kurumsal iletişim binasında telefon olmadığını iddia ediyorlar. Yani gitmeden ellerinde M2M SIM kartı olup olmadığını ya da size verilip verilmeyeceğini sorma şansınız yok. Turkcell kurumsal iletişim binasına bizzat gidip şirket için M2M kart almalısız. Şahıs şirketi için bana SIM kart verdiler. Ben oradayken başka biri şahıs firması için başka bir işlem yaptırmaya çalışıyordu, onun işlemini yapmadılar. Türkiye'de kime denk geldiğiniz önemli, bu yazıdan kesin M2M kartı alabilirsiniz anlamını çıkarmayın. Yanınızda kimlik ve vergi levhanızı götürmeyi de unutmamanız önemli. Sonuç olarak hangi şehirdeyseniz Turkcell kurumsal iletişim binasını bulmanız gerekecek. 


Turkcell M2M SIM kart için herhangi bir ücret talep etmedi. Unutmadan belirteyim, nano SIM istediğinizi belirtin, bana en büyük boyuttaki SIM verildi ve bir de SIM kartı küçültmek için yer aramam gerekti. İkinci olarak, kartı 2G’ye alıp size veriyorlar, bunu engellemek için kartı almadan önce 4G olarak kullanmak istediğinizi söyleyin. Kart 2G’ye ayarlı ise NRF9160-DK ile çalışamazsınız. 100MB için aylık 40TL fatura ödemeniz gerekecek. Eğer şirketiniz yoksa Turkcell'den iki farklı bilgi geldi bana. İlk bilgide kişisel SIM kartlarında LTE-M desteği olduğu şeklindeydi. Müşteri hizmetlerini telefonla aradığımda ise M2M SIM kart olması gerektiğini söylediler. Hangisi doğru bilmiyorum. Eğer kişisel SIM kart almak isterseniz, Turkcell 450TL ücret talep ediyor. Ben kişisel SIM kart ile NRF9160-DK'yı test edemedim. Eğer kişisel SIM ile test eden varsa ve buraya bilgi yazabilirse bu yazıyı okuyacaklar için daha yararlı olur.


SIM kartınızı aldığınız zaman göreceğiniz ilk şey her yerde LTE-M desteği olmadığı. SIM kartı kestirdikten sonra ilk olarak Forum Bornova çevresinde birkaç yerde deneme yaptım ve hiçbir yerde LTE-M sinyali bulamadım yani IKEA'da çalışmak imkansız :) Sonrasında SIM kartta bir sorun olduğunu düşünüp Turkcell binasına geri döndüm. Turkcell kurumsal binasında test ettiğimde yine LTE-M için destek olmadığını gördüm. Burada size hiçbir bilgi verilmiyor, şu alanda test edebilirsiniz gibi. LTE-M hakkında Turkcell çalışanlarının bir bilgisi yok. Balçova'da test ettiğimde ise alışveriş merkezlerinde LTE-M desteği bulamadım. Sadece Balçova Depark'ta destek bulabildim ama garip bir şekilde 1 km uzaklıktaki alışveriş merkezinde sinyal yok. İlginç bir şekilde İzmir-Çeşme otobanın neredeyse tamamında LTE-M desteği var :) Neden bilmiyorum. Sonuç olarak kartı test edebilmek için LTE-M sinyalinin olduğundan emin olduğunuz bir konum bulmalısınız.


Kısaca, LTE-M kullanabilmek için öncelikle Turkcell SIM kartı almanız gerekmekte. Hemen denediniz ve bağlantı kuramadıysanız kormayın, kesin olarak LTE-M sinyalinin olduğu bir nokta bulmanız gerekecek. Aklımı kurcalayan ikinci konu ise kartın IMEI numarasının kayıt ettirilip ettirilmediği. Bu konu hakkında da bilgi alabilirsem bu yazıya ekleyeceğim. Umarım kartı kullanacaklara yardımı olur bu yazının.

12 Nisan 2020 Pazar

BLE 5 ile data transferi ne kadar hızlı? - Kısa Yazılar 2



Yazıya başlamadan önce belirtmen gereken bazı noktalar var. Bu yazıda bahsedilen terimleri ya da konseptleri çok iyi bildiğimi iddia etmiyorum. Yazı boyunca kullandığım bazı terminolojiler ya da bilgiler yanlış olabilir. Temel amacım ise diğer mühendis arkadaşlara ulaşabilmek ve sizlerin yanlışlarımı görmemi sağlamanız. Bu yüzden olumlu ya da olumsuz yorum yaparsanız sevinirim. Umarım karşılıklı bir fayda sağlamış oluruz.

Bluetooth 5 ile birlikte kullanıma sunulan high throughput (2 Mbps) özelliğini bu yazıda değerlendirmeye çalışacağım. Testleri yaptığım kartın fotoğrafını aşağıda bulabilirsiniz.




Bu kart üzerinde 2 Mbps hızı destekleyen NRF52832 işlemcisi bulunuyor. Bu işlemciyi programlamak için bu test kapsamında Nordic firması tarafından yayınlanan SDK’in 16. versiyonunu ve 7. softdevice versiyonunu kullandım. Oluşturduğum test kodlarına GitHub üzerinden ulaşabilirsiniz.

Bluetooth 5 ile birlikte 2M PHY yani 2Mbits/sec data transfer hızı hayatımıza girdi. Bluetooth 4.2 döneminde bu hız 1Mbits/sec idi. Aslında burada bahsedilen 1M ve 2M modülasyon frekansları. Transfer hızını etkileyen bir çok faktör var ve bu faktörler bu yazının konusu olacak.

Öncelikle maximum hıza ulaşabilmek için data paketlerimizin boyutunu güncellememiz gerekiyor. BLE 4.2 ve BLE 5 protokolleri data length extension destekliyor. Eğer bu yazıyı okursanız 2016 yılında Android ve iOS işletim sistemlerinin büyük paket boyutlarına destek vermediğini göreceksiniz. Örneğin elinizde bu yıllardan kalan ve güncelleme almamış bir cihaz var ise paket boyutunu 20 byte üzerine çıkarmanız mümkün değil. Paket boyutunu artırabilmek için kod içerisinde BLE gap data boyutunu 251 byte ve ATT_MTU değerini ise 247 byte çıkarmamız gerekiyor. Tabi ki bu değerlerde haberleştiğiniz cihaza göre değişecektir. Örneğin iOS cihazlar için bu değer maximum 158-byte. Bluetooth spesifikasyonlarına göre bu değer 512-byte kadar çıkabilir. Bu ATT_MTU içerisinde bizim kullanabileceğimiz boyutu bulabilmek için ise ATT_MTU değerinden 3 byte çıkarmamız gerekiyor (1-byte “Op Code” ve 2-byte Attribute Handle). Yani bize kalan alan 244 byte oluyor.

Hızımızı etkileyen diğer bir durum ise connection interval ve bir connection interval da kaç paket gönderilebileceğidir. Connection Interval değeri Android cihazlarda 7.5ms’ye kadar düşebilirken, iOS cihazlarda bu değer 15ms’ye kadar düşebiliyor. İkinci parametre ise bir connection intervalda kaç adet paket aktarılacağıdır. Bu değerde yine cihazdan cihaza değişiyor. Örnek vermek gerekirse eski bir Android sürümü kullanıyorsanız bu değer maximum 6 paket ve ya eski bir iOS cihazı için 4 paketdir.

Şimdi ise teorik olarak ulaşabileceğimiz maximum hızı hesaplayalım. 244 bytelık bir paketi 1M PHY ile aktarabilmek için gereken süre;

Empty packet = 1 + 4 + 2 + 3 bytes = 10 bytes = 80 bits
Data packet size = 1 + 4 + 2 + 4 + 1 + 2 + 244 + 3 bytes = 261 bytes = 261*8 bits = 2088 bits
Time to transmit data packet = 2088 bits / 1 Mbps = 2,088 micro seconds.
Data packet time = Time to transmit empty packet + IFS + Time to transmit the actual data packet + IFS = 80 + 2*150 + 2088 = 2,468 microsecs


Aynı şekilde 244 bytelık bir paketi 2M PHY ile aktarabilmek için gereken süre ise ;

Empty packet = 2 + 4 + 2 + 3 bytes = 11 bytes = 88 bits
Data packet size = 2 + 4 + 2 + 4 + 1 + 2 + 244 + 4 + 3 bytes = 262 bytes = 2096 bits
Time to transmit data packet = 2096 bits / 2 Mbps = 1048 micro seconds
Data_Packet_Time = Time to transmit empty packet + IFS + Time to transmit the actual data packet + IFS = 44 + 2*150 + 1048 = 1392 microsecs.


Bu hesaplamalara göre bir connection intervalda gönderebileceğimiz maximum paket sayısı ise aşağıdaki gibi hesaplanabilir. Yine burada bulacağımız değerde aslında cihazdan cihaza değişiyor. Burada hesapladığınız paket sayısını bir connection intervalda göndereceğimizin bir garantisi yok.

Paket sayısı = (Connection Interval) / (Data packet time)


Benim kullandığımız connection interval değeri bu test için 20ms olduğuna göre bir connection intervalda gönderebileceğimiz paket sayısı 1M PHY için (20*1000/2468) = 8 pakettir. 2M PHY için ise (20*1000/1392) = 14 pakettir.

Tüm bu hesaplar sonucunda ulaşabileceğimiz maximum teorik hızlar yaklaşık olarak 1M PHY için (8 packet * 244 byte * 8 bit / 20 ms) = 780 kbits/sec(kbps) ve 2M PHY için (14 paket * 244 byte * 8 bit / 20 ms) = 1366 kbps’dır.

Aşağıdaki videoda ise gerçek hayattaki aktarım hızlarını görebilirsiniz. 1 megabytelık bir arrayi aktarmamız 1M PHY ile 13.76 saniye sürerken, 2M PHY ile 7.4 saniye sürdü. Pratikteki hızlarımız ise 1M PHY için 609 kbps iken 2M PHY için 1132 kbps oldu.



Peki yazıda gördüğünüz hatalar neler, siz daha yüksek hızlara ulaşabiliyor musunuz? Daha detaylı bilgi için kaynakları okumanızı öneririm. Yorumlarınızı bekliyorum.


Kaynaklar:

https://www.novelbits.io/bluetooth-5-speed-maximum-throughput/
https://punchthrough.com/maximizing-ble-throughput-on-ios-and-android/
https://punchthrough.com/maximizing-ble-throughput-part-2-use-larger-att-mtu-2/
https://punchthrough.com/maximizing-ble-throughput-part-3-data-length-extension-dle-2/
https://interrupt.memfault.com/blog/ble-throughput-primer

1 Nisan 2020 Çarşamba

Fonksiyon Pointerları ve Soyutlama - Kısa Yazılar 1

Garip dönemlerden geçiyoruz ve yaşadığımız hadisenin çapını pek algılayabilmişiz gibi gelmiyor bana. Belki de ben kötümserimdir. Fakat henüz her şeyin başındaymışız gibi geliyor ve anladığım kadarıyla bir süre sonra bugünkilerden çok daha fazla boş zamanımız olacak gibi. Bende bu evdeki zamanları yeni yazılar yazarak değerlendirmek istedim.

Yazıya başlamadan önce belirtmen gereken bazı noktalar var. Bu yazıda bahsedilen terimleri ya da konseptleri çok iyi bildiğimi iddia etmiyorum. Yazı boyunca kullandığım bazı terminolojiler ya da bilgiler yanlış olabilir. Temel amacım ise diğer mühendis arkadaşlara ulaşabilmek ve sizlerin yanlışlarımı görmemi sağlamanız. Bu yüzden olumlu ya da olumsuz yorum yaparsanız sevinirim. Umarım karşılıklı bir fayda sağlamış oluruz.

Bugün fonksiyon pointerları ve soyutlamadan bahsetmek istiyorum. Benim soyutlamadan anladığım donanım ile yazılımın birbirinden soyutlanması. Yazı boyunca çok basit bir problemden yola çıkarak bu soyutlama işleminin nasıl yapılabileceğini göstermeye çalışacağım.

Örneğin, elimizde bir sıcaklık sensörü bulunuyor ve bu sensör ile I2C üzerinden haberleşiyoruz. Amacımız ise bu sıcaklık sensörü kodlarını, ya da kütüphanesini diyebiliriz, donanımdan soyutlamak. Yani yazdığımız tek bir sıcaklık sensörü kütüphanesi ile istediğimiz herhangi bir işlemci ile hiçbir ekstra düzenleme yapmadan kullanabilmek.

İşte tam bu noktada fonksiyon pointerları hayatımıza girmeye başlıyor ve aşağıdaki şekilde tanımlıyoruz. 

typedef uint32_t (*comm_fptr_t)(uint8_t slave_address, uint8_t *p_data, uint32_t length);
typedef void (*delay_fptr_t)(uint32_t ms);


Daha sonra ise fonksiyon pointerların ve gerekli diğer değişkenlerin olduğu bir structure oluşturuyoruz.

typedef struct shtc3_dev_s {
    /*! Device Id */
    uint8_t dev_id;
    /*! Bus read function pointer */
    comm_fptr_t i2c_read;
    /*! Bus write function pointer */
    comm_fptr_t i2c_write;
    /*! delay function pointer */
    delay_fptr_t delay_us;
} shtc3_dev_t;


Son olarak ise bir initialization fonksiyonu ile tanımlanmalarımızı bitiriyoruz. Artık “_shtc3_dev” yapısını “_shtc3_dev.i2c_write(…)” yapısı ile istediğimiz yerde kullanabiliriz.

shtc3_dev_t _shtc3_dev;
void SHTC3_Init(shtc3_dev_t shtc3_dev){
  _shtc3_dev = shtc3_dev;
}

Main fonksiyonu içerisinde ise “SHTC3_Init(…)” fonksiyonunu tanımlayarak işlemi bitirebiliriz.

// initalize sensor module with the i2c address 0x70
shtc3_dev_t shtc3_dev;
shtc3_dev.dev_id = 0x70;
shtc3_dev.i2c_write = &my_i2c_write;
shtc3_dev.i2c_read = &my_i2c_read;
shtc3_dev.delay_us = &nrfx_coredep_delay_us;
SHTC3_Init(shtc3_dev);

Github sayfasında da görebileceğiniz gibi hazırladığım bu örnekle artık işlemci bağımsız bir kütüphane oluşturabildik. Bu sayede SHTC3 sıcaklık sensörü ile alakalı kodlarımızı donanımdan soyutlamış olduk.


Peki yazıda gördüğünüz hatalar neler, sizin daha iyi olduğunu düşündüğünüz bir yöntem var mı?Bu yazıdaki yöntemin olumlu ya da olumsuz yönleri sizce neler. Yorumlarınızı bekliyorum.

11 Ekim 2015 Pazar

STM32F4 DISCOVERY MPU6050 DMP


Merhaba arkadaşlar, geçen yazımda MPU6050 raw acc ve gyro datalarını okumuştuk. Bu yazıyı okuyup daha detaylı bilgi elde edebilirsiniz. Burada bahsetmiştim raw dataları doğru okuyabiliyorum ama DMP de sorun olduğunu. Bu yazıda kullandığımız kodlar Jeff Rowberg' in Arduino için yazdığı kodlar. Bu kodlar chibiOS için C diline çevrilmiş. Bende kodları STM işlemciler için uyarladım ve şuan da doğru bir şekilde çalışıyor. Bu kodları da githuba attım buradan kodları çekip kullanabilirsiniz. Tabi ki burada bir teşekkür etmek beni mutlu eder:))

Kodları direk çevirince dmp initialize ederken kodlar takılıyordu. Neredeyse bu kodlar için 6 aydır uğraşıyorum ve sonunda hatayı buldum. Ayrıca şunu da belirteyim Jeff Rowberg'in kodlarının dmp kısmını STM de çalıştıran bir kod bulamadım. Yani bu kodlar STM için çalışan ilk dmp kodları olabilir. Yada sizin bildiğiniz başka kodlar varsa lütfen belirtin.

Peki hata nerede, dmp kodu initialize ederken "Setting motion detection threshold to 2..." işleminden önceki MPUgetFIFOBytes(fifoBuffer, fifoCount) satırında I2C takılıyor eğer bu satırı kaldırırsak kodlar doğru bir şekilde çalışıyor. Başka bir değişikliğe gerek yok. Temelde mainde ki kodlarda şu şekilde



Bu https://github.com/srcnert/STM32F4DISCOVERY_MPU6050_DMP github adresinden kodları inceleyebilir ve içindeki Processing örnek programı ile üç boyutlu bir nesneyi kontrol edebilirsiniz.

16 Eylül 2015 Çarşamba

STM32F4 DISCOVERY ile MPU6050 Kullanımı

Merhaba arkadaşlar, bu yazıda MPU6050 sensörü ve Stm32f4 Discovery bordu ile yaptığım uygulamayı anlatacağım. Aslında sürekli paylaşılacak bir şeyler oluyor ama pek zaman olmadığı için biraz da tembellikten bilgisayarın başına geçip bir şeyler yazamadım uzun süredir. Bu yüzden bir github ve github gist hesabı açtım ve artık kodları oraya yükleyerek hem kısa hem de açıklayıcı ve yararlı yazılar yazabileceğim. Ayrıca github için bir yazı yamak gerekli gerçekten github son derece kullanışlı. 

Bu projede MPU6050 6DOF sensörünü kullandım. Robotistan aldığım MPU6050 sensörü 3 eksen gyro ve 3 eksen akselerometreye sahip bir MEMS sensör. Githubdaki kütüphane chibi için yazılmıştı, ben kendime göre port ettim ve i2c için ayrı bir kütüphane oluşturdum.. Ne yazık ki DMP kısmında problem var belki bu yazıyı okuyup hatanın nerede olduğunu söyleyen birileri olur. Simülasyon için ise Processing programında hazırladığım bir simülasyon dosyası var. Bunun ile alakalı Youtube' a bir video yükledim. Temelde benim video https://www.youtube.com/watch?v=qmd6CVrlHOM linkteki videonun düzenlenmiş hali denebilir. Kullanmak için seri porttan sprintf(str_main,"#:%.2f:%.2f:%.2f\n", compAngleRoll, compAnglePitch, 0.00f) şeklinde veri göndermeniz yeterli.

Kodlar için https://github.com/srcnert/My_Work_Place/tree/master/MPU6050 adresini kullanabilirsiniz. Bu klasörün içerisinde processing dosyası da mevcut. Kodlar temelde aşağıda ki gibi çalışmakta;





Simülasyon Processing programı ile yazıldı. Bunun için Youtube' a bir video yükledim onuda aşağıda izleyebilirsiniz. 



Umarım yararlı bir makale olmuştur. Yazıda gördüğünüz yanlışlar ve takıldığınız noktalarla alakalı mail ve mesaj atabilirsiniz:) Herkese iyi çalışmalar......................

22 Temmuz 2015 Çarşamba

HC05 Bluetooth Modül ve Android ile Haberleşmesi

Bu yazımda HC-05 Bluetooth modülünü kullanarak Android ve Stm32f4 discovery kitimizin bluetooth üzerinden haberleşmesini sağlayacağız. Öncelikle HC05 modülünün özellikleri ile başlayalım;


Bu modül Bluetooth SSP(Serial Port Standart) kullanımı ve  kablosuz seri haberleşme uygulamaları için tasarlanmıştır. Kullandığı bluetooth Protokolü: Bluetooth 2.0+EDR ve
çalışma gerilimi 3.3V dur.

Şimdi kitimizin şemasına göz atalım;







RX/TX herhangi bir işlemci ile uart üzerinden haberleşmemiz için,

RESET pini bluetooth modülümüzü resetlemek için (AT komut setine geçmek için kullanılıyor),

AT pini -> GND bağlı ise UART Mode da kullanmak için
              -> 3.3V bağlı ise AT komut setini kullanmak için.(AT bacağını 3.3V bağladıktan                                     sonra reset butonuna basmak gerekiyor.)

CONNECT/DISCONNECT pini (LED2) cihaz paired edildiği zaman led yanıyor, bağlantı yok ise sönüyor.

COMMUNICATION (LED1) pini bağlantı yok ise led hızlı yanıp sönüyor, bağlantı gerçekleşince yavaşlıyor. Ayrıca At modun da modülü çalıştırırsak yine yavaş yanıp sönüyor.



Şimdi ilk olarak modül ile Windows bilgisayarınızı birbirine bağlayacağız



Öncelikle Device Manageri açıyoruz ve  ayarlarımızın yukarıdaki resimdeki gibi olduğundan emin oluyoruz.





Daha sonra yukarıdaki resimdeki gibi Add device diyoruz ve eklemek istediğimiz cihazı seçiyoruz.




Cihaz paired edildikten sonra bluetooth cihazın hangi porta olduğunu cihaz ayarlarından öğreniyoruz.Bu işlemlerden sonra Communication ledimiz yavaş yanmaya başlayacak fakat şu an bağlantı ledimiz yanmıyor olacak. 


Şimdi terminal üzerinden COM8 e bağlanırsak windows ile HC05 arasında bağlantı kurulmuş olacak ve connection ledimiz yanmaya başladı. Bunu test etmek için cihazın rx ve tx bacaklarını bir usb to rs 232 dönüştürücüye bağlamamız gerekiyor. Daha sonra serial terminaller arsında veri alışverişi yapabilirsiniz.






İkinci olarak HC05 modül ile android arasında veri alışverişi için ise şu https://github.com/WorkPalace/AndroidforHC05 paylaştığım uygulamayı kullanabilirsiniz. ListView de bağlanmak istediğiniz cihazı seçip tıklamanız yeterli. Write buttonuna dediğiniz zaman veri yazabilir ve herhangi bir veri geldiğinde textview parse edebilirsiniz. STM kısmı ile led yakıp södürebilir veya STM RTC modülü ile elde ettiğimiz saat verisini yaza bilirsiniz. Fakat stm kısmını kullanmadan da write ve read kısmını kullanarak kendi işlemcimiz ile android arasında hc 05 modülü ile haberleşme sağlayabiliriz.



Son olarakta AT Modunun nasıl çalıştığında bahsetmek istiyorum bunun için AT pinini 3.3V bağlayıp reset butonuna basıyoruz. Daha sonra realterm ile 38400 baudrate de bağlanıyoruz. AT cazıp send ascii butonuna bastığımız zaman her şey yolunda ise OK cevabını görmemiz gerekiyor. AT+NAME? ile cihazın ismini öğrenebilir yada AT+NAME=--- ile de cihazımızın ismini değiştirebiliriz. Bu yaptığımız değişikliklerden sonra AT+SAVE komutunu kullanıyoruz ve cihaza reset atıyoruz. AT komutları ile ilgili daha ayrıntılı bilgi için cihazın pdf dosyasını inceleyebilirsiniz. 

Umarım yazı yararlı olmuştur. Gördüğünüz yanlışları ve yorumlarınızı bekliyorum. 

12 Ocak 2014 Pazar

Raspberry Pi ile Yazıcımızı Ağda Paylaşalım

Bu yazıda Raspberry Pi ile evdeki yazıcımızı ağada paylaşıma açacağız ve ev içerisinde rahatlıkla ağ üzerinden çıktımızı alabileceğiz. Şimdi "command promp" ekranında aşağıdaki adımları sırasıyla takip ederek bunu yapalım.

1-) sudo bash yazarak işleme başlıyoruz ve aşağıdaki adımlar ile devam ediyoruz.
2-) apt-get update
3-) apt-get upgrade
4-) reboot
5-) apt-get install cups samba
6-) Gelen soruya "Yes" diyerek devam ediyoruz.
7-) apt-get install system-config-printer
8-) Gelen soruya "Yes" diyerek devam ediyoruz.
9-) apt-get install samba-common-bin
10-) smbpasswd -a pi
11-) New SMB password: yazan yere raspberry giriyoruz.(Doğrulamak için iki kere isteyecek. Kendiniz için başka bir password de belirleyebilirsiniz.)
12-) adduser pi lpadmin

Bu adımları uyguladıktan sonra grafik arayüzüne geçeceğiz ama windows da "remote deskopt connection" uygulamasını kullanabilmek için "command promp" ekranında birkaç kurulum daha yapmalıyız;

13-) apt-get install xrdp
14-) Gelen soruya "Yes" diyerek devam ediyoruz.
15-) reboot diyerek sistemi yeniden başlatacağız.

Bu adımları uyguladıktan sonra şimdi windows üzerinde  "Remote Desktop Connection" programını kullanarak Raspberry Pi ye bağlanabiliriz.

Windows üzerinde Remote Desktop Connection açıyoruz. Computer kısmına Raspberry Pi' nin IP adresini giriyoruz ve "Connect" diyoruz.


Daha sonra karşımıza aşağıdaki ekran çıkacak. "Don't ask me again" tıklayarak yes diyoruz.


Karşımıza aşağıdaki ekran gelecek, burada username:pi  password:raspberry (Eğer username veya password değiştirdiyseniz onları giriniz.) olarak giriyoruz.


Karşımıza aşağıdaki ekranın gelmesi gerekiyor. Böylelikle windows içerisinde raspberry pi yi çalıştırmış olduk.


Printer ağa açma işlemine devam edelim;

Raspberry Pi ekranında;


Yukarıda ki gibi "System -> Preferences -> Painting" diyoruz. 



Karşımıza yukarıda ki ekran gelecek. Şimdi Raspberry Pi'nin usb girişine yazıcımızı bağlayalım ve bekleyelim. Bundan sonra yazıcımız otomatik olarak yüklenecek ve şu şekilde gözükecek.


Sizde yukarıdaki resmi gördüyseniz yazıcınız üzerinde ters tıklayın ve "enable" ve "shared" seçeneklerinin seçili olduğundan emin olun.



Şimdi Raspberry Pi ana ekranı üzerinde LXTerminal programını çalıştıralım ve sırası ile aşağıdaki kodları yazalım;

1-) sudo bash
2-) cupsctl --share-printers  --remote-admin --remote-printers
3-) reboot 


diyerek sistemimi yeniden başlatalım.


Artık windows üzerinde çalışmaya devam edeceğiz. Şimdi tarayıcınız üzerinde RASPBERYPIIPADDRESS:631(192.168.0.255:631 gibi ) yazarak CUPS ara birimini çalıştırın.


Bu ekranda "Printers" sekmesi altında bir yazıcı gördüğünüzden emin olun.


(Not: Printer Name yukarıdaki resimde de gördüğünüz gibi Deskjet-Ink-Adv-2060-K110 bunu yazıcıyı windowsa tanıtırken kullanıcaz. Sizde kendi yazıcınızın ismini buradan öğrenebilirsiniz.)

Daha sonra yazıcınıza tıklayın ve aşağıdaki resimdeki gibi test çıktısı almayı deneyin her şey doğru ise yazıcınızdan internet üzerinden çıktı alabiliyor olmanız gerekir.


Test çıktısı alabildiğimize göre sıra geldi ağdaki yazıcıyı windows işletim sistemine tanıtmaya. Bunun için windows ta "Control Panel" içerisinde Devices and Printers'ı açıyoruz. Burada "Add a Printer" sekmesine tıklıyoruz.


Karşımıza gelen ekranda "Add a network,wireless, blutooth printer" seçeneğine tıklıyoruz. Şimdi windows ağdaki yazıcıları aramaya başlayacak. Burada "The printer that I want isn't listed." seçeneğini seçelim.



Şimdi karşımıza gelen ekranda "Select a shared printer by name" seçelim ve kutuya "http://raspberrypiipaddress:631/printers/PrinterName(http://192.168.0.255:631/printers/Deskjet-Ink-Adv-2060-K110 gibi)" şeklinde dolduralım.




Daha sonra Next deyelim. Karşımıza aşağıdaki gibi bir ekran gelecek. Burada yazıcımız için uygun olan driverı seçelim ve OK deyelim.


Son olarak karşımıza çıkan ekranda next diyerek kurulumu bitiriyoruz. Artık Ethernet üzerinden istediğimiz şekilde çıktı alabiliriz.

5 Ocak 2014 Pazar

Raspberrry Pi Statik IP Atama

Bu yazıda Raspberry Pi'a basit bir şekilde nasıl statik ip atayacağımızı göstereceğim. Bunun için ben "Putty" yazılımı kullandım. Şimdi "command promp" ekranından statik ip'yi nasıl atayacağımızı görelim.

İlk olarak;

sudo bash yazıp entera basıyoruz. Daha sonra gelen satırda;
nano /etc/network/interfaces yazıp entera basıyoruz.

Resim1

Şu ana kadar yaptıklarımız Resim1' deki gibi olmalı. nano /etc/network/interfaces yazıp entera bastığımızda karşımıza Resim2' deki ekran gelmeli.

Resim2

Şimdi bu ekranda "iface eth0 inet dhcp" olan satırı değiştirip gerekli eklemeleri yapalım;

iface eth0 inet static
address 192.168.0.123
netmask 255.255.255.0
gateway 192.168.0.1
network 192.168.0.0
broadcast 192.168.0.255


Resim3


Bunları ekledikten sonra görmemiz gereken ekran Resim3' deki gibi olmalı. Daha sonra;

Ctrl ve O' ya aynı anda basıp daha sonra enter diyerek eklemelerimizi kaydediyoruz;
Ctrl ve X' e aynı anda basıp çıkış yapıyoruz.

Resim4

Bu adımlardan sonra Resim4' deki gibi reboot yazıp, enter'a basarak Raspberry Pi'yi yeniden başlatıyoruz. Artık sistemimiz belirlediğimiz statik ip üzerinden başlayacak.





Daha açıklayıcı olması için şu videoyu da izlemenizi öneririm.







6 Mart 2013 Çarşamba

Li-Po Piller

Kısaca yapısında lityum ve polimer maddelerini bulunduran pillerdir. Şu anda notebook, mp3 player, telefon gibi pek çok yerde LITHIUM ION POLYMER ismiyle kullandığımız piller LİPO pillerin makyajlanmış ve daha güvenli hale getirilmiş halidir. Dikkat edersek cihazlarımızdaki piller genellikle hard case içerisindedir. Çünkü bu piller tehlikeli pillerdir. Hepimiz cep telefonu elinde patladı gibi haberleri duymuşuzdur. Buda bu pillerdeki tehlikeyi bize göstermektedir.

Lipo piller hava ile temas ederse lityum oksitlenmeye ve yanmaya başlıyor. Biz yanmaya başlayan pili suyun içine atsak dahi pil sönmüyor ve suda ve havada oksijen bitene, suyu kaynatana kadar yanmaya devam ediyor. Kısaca bu piller tehlikelidir ve eğer yanmaya başlarsa söndürmek son derece zordur. Bu yüzden kullanmadan önce bilgilenmek önemli. Doğru şekilde kullanıldığı zaman hiçbir sorun ile karşılaşılmaz.

Benim bu pillerle ilgilenmemin nedeni RC modellerde kullanmak istemem. Peki RC modeller için aldığımız LİPO pillerin özellikleri nelerdir;


  • S ile tanımlanan ifade pilin kaç hücreli olduğunu gösterir. Her bir hücre için nomimal voltaj değeri 3.7V     olarak tanımlanır. Eğer 3S bir pilimiz var ise nominal voltajı 11.1V olur.
  • P ile tanımlanan ifade paralel bağlanan pil sayısını verir. Yani eğer pilimizin üzerinde 3S2P yazıyorsa seri bağlanan üç hücre ve seri bağlı pilden paralel olarak 2 tane olduğunu anlarız. Paralel bağlama ile pilimizin voltajı değişmez fakat verebileceği akım iki katına çıkar. 
  • C ile tanımlanan ifade bize pilimizin verebileceği maximim akımı, şarj ve deşarj akımları ile ilgili bize bilgi verir. Mesela pilimizin 1C değeri 1550mA ise 30C pil bize anlık olarak (1550x30=46500mA) 46.5A verebilir. Bu pil sürekli olarak yaklaşık 20A verebilir. Bazı pillerde sürekli ve anlık C değerleri verilmektedir. 

Pili tanımlayan ögeler bu şekilde fakat pil ile alakalı bilmemiz gereken bir kaç şey daha var. Lipo pilleri kullanırken voltaj kontrolü yapmamız son derece önemlidir. Pili şarj ettiğimiz zaman pilin hücre başına maximum voltaj değeri olan 4.2V şarj olur. 4.2V değeri kesinlikle aşılmamalıdır. Pilli kullanırken ise hücre başına 3.3V altına piller kesinlikle düşmemelidir. Eğer voltajımız hücre başına 3.3V altına düşer ve pile zarar verirsek bir daha pilin bize sağladığı maksimum akımları kullanamayız.

Diğer dikkat edilmesi gereken husus ise şarj olayıdır. Lipo pilimiz kesinlikle balancer sarj aleti kullanmalıyız. Bu şarj aleti pilin her hücresini kontrol edilerek 4.2V geçmemesi sağlanır. Ayrıca pili kullandığımız zaman tüm hücreler aynı oranda tükenmez . Balancer şarj aletinde hücreler ayrı ayrı doldurulduğu için hücre voltajları düzenlenmiş olur. Yukarıda bahsettiğimiz C şarj içinde önemlidir. Lipo piller şarj esnasında 2C akım üzerinde sarj edilemezler. Eğer pilimiz 3S2P gibi bir pil ise 1C üzerinde akım ile şarj edilemezler. 20A akım veren şarj aletleri de olduğunu düşünürsek bence pilimize zarar vermememiz için tüm pilleri 1C akım değeri ve kevlar lipo çantaları içinde şarj etmek en doğrusu olur.

Son olarak pili uzun süreli saklamalar da 3.8V civarında bırakmamız gerekmektedir. Pili tam olarak dolu bırakmamız pilimizin gücünü düşürmektedir. Güvenliğimiz için pil doğrudan güneş ışığına bırakılmamalıdır.
Pilin tehlikesini gösteren bir kaç video da eklemek istedim;


Bu video pili kısa devre yaptığımızda başımıza ne geleceğini gösteriyor. En önemli nokta doğru şarj akımında pili şarj etmek ve kesinlikle pili kısa devre yapmamak. Sonuç gerçekten çok ürkütücü.......



Bu video ise kevlar çantanın güzelliğini göstermekte:))))



Başımıza gelmez dememek lazım:))))



Umarım yararlı bir makale olmuştur. Yazıda gördüğünüz yanlışlar ve takıldığınız noktalarla alakalı mail ve mesaj atabilirsiniz:) Herkese iyi çalışmalar......................