4 Ocak 2018 Perşembe

BREADBOARD ÜZERİNDE ARDUİNO - ATMEGA328

Merhaba Arkadaşlar...

Bu konuda sizlere nasıl ATmega328 mikrodenetleyicisine Arduino Bootloader yüklendiğinden bahsedeceğim. Her ne kadar ileri düzey gibi görünse de bir kez alışınca aslında ne kadar kolay olduğunu göreceksiniz. Böylece Arduino Uno, Nano gibi ATmega328 mikrodenetleyicili Arduino modelleri yerine Breadboard üzerinde projelerinizi daha özgür bir şekilde yapabilir ve eğer yapmak isterseniz baskı devrelerinizi Arduino kartınız olmadan da yapabileceksiniz. Tabi konumuz baskı devre değil breadboard üzerinde ATmega328 mikrodenetleyicisini Arduino gibi kullanmak.

Başlayalım...

ATMEGA328 NEDİR?
ATMEGA328, Atmel firmasının 8-bit mikrodenetleyici ailesinin ATmega kategorisinde bulunan AVR tabanlı bir mikrodenetleyici modelidir. Arduino UNO, NANO, ve PRO MINI geliştirme kartlarında bulunmaktadır. Yani aslında bizler Arduino platformu ile farkında olmasak da bizler ATMEGA328 mikrodenetleyicisini programlamaktayız. NANO, MINI ve PRO MINI modellerinde SMD yani yüzey montaj paketlerinde kullanılırken, UNO üzerinde DIP kılıf paketlerinden olanı kullanılmıştır. Aşağıda ATMEGA328 DIP kılıfındaki resmi görülmektedir.
yVy5Yk.jpg



BOOTLOADER NEDİR?
Kelimenin tam manası önyükleyici demektir. Bu şu anlama gelir; normal de mikrodeneteleyicilerin özel programlama cihazları olur örneğin PIC için PicKit, AVR(ATmega, ATtiny) için USBasp AVRdude gibi. Normal programlama metotları içerisinde ise bu mikrodenetleyiciler belirli programlama bacakları ile programlama cihazları ile programlanırlar. Ancak Bootloader bize bu donanımlara olan ihtiyacımızı bir nevi ortadan kaldırmaktadırlar. 

Arduino'lar ile bilgisayar arasında USB bağlı olmasına rağmen işin arka planında USB protokolü devrede değildir. Bunun yerine USB üzerinden sanal COM portu ile eski RS-232 seri iletişim standardı üzerine iletişim sağlanmakta. Tabi tüm bunlar USB alt yapısı altında gerçekleşmekte ve burada sizlere bunlardan bahsetmeyeceğim.

Bootloader yüklenen bir Atmega328 artık standart programlama yöntemlerinden ziyade RX-TX bacakları ile yani USART(RS-232) üzerinden programlanabilmektedir. Tıpkı Aslında Arduino'larınızın programlandığı gibi. Yani Eğer elinizde UNO veya NANO varsa bunların üzerinde Atmega328 mikrodenetleyicisi bulunur ve bunun içerisinde bu bootloader yüklü vaziyette gelmektedir.

Peki biz bunu kendimiz nasıl yapacağız yani kendi breadboard üzerinde arduinomuzu? Şimdi bunu görelim.

ATMEGA328'E BOOTLOADER YÜKLENMESİ
Öncelikle bunu yapabilmeniz için elinizde olması gereken malzemeler var;
  • Arduino UNO, NANO veya MEGA (klon ya da orjinal olması fark etmiyor)
  • USB-Serial Çevirici
  • Breadboard
  • ATMEGA328, 28 bacaklı DIP kılıf 
  • 16 MHz Kristal
  • 2 Adet 22pF kondansatör
  • 1 Adet 10k direnç
  • Jumper
  • Biraz sabır...
Bundan sonrası aşamalar halinde sizlere aşağıda anlattığım adımlar ile devam edilecek.
Öncelikle sizlerin ARDUINO UNO ve NANO pinleri ile ATMEGA328 bacakaları arasındaki ilişkileri gösteren aşağıdaki görseli incelemenizi isterim.
NkaoJX.jpg
kE4DRD.jpg
BİRİNCİ AŞAMA: ARDUINO'YU HAZIRLAMA
Yapmamız gereken şey çok basit. Elimizdeki Arduino'ya "ArduinoISP" adlı sketch'i yüklememiz lazım. 
Bu sketch'i "Dosya > Örnekler > 11.Arduino ISP > ArduinoISP" yolunu izleyerek açıyoruz ve Arduino'muza Upload ediyoruz, yani yüklüyoruz.

kE2Eg9.png

Daha sonra "Araçlar > Programlayıcı > Arduino as ISP" yolunu izleyerek "Arduino as ISP" seçeneğine tıklıyoruz ve Arduino'muzu programlayıcı olarak kullanacağımızı belirtiyoruz. Ardından Arduino'yu sonraki aşamadaki bağlantıları yapmak için bilgisayar ile arasındaki bağlantıyı kesiyoruz, USB kabloyu çıkarsak yeterli.

3AXAPp.png


İKİNCİ AŞAMA: BREADBOARD'UN HAZIRLANMASI ve ARDUINO ILE BAĞLANTISI
Arduino'ya bir önceki yani birinci aşamada bahsedilenleri yaptıysanız sıra ATMEGA328'in Arduinonuz ile olan bağlantılarını yapmaya.Arduino'nun 13,12,11 ve 10 numaralı dijital pinleri aynı zamanda SPI seri haberleşme pinleridir. ATmega serisi mikrodenetleyiciler SPI seri haberleşme yöntemiyle programlanırlar. Yani Bootloader'ı ATmega328'e yüklemenin tek yolu budur. Bunu yapabilmek için Arduino'ya ArduinoISP sketch'ini yükledik. 

ISP "In Serial Programming" kısaltmasıdır ve "dahili seri programlama" olarak geçer. Yani SPI nedir ISP nedir diye sorarsanız, ISP SPI seri haberleşme yöntemiyle programlama yapaya yarayan programlama yöntemidir. 

ATMEGA328'in 18 numaralı bacağı aslında Arduino'nun 13 numaralı dijital pini, 17 numaralı bacağı Arduino'nun 12 numaralı dijital pini, 16 numaralı bacağı Arduino'nun 11 numaralı dijital pini ve 15 numaralı bacağı Arduino'nun 10 numaralı dijital pinidir.

Arduino'da SPI seri haberleşme pinlerinin isimleri aşağıdaki gibidir;
  • pin 13 > SCK
  • pin 12 > MISO
  • pin 11 > MOSI
  • pin 10 > CS
ATMEGA328'de SPI seri haberleşme pinlerinin isimleri aşağıdaki gibidir;
  • bacak 18 > SCK
  • bacak 17 > MISO
  • bacak 16 > MOSI
  • bacak 15 > CS
Arduino'nun 10 numaralı pini yani CS pini ATMEGA328'in 1 numaralı bacağı yani RESET bacağına bağlanır ve bu reset bacağı da aynı zamanda 10K bir direnç ile +5V'a bağlanmalıdır.

Bunun dışında Arduino ve ATMEGA328'in bağlantıları karşılıklı yapılır. Yani MISO>MISO'ya, MOSI>MOSI'ye ve SCK>SCK'ya bağlanır. 

Bir de ATMEGA328'in 16MHz değerinde bir kristale ihtiyacı var. ATMEGA328'in 9 ve 10 numaralı bacakları Kristal bağlantı bacaklarıdır. Krsitalin bir bacağı 9 diğer bacağı 10 numaralı bacağa bağlanır. Aynı zamanda 9 numaralı bacaktan toprağa 22pF bir adet kondansatör bağlanır aynısını 10 numaralı bacak içinde bağlanır.

ATMEGA328'in 7,20 ve 21 numaraşı bacakları +5V'a, 8 ve 22 numaralı bacakları toprağa yani GND'ye bağlanır. Tüm bu anlatılanların hepsi aşağıda fritzing şemasında bağlantıları yapılmış halde görülmektedir. Şemada görünen 2 adet kondansatörün değeri 22pF, kristalin değeri 16MHz'dir.
vZ049R.png


ÜÇÜNCÜ AŞAMA: BOOTLOADER'IN ATMEGA328'E YÜKLENMESİ
Birinci aşamayı ardından da ikinci aşamayı da yaptıysanız sıra geldi üçüncü ve son aşamaya. Yani ATMEGA328'e bootloader'ın yüklenmesi.İkinci aşamadaki şemayı kurduysanız Arduino'yu USB kablosu ile bilgisayara bağlayın. Ardından "Araçlar > Önyükleyiciyi Yazdır" yolunu izleyip "ÖnyükYazdırleyiciyi " seçeneğini tıklayın. 

PQRQ66.png

Biraz uzun sürebilir yaklaşık 20-40 saniye içinde yüklenecektir bootloader. O yüzden bir sorun mu var dondu mu kaldı mı diye endişelenmeyin. Yükleme tamamlandığında tamamlandığını bilgisayarda göreceksiniz tıpkı normal bir programı upload ettiğinizde olduğu gibi.

Böylece ATMEGA328'e Arduino Bootloader'ı yüklemiş olduk.

//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

Evet şuan elimizde Arduino Bootloader yüklü olan bir ATMEGA328'imiz oldu ancak buna bu şekilde yazacağımız arduino kodlarımızı yükleyemeyiz. Çünkü en başlarda da dediğim gibi biz bootloader'ı Arduino platformunu kullanabilmek ve RX-TX pinleri ile programlayabilmek için yükledik. Bu da demek oluyor ki bizim bir USB-Serial Çeviriciye ihtiyacımız olacak. Bu sayede kodlarımızı ATMEGA328'e yükleyebilelim.

Şimdi Arduino Bootloader'ımızı yüklediğimiz ATMEGA328'e nasıl program kodlarımızı yükleyeceğimizi görelim.

ARDUINO BOOTLOADER'LI ATMEGA328'E ARDUINO KODU NASIL YÜKLENİR?
Öncelikle birinci aşamada yapılan "Araçlar > Programlayıcı" yolunu izleyip seçtiğimiz "Arduino as ISP" seçeneğini eski haline geri getiriyoruz hatırlamıyorsanız "AVR ISP" seçeneğini seçiniz. Artık Arduino ile ATMEGA328 arasındaki bağlantıları sökmelisiniz. Arduino'nuza yüklenen "ArduinoISP" programı kalıcı olmadığı için eskisi gibi istediğiniz kodları yükleyebilirsiniz. 

Daha sonra USB-Serial çeviriciniz ile ATMEGA328 arasındaki bağlantıları aşağıdaki gibi yapmamız gerekiyor;
9G6Gl5.png
Mavi kondansatörler 100nF değerinde. Mavi olduğuna bakmayın renginden ziyade 100nF olması yeterlidir. 
Buradaki çevirici FTDI çipli bir çevirici. Bununda bir önemi yok, CH340, CP2102 çipli çeviriciler de aynı bacaklara ve aynı isimlere sahipler. Önemli olan tek şey "DTR" bacağına sahip olmalarıdır. Eğer elinizde "DTR" isimli bacağı olmayan bir USB-Serial çevirici varsa muhtemelen işe yaramayacaktır ya da kodları yüklerken sorun yaşayacaksınızdır.

ATMEGA328'in 18 numaralı bacağına bir LED bağladım. Çünkü 18 numaralı bacak Arduinonun 13 numaralı dijital pinine denk gelmektedir. Bu pinlerin ATMEGA328 ile Arduino arasında ilişkileri konunun en başında paylaştığım iki görselde mevcut, biri UNO biri NANO için. MEGA üzerinde ATMEGA2560 bulunduğu için bu konu ile ilişkilendirilmemesi gerekmektedir!

Yukarıdaki bağlantıyı yaptıktan sonra bilgisayarınızdan Arduino'yu açınız. Ve USB-Serial çeviricinizi USB'ye bağlayınız. Board için ister UNO isterseniz NANO seçin fark etmeyecektir. Ardından ilgili COM portunu seçiniz. 

Hemen ardından "Dosya > Örnekler > Basics" yolunu izleyip "Blink" yazan seçeneği tıklayınız. Karşınıza LED yakıp söndüren Arduino kodu gelecek ve Upload tıklayarak yüklemeyi başlatınız.

Yükleme tamamlandığında artık breadboard üzerine kurduğumuz ve içine Arduino Bootloader yüklediğimiz ATMEGA328'e ilk Arduino kodumuzu yüklemiş olduk. 

2 Ocak 2018 Salı

Ortam Sıcaklığını Arduino ile Tweet Atmak


Ethernet modülümüzü başarılı bir şekilde internete bağladığımıza göre, bu modül ile yapılabilecek projelere bakalım. "ethercard-master" kütüphanesi içerisinde tweet atmak için yazılmış örnek program bulunmaktadır. Bu program üzerinde ufak değişiklikler yaparak ortam sıcaklığını tweet atan bir devre kurabiliriz. Öncelikle Twitter'a mesaj yollayabilmemiz için kişisel jetonunuzun (token) olması gerekir. Bunun için burada linki verilen Twiter uygulamasını kullanabilirsiniz.
Twitter üye girişinizi yaptıktan ve uygulamaya izin verdikten sonra, site üzerinde jetonunuz (token) görünür. Bu sayı ve karakterleri yazacağımız Arduino koduna ekleyeceğiz.
Bu uygulamayı yapmak için ihtiyacınız olan malzemeler:
  • Arduino UNO
  • Ethernet modülü
  • 1 x LM35 (sıcaklık sensörü)
  • 1 x Breadboard
Devremizi yukarıdaki devre şemasında gösterildiği gibi kuralım. Ethernet kablosunu, ethernet modülümüze bağladıktan sonra devre kurulumumuz tamamlanmış olacaktır. Artık Arduino kodunu hazırlayabiliriz.
Öncelikle Arduino, Ethernet modülü yardımıyla internet ağına bağlanması gerekir. LM35 ile ortam sıcaklığı ölçülerek tweet mesajına eklenecektir. Oluşturulan mesaj, Twitter üzerinden aldığımız jeton (token) ve Twitter uygulaması yardımıyla tweetlenecektir.
#include <EtherCard.h>
 
 
#define TOKEN  "BURAYA TOKEN KODUNUZU YAZINIZ"

static uint32_t timer;

byte mymac[] = { 0x74,0x69,0x69,0x2D,0x30,0x31 };
/* tekil MAC adresi */

const char website[] PROGMEM = "arduino-tweet.appspot.com";
/* Tweet atabilmemiz için kullandığımız uygulama adresi */

static byte session;
 
byte Ethernet::buffer[700];
Stash stash;
 
static void TweetAt () {
  Serial.println("Tweet hazirlaniyor");
  float sicaklik = analogRead(A0); 
  /* A0daki gerilim ölçüldü */
  sicaklik = sicaklik * 0.48828125;
  /* Ölçülen gerilim sicaklığa çevrildi */

  byte sd = stash.create();
  stash.print("token=");
  stash.print(TOKEN);
  stash.print("&status=");
  stash.print("Odamin sicakligi su anda ");
  stash.print(sicaklik);
  stash.println(" derecedir.");
  
  Serial.println("Tweet hazirlandi");
  
  stash.save();
  int stash_size = stash.size();  
  Stash::prepare(PSTR("POST http://$F/update HTTP/1.0" "\r\n"
    "Host: $F" "\r\n"
    "Content-Length: $D" "\r\n"
    "\r\n"
    "$H"),
  website, website, stash_size, sd);
  session = ether.tcpSend();
  Serial.println("Tweet yollandi");
}
 
void setup () {
  Serial.begin(57600);
  if (ether.begin(sizeof Ethernet::buffer, mymac) == 0) 
    Serial.println(F("Ethernet baglanti hatasi"));
  if (!ether.dhcpSetup())
    Serial.println(F("DHCP hatasi"));
 
  ether.printIp("IP:  ", ether.myip);
  ether.printIp("GW:  ", ether.gwip);  
  ether.printIp("DNS: ", ether.dnsip);  
 
  if (!ether.dnsLookup(website))
    Serial.println(F("DNS hatasi"));
 
  ether.printIp("SRV: ", ether.hisip);
 
}
 
void loop () {
  ether.packetLoop(ether.packetReceive());
 
  const char* reply = ether.tcpReply(session);
  if (reply != 0) {
    
    Serial.println(reply);
  }
  
  if (millis() > timer) {
    timer = millis() + 60000;
    Serial.print("Baglanti kuruluyor");
    TweetAt();
  }

}
Not: Seri haberleşmenin daha hızlı gerçekleşmesi için Baud Rate 57600 olarak belirlenmiştir. Serial monitörde mesajların doğru görülmesi için serial monitor penceresinin sağ altından baud rate ayarını yapmayı unutmayınız.
Setup fonksiyonu içinde ethernet modülünün ağa katılabilmesi için ayarlamalar yapıldı. Arduino'nun ağ üzerindeki IP adresi de bu bölümde ekrana yazdırıldı. Loop fonksiyonu içinde ethernet modülünden gelecek mesajlar gösterildi ve 60 saniyede bir "TweetAt" fonksiyonu çağrıldı.
"TweetAt" fonksiyonu, sıcaklığın ölçülerek Twitter mesajının oluşturulduğu fonksiyondur. Burada oluşturulan mesaj daha önceden izin verdiğimiz uygulama aracılığıyla Twitter'a yollanır. Bu fonksiyon, loop fonksiyonu içerisinde 60 saniyede bir çağrılır. Kısa sürelerde aynı tweetlerin atılması, Twitter'ın yollanan mesajları engellemesine neden olabilir.
Ethernet modülü bazen tweet atarken başarısız olabilir. Bu durumlarda tekrar tweet atmayı deneyebilirsiniz.
Bu uygulama değiştirilerek yeni Nesnelerin İnterneti (Internet of Things) projeleri gerçekleştirilebilir. Örneğin burada kullanılan sıcaklık sensörü yerine, toprak-nem sensörü kullanarak çiçeğinizin durumunu çevrimiçi olarak takip edebilir, istediğiniz zaman çiçeğinizi sulayabilirsiniz.

Arduino ile Web Tarayıcı Yapımı


Ethernet modülünün internete başarıyla bağlanıp bağlanmadığını anlamak için bu uygulamada Arduino ile internet sitelerine bağlanmaya çalışacağız. Bağlandığımız sitenin HTML kodlarını seri monitöre yazdıracağız. Böylece Arduino ile basit bir web tarayıcı yapmış olacağız.
Uygulamada daha önceden yüklediğimiz "ethercard-master" kütüphanesini kullanacağız. Ethernet Shield kullanacak Arduino geliştiricileri, Shield'i doğrudan Arduino üzerine takarak, devre kurulumunu tamamlayabilir. Enc28j60 ethernet modülünü kullanacaklar için kurulması gereken devre, aşağıdaki devre şamasında gösterilmiştir.
Devre kurulumunu gerçekleştirdiğimize göre aşağıdaki Arduino kodunu yükleyelim ve serial monitörü açalım.
#include <EtherCard.h>


static byte mymac[] = { 0x74,0x69,0x69,0x2D,0x30,0x31 }; 
/* Ethernet ağında tek olması gereke MAC adresi */

byte Ethernet::buffer[700];
static uint32_t timer;

const char website[] PROGMEM = "www.google.com";
/* bağlantı kurulacak internet sitesi */

// called when the client request is complete
static void my_callback (byte status, word off, word len) {
  Serial.println(">>>");
  Ethernet::buffer[off+300] = 0;
  Serial.print((const char*) Ethernet::buffer + off);
  Serial.println("...");
}

void setup () {
  Serial.begin(57600);
  Serial.println(F("\n[web browser]"));

  if (ether.begin(sizeof Ethernet::buffer, mymac) == 0) 
    Serial.println(F("Ethernet baglanti hatasi"));
  if (!ether.dhcpSetup())
    Serial.println(F("DHCP hatasi"));

  ether.printIp("IP:  ", ether.myip);
  ether.printIp("GW:  ", ether.gwip);  
  ether.printIp("DNS: ", ether.dnsip);  

  if (!ether.dnsLookup(website))
    Serial.println("DNS failed");
    
  ether.printIp("SRV: ", ether.hisip);
}

void loop () {
  ether.packetLoop(ether.packetReceive());
  
  if (millis() > timer) {
    timer = millis() + 5000;
    Serial.println();
    Serial.print("Baglanti kuruluyor");
    ether.browseUrl(PSTR(""), "", website, my_callback);
  }
}
Yukarıdaki kod çalıştırıldığında, eğer tüm ayarlar ve devre kurulumu doğruysa, Arduino’nun belirtilen internet sitesine bağlanması ve bu site ile ilgili bilgileri ekrana yazdırması gerekmektedir. Bağlantı başarılı bir şekilde kurulduktan sonra sitenin HTML kodları da serial monitörde görünecektir.
Seri haberleşmenin daha hızlı gerçekleşmesi için Baud Rate 57600 olarak belirlenmiştir. Serial monitörde mesajların doğru görülmesi için serial monitor penceresinin sağ altından baud rate ayarını yapmayı unutmayınız.
"mymac" değişkenine yazılacak MAC adresi, orijinal ethernet modülleri üzerinde yapıştırma şeklinde yazmaktadır. Eğer böyle bir yapıştırma bulunmuyorsa, kodda belirtilen MAC adresi denenebilir. Setup fonksiyonu içinde, modülün belirtilen MAC adresi ile ağa bağlanıp bağlanamadığı kontrol edilmiştir. Eğer bağlantı hatasız gerçekleştirildiyse, Arduino'nun ağdan aldığı IP adresi ekrana yazdırılmıştır.
Loop fonksiyonu içinde belirtilen internet sitesine bağlanma komutları bulunmaktadır. Arduino beş saniyede bir belirtilen internet sitesine tekrar bağlanmaktadır. Bunu sağlamak için daha önceden öğrendiğimiz millis fonksiyonu kullanılmıştır.
Eğer Arduino'nuz hatasız bir şekilde internete bağlandıysa, artık Nesnelerin İnterneti (Internet of Things) projelerini gerçekleştirebilirsiniz.