Devreler

Başka Bir Yararsız Makine Nasıl Kurulur: Kolay ve Kullanımı Zor! 9 Basamak (Resimlerle)

Makine mühendisliği mi daha zor Pilotluk mu? | Meslek tanıtımı

Makine mühendisliği mi daha zor Pilotluk mu? | Meslek tanıtımı

İçindekiler:

Anonim

Bir çok işe yaramaz makine üretildi, neden bir tane daha üretiliyor? Basitçe, gerçekten eğlenceli :), inşa etmek eğlenceli ve oynamak için eğlenceli.
Her zaman "kutunun içinde düşünen" birileri olduğunu hissettiğim için bu sürüme bir karakter vermeye çalıştım, bu yüzden burada denedim, umarım "ona" bir hayat vermeyi başardım!
Sizinle kolayca adım atacak ve acı ya da daha iyi bir karakter vereceğinize dair tüm umutları sizinle paylaşmaktan gerçekten çok mutluyum! Versiyonum Arduino'ya dayanıyor, bunun fazladan bir şey olduğunu düşünebilirsiniz, ancak bana verdiği esneklik göz önüne alındığında, buna değer olduğunu düşünüyorum.
İşte her şeyi bir araya getiren bir video. Daha sonra parçalara, adımlara, şemalara ve kodlara geçeceğiz.
Varsa yorumlarınızı ve / veya sorularınızı bana bildirin.
Beğeneceğinizi umuyoruz!
f.

Gereçler:

Adım 1: Nasıl Çalışıyor?

Her şey bir Arduino kartına bağlı, kart anahtar mantık HIGH olarak ayarlanıncaya kadar bekler, yani, anahtarı kaydırdığınızda, kart belirli bir şekilde hareket etmesi için iki servo motorunun sinyalini verir (daha sonra), sonra "el" e bağlı servo, düğmeyi tekrar KAPALI konuma getirecek ve sonra "kapı" servosunun arkasına geri getirecektir. o zaman her şey tekrar eder.
Yukarıdaki videoyu gördüyseniz, anahtar her açıldığında, makine farklı bir şekilde yanıt verir ve bu sadece Arduino kodunda farklı zamanlamalarla farklı fonksiyonlar yazılarak yapılır (“Onları“ Hareket ediyorum ”olarak adlandırıyorum). Anahtar ne zaman açılsa, hepsi bitene kadar yeni bir hamle yapıyorum, baştan başlıyorum. 9. adımda, sıralı yerine rastgele hareketleri seçen kodun başka bir sürümünü sağladığımı unutmayın. Arduino hakkında yeterli hafızanız olduğu sürece istediğiniz kadar hamle ekleyebilirsiniz.
Arduino her zaman AÇIK, bu yüzden makine kullanılmadığında bir miktar güç tasarrufu sağlamak için bataryaya bir anahtar ekledim. Zaten basit YÜKSEK / DÜŞÜK algılama yerine, şalterde bir kesme kullanmayı ve uyku moduyla bağlamayı düşünüyorum. Makine kullanılmadığında ve ayrıca her zaman hazır olmasına izin verdiğinde güç tasarrufu sağlayacaktır (ancak bu aynı zamanda kodu da karmaşıklaştıracaktır) Bu nedenle, şimdilik yalnızca basit bir AÇMA / KAPATMA anahtarıdır ve kart her zaman çalıştırılır .

Adım 2: Parçalar

İhtiyacın olacak:
Zorunlu:
1. Bir kutu
2. PWM çıkışlı herhangi bir Arduino kartı (Diecimila etrafında eski bir tane var)
3. İki standart RC servo motor (Futaba - S3003'ü kullandım, 3,2 Kg / cm tork var, kapıyı veya eli taşımak için fazlasıyla yeterli)
4. Bir 6-12 V pil (AR drone pilimi kullandım, 11.1 v / 1000 mA)
3. Tetikleyici için bir SPTT veya SPST anahtarı (temel olarak size uygun herhangi bir anahtar!)
5. Batarya için başka bir anahtar
6. Hareketleri / kodu baştan başlatmak isterseniz, Arduino'yu sıfırlamak için bir düğme.
7. Bazı atlama telleri

İsteğe bağlı:
Kutuyu hareket ettirmeyi içeren bir hareket tasarlamak isterseniz (videodaki son hareket gibi), sonra şunları yapabilirsiniz:
1. Bir Arduino motor kalkanı, bu diğer projeler için de kullanışlı olacaktır (veya kendiniz bir H köprüsü tasarlayabilir, araştırabilirsiniz)
2. Bir ucuz RC araba böylece onun DC motor ve dişli kutusunu alabilir
Ayrıca, hala "isteğe bağlı" bölümünde, anahtar açılıp kapatıldığında temiz bir tetikleme için bir donanım devre dışı bırakma devresi kurdum. Bu atlanabilir ve gecikmeler veya zamanlayıcılar kullanılarak arduino yazılımına kolayca uygulanabilir. Donanımı yeniden açtım çünkü kısa sürede kesintileri kullanmak için kodu değiştireceğim ve ikincisi gecikme / zamanlayıcı işlevlerinin rutinde güvenilir bir şekilde kullanılmasına izin vermediğinden, gelecekteki kullanım için basit bir sıçrama devresi kurmak zorunda kaldım. . Bu kısmı atlamak istiyorsanız, arduino'nun 2. iğnesine basit bir anahtar / direnç bağlamanız ve bir rutin çıkarma yazılımı uygulamanız yeterlidir.
Donanım açılışı için:
1. 10mF elektrolitik kondansatör
2. 10K direnç
3. Bir mantık DEĞİLDİR kapısı. Yani İnvertör (yonga 74HC04) Bu, altı invertöre sahiptir, ancak yalnızca birine ihtiyacınız olacaktır.
Hadi inşa edelim …

Adım 3: Kutuyu Oluşturmak

Uygun bulduğunuz herhangi bir kutuyu kullanabilirsiniz. Benimkini yaptım, belki mükemmel değil, ama yine de çok kişisel :)
1. Bir kesici kullanarak çalışmak çok kolay ve inanılmaz hafifliği nedeniyle nispeten güçlü 2 yaprak 5mm BALSA ahşap kullandım.
2. Tüketilen 5 tüp Cyanoacrylat tutkal (aka güçlü hızlı etkili yapıştırıcılar)
İşte burada:
bir 22 x 14 x 14 cm Kutu

4. Adım: Şematik

Yukarıda gösterilen şematiktir (Fritzing kullanılarak çizilir):
Üst kısmı: Arduino ana kart, 2 servo ve anahtar bağlantısı. Önceden belirtildiği gibi, tüm debounce (sağ üst) devresini basit bir direnç / anahtarla değiştirebileceğinizi unutmayın.
Hem "kapı" hem de "el" servoları doğrudan Arduino'daki 5v pininden beslenir. Sinyal kabloları sırasıyla 9 ve 10 numaralı pinlere bağlanır. Bu pimler PWM'yi destekler, bu yüzden onları servo açısını / konumunu kontrol etmek için kullanıyorum (maksimum 0 - 180 derece).
Not: kırmızı düğme yalnızca bir sıfırlamadır (arduino kartının yüzünde bulunana benzer). Kartı / yazılımı herhangi bir zamanda kutuyu açmadan sıfırlamak için hızlı erişim sağlamak için ekledim. Sıfırlama yapmak için RESET pinini Ground'a bağlamanız yeterlidir.
Alt kısım: DC motor kullanmak ve makineyi hareket ettirmek istiyorsanız, gerekli. Bu arduino motor siperidir, Arduino'nun üstüne monte edilmiştir, böylece her iki panelin pimlerinin hepsi birbirine bağlıdır. Onları aşağıda sadece netlik için ayrılmış olarak gösteriyorum, umarım! Bu ekran inanılmaz bir kolaylıkla 2 DC motoru (2 kanal A / B) kontrol edebilir. Şimdi sadece birini kullanıyorum. Mevcut 2 kanal / motordan herhangi birinin kodunu, yönünü, hızını ve kesmelerini ayarlamanıza olanak tanır. Aşağıda gösterildiği gibi B kanalını kullanıyorum. pim
Yön için 13, hız için pim 11 ve fren kontrolü için pim 8.
Akü, ekrana bağlı bir 11.1 / 1000 mA'dır, böylece DC motorunu, ana arduino kartını ve servoları besler. Ekranı kullanmıyorsanız, pili doğrudan ana arduino kartındaki güç variline bağlayabilirsiniz.

Adım 5: Servoları Düzeltme

Yüklü el ve kapı servoları:
Öncelikle servoları doğru yerlerine takmanız gerekir, bunun için gereken hareketi bulana kadar biraz deneme yanılma gerekir. Servoları ve her biri için gereken sapma miktarını test etmek için arduino IDE'de verilen Servo örneğini kullanabilir ve böylece kapı ve el servolarının son konumlandırmasına ve kol uzunluğuna karar verebilirsiniz.
Kollar basitçe balsa ağacından yapılmış, biraz yırtılmaya dayanacak şekilde kalınlaştırıldım.
Aşağıda nasıl yaptım. El servosu hakkında sadece bir not. Servo milinin doğrudan kapağın (aşağıda gösterildiği gibi) kenarının altında kalması gerekir; bu, anahtara başarılı bir şekilde vurabilecek bir el yapmakta zorlanmamak ve aynı zamanda kutuya geri dönebilmek için zor zamanlar yaşamamanız gerekecektir.


Adım 6: Anahtarı, Servoları ve Arduino'yu Bağlamak

Şematik adımda görülen tüm bağlantıları yapın ve hepsini yukarıda gösterilene benzer şekilde kutunun içine koymaya çalışın:

Adım 7: İsteğe bağlı: DC Motor ve Akü

Yukarıda, DC motor dişli kutusunu (ucuz bir RC arabadan alınmış) nasıl koyduğumu ve aynı zamanda meyilli ve şalter yerleşimini gösterdiğimi gösteriyor.
Kutuyu dengelemek için teçhizatı ortalayabildiğinize kadar yerleştirdiğinizden emin olun, son montajdan sonra daha fazla dengelemek için kutunun içine biraz ağırlık koymanız gerekebilir, çünkü kullandığım batarya biraz ağır (100 gr) Kutuyu değiştirirken veya taşırken.
Dc motor unutmayın hız pin tarafından kontrol edilir 11, yön iğne ile 13, ve frenler iğneye 8, bunlar arduino motor siperi üzerindeki B kanalı olarak kabul edilir.
Montaj sırasında basit bir orijinal kutuya sahip olmak için tüm kablo anahtarlarını ve diğer bileşenleri gizlemeye çalıştım. Bu tekerlekler için geçerlidir, bu yüzden etraflarında hem tekerlekleri hem de aküyü barındıran ve ayrıca kırmızı sıfırlama düğmesine erişim sağlayan bir jant yaptım.

Adım 8: Kod

Arduino için kod yazabilmek için arduino IDE'ye ihtiyacınız var (buradan indirebilirsiniz)
1.0.5 sürümünü kullanıyorum, IDE içinden doğru COM portunu (pencereleri) ve kart tipini seçtiğinizden emin olun, ardından aşağıdaki kodu kullanın ve yüklemeye basın.
NOT: Serviste maksimum sapmayı ayarlamak için kodda kullandığım değerler, tam olarak bu kutu için servoların konumlandırılması, eksen ve açıları dikkate alınarak yapılır. Bunu deneme yoluyla aldım. Yani kendi değerlerinizi kutunuza göre tasarlamanız gerekir. servo yerleştirme.
Başvuru için, kodda meydana geldiğini göreceğiniz için her servo için kullandığım min / maks değerleri aşağıdadır:
Kapı:
80 gizleme, 155 tamamen açık
El:
0 gizleme, 129 düğmeye basma

İşte kod (Aşağıdan kopyala / yapıştır yerine bu adıma eklenen dosyayı indirmek daha iyidir):
#Dahil etmek
Servo kapıServo;
Servo elServo;
int switch_pin = 2; // pin 2'deki anahtarı ayarla
// motor değişkenleri
int motor Gaz = 11;
int motorDirection = 13;
int motor Freni = 8;
int pos = 0;
int selectedMove = 0; // seçiciyi taşı
int Testmove = 0; // test modu: sadece bir seçili hareketi test etmek için hareket numarasına ayarlayın
// (normal çalışacak şekilde Sıfır olarak ayarlanır, yani: amm hareketlerinde roundrobbin)
geçersiz kurulum ()
{
Serial.begin (9600);
pinMode (switch_pin, INPUT);
doorServo.attach (9); // Pin 9 pwm'de kapı servo ayarını yap
handServo.attach (10); // Pin 10 pwm'de el servosunu ayarla
doorServo.write (80); // kapıyı gizlenme pozisyonuna getir
handServo.write (0); // elini gizleme pozisyonuna getir

// Kanal B'yi ayarlayın (Kanal A kapı ve el servoları tarafından ayrıldığından ve aynı anda kullanılamaz).
pinMode (motorDirection, OUTPUT); // Motor Kanalı B pinini başlatır
pinMode (motor Freni, ÇIKIŞ); // Fren Kanalı B pinini başlatır

}

geçersiz döngü ()
{
if (Testmove! = 0) {
selectedMove = Testmove;
}

// anahtar açıksa, kapatmak için kapıyı ve elini hareket ettirin …
if (digitalRead (switch_pin) == YÜKSEK)
{

if (selectedMove> 10) {selectedMove = 0; } // tüm hareketler oynatıldığında, hareketleri baştan tekrarla
// aşağıda şu ana kadar tasarladığım tüm "Hareketler" var, her biri aşağıdaki kodda yazılan, isimleri kullanan, garip olan bir fonksiyon mu? evet, bazıları arapça yazılmış
if (selectedMove == 0) {switchoff (); }
else if (selectedMove == 1) {switchoff (); }
else if (selectedMove == 2) {switchoffbitaraddod (); }
else if (selectedMove == 3) {crazydoor (); }
else if (selectedMove == 4) {crazyslow (); }
else if (selectedMove == 5) {m7anika7anika (); }
else if (selectedMove == 6) {m3alla2 (); }
else if (selectedMove == 7) {switchoff (); }
else if (selectedMove == 8) {matrix (); }
else if (selectedMove == 9) {sneak (); }
else if (selectedMove == 10) {zee7 (); }

eğer (Testmove == 0) {
selectedMove ++; // test modunda değilse bir sonraki harekete geçin
}
}
}

// Hareket kütüphanesi
// temel hareket
geçersiz kapatma ()
{
// Hareketli kapı
(pos = 80; pos <155; pos = 3) için
{
doorServo.write (poz);
gecikmesi (15);
}

// Hareketli el
(pos = 0; pos <129; pos = 4) için
{
handServo.write (poz);
gecikmesi (15);
}

// el gizleme
(pos = 129; pos> = 0; pos- = 4)
{
handServo.write (poz);
gecikmesi (15);
}

// kapıyı gizleme
(pos = 155; pos> = 80; pos- = 3)
{
doorServo.write (poz);
gecikmesi (15);
}
}

// hamle 3: aç ve bekle, sonra elini tut ve bekle, sonra değiştir ve gizle
geçersiz switchoffbitaraddod ()
{
// Hareketli kapı
(pos = 80; pos <155; pos = 3) için
{
doorServo.write (poz);
gecikmesi (15);
}
gecikmesi (800);
// Hareketli el
(pos = 0; pos <100; pos = 4)
{
handServo.write (poz);
gecikmesi (15);
}
Gecikme (1000);
(pos = 100; pos <129; pos = 4) için
{
handServo.write (poz);
gecikmesi (15);
}

// el gizleme
(pos = 129; pos> = 0; pos- = 5) için
{
handServo.write (poz);
gecikmesi (15);
}

// kapıyı gizleme
(pos = 155; pos> = 80; pos- = 3)
{
doorServo.write (poz);
gecikmesi (15);


}

}

// 4'ü hareket ettirin: kapıyı açın, daha sonra birçok kez kapatın, bekleyin, ardından hızlıca tekrar açın ve saklayın.

void crazydoor ()
{

// Hareketli kapı
(pos = 80; pos <125; pos = 3) için
{
doorServo.write (poz);
gecikmesi (15);
}

// kapıyı gizleme
(pos = 125; pos> = 80; pos- = 5) için
{
doorServo.write (poz);
gecikmesi (15);
}
// Hareketli kapı
(pos = 80; pos <110; pos = 3) için
{
doorServo.write (poz);
gecikmesi (15);
}

// kapıyı gizleme
(pos = 110; pos> = 80; pos- = 15) için
{
doorServo.write (poz);
gecikmesi (15);
}
gecikmesi (700);
// Hareketli kapı
(pos = 80; pos <125; pos = 3) için
{
doorServo.write (poz);
gecikmesi (15);
}
gecikmesi (700);
// kapıyı gizleme
(pos = 125; pos> = 80; pos- = 5) için
{
doorServo.write (poz);
gecikmesi (15);
}

// ---- anahtarının ---- //
// Hareketli kapı
için (pos = 80; pos <155; pos = 8)
{
doorServo.write (poz);
gecikmesi (15);
}

// Hareketli el
(pos = 0; pos <129; pos = 3)
{
handServo.write (poz);
gecikmesi (15);
}

// el gizleme
(pos = 129; pos> = 0; pos- = 3)
{
handServo.write (poz);
gecikmesi (15);
}

// kapıyı gizleme
(pos = 155; pos> = 80; pos- = 15) için
{
doorServo.write (poz);
gecikmesi (15);
}

}

// hamle 5: kapıyı aç, sonra elini çok yavaşça ileri ve geri hareket ettir
geçersiz crazyslow ()
{
// Hareketli kapı
(pos = 80; pos <155; pos = 1) için
{
doorServo.write (poz);
gecikmesi (30);
}

// Hareketli el
(pos = 0; pos <129; pos = 1)
{
handServo.write (poz);
gecikmesi (30);
}

// el gizleme
(pos = 129; pos> = 0; pos- = 1)
{
handServo.write (poz);
gecikmesi (30);
}

// kapıyı gizleme
(pos = 155; pos> = 125; pos- = 1)
{
doorServo.write (poz);
gecikmesi (30);
}
gecikmesi (100);
(pos = 125; pos> = 80; pos- = 4) için
{
doorServo.write (poz);
gecikmesi (15);
}

}
// 6 taşı:
void m7anika7anika () {
// Hareketli kapı
(pos = 80; pos <155; pos = 3) için
{
doorServo.write (poz);
gecikmesi (15);
}

// Hareketli el
(pos = 0; pos <70; pos = 1)
{
handServo.write (poz);
gecikmesi (15);
}
gecikmesi (800);


// kapıyı gizleme
(pos = 155; pos> = 130; pos- = 3)
{
doorServo.write (poz);
gecikmesi (15);
}

// kapıyı gizleme
(pos = 130; pos <155; pos = 3)
{
doorServo.write (poz);
gecikmesi (15);
}
// kapıyı gizleme
(pos = 155; pos> = 130; pos- = 3)
{
doorServo.write (poz);
gecikmesi (15);
}
// kapıyı gizleme
(pos = 130; pos <155; pos = 3)
{
doorServo.write (poz);
gecikmesi (15);
}

handServo.write (40);
Gecikme (1000);

// Hareketli el
için (pos = 40; pos <129; pos = 4)
{
handServo.write (poz);
gecikmesi (15);
}

// el gizleme
(pos = 129; pos> = 0; pos- = 4)
{
handServo.write (poz);
gecikmesi (15);
}


için (pos = 120; pos> = 80; pos - = 1)
{
doorServo.write (poz);
gecikmesi (15);
}



}
geçersiz m3alla2 () {
// Hareketli kapı
(pos = 80; pos <155; pos = 3) için
{
doorServo.write (poz);
gecikmesi (15);
}

// Hareketli el
(pos = 0; pos <127; pos = 4)
{
handServo.write (poz);
gecikmesi (15);
}
// kapıyı gizleme
(pos = 155; pos> = 130; pos- = 3)
{
doorServo.write (poz);
gecikmesi (15);
}
Gecikme (2000);

(pos = 130; pos <155; pos = 3)
{
doorServo.write (poz);
gecikmesi (15);
}

(pos = 155; pos> = 140; pos- = 3)
{
doorServo.write (poz);
gecikmesi (15);
}
(pos = 140; pos <155; pos = 3)
{
doorServo.write (poz);
gecikmesi (15);
}
gecikmesi (500);
// el gizleme
(pos = 127; pos> = 0; pos- = 4)
{
handServo.write (poz);
gecikmesi (15);
}

// kapıyı gizleme
(pos = 155; pos> = 80; pos- = 3)
{
doorServo.write (poz);
gecikmesi (15);
}
}

geçersiz matris ()
{
// Hareketli kapı
(pos = 80; pos <155; pos = 3) için
{
doorServo.write (poz);
gecikmesi (15);
}

// Hareketli el
(pos = 0; pos <80; pos = 4)
{
handServo.write (poz);
gecikmesi (15);
}

(pos = 80; pos <129; pos = 1) için
{
handServo.write (poz);
gecikmesi (30);
}
gecikmesi (300);

(pos = 129; pos> = 0; pos- = 4)
{
handServo.write (poz);
gecikmesi (10);
}

// kapıyı gizleme
(pos = 155; pos> = 80; pos- = 3)
{
doorServo.write (poz);
gecikmesi (15);
}

}
boşluk gizlice ()
{
// Hareketli kapı
(pos = 80; pos <130; pos = 1) için
{
doorServo.write (poz);
gecikmesi (30);
}
Gecikme (2000);

// Hareketli el
(pos = 0; pos <40; pos = 1)
{
handServo.write (poz);
gecikmesi (30);
}

gecikmesi (500);

(pos = 130; pos <155; pos = 4)
{
doorServo.write (poz);
gecikmesi (15);
}
gecikmesi (100);

(pos = 40; pos <90; pos = 4) için
{
handServo.write (poz);
gecikmesi (15);
}
gecikmesi (500);
// el gizleme
(pos = 90; pos> = 70; pos- = 4) için
{
handServo.write (poz);
gecikmesi (15);
}
gecikmesi (100);
(pos = 70; pos <90; pos = 4) için
{
handServo.write (poz);
gecikmesi (15);
}
gecikmesi (100);
(pos = 90; pos> = 70; pos- = 4) için
{
handServo.write (poz);
gecikmesi (15);
}
gecikmesi (100);

(pos = 70; pos <129; pos = 4) için
{
handServo.write (poz);
gecikmesi (15);
}

(pos = 129; pos> = 0; pos- = 4)
{
handServo.write (poz);
gecikmesi (15);
}
// kapıyı gizleme
(pos = 155; pos> = 80; pos- = 3)
{
doorServo.write (poz);
gecikmesi (15);
}
}


geçersiz zee7 ()
{
// Hareketli kapı
(pos = 80; pos <155; pos = 3) için
{
doorServo.write (poz);
gecikmesi (15);
}
Gecikme (2000);
// ileri @ yarım hızda sola
digitalWrite (motor Yönü, DÜŞÜK); // B Kanalının SAĞ yönünü belirler
digitalWrite (motor freni, DÜŞÜK); // B Kanalının Frenini Devreden Çıkarın
analogWrite (motor Gaz, 100); // Motoru Kanal B'ye tam hızda döndürür
gecikmesi (300);
digitalWrite (motor freni, YÜKSEK); // B Kanalı için Fren Eengage
Gecikme (2000);

// geriye doğru @ yarım hız sağa
digitalWrite (motor Yönü, YÜKSEK); // B Kanalının LEFT yönünü belirler
digitalWrite (motor freni, DÜŞÜK); // B Kanalının Frenini Devreden Çıkarın
analogWrite (motor Gaz, 100); // Motoru Kanal B'ye yarı hızda döndürür
gecikmesi (300);
digitalWrite (motor freni, YÜKSEK); // B Kanalı için Fren Eengage
Gecikme (1000);

// Hareketli el
(pos = 0; pos <129; pos = 4) için
{
handServo.write (poz);
gecikmesi (15);
}

// el gizleme
(pos = 129; pos> = 0; pos- = 4)
{
handServo.write (poz);
gecikmesi (15);
}

// kapıyı gizleme
(pos = 155; pos> = 80; pos- = 3)
{
doorServo.write (poz);
gecikmesi (15);
}
}


Adım 9: İsteğe Bağlı Güncelleme: Hareket Algılama

Bugün bir yakınlık algılayıcım var (GP2Y0A21), bu yüzden şimdi kullanıcı geçiş düğmesine yaklaştığında makineyi hareket ettirmek için kullanabilirim :)
Bu ek adım için, harekete izin vermek için tekerlekleri zaten kurduğunuzu farz ediyorum (bkz. İsteğe bağlı adım 8). Artık geriye kalan tek şey sensörü eklemek ve hareket algılama kodunda bazı değişiklikler yapmak.
Sensörde 3 kablo var, sarı sinyal kablosu bağlı. pim 3 arduino üzerinde kırmızı ve siyah bağlı v5 ve zemin sırasıyla gemide.
Resimde gösterildiği gibi kapının altına gizlenmiş sensörü yerleştirdim, böylece kullanıcının hareketi sadece kapı açıldığında görülebilir. tam ihtiyacım olan şey!
Ayrıca, bir hareket algılama yordamı uygulamak için kodu (burada) biraz değiştirmek zorunda kaldım (işlevdeki koda bakın) zee7 () öyle ki, hareket algılandığında, kutu önce sağa, sonra sola hareket eder, sonra el anahtarı çevirir ve gizler. Kod ağır yorumlanır, umarım aşırıya kaçmamışımdır!
Güncellenen kodu aşağıda bulabilirsiniz, ayrıca makinenin hamleleri rastgele seçmesini sağladığımı da unutmayın, bu sadece ayar yaparak tekrar sırayla değiştirilebilir. boolean randomize = yanlış;
Harika önerileriniz için TÜM teşekkürler!
Kod (Aşağıdan kopyala / yapıştır yerine bu adıma eklenen dosyayı indirmek daha iyi olur):
#Dahil etmek
Servo kapıServo;
Servo elServo;
işaretsiz uzun TimerA, TimerB; // hareket algılama rutini için zamanlayıcı
int switch_pin = 2; // pin 2'deki anahtarı ayarla
// motor değişkenleri
int motor Gaz = 11;
int motorDirection = 13;
int motor Freni = 8;
// Mesafe Değişkenleri
int motionPin = 3; // analog 0 üzerindeki hareket sensörü pimi
int lastDist = 0; // son mesafeyi hatırlamak
int currentDist = 0;
int harman = 200; // Hareket için Eşik (istediğiniz hareket algılama duyarlılığını elde edecek şekilde ayarlayın)

int pos = 0;
int selectedMove = 0; // seçiciyi taşı
int Testmove = 0; // test modu: sadece bir seçili hareketi test etmek için hareket numarasına ayarlayın
// (normal çalışacak şekilde Sıfır olarak ayarlanır, yani tüm hareketlerde roundrobbin)
boolean randomize = true; // true ise, kutu rasgele hareket eder, false değerine ayarlanırsa hamleler sırayla 1'den 10'a kadar yapılır.

geçersiz kurulum ()
{
Serial.begin (9600);
pinMode (switch_pin, INPUT);
doorServo.attach (9); // Pin 9 pwm'de kapı servo ayarını yap
handServo.attach (10); // Pin 10 pwm'de el servosunu ayarla
doorServo.write (80); // kapıyı gizlenme pozisyonuna getir
handServo.write (0); // elini gizleme pozisyonuna getir
// Kanal B'yi ayarlayın, çünkü Kanal A kapı ve el servoları tarafından rezerve edilmiştir ve aynı anda kullanılamaz
pinMode (motorDirection, OUTPUT); // Motor Kanalı B pinini başlatır
pinMode (motor Freni, ÇIKIŞ); // Fren Kanalı B pinini başlatır

}

geçersiz döngü ()
{
// anahtar açıksa, kapatmak için kapıyı ve elini hareket ettirin …
if (digitalRead (switch_pin) == YÜKSEK)
{

eğer (Testmove == 0)
{

eğer (randomize == yanlış)
{
eğer (selectedMove> 10)
{
selectedMove = 0; // tüm hareketler oynatıldığında, hareketleri baştan tekrarla
}
}
Başka
{
selectedMove = rastgele (11);
}
}
Başka
{
selectedMove = Testmove;
}
Serial.println (selectedMove);
if (selectedMove == 0) {switchoff (); }
else if (selectedMove == 1) {switchoff (); }
else if (selectedMove == 2) {switchoffbitaraddod (); }
else if (selectedMove == 3) {crazydoor (); }
else if (selectedMove == 4) {crazyslow (); }
else if (selectedMove == 5) {m7anika7anika (); }
else if (selectedMove == 6) {m3alla2 (); }
else if (selectedMove == 7) {switchoff (); }
else if (selectedMove == 8) {matrix (); }
else if (selectedMove == 9) {sneak (); }
else if (selectedMove == 10) {zee7 (); }

if (Testmove == 0 && randomize == yanlış) {
selectedMove ++; // test modunda değilse bir sonraki hamleye geçin
}
}
}
// Hareket kütüphanesi
// temel hareket
geçersiz kapatma ()
{
// Hareketli kapı
(pos = 80; pos <155; pos = 3) için
{
doorServo.write (poz);
gecikmesi (15);
}

// Hareketli el
(pos = 0; pos <129; pos = 4) için
{
handServo.write (poz);
gecikmesi (15);
}

// el gizleme
(pos = 129; pos> = 0; pos- = 4)
{
handServo.write (poz);
gecikmesi (15);
}

// kapıyı gizleme
(pos = 155; pos> = 80; pos- = 3)
{
doorServo.write (poz);
gecikmesi (15);
}
}

// hamle 3: aç ve bekle, sonra elini tut ve bekle, sonra değiştir ve gizle
geçersiz switchoffbitaraddod ()
{
// Hareketli kapı
(pos = 80; pos <155; pos = 3) için
{
doorServo.write (poz);
gecikmesi (15);
}
gecikmesi (800);
// Hareketli el
(pos = 0; pos <100; pos = 4)
{
handServo.write (poz);
gecikmesi (15);
}
Gecikme (1000);
(pos = 100; pos <129; pos = 4) için
{
handServo.write (poz);
gecikmesi (15);
}

// el gizleme
(pos = 129; pos> = 0; pos- = 5) için
{
handServo.write (poz);
gecikmesi (15);
}

// kapıyı gizleme
(pos = 155; pos> = 80; pos- = 3)
{
doorServo.write (poz);
gecikmesi (15);


}

}

// 4'ü hareket ettirin: kapıyı açın, daha sonra birçok kez kapatın, bekleyin, ardından hızlıca tekrar açın ve saklayın.

void crazydoor ()
{

// Hareketli kapı
(pos = 80; pos <125; pos = 3) için
{
doorServo.write (poz);
gecikmesi (15);
}

// kapıyı gizleme
(pos = 125; pos> = 80; pos- = 5) için
{
doorServo.write (poz);
gecikmesi (15);
}
// Hareketli kapı
(pos = 80; pos <110; pos = 3) için
{
doorServo.write (poz);
gecikmesi (15);
}

// kapıyı gizleme
(pos = 110; pos> = 80; pos- = 15) için
{
doorServo.write (poz);
gecikmesi (15);
}
gecikmesi (700);
// Hareketli kapı
(pos = 80; pos <125; pos = 3) için
{
doorServo.write (poz);
gecikmesi (15);
}
gecikmesi (700);
// kapıyı gizleme
(pos = 125; pos> = 80; pos- = 5) için
{
doorServo.write (poz);
gecikmesi (15);
}

// ---- anahtarının ---- //
// Hareketli kapı
için (pos = 80; pos <155; pos = 8)
{
doorServo.write (poz);
gecikmesi (15);
}

// Hareketli el
(pos = 0; pos <129; pos = 3)
{
handServo.write (poz);
gecikmesi (15);
}

// el gizleme
(pos = 129; pos> = 0; pos- = 3)
{
handServo.write (poz);
gecikmesi (15);
}

// kapıyı gizleme
(pos = 155; pos> = 80; pos- = 15) için
{
doorServo.write (poz);
gecikmesi (15);
}

}

// hamle 5: kapıyı aç, sonra elini çok yavaşça ileri ve geri hareket ettir
geçersiz crazyslow ()
{
// Hareketli kapı
için (pos = 80; pos <155; pos = 1)
{
doorServo.write (poz);
gecikmesi (30);
}

// Hareketli el
(pos = 0; pos <129; pos = 1)
{
handServo.write (poz);
gecikmesi (30);
}

// el gizleme
(pos = 129; pos> = 0; pos- = 1)
{
handServo.write (poz);
gecikmesi (30);
}

// kapıyı gizleme
(pos = 155; pos> = 125; pos- = 1)
{
doorServo.write (poz);
gecikmesi (30);
}
gecikmesi (100);
(pos = 125; pos> = 80; pos- = 4) için
{
doorServo.write (poz);
gecikmesi (15);
}

}
// 6 taşı:
void m7anika7anika () {
// Hareketli kapı
(pos = 80; pos <155; pos = 3) için
{
doorServo.write (poz);
gecikmesi (15);
}

// Hareketli el
(pos = 0; pos <70; pos = 1)
{
handServo.write (poz);
gecikmesi (15);
}
gecikmesi (800);


// kapıyı gizleme
(pos = 155; pos> = 130; pos- = 3)
{
doorServo.write (poz);
gecikmesi (15);
}

// kapıyı gizleme
(pos = 130; pos <155; pos = 3)
{
doorServo.write (poz);
gecikmesi (15);
}
// kapıyı gizleme
(pos = 155; pos> = 130; pos- = 3)
{
doorServo.write (poz);
gecikmesi (15);
}
// kapıyı gizleme
(pos = 130; pos <155; pos = 3)
{
doorServo.write (poz);
gecikmesi (15);
}

handServo.write (40);
Gecikme (1000);

// Hareketli el
için (pos = 40; pos <129; pos = 4)
{
handServo.write (poz);
gecikmesi (15);
}

// el gizleme
(pos = 129; pos> = 0; pos- = 4)
{
handServo.write (poz);
gecikmesi (15);
}


için (pos = 120; pos> = 80; pos - = 1)
{
doorServo.write (poz);
gecikmesi (15);
}



}
geçersiz m3alla2 () {
// Hareketli kapı
(pos = 80; pos <155; pos = 3) için
{
doorServo.write (poz);
gecikmesi (15);
}

// Hareketli el
(pos = 0; pos <127; pos = 4)
{
handServo.write (poz);
gecikmesi (15);
}
// kapıyı gizleme
(pos = 155; pos> = 130; pos- = 3)
{
doorServo.write (poz);
gecikmesi (15);
}
Gecikme (2000);

(pos = 130; pos <155; pos = 3)
{
doorServo.write (poz);
gecikmesi (15);
}

(pos = 155; pos> = 140; pos- = 3)
{
doorServo.write (poz);
gecikmesi (15);
}
(pos = 140; pos <155; pos = 3)
{
doorServo.write (poz);
gecikmesi (15);
}
gecikmesi (500);
// el gizleme
(pos = 127; pos> = 0; pos- = 4)
{
handServo.write (poz);
gecikmesi (15);
}

// kapıyı gizleme
(pos = 155; pos> = 80; pos- = 3)
{
doorServo.write (poz);
gecikmesi (15);
}
}

geçersiz matris ()
{
// Hareketli kapı
(pos = 80; pos <155; pos = 3) için
{
doorServo.write (poz);
gecikmesi (15);
}

// Hareketli el
(pos = 0; pos <80; pos = 4)
{
handServo.write (poz);
gecikmesi (15);
}

(pos = 80; pos <129; pos = 1) için
{
handServo.write (poz);
gecikmesi (30);
}
gecikmesi (300);

(pos = 129; pos> = 0; pos- = 4)
{
handServo.write (poz);
gecikmesi (10);
}

// kapıyı gizleme
(pos = 155; pos> = 80; pos- = 3)
{
doorServo.write (poz);
gecikmesi (15);
}

}
boşluk gizlice ()
{
// Hareketli kapı
(pos = 80; pos <130; pos = 1) için
{
doorServo.write (poz);
gecikmesi (30);
}
Gecikme (2000);

// Hareketli el
(pos = 0; pos <40; pos = 1)
{
handServo.write (poz);
gecikmesi (30);
}

gecikmesi (500);

(pos = 130; pos <155; pos = 4)
{
doorServo.write (poz);
gecikmesi (15);
}
gecikmesi (100);

(pos = 40; pos <90; pos = 4) için
{
handServo.write (poz);
gecikmesi (15);
}
gecikmesi (500);
// el gizleme
(pos = 90; pos> = 70; pos- = 4) için
{
handServo.write (poz);
gecikmesi (15);
}
gecikmesi (100);
(pos = 70; pos <90; pos = 4) için
{
handServo.write (poz);
gecikmesi (15);
}
gecikmesi (100);
(pos = 90; pos> = 70; pos- = 4) için
{
handServo.write (poz);
gecikmesi (15);
}
gecikmesi (100);

(pos = 70; pos <129; pos = 4) için
{
handServo.write (poz);
gecikmesi (15);
}

(pos = 129; pos> = 0; pos- = 4)
{
handServo.write (poz);
gecikmesi (15);
}
// kapıyı gizleme
(pos = 155; pos> = 80; pos- = 3)
{
doorServo.write (poz);
gecikmesi (15);
}
}

// bu hareket kapıyı açacak ve anahtarın yakınında tespit edildiğinde hareketi bekleyecektir,
// kutu önce Sağa, sonra Sola hareket eder ve son olarak el hareket eder ve düğmeyi kapatır
geçersiz zee7 ()
{

//açık kapı
(pos = 80; pos <155; pos = 3) için
{
doorServo.write (poz);
gecikmesi (15);
}
gecikmesi (1200 ° C); // kapıyı açtıktan sonra sensör okumalarını dengelemek için bekleyin

// zamanlayıcıyı ayarlayın ve sensörü okuyun
// eşiği aşan hareketi bekle veya zamanlayıcı sona ererse (5 sn),
lastDist = analogRead (motionPin);
TimerA = millis ();

while (millis () - ZamanlayıcıA <= 5000)
{
currentDist = analogRead (motionPin);

// Geçerli mesafe son mesafeden eşikten daha fazla sapıyor mu?
// eğer evet ise, kutuyu sağa hareket ettir
if ((currentDist> lastDist thresh || currentDist <lastDist - thresh) || currentDist> 300)
{
// sola yarım ileri @ ileri (hızı ve gecikmeyi seçin
//(i.e gecikme (300) kutuya ve akü voltajına göre hareket atışının istendiği şekilde)
digitalWrite (motor Yönü, DÜŞÜK); // A Kanalının SAĞ yönünü belirler
digitalWrite (motor freni, DÜŞÜK); // B Kanalının Frenini Devreden Çıkarın
analogWrite (motor Gaz, 100); // Motoru Kanal B'ye tam hızda döndürür
gecikmesi (300);
digitalWrite (motor freni, YÜKSEK); // B Kanalı için Fren Eengage
break;
}
lastDist = currentDist;
}

// zamanlayıcıyı ayarlayın ve sensörü okuyun
// eşiği aşan hareketi bekle veya zamanlayıcı sona ererse (5 sn),
gecikmesi (1200 ° C); // kapıyı açtıktan sonra sensör okumalarını dengelemek için bekleyin
lastDist = analogRead (motionPin);
TimerB = millis ();
while (millis () - ZamanlayıcıB <= 5000)
{
currentDist = analogRead (motionPin);
// kutu zaten sağa doğru hareket etti mi ve mevcut mesafe son mesafeden eşikten daha fazla sapmış mıydı?
// Evet ise, sola git
if ((currentDist> lastDist thresh || currentDist <lastDist - thresh) || currentDist> 300)
{
// geriye doğru @ yarım hız sağa (hız ve gecikmeyi seçin
//(i.e gecikme (300) kutuya ve akü voltajına göre hareket atışının istendiği şekilde)
digitalWrite (motor Yönü, YÜKSEK); // B Kanalının LEFT yönünü belirler
digitalWrite (motor freni, DÜŞÜK); // B Kanalının Frenini Devreden Çıkarın
analogWrite (motor Gaz, 100); // Motoru Kanal B'ye yarı hızda döndürür
gecikmesi (300);
digitalWrite (motor freni, YÜKSEK); // B Kanalı için Fren Eengage
break;
}

lastDist = currentDist;

}
gecikmesi (100);
// Hareketli el
(pos = 0; pos <130; pos = 4)
{
handServo.write (poz);
gecikmesi (15);
}

// el gizleme
(pos = 130; pos> = 0; pos- = 4)
{
handServo.write (poz);
gecikmesi (15);
}

// kapıyı gizleme
(pos = 155; pos> = 80; pos- = 3)
{
doorServo.write (poz);
gecikmesi (15);
}
}

Bu Projeyi 3 Kişi Yaptı!

  • AndyC159 yaptı!

  • SamL84 yaptı!

  • melton1313 yaptı!

Bu projeyi yaptın mı? Bizimle paylaşın!

öneriler

  • Vida Ayırma Makinesi

  • PCB YİDİR (Tek Bir PCB'de Çizgi İzleyen, Engelden Kaçıran ve Bluetooth Kontrollü Robot)

  • Nesnelerin İnterneti Sınıfı

  • Gökkuşağı Yarışması'nın Renkleri

  • Fandom Yarışması

  • Parti Mücadelesi

194 Tartışmalar

0

deniyor musun

4 yıl önce Giriş

Bunun için teşekkürler! İlk Arduino projemi bu derse dayanarak yaptım: işe yaramaz bir ejderha!

4 cevaplar 0

Ajanndeniyor musun

Yanıtla 3 yıl önce

Ejderhan makinen harika. !!! artistik

0

TJAOkevindeniyor musun

Yanıtla 3 yıl önce

Korku veren !!!!!

0

riachideniyor musun

Yanıtlayan 4 yıl önce Giriş

Müthişsin :) !!!

Bir ejderha için harika kişilik! Ejderhayı doğrudan kameraya bakarken (üstten görünüm) varken videoyu yeniden yapabilmenizi diliyorum, bunun çok komik olacağını düşünüyorum, bu yüzden dilini gizlice görün!

Videonuzu paylaştığınız ve teşekkür ettiğim için teşekkürler

0

deniyor musunriachi

Yanıtlayan 4 yıl önce Giriş

Daha önceki bir aşamada üstten görünüşü denedim, ancak işe yaramadı (dağınık iç kısımların çoğunu gördüm), bu yüzden bu videoyu çektiğimde reddettim. Bence haklısın: Son aşamada harika gözüküyordu! Ne yazık ki zaten ejderhayı verdim … Bir sonraki projeye geçelim!

0

br1pro

4 yıl önce

Çok eğlenceli! servo sabitleme zor iş ve el tasarım. Bu öğretilebilir için teşekkürler!

1 cevap 0

riachibr1pro

Yanıtlayan 4 yıl önce Giriş

Harika iş adamı! gerçekten güzel :) herhangi bir video?

0

clincoln

5 yıl önce

İlk önce videoyu izleyin, sonra güldürün

1 cevap 0

TobiasVclincoln

Yanıtlayan 4 yıl önce Giriş

Yaptığımı biliyorum! : D

0

rileyw

5 yıl önce

Süper serin video kendi aklı varmış gibi görünüyordu

0

Elitekilla117

5 yıl önce Giriş

Arduino ve riachis koduyla işe yaramaz makinem! Dr.who'dan bir tardiste yapıldı. :)
http://www.youtube.com/watch?v=aDs0T52o6-M

2 cevaplar 0

riachiElitekilla117

Yanıtlayan 5 yıl önce Giriş

SEVDİM!!!! :)) gerçekten aferin adamım, senin bombbox canlı görmek çok mutlu! Ben de dramatizasyon ve müzik: p yapabilirsem 3 küçük değişiklik önermek için kendimi durduramam :)?
- Makineyi ayakta pozisyona koymak harika olurdu, bunun kapıyı kapatmak için yerçekimi yardımını kaybedeceğini biliyorum, ama basit bir çözüm kapının iç tarafına bağlı 2 lastik bant koymak ve diğer uç için kutunun iç tarafına, bu, servo kapanırken kapının kapanmasına neden olur … inşa adımlarımı kontrol edin, 6. adımda lastik bandı göreceksiniz …
- ayrıca ellerin siyahla boyanması ne olacak, daha sinsi ve kaygan olacak
! Ayrıca el ucu kanlı kırmızıya boyanabilir veya çılgın bir yüzle veya bunun gibi bir şeyle süslenebilir.
- Son hamleyi, içinde hiçbir şey olmadıkça kaldırın (kutunun hamleleri olması gerekiyordu) ve kendi hamlenizi yazın …
Yine de önerileri unut, makine sahibini sevdim! Ve çok teşekkürler adam için teşekkürler, lütfen onları azaltabilir ve videoyu makineye odaklı tutabilirsiniz :)
Umarım gf bunu sevmiştir!

0

Elitekilla117riachi

Yanıtlayan 5 yıl önce Giriş

Hahah İltifatlarınız için teşekkür ederim :) Aslında daha fazlasını yapmak istedim ama zaman sıkıntısı yüzünden istediğim ayrıntıların çoğuna uymadım. Kollara biraz renk katmak isterdim ama bunlara vaktim olmadı. Ve koluna bir keskin nişancı ile bir yüz çizmek istedim, ama çoktan sarıldı ve Noel için ona vermeye hazırdı. Hehehe. Sanırım buna bayılacak. Ayrıca ayağa kalkmasını istedim ama lastik bantların servolara çok fazla ağırlık vermesinden korktum. Kapı zaten oldukça ağır. Son yaptığım hamle, ortaya çıkmasını beklerken sizi endişelendiriyor. Hahaha ama yardımın için teşekkür ederim arkadaşım! Kesinlikle buna değer!

0

chuckletushy

5 yıl önce

Bunu yapmak zorundayım … harika

0

wrs715

5 yıl önce Giriş

Arduino kullanırken gördüğüm ilk proje, "Evet, buna değer. Şimdi bir tane almak zorundayım" demiştim. Fantastik iş!

0

siliconghost

5 yıl önce Giriş

Vay canına, ortak bir projede harika bir yer! Daha ilginç hale getirmek için sıkma seviyorum!

0

bob3030

5 yıl önce

Bir erkeğin işe yaramaz aleti, diğerlerinden tamamen harikadır, bu dünyadan, biz, pek işe yaramaz bir cihaza sahip olduğunu düşündüğümüz, eğlenceli olacağını düşünürüz. Projedeki güncellemeleriniz için teşekkür ederiz. Gönderdiğiniz için teşekkür ederiz.

0

wobbler

5 yıl önce Giriş

Düşünce 1: Bunun için bir Arduino kullanmak sadece saçma sapan
Düşünce 2: Videoyu izledikten sonra - Bunun için bir Arduino kullanmak sadece bir dahi!
Yaratıcılığına boyun eğiyorum!

0

stumitch

5 yıl önce Giriş

Bu gerçekten harika! Bana bir Wall-E kişiliğini hatırlatıyor. Harika bir proje için teşekkürler!

0

gazillabytes

5 yıl önce Giriş

Gerçekten işe yaramaz! Güzel 'ible. İlham aldım ve masam için bir tane yapmam gerekiyor. Teşekkürler.