Bu projede radyo
frekanslar (RF) kullanarak iki devrenin haberleşmesini sağlayacağız. Bu
haberleşme için iki devremiz olacak; alıcı ve verici devreleri. Verici devremiz
RF ile komutlar gönderecek, alıcı devremiz aldığı komutları işleyecektir. Biz
bu veri işlemeyi DC motor hız kontrolü için yapacağız.
Verici devremizi
bilgisayar ile kontrol edeceğiz. Yani seri haberleşme ile bilgisayardan verici
devremize motorun hızı ve dönme yönü için veriler göndereceğiz. Verici devremiz
aldığı bu verileri RF sinyal olarak alıcı devremize iletecektir. Alıcı devremiz
ise aldığı bu sinyalleri çözümleyip, elde ettiği verilere göre motoru
döndürecektir.
1.
Proje
Devresi:
2.
Projede
Kullanılacak Elemanlar:
a. Arduino
Uno
b. 434
MHz RF Alıcı – Verici
c. L293D
Motor Sürücü Entegre
d. DC
Motor
2.1.434
MHz RF Alıcı – Verici:
RF haberleşmeyi
sağlayacak elemanlardır. Verici üzerinde 3 adet pin bulunmaktadır (VCC, GND,
Data). Verici 3 – 12 V gerilimle çalışmaktadır. Vericinin gerilimi artırıldıkça
haberleşme mesafesi de artacaktır. Alıcı ise 5V gerilimle çalışmaktadır. Alıcı
üzerinde 4 adet pin bulunur (VCC, GND, Data, Data). Alıcıda bulunan iki data
pini de birbirinin aynıdır, aynı veri gelmektedir.
2.2.L293D
Motor Sürücü Entegresi
Motoru çalıştırmak için
kullanacağımız entegredir. Arduino motor için yeteri kadar amper akım üretemez.
Bundan dolayı motora, daha yüksek akım sağlamak için bu entegreyi kullanacağız
ve entegreyi harici bir kaynak ile destekleyeceğiz.
Entegre iki motoru aynı
anda sürebilmek için tasarlanmış bir entegredir. Biz bu projemizde tek bir
motor süreceğimiz için entegrenin Input1, Input2, Output1, Output2 ve Enable1
pinlerini kullanacağız, Input3, Input4, Output3, Output4 ve Enable2 pinlerini
kullanmayacağız.
3.
RF
Haberleşme:
RF iletişim teknolojisi
elektromanyetik dalgalar yoluyla gerçekleşmektedir. Bu dalgalar belirli bir
frekans bandı aralığında iletim sağlamaktadır. Radyo dalgaları
10 kHz ile 3000 GHz frekans aralığını kapsamaktadır. RF haberleşme yöntemi,
araçlarda merkezi kilit sistemleri, ev otomasyon sistemleri, güvelik sistemleri
ve garaj kapıları vb. gibi daha çok basit uygulamalarda yaygın olarak kullanılmaktadır.
Basit uygulamalar için kullanılan 433 MHz ve 860 MHz frekans bandında çalışan
kablosuz haberleşme sistemleri lisans gerektirmemektedir. Geniş bant kablosuz
iletişim sağlayan sistemler 2.4 – 2.8 GHz frekans bölgesinde çalışmaktadır. [Kaynak: GU J Sci Part C,
2(1):181-188 (2014)/ Seyfettin VADİ, Naki GÜLER, Ramazan BAYINDIR]
4.
Projenin
Kaynak Kodu:
Arduino kodlarını derlemeden önce VirtualWire kütüphanesini programa import etmemiz gerekmektedir. Bunun için önce VirtualWire kütüphanesini indirmeliyiz (Dosyayı indirmek için tıklayınız). Daha sonra Arduino programında Sketch > Import Library > Add Library yolunu izlemeliyiz.
Arduino kodlarını derlemeden önce VirtualWire kütüphanesini programa import etmemiz gerekmektedir. Bunun için önce VirtualWire kütüphanesini indirmeliyiz (Dosyayı indirmek için tıklayınız). Daha sonra Arduino programında Sketch > Import Library > Add Library yolunu izlemeliyiz.
4.1.Verici
Devresinin Arduino Kodu:
#include <VirtualWire.h>
int gelenVeri;
char *msg;
void setup()
{
Serial.begin(9600);
vw_set_tx_pin(12);
vw_setup(2000);
}
void loop()
{
gelenVeri=Serial.read();
if(gelenVeri=='0')
{
msg =
"0";
vw_send((uint8_t *)msg, strlen(msg));
}
else
if(gelenVeri=='1')
{
msg =
"1";
vw_send((uint8_t *)msg, strlen(msg));
}
else
if(gelenVeri=='2')
{
msg =
"2";
vw_send((uint8_t *)msg, strlen(msg));
}
else
if(gelenVeri=='3')
{
msg =
"3";
vw_send((uint8_t *)msg, strlen(msg));
}
else
if(gelenVeri=='4')
{
msg =
"4";
vw_send((uint8_t *)msg, strlen(msg));
}
else
if(gelenVeri=='5')
{
msg =
"5";
vw_send((uint8_t *)msg, strlen(msg));
}
else
if(gelenVeri=='6')
{
msg =
"6";
vw_send((uint8_t *)msg, strlen(msg));
}
else
if(gelenVeri=='7')
{
msg =
"7";
vw_send((uint8_t *)msg, strlen(msg));
}
else
if(gelenVeri=='8')
{
msg =
"8";
vw_send((uint8_t *)msg, strlen(msg));
}
else
if(gelenVeri=='9')
{
msg =
"9";
vw_send((uint8_t *)msg, strlen(msg));
}
else
if(gelenVeri=='*')
{
msg =
"*";
vw_send((uint8_t *)msg, strlen(msg));
}
}
4.2.Alıcı
Devresinin Arduino Kodu:
#include <VirtualWire.h>
char message;
int I1=6;
int I2=9;
int E=5;
void setup()
{
Serial.begin(9600);
vw_setup(2000);
vw_rx_start();
pinMode(I1,
OUTPUT);
pinMode(I2,
OUTPUT);
pinMode(E,
OUTPUT);
pinMode(13,
OUTPUT);
}
void loop()
{
vw_set_rx_pin(2);
uint8_t
buf[VW_MAX_MESSAGE_LEN];
uint8_t
buflen = VW_MAX_MESSAGE_LEN;
if
(vw_get_message(buf, &buflen))
{
message=buf[0];
Serial.println(message);
Serial.println(*buf);
if(message=='0')
{
digitalWrite(I1, HIGH);
digitalWrite(I2, LOW);
analogWrite(E, 100);
}
if(message=='1')
{
digitalWrite(I1, HIGH);
digitalWrite(I2, LOW);
analogWrite(E, 130);
}
if(message=='2')
{
digitalWrite(I1,
HIGH);
digitalWrite(I2, LOW);
analogWrite(E, 160);
}
if(message=='3')
{
digitalWrite(I1, HIGH);
digitalWrite(I2, LOW);
analogWrite(E, 190);
}
if(message=='4')
{
digitalWrite(I1, HIGH);
digitalWrite(I2, LOW);
analogWrite(E, 225);
}
if(message=='5')
{
digitalWrite(I1, LOW);
digitalWrite(I2, HIGH);
analogWrite(E, 100);
}
if(message=='6')
{
digitalWrite(I1, LOW);
digitalWrite(I2, HIGH);
analogWrite(E, 130);
}
if(message=='7')
{
digitalWrite(I1, LOW);
digitalWrite(I2, HIGH);
analogWrite(E, 160);
}
if(message=='8')
{
digitalWrite(I1, LOW);
digitalWrite(I2, HIGH);
analogWrite(E, 190);
}
if(message=='9')
{
digitalWrite(I1, LOW);
digitalWrite(I2, HIGH);
analogWrite(E, 225);
}
if(message=='*')
{
digitalWrite(I1, LOW);
digitalWrite(I2, LOW);
analogWrite(E, 0);
}
}
}
NOT:
Alıcı devresinin kodlarında gelen veriyi arduinonun serial monitor’üne
yazdırmak için de komutlar kullanılmıştır. Bunun amacı gelen veriyi görebilmek
içindir.
5.
C#
Uygulaması:
5.1.Programın
tasarımı:
Forma
ekleyeceğimiz nesneler yukarıda resimde görülmektedir.
5.2.Programın
Kodu:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
namespace DCMotor_RFKontrol
{
public partial class Form1 : Form
{
int hiz=0;
int durdurKlik=0;
int yonSayi;
string yon;
public Form1()
{
InitializeComponent();
}
private void Form1_Load(object sender, EventArgs e)
{
PozitifDondur.Enabled = false;
NegatifDondur.Enabled = false;
HizArtir.Enabled = false;
HizAzalt.Enabled = false;
Durdur.Enabled = false;
}
private void Baglan_Click(object sender, EventArgs e)
{
try
{
serialPort1.PortName =
textBox1.Text;
serialPort1.BaudRate = 9600;
serialPort1.Open();
if (serialPort1.IsOpen)
{
PozitifDondur.Enabled = true;
NegatifDondur.Enabled = true;
label6.Text = "Porta
Bağlanıldı";
groupBox1.Enabled = false;
}
}
catch
{
label6.Text = "Porta
Bağlanılamadı";
}
}
private void PozitifDondur_Click(object sender, EventArgs e)
{
yon = "+";
yonSayi = 0;
serialPort1.WriteLine(Convert.ToString(hiz+yonSayi));
HizArtir.Enabled = true;
HizAzalt.Enabled = true;
Durdur.Enabled = true;
NegatifDondur.Enabled = false;
PozitifDondur.Enabled = false;
durum();
}
private void HizArtir_Click(object sender, EventArgs e)
{
if (hiz < 4)
{
hiz++;
}
serialPort1.WriteLine(Convert.ToString(hiz+yonSayi));
durum();
}
private void HizAzalt_Click(object sender, EventArgs e)
{
if (hiz > 0)
{
hiz--;
}
serialPort1.WriteLine(Convert.ToString(hiz+yonSayi));
durum();
}
private void NegatifDondur_Click(object sender, EventArgs e)
{
yon = "-";
yonSayi = 5;
serialPort1.WriteLine(Convert.ToString(hiz+yonSayi));
HizArtir.Enabled = true;
HizAzalt.Enabled = true;
Durdur.Enabled = true;
PozitifDondur.Enabled = false;
NegatifDondur.Enabled = false;
durum();
}
private void Durdur_Click(object sender, EventArgs e)
{
serialPort1.Write("*");
durdurKlik = 1;
durum();
}
private void Form1_FormClosing(object sender, FormClosingEventArgs e)
{
if (serialPort1.IsOpen)
{
serialPort1.Write("*");
serialPort1.Close();
}
}
void durum()
{
if (yon == "+")
{
label3.Text = "Motor Pozitif
Yönde Dönüyor";
}
if (yon == "-")
{
label3.Text = "Motor Negatif
Yönde Dönüyor";
}
label4.Text = Convert.ToString(hiz+1) + "x";
if (hiz == 4)
HizArtir.Enabled = false;
else if (hiz != 4)
HizArtir.Enabled = true;
if (hiz == 0)
HizAzalt.Enabled = false;
else if (hiz !=0)
HizAzalt.Enabled = true;
if (durdurKlik == 1)
{
hiz = 0;
PozitifDondur.Enabled
= true;
NegatifDondur.Enabled = true;
HizArtir.Enabled = false;
HizAzalt.Enabled = false;
Durdur.Enabled = false;
label3.Text = "";
label4.Text = "";
durdurKlik = 0;
}
}
}
}
Merhabalar acaba denendimi bu ? Bende çalışmadı da
YanıtlaSilblogdaki projelerin tamamı denenmiş, çalıştırılmış projelerdir. sizde çalışmaması başka nedenlerden dolayı olabilir.
Silmerhabalar ben bu kodla kablosuz potlu karaşimşek yaptım çalıştı. ama bu kodla drone motorlarını kontrol etmek istiyorum 16 tane falan mesajla yaptım olmadı maksimum kaç mesaj ile kod çalışabilir?
YanıtlaSilmerhabalar ben bu kodla kablosuz potlu karaşimşek yaptım çalıştı. ama bu kodla drone motorlarını kontrol etmek istiyorum 16 tane falan mesajla yaptım olmadı maksimum kaç mesaj ile kod çalışabilir?
YanıtlaSilveri boyutu 1byte'ı aşmadığı sürece sorunsuz çalışması gerekir. siz nasıl bir sorun yaşıyorsunuz?
Sildeneme amaçlı 2 ledin parlaklığını artırıp azaltmak istiyorum önce ledlerden biri tam parlak yanıyor sonra kafasına göre ya sönüyo ya sönmüyo kod:
YanıtlaSil#include
//YOLLAYICI
char *msg;
int joy;
int pot;
void setup()
{
pinMode(A1,INPUT);
pinMode(A0,INPUT);
vw_set_tx_pin(12);
vw_setup(2000);
}
void loop()
{
joy=analogRead(A1);
joy=map(joy,0,1023,0,5);
pot=analogRead(A0);
pot=map(pot,0,1023,0,4);
if(pot==0)
{
msg = "0";
vw_send((uint8_t *)msg, strlen(msg));
}
else if(pot==1&&joy==0)
{
msg = "1";
vw_send((uint8_t *)msg, strlen(msg));
}
else if(pot==1&&joy==1)
{
msg = "2";
vw_send((uint8_t *)msg, strlen(msg));
}
else if(pot==1&&joy==2)
{
msg = "3";
vw_send((uint8_t *)msg, strlen(msg));
}
else if(pot==1&&joy==3)
{
msg = "4";
vw_send((uint8_t *)msg, strlen(msg));
}
else if(pot==1&&joy==4)
{
msg = "5";
vw_send((uint8_t *)msg, strlen(msg));
}
else if(pot==2&&joy==0)
{
msg = "6";
vw_send((uint8_t *)msg, strlen(msg));
}
else if(pot==2&&joy==1)
{
msg = "7";
vw_send((uint8_t *)msg, strlen(msg));
}
else if(pot==2&&joy==2)
{
msg = "8";
vw_send((uint8_t *)msg, strlen(msg));
}
else if(pot==2&&joy==3)
{
msg = "9";
vw_send((uint8_t *)msg, strlen(msg));
}
}
#include
//ALICI
char message;
void setup()
{
vw_setup(2000);
vw_rx_start();
pinMode(11, OUTPUT);
pinMode(9, OUTPUT);
}
void loop()
{
vw_set_rx_pin(2);
uint8_t buf[VW_MAX_MESSAGE_LEN];
uint8_t buflen = VW_MAX_MESSAGE_LEN;
if (vw_get_message(buf, &buflen))
{
message = buf[0];
if (message == '0')
{
analogWrite(11, 0);
analogWrite(9, 0);
}
else if (message == '1')
{
analogWrite(11, 255);
analogWrite(9, 64);
}
else if (message == '2')
{
analogWrite(11, 191);
analogWrite(9, 64);
}
else if (message == '3')
{
analogWrite(11, 64);
analogWrite(9, 64);
}
else if (message == '4')
{
analogWrite(11, 64);
analogWrite(9, 191);
}
else if (message == '5')
{
analogWrite(11, 64);
analogWrite(9, 255);
}
else if (message == '6')
{
analogWrite(11, 255);
analogWrite(9, 127);
}
else if (message == '7')
{
analogWrite(11, 191);
analogWrite(9, 127);
}
else if (message == '8')
{
analogWrite(11, 127);
analogWrite(9, 127);
}
else if (message == '9')
{
analogWrite(11, 127);
analogWrite(9, 191);
}
}
}
sorunun neden kaynaklandığını bulamadım. kodlarda bir sorun yok gibi görülüyor.
Sil