Bu kayıdımda STM32VLDISCOVERY kartı ile ADC okuma videom ve kodlar aşağıda.
ADC etiketine sahip kayıtlar gösteriliyor. Tüm kayıtları göster
ADC etiketine sahip kayıtlar gösteriliyor. Tüm kayıtları göster
14 Eylül 2018 Cuma
STM32 VL Discovery ile ARM Programlama - Analog to Digital Converter (ADC Okuma)
Bu kayıdımda STM32VLDISCOVERY kartı ile ADC okuma videom ve kodlar aşağıda.
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.
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
14 Nisan 2015 Salı
PIC16F877A CCS C - PWM ile DC Motor Sürme
Arduino ile DC motor sürmüştük. Aynı uygulamayı PIC ile yapmak isteyenler için bu yazıyı oluşturdum.
0-1023 arası okunan ADC değerini, 0-255 arasında bir değere dönüştürerek motoru istediğimiz hızda süreceğiz.
Şemada npn,pnp ve mosfet kullanarak oluşturulmuş bir sürücü devresi var. İsterseniz Arduino ile yaptığımız uygulamadaki sürücü devresi ile de bu uygulamayı gerçekleştirebilirsiniz.2N2222 transistörünü kullanabilirsiniz. Tek transistörlü sürücü devresi için,
Arduino ile DC Motor Sürme
Uygulama kodlarına geçmeden önce belirtmek istediğim birşey var. LCD kütüphanesini ben kendime göre ayarlamıştım. LCD devresini oluştururken kablolamaları kendi kütüphanenize uygun olarak bağlayın ve yazılımın LCD ile alakalı yerlerini de yine aynı şekilde kendinize göre oluşturun .
#use fast_io(a)
#use fast_io(c)
unsigned long int data,k; //data=adc değeri, k pwm değeri olacak
#include <flexy_lcd.c> // kendi LCD kütüphanenizi yazın
void main()
{
setup_adc_ports(NO_ANALOGS);
setup_adc(ADC_CLOCK_DIV_2);
setup_psp(PSP_DISABLED);
setup_spi(SPI_SS_DISABLED);
setup_timer_0(RTCC_INTERNAL|RTCC_DIV_1);
setup_timer_1(T1_DISABLED);
setup_timer_2(T2_DIV_BY_16,255,1); // PWM için timer2 kullanılıyor, maksimum değeri 255 olarak ayarladık
set_tris_a(0x01);
set_tris_c(0x00);
setup_ccp1(CCP_PWM); //17 nolu pin, RC2
setup_adc(adc_clock_div_32);
setup_adc_ports(AN0); // AN0 'ı ADC portu olarak ayarladık
lcd_init();
set_adc_channel(0); //ADC kanalını setledik
set_pwm1_duty(k); // PWM'i setledik
delay_us(20);
while(1)
{
data=read_adc(); //Datayı okuyoruz.
k=(data*0.249266862); //0-1023 arası okunan değeri 0-255 arası değere çeviriyoruz
set_pwm1_duty(k); //PWM sinyalini gönderiyoruz.
printf(lcd_putc,"\fADC=%Lu \nPWM=%Lu",data,k); // LCD'ye yazdırıyoruz.
delay_ms(100);
}
}
Projeyi oluşturduğumuz klasörün içerisinde bir de .h uzantılı bir dosyamız var. Onun içinde bir kaç değişiklik yapmamız gerekiyor. 8 olan ADC değerini 10 yapmak gibi.
#include <16F877A.h>
#device ADC=10 //ADC değeri genelde 8 oluyor burda , 10 yapıyoruz
#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
#FUSES XT
#use delay(clock=4000000) //delay fonksiyonunu kullanmak için OSC frekansını girdik.
Kolay gelsin :)
Etiketler:
2N2222,
ADC,
CCS C,
DAC,
Darbe Genişlik Modülasyonu,
DC Motor Sürme,
Microchip,
MOSFET,
PIC,
PIC16F877A,
Potansiyometre,
Potentiometer,
PWM,
PWM ile DC Motor,
Sürücü Devresi
21 Mart 2015 Cumartesi
Arduino - C# Arayüzü ile Veri Okuma
Merhaba.
Arduino'dan okuduğumuz verileri direkt Serial Monitör'den ya da LCD'den okuyabiliyorduk. Fakat bu okunan veriler için bir tasarrufumuz olmuyordu.
Bu yazıda Arduino'dan okuduğumuz veriyi C# da gösterip, istediğimiz değerleri listbox'a kaydettiğim arayüzden bahsedeceğim. Bu arayüzü oluşturmamda yardımcı olan Necmettin Zengin arkadaşıma teşekkür ederim.
Resimde de görüldüğü gibi arayüzde 4 buton, 2 combobox, 2 label ve 1 tane de listbox bulunmakta. 0 yazan yerde ölçülen analog değer gösterilecek ve ekle butonuna bastığımızda okunan değer listbox a eklenecek. C# da hazırlanan bu arayüz için ayrıca bir arduino yazılımına ihtiyaç bulunmamakta. Serial Monitör'de veri okuyacakmış gibi yazılımınızı oluşturmanız yeterli.
RS232 vb. seri port haberleşmesinde deneme şansım olmadı, en yakın zamanda PIC için deneyip sonucunu burada yazarım.
C# kodlarına geçecek olursak ki yakın zamanda bununla alakalı bir video çekmeyi de planlıyorum;
Arayüz oluşturma vidyom. Aynı arayüz değil :)
Microsoft Visual Basic Form şeklinde ve exe olarak aşağıdaki linkten programa ulaşabilirsiniz.
İndirme Linki
Burda da aynı arayüz programına Serial.ReadLine() methodu ile devam ederek veri okumayı daha stabil daha işlenebilir hale getirdim.
Arduino'dan okuduğumuz verileri direkt Serial Monitör'den ya da LCD'den okuyabiliyorduk. Fakat bu okunan veriler için bir tasarrufumuz olmuyordu.
Bu yazıda Arduino'dan okuduğumuz veriyi C# da gösterip, istediğimiz değerleri listbox'a kaydettiğim arayüzden bahsedeceğim. Bu arayüzü oluşturmamda yardımcı olan Necmettin Zengin arkadaşıma teşekkür ederim.
Resimde de görüldüğü gibi arayüzde 4 buton, 2 combobox, 2 label ve 1 tane de listbox bulunmakta. 0 yazan yerde ölçülen analog değer gösterilecek ve ekle butonuna bastığımızda okunan değer listbox a eklenecek. C# da hazırlanan bu arayüz için ayrıca bir arduino yazılımına ihtiyaç bulunmamakta. Serial Monitör'de veri okuyacakmış gibi yazılımınızı oluşturmanız yeterli.
RS232 vb. seri port haberleşmesinde deneme şansım olmadı, en yakın zamanda PIC için deneyip sonucunu burada yazarım.
C# kodlarına geçecek olursak ki yakın zamanda bununla alakalı bir video çekmeyi de planlıyorum;
1 | using System; |
Arayüz oluşturma vidyom. Aynı arayüz değil :)
Microsoft Visual Basic Form şeklinde ve exe olarak aşağıdaki linkten programa ulaşabilirsiniz.
İndirme Linki
Burda da aynı arayüz programına Serial.ReadLine() methodu ile devam ederek veri okumayı daha stabil daha işlenebilir hale getirdim.
Etiketler:
ADC,
Analog Veri Okuma,
Arayüz,
Arduino,
Arduino Projeleri,
Arduino Tutorial,
Baudrate,
C#,
C# Interface,
Listbox,
Microsoft Visual Studio,
Necmettin Zengin,
Sensör,
Seri Haberleşme,
Serial Communication
7 Mayıs 2014 Çarşamba
Arduino - PWM ile DC Motor Sürme
Darbe genişlik modülasyonu (PWM) ile ilgili uygulama gerçekleştirmiştik. Bu yazımda ise bu konuyu biraz daha aralayacağız ve bu modülasyon ile transistörün anahtarlama özelliğinden faydalanarak DC motor hızını kontrol edeceğiz.
PWM'den bahsetmeden önce gerekli olan malzemelerden bahsetmek istiyorum.
PWM en basit haliyle bir sinyal modülasyon tekniği olarak tanımlanabilir. Sinyal bilgisinin aktarım için uygun hale çevirilmesi amacının yanı sıra güç kontrolü sağlamak ve elektrik makineleri,güneş pili şarj üniteleri gibi özel devrelere destek olmak amacı da taşır.
Bu kontrol de tamamen anahtarlama ile sağlanır. Anahtarlama ne kadar hızlı yapılırsa, PWM ile aktarılan sinyalin gücü o kadar da artar. Örneğin bir lambaya gönderilen sinyalde PWM tekniğine ihtiyaç duyuluyorsa, bu teknik 120 Hz frekans değerinde uygulandığında maksimum verim elde edilebilir.
"Duty Cycle" yani görev döngüsü olarak tanımlanan bir kavram bulunuyor ve PWM tekniğinde de sıkça karşımıza çıkıyor. Görev döngüsü kavramı aslında yapılan işlemin periyodunu belirtiyor. Bu döngü düşük seviyelerde ise aktarılan güç düşük olurken, döngünün yüksek seviyelerinde yüksek güç aktarılıyor.
Basitçe soldaki Duty Cycle grafikleri ile PWM'i şu şekilde anlatabiliriz. 10 bitlik bir ADC ile analog değerimiz 0-255 arasında değer alır. Bu yeni dijital değer ile anahtar olarak kullanacağımız transistörün bazına bu sayısal değerler ile PWM uygularız. Sayı ne kadar büyük ise "Pulse Width" yani "Darbe Genişliği" o kadar büyük olur.
Bir pervaneyi elimizle çevirdiğimizi düşünelim. Ne kadar çok çevirip az dinlenirsek pervanemiz o kadar çok dönecektir. Çevirim kısmını 1,dinlenme kısmını da 0 olarak düşünürsek 1'ler ne kadar çoksa pervane de o kadar çok hızlı dönecektir. İşte bu 1'ler transistörümüzün bazına uyguladığımız PWM sinyalinin Darbe Genişliği demek oluyor.
DC MOTOR SÜRMEK
Soldaki devreyi Arduino'muz ile kuracağız.Transistörün 2N2222 veya muadili olmasına dikkat etmekte fayda var hakeza BC547 vs. gibi transistörler ile bu iş mümkün değil.Çünkü motoru döndüren güç akımdır ve yüksek akım geçiremeyen transistörler ile motor süremeyiz.
Direnç olarak 1k Ώ da kullanabilirsiniz fakat ben 470 Ώ kullandım, bu konuda sıkıntı yok.
Çok kısa da olsa kullanacağımız transistörden de bahsetmek istiyorum. Tüm transistörlerin C,B,E bacakları standart değildir. O yüzden devreyi tamamlerken sağdaki resme bir göz atmanızda fayda görüyorum. Ben ilk seferde transistörü ters taktım ne yazık ki :D ve transistör o kadar çok ısındı ki elimi yaktım. O yüzden dikkat !
ARDUINO ile DEVRE BAĞLANTISI
Arduino ile sadece motoru yavaşlatıp hızlandırmayacağız. Analog girişe taktığımız potansiyometre değerine göre motorumuzu süreceğiz ve bu işi en kısa yoldan yapmamızı sağlayan bir kod da öğrenmiş olacağız, map.
"map" komutu ile istediğimiz bir çıkış değerini, bağlı olan giriş değerine göre anında değiştirebiliriz.Örnek vermek gerekirse ki bu kodu motor sürme devremizde de kullandık;
motordegeri = map(potdegeri, 0, 1023, 0, 255);
Bu yukardaki kod ile "motordegeri" isimli değerimizi, potun durumuna bağlı kıldık ve okunan analog değeri 10 bit ile sayısal değere çevirdik ve bunu da çıkışa 8 bit olarak yansıttık. Bu sayede motorumuzun hızını potansiyometrenin değeri ile kontrol edebiliyoruz.
Devreyi kurarken motoru harici bir pil ya da adaptör ile sürmenizde fayda var yoksa motoru arduino üzerinden süremezsiniz. Kodlarımız ;
int potPin = A0;
int motorPin = 3;
int potDegeri = 0;
int motorDegeri = 0;
void setup() {
Serial.begin(9600);
}
void loop() {
potDegeri = analogRead(potPin);
motorDegeri = map(potDegeri, 0, 1023, 0, 255);
analogWrite(motorPin, motorDegeri);
Serial.print("Potansiyometre = " );
Serial.print(potDegeri);
Serial.print("\t motor = ");
Serial.println(motorDegeri);
delay(2);
}
Devreyi çalıştıtırken Seri Haberleşme Monitörüne bakmayı da ihmal etmeyin :).
Bu da devremizin son halinin resmi ve videosu.
PWM'den bahsetmeden önce gerekli olan malzemelerden bahsetmek istiyorum.
- 2N2222 Transistör
- 1N4001 Diyot
- 5K ya da 10K Pot
- DC Motor (9V'luk ya da daha küçük)
- 470 Ώ direnç
PWM en basit haliyle bir sinyal modülasyon tekniği olarak tanımlanabilir. Sinyal bilgisinin aktarım için uygun hale çevirilmesi amacının yanı sıra güç kontrolü sağlamak ve elektrik makineleri,güneş pili şarj üniteleri gibi özel devrelere destek olmak amacı da taşır.
Bu kontrol de tamamen anahtarlama ile sağlanır. Anahtarlama ne kadar hızlı yapılırsa, PWM ile aktarılan sinyalin gücü o kadar da artar. Örneğin bir lambaya gönderilen sinyalde PWM tekniğine ihtiyaç duyuluyorsa, bu teknik 120 Hz frekans değerinde uygulandığında maksimum verim elde edilebilir.
"Duty Cycle" yani görev döngüsü olarak tanımlanan bir kavram bulunuyor ve PWM tekniğinde de sıkça karşımıza çıkıyor. Görev döngüsü kavramı aslında yapılan işlemin periyodunu belirtiyor. Bu döngü düşük seviyelerde ise aktarılan güç düşük olurken, döngünün yüksek seviyelerinde yüksek güç aktarılıyor.
Basitçe soldaki Duty Cycle grafikleri ile PWM'i şu şekilde anlatabiliriz. 10 bitlik bir ADC ile analog değerimiz 0-255 arasında değer alır. Bu yeni dijital değer ile anahtar olarak kullanacağımız transistörün bazına bu sayısal değerler ile PWM uygularız. Sayı ne kadar büyük ise "Pulse Width" yani "Darbe Genişliği" o kadar büyük olur.
Bir pervaneyi elimizle çevirdiğimizi düşünelim. Ne kadar çok çevirip az dinlenirsek pervanemiz o kadar çok dönecektir. Çevirim kısmını 1,dinlenme kısmını da 0 olarak düşünürsek 1'ler ne kadar çoksa pervane de o kadar çok hızlı dönecektir. İşte bu 1'ler transistörümüzün bazına uyguladığımız PWM sinyalinin Darbe Genişliği demek oluyor.
DC MOTOR SÜRMEK
Edindiğimiz bilgiler ile DC Motor sürmek artık kolay. İhtiyacımız yüksek akım kapasiteli bir transistör, PWM üretecimiz ki biz bunu Arduino'muz ile yapacağız ve 1 motor ile diyot.
Soldaki devreyi Arduino'muz ile kuracağız.Transistörün 2N2222 veya muadili olmasına dikkat etmekte fayda var hakeza BC547 vs. gibi transistörler ile bu iş mümkün değil.Çünkü motoru döndüren güç akımdır ve yüksek akım geçiremeyen transistörler ile motor süremeyiz.
Direnç olarak 1k Ώ da kullanabilirsiniz fakat ben 470 Ώ kullandım, bu konuda sıkıntı yok.
Çok kısa da olsa kullanacağımız transistörden de bahsetmek istiyorum. Tüm transistörlerin C,B,E bacakları standart değildir. O yüzden devreyi tamamlerken sağdaki resme bir göz atmanızda fayda görüyorum. Ben ilk seferde transistörü ters taktım ne yazık ki :D ve transistör o kadar çok ısındı ki elimi yaktım. O yüzden dikkat !
ARDUINO ile DEVRE BAĞLANTISI
Arduino ile sadece motoru yavaşlatıp hızlandırmayacağız. Analog girişe taktığımız potansiyometre değerine göre motorumuzu süreceğiz ve bu işi en kısa yoldan yapmamızı sağlayan bir kod da öğrenmiş olacağız, map.
"map" komutu ile istediğimiz bir çıkış değerini, bağlı olan giriş değerine göre anında değiştirebiliriz.Örnek vermek gerekirse ki bu kodu motor sürme devremizde de kullandık;
motordegeri = map(potdegeri, 0, 1023, 0, 255);
Bu yukardaki kod ile "motordegeri" isimli değerimizi, potun durumuna bağlı kıldık ve okunan analog değeri 10 bit ile sayısal değere çevirdik ve bunu da çıkışa 8 bit olarak yansıttık. Bu sayede motorumuzun hızını potansiyometrenin değeri ile kontrol edebiliyoruz.
Devreyi kurarken motoru harici bir pil ya da adaptör ile sürmenizde fayda var yoksa motoru arduino üzerinden süremezsiniz. Kodlarımız ;
int potPin = A0;
int motorPin = 3;
int potDegeri = 0;
int motorDegeri = 0;
void setup() {
Serial.begin(9600);
}
void loop() {
potDegeri = analogRead(potPin);
motorDegeri = map(potDegeri, 0, 1023, 0, 255);
analogWrite(motorPin, motorDegeri);
Serial.print("Potansiyometre = " );
Serial.print(potDegeri);
Serial.print("\t motor = ");
Serial.println(motorDegeri);
delay(2);
}
Devreyi çalıştıtırken Seri Haberleşme Monitörüne bakmayı da ihmal etmeyin :).
Bu da devremizin son halinin resmi ve videosu.
15 Mart 2014 Cumartesi
Arduino - LM35 Sıcaklık Sensörü ve LCD ile Termometre Uygulaması

Bu yazımda geçen yazıda yaptığımız termometre uygulamasında kullandığımız seri haberleşme yerine LCD ekranı kullanarak yine aynı projeyi yaptım.
Bu projeyi PCB karta işlerken elbette seri haberleşme portu yerine portatif olan LCD'yi kullanmak durumunda kalırız. Bu yüzden LCD'yi de öğrenmek mühim. Zaten Seri Haberleşmeyi tam olarak öğrenebilirsek LCD'yi de kullanmak zor olmayacaktır.
Burda sadece LCD Ekran kullanımı ve LM35 Termometre projelerini birleştirdim ve aşağıdaki kodu koştum. LCD Bağlantılarını tekrar yazacağım uğraşmak istemeyenler için :).
LCD'nin
1 - VSS (Toprak)
2- +VDD
3- Potansiyometrenin Ortası
4- Arduino 7.pinine
5- Toprak
6- Arduino 8.pinine
11- Arduino 9.pinine
12- Arduino 10.pinine
13- Arduino 11.pinine
14- Ardunio 12.pinine
15- +VDD
16- Toprak
***Şemada 15. ve 16.pinlerin yerlerini ters yazmışım çok özür diliyorum. 15 VDD, 16 Toprağa bağlı olmalı. Potansiyometrenin
Sağ Bacak Toprak, Sol Bacak +VDD
Kodlarımız :
LiquidCrystal lcd(7, 8, 9, 10, 11, 12); //Arduino pinleri LCD için
float sicaklik; //Analog değeri dönüştüreceğimiz sıcaklık
float analoggerilim; //Ölçeceğimiz analog değer
void setup(){
lcd.begin(16,2);
}
void loop(){
lcd.clear();
lcd.setCursor(0,0); //komutu ile imleci istediğimiz karakter kutusunda konumlanmasını sağlıyoruz.İlk satırın 6.sütununa.
analoggerilim = analogRead(A1); //A1'den değeri ölç
analoggerilim = (analoggerilim/1023)*5000;//değeri mV'a dönüştr
sicaklik = analoggerilim /10,0; // mV'u sicakliğa dönüştür
lcd.print("Sicaklik Degeri"); // İmlecten itibaren bu yazı yazılacak
lcd.setCursor(0,1); // 1.satırın ilk sütunundayız
lcd.print(sicaklik); // Ardndan Bu değişken değer yazılacak
lcd.print(" Derece"); //Değer ardından da bu yazı yazılacak
lcd.setCursor(1,7); //Derece yazısının yeri (2.satır,7.sütun)
delay(1000); //Bu kısım LCD'lerin frekans çalışma aralığı yüzünden giriliyor.
}
Videomuz :
Etiketler:
ADC,
Analog,
Arduino,
Arduino Tutorial,
arduinotik,
Karadeniz Teknik Üniversitesi,
KTÜ,
LCD,
LM016,
LM35 Project,
MCU,
Microchip,
mikroişlemci,
Temperature Censor,
Termometer Project
24 Temmuz 2013 Çarşamba
Arduino - Analog Girişler (Voltmetre)
Hayatta herşeyin "1" ve "0" lardan oluşmadığından bahsetmiştik.Hayat analog değerlerle kaynıyor :D. Bu yazımda bunu daha iyi anlıcaz. Maksimum 5V'a kadar ölçüm yapabilen bir voltmetre yapıcaz.
Arduino analog girişleri 10bitliktir. 2^10= 1024 matematiksel hesabından, okunan her analog değer 1024 örneğe ayrılır.Bu ayrılan örneklere göre de okunma işlemi yapılır yani her değer 0-1023 değerleri ve bu değerler arasında ki en yakın tamsayı değerine atanır. Aslında daha önce bahsetmem gerekiyordu (Analog çıkışlarda) bu ADC olayından , geç kaldığım için özür dilerim.
Bizim analog gerilim değerimiz maksimum 5V olacak. Bu 5V'luk değer 0-1023 değerleri arasında atanacak. Bu, seri haberleşme portunu kullanıp değer okurken küçük bir matematiksel formüle ihtiyacımız olacağını gösteriyor bize.
Öncelikle potansiyometrenin bir ucu 5V'ta, bir ucu toprakta, orta ucu da A1 pininde olmak üzere şekildeki gibi devremizi bağlıyoruz.Analog girişi üzerinde Analog yazan pinlerden yapıyoruz.
void setup ()
{ Serial.begin(9600);} //9600 baud hızında seri haberleşme komutu
void loop () {
int analogdeger = analogRead(A1); //A1'den okunan analog değerleri atadık
float gerilim = analogdeger * (5.0 / 1023.0); // Bu kısmı aşağıda açıklıcam
Serial.println(gerilim); //Ekranda gerilim değerini gösteriyoruz.
delay(50); //2 ölçüm arasında geçen zaman dilimi (ms)
}
A1 pininden okunan değerler 0 ile 1023 arasında değişen değerler olacak. Temel Ölçme dersinde öğrendiğimiz analog ölçüm formülünü bu kısımda kullandık, kullandık ki seri haberleşme sayesinde ekrana yazdıracağımız değer volt biriminde olsun.
Gerilim = Okunan Skala Değeri x ( Maksimum Okunabilen Değer / Maksimum Skala )
Analog olarak değer okumak bizim için çok mühim olacak çünkü aklıma gelen örnek Helikopterler,Multikopterler vb. araçları kullanırken yapacağımız kumanda sistemlerinde kullanabiliriz bu analog değer okumayı.
Arduino analog girişleri 10bitliktir. 2^10= 1024 matematiksel hesabından, okunan her analog değer 1024 örneğe ayrılır.Bu ayrılan örneklere göre de okunma işlemi yapılır yani her değer 0-1023 değerleri ve bu değerler arasında ki en yakın tamsayı değerine atanır. Aslında daha önce bahsetmem gerekiyordu (Analog çıkışlarda) bu ADC olayından , geç kaldığım için özür dilerim.Bizim analog gerilim değerimiz maksimum 5V olacak. Bu 5V'luk değer 0-1023 değerleri arasında atanacak. Bu, seri haberleşme portunu kullanıp değer okurken küçük bir matematiksel formüle ihtiyacımız olacağını gösteriyor bize.
Öncelikle potansiyometrenin bir ucu 5V'ta, bir ucu toprakta, orta ucu da A1 pininde olmak üzere şekildeki gibi devremizi bağlıyoruz.Analog girişi üzerinde Analog yazan pinlerden yapıyoruz.
void setup ()
{ Serial.begin(9600);} //9600 baud hızında seri haberleşme komutu
void loop () {
int analogdeger = analogRead(A1); //A1'den okunan analog değerleri atadık
float gerilim = analogdeger * (5.0 / 1023.0); // Bu kısmı aşağıda açıklıcam
Serial.println(gerilim); //Ekranda gerilim değerini gösteriyoruz.
delay(50); //2 ölçüm arasında geçen zaman dilimi (ms)
}
A1 pininden okunan değerler 0 ile 1023 arasında değişen değerler olacak. Temel Ölçme dersinde öğrendiğimiz analog ölçüm formülünü bu kısımda kullandık, kullandık ki seri haberleşme sayesinde ekrana yazdıracağımız değer volt biriminde olsun.
Gerilim = Okunan Skala Değeri x ( Maksimum Okunabilen Değer / Maksimum Skala )
Analog olarak değer okumak bizim için çok mühim olacak çünkü aklıma gelen örnek Helikopterler,Multikopterler vb. araçları kullanırken yapacağımız kumanda sistemlerinde kullanabiliriz bu analog değer okumayı.
Kaydol:
Kayıtlar (Atom)











