arduino ile hall effect sensöründen gelen tetikleri ölçmek yardım

Başlatan lostromos, 23 Temmuz 2016, 02:36:55

lostromos

Merhaba arkadaşlar
Başlıktaki konuyu biraz açmak istiyorum. Aracımda ki hız sensöründen hız sinyalini alıp aracın hız bilgisini dijital olarak yansıtmak istiyorum. Sensörden aracın kadranına gelen kabloda kontak açıldğında sürekli 12.60 volt elektrik oluyor. Bir avometre bağlayıp aracın hızını artırdığımda voltaj doğrusal olarak düşüyor. Ancak araştırmalarım sonucunda sensörün hall effect olduğunu ve tetik vererek (low tetik) hızı bildirdiğini ve benim avometre de okuduğum voltaj değerinin ortalama değer olduğu kanısına vardım(eğer yanlışsam uyarın lütfen).

Bende arduino ile gerekli kodu yazıp yükledim. Hazırladığım donanımda (gerilim bölücüler ile) sensörden gelen 12 küsür voltu   lojik voltaja çevirip ve Yazdığım kodda   , arduino pinini low a çektiğinde(araç hızı arttığında verdiği low tetikler artıyor ) sayacı artırmasını sağlayan bir döngü bulunuyor.

Araç sensörü tekerleğin bir turunda 28-30 arası low tetik veriyor. Hazırladğım döngü ve datasheetleri kıyaslayarak bunu  teyit ettim. Ancak  araç hızı arttığında tetik sayısı arttığından yani frekans artmış olacakki arduino 1 saniyede en fazla 15 -18 tetik sayabiliyor. Halbuki 25km/h hızla giderken saniyede 12 tetik geliyorsa daha yüksek hızlarda daha fazla tetik gelmesi lazım ancak arduino bir yerden sonra tıkanıyor. Bu tetikleri ölçebileceğim özel bir arduino pini veya hazırlamam gereken donanım vs bişey varmıdır? Bu konuda yardımcı olursanız çok sevinirim.

fatal16

Tetikleri nasıl sayıyorsunuz bilmiyorum ama Kesme kullanırsanız kaçırmaması gerekir.

lostromos

Alıntı yapılan: fatal16 - 23 Temmuz 2016, 03:03:02
Tetikleri nasıl sayıyorsunuz bilmiyorum ama Kesme kullanırsanız kaçırmaması gerekir.

if şartı ile eğer pin low olursa sayacı arttır şeklinde oluşturdum.Her low olduğunda 1 artırıyor. Kesme daha hassas derseniz onu uygulayabilirim. Kesmeler hakkında bilgim yok ama araştırabilirim

fahri-

Harici kesme veya timerların harici girişlerinden gelen palsı sayarak çözüm bulabilirsiniz.

ByTEK

Bir ara bende aynı konuda çalışma yapmak istemiştim. İnternette bir kaç örnek bulup incelemiştim fakat yapıp deneme fırsatım olmamıştı. hazırladığım kod aşağıda belki fikir verir sizede.

#include <LiquidCrystal.h>


float lastik_taban = 15.5; //cm cinsi
float lastik_yanak = 0.7; // cm cinsi
int lastik_jant = 13; // inç cinsi

//((((155*70/100)*2)/10)+(13*2.54))*3.1415


float lastik_cevre = ((lastik_taban*lastik_yanak*2)+(lastik_jant*2.54))*3.1415;

int tur = 0;
float odometer = 0;
float miles = 0;
float kilometers = 0;
float speedometer = 0;
float MPH = 0;
float KPH = 0;
unsigned long reedTime = 0;
unsigned long reedTimeDelta = 0;
boolean reedOn = false;

const int reedPin = A1;

LiquidCrystal lcd(8, 9, 4, 5, 6, 7);

void setup() {
  // set up the LCD's number of columns and rows:
  lcd.begin(16, 2);
  // Print a message to the LCD.
  lcd.setCursor(0,0);
  lcd.print("HIZ DENEME");
  delay(1000);
  lcd.clear();
  
   lcd.setCursor(0, 0); 
    lcd.print("L: ");
    lcd.print(lastik_taban);
    lcd.print(" ");
    lcd.print(lastik_yanak);
    lcd.print(" ");
    lcd.print(lastik_jant);
   lcd.setCursor(0, 2); 
   lcd.print("C: "); 
   lcd.print(lastik_cevre);
   delay(1000);
   lcd.clear();

}

void loop() {
 sensor_oku();
 hizi_yaz();
 mesafe_yaz();
}


void sensor_oku(){
  int r = digitalRead(reedPin);
  if(r == 1 && reedOn == false){
    reedOn = true;
    reedTimeDelta = millis() - reedTime;
    reedTime = millis();
    tur++;
  }
  else 
  if (r == 0 && reedOn){
    reedOn = false;
  }
}

void hizi_yaz(){
    speedometer = lastik_cevre/reedTimeDelta;

    KPH = speedometer * 36;
    lcd.setCursor(1, 0); 
    lcd.print("Km/s: ");
    lcd.setCursor(7, 0);
    lcd.print(KPH, 2);
}


void mesafe_yaz(){
  odometer = lastik_cevre*tur;
    kilometers = odometer / 100000;
    lcd.setCursor(1, 1); 
    lcd.print("KM: ");
    lcd.setCursor(5, 1);
    lcd.print(kilometers, 2); 
}

lostromos

Alıntı yapılan: fahri- - 23 Temmuz 2016, 09:52:20
Harici kesme veya timerların harici girişlerinden gelen palsı sayarak çözüm bulabilirsiniz.

Fahri bey harici kesme kullanirsam herhangi bir pindeki yazdigim analogread veya digitalread komutlarina gore daha hassas calisirmi. Herhangi bir delay koymama ragmen saniyede en fazla 14 tetik yakalayabiliyor.

mesaj birleştirme:: 23 Temmuz 2016, 12:17:03

Alıntı yapılan: SercanTEK - 23 Temmuz 2016, 11:59:56
Bir ara bende aynı konuda çalışma yapmak istemiştim. İnternette bir kaç örnek bulup incelemiştim fakat yapıp deneme fırsatım olmamıştı. hazırladığım kod aşağıda belki fikir verir sizede.

#include <LiquidCrystal.h>


float lastik_taban = 15.5; //cm cinsi
float lastik_yanak = 0.7; // cm cinsi
int lastik_jant = 13; // inç cinsi

//((((155*70/100)*2)/10)+(13*2.54))*3.1415


float lastik_cevre = ((lastik_taban*lastik_yanak*2)+(lastik_jant*2.54))*3.1415;

int tur = 0;
float odometer = 0;
float miles = 0;
float kilometers = 0;
float speedometer = 0;
float MPH = 0;
float KPH = 0;
unsigned long reedTime = 0;
unsigned long reedTimeDelta = 0;
boolean reedOn = false;

const int reedPin = A1;

LiquidCrystal lcd(8, 9, 4, 5, 6, 7);

void setup() {
  // set up the LCD's number of columns and rows:
  lcd.begin(16, 2);
  // Print a message to the LCD.
  lcd.setCursor(0,0);
  lcd.print("HIZ DENEME");
  delay(1000);
  lcd.clear();
  
   lcd.setCursor(0, 0); 
    lcd.print("L: ");
    lcd.print(lastik_taban);
    lcd.print(" ");
    lcd.print(lastik_yanak);
    lcd.print(" ");
    lcd.print(lastik_jant);
   lcd.setCursor(0, 2); 
   lcd.print("C: "); 
   lcd.print(lastik_cevre);
   delay(1000);
   lcd.clear();

}

void loop() {
 sensor_oku();
 hizi_yaz();
 mesafe_yaz();
}


void sensor_oku(){
  int r = digitalRead(reedPin);
  if(r == 1 && reedOn == false){
    reedOn = true;
    reedTimeDelta = millis() - reedTime;
    reedTime = millis();
    tur++;
  }
  else 
  if (r == 0 && reedOn){
    reedOn = false;
  }
}

void hizi_yaz(){
    speedometer = lastik_cevre/reedTimeDelta;

    KPH = speedometer * 36;
    lcd.setCursor(1, 0); 
    lcd.print("Km/s: ");
    lcd.setCursor(7, 0);
    lcd.print(KPH, 2);
}


void mesafe_yaz(){
  odometer = lastik_cevre*tur;
    kilometers = odometer / 100000;
    lcd.setCursor(1, 1); 
    lcd.print("KM: ");
    lcd.setCursor(5, 1);
    lcd.print(kilometers, 2); 
}


Tesekkur ederim düzenleyerek deneyecegm

ByTEK

Hocam Sonucu yazarsanız sevinirim. Benim deneme fırsatım olmadı. Birde lastik ebatlarını mutlaka kendi aracınıza göre uyarlayın. Aksi halde hatalı sonuç alırsınız.

Gidilen yol ve hız hakkındaki formül aşağıdaki gibi:

lastik_cevre = ((lastik_taban*lastik_yanak*2)+(lastik_jant*2.54))*3.1415;

HIZ :     

     speedometer = lastik_cevre/reedTimeDelta;
     KPH = speedometer * 36;

Mesafe :

    odometer = lastik_cevre*tur;
    kilometers = odometer / 100000;




lostromos

Alıntı yapılan: SercanTEK - 23 Temmuz 2016, 12:19:44
Hocam Sonucu yazarsanız sevinirim. Benim deneme fırsatım olmadı. Birde lastik ebatlarını mutlaka kendi aracınıza göre uyarlayın. Aksi halde hatalı sonuç alırsınız.

Gidilen yol ve hız hakkındaki formül aşağıdaki gibi:

lastik_cevre = ((lastik_taban*lastik_yanak*2)+(lastik_jant*2.54))*3.1415;

HIZ :     

     speedometer = lastik_cevre/reedTimeDelta;
     KPH = speedometer * 36;

Mesafe :

    odometer = lastik_cevre*tur;
    kilometers = odometer / 100000;

sercan bey gerekli düzeltmeleri yaptım ama sizin kodu çalıştıramadm ama biraz uğraşsam olacaktı sanırım. Bnde tekrardan araca geçerek kendi kodumla pulse ları ölçmeye çalıştım. O kadr değişken değerler varki 2 saate yakın araçla gezdim. İlk pulse geldikten sonra ile 2. pulse arası mesafeyi ölçüyorum(aracın katettiği mesafe) kiminde 10m kiminde 7 hatta bir ara 1m bile oldu. Bnde ilk pulse aldıktan sonra km sayacını sıfırladım ve tam 1000. metrede 126 adet  pulse aldım. Tekrar teste soktum bu seferde 500. metrede 65 adet pulse aldım. Oranlarsam sonuçlar birbirine yakın. Kodları buna göre şekillendireceğim artık.

ByTEK

Tamamdır Hocam Ben fırsat bulunca deneyeceğim inşallah. sizde eğer gelişme olursa kodları ve açıklamaları paylaşırsanız sevinirim.

lostromos

Alıntı yapılan: SercanTEK - 23 Temmuz 2016, 22:43:15
Tamamdır Hocam Ben fırsat bulunca deneyeceğim inşallah. sizde eğer gelişme olursa kodları ve açıklamaları paylaşırsanız sevinirim.

tabiki sercan bey, yalnız kodları sorunsuz çalışır ve açık hale getirdikten sonra buradan paylaşırım

fahri-

@lostromos
Kullandığın osc frekansına göre saniyede 1000 tetik bile yakalayabilirsin. Eğer pulsların temizse.