Bu eğitimde FLEX sensörü, Arduino Uno ve bir Servo motor kullanarak bir devre geliştireceğiz. Bu proje, servo şaft konumunun FLEX sensörünün bükülmesi veya bükülmesi veya sapması ile belirlendiği bir servo kontrol sistemidir.
Önce servo motorlardan biraz bahsedelim. Servo Motorlar, doğru mil hareketine veya konumuna ihtiyaç duyulan yerlerde kullanılır. Bunlar yüksek hızlı uygulamalar için önerilmemektedir. Bunlar düşük hız, orta tork ve doğru konum uygulaması için önerilmiştir. Bu motorlar robotik kollu makinelerde, uçuş kontrollerinde ve kontrol sistemlerinde kullanılmaktadır. Servo motorlar, otomat makineleri vb. Gibi gömülü sistemlerde kullanılır.
Servo motorlar farklı şekil ve boyutlarda mevcuttur. Bir servo motorda esas olarak orada teller olacaktır, biri pozitif voltaj için, diğeri toprak içindir ve sonuncusu konum ayarı içindir. KIRMIZI kablo güce bağlanır, Siyah kablo toprağa bağlanır ve SARI tel sinyale bağlanır.
Servo motor, DC motor, konum kontrol sistemi ve dişlilerin bir kombinasyonudur. DC motor şaftının konumu, SIGNAL pinine PWM sinyalinin görev oranına bağlı olarak, servodaki kontrol elektroniği tarafından ayarlanır.
Basitçe söylemek gerekirse, kontrol elektroniği DC motoru kontrol ederek şaft konumunu ayarlar. Milin konumuna ilişkin bu veriler SİNYAL pimi aracılığıyla gönderilir. Kontrole konum verileri, servo motorun Sinyal pini aracılığıyla PWM sinyali şeklinde gönderilmelidir.
PWM (Darbe Genişliği Modülasyonlu) sinyalinin frekansı, servo motor tipine göre değişebilir. Burada önemli olan PWM sinyalinin GÖREV ORANI. Bu GÖREV ORANI baz alınarak kontrol elektroniği mili ayarlar. Milin saat 9'a hareket ettirilebilmesi için AÇMA ORANI 1/18 oranında olmalıdır. 18 ms'lik bir sinyalde 1 milisaniye 'AÇMA süresi' ve 17 milisaniye 'KAPAMA süresi.
Şaftın saat 12 ° 'ye taşınması için sinyalin AÇMA süresi 1.5ms ve KAPALI zaman 16.5ms olmalıdır. Bu oran servodaki kontrol sistemi ile deşifre edilir ve ona göre pozisyonu ayarlar.
Buradaki bu PWM, ARDUINO UNO kullanılarak oluşturulmuştur. Şimdilik Arduino Uno tarafından üretilen PWM sinyalinin görev oranını değiştirerek servo motor milini kontrol edebileceğimizi biliyoruz. UNO'nun, SERVO'nun konumunu PWM sinyalini etkilemeden sağlamamıza imkan veren özel bir işlevi vardır. Ancak, PWM görev oranı - servo konum ilişkisini bilmek önemlidir. Açıklamada bunun hakkında daha fazla konuşacağız.
Şimdi FLEX SENSOR'dan bahsedelim. Bir FLEX sensörünü ARDUINO UNO'ya bağlamak için, işi yapmak için 8 bit ADC (Analogdan Dijitale Dönüştürme) özelliğini kullanacağız. FLEX sensörü, şekli değiştiğinde direncini değiştiren bir dönüştürücüdür. Bir FLEX sensörü 2,2 inç uzunluğunda veya parmak uzunluğundadır. Şekilde gösterilmiştir.
Flex sensör, doğrusal yüzey büküldüğünde direncini değiştiren bir dönüştürücüdür. Dolayısıyla esnek sensör adı. Basitçe söylemek gerekirse, sensör terminal direnci büküldüğünde artar. Bu, aşağıdaki şekilde gösterilmiştir.
Direnişteki bu değişim, biz onları okuyamadığımız sürece bir işe yaramaz. Eldeki kontrolör sadece voltajdaki olasılıkları okuyabilir ve daha azını okuyamaz, bunun için voltaj bölücü devresi kullanacağız, bununla direnç değişimini voltaj değişimi olarak türetebiliriz.
Gerilim bölücü dirençli bir devredir ve şekilde gösterilmiştir. Bu dirençli ağda bir sabit direncimiz ve diğer değişken direncimiz var. Şekilde gösterildiği gibi, burada R1 sabit bir dirençtir ve R2, direnç görevi gören FLEX sensörüdür.
Dalın orta noktası ölçüme alınır. R2 değişikliği ile Vout'ta değişim yaşıyoruz. Yani bununla, ağırlıkla değişen bir voltajımız var.
Şimdi burada dikkat edilmesi gereken önemli nokta, kontrolör tarafından ADC dönüşümü için alınan girişin 50µAmp kadar düşük olmasıdır. Direnç bazlı voltaj bölücünün bu yükleme etkisi önemlidir, çünkü voltaj bölücünün Vout'undan çekilen akım, hata yüzdesi artışlarını arttırır, çünkü artık yükleme etkisi konusunda endişelenmemize gerek yoktur.
FLEX SENSÖR büküldüğünde direnci değişir. Bir voltaj bölücü devresine bağlanan bu dönüştürücü ile, dönüştürücü üzerindeki FLEX ile değişen bir voltajımız olacaktır. Bu değişken voltaj ADC kanallarından birine FED'dir, FLEX ile ilgili dijital bir değere sahip olacağız.
Bu dijital değeri servo pozisyon ile eşleştireceğiz, bununla esnek olarak servo kontrolüne sahip olacağız.
Bileşenler
Donanım: Arduino Uno , Güç kaynağı (5v), 1000 uF kapasitör, 100nF kapasitör (3 adet), 100KΩ direnç, SERVO MOTOR (SG 90), 220Ω direnç, FLEX sensörü.
Yazılım: Atmel studio 6.2 veya Aurdino her gece.
Devre Şeması ve Açıklama
FLEX sensör servo motor kontrolü için devre şemasıdır, şekil aşağıda gösterilmiştir.
Sensördeki voltaj tamamen doğrusal değildir; gürültülü olacak. Gürültüyü filtrelemek için, kondansatörler şekilde gösterildiği gibi bölücü devredeki her bir direnç boyunca yerleştirilir.
Burada bölücü tarafından sağlanan voltajı (ağırlığı doğrusal olarak temsil eden voltaj) alacağız ve onu Arduino UNO'nun ADC Kanallarından birine besleyeceğiz. Bunun için A0 kullanacağız. ADC'nin başlatılmasından sonra, sensördeki bükülmeyi temsil eden dijital değere sahip olacağız. Bu değeri alıp servo pozisyonu ile eşleştireceğiz.
Bunun gerçekleşmesi için programda birkaç talimat oluşturmamız gerekiyor ve bunlar hakkında aşağıda ayrıntılı olarak konuşacağız.
ARDUINO, şekilde gösterildiği gibi altı ADC kanalına sahiptir. Bunlardan herhangi biri veya tümü analog voltaj için giriş olarak kullanılabilir. UNO ADC 10 bit çözünürlüktedir (yani (0- (2 ^ 10) 1023) arasındaki tam sayı değerleri) Bu, 0 ile 5 volt arasındaki giriş voltajlarını 0 ile 1023 arasındaki tam sayı değerlerine eşleyeceği anlamına gelir. (5/1024 = 4.9mV) birim başına.
Burada UNO'nun A0'ını kullanacağız.
Birkaç şeyi bilmemiz gerekiyor.
|
Öncelikle UNO ADC kanallarının varsayılan referans değeri 5V'tur. Bu, herhangi bir giriş kanalında ADC dönüşümü için maksimum 5V giriş voltajı verebileceğimiz anlamına gelir. Bazı sensörler 0-2.5V arasında voltaj sağladığından, 5V referans ile daha az doğruluk elde ederiz, bu nedenle bu referans değerini değiştirmemizi sağlayan bir talimatımız var. Yani referans değerini değiştirmek için elimizde (“analogReference ();”) Şimdilik olarak bırakıyoruz.
Varsayılan olarak, 10 bit olan maksimum kart ADC çözünürlüğünü elde ederiz, bu çözünürlük komut kullanılarak değiştirilebilir ("analogReadResolution (bit);"). Bu çözünürlük değişikliği bazı durumlarda kullanışlı olabilir. Şimdilik olarak bırakıyoruz.
Şimdi yukarıdaki koşullar varsayılan olarak ayarlanmışsa, "analogRead (pin)" işlevini doğrudan çağırarak "0" kanalının ADC'sinden değeri okuyabiliriz; burada "pin", analog sinyali bağladığımız pini temsil eder, bu durumda "A0" olacaktır.
ADC'den gelen değer, “int SENSORVALUE = analogRead (A0) şeklinde bir tamsayı olarak alınabilir; ", Bu komutla ADC'den sonraki değer" SENSORVALUE "tamsayısında saklanır.
Şimdi SERVO'dan bahsedelim, UNO'nun sadece derece değeri vererek servo konumunu kontrol etmemizi sağlayan bir özelliği var. Diyelim ki servonun 30'da olmasını istiyorsak, değeri doğrudan programda temsil edebiliriz. SERVO başlık dosyası tüm görev oranı hesaplamalarını dahili olarak halleder.
#Dahil etmek
Servo servo; servo.attach (3); servo.write (derece); |
İlk ifade, SERVO MOTOR'u kontrol etmek için başlık dosyasını temsil eder.
İkinci ifade, servoyu adlandırmaktır; onu servo olarak bırakıyoruz.
Üçüncü ifade, servo sinyal pininin bağlandığı yeri belirtir; bu bir PWM pini olmalıdır. Burada PIN3 kullanıyoruz.
Dördüncü ifade, servo motorun konumlandırılması için komutlar verir ve derece cinsindendir. 30 verilirse servo motor 30 derece dönmektedir.
Artık sg90 0-180 dereceden hareket edebiliyor, 0-1024 ADC sonucumuz var.
Dolayısıyla ADC, SERVO POZİSYONUNUN yaklaşık altı katıdır. ADC sonucunu 6'ya bölerek yaklaşık SERVO eli konumunu elde edeceğiz.
Bununla birlikte, bükülme veya bükülme orantılı olan servo motora beslenen servo konum değerine sahip olacağız. Bu esnek sensör eldivene monte edildiğinde , el hareketiyle servo pozisyonunu kontrol edebiliriz.