Vezja

Kako zgraditi še en nekoristen stroj: enostaven za izdelavo in težaven za uporabo! 9 korakov (s slikami)

Mike Biddle: We can recycle plastic

Mike Biddle: We can recycle plastic

Kazalo:

Anonim

Tako je zgrajenih toliko neuporabnih strojev, zakaj zgraditi še enega? Preprosto, res je zabavno :), zabavno graditi in se zabavati.
Poskušal sem tej verziji dati znak, saj sem vedno čutil, da je nekdo "razmišljal v škatli", zato sem poskusil, upam, da sem ji "dal" življenje!
Zelo sem vesel, da lahko z vami delim vse korake, z vsemi upami, da boste z lahkoto zgradili vaš in mu dali grenak ali boljši značaj! Moja različica temelji na Arduinu, morda mislite, da je pretiravanje, vendar glede na prilagodljivost, ki mi jo je dala, mislim, da je vredno.
Tukaj je video vsega, kar je vse skupaj. Kasneje se bomo preselili v dele, korake, sheme in kodo
Sporočite mi svoje pripombe in / ali vprašanja, če jih imate.
Upam da uživaš!
f.

Dobave:

1. korak: Kako deluje?

Vse je povezano z Arduino ploščo, plošča počaka, dokler se stikalo ne nastavi na logično HIGH, kar pomeni, da ko preklopite stikalo, plošča signalizira dva servo motorja, da se premakneta na poseben način (več o tem kasneje), , servo, priključen na "roko", bo premaknil stikalo nazaj v položaj OFF in se vrnil nazaj v škatlo, sledil pa mu bo servo vrat. potem se vse ponovi.
Če ste videli zgornji video, vsakič, ko preklopite stikalo, se naprava odzove na drugačen način, in to storite tako, da preprosto napišete različne funkcije z različnimi časovnimi intervali v kodi Arduino, (kličem jih »Premakni«). Vsakič, ko je stikalo preklopljeno, kličem novo potezo, dokler ni vse končano. upoštevajte, da sem v 9. koraku podal drugo različico kode, ki izbira naključne premike namesto zaporednega. Dodate lahko toliko gibov, kot želite, dokler imate dovolj spomina na Arduinu.
Arduino je vedno vklopljen, zato sem dodal stikalo za akumulator, da bi prihranil nekaj energije, ko stroj ni v uporabi. Jaz že načrtujem uporabo prekinitve na stikalu, namesto trenutnega preprostega HIGH / LOW zaznavanja, in ga povežem z načinom mirovanja. To bo prihranilo energijo, ko stroj ni v uporabi, in tudi, da je vedno pripravljen (vendar bo to tudi otežilo kodo) Torej, za zdaj, je to preprosto stikalo za VKLOP / IZKLOP in plošča je vedno napajana .

2. korak: Deli

Boste potrebovali:
Obvezno:
1. Škatla
2. Katera koli Arduino plošča s PWM izhodi (včasih imam starega, ki se nahaja okoli, Diecimila)
3. Dva standardna servo motorja RC (uporabljal sem Futaba - S3003, navor 3,2 Kg / cm, več kot dovolj za premikanje vrat ali roke)
4. Baterija 6-12 V (uporabljala sem akumulatorsko baterijo AR, je 11,1 v / 1000 mA)
3. SPTT ali SPST stikalo za sprožilec (v bistvu, vsako stikalo, ki vam ustreza!)
5. Drugo stikalo za baterijo
6. Pritisnite gumb za ponastavitev Arduino v primeru, da želite znova zagnati gibe / kodo od zgoraj.
7. Nekaj ​​kratkih žic

Neobvezno:
Če želite oblikovati potezo, ki vključuje premik okenca (kot je zadnja poteza v videoposnetku), lahko dobite:
1. Arduino motorni ščit, to bo tudi priročno za druge projekte (ali pa lahko sami konstruirate H-most, ga poiščete)
2. poceni RC avto, tako da lahko vzamete DC motor in menjalnik
Poleg tega, še vedno v "neobvezno" odsek, sem zgradil strojno de-Odskočiti vezje, da so čisto sprožilec, ko je stikalo vklopljeno / izključeno. To lahko preskočite in preprosto izvedete v programski opremi arduino z uporabo zamud ali časovnikov. Opravil sem napako strojne opreme, ker bom kmalu spremenil kodo za uporabo prekinitev in ker slednji ne omogočajo zanesljive uporabe funkcij zakasnitve / časovnika v rutini, zato sem moral zgraditi preprost vezni krog za prihodnjo uporabo. . Če želite preskočiti ta del, preprosto povežite preprosto stikalo / upor na pin 2 arduino in izvedite rutinsko programsko opremo.
Za debounce na strojni opremi:
1. 10mF elektrolitski kondenzator
2. 10K upor
3. Logika NE vrata in.e Inverter (čip 74HC04) To je šest inverterji, vendar boste potrebovali le eno.
Zgradimo ga …

Korak 3: Gradimo okvir

Uporabite lahko katerokoli škatlo, ki je primerna. Zgradil sem svoj, morda ne popoln, a še vedno zelo oseben :)
1. Uporabil sem 2 listi 5-milimetrskega BALSA lesa, zelo enostaven za uporabo z uporabo rezalnika in relativno močan zaradi njegove neverjetne lahke teže.
2. porabljene 5 cevi lepila Cyanoacrylat (znane kot močna hitro delujoča lepila)
Tukaj je:
A 22 x 14 x 14 cm škatla

4. korak: Shematski prikaz

Zgoraj je shema (narisana z uporabo Fritzinga), ki prikazuje:
Zgornji del: Glavna plošča arduino, 2 servomotorja in stikalna povezava. Upoštevajte, da kot že omenjeno, lahko zamenjate celotno vezje (top-right) s preprostim uporom / stikalom.
Tako "vrata" kot "ročni" servomotorji se napajajo neposredno iz 5v zatiča na Arduinu. Signalne žice so priključene na pin 9 in 10. Ti zatiči podpirajo PWM, zato jih uporabljam za nadzor kota / položaja servoja (od 0 do 180 stopinj max).
Opomba: rdeči gumb je samo ponastavitev (podobna tisti, ki jo najdete na obrazu plošče arduino). Dodal sem, da ima hiter dostop do ponastavitve plošče / programske opreme kadarkoli brez odpiranja škatle. Za ponastavitev preprosto povežite pin RESET na ozemljitev.
Spodnji del: potrebujete, če želite uporabiti enosmerni motor in premakniti stroj okoli njega. To je ščitnik motorja arduino, nameščen na vrhu Arduino, tako da so vsi zatiči obeh plošč povezani med seboj. Prikazujem jih spodaj kot ločeno samo zaradi jasnosti, upam! Ta ščit lahko nadzira do 2 DC motorja (2 kanala A / B) z neverjetno lahkoto. Zdaj uporabljam samo eno. Omogoča nastavitev kode, smeri, hitrosti in prekinitev kateregakoli od razpoložljivih 2 kanalov / motorjev. Uporabljam kanal B, kot je prikazano spodaj. kjer pin
13 za smer, zatič 11 za hitrost in zatič 8 za krmiljenje zavor.
Baterija je 11,1 / 1000 mA, priključena na ščit, s čimer napaja motor DC, glavno ploščo arduino in servomotorje. če ne uporabljate ščita, lahko neposredno priključite akumulator na cev za napajanje glavne plošče arduino.

5. korak: Določitev servomotorjev

Tukaj so nameščeni servomotorji za roke in vrata:
Najprej morate namestiti servomotorje na ustreznih mestih, zato potrebujete nekaj poskusov in napak, dokler ne dobite potrebnega gibanja. Uporabite lahko primer Servo iz arduino IDE, da preizkusite servomotorje in količino upogibanja, ki je potrebna za vsakega, in se tako odločite za končno pozicioniranje in dolžino rok za vrata in ročni servomotorji.
Roke so preprosto narejene iz balsa lesa, naredil sem jih debelejše, da bi zdržale nekaj solzenja.
Spodaj je, kako sem to naredil. Samo eno opombo o servo roki. Servo gred potrebujete neposredno pod robom pokrova (kot je prikazano spodaj), s čimer se izognete težavam pri roki, ki bi lahko uspešno udarila v stikalo in se lahko vrnila nazaj v škatlo.


Korak 6: Povezovanje stikala, Servos in Arduino

Vse povezave, ki so prikazane v shematskem koraku, in poskusite vstaviti vse znotraj polja, podobno tistemu, ki je prikazan zgoraj:

7. korak: Izbirno: DC motor in baterija

Zgoraj je, kako sem dal motorni menjalnik DC (vzet iz poceni RC avto), ki prikazuje tudi testo in stikalo.
Poskrbite, da bo orodje postavljeno na sredino, da bo ravnovesje v škatli, boste morda morali dati nekaj teže v škatli, da bi jo bolj uravnotežili po končni montaži, saj je baterija, ki sem jo uporabil, težka (100 gr) in povzročila nekaj pomikanja pri preklapljanju ali premikanju škatle.
Upoštevajte, da je dc motor hitrosti je nadzorovan s čepom 11, Smer z zatičem 13, in zavore na pin 8, ti štejejo za kanal B na arduino motornem ščitu.
Skozi montažo sem skušal skriti vsa žična stikala in druge komponente, da bi imela preprosto verodostojno polje. To velja tudi za kolesa, zato sem naredil obroč okoli njih, ki gosti tako kolesa kot akumulator, in omogoča tudi dostop do rdečega gumba za ponastavitev.

8. korak: Koda

Za pisanje kode za arduino potrebujete arduino IDE (prenesite ga tukaj)
Jaz sem z uporabo različice 1.0.5, samo poskrbite, da izberete pravilno COM vrata (okna) in vrsto plošče iz IDE, nato uporabite spodnjo kodo, in hit upload.
OPOMBA: Vrednosti I, ki se uporabljajo v kodi za nastavitev največje deformacije servomotorjev, so narejene natanko za to škatlo, pri čemer je treba upoštevati položaj, os in kote servomotorjev. To sem dobila skozi sojenje. Torej morate po vaši škatli in po vaši meri oblikovati svoje vrednote postavitev servo naprave.
Spodaj so navedene vrednosti min / max, ki sem jih uporabil za vsak servo, kot jih vidite v kodi:
Vrata:
80 skriva, 155 popolnoma odprta
Roka:
0 se skriva, 129 pritiska na stikalo

Tu je koda (Bolje je, da prenesete datoteko, priloženo temu koraku, namesto da kopirate / prilepite od spodaj):
#include
Servo vrataServo;
Servo handServo;
int switch_pin = 2; // nastavite stikalo na pin 2
// motorske spremenljivke
int motorThrottle = 11;
int motorDirection = 13;
int motorBrake = 8;
int pos = 0;
int selectedMove = 0; // premakni izbirnik
int Testmove = 0; // preizkusni način: nastavljen na premik številke za testiranje samo ene izbrane poteze
// (nastavljeno na Zero, da se normalno zažene, tj.
void setup ()
{
Serial.begin (9600);
pinMode (switch_pin, INPUT);
doorServo.attach (9); // nastavite servo vrata na Pin 9 pwm
handServo.attach (10); // nastavite servo ročico na Pin 10 pwm
doorServo.write (80); // nastavitev vrat za skrivanje
handServo.write (0); // nastavite roko na položaj skrivanja

// Namestitev kanala B (ker je kanal A rezerviran za vrata in ročne servore in ne more biti uporabljen istočasno)
pinMode (motorna smer, IZHOD); // Zažene pin kanala B motorja
pinMode (motorna zavora, IZHOD); // Zažene v zavorni kanal B

}

void loop ()
{
če (Testmove! = 0) {
selectedMove = Testmove;
}

// če je stikalo vklopljeno, premaknite vrata in roko, da ga izklopite …
if (digitalRead (switch_pin) == visoko)
{

if (izbrano Premakni> 10) {selectedMove = 0; } // ko se igrajo vse poteze, ponovite poteze od začetka
/ / spodaj so vse "Premakne" i zasnovan doslej, vsak je funkcija, ki je napisana spodaj v kodi, izvršiti imena, abit čudno? da, ker so nekateri napisani v arabščini
if (selectMove == 0) {switchoff (); }
else if (selectMove == 1) {switchoff (); }
tudi če (izbranoMove == 2) {switchoffbitaraddod (); }
sicer if (selectedMove == 3) {crazydoor (); }
sicer if (selectedMove == 4) {crazyslow (); }
sicer, če (izbranoMove == 5) {m7anika7anika (); }
tudi če (izbrano = = 6) {m3alla2 (); }
else if (selectedMove == 7) {switchoff (); }
sicer if (selectedMove == 8) {matrix (); }
tudi če (izbranoMove == 9) {sneak (); }
sicer if (selectedMove == 10) {zee7 (); }

če (Testmove == 0) {
selectedMove ++; // se preklopi na naslednjo potezo, če ni v testnem načinu
}
}
}

// Knjižnica premikov
// osnovna poteza
void preklop ()
{
// Premikanje vrat
za (pos = 80; poz <155; pos = 3)
{
doorServo.write (pos);
zamuda (15);
}

// Premikajoča se roka
za (pos = 0; pos <129; pos = 4)
{
handServo.write (pos);
zamuda (15);
}

// skriva roko
za (pos = 129; pos> = 0; poz = 4)
{
handServo.write (pos);
zamuda (15);
}

// vrata za skrivanje
za (pos = 155; pos> = 80; poz = 3)
{
doorServo.write (pos);
zamuda (15);
}
}

// premaknite 3: odprite in počakajte, nato premaknite roko in počakajte, nato preklopite in se skrijte
void switchoffbitraddod ()
{
// Premikanje vrat
za (pos = 80; poz <155; pos = 3)
{
doorServo.write (pos);
zamuda (15);
}
zamuda (800);
// Premikajoča se roka
za (pos = 0; pos <100; pos = 4)
{
handServo.write (pos);
zamuda (15);
}
zamuda (1000);
za (pos = 100; pos <129; pos = 4)
{
handServo.write (pos);
zamuda (15);
}

// skriva roko
za (pos = 129; pos> = 0; poz = 5)
{
handServo.write (pos);
zamuda (15);
}

// vrata za skrivanje
za (pos = 155; pos> = 80; poz = 3)
{
doorServo.write (pos);
zamuda (15);


}

}

// premaknite 4: odprite vrata in jih zaprite večkrat, počakajte, nato hitro ponovno odprite in izklopite in se skrijte.

void crazydoor ()
{

// Premikanje vrat
za (pos = 80; poz <125; pos = 3)
{
doorServo.write (pos);
zamuda (15);
}

// vrata za skrivanje
za (pos = 125; pos> = 80; poz = 5)
{
doorServo.write (pos);
zamuda (15);
}
// Premikanje vrat
za (pos = 80; poz <110; pos = 3)
{
doorServo.write (pos);
zamuda (15);
}

// vrata za skrivanje
za (pos = 110; pos> = 80; poz = 15)
{
doorServo.write (pos);
zamuda (15);
}
zamuda (700);
// Premikanje vrat
za (pos = 80; poz <125; pos = 3)
{
doorServo.write (pos);
zamuda (15);
}
zamuda (700);
// vrata za skrivanje
za (pos = 125; pos> = 80; poz = 5)
{
doorServo.write (pos);
zamuda (15);
}

// ---- preklopa ---- //
// Premikanje vrat
za (pos = 80; poz <155; pos = 8)
{
doorServo.write (pos);
zamuda (15);
}

// Premikajoča se roka
za (pos = 0; pos <129; pos = 3)
{
handServo.write (pos);
zamuda (15);
}

// skriva roko
za (pos = 129; pos> = 0; poz = 3)
{
handServo.write (pos);
zamuda (15);
}

// vrata za skrivanje
za (pos = 155; pos> = 80; poz = 15)
{
doorServo.write (pos);
zamuda (15);
}

}

// premaknite 5: odprite vrata, nato premaknite roko zelo počasi naprej in nazaj do skrivanja zelo počasi, nato pa hitro zaprite vrata
void crazyslow ()
{
// Premikanje vrat
za (pos = 80; poz <155; pos = 1)
{
doorServo.write (pos);
zamuda (30);
}

// Premikajoča se roka
za (pos = 0; pos <129; pos = 1)
{
handServo.write (pos);
zamuda (30);
}

// skriva roko
za (pos = 129; pos> = 0; poz = 1)
{
handServo.write (pos);
zamuda (30);
}

// vrata za skrivanje
za (pos = 155; pos> = 125; poz = 1)
{
doorServo.write (pos);
zamuda (30);
}
zamuda (100);
za (pos = 125; pos> = 80; poz = 4)
{
doorServo.write (pos);
zamuda (15);
}

}
// premakni 6:
void m7anika7anika () {
// Premikanje vrat
za (pos = 80; poz <155; pos = 3)
{
doorServo.write (pos);
zamuda (15);
}

// Premikajoča se roka
za (pos = 0; pos <70; pos = 1)
{
handServo.write (pos);
zamuda (15);
}
zamuda (800);


// vrata za skrivanje
za (pos = 155; pos> = 130; poz = 3)
{
doorServo.write (pos);
zamuda (15);
}

// vrata za skrivanje
za (pos = 130; pos <155; pos = 3)
{
doorServo.write (pos);
zamuda (15);
}
// vrata za skrivanje
za (pos = 155; pos> = 130; poz = 3)
{
doorServo.write (pos);
zamuda (15);
}
// vrata za skrivanje
za (pos = 130; pos <155; pos = 3)
{
doorServo.write (pos);
zamuda (15);
}

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

// Premikajoča se roka
za (pos = 40; pos <129; pos = 4)
{
handServo.write (pos);
zamuda (15);
}

// skriva roko
za (pos = 129; pos> = 0; poz = 4)
{
handServo.write (pos);
zamuda (15);
}


za (pos = 120; pos> = 80; poz - = 1)
{
doorServo.write (pos);
zamuda (15);
}



}
void m3alla2 () {
// Premikanje vrat
za (pos = 80; poz <155; pos = 3)
{
doorServo.write (pos);
zamuda (15);
}

// Premikajoča se roka
za (pos = 0; pos <127; pos = 4)
{
handServo.write (pos);
zamuda (15);
}
// vrata za skrivanje
za (pos = 155; pos> = 130; poz = 3)
{
doorServo.write (pos);
zamuda (15);
}
zamuda (2000);

za (pos = 130; pos <155; pos = 3)
{
doorServo.write (pos);
zamuda (15);
}

za (pos = 155; pos> = 140; poz = 3)
{
doorServo.write (pos);
zamuda (15);
}
za (pos = 140; poz <155; pos = 3)
{
doorServo.write (pos);
zamuda (15);
}
zamuda (500);
// skriva roko
za (pos = 127; pos> = 0; poz = 4)
{
handServo.write (pos);
zamuda (15);
}

// vrata za skrivanje
za (pos = 155; pos> = 80; poz = 3)
{
doorServo.write (pos);
zamuda (15);
}
}

void matrix ()
{
// Premikanje vrat
za (pos = 80; poz <155; pos = 3)
{
doorServo.write (pos);
zamuda (15);
}

// Premikajoča se roka
za (pos = 0; pos <80; pos = 4)
{
handServo.write (pos);
zamuda (15);
}

za (pos = 80; poz <129; pos = 1)
{
handServo.write (pos);
zamuda (30);
}
zamuda (300);

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

// vrata za skrivanje
za (pos = 155; pos> = 80; poz = 3)
{
doorServo.write (pos);
zamuda (15);
}

}
void sneak ()
{
// Premikanje vrat
za (pos = 80; poz <130; pos = 1)
{
doorServo.write (pos);
zamuda (30);
}
zamuda (2000);

// Premikajoča se roka
za (pos = 0; pos <40; pos = 1)
{
handServo.write (pos);
zamuda (30);
}

zamuda (500);

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

za (pos = 40; poz <90; pos = 4)
{
handServo.write (pos);
zamuda (15);
}
zamuda (500);
// skriva roko
za (pos = 90; pos> = 70; poz = 4)
{
handServo.write (pos);
zamuda (15);
}
zamuda (100);
za (pos = 70; pos <90; pos = 4)
{
handServo.write (pos);
zamuda (15);
}
zamuda (100);
za (pos = 90; pos> = 70; poz = 4)
{
handServo.write (pos);
zamuda (15);
}
zamuda (100);

za (pos = 70; pos <129; pos = 4)
{
handServo.write (pos);
zamuda (15);
}

za (pos = 129; pos> = 0; poz = 4)
{
handServo.write (pos);
zamuda (15);
}
// vrata za skrivanje
za (pos = 155; pos> = 80; poz = 3)
{
doorServo.write (pos);
zamuda (15);
}
}


void zee7 ()
{
// Premikanje vrat
za (pos = 80; poz <155; pos = 3)
{
doorServo.write (pos);
zamuda (15);
}
zamuda (2000);
// naprej @ polovica hitrosti na levo
digitalWrite (motorDirection, LOW); // Določi RIGHT smer kanala B
digitalWrite (motorna zavora, LOW); // Sprostite zavoro za kanal B
analogNapis (motorTrottle, 100); // Zavrti motor na kanalu B s polno hitrostjo
zamuda (300);
digitalWrite (motorna zavora, HIGH); // Sprostite zavoro za kanal B
zamuda (2000);

// nazaj @ polovica hitrosti v desno
digitalWrite (motorDirection, HIGH); // Vzpostavi levo smer kanala B
digitalWrite (motorna zavora, LOW); // Sprostite zavoro za kanal B
analogNapis (motorTrottle, 100); // Zavrti motor na kanalu B s polovično hitrostjo
zamuda (300);
digitalWrite (motorna zavora, HIGH); // Sprostite zavoro za kanal B
zamuda (1000);

// Premikajoča se roka
za (pos = 0; pos <129; pos = 4)
{
handServo.write (pos);
zamuda (15);
}

// skriva roko
za (pos = 129; pos> = 0; poz = 4)
{
handServo.write (pos);
zamuda (15);
}

// vrata za skrivanje
za (pos = 155; pos> = 80; poz = 3)
{
doorServo.write (pos);
zamuda (15);
}
}


9. korak: Izbirna posodobitev: zaznavanje gibanja

Danes imam senzor bližine (GP2Y0A21), tako da ga lahko zdaj uporabim za premikanje stroja, če uporabnik pristopi k preklopniku :)
Za ta dodatni korak predvidevam, da ste že izdelali kolesa, ki omogočajo gibanje (glej izbirni korak 8). Vse kar je ostalo je, da dodate senzor in naredite nekaj sprememb v kodi za zaznavanje gibanja.
Tipalo ima 3 žice, na katero je priključena rumena signalna žica pin 3 na arduino, medtem ko rdeča in Črna so povezani z v5 in tla na tabli.
Namestil sem senzor, ki je skrit pod vrati, kot je prikazano na sliki, tako da lahko "vidi" gibanje uporabnika le, ko se vrata odprejo. točno to, kar potrebujem!
Prav tako sem moral spremeniti kodo bit (tukaj) za izvedbo rutine za odkrivanje gibanja (glej kodo, v funkciji zee7 () ), tako da se, ko se odkrije gibanje, škatla premakne, najprej v desno, nato v levo, potem roka obrne stikalo in se skrije. Koda je močno komentirana, upam, da nisem pretiraval!
Spodaj najdete posodobljeno kodo, prav tako upoštevajte, da sem napravo napravo naključno izbiral, to pa lahko spremenite nazaj v sekvenco s preprosto nastavitvijo boolean randomize = false;
Hvala vsem za vaše odlične predloge!
Koda (Bolje je, da prenesete datoteko, priloženo temu koraku, namesto da kopirate / prilepite od spodaj):
#include
Servo vrataServo;
Servo handServo;
nepodpisano dolgo TimerA, TimerB; // timer za rutinsko zaznavanje gibanja
int switch_pin = 2; // nastavite stikalo na pin 2
// motorske spremenljivke
int motorThrottle = 11;
int motorDirection = 13;
int motorBrake = 8;
// Različne razdalje
int motionPin = 3; // pin senzorja gibanja na analogni 0
int lastDist = 0; // zapomniti si zadnjo razdaljo
int currentDist = 0;
int thresh = 200; // Prag za gibanje (nastavite ga tako, da dobite želeno občutljivost zaznavanja gibanja)

int pos = 0;
int selectedMove = 0; // premakni izbirnik
int Testmove = 0; // preizkusni način: nastavljen na premik številke za testiranje samo ene izbrane poteze
// (nastavite na Zero, da se normalno zažene, tj.
boolean randomize = true; // če je res, bo polje naredilo naključno prestavljanje, če je nastavljeno na false, bodo poteze potekale sekvenčno od 1 do 10

void setup ()
{
Serial.begin (9600);
pinMode (switch_pin, INPUT);
doorServo.attach (9); // nastavite servo vrata na Pin 9 pwm
handServo.attach (10); // nastavite servo ročico na Pin 10 pwm
doorServo.write (80); // nastavitev vrat za skrivanje
handServo.write (0); // nastavite roko na položaj skrivanja
// Namestitev kanala B, ker je kanal A rezerviran za vrata in ročne servore in ne more biti uporabljen istočasno
pinMode (motorna smer, IZHOD); // Zažene pin kanala B motorja
pinMode (motorna zavora, IZHOD); // Zažene v zavorni kanal B

}

void loop ()
{
// če je stikalo vklopljeno, premaknite vrata in roko, da ga izklopite …
if (digitalRead (switch_pin) == visoko)
{

če (Testmove == 0)
{

če (randomize == false)
{
if (izbrano Premakni> 10)
{
selectedMove = 0; // ko se predvajajo vse poteze, ponovite poteze od začetka
}
}
drugače
{
selectedMove = naključno (11);
}
}
drugače
{
selectedMove = Testmove;
}
Serial.println (izbrano Premakni);
if (selectMove == 0) {switchoff (); }
else if (selectMove == 1) {switchoff (); }
tudi če (izbranoMove == 2) {switchoffbitaraddod (); }
sicer if (selectedMove == 3) {crazydoor (); }
sicer if (selectedMove == 4) {crazyslow (); }
sicer, če (izbranoMove == 5) {m7anika7anika (); }
tudi če (izbrano = = 6) {m3alla2 (); }
else if (selectedMove == 7) {switchoff (); }
sicer if (selectedMove == 8) {matrix (); }
tudi če (izbranoMove == 9) {sneak (); }
sicer if (selectedMove == 10) {zee7 (); }

če (Testmove == 0 && randomize == false) {
selectedMove ++; // se preklopi na naslednji korak, če ni v testnem načinu
}
}
}
// Knjižnica premikov
// osnovna poteza
void preklop ()
{
// Premikanje vrat
za (pos = 80; poz <155; pos = 3)
{
doorServo.write (pos);
zamuda (15);
}

// Premikajoča se roka
za (pos = 0; pos <129; pos = 4)
{
handServo.write (pos);
zamuda (15);
}

// skriva roko
za (pos = 129; pos> = 0; poz = 4)
{
handServo.write (pos);
zamuda (15);
}

// vrata za skrivanje
za (pos = 155; pos> = 80; poz = 3)
{
doorServo.write (pos);
zamuda (15);
}
}

// premaknite 3: odprite in počakajte, nato premaknite roko in počakajte, nato preklopite in se skrijte
void switchoffbitraddod ()
{
// Premikanje vrat
za (pos = 80; poz <155; pos = 3)
{
doorServo.write (pos);
zamuda (15);
}
zamuda (800);
// Premikajoča se roka
za (pos = 0; pos <100; pos = 4)
{
handServo.write (pos);
zamuda (15);
}
zamuda (1000);
za (pos = 100; pos <129; pos = 4)
{
handServo.write (pos);
zamuda (15);
}

// skriva roko
za (pos = 129; pos> = 0; poz = 5)
{
handServo.write (pos);
zamuda (15);
}

// vrata za skrivanje
za (pos = 155; pos> = 80; poz = 3)
{
doorServo.write (pos);
zamuda (15);


}

}

// premaknite 4: odprite vrata in jih zaprite večkrat, počakajte, nato hitro ponovno odprite in izklopite in se skrijte.

void crazydoor ()
{

// Premikanje vrat
za (pos = 80; poz <125; pos = 3)
{
doorServo.write (pos);
zamuda (15);
}

// vrata za skrivanje
za (pos = 125; pos> = 80; poz = 5)
{
doorServo.write (pos);
zamuda (15);
}
// Premikanje vrat
za (pos = 80; poz <110; pos = 3)
{
doorServo.write (pos);
zamuda (15);
}

// vrata za skrivanje
za (pos = 110; pos> = 80; poz = 15)
{
doorServo.write (pos);
zamuda (15);
}
zamuda (700);
// Premikanje vrat
za (pos = 80; poz <125; pos = 3)
{
doorServo.write (pos);
zamuda (15);
}
zamuda (700);
// vrata za skrivanje
za (pos = 125; pos> = 80; poz = 5)
{
doorServo.write (pos);
zamuda (15);
}

// ---- preklopa ---- //
// Premikanje vrat
za (pos = 80; poz <155; pos = 8)
{
doorServo.write (pos);
zamuda (15);
}

// Premikajoča se roka
za (pos = 0; pos <129; pos = 3)
{
handServo.write (pos);
zamuda (15);
}

// skriva roko
za (pos = 129; pos> = 0; poz = 3)
{
handServo.write (pos);
zamuda (15);
}

// vrata za skrivanje
za (pos = 155; pos> = 80; poz = 15)
{
doorServo.write (pos);
zamuda (15);
}

}

// premaknite 5: odprite vrata, nato premaknite roko zelo počasi naprej in nazaj do skrivanja zelo počasi, nato pa hitro zaprite vrata
void crazyslow ()
{
// Premikanje vrat
za (pos = 80; poz <155; pos = 1)
{
doorServo.write (pos);
zamuda (30);
}

// Premikajoča se roka
za (pos = 0; pos <129; pos = 1)
{
handServo.write (pos);
zamuda (30);
}

// skriva roko
za (pos = 129; pos> = 0; poz = 1)
{
handServo.write (pos);
zamuda (30);
}

// vrata za skrivanje
za (pos = 155; pos> = 125; poz = 1)
{
doorServo.write (pos);
zamuda (30);
}
zamuda (100);
za (pos = 125; pos> = 80; poz = 4)
{
doorServo.write (pos);
zamuda (15);
}

}
// premakni 6:
void m7anika7anika () {
// Premikanje vrat
za (pos = 80; poz <155; pos = 3)
{
doorServo.write (pos);
zamuda (15);
}

// Premikajoča se roka
za (pos = 0; pos <70; pos = 1)
{
handServo.write (pos);
zamuda (15);
}
zamuda (800);


// vrata za skrivanje
za (pos = 155; pos> = 130; poz = 3)
{
doorServo.write (pos);
zamuda (15);
}

// vrata za skrivanje
za (pos = 130; pos <155; pos = 3)
{
doorServo.write (pos);
zamuda (15);
}
// vrata za skrivanje
za (pos = 155; pos> = 130; poz = 3)
{
doorServo.write (pos);
zamuda (15);
}
// vrata za skrivanje
za (pos = 130; pos <155; pos = 3)
{
doorServo.write (pos);
zamuda (15);
}

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

// Premikajoča se roka
za (pos = 40; pos <129; pos = 4)
{
handServo.write (pos);
zamuda (15);
}

// skriva roko
za (pos = 129; pos> = 0; poz = 4)
{
handServo.write (pos);
zamuda (15);
}


za (pos = 120; pos> = 80; poz - = 1)
{
doorServo.write (pos);
zamuda (15);
}



}
void m3alla2 () {
// Premikanje vrat
za (pos = 80; poz <155; pos = 3)
{
doorServo.write (pos);
zamuda (15);
}

// Premikajoča se roka
za (pos = 0; pos <127; pos = 4)
{
handServo.write (pos);
zamuda (15);
}
// vrata za skrivanje
za (pos = 155; pos> = 130; poz = 3)
{
doorServo.write (pos);
zamuda (15);
}
zamuda (2000);

za (pos = 130; pos <155; pos = 3)
{
doorServo.write (pos);
zamuda (15);
}

za (pos = 155; pos> = 140; poz = 3)
{
doorServo.write (pos);
zamuda (15);
}
za (pos = 140; poz <155; pos = 3)
{
doorServo.write (pos);
zamuda (15);
}
zamuda (500);
// skriva roko
za (pos = 127; pos> = 0; poz = 4)
{
handServo.write (pos);
zamuda (15);
}

// vrata za skrivanje
za (pos = 155; pos> = 80; poz = 3)
{
doorServo.write (pos);
zamuda (15);
}
}

void matrix ()
{
// Premikanje vrat
za (pos = 80; poz <155; pos = 3)
{
doorServo.write (pos);
zamuda (15);
}

// Premikajoča se roka
za (pos = 0; pos <80; pos = 4)
{
handServo.write (pos);
zamuda (15);
}

za (pos = 80; poz <129; pos = 1)
{
handServo.write (pos);
zamuda (30);
}
zamuda (300);

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

// vrata za skrivanje
za (pos = 155; pos> = 80; poz = 3)
{
doorServo.write (pos);
zamuda (15);
}

}
void sneak ()
{
// Premikanje vrat
za (pos = 80; poz <130; pos = 1)
{
doorServo.write (pos);
zamuda (30);
}
zamuda (2000);

// Premikajoča se roka
za (pos = 0; pos <40; pos = 1)
{
handServo.write (pos);
zamuda (30);
}

zamuda (500);

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

za (pos = 40; poz <90; pos = 4)
{
handServo.write (pos);
zamuda (15);
}
zamuda (500);
// skriva roko
za (pos = 90; pos> = 70; poz = 4)
{
handServo.write (pos);
zamuda (15);
}
zamuda (100);
za (pos = 70; pos <90; pos = 4)
{
handServo.write (pos);
zamuda (15);
}
zamuda (100);
za (pos = 90; pos> = 70; poz = 4)
{
handServo.write (pos);
zamuda (15);
}
zamuda (100);

za (pos = 70; pos <129; pos = 4)
{
handServo.write (pos);
zamuda (15);
}

za (pos = 129; pos> = 0; poz = 4)
{
handServo.write (pos);
zamuda (15);
}
// vrata za skrivanje
za (pos = 155; pos> = 80; poz = 3)
{
doorServo.write (pos);
zamuda (15);
}
}

// ta premik bo odprl vrata in čakal na premik, če bo zaznan v bližini stikala,
// škatla se bo premaknila najprej v desno, nato pa v levo, in končno se roka premakne in izklopi stikalo
void zee7 ()
{

//odprta vrata
za (pos = 80; poz <155; pos = 3)
{
doorServo.write (pos);
zamuda (15);
}
zakasnitev (1200); // po odpiranju vrat počakamo, da se vrednosti senzorjev stabilizirajo

// nastavimo časovnik in odčitamo senzor
// počakajte na premik, ki presega prag, ali če časovnik poteče (5 sekund),
lastDist = analogRead (motionPin);
TimerA = millis ();

medtem ko (millis () - TimerA <= 5000)
{
currentDist = analogRead (motionPin);

/ Ali trenutna razdalja odstopa od zadnje razdalje za več kot prag?
// če je odgovor pritrdilen, premaknite polje desno
if ((currentDist> lastDist thresh || currentDist <lastDist - thresh) || currentDist> 300)
{
// naprej @ polovica hitrosti na levo (izberite hitrost in zakasnitev
// (npr. zamuda (300) glede na vaše polje in napetost akumulatorja, tako da je zaželeno premikanje)
digitalWrite (motorDirection, LOW); // Določi RIGHT smer kanala A
digitalWrite (motorna zavora, LOW); // Sprostite zavoro za kanal B
analogNapis (motorTrottle, 100); // Zavrti motor na kanalu B s polno hitrostjo
zamuda (300);
digitalWrite (motorna zavora, HIGH); // Sprostite zavoro za kanal B
odmor;
}
lastDist = trenutniDist;
}

// nastavimo časovnik in odčitamo senzor
// počakajte na premik, ki presega prag, ali če časovnik poteče (5 sekund),
zakasnitev (1200); // po odpiranju vrat počakamo, da se vrednosti senzorjev stabilizirajo
lastDist = analogRead (motionPin);
TimerB = millis ();
medtem ko (millis () - TimerB <= 5000)
{
currentDist = analogRead (motionPin);
// se je polje že premaknilo v desno in trenutna razdalja odstopa od zadnje razdalje za več kot prag?
// Če je odgovor da, potem se premaknite na levo
if ((currentDist> lastDist thresh || currentDist <lastDist - thresh) || currentDist> 300)
{
// nazaj @ polovica hitrosti v desno (izberite hitrost in zakasnitev
// (npr. zamuda (300) glede na vaše polje in napetost akumulatorja, tako da je zaželeno premikanje)
digitalWrite (motorDirection, HIGH); // Vzpostavi levo smer kanala B
digitalWrite (motorna zavora, LOW); // Sprostite zavoro za kanal B
analogNapis (motorTrottle, 100); // Zavrti motor na kanalu B s polovično hitrostjo
zamuda (300);
digitalWrite (motorna zavora, HIGH); // Sprostite zavoro za kanal B
odmor;
}

lastDist = trenutniDist;

}
zamuda (100);
// Premikajoča se roka
za (pos = 0; pos <130; pos = 4)
{
handServo.write (pos);
zamuda (15);
}

// skriva roko
za (pos = 130; pos> = 0; poz = 4)
{
handServo.write (pos);
zamuda (15);
}

// vrata za skrivanje
za (pos = 155; pos> = 80; poz = 3)
{
doorServo.write (pos);
zamuda (15);
}
}

3 ljudi so naredili ta projekt!

  • AndyC159 je uspelo!

  • SamL84 je uspel!

  • melton1313 je uspelo!

Ste naredili ta projekt? Delite ga z nami!

Priporočila

  • Stroj za sortiranje vijakov

  • PCB BOT (sledenje linijam, preprečevanje ovir in robot, krmiljen s tehnologijo Bluetooth v enem tiskanem vezju)

  • Razred interneta stvari

  • Barve tekmovanja Rainbow

  • Natečaj Fandom

  • Party Challenge

194 Razprave

0

zaslišujejo

Pred 4 leti na uvodu

Hvala za to! Svoj prvi Arduino projekt sem naredil na podlagi tega poučnega: nekoristnega zmaja!

4 odgovorov 0

Ajannzaslišujejo

Odgovori pred 3 leti

Vaš zmaj stroj je super. !!! Umetniško

0

TJAOkevinzaslišujejo

Odgovori pred 3 leti

Super !!!!!

0

riachizaslišujejo

Odgovori Pred 4 leti na Uvod

Ti si neverjeten :) !!!

Velika osebnost za Zmaja! Želim si, da lahko ponavljate videoposnetek, medtem ko je zmaj neposredno obrnjen proti fotoaparatu (top-view), čutim, da bo to smešno, zato si oglejte jezik, da se potika ven!

Hvala, ker ste delili svoj videoposnetek in sem vesel, da mi je pomagal

0

zaslišujejoriachi

Odgovori Pred 4 leti na Uvod

Poskušal sem pogled od zgoraj v zgodnejši fazi, vendar ni deloval (videl preveč grdo notranjost), zato sem ga zavrnil, ko sem vzel ta video. Mislim, da imate prav: v zadnji fazi bi bilo videti super! Žal sem zmaja že odnesel … Torej na naslednji projekt!

0

br1pro

pred 4 leti

Zelo zabavno! težko delati s pritrditvijo servomotorjev in oblikovati roko. Hvala za ta navodila!

1 odgovor 0

riachibr1pro

Odgovori Pred 4 leti na Uvod

Odličen delavec! res lepo :) kateri koli video?

0

clincoln

pred 5 leti

Najprej si oglejte videoposnetek in se smejite

1 odgovor 0

TobiasVclincoln

Odgovori Pred 4 leti na Uvod

Vem, da sem! : D

0

rileyw

pred 5 leti

Super kul video je bilo videti, kot da je imel svoj um

0

Elitekilla117

Pred petimi leti na uvodu

Moj neuporaben stroj z arduino in riachis kodo! Iz tardisa od Dr.who. :)
http://www.youtube.com/watch?v=aDs0T52o6-M

2 odgovorov 0

riachiElitekilla117

Odgovori Pred 5 leti na Uvod

VŠEČ MI JE!!!! :)) Zelo dobro opravljen človek, tako vesel, da vidim vaš bombo živ! Jaz tudi dramatizacijo in glasbo: p samo ne morem ustaviti, da predlagam 3 majhne spremembe, če lahko :)?
- bi bilo super, če bi stroj postavili v stoječi položaj, vem, da bo to povzročilo izgubo pomoči pri gravitaciji, da bi zaprli vrata, a preprosta rešitev je, da položite 2 gumijaste trakove, pritrjene na notranjo stran vrat na eni strani in na notranji strani škatle za drugi konec, se bodo vrata zaprla, ko se servo vrata zaprejo … preverite moje korake gradnje, videli boste gumo v koraku 6 …
- tudi kaj o barvanju rok v črni barvi, bo bolj prikrito in gladko
! Tudi ročno konico lahko pobarvamo v krvavih rdečih barvah ali okrasimo z norim obrazom ali podobnim.
- odstranite zadnjo potezo, ker se v njej ne zgodi nič (naj bi bila tista, ki premakne polje), in napišite lastno potezo …
Kljub temu pozabite na predloge, ljubil sem vaše machineeee! In hvala za toliko hvala človeku, prosim, da jih lahko zmanjšate in ohranite video osredotočen na stroj :)
Upam, da je vaš gf všeč!

0

Elitekilla117riachi

Odgovori Pred 5 leti na Uvod

Hahah Hvala za pohvale :) Pravzaprav sem hotel narediti veliko več za to, vendar zaradi časovnega krča nisem mogel priti v veliko podrobnosti, ki sem jih hotel. Rada bi dodala barvo orožju, vendar nisem imela časa za te. In želel sem narisati obraz z roko, vendar je bil že oblečen in pripravljen dati ji za božič. Hehehe. Mislim, da ji bo všeč. Prav tako sem si želel, da bi se vstal, vendar se je bal, da bi gumijasti trakovi preveč obremenili servomotorje. Vrata so že precej težka. Zadnja poteza, ki sem jo zadržala, ker vas drži v napetosti in čakajo, da se bo iztekla. Hahaha, vendar cenim vso pomoč mojemu prijatelju! Definitivno vredno!

0

chuckletushy

pred 5 leti

To moram narediti … to je super

0

wrs715

Pred petimi leti na uvodu

To je prvi projekt, ki sem ga videl z Arduinom, kjer sem pomislil: "Ja, to je vredno. Zdaj moram dobiti eno." Fantastična služba!

0

siliconghost

Pred petimi leti na uvodu

Vau, super prevzame skupen projekt! Všeč mi je, da se zavrtite in naredite bolj zanimivo!

0

bob3030

pred 5 leti

Neuporabna naprava enega človeka je popolnoma drugačen, iz tega sveta, si bomo izmislili, zabavno, da bi jih želeli mnogi, neuporabni pripomočki. Hvala za posodobitve projekta. Hvala za objavo.

0

Vobler

Pred petimi leti na uvodu

Misel 1: Uporaba Arduino za to je samo smešno pretiravanje
Misel 2: Po ogledu videa - Uporaba Arduina za to je samo čisti genij!
Klanjam se vaši ustvarjalnosti!

0

stumitch

Pred petimi leti na uvodu

To je res veliko! Nekako me spominja na Wall-E osebnost. Hvala za tako dober projekt!

0

gazilabajti

Pred petimi leti na uvodu

Resnično neuporabna! Lepo. Navdihnjen sem in moram zgraditi eno za svojo mizo. Hvala.