İçindekiler:

Arduino Tabanlı Darbe İndüksiyon Dedektörü - Flip Coil: 5 Adım (Resimli)
Arduino Tabanlı Darbe İndüksiyon Dedektörü - Flip Coil: 5 Adım (Resimli)

Video: Arduino Tabanlı Darbe İndüksiyon Dedektörü - Flip Coil: 5 Adım (Resimli)

Video: Arduino Tabanlı Darbe İndüksiyon Dedektörü - Flip Coil: 5 Adım (Resimli)
Video: 5 Santrifüj Pompa Sistemleri 2024, Temmuz
Anonim
Arduino Tabanlı Darbe İndüksiyon Dedektörü - Flip Coil
Arduino Tabanlı Darbe İndüksiyon Dedektörü - Flip Coil
Arduino Tabanlı Darbe İndüksiyon Dedektörü - Flip Coil
Arduino Tabanlı Darbe İndüksiyon Dedektörü - Flip Coil

Fikir

Geçmişte değişen sonuçlarla bazı metal dedektörleri inşa ettikten sonra, Arduino'nun bu yöndeki yeteneklerini keşfetmek istedim.

Arduino ile metal dedektörlerinin nasıl oluşturulacağına dair bazı iyi örnekler var, bazıları burada talimat olarak. Ancak bunlara bakıldığında, normalde ya analog sinyal işleme için oldukça fazla harici bileşenlere ihtiyaç duyarlar ya da hassasiyet oldukça düşüktür.

Metal dedektörlerini düşünürken ana konu, arama bobini ile ilgili sinyallerdeki küçük voltaj değişimlerinin nasıl algılanacağıdır. Bu değişiklikler normalde çok küçüktür. En belirgin yaklaşım, ATmega328'in analog girişlerini kullanmak olacaktır. Ancak spesifikasyonlara bakıldığında iki temel sorun var: (genellikle) yavaşlar ve çözünürlük (çoğu durumda) düşük.

Öte yandan, Arduino 16MHz'de çalışıyor ve oldukça fazla zamanlama yeteneğine sahip i. e. saat hızı kullanılıyorsa 0.0625µS çözünürlük. Bu nedenle, algılama için analog girişi kullanmak yerine, voltajdaki küçük dinamik değişiklikleri algılamanın en basit yolu, sabit bir referans voltajda zaman içinde voltaj düşüşündeki değişikliği karşılaştırmaktır.

Bu amaçla ATmega328, D6 ve D7 arasında dahili bir karşılaştırıcının zarif özelliğine sahiptir. Bu karşılaştırıcı, bir kesintiyi tetikleyerek hassas olay işlemeyi mümkün kılar. Millis() ve micos() gibi düzgün bir şekilde kodlanmış zamanlama rutinlerini bir kenara bırakarak ve ATmega328'in dahili zamanlayıcısına çok daha yüksek çözünürlükle giren Arduino, metal algılama yaklaşımları için harika bir temel oluşturur.

Bu nedenle, bir kaynak kodu görünümünden, girişlerin polaritesindeki "değişim" için dahili karşılaştırıcıyı programlamak ve değişikliklerin zamanlamasındaki değişiklik için mümkün olan en yüksek hızda dahili bir sayaç kullanmak iyi bir başlangıç olacaktır.

Bunu elde etmek için Arduido'daki genel kod:

// Gerekli tüm ön değişkenlerin tanımlanması vb. ve kayıtların ayarlanması

imzasız karakter saatiSelectBits = _BV(CS10); // ön ölçek yok, tam xtal void kurulumu() { pinMode(6, INPUT); // karşılaştırıcının + - onları INPUT olarak ayarlayarak, // yüksek empedanslı pinMode(7, INPUT); // - karşılaştırıcının - onları GİRİŞ olarak ayarlayarak, // yüksek empedansa ayarlanırlar cli(); // kesintileri durdur TCCR1A = 0; // tüm TCCR1A kaydını 0'a ayarla TCCR1B = 0; // TCCR1B için aynı -> normal modTCNT1 = 0; //sayaç değerini 0 olarak başlat; TCCR1B |= saatSelectBits; // ön ölçekleyiciyi ayarlar ve saati başlatır TIMSK1 = _BV(TOIE1); // zamanlayıcı taşma kesmesini ayarlar enable bit sei(); //kesmelere izin ver ACSR = (0 << ACD) | // Analog Karşılaştırıcı: Etkin (0 << ACBG) | // Analog Karşılaştırıcı Bant Aralığı Seçimi: Pozitif girişe AIN0 uygulanır (0 << ACO) | // Analog Karşılaştırıcı Çıkışı: Kapalı (1 << ACI) | // Analog Karşılaştırıcı Kesme İşareti: Bekleyen Kesintiyi Temizle (1 << ACIE) | // Analog Karşılaştırıcı Kesintisi: Etkin (0 << ACIC) | // Analog Karşılaştırıcı Giriş Yakalama: Devre Dışı (0 << ACIS1 | 0 << ACIS0 // çıkış geçişinde kesinti // (0 << ACIS1 | 1 << ACIS0 // ayrılmış // (1 << ACIS1 | 0 <<) ACIS0 // düşen çıkış kenarında kesinti // (1 << ACIS1 | 1 << ACIS0 // yükselen giriş kenarında kesinti; }

// bu rutin, karşılaştırıcı her kesme oluşturduğunda çağrılır

ISR(ANALOG_COMP_vect) { oldSREG=SREG; kli(); zaman Damgası=TCNT1; SREG = eskiSREG; }

// bu rutin, dahili sayaçta her taşma olduğunda çağrılır

ISR(TIMER1_OVF_vect){ timer1_overflow_count++; }

// bu rutin, zamanlayıcıyı 0'a sıfırlamak için kullanılır

void resetTimer(void){ oldSREG = SREG; kli(); // Kesintileri devre dışı bırak TCNT1 = 0; //sayaç değerini 0'a sıfırla SREG = oldSREG; // Durum kaydını geri yükle TCCR1B |= clockSelectBits; // ön ölçekleyiciyi ayarlar ve saati başlatır timer1_overflow_count=0; // taşma sayacını sıfırlar }

Tabii ki bu fikir tamamen yeni değil. Bu kodun ana kısmı başka bir yerde bulunabilir. TPIMD - Tiny Pulse Induction Metal Detector ana sayfasında bulunan bir mikro denetleyici için iyi bir uygulama.

www.miymd.com/index.php/projects/tpimd/ (maalesef bu sayfa artık çevrimiçi değil, şu anda www.basic4mcu.com adresinde sitenin bir yedeği var, "TPIMD" arayın).

Adım 1: Arduino Darbe İndüksiyon Fikri - Flip Bobin

Arduino Darbe İndüksiyon Fikir - Flip Coil
Arduino Darbe İndüksiyon Fikir - Flip Coil
Arduino Darbe İndüksiyon Fikir - Flip Coil
Arduino Darbe İndüksiyon Fikir - Flip Coil

Buradaki fikir, Arduino'yu TPIMD'de olduğu gibi bir Darbe İndüksiyon dedektörü olarak kullanmaktır, çünkü çürüme eğrisinin zamanlama fikri oldukça iyi çalışıyor gibi görünüyor. Darbe İndüksiyon dedektörleriyle ilgili sorun, normalde çalışmak için farklı voltaja ihtiyaç duymalarıdır. Bobine güç sağlamak için bir voltaj ve bozulma eğrisi ile başa çıkmak için ayrı bir voltaj. Bu iki voltaj kaynağı, darbe indüksiyon dedektörlerini her zaman biraz karmaşık hale getirir.

Bir PI dedektöründeki bobinin voltajına bakıldığında, ortaya çıkan eğri iki farklı aşamaya ayrılabilir. İlk aşama, bobine güç veren ve manyetik alanı oluşturan darbenin kendisidir (1). İkinci aşama, bir voltaj tepe noktası ile başlayan ve daha sonra bobinin (2) "güçsüz" voltajına hızla ayarlanan voltaj düşüş eğrisidir. Sorun şu ki, bobin darbeden sonra polaritesini değiştirir. Darbe pozitif mi (ekteki resimde Var 1.) bozulma eğrisi negatif. Nabız negatifse, bozulma eğrisi pozitif olacaktır (ekteki resimde Var 2.)

Bu temel sorunu çözmek için, darbeden sonra bobinin elektronik olarak "ters çevrilmesi" gerekir. Bu durumda darbe pozitif olabilir ve bozulma eğrisi de pozitif olabilir.

Bunu başarmak için, darbeden sonra bobin Vcc ve GND'den izole edilmelidir. Bu anda sadece bir sönümleme direncinden geçen bir akım vardır. Bu izole edilmiş bobin ve sönümleme direnci sistemi, herhangi bir referans voltajına "yönlendirilebilir". Bu, teorik olarak birleşik pozitif eğriyi yaratacaktır (çizimin alt kısmı)

Bu pozitif eğri, daha sonra, düşüş voltajının bir referans voltajı "geçtiği" zaman noktasını tespit etmek için karşılaştırıcı aracılığıyla kullanılabilir. Bobinin yakınında hazine olması durumunda, bozunma eğrisi değişir ve referans voltajını geçen zaman noktası değişir. Bu değişiklik daha sonra tespit edilebilir.

Bazı denemelerden sonra aşağıdaki devrenin çalıştığı kanıtlandı.

Devre bir Arduino Nano modülünden oluşmaktadır. Bu modül, bobini (SV3'te) D10 aracılığıyla besleyen iki MOSFET transistörünü çalıştırır. D10'daki darbe sona erdiğinde, her iki MOSFET de bobini 12V ve GND'den izole eder. Bobinde tasarruf edilen enerji R2 (220 Ohm) üzerinden dışarı akar. Aynı zamanda R1 (560 Ohm) bobinin eski pozitif tarafını GND'ye bağlar. Bu, R5'teki (330 Ohm) negatif bozulma eğrisini pozitif bir eğriye değiştirir. Diyotlar Arduino'nun giriş pinini korur.

R7, yaklaşık 0.04V'de bir voltaj bölücüdür. D7'deki azalma eğrisi D6'daki 0.04'ten daha negatif olduğu anda bir kesme tetiklenir ve darbenin bitiminden sonraki süre kaydedilir.

Bobine yakın metal olması durumunda, bozulma eğrisi daha uzun sürer ve darbenin sonu ile kesinti arasındaki süre uzar.

2. Adım: Dedektörü Oluşturma (Breadboard)

Dedektörü Oluşturma (Breadboard)
Dedektörü Oluşturma (Breadboard)
Dedektörü Oluşturma (Breadboard)
Dedektörü Oluşturma (Breadboard)
Dedektörü Oluşturma (Breadboard)
Dedektörü Oluşturma (Breadboard)

Dedektörü kurmak oldukça kolaydır. Bu, bir devre tahtasında (orijinal devreye yapışarak) veya parçaları bir PCB'ye lehimleyerek yapılabilir.

Arduino Nano kartındaki D13 LED, metal için bir gösterge olarak kullanılır.

Breadboard'u devre dışı bırakmak, çalışan dedektöre giden en hızlı yoldur. Oldukça fazla kablolamaya ihtiyaç var, yine de bu küçük bir devre tahtasında yapılabilir. Resimlerde bu, Arduino ve MOSFET'ler bazı kabloları gizlediği için 3 adımda gösterilmektedir. Test ederken, ilk başta fark etmeden diyotları bir şekilde ayırdım. Bunun dedektörün davranışı üzerinde olumsuz bir etkisi olmamıştır. Devrenin PCB versiyonunda onları tamamen dışarıda bıraktım.

0.96 OLED ekranın bağlantıları resimlerde gösterilmemiştir. Bu ekran bağlı:

Vcc – 5V (Arduino pininde, besleme voltajında değil!!!)

GND – GND

SCL – A5

SDA - A4

Bu OLED Ekran, dedektörü başlangıçta kalibre etmek için gereklidir. Bu, Arduino'nun PIN6'sında doğru voltajı ayarlayarak yapılır. Bu voltaj 0,04V civarında olmalıdır. Ekran, doğru voltajın ayarlanmasına yardımcı olur.

Breadboard sürümü oldukça iyi çalışıyor, ancak muhtemelen vahşi doğaya girmek için uygun değil.

Adım 3: PCB'ye Gitmek

PCB'ye Gitmek
PCB'ye Gitmek
PCB'ye Gitmek
PCB'ye Gitmek
PCB'ye Gitmek
PCB'ye Gitmek
PCB'ye Gitmek
PCB'ye Gitmek

Lehimlemeye gelince, çift taraflı yüksek teknolojili PCB'yi gerçekten sevmiyorum, bu yüzden devreyi bir taraflı PCB'ye uyacak şekilde değiştirdim.

Aşağıdaki değişiklikler yapıldı:

1. diyotlar dışarıda bırakıldı.

2. MOSFET'lerin kapıları 10 Ohm'luk bir dirence sahip

3. D6'daki gerilim bölücünün besleme gerilimi, D8'deki YÜKSEK seviye sinyali ile verilir

4. MOSFET'lerin sürücü pini değiştirildi.

Bu şekilde, evrensel PCB'lere lehimlenebilen tek taraflı bir PCB oluşturulabilir. Bu devreyi kullanarak, yalnızca 8-10 harici bileşene sahip çalışan bir PI dedektörünüz olacaktır (OLED ekran ve/veya hoparlör kullanılmasına bağlı olarak).

Adım 4: Dedektörü Ayarlama ve Kullanma

Dedektörü Ayarlama ve Kullanma
Dedektörü Ayarlama ve Kullanma
Dedektörü Ayarlama ve Kullanma
Dedektörü Ayarlama ve Kullanma
Dedektörü Ayarlama ve Kullanma
Dedektörü Ayarlama ve Kullanma

Dedektör düzgün bir şekilde oluşturulmuşsa ve program Arduino'ya yazılmışsa, üniteyi kurmanın en kolay (tek değilse) yolu bir OLED ekran kullanmaktır. Ekran 5V, GND, A4, A5'e bağlı. Ünite açıldıktan sonra ekranda “kalibre ediliyor” yazısı görünmelidir. Birkaç saniye sonra "kalibrasyon tamamlandı" demeli ve ekranda üç sayı gösterilmelidir.

İlk sayı, kalibrasyon sırasında tanımlanan "referans değeridir". İkinci değer, son ölçülen değerdir ve üçüncü değer, son 32 ölçümün ortalama değeridir.

Bu üç değer aşağı yukarı aynı olmalıdır (1000'in altındaki test durumlarımda). Orta değer az çok kararlı olmalıdır.

İlk kurulumu başlatmak için bobinin yakınında metal olmamalıdır.

Şimdi voltaj bölücü (trim potansiyometresi) trim edilmelidir, böylece düşük iki değer maksimuma ayarlanmalı ve yine de stabil okuma yapılmalıdır. Orta değerin tuhaf okumalar vermeye başladığı kritik bir ayar var. Tekrar kararlı değerler elde etmek için düzelticiyi geri çevirin.

Ekranın donması olabilir. Sadece sıfırlama düğmesine basın ve baştan başlayın.

Kurulumum için (bobin: 20cm'de 18 dönüş) sabit değer 630-650 civarında. Ayarlandıktan sonra sıfırlama düğmesine basın, ünite yeniden kalibre edilir ve tüm ağaç değerleri tekrar aynı aralıkta olmalıdır. Şimdi metal bobine getirilirse, Arduino-Board (D13) üzerindeki LED yanmalıdır. Ekli bir hoparlör bazı tıklama sesleri verir (buradaki programlamada iyileştirme için biraz yer vardır).

Yüksek beklentileri önlemek için:

Dedektör bazı şeyleri algılar, ancak çok basit ve sınırlı bir dedektör olarak kalır.

Yetenekler hakkında bir izlenim vermek için, farklı diğer dedektörlerle bazı referans tespitleri yaptı. Sonuçlara bakıldığında, sadece 8 harici parçaya sahip ancak profesyonel dedektörlerle eşleşmeyen bir dedektör için hala oldukça etkileyici.

Devreye ve programa bakıldığında, iyileştirme için çok yer var. Dirençlerin değerleri tecrübe ile bulundu, 250ms darbe süresi rastgele seçildi, bobin parametreleri de. İyileştirmeler için fikirleriniz varsa, bunları tartışmaktan çok mutlu olurum.

İyi eğlenceler!

Adım 5: Güncelleme1: 16x2 LCD kullanma

Güncelleme1: 16x2 LCD kullanma
Güncelleme1: 16x2 LCD kullanma
Güncelleme1: 16x2 LCD kullanma
Güncelleme1: 16x2 LCD kullanma
Güncelleme1: 16x2 LCD kullanma
Güncelleme1: 16x2 LCD kullanma

İyileştirmeler

Daha ileri testler sırasında I2C OLED Ekran kitaplığının önemli ölçüde zaman harcadığını fark ettim. Bunun yerine I2C dönüştürücülü 16x2 ekran kullanmaya karar verdim.

Bu yüzden programı bazı faydalı özellikler ekleyerek LCD ekrana uyarladım. Ekranın ilk satırı artık olası bir göstergenin sinyal gücünü gösterir. İkinci satır şimdi iki değeri gösterir. Yumruk, kalibrasyon değerine kıyasla mevcut sinyal sapmasını gösterdi. Bu değer "0" olmalıdır. Bu değer sürekli negatif veya pozitif ise reset butonuna basılarak dedektör yeniden kalibre edilmelidir. Pozitif değerler, bobine yakın metali gösterir.

İkinci değer, bozunma eğrisinin gerçek gecikme değerini gösterir. Bu değer normalde o kadar ilginç değildir, ancak dedektörün ilk kurulumu için gereklidir.

Program artık bir dizide birden fazla darbe süresine izin veriyor (deneme/performansı iyileştirme araçları). Herhangi bir kırılma elde etmedim. Bu nedenle varsayılan, bir darbe süresine ayarlanmıştır.

Dedektörün İlk Kurulumu

Dedektörü kurarken, ikinci satırın ikinci değeri önemlidir (birincisi göz ardı edilebilir). Başlangıçta değer "kararsız" olabilir (resme bakın). Değer sabit bir okuma elde edene kadar trim direncini çevirin. Ardından değeri maksimum sabit değere yükseltmek için çevirin. Yeniden kalibre etmek için sıfırlama düğmesine basın ve dedektör kullanıma hazırdır.

Maksimum kararlı değeri ayarlayarak, demir dışı metaller için hassasiyeti kaybettiğim izlenimini edindim. Bu nedenle, demir olmayan şeyler için iyi bir duyarlılığa sahip olmak için ayarları biraz denemeye değer olabilir.

bobinler

Daha fazla test için 3 bobin yapıyorum

1 -> 18 dönüş @ 200mm

2 -> 100 mm'de 25 dönüş

3 -> 48 dönüş @ 100mm

İlginç bir şekilde, tüm bobinler oldukça iyi çalıştı, neredeyse aynı performansla (havada 40-50 mm'de 20 ct madeni para). Bu oldukça öznel bir gözlem olabilir.

Önerilen: