C# arayüzü ile Arduino'ya PWM gönderebildiğimiz programın nasıl oluşturulduğunu anlattığım videomu YouTube kanalımda yayınladım. İyi seyirler.
27 Ocak 2018 Cumartesi
27 Temmuz 2017 Perşembe
Arduino - C# ile LCD'de CPU Sıcaklıgını Gösterme
Bir önceki yazımda C# üzerinden textBox kısmına girdiğimiz yazıyı LCD'de yazdırmıştık. Bu sefer bilgisayarın CPU sıcaklığını hem C# arayüzünde hem de LCD'de göstermemizi
sağlayacak kodları paylaşmak istiyorum.
23 Temmuz 2017 Pazar
Arduino - C# ile LCD'de Yazı Yazdırma
Merhaba arkadaşlar,
C# ile Arduino'ya bağlı LCD'ye nasıl yazı yazdırabileceğimizi anlattığım videoyu ve kodları paylaşıyorum. Umarım sizlere yardımcı olur.
12 Temmuz 2017 Çarşamba
Arduino - C# ile Aynı İki ve Daha Fazla Veri Okuma
C# ile tek bir veri okuma üzerine videolar yayınlamıştım. Fakat sadece 1 veri okumak elbette her zaman yeterli olmayacaktır. Projelerimizde daha fazla veriyi okumamız gerekebilir. Bu yüzden C# birden çok veri okuma üzerine bir video hazırladım. Yazılımın tamamını, videonun altındaki linkten indirebilirsiniz.Umarım işinize yarar.
5 Haziran 2017 Pazartesi
Arduino - Joystick ile Servo Motor Sürme
Bu yazımda joystick kullanımından bahsetmek istiyorum sizlere. Kullanımı oldukça basit. Kullanacağım modül siyah kartlı KY-023 joystick modülü. Üzerinde 2 adet potansiyometre ve de 1 adet buton var. 5V ile çalışıyor.
Ben uygulamayı LCD Keypad Shield ile yaptığım için fritzingde hem LCD'siz hem LCD li olanı çizmek istedim.
Ben uygulamayı LCD Keypad Shield ile yaptığım için fritzingde hem LCD'siz hem LCD li olanı çizmek istedim.
25 Mart 2017 Cumartesi
Arduino - Su Seviye Sensörü Uygulaması
Su seviye sensörünün kullanımı aslında çok basit. Herhangi bir potansiyometreyi okuyan biri bu sensörü rahatlıkla kullanabilir. "-" ucunu GND, "+" ucunu 5V'a "S" ucunu da herhangi bir analog girişe takıp AnalogReadSerial örneğini açarak bu sensörü kullanabilirsiniz.
Lakin bu sensör, doğrusal çıkış vermemekte ve bu yüzden de okunan adc değerlerinin cm cinsine çevrilmesinin mümkünatı zorlaşmakta.
Bu yüzden biz de adc değerlerinden örnekler alarak bu değerleri MATLAB programındaki "Eğri Uydurma" özelliğini kullanarak cm cinsine çevireceğiz.
Lakin bu sensör, doğrusal çıkış vermemekte ve bu yüzden de okunan adc değerlerinin cm cinsine çevrilmesinin mümkünatı zorlaşmakta.
Bu yüzden biz de adc değerlerinden örnekler alarak bu değerleri MATLAB programındaki "Eğri Uydurma" özelliğini kullanarak cm cinsine çevireceğiz.
20 Temmuz 2016 Çarşamba
PIC18F452 CCS C - DS1307 Zaman Modülü Uygulaması
Bu yazımda DS1307 entegreli RTC modülümüzle I2C haberleşmesini kullanarak gün/tarih/saat bilgilerini okuyup, bu bilgileri PIC18F452 mikrodenetleyicimizle LCD'de göstereceğiz.
Modülün sağdaki resimde görüldüğü gibi iki tarafında da header padleri bulunmakta. Ben sadece sol taraftaki padleri kullandım. İsterseniz sol üste DS18b20 modülünü de takarak sıcaklık değeri okuyabiliyorsunuz. Ben sadece zaman okudum.
6 Temmuz 2016 Çarşamba
Arduino - TCRT5000 IR Sensör Uygulaması
Bu yazımda TCRT5000 kızılötesi sensörün kullanımından bahsedeceğim. HC-SR04 ultrasonik sensör ile mesafe ölçmüştük. HC-SR04 ses dalgası kullanıyordu. TCRT5000 ise kızılötesi dalgaları kullanıyor.
TCRT5000 ile sadece mesafe ölçümü değil ayrıca lojik-1 lojik-0 düzeyinde de kullanabilir bunun yanı sıra siyah-beyaz bant ayrımı da yaptırtabilirsiniz. Bu sayede çizgi izleyen bir robot yapabilirsiniz.
Ben bu yazımda sensörün analog çıkışını okuyacağım ve bunu LCD ekrana yazdıracağım. Sensörü soldaki şemaya göre oluşturup, siyah gözü 5v'a çektiğimiz yeri Arduino'nun A0 pinine bağlıyoruz.
Siyah gözü 10K ile Mavi Gözü 100ohm ile 5V'a çekiyoruz. Ben 20K-100 ohm ikilisini kullandım, siz aldığınız ölçümlere göre en optimum ikiliyi seçip kullanabilirsiniz.
TCRT5000 ile sadece mesafe ölçümü değil ayrıca lojik-1 lojik-0 düzeyinde de kullanabilir bunun yanı sıra siyah-beyaz bant ayrımı da yaptırtabilirsiniz. Bu sayede çizgi izleyen bir robot yapabilirsiniz.Ben bu yazımda sensörün analog çıkışını okuyacağım ve bunu LCD ekrana yazdıracağım. Sensörü soldaki şemaya göre oluşturup, siyah gözü 5v'a çektiğimiz yeri Arduino'nun A0 pinine bağlıyoruz.
Siyah gözü 10K ile Mavi Gözü 100ohm ile 5V'a çekiyoruz. Ben 20K-100 ohm ikilisini kullandım, siz aldığınız ölçümlere göre en optimum ikiliyi seçip kullanabilirsiniz.
25 Aralık 2015 Cuma
Arduino - ULN2003A ile Step (Adım) Motor Sürme
DC Motor ve Servo Motoru PWM yöntemiyle sürmüştük. Step motorun sürülmesi ise bu diğer 2 motora göre biraz daha farklı. Step motorlar dijital kontrollüdürler ve her gönderilen pals için belli açıda döndürülebilirler. Hassasiyet gereken küçük açılarla hareket etmesi istenen cihazlar için kullanılırlar.
Soldaki gifte görüldüğü gibi step motorun 4 sargısında sırasıyla verilen lojik-1'ler ile oluşan manyetik alan sayesinde rotorun dönmesi sağlanır.
Step motorun sürülmesi için 2 yöntem vardır. Bunlar "Tam Adım" ve "Yarım Adım" sürme teknikleridir.
Tam Adım'da motor sargılarının ikisi aynı anda enerjilendirilir, tıpkı soldaki gifte görüldüğü gibi.
Yarım Adım'da ise tek faz ve tam adım sürme adımları art arda uygulanır. Böylece motor her enerjilendirmede yarım adım döner.
Kullandığımız motor 28BYJ-48 Tam adımda 3º , Yarım Adımda 1.5º dönmekte. Biz uygulamamızda yarım adım yöntemini kullanacağız. Tam adım ve yarım adım motor sürmek için sargılara sırasıyla uygulanması için gereken pals tablosu aşağıda.
Yapacağımız uygulamayı özetlemek gerekirse bağladığımız 2 buton ile step motorumuza 1.5º'lik açıyla yön vereceğiz.
Bu sargılara verilmesi gereken akımı Arduino karşılayamadığı için dolaylı yoldan, ULN2003A entregresini kullanarak süreceğiz. Bu entegre 500mA'e kadar çıkış verebilmektedir.
Kodlarımız;
1 | #define IN1 8 |
Denemek için zamanım olmadı fakat I/O kodlarını hexal moda çevirip kısaltarak burda tekrar paylaşacağım.
Tam adım sürmek isteyenler, sargıları tek tek lojik-1 (HIGH) yaparak sonuca ulaşabilirler.
NOT: Daha önce ki motor uygulamalarımızda yaptığımız gibi motorun beslemesini toprakları ortak olmak şartıyla dışardan almanızda fayda var. Fakat beslemeyi Arduino'dan almanızda da bir sakınca yok, çalışıyor.
Uygulama Videosu;
Şemalarını kullanmış olduğum kaynaklar;
http://domoticx.com/arduino-modules-stappenmotor-28byj-48/
http://www.electricaleasy.com/2014/10/stepper-motor.html
16 Aralık 2015 Çarşamba
PIC18F452 CCS C - Yazılımsal PWM ile Servo Motor Sürme
Bu yazımda daha önce Arduino kullanarak sürdüğümüz servo motoru aynı şekilde PIC ile yapmaya çalışacağız. Bildiğiniz gibi Arduino, kütüphaneleri sayesinde işimizi çok kolaylaştırmakta fakat aynı durumu PIC için söyleyemeyeceğim. Kütüphane kullanmadan yazılımsal PWM ile servoyu CCS C kullanarak kontrol etmeye çalışacağız.
Öncelikle servo motorlar hakkında detaylı bilgi için Arduino ile yaptığımız uygulamanın yazısını okumanız yeterli olacaktır.Bağlantı linki;
http://arduinotik.blogspot.com.tr/2014/05/arduino-pwm-ile-servo-motor-surme.html
Yazılımsal PWM oluşturma mantığımız soldaki gifte görüldüğü gibi olacak. Toplamda 20 ms'lik bir sinyal üretip 0 Derece için 1ms, 180 Derece için 2 ms lik bir duty cycle oluşturacağız. En azından teorik olarak. Çünkü kullandığım servo motor (SG90), 550us-2550 us'lik duty cycle ile çalışmakta. Tabii ki sinyal genişliğimiz yine 20ms olacak.
Yazılım kodlarını atmadan önce yaptığım işlemlerden kısaca bahsetmek istiyorum. Öncelikle servo motor için aç-kapa mantığı ile (led yakıp söndürme ile aynı) bir fonksiyon oluşturdum. Bu açma-kapama süreleri arasında kullandığım gecikme zamanlarını da potansiyometreden okuduğum adc değerleri ile belirledim. Yani servo motor potansiyometreden okundan adc değerine göre açıyı belirleyip konum alacak.
Neden donanımsal PWM kullanmadım ? Çünkü PIC ile 50 Hz'lik donanımsal PWM sinyali oluşturamıyorum. Bu yüzden yazılımsal PWM'i tercih ettim.
LCD kütüphanenizi kendinize göre belirlemeyi unutmayın.
Potansiyometrenin orta ucunuz A0 pinine, Servo motorun PWM ucunu da D7 pinine bağladım.
Ayrıca Servo motoru toprak uçları aynı olmak şartıyla başka bir kaynaktan beslemenizde gerekiyor.
SG90 Tower Pro Servo Motoru 550us-2550us arasında çalışıyor. Yani her şekilde en az 550 mikrosaniyelik bir PWM sinyalimiz olacak ve açı eklemelerimiz bu sürenin üzerine olmalı. En fazla da 2550 mikrosaniye.
Kabaca bir hesapla 10 bitlik ADC kullanarak 1023 değerini elde ettiğimizde PWM sinyalimizin doluluğun 2550 mikro saniye olması gerekiyor. Yani,
550+ADC.X=2550 denkleminde ADC yerine 1023 koyarsak,
X= 1,955 çıkıyor. delay_us fonksiyonunu kullanırken içinin tam sayı olması için bu değeri 2'ye yuvarladım. Ondalıklı değerlerde sıkıntı çıkıyor çünkü.
LCD'de açıyı göstermek için de, servonun her 1 derecelik dönüşünün 11.1 us olduğunu hesapladım. Dolayısıyla 2 ile çarptığım değeri 11.1'e böldüğümde açı değeri çıkıyor.
(2550-550) / 180 = 11.1 us
void servo fonksiyonu ile de minimum 550us'lik lojik-1 ve bunu 20000us (20ms) ye tamamlayacak lojik-0 (20000-550=19450 us) değelerinden; lojik-1'e 2 ile çarptığımız ADC değerini ekler, lojik-0'dan da bu değeri çıkarırsak servomuzu sürebiliriz.
PWM sinyalimizin frekansının her zaman 50Hz, periyodunun da 20ms olduğuna dikkat ediniz.
Bu arada kullanmış olduğum
header dosyasının kodları da aşağıda ve siz direkt yazılımın başına ekleyebilirsiniz dilerseniz. Ya da benim kullandığım gibi ana programın olduğu klasöre atıp include edebilirsiniz.
Uygulamanın videosu;
Öncelikle servo motorlar hakkında detaylı bilgi için Arduino ile yaptığımız uygulamanın yazısını okumanız yeterli olacaktır.Bağlantı linki;
http://arduinotik.blogspot.com.tr/2014/05/arduino-pwm-ile-servo-motor-surme.html
Yazılımsal PWM oluşturma mantığımız soldaki gifte görüldüğü gibi olacak. Toplamda 20 ms'lik bir sinyal üretip 0 Derece için 1ms, 180 Derece için 2 ms lik bir duty cycle oluşturacağız. En azından teorik olarak. Çünkü kullandığım servo motor (SG90), 550us-2550 us'lik duty cycle ile çalışmakta. Tabii ki sinyal genişliğimiz yine 20ms olacak.
Yazılım kodlarını atmadan önce yaptığım işlemlerden kısaca bahsetmek istiyorum. Öncelikle servo motor için aç-kapa mantığı ile (led yakıp söndürme ile aynı) bir fonksiyon oluşturdum. Bu açma-kapama süreleri arasında kullandığım gecikme zamanlarını da potansiyometreden okuduğum adc değerleri ile belirledim. Yani servo motor potansiyometreden okundan adc değerine göre açıyı belirleyip konum alacak.
Neden donanımsal PWM kullanmadım ? Çünkü PIC ile 50 Hz'lik donanımsal PWM sinyali oluşturamıyorum. Bu yüzden yazılımsal PWM'i tercih ettim.
#include <main.h>
#include <flexy_lcd.c>
#use fast_io(a)
#use fast_io(d)
unsigned long int i=0,aci=0;
void servo(unsigned long int b,c)
{
output_high(pin_d7);
delay_us(550+b); // PWM Dolu Kısım
output_low(pin_d7);
delay_us(19450-b); //PWM Dolu Kısmı 20 ms'e tamamlayacak kısım
printf(lcd_putc,"\fAci = %u Derece",c);
continue;
}
void main()
{ set_tris_a(0x01);
set_tris_d(0x00);
output_d(0x00);
setup_adc(adc_clock_div_16);
setup_adc_ports(AN0);
set_adc_channel(0);
lcd_init();
while(1)
{
i=read_adc();
aci=i*2/11.1;
i=i*2;
servo(i,aci);
}
}
LCD kütüphanenizi kendinize göre belirlemeyi unutmayın.
Potansiyometrenin orta ucunuz A0 pinine, Servo motorun PWM ucunu da D7 pinine bağladım.
Ayrıca Servo motoru toprak uçları aynı olmak şartıyla başka bir kaynaktan beslemenizde gerekiyor.
SG90 Tower Pro Servo Motoru 550us-2550us arasında çalışıyor. Yani her şekilde en az 550 mikrosaniyelik bir PWM sinyalimiz olacak ve açı eklemelerimiz bu sürenin üzerine olmalı. En fazla da 2550 mikrosaniye.
Kabaca bir hesapla 10 bitlik ADC kullanarak 1023 değerini elde ettiğimizde PWM sinyalimizin doluluğun 2550 mikro saniye olması gerekiyor. Yani,
550+ADC.X=2550 denkleminde ADC yerine 1023 koyarsak,
X= 1,955 çıkıyor. delay_us fonksiyonunu kullanırken içinin tam sayı olması için bu değeri 2'ye yuvarladım. Ondalıklı değerlerde sıkıntı çıkıyor çünkü.
LCD'de açıyı göstermek için de, servonun her 1 derecelik dönüşünün 11.1 us olduğunu hesapladım. Dolayısıyla 2 ile çarptığım değeri 11.1'e böldüğümde açı değeri çıkıyor.
(2550-550) / 180 = 11.1 us
void servo fonksiyonu ile de minimum 550us'lik lojik-1 ve bunu 20000us (20ms) ye tamamlayacak lojik-0 (20000-550=19450 us) değelerinden; lojik-1'e 2 ile çarptığımız ADC değerini ekler, lojik-0'dan da bu değeri çıkarırsak servomuzu sürebiliriz.
PWM sinyalimizin frekansının her zaman 50Hz, periyodunun da 20ms olduğuna dikkat ediniz.
Bu arada kullanmış olduğum
#include <18F452.h>
#device adc=10
#FUSES NOWDT //No Watch Dog Timer
#FUSES HS //High speed Osc (> 4mhz for PCM/PCH) (>10mhz for PCD)
#FUSES NOPUT //No Power Up Timer
#FUSES NOPROTECT //Code not protected from reading
#FUSES NODEBUG //No Debug mode for ICD
#FUSES NOBROWNOUT //No brownout reset
#FUSES NOLVP //No low voltage prgming, B3(PIC16) or B5(PIC18) used for I/O
#FUSES NOCPD //No EE protection
#FUSES NOWRT //Program memory not write protected
#FUSES RESERVED //Used to set the reserved FUSE bits
#use delay(clock=20000000)
Uygulamanın videosu;
Etiketler:
ADC,
CCS C,
Darbe Genişlik Modülasyonu,
Duty Cycle,
Microchip,
PIC,
PIC18F452,
Potansiyometre,
Pulse Width Modulation,
PWM,
Servo Motor,
Towerpro SG90,
Yazılımsal PWM
Kaydol:
Kayıtlar (Atom)













