İçindekiler:
2025 Yazar: John Day | [email protected]. Son düzenleme: 2025-01-13 06:58
İş yerimden oldukça fazla sayıda atılmış döner optik kodlayıcı edindikten sonra sonunda onlarla eğlenceli/faydalı bir şeyler yapmaya karar verdim.
Yakın zamanda evim için yeni bir 3D yazıcı satın aldım ve onu 3D tarayıcıdan daha iyi ne tamamlayabilir! Bu proje aynı zamanda gerekli parçaları üretmek için 3D yazıcımı kullanmam için bana mükemmel bir fırsat sağladı.
Gereçler
Optik kodlayıcılar ve ilgili optik sensörler
Arduino UNO'su
isteğe bağlı prototipleme kalkanı
çelik çubuk raylar
3D yazıcıya erişim
Adım 1: Optik Kodlayıcılar
Size mm başına nispeten yüksek sayıda 'tıklama' sağladığı sürece, bu proje için hemen hemen her döner kodlayıcı kullanılabilir. Açıkçası, farklı kodlayıcılar uygun bir montaj çözümü gerektirecektir.
Fotosensörlerin kablo şemasının izini sürmek için bir süreklilik ölçer kullandım.
2. Adım: 3D Basılı Parçalar
Bu parçalar, döner kodlayıcıları barındırır ve ray için bir kızak sağlar. Tek kodlayıcı muhafazasının arkasında çapraz rayların monte edilmesi için iki delik vardır. Çift kodlayıcı muhafazası, dik açılarda birbirine kaynaşmış iki tekli muhafazadır.
Bu montaj parçalarını fusion360 üzerinde benim yaptığım kodlayıcı ve raylara uyacak şekilde tasarladım, kodlayıcının şaftında paslanmaz çelik şaftı daha iyi kavramasına yardımcı olmak için kısa bir sapan kauçuk kılıf parçası var.
Şaftın serbestçe kaymasını ve dikey olarak tutulduğunda mahfazadan düşmesini istiyorsunuz, ancak enkoderin kaymaması için yeterli basınç uygulamalıdır. Benim için işe yarayan şey, şaftın sürgüsünün enkoder şaftı ile 0,5 mm örtüşmesine izin vermekti. Sapan kauçuğu, bu miktarda deforme olacak kadar yumuşaktır ve iyi çekiş sağlar.
Adım 3: Kablo Şeması
Devre çok basit. Opto-sensörler, IR yayıcı diyotlar için bir miktar akım, foto diyotlar için bir topraklama ve çekme dirençleri gerektirir.
Seri yayıcı diyotlar için 5mA'ya karar verdim, bu özel kodlayıcıda diyotlar arasındaki voltaj düşüşü 3.65V. Arduino'dan direnç için 1,35V bırakan 5V'luk bir besleme kullanıyorum, 5mA'da bu 270 ohm olarak çıkıyor.
Foto diyotlar sadece küçük bir akım çekebildiğinden, pull-up'lar için 10k ohm seçildi, basma düğmesi için de 10k ohm kullanıldı. Zaten toprağa bağlı olan prototip kartında kullanım için bir düğme var, sadece bir çekme direnci sağlayın ve istenen giriş pinine bağlayın.
Adım 4: Arduino Kodu
İşlemi hemen belli olmayabileceğinden kodun küçük bir açıklamaya ihtiyacı var, ancak 3 kodlayıcıyı yeterince hızlı bir şekilde işleyebilmek için bu şekilde optimize edilmesi gerekiyordu.
İlk olarak, enkoder pozisyonunda bir değişiklik olmuşsa yön verilerini işlemek istiyoruz.
değişiklikler = yeni_değer ^ saklanan değer;
Kodlayıcılarımdan daha fazla çözünürlük elde etmek için hem yükselen hem de düşen kenarları işlemem gerekiyordu.
Kurulumumda çözünürlüğüm 1 cm başına 24 tıklama.
Bu bize birkaç senaryo bırakıyor.
S1 sabit 0 ve S2 0'dan 1'e değiştirildi
S1 sabit 0 ve S2 1'den 0'a değiştirildi
S1 sabit 1'dir ve S2 0'dan 1'e geçiş yapar
S1 sabit 1'dir ve S2 1'den 0'a geçiş yapar
S2 sabit 0 ve S1 0'dan 1'e değiştirildi
S2 sabit 0 ve S1 1'den 0'a değiştirildi
S2 sabit 1'dir ve S1 0'dan 1'e geçiş yapar
S2 sabit 1'dir ve S1 1'den 0'a geçiş yapar
Bu koşullar yukarıdaki doğruluk tablolarında daha iyi anlaşılır, ayrıca her koşul isteğe bağlı olarak 0 veya 1 olarak adlandırılan bir 'yön' verir.
Grafikler bize iki hayati ipucu veriyor:
1) bir grafik diğerinin tam tersidir, bu nedenle eğer elimizde varsa, çıktıyı tersine çevirerek diğerini kolayca hesaplayabiliriz. Çıktıyı yalnızca bir pin değişiyorsa ve diğerini değiştirmiyorsa tersine çeviririz, birini keyfi olarak seçebiliriz.
2) grafiğin kendisi basitçe S1 ve S2 sinyallerinin XOR'sidir. (diğer grafik bunun DEĞİLDİR).
Şimdi kodu anlamak basittir.
// PORT'ta paralel olarak oku//aynı kodlayıcı durumuna ait bitişik çiftleri hatırla = PINB & 0x3f; // varsa hangi pinler değişti diff = hold ^ durum; // Doğruluk tablosunu elde etmek için XOR bitişik S1 ve S2 sinyalleri // en kolay yol mevcut durumun bir kopyasını oluşturmaktır // ve onu bir bitlik arama ile sağa kaydırmak = durum >> 1; // şimdi bitler XOR için hizalandı dir = arama ^ durum; // unutmayın, girdilerden biri sabit kaldıysa tablonun ters çevrilmesi gerekir, bunun için bir IF // ifadesine ihtiyacımız yok. Şu anda istenen yön biti // 'dir' değişkenindeki her çiftin sağ bitidir // soldaki bit anlamsızdır // 'diff' değişkeni 'set'i değiştiren bit'e sahiptir // yani biz de '01' veya '10' // 'dir' baytı ile XOR, anlamlı biti // tersine çevirir veya çevirmez. dizin ^= fark; // şimdi tutma değişkenini güncelle tutma = durum; // bu kodlayıcı için herhangi bir bit değiştiyse if(diff & 0x03) { // yönü belirle if(dir & 0x01) { // donanım ve kablolamanıza göre ++ veya -- --z; } başka { ++z; } } // geri kalanı için aynen if(diff & 0x0c) { if(dir & 0x04) { ++y; } başka { --y; } } if(fark & 0x30) { if(dir & 0x10) { --x; } başka { ++x; } }
Butona basıldığında mevcut XYZ değerini bir terminal programına gönderiyoruz.
Seri veriler yavaştır, ancak normal çalışma sırasında kodlayıcıların konumları bu süre boyunca zaten değişmeyecektir.
Veriler ham sayımlar olarak gönderilir. Matematiği yapabilir ve verileri mm veya inç olarak gönderebilirsin. Ham değerlerin de aynı derecede iyi olduğunu düşünüyorum çünkü nesneyi daha sonra yazılımda ölçekleyebiliriz.
Adım 5: İlk Tarama
Puanları toplamak yavaş bir işlemdir, probu sol üst köşeye yerleştirip Arduino'yu sıfırlarım.
Bu, konumu ev olarak sıfırlar.
Ardından sondayı hedef üzerindeki konuma hareket ettirin, sabit tutun ve 'anlık görüntü' düğmesine basın.
Bu oldukça büyük örnek parça için sadece ~ 140 puan aldım, bu nedenle nihai üründe detay çok iyi değil.
Verileri bir. PCD dosyasına kaydedin ve başlığı ekleyin
#. PCD v.7 - Nokta Bulutu Veri dosya formatıSÜRÜM.7 ALANLAR x y z BOYUT 4 4 4 TYPE F F F SAYISI 1 1 1 GENİŞLİK (puan sayınız) YÜKSEKLİK 1 GÖRÜŞ NOKTASI 0 0 0 1 0 0 0 PUAN (puan sayınız)
Başlığa puan sayınızı koyun, bu size satır numaraları sağlayan herhangi bir düzenleyicide kolaydır.
Yukarıdaki noktalar freeCad'de görülebilir, daha sonra freeCad'den. PLY dosyası olarak dışa aktarılırlar.
MeshLab üzerinde. PLY'yi açın ve nesneyi yüzeye çıkarın. Tamamlandı!!