
Arduino ile pulse jeneratörü yapmak oldukça basit ve eğlenceli bir projedir. Pulse jeneratörü, belirli bir frekans ve süre boyunca elektriksel sinyaller üreten bir devredir. Bu tür devreler, sayısız uygulamada kullanılabilir, örneğin servo motor kontrolü, sinyal analizi ve daha fazlası. Aşağıda, Arduino Uno kullanarak bir pulse jeneratörü yapmak için basit bir örnek sağlanmıştır.
Malzemeler:
1. Arduino Uno
2. Breadboard
3. Jumper kablolar
4. 1 kΩ direnç
5. LED (isteğe bağlı)
Adımlar:
1. Arduino ve breadboard'un güç ve toprak hatlarını bağlayın. Arduino'nun 5V pinini breadboard'un güç yoluna, GND pinini de breadboard'un toprak yoluna bağlayın.
2. LED'i breadboard'a yerleştirin (isteğe bağlı). LED'in anotunu (uzun bacak) bir dirençle bağlayarak Arduino'nun 9 numaralı dijital pinine bağlayın. LED'in katotunu (kısa bacak) ise breadboard'un toprak yoluna bağlayın.
3. Arduino IDE'yi açın ve aşağıdaki kodu yazın:
```cpp
const int pulsePin = 9; // Pulse sinyalini göndereceğimiz pin
void setup() {
pinMode(pulsePin, OUTPUT); // Pin'i çıkış olarak ayarlıyoruz
}
void loop() {
int pulseDuration = 1000; // Pulse süresi (microsaniye)
int pulsePeriod = 2000; // Pulse periyodu (microsaniye)
digitalWrite(pulsePin, HIGH); // Pin'i yüksek seviyeye çıkarıyoruz
delayMicroseconds(pulseDuration); // Pulse süresi kadar bekliyoruz
digitalWrite(pulsePin, LOW); // Pin'i düşük seviyeye çıkarıyoruz
delayMicroseconds(pulsePeriod - pulseDuration); // Pulse periyodunun geri kalanını bekliyoruz
}
```
4. Kodu Arduino'ya yükleyin ve devrenin çalıştığını gözlemleyin. İsteğe bağlı olarak eklenen LED, pulse sinyalinin görsel bir göstergesi olarak kullanılabilir.
Bu örnek, temel bir pulse jeneratörü sağlar. Pulse süresi ve periyodunu değiştirerek, farklı frekans ve genliklere sahip sinyaller elde edebilirsiniz. Bu devreyi daha karmaşık uygulamalarla entegre etmek için, dökümantasyonu ve örnek kodları inceleyerek Arduino'nun farklı özelliklerinden faydalanabilirsiniz.
Daha karmaşık ve esnek bir pulse jeneratörü yapmak isterseniz, Arduino'nun dahili zamanlayıcılarını kullanarak daha hassas zamanlama ve daha geniş bir frekans aralığı elde edebilirsiniz. Aşağıda, Arduino Uno'nun Timer1'i kullanarak bir pulse jeneratörü örneği sağlanmıştır.
```cpp
#include <avr/io.h>
#include <avr/interrupt.h>
const int pulsePin = 9; // Pulse sinyalini göndereceğimiz pin
// Pulse süresi ve periyodu (microsaniye)
unsigned long pulseDuration = 1000;
unsigned long pulsePeriod = 2000;
void setup() {
pinMode(pulsePin, OUTPUT); // Pin'i çıkış olarak ayarlıyoruz
setupTimer1(); // Timer1'i ayarlıyoruz
}
void loop() {
// İsteğe bağlı olarak burada pulseDuration ve pulsePeriod değerlerini değiştirebilirsiniz
}
void setupTimer1() {
noInterrupts(); // Kesmeleri devre dışı bırakıyoruz
// Timer1'i CTC (Clear Timer on Compare) modunda çalıştırıyoruz
TCCR1A = 0;
TCCR1B = (1 << WGM12);
// Timer1'de kesmeleri etkinleştiriyoruz
TIMSK1 |= (1 << OCIE1A);
// Timer1'in önceden ayarlanmış değeri (OCR1A) ile karşılaştırılacağı değeri hesaplıyoruz
OCR1A = (F_CPU / 1000000) * pulseDuration - 1;
// Timer1'i 1 MHz'de çalıştıran önceden ayarlanmış değeri ayarlıyoruz
TCCR1B |= (1 << CS11);
interrupts(); // Kesmeleri tekrar etkinleştiriyoruz
}
ISR(TIMER1_COMPA_vect) { // Timer1 kesme işleyicisi
static bool pulseState = false;
static unsigned long pulseCounter = 0;
if (pulseState) {
digitalWrite(pulsePin, LOW);
OCR1A = (F_CPU / 1000000) * (pulsePeriod - pulseDuration) - 1;
pulseState = false;
} else {
digitalWrite(pulsePin, HIGH);
OCR1A = (F_CPU / 1000000) * pulseDuration - 1;
pulseState = true;
}
pulseCounter++;
}
```
Bu örnek, Timer1'i kullanarak daha hassas zamanlama sağlar ve geniş bir frekans aralığında pulse sinyalleri üretir. Bu kodu kullanarak, `pulseDuration` ve `pulsePeriod` değerlerini istediğiniz gibi değiştirebilir ve farklı uygulamalar için uygun sinyaller üretebilirsiniz.
Ayrıca, birden fazla pulse jeneratörü oluşturmak veya daha fazla özelleştirme seçeneği eklemek gibi daha karmaşık uygulamalar geliştirebilirsiniz. Bu projenin daha da geliştirilmesi, kullanıcı girişi veya harici bileşenler (örn. potansiyometreler, düğmeler, LCD ekranlar vb.) ekleyerek daha kullanıcı dostu ve esnek hale getirilebilir.
Aşağıda, bir potansiyometre ve bir düğme kullanarak pulse süresi ve periyodunu ayarlamak için genişletilmiş bir örnek sunuyoruz.
Malzemeler:
1. Arduino Uno
2. Breadboard
3. Jumper kablolar
4. 1 kΩ direnç
5. LED
6. 10 kΩ potansiyometre
7. Push button (düğme)
8. 10 kΩ pull-up direnç (düğme için)
Kablolama:
1. Potansiyometrenin bir uç bacağını 5V'a, diğer uç bacağını GND'ye bağlayın. Ortadaki bacak ise Arduino'nun A0 pinine bağlayın.
2. Düğmenin bir bacağını GND'ye bağlayın ve diğer bacağını Arduino'nun 2 numaralı dijital pinine bağlayın. Aynı düğme bacağına 10 kΩ pull-up direnç ekleyin ve bu direncin diğer ucunu 5V'a bağlayın.
Kod:
```cpp
#include <avr/io.h>
#include <avr/interrupt.h>
const int pulsePin = 9;
const int potPin = A0;
const int buttonPin = 2;
unsigned long pulseDuration = 1000;
unsigned long pulsePeriod = 2000;
void setup() {
pinMode(pulsePin, OUTPUT);
pinMode(potPin, INPUT);
pinMode(buttonPin, INPUT);
attachInterrupt(digitalPinToInterrupt(buttonPin), updatePulseParameters, FALLING);
setupTimer1();
}
void loop() {
// Ana döngüde işlem yapmaya gerek yok
}
void setupTimer1() {
noInterrupts();
TCCR1A = 0;
TCCR1B = (1 << WGM12);
TIMSK1 |= (1 << OCIE1A);
OCR1A = (F_CPU / 1000000) * pulseDuration - 1;
TCCR1B |= (1 << CS11);
interrupts();
}
ISR(TIMER1_COMPA_vect) {
static bool pulseState = false;
static unsigned long pulseCounter = 0;
if (pulseState) {
digitalWrite(pulsePin, LOW);
OCR1A = (F_CPU / 1000000) * (pulsePeriod - pulseDuration) - 1;
pulseState = false;
} else {
digitalWrite(pulsePin, HIGH);
OCR1A = (F_CPU / 1000000) * pulseDuration - 1;
pulseState = true;
}
pulseCounter++;
}
void updatePulseParameters() {
int potValue = analogRead(potPin);
pulseDuration = map(potValue, 0, 1023, 100, 1900);
pulsePeriod = map(potValue, 0, 1023, 200, 2000);
}
```
Bu örnek, kullanıcının potansiyometre ve düğme kullanarak pulse süresi ve periyodu ayarlamasına olanak tanır. Düğmeye basarak `updatePulseParameters` fonksiyonunu çağırarak yeni değerleri güncelleyebilirsiniz. Bu, pulse süresi ve periyodu için daha geniş bir aralık sunarak devrenin daha esnek ve kullanıcı dostu hale gelmesini sağlar.
Daha da karmaşık projeler için, birden fazla potansiyometre ve düğme ekleyerek farklı parametreleri ayarlamaya olanak sağlayabilirsiniz. Ayrıca, bir LCD ekran kullanarak mevcut ayarları gösterebilir ve kullanıcıya daha fazla geri bildirim sağlayabilirsiniz.
Özetle, Arduino ile pulse jeneratörü yapmak, geniş bir uygulama yelpazesine uyarlanabilecek basit ve esnek bir projedir. İleri düzeyde özelleştirme ve özellikler ekleyerek projeyi daha kullanışlı hale getirebilir ve farklı senaryolara uyarlayabilirsiniz.