(http://www.1resimyukle.com/images/2015/01/30/0.png)
Merhaba. ISIS'te çizdiğim gibi devresi.
Amaç: Haberleşme koparsa led sürekli sönük kalacak.
Arduino'da hangi komutu kullanacağımı bilmiyorum. Bende CCS C kullanarak yaptım.
ALICI:
boolean KONTROL=0;
void setup() {
pinMode(9, INPUT);
pinMode(3, OUTPUT);
}
void loop(){
if(getch()=='V'){
if(getch()=='E'){
if(getch()=='L'){
if(getch()=='I'){
if(KONTROL==0){
digitalWrite(3, HIGH);
}
else{
KONTROL=1;
digitalWrite(3, LOW);
}
}
}
}
}
}
VERİCİ:
void setup() {
pinMode(9, OUTPUT);
}
void loop(){
putc('V');
putc('E');
putc('L');
putc('I');
}
<VirtualWire.h> veya <SoftwareSerial.h> kütüphaneleri kullanarak mı yapacağım. Nasıl yapabilirim? Yardım edin.
1-wire diye aramalısın. Bunun en basit örneği DS18B20 ve ibutton (namı değer akbil) uygulamalarıdır. 2 arduino için de kullanabilirsin.
GND hatlarını da birleştirmen gerekir. 1 wire olayında gnd haricinde 1 kablo olduğunu tanımlar.
Tek yönlü haberleşme yapacaksan UART haberleşmesini de kullanabilirsin. 0. ve 1. bacaklar.
Örneğin UART ile ilgili örnek Arduino programın örnekleri içinde var. Türkçe karakter kullanma sıkıntı yapar. sadece bu seri port aynı zamanda programlama icin kullanılır.
uart için verici örneği koyuyorum gerisin sen tamamla.
void setup() {
// put your setup code here, to run once:
Serial.begin(9600);
}
void loop() {
// put your main code here, to run repeatedly:
Serial.print("VELI");
}
uart modülü ile de one wire (tek data hattı ile çift yönlü iletişim) yapabilirsin.
ambar7 hocam dediğinizi yaptım fakat RX veya TX bir kabloyu çıkartırsam haberleşme duruyor.
#include <SoftwareSerial.h>
SoftwareSerial Haberlesme(11, 10); // RX, TX
char deger;
void setup(){
Serial.begin(9600);
Haberlesme.begin(9600);
}
void loop(){
if (Haberlesme.available()>0){
deger = Haberlesme.read();
Serial.print(deger);
}
}
mesaj birleştirme:: 30 Ocak 2015, 23:22:26
Verici kısmıda böyleydi;
#include <SoftwareSerial.h>
SoftwareSerial Haberlesme(11, 10); // RX, TX
void setup(){
Haberlesme.begin(9600);
}
void loop(){
Haberlesme.write("V");
Haberlesme.write("E");
Haberlesme.write("L");
Haberlesme.write("I");
}
Kablo fark etmiyorsa, orasını bilmem (GND hattının birbirine bağlı olduğunu varsayıyorum). Yalnız benim söylediğim doğrudan UART modülün olduğu yer.0 ve.1 bacaklar. donanım UART.
Alıntı yapılan: ambar7 - 30 Ocak 2015, 09:33:21
Kablo fark etmiyorsa, orasını bilmem (GND hattının birbirine bağlı olduğunu varsayıyorum). Yalnız benim söylediğim doğrudan UART modülün olduğu yer.0 ve.1 bacaklar. donanım UART.
Denedim aynı olmadı. İki kablo bağlı olmadığı sürece duruyor.
UART'ta olsa SPI'da olsa 1-Wire da olsa referans değerin anlaşılması (siz bunu devrenin tamamlanması için olarak da düşünebilirsiniz. )için her zaman GND veya VCC bağlantısından en az birinin olması gereklidir. Genelde GND tercih edilir. Söylemeye gerek olmadığını düşünmüştüm.
Alıcı:
void setup() {
// put your setup code here, to run once:
Serial.begin(9600);
pinMode(3,OUTPUT); //3 nolu bacak üzerindeki LED
digitalWrite(3,LOW);
}
void loop() {
digitalWrite(3,LOW);
// put your main code here, to run repeatedly:
while (Serial.available() > 0) {
if (Serial.read() == 'A') {
digitalWrite(3,HIGH);
delay(100);
}
}
}
verici:
void setup() {
// put your setup code here, to run once:
Serial.begin(9600);
}
void loop() {
// put your main code here, to run repeatedly:
Serial.print("A");
}
bu sistem bu şekilde çalışıyor. sadece delay bölümünü ayarlama gerekiyor.
1. arduino 2.arduino
RX---------------------TX
GND-------------------GND
Evet oluyor fakat Tek Kablo kullanmam gerekiyor. IR Alıcı Vericilerini inceleyeceğim.
mesaj birleştirme:: 30 Ocak 2015, 11:01:43
Alıntı yapılan: muhendisbey - 30 Ocak 2015, 10:09:32
UART'ta olsa SPI'da olsa 1-Wire da olsa referans değerin anlaşılması (siz bunu devrenin tamamlanması için olarak da düşünebilirsiniz. )için her zaman GND veya VCC bağlantısından en az birinin olması gereklidir. Genelde GND tercih edilir. Söylemeye gerek olmadığını düşünmüştüm.
Ah evet doğru. O zaman optikuplör ile yapsaydık nasıl yapardık ?
Tek kablo ile iletişim yapabileceğin tek olay radyo frekansı sistemleridir. Yoksa her halükarda 2 kablo gerekir ki biri GND'dir.
İllede tek kablo üzerinden iletişim diyorsan fiberoptik sistemleri deneyebilirsin.
(http://www.1resimyukle.com/images/2015/01/30/015.png)
Peki böyle olur mu?
mesaj birleştirme:: 30 Ocak 2015, 11:21:15
Hocam birde şunu sorayım bu kodun anlamı ne " (Serial.available() > 0) "
Bu optokupler elemanı iki tel ile çalıştığından ve ayrılamadığından neticede iki kart arasında yine iki tel kullanılmış oluyor.
(Serial.available() > 0) komutu, seri portta bir data olup olmadığını kontrol etmek içindir, data varsa değerin sıfırdan büyük demektir, bu durumda olan değer okunur. Data yoksa okuma yapmanın da anlamı olmaz.
@veliusta aslında istediğin şey parazitik beslemeli 1-wire. 2 arduino arasında kurabilir misin, kurarsan verim alabilir misin açıkçası hiç denemedim.
1 wire hattına pull up direnci bağlıyorsun (1k~10k) ve bu yöntemle haberleşiyorsun. 18B20 sensörünün bir özelliğiydi bu.
Vericiden bir pininden high gondersen diger tatafta bir pinde baksan high mi diye degilse islem yapsan olmaz mi ?
Fiberoptik ile yaptım Veri gönderiyor.
Sadece 'V' harfini kullanınca sorun yok ama 4 Harf göndermeli yapamadım.
(http://www.1resimyukle.com/images/2015/01/31/67.png)
gören de C de ilk defa program yazdığınızı sanır.
Yaptığın kurduğun mantıkta sıkıntı var. diyorsun V geldi ise E geldi ise vs... vs...
Programın işleme hızı veri gelme hızından daha yüksektir. Ya while ile yapacaksın , ama o zaman yanlış veri gelirse kilitlenir. Yada bayrak kullanacaksın.
örneğin
int bayrak = 0;
void setup() {
// put your setup code here, to run once:
Serial.begin(9600);
//ön ayarlar
}
void loop() {
byte gelen_deger;
// put your main code here, to run repeatedly:
while (Serial.available() > 0) {
gelen_deger = Serial.read();
if (gelen_deger == 'V') {
bayrak = 1;
}
if (gelen_deger == 'E' && bayrak == 1) {
bayrak = 2;
}
if (gelen_deger == 'L' && bayrak == 2) {
bayrak = 3;
}
if (gelen_deger == 'I' && bayrak == 3) {
bayrak = 0;
//burada ne yapacaksan
}
}
}
Programınız hatalı. Tek göndermek ve okumak yerine toplu şekilde "veli" gönderin "veli" olarak okuyun.
Arduino'daki find until komutunu kullan. Böylece daha mantıklı okuma yaparsın. Cümlende "veli" kelimesi geçtiği anda sistem tetiklenir.
Yani cümle "asdasdasdveliasdasd" olsun. Buradan "veli" yi doğrudan bulur.
Olmadı.
#include <SoftwareSerial.h>
SoftwareSerial Haberlesme(11, 10); // RX, TX
int bayrak = 0;
char gelen_deger;
void setup(){
Haberlesme.begin(9600);
Serial.begin(9600);
pinMode(13, OUTPUT);
digitalWrite(13, LOW);
}
void loop(){
while (Haberlesme.available() > 0) {
gelen_deger = Haberlesme.read();
if (gelen_deger == 'V') {
bayrak = 1;
}
if (gelen_deger == 'E' && bayrak == 1){
bayrak = 2;
}
if (gelen_deger == 'L' && bayrak == 2){
bayrak = 3;
}
if (gelen_deger == 'I' && bayrak == 3){
bayrak = 0;
digitalWrite(13, HIGH);
}
}
}
Kabloluda yaptım olmuyor.Kablo bağlı programlamasını yapıyorum. LED yanmıyor. İletişim kablosunu takıp çıkarıp takıp çıkarıktan sonra rayına otuyor.
Ben daha önce CCS de yapmıştım. Bide orada deneyim.
if (Serial.available()) {
while(Serial.findUntil("veli", "\r\n")){
while(Serial.available() == 0) ;
digitalWrite(13, HIGH);
}
yukarıdaki kodu dene.
(http://www.1resimyukle.com/images/2015/01/31/945.png)
CSS de aynı sorun. Buton'a 1 veya 2 kez basmak gerekiyor iletişim sağlanması için.
@muhendisbey hocam şimdi senin dediğini bi deneyim.
Olmaz ise IR Haberleşme kütüphanesi ile yapacağım o da olmaz ise Mors halfebesi ile haberleşeceğim artık :)
Seri haberleşme kullanmışsın ama a0,a1 yapmışsın hata yok mu orada ?
Verici bölümünde karakter göndermeler arasına 5-10ms bir gecikme ekleyip deneme imkanın var mı?
(http://www.1resimyukle.com/images/2015/02/01/e.png)
Oldu hocam Teşekkürler. Fiberoptik ile denedim. Sorunsuz çalışıyor. Yaptığım mantık doğrumudur?
Sağolun.
evet.
Yaptığın mantık hatalı. Kodlardan veli'yi okumak için bu kadar işlem yapmana gerek yok.
Serial.println("VELI") veya Serial.print("VELI\r\n") ile gönderme yapabilirsin.
Alırken de daha önceki mesajımda dediğim gibi find.until komutuyla doğrudan "VELI" diye okursun.
kodunda fazladan bayrak değişkeni var
AND işlemi var
Bekleme işlemi var. Daha ne olsun.