Circuite

Cum se construiește o altă mașină inutilă: ușor de făcut și greu de folosit: 9 pași (cu imagini)

EASY Crochet Tank Top with Hood | Pattern & Tutorial DIY

EASY Crochet Tank Top with Hood | Pattern & Tutorial DIY

Cuprins:

Anonim

Sunt construite atât de multe mașini inutile, de ce să construim altul? Pur și simplu, este foarte distractiv :), distracție de a construi și distracție de a juca cu.
Am încercat să dau acestei versiuni un personaj, așa cum am simțit întotdeauna că există cineva "gândindu-se în cutie", așa că am încercat, sper că am reușit să-i dau "o" viață!
Sunt foarte fericit să vă împărtășesc toți pașii, cu toate speranțele că vă veți construi cu ușurință a voastră și că veți avea un caracter amar sau mai bun! Versiunea mea se bazează pe Arduino, poate crezi că este o depășire, dar având în vedere flexibilitatea pe care mi-o dă, cred că merită.
Iată un videoclip despre tot ceea ce se pune împreună. Mai târziu, ne vom muta în părți, pași, scheme și cod
Anunțați-mi comentariile și / sau întrebările dvs. dacă există.
Sper sa iti placa!
f.

Furnituri:

Pasul 1: Cum funcționează?

Totul este conectat la o placă Arduino, bordul așteaptă până când comutatorul este setat la logica HIGH, adică atunci când faceți clic pe comutator, bordul semnalează două servomotoare pentru a se deplasa într-un mod specific (mai târziu mai târziu), după care , servomotorul conectat la "mână" va mișca comutatorul înapoi în poziția OFF și va reveni înapoi în cutie, urmat de servo "ușă". atunci totul se repetă.
Dacă ați văzut videoclipul de mai sus, de fiecare dată când comutatorul este comutat, aparatul răspunde într-un mod diferit, și acest lucru se face prin simpla scriere a diferitelor funcții cu diferite sincronizări în codul Arduino (le numesc "Mută"). De fiecare dată când comutatorul se schimbă, chem o nouă mișcare până când totul se termină, încep din nou. rețineți că la pasul 9 am oferit o altă versiune a codului care sortează mișcări aleatorii în loc de secvențiale. Puteți adăuga cât de multe mișcări doriți, atâta timp cât aveți destulă memorie pe Arduino.
Arduino este mereu pornit, de aceea am adăugat un comutator pentru bateria pentru a economisi energie când mașina nu este utilizată. Am deja planificat să folosesc o întrerupere pe comutator, în loc de detectarea curentă HIGH / LOW simplă și să o cuplez cu modul sleep. Acest lucru va economisi energie atunci când aparatul nu este utilizat și, de asemenea, permițându-l să fie întotdeauna gata (dar acest lucru va complica, de asemenea, codul) Deci, pentru moment, este doar un simplu comutator ON / OFF, iar placa este întotdeauna alimentat .

Pasul 2: piesele

Vei avea nevoie:
Obligatoriu:
1. O cutie
2. Orice placă Arduino cu ieșiri PWM (se întâmplă să aibă o veche în jurul valorii de, Diecimila)
3. Două servomotoare standard RC (am folosit modelul Futaba - S3003, au un cuplu de 3,2 kg / cm, mai mult decât suficient pentru a mișca ușa sau mâna)
4. Un acumulator de 6-12 V (am folosit bateria cu baterie AR, este de 11.1 v / 1000 mA)
3. Un comutator SPTT sau SPST pentru declanșator (practic, orice comutator care vă convine!)
5. Un alt comutator pentru baterie
6. Un buton de resetare a Arduino în cazul în care doriți să reporniți mișcările / codul de sus.
7. Unele cabluri de jumperi

Opțional:
În cazul în care doriți să proiectați o mișcare care include mișcarea casetei în jurul acesteia (ca ultima mișcare din videoclip), puteți obține:
1. Un scut motor Arduino, acest lucru va fi, de asemenea, la îndemână pentru alte proiecte (sau puteți proiecta un H-bridge singur, căutați-l)
2. O mașină ieftină RC, astfel încât să puteți lua motorul DC și cutia de viteze
Mai mult, încă în secțiunea "opțională", am construit un circuit de dezaburire hardware pentru a avea un declanșator curat când comutatorul este pornit / oprit. Acest lucru poate fi omis și poate fi ușor implementat în software-ul arduino folosind întârzieri sau cronometre. Am făcut hardware debounce, pentru că voi schimba în curând codul de a utiliza întreruperi, și deoarece acestea din urmă nu permit utilizarea fiabilă a funcțiilor de întârziere / cronometru în rutină, așa că am avut de a construi un simplu circuit de-bounce pentru utilizare viitoare . Dacă doriți să săriți peste această parte, atunci conectați un simplu comutator / rezistor la pinul 2 al arduino și implementați o rutină de debunare a software-ului.
Pentru hardware:
1. Condensator electrolitic de 10mF
2. rezistor 10K
3. O logică NOT gate i.e Inverter (chip 74HC04) Aceasta are șase invertoare, dar veți avea nevoie doar de unul.
Să construim …

Pasul 3: Construirea cutiei

Puteți utiliza orice casetă pe care o considerați potrivită. Am construit a mea, poate nu perfect, dar încă mult personal :)
1. Am folosit 2 foi de lemn de 5 mm BALSA, foarte usor de folosit cu un cutter, si relativ puternic datorita greutatii sale incredibile.
2. Consumate 5 tuburi de clei cianoacrilat (adezivi puternici cu acțiune rapidă)
Aici este:
A 22 x 14 x 14 cm cutie

Pasul 4: Schema

Mai sus este schematică (desenată folosind Fritzing), care arată:
Top parte: Placa principală arduino, 2 servoare și conectivitate pentru comutatoare. Rețineți că, așa cum am menționat mai sus, puteți înlocui întregul circuit de debounce (sus-dreapta) cu un simplu rezistor / comutator.
Servo-urile "ușă" și "mâini" sunt alimentate direct de la pinul 5v de pe Arduino. Cablurile de semnal sunt conectate la pinul 9 și, respectiv, 10. Aceste pini suportă PWM, așadar le folosesc pentru a controla unghiul / poziția servo (de la 0 la 180 grade max).
Notă: butonul roșu este doar o resetare (similară cu cea de pe fața plăcii arduino). Am adăugat-o pentru a avea acces rapid la resetarea placii / software-ului în orice moment fără a deschide caseta. Conectați simplu știftul RESET la Terminal pentru a efectua resetarea.
Partea de jos: dacă doriți să utilizați un motor de curent continuu și să mutați aparatul în jurul acestuia. Acesta este scutul motor arduino, este montat pe vârful arduinului, astfel încât toți pinii ambelor placi sunt conectați unul la celălalt. Îi arăt mai jos ca fiind separat doar pentru claritate, sperăm! Acest scut poate controla până la 2 motoare de curent continuu (2 canale A / B) cu o ușurință incredibilă. Eu folosesc acum doar unul. Permite setarea în cod, direcția, viteza și pauzele oricăruia dintre cele 2 canale / motoare disponibile. Folosesc canalul B după cum se arată mai jos. unde pinul
13 pentru direcție, pinul 11 ​​pentru viteză și pinul 8 pentru controlul frânelor.
Bateria este de 11,1 / 1000 mA, conectată la ecran, alimentând astfel motorul DC, placa principală arduino și serverele. dacă nu utilizați scutul, atunci puteți conecta direct bateria la cilindrul de alimentare de pe placa principală arduino.

Pasul 5: Fixarea servomotoarelor

Aici sunt instalate serverele de mână și ușă:
Trebuie să instalați mai întâi serverele în locurile lor corecte, acest lucru necesită un pic de încercare și eroare până când obțineți mișcarea necesară. Puteți folosi exemplul Servo furnizat în arduino IDE pentru a testa servomotoarele și cantitatea de deflexie necesară pentru fiecare și, prin urmare, decideți poziția finală și lungimea brațelor pentru servomotoarele ușii și mâinilor.
Brațele sunt pur și simplu făcute din lemn de balsa, le-am făcut mai groase pentru a rezista la o rupere.
Mai jos este modul în care am făcut-o. Doar o notă despre servomotorul. Veți avea nevoie ca arborele servo să fie direct sub marginea capacului (așa cum este arătat mai jos), pentru a evita dificultatea de a face o mână care poate atinge cu succes comutatorul și de asemenea să puteți reveni în cutie.


Pasul 6: Conectarea întrerupătorului, servomotoarelor și arduinelor

Faceți toate conexiunile văzute în pasul schematic și încercați să puneți toate în interiorul casetei similare cu cele prezentate mai sus:

Pasul 7: Opțional: motorul DC și bateria

Deasupra este modul în care am pus cutia de viteze cu motor DC (luată de la o mașină RC ieftină), prezentând și poziția de aluat și de comutare.
Asigurați-vă că așezați unitatea cât mai concentrată posibil pentru a echilibra cutia, poate fi necesar să puneți o greutate în cutie pentru a echilibra mai mult după asamblarea finală, deoarece bateria pe care am folosit-o este cam greoaie (100 gr) când comutați sau mutați cutia.
Rețineți că motorul DC viteză este controlat de pin 11, Direcţie prin pin 13, și frâne pe pin 8, acestea sunt considerate canal B pe scutul motor arduino.
Prin intermediul ansamblului am încercat să ascund toate firele de cabluri și alte componente pentru a avea o cutie autentică simplă. Acest lucru se aplică la roți, așa că am făcut o jantă în jurul lor, care găzduiește atât roțile și bateria, și oferă, de asemenea, acces la butonul de resetare roșu.

Pasul 8: Codul

Pentru a scrie cod pentru arduino, aveți nevoie de arduino IDE (descărcați-l aici)
Folosesc versiunea 1.0.5, asigurați-vă că selectați corect portul COM (Windows) și tipul de placă din IDE, apoi utilizați codul de mai jos și încărcați încărcarea.
NOTĂ: Valorile pe care le-am utilizat în cod pentru a seta deflecția maximă a servomotoarelor sunt efectuate exact pentru această casetă, luând în considerare poziția servo, axa și unghiurile. Am încercat asta. Deci, trebuie să vă creați propriile valori în funcție de cutie și servo plasarea.
Pentru referință, mai jos sunt valorile min / max pe care le-am folosit pentru fiecare servo, după cum le veți vedea în cod:
Usa:
80 se ascunde, 155 se deschide complet
Mana:
0 ascundere, 129 apăsarea comutatorului

Aici este codul (Este mai bine să descărcați fișierul atașat la această etapă în loc să copiați / lipiți de mai jos):
#include
Servo usaServo;
Servo handServo;
int switch_pin = 2; / / setați comutatorul pe pinul 2
// variabilele motorului
int motorThrottle = 11;
int motorDirection = 13;
int motorBrake = 8;
int pos = 0;
int selectedMove = 0; // mutați selectorul
int Testmove = 0; // modul de testare: setați să mutați numărul pentru a testa numai o mișcare selectată
// (setat la Zero pentru a rula in mod normal, adica: roundrobbin pe amm moves)
void setup ()
{
Serial.begin (9600);
pinMode (switch_pin, INPUT);
doorServo.attach (9); // setați servomotorul pe pinul 9 pwm
handServo.attach (10); / / setați servomotorul pe Pin 10 pwm
doorServo.write (80); // așezați ușa în poziție ascunsă
handServo.write (0); / / setați poziția ascunsă

// Channelul de instalare B, (deoarece canalul A este rezervat de servomecanismul ușii și de mână și nu poate fi folosit în același timp)
pinMode (motorDirection, OUTPUT); // inițiază pinul Motor Channel B.
pinMode (motorBrake, OUTPUT); // Inițiază pinul canalului de frână B

}

buclă voidă ()
{
dacă (Testmove! = 0) {
selectedMove = Testmove;
}

// dacă întrerupătorul este pornit, apoi mutați ușa și mâna pentru ao opri …
dacă (digitalRead (switch_pin) == HIGH)
{

dacă (selectedMove> 10) {selectedMove = 0; } // când sunt redate toate mișcările, repetați mișcările de la început
// jos sunt toate "Moves" am proiectat până acum, fiecare este o funcție care este scrisă mai jos în cod, executa numele, abit ciudat? da, deoarece unele sunt scrise în arabă
dacă (selectedMove == 0) {switchoff (); }
altfel dacă (selectedMove == 1) {switchoff (); }
altfel dacă (selectedMove == 2) {switchoffbitaraddod (); }
altfel dacă (selectedMove == 3) {crazydoor (); }
altfel dacă (selectedMove == 4) {crazyslow (); }
altfel dacă (selectedMove == 5) {m7anika7anika (); }
altfel dacă (selectedMove == 6) {m3alla2 (); }
altfel dacă (selectedMove == 7) {switchoff (); }
altfel dacă (selectedMove == 8) {matrix (); }
altfel dacă (selectedMove == 9) {sneak (); }
altfel dacă (selectedMove == 10) {zee7 (); }

dacă (Testmove == 0) {
selectedMove ++; // se rotește la mutarea următoare dacă nu este în modul de testare
}
}
}

// Biblioteca mișcărilor
// mișcare de bază
void switchoff ()
{
// Ușa în mișcare
pentru (pos = 80; pos <155; pos = 3)
{
doorServo.write (poz);
întârziere (15);
}

Mutarea mâinii
pentru (pos = 0; pos <129; pos = 4)
{
handServo.write (poz);
întârziere (15);
}

// ascunzi mâna
pentru (pos = 129; pos = = 0; pos- = 4)
{
handServo.write (poz);
întârziere (15);
}

// ascunde ușa
pentru (pos = 155; pos> = 80; pos- = 3)
{
doorServo.write (poz);
întârziere (15);
}
}

// mutați 3: deschideți și așteptați, apoi mutați mâna și așteptați, apoi comutați și ascundeți
void switchoffbitaraddod ()
{
// Ușa în mișcare
pentru (pos = 80; pos <155; pos = 3)
{
doorServo.write (poz);
întârziere (15);
}
întârziere (800);
Mutarea mâinii
pentru (pos = 0; pos <100; pos = 4)
{
handServo.write (poz);
întârziere (15);
}
întârziere (1000);
pentru (pos = 100; pos <129; pos = 4)
{
handServo.write (poz);
întârziere (15);
}

// ascunzi mâna
pentru (pos = 129; pos = = 0; pos- = 5)
{
handServo.write (poz);
întârziere (15);
}

// ascunde ușa
pentru (pos = 155; pos> = 80; pos- = 3)
{
doorServo.write (poz);
întârziere (15);


}

}

// mutați 4: deschideți ușa apoi închideți-o de mai multe ori, așteptați, apoi răsturnați rapid și opriți și ascundeți.

void crazydoor ()
{

// Ușa în mișcare
pentru (pos = 80; pos <125; pos = 3)
{
doorServo.write (poz);
întârziere (15);
}

// ascunde ușa
pentru (pos = 125; pos> = 80; poz = 5)
{
doorServo.write (poz);
întârziere (15);
}
// Ușa în mișcare
pentru (pos = 80; pos <110; pos = 3)
{
doorServo.write (poz);
întârziere (15);
}

// ascunde ușa
pentru (pos = 110; pos> = 80; poz = 15)
{
doorServo.write (poz);
întârziere (15);
}
întârziere (700);
// Ușa în mișcare
pentru (pos = 80; pos <125; pos = 3)
{
doorServo.write (poz);
întârziere (15);
}
întârziere (700);
// ascunde ușa
pentru (pos = 125; pos> = 80; poz = 5)
{
doorServo.write (poz);
întârziere (15);
}

// ---- de comutare a ---- //
// Ușa în mișcare
pentru (pos = 80; pos <155; pos = 8)
{
doorServo.write (poz);
întârziere (15);
}

Mutarea mâinii
pentru (pos = 0; pos <129; pos = 3)
{
handServo.write (poz);
întârziere (15);
}

// ascunzi mâna
pentru (pos = 129; pos = = 0; pos- = 3)
{
handServo.write (poz);
întârziere (15);
}

// ascunde ușa
pentru (pos = 155; pos> = 80; poz = 15)
{
doorServo.write (poz);
întârziere (15);
}

}

// mutați 5: deschideți ușa, apoi mutați mâna foarte încet înainte și înapoi pentru a vă ascunde foarte lent, apoi închideți rapid ușa
void crazyslow ()
{
// Ușa în mișcare
pentru (pos = 80; pos <155; pos = 1)
{
doorServo.write (poz);
întârziere (30);
}

Mutarea mâinii
pentru (pos = 0; pos <129; pos = 1)
{
handServo.write (poz);
întârziere (30);
}

// ascunzi mâna
pentru (pos = 129; pos = = 0; pos- = 1)
{
handServo.write (poz);
întârziere (30);
}

// ascunde ușa
pentru (pos = 155; pos> = 125; poz = 1)
{
doorServo.write (poz);
întârziere (30);
}
întârziere (100);
pentru (pos = 125; pos> = 80; pos- = 4)
{
doorServo.write (poz);
întârziere (15);
}

}
// muta 6:
void m7anika7anika () {
// Ușa în mișcare
pentru (pos = 80; pos <155; pos = 3)
{
doorServo.write (poz);
întârziere (15);
}

Mutarea mâinii
pentru (pos = 0; pos <70; pos = 1)
{
handServo.write (poz);
întârziere (15);
}
întârziere (800);


// ascunde ușa
pentru (pos = 155; pos> = 130; pos- = 3)
{
doorServo.write (poz);
întârziere (15);
}

// ascunde ușa
pentru (pos = 130; pos <155; pos = 3)
{
doorServo.write (poz);
întârziere (15);
}
// ascunde ușa
pentru (pos = 155; pos> = 130; pos- = 3)
{
doorServo.write (poz);
întârziere (15);
}
// ascunde ușa
pentru (pos = 130; pos <155; pos = 3)
{
doorServo.write (poz);
întârziere (15);
}

handServo.write (40);
întârziere (1000);

Mutarea mâinii
pentru (pos = 40; pos <129; pos = 4)
{
handServo.write (poz);
întârziere (15);
}

// ascunzi mâna
pentru (pos = 129; pos = = 0; pos- = 4)
{
handServo.write (poz);
întârziere (15);
}


pentru (pos = 120; pos> = 80; pos = = 1)
{
doorServo.write (poz);
întârziere (15);
}



}
void m3alla2 () {
// Ușa în mișcare
pentru (pos = 80; pos <155; pos = 3)
{
doorServo.write (poz);
întârziere (15);
}

Mutarea mâinii
pentru (pos = 0; pos <127; pos = 4)
{
handServo.write (poz);
întârziere (15);
}
// ascunde ușa
pentru (pos = 155; pos> = 130; pos- = 3)
{
doorServo.write (poz);
întârziere (15);
}
întârziere (2000);

pentru (pos = 130; pos <155; pos = 3)
{
doorServo.write (poz);
întârziere (15);
}

pentru (pos = 155; pos> = 140; pos- = 3)
{
doorServo.write (poz);
întârziere (15);
}
pentru (pos = 140; pos <155; pos = 3)
{
doorServo.write (poz);
întârziere (15);
}
întârziere (500);
// ascunzi mâna
pentru (pos = 127; pos = = 0; pos- = 4)
{
handServo.write (poz);
întârziere (15);
}

// ascunde ușa
pentru (pos = 155; pos> = 80; pos- = 3)
{
doorServo.write (poz);
întârziere (15);
}
}

matricea void ()
{
// Ușa în mișcare
pentru (pos = 80; pos <155; pos = 3)
{
doorServo.write (poz);
întârziere (15);
}

Mutarea mâinii
pentru (pos = 0; pos <80; pos = 4)
{
handServo.write (poz);
întârziere (15);
}

pentru (pos = 80; pos <129; pos = 1)
{
handServo.write (poz);
întârziere (30);
}
întârziere (300);

pentru (pos = 129; pos = = 0; pos- = 4)
{
handServo.write (poz);
întârziere (10);
}

// ascunde ușa
pentru (pos = 155; pos> = 80; pos- = 3)
{
doorServo.write (poz);
întârziere (15);
}

}
void sneak ()
{
// Ușa în mișcare
pentru (pos = 80; pos <130; pos = 1)
{
doorServo.write (poz);
întârziere (30);
}
întârziere (2000);

Mutarea mâinii
pentru (pos = 0; pos <40; pos = 1)
{
handServo.write (poz);
întârziere (30);
}

întârziere (500);

pentru (pos = 130; pos <155; pos = 4)
{
doorServo.write (poz);
întârziere (15);
}
întârziere (100);

pentru (pos = 40; pos <90; pos = 4)
{
handServo.write (poz);
întârziere (15);
}
întârziere (500);
// ascunzi mâna
pentru (pos = 90; pos> = 70; pos- = 4)
{
handServo.write (poz);
întârziere (15);
}
întârziere (100);
pentru (pos = 70; pos <90; pos = 4)
{
handServo.write (poz);
întârziere (15);
}
întârziere (100);
pentru (pos = 90; pos> = 70; pos- = 4)
{
handServo.write (poz);
întârziere (15);
}
întârziere (100);

pentru (pos = 70; pos <129; pos = 4)
{
handServo.write (poz);
întârziere (15);
}

pentru (pos = 129; pos = = 0; pos- = 4)
{
handServo.write (poz);
întârziere (15);
}
// ascunde ușa
pentru (pos = 155; pos> = 80; pos- = 3)
{
doorServo.write (poz);
întârziere (15);
}
}


void zee7 ()
{
// Ușa în mișcare
pentru (pos = 80; pos <155; pos = 3)
{
doorServo.write (poz);
întârziere (15);
}
întârziere (2000);
// transmite @ jumătate de viteză spre stânga
digitalWrite (motorDirection, LOW); // Stabilește direcția RIGHT a Canalului B.
digitalWrite (motorBrake, LOW); // Desfaceți frâna pentru canalul B
analogWrite (motorThrottle, 100); // Rotiți motorul pe canalul B la viteză maximă
întârziere (300);
digitalWrite (motorBrake, HIGH); // Întrerupeți frâna pentru canalul B
întârziere (2000);

// înapoi @ jumătate de viteză spre dreapta
digitalWrite (motorDirection, HIGH); // Stabilește direcția STÂNGA a canalului B
digitalWrite (motorBrake, LOW); // Desfaceți frâna pentru canalul B
analogWrite (motorThrottle, 100); // Rotiți motorul pe canalul B la jumătate de viteză
întârziere (300);
digitalWrite (motorBrake, HIGH); // Întrerupeți frâna pentru canalul B
întârziere (1000);

Mutarea mâinii
pentru (pos = 0; pos <129; pos = 4)
{
handServo.write (poz);
întârziere (15);
}

// ascunzi mâna
pentru (pos = 129; pos = = 0; pos- = 4)
{
handServo.write (poz);
întârziere (15);
}

// ascunde ușa
pentru (pos = 155; pos> = 80; pos- = 3)
{
doorServo.write (poz);
întârziere (15);
}
}


Pasul 9: Actualizare opțională: Detectarea mișcării

Am un senzor de proximitate astăzi (GP2Y0A21), deci acum îl pot folosi pentru a mișca mașina dacă utilizatorul se apropie de comutatorul de comutare :)
Pentru acest pas suplimentar, presupun că ați construit deja roțile pentru a permite deplasarea (vezi pasul opțional 8). Tot ce rămâne acum este adăugarea senzorului și efectuarea unor modificări în codul de detectare a mișcării.
Senzorul are 3 fire, conectate la firul de semnal galben pin 3 pe arduino, în timp ce roșu și negru sunt conectate la v5 și sol respectiv pe tablă.
Am plasat senzorul ascuns sub ușă așa cum se arată în imagine, astfel încât să poată "vedea" mișcarea utilizatorului numai atunci când se deschide ușa. exact ceea ce am nevoie!
De asemenea, trebuia să schimb codul un pic (aici) pentru a implementa o rutină de detectare a mișcării (a se vedea codul, în funcție zee7 () ), astfel încât atunci când mișcarea este detectată, caseta se va deplasa, mai întâi spre dreapta, apoi spre stânga, apoi mâna învârte comutatorul și se ascunde. Codul este foarte comentat, sper că nu am exagerat!
Puteți găsi codul actualizat de mai jos, rețineți, de asemenea, că am făcut mașina să preia mișcările la întâmplare, aceasta poate fi schimbată înapoi la secvențială prin simpla setare boolean randomize = false;
Mulțumesc tuturor pentru sugestiile dvs. minunate!
Codul (Mai bine să descărcați fișierul atașat la această etapă în loc să copiați / lipiți de mai jos):
#include
Servo usaServo;
Servo handServo;
nesemnate lung TimerA, TimerB; // cronometrul pentru rutina de detectare a mișcării
int switch_pin = 2; / / setați comutatorul pe pinul 2
// variabilele motorului
int motorThrottle = 11;
int motorDirection = 13;
int motorBrake = 8;
// Variabile de distanță
int mișcarePin = 3; // pinul senzorului de mișcare pe analogicul 0
int lastDist = 0; // să vă amintiți ultima distanță
int currentDist = 0;
int thresh = 200; // Pragul pentru Mișcare (setați-l astfel încât să obțineți sensibilitatea dorită de detecție a mișcării)

int pos = 0;
int selectedMove = 0; // mutați selectorul
int Testmove = 0; // modul de testare: setați să mutați numărul pentru a testa numai o mișcare selectată
// (setat la Zero pentru a rula în mod normal, adică: roundrobbin pe toate mișcările)
boolean randomize = true; // dacă este adevărat, caseta va face mutări aleatoriu, dacă este setată la falsă, atunci mișcările se vor face secvențial de la 1 la 10

void setup ()
{
Serial.begin (9600);
pinMode (switch_pin, INPUT);
doorServo.attach (9); // setați servomotorul pe pinul 9 pwm
handServo.attach (10); / / setați servomotorul pe Pin 10 pwm
doorServo.write (80); // așezați ușa în poziție ascunsă
handServo.write (0); / / setați poziția ascunsă
// Channelul de instalare B, deoarece canalul A este rezervat de servomecanisme de ușă și de mână și nu poate fi utilizat în același timp
pinMode (motorDirection, OUTPUT); // inițiază pinul Motor Channel B.
pinMode (motorBrake, OUTPUT); // Inițiază pinul canalului de frână B

}

buclă voidă ()
{
// dacă întrerupătorul este pornit, apoi mutați ușa și mâna pentru ao opri …
dacă (digitalRead (switch_pin) == HIGH)
{

dacă (Testmove == 0)
{

dacă (randomize == false)
{
dacă (selectateMove> 10)
{
selectedMove = 0; // când se joacă toate mișcările, repetați mișcările de la început
}
}
altfel
{
selectedMove = aleatoare (11);
}
}
altfel
{
selectedMove = Testmove;
}
Serial.println (selectedMove);
dacă (selectedMove == 0) {switchoff (); }
altfel dacă (selectedMove == 1) {switchoff (); }
altfel dacă (selectedMove == 2) {switchoffbitaraddod (); }
altfel dacă (selectedMove == 3) {crazydoor (); }
altfel dacă (selectedMove == 4) {crazyslow (); }
altfel dacă (selectedMove == 5) {m7anika7anika (); }
altfel dacă (selectedMove == 6) {m3alla2 (); }
altfel dacă (selectedMove == 7) {switchoff (); }
altfel dacă (selectedMove == 8) {matrix (); }
altfel dacă (selectedMove == 9) {sneak (); }
altfel dacă (selectedMove == 10) {zee7 (); }

dacă (Testmove == 0 && randomize == false) {
selectedMove ++; // comutați la următoarea mișcare dacă nu este în modul de testare
}
}
}
// Biblioteca mișcărilor
// mișcare de bază
void switchoff ()
{
// Ușa în mișcare
pentru (pos = 80; pos <155; pos = 3)
{
doorServo.write (poz);
întârziere (15);
}

Mutarea mâinii
pentru (pos = 0; pos <129; pos = 4)
{
handServo.write (poz);
întârziere (15);
}

// ascunzi mâna
pentru (pos = 129; pos = = 0; pos- = 4)
{
handServo.write (poz);
întârziere (15);
}

// ascunde ușa
pentru (pos = 155; pos> = 80; pos- = 3)
{
doorServo.write (poz);
întârziere (15);
}
}

// mutați 3: deschideți și așteptați, apoi mutați mâna și așteptați, apoi comutați și ascundeți
void switchoffbitaraddod ()
{
// Ușa în mișcare
pentru (pos = 80; pos <155; pos = 3)
{
doorServo.write (poz);
întârziere (15);
}
întârziere (800);
Mutarea mâinii
pentru (pos = 0; pos <100; pos = 4)
{
handServo.write (poz);
întârziere (15);
}
întârziere (1000);
pentru (pos = 100; pos <129; pos = 4)
{
handServo.write (poz);
întârziere (15);
}

// ascunzi mâna
pentru (pos = 129; pos = = 0; pos- = 5)
{
handServo.write (poz);
întârziere (15);
}

// ascunde ușa
pentru (pos = 155; pos> = 80; pos- = 3)
{
doorServo.write (poz);
întârziere (15);


}

}

// mutați 4: deschideți ușa apoi închideți-o de mai multe ori, așteptați, apoi răsturnați rapid și opriți și ascundeți.

void crazydoor ()
{

// Ușa în mișcare
pentru (pos = 80; pos <125; pos = 3)
{
doorServo.write (poz);
întârziere (15);
}

// ascunde ușa
pentru (pos = 125; pos> = 80; poz = 5)
{
doorServo.write (poz);
întârziere (15);
}
// Ușa în mișcare
pentru (pos = 80; pos <110; pos = 3)
{
doorServo.write (poz);
întârziere (15);
}

// ascunde ușa
pentru (pos = 110; pos> = 80; poz = 15)
{
doorServo.write (poz);
întârziere (15);
}
întârziere (700);
// Ușa în mișcare
pentru (pos = 80; pos <125; pos = 3)
{
doorServo.write (poz);
întârziere (15);
}
întârziere (700);
// ascunde ușa
pentru (pos = 125; pos> = 80; poz = 5)
{
doorServo.write (poz);
întârziere (15);
}

// ---- de comutare a ---- //
// Ușa în mișcare
pentru (pos = 80; pos <155; pos = 8)
{
doorServo.write (poz);
întârziere (15);
}

Mutarea mâinii
pentru (pos = 0; pos <129; pos = 3)
{
handServo.write (poz);
întârziere (15);
}

// ascunzi mâna
pentru (pos = 129; pos = = 0; pos- = 3)
{
handServo.write (poz);
întârziere (15);
}

// ascunde ușa
pentru (pos = 155; pos> = 80; poz = 15)
{
doorServo.write (poz);
întârziere (15);
}

}

// mutați 5: deschideți ușa, apoi mutați mâna foarte încet înainte și înapoi pentru a vă ascunde foarte lent, apoi închideți rapid ușa
void crazyslow ()
{
// Ușa în mișcare
pentru (pos = 80; pos <155; pos = 1)
{
doorServo.write (poz);
întârziere (30);
}

Mutarea mâinii
pentru (pos = 0; pos <129; pos = 1)
{
handServo.write (poz);
întârziere (30);
}

// ascunzi mâna
pentru (pos = 129; pos = = 0; pos- = 1)
{
handServo.write (poz);
întârziere (30);
}

// ascunde ușa
pentru (pos = 155; pos> = 125; poz = 1)
{
doorServo.write (poz);
întârziere (30);
}
întârziere (100);
pentru (pos = 125; pos> = 80; pos- = 4)
{
doorServo.write (poz);
întârziere (15);
}

}
// muta 6:
void m7anika7anika () {
// Ușa în mișcare
pentru (pos = 80; pos <155; pos = 3)
{
doorServo.write (poz);
întârziere (15);
}

Mutarea mâinii
pentru (pos = 0; pos <70; pos = 1)
{
handServo.write (poz);
întârziere (15);
}
întârziere (800);


// ascunde ușa
pentru (pos = 155; pos> = 130; pos- = 3)
{
doorServo.write (poz);
întârziere (15);
}

// ascunde ușa
pentru (pos = 130; pos <155; pos = 3)
{
doorServo.write (poz);
întârziere (15);
}
// ascunde ușa
pentru (pos = 155; pos> = 130; pos- = 3)
{
doorServo.write (poz);
întârziere (15);
}
// ascunde ușa
pentru (pos = 130; pos <155; pos = 3)
{
doorServo.write (poz);
întârziere (15);
}

handServo.write (40);
întârziere (1000);

Mutarea mâinii
pentru (pos = 40; pos <129; pos = 4)
{
handServo.write (poz);
întârziere (15);
}

// ascunzi mâna
pentru (pos = 129; pos = = 0; pos- = 4)
{
handServo.write (poz);
întârziere (15);
}


pentru (pos = 120; pos> = 80; pos = = 1)
{
doorServo.write (poz);
întârziere (15);
}



}
void m3alla2 () {
// Ușa în mișcare
pentru (pos = 80; pos <155; pos = 3)
{
doorServo.write (poz);
întârziere (15);
}

Mutarea mâinii
pentru (pos = 0; pos <127; pos = 4)
{
handServo.write (poz);
întârziere (15);
}
// ascunde ușa
pentru (pos = 155; pos> = 130; pos- = 3)
{
doorServo.write (poz);
întârziere (15);
}
întârziere (2000);

pentru (pos = 130; pos <155; pos = 3)
{
doorServo.write (poz);
întârziere (15);
}

pentru (pos = 155; pos> = 140; pos- = 3)
{
doorServo.write (poz);
întârziere (15);
}
pentru (pos = 140; pos <155; pos = 3)
{
doorServo.write (poz);
întârziere (15);
}
întârziere (500);
// ascunzi mâna
pentru (pos = 127; pos = = 0; pos- = 4)
{
handServo.write (poz);
întârziere (15);
}

// ascunde ușa
pentru (pos = 155; pos> = 80; pos- = 3)
{
doorServo.write (poz);
întârziere (15);
}
}

matricea void ()
{
// Ușa în mișcare
pentru (pos = 80; pos <155; pos = 3)
{
doorServo.write (poz);
întârziere (15);
}

Mutarea mâinii
pentru (pos = 0; pos <80; pos = 4)
{
handServo.write (poz);
întârziere (15);
}

pentru (pos = 80; pos <129; pos = 1)
{
handServo.write (poz);
întârziere (30);
}
întârziere (300);

pentru (pos = 129; pos = = 0; pos- = 4)
{
handServo.write (poz);
întârziere (10);
}

// ascunde ușa
pentru (pos = 155; pos> = 80; pos- = 3)
{
doorServo.write (poz);
întârziere (15);
}

}
void sneak ()
{
// Ușa în mișcare
pentru (pos = 80; pos <130; pos = 1)
{
doorServo.write (poz);
întârziere (30);
}
întârziere (2000);

Mutarea mâinii
pentru (pos = 0; pos <40; pos = 1)
{
handServo.write (poz);
întârziere (30);
}

întârziere (500);

pentru (pos = 130; pos <155; pos = 4)
{
doorServo.write (poz);
întârziere (15);
}
întârziere (100);

pentru (pos = 40; pos <90; pos = 4)
{
handServo.write (poz);
întârziere (15);
}
întârziere (500);
// ascunzi mâna
pentru (pos = 90; pos> = 70; pos- = 4)
{
handServo.write (poz);
întârziere (15);
}
întârziere (100);
pentru (pos = 70; pos <90; pos = 4)
{
handServo.write (poz);
întârziere (15);
}
întârziere (100);
pentru (pos = 90; pos> = 70; pos- = 4)
{
handServo.write (poz);
întârziere (15);
}
întârziere (100);

pentru (pos = 70; pos <129; pos = 4)
{
handServo.write (poz);
întârziere (15);
}

pentru (pos = 129; pos = = 0; pos- = 4)
{
handServo.write (poz);
întârziere (15);
}
// ascunde ușa
pentru (pos = 155; pos> = 80; pos- = 3)
{
doorServo.write (poz);
întârziere (15);
}
}

// această mișcare va deschide ușa și va aștepta mișcarea, dacă va fi detectată lângă comutator,
// caseta se va deplasa mai întâi spre dreapta și apoi spre stânga și, în final, mâna se va mișca și va opri comutatorul
void zee7 ()
{

//ușă deschisă
pentru (pos = 80; pos <155; pos = 3)
{
doorServo.write (poz);
întârziere (15);
}
întârziere (1200); // așteptați să stabilizați citirile senzorului după deschiderea ușii

// setați cronometrul și citiți senzorul
// așteptați mișcarea care depășește pragul sau dacă expiră temporizatorul (5 sec),
lastDist = analogRead (mișcarePin);
TimerA = milis ();

în timp ce (millis () - TimerA <= 5000)
{
curentDist = analogRead (motionPin);

// Distanța de curent deviază de la ultima distanță cu mai mult decât pragul?
// dacă da, apoi mutați caseta spre dreapta
dacă ((currentDist> lastDist thresh || currentDist <lastDist - thresh) || currentDist> 300)
{
// transmite @ jumătate de viteză spre stânga (alegeți viteza și întârzierea
//((i) întârziere (300) în funcție de tine și de tensiunea acumulatorului astfel încât să fie aruncată mișcarea de mișcare)
digitalWrite (motorDirection, LOW); // Stabilește direcția RIGHT a canalului A
digitalWrite (motorBrake, LOW); // Desfaceți frâna pentru canalul B
analogWrite (motorThrottle, 100); // Rotiți motorul pe canalul B la viteză maximă
întârziere (300);
digitalWrite (motorBrake, HIGH); // Întrerupeți frâna pentru canalul B
pauză;
}
lastDist = currentDist;
}

// setați cronometrul și citiți senzorul
// așteptați mișcarea care depășește pragul sau dacă expiră temporizatorul (5 sec),
întârziere (1200); // așteptați să stabilizați citirile senzorului după deschiderea ușii
lastDist = analogRead (mișcarePin);
TimerB = milis ();
în timp ce (millis () - TimerB <= 5000)
{
curentDist = analogRead (motionPin);
// a făcut deja caseta la dreapta și distanța curentă se abate de la ultima distanță cu mai mult decât pragul?
// Dacă da, apoi treceți la stânga
dacă ((currentDist> lastDist thresh || currentDist <lastDist - thresh) || currentDist> 300)
{
// înapoi @ jumătate de viteză spre dreapta (alegeți viteza și întârzierea
//((i) întârziere (300) în funcție de tine și de tensiunea acumulatorului astfel încât să fie aruncată mișcarea de mișcare)
digitalWrite (motorDirection, HIGH); // Stabilește direcția STÂNGA a canalului B
digitalWrite (motorBrake, LOW); // Desfaceți frâna pentru canalul B
analogWrite (motorThrottle, 100); // Rotiți motorul pe canalul B la jumătate de viteză
întârziere (300);
digitalWrite (motorBrake, HIGH); // Întrerupeți frâna pentru canalul B
pauză;
}

lastDist = currentDist;

}
întârziere (100);
Mutarea mâinii
pentru (pos = 0; pos <130; pos = 4)
{
handServo.write (poz);
întârziere (15);
}

// ascunzi mâna
pentru (pos = 130; pos = = 0; pos- = 4)
{
handServo.write (poz);
întârziere (15);
}

// ascunde ușa
pentru (pos = 155; pos> = 80; pos- = 3)
{
doorServo.write (poz);
întârziere (15);
}
}

3 persoane au realizat acest proiect!

  • AndyC159 a reușit!

  • SamL84 a reușit!

  • melton1313 a făcut-o!

Ați făcut acest proiect? Împărtășește-i cu noi!

recomandări

  • Mașină de sortare a șuruburilor

  • PCB BOT (linia următoare, evitarea obstacolelor și robotul controlat de Bluetooth într-un PCB unic)

  • Clasa Internet de lucruri

  • Culorile concursului curcubeu

  • Concursul Fandom

  • Partidul Challenge

194 Discuții

0

incerci

Acum 4 ani pe Introducere

Multumesc pentru asta! Am făcut primul meu proiect Arduino bazat pe acest instructiv: un dragon inutil!

4 răspunsuri 0

Ajannincerci

Răspuns acum 3 ani

Mașina ta dragon este minunată. !!! Artistic

0

TJAOkevinincerci

Răspuns acum 3 ani

Minunat!!!!!

0

riachiincerci

Răspuns 4 ani în urmă on Introduction

Ești minunat :) !!!

Personalitate Mare pentru un Dragon! Îmi doresc să redați videoclipul în timp ce balaurul se îndreaptă direct spre aparatul de fotografiat (vedere de sus), simt că acest lucru va fi hilar, așa că vedeți limba care se strecoară!

Vă mulțumim că v-ați permis să vă împărtășiți videoclipul și că mă bucur că am ajutat-o

0

incerciriachi

Răspuns 4 ani în urmă on Introduction

Am încercat o vedere de sus într-o etapă mai devreme, dar nu a funcționat (a văzut prea multe din interiorul dezordonat), așa că am respins-o când am luat acest videoclip. Cred că ai dreptate: în ultima etapă ar fi arătat grozav! Din păcate, am dat deja balaurul … Deci, la următorul proiect!

0

br1pro

acum 4 ani

Foarte amuzant! munca grea de fixare a servo-urilor și proiectarea mâinii. Multumesc pentru acest instructiv!

1 răspuns 0

riachibr1pro

Răspuns 4 ani în urmă on Introduction

Mare om de lucru! foarte frumos :) orice video?

0

clincoln

acum 5 ani

Urmăriți mai întâi videoclipul pe acesta, apoi râdeți

1 răspuns 0

TobiasVclincoln

Răspuns 4 ani în urmă on Introduction

Știu că am făcut-o! : D

0

rileyw

acum 5 ani

Super cool video a făcut ca par a avea o minte proprie

0

Elitekilla117

Acum 5 ani pe Introducere

Masina mea inutilă cu cod arduino și riachis! Făcut într-un tardis de la Dr.who. :)
http://www.youtube.com/watch?v=aDs0T52o6-M

2 răspunsuri 0

riachiElitekilla117

Răspuns 5 ani în urmă on Introduction

IUBESC!!!! :)) foarte bine făcut om, atât de fericit pentru a vedea bombbox dvs. în viață! Am, de asemenea, dramatizare și muzică: p doar nu mă pot opri pentru a sugera 3 mici modificări dacă eu pot :)?
- ar fi minunat să puneți mașina în poziție verticală, știu că acest lucru va face să piardă ajutorul gravitației pentru a închide ușa, însă o soluție simplă este de a pune două benzi de cauciuc atașate pe partea interioară a ușii pe o parte și la partea interioară a cutiei pentru celălalt capăt, aceasta va face ca ușa să se închidă când servomotorul se închide … Verificați pașii de construire, veți vedea banda de cauciuc la Pasul 6 …
- de asemenea, ceea ce despre pictura mâinile în negru, va fi mai mascate și slick
! De asemenea, vârful de mână poate fi vopsit în roșu sângeros sau decorat cu o față nebună sau ceva de genul ăsta ..
- eliminați ultima mișcare, deoarece nu se întâmplă nimic în ea (ar fi trebuit să fie cea care mișcă cutia) și să scrie propria dvs. mișcare …
Cu toate acestea, uitați sugestiile, mi-a plăcut mașina! Și mulțumesc pentru mulțumiri mulțumesc omului, vă rugăm să le puteți reduce și să păstrați videoclipul focalizat pe mașină :)
Sper că gf ți-a plăcut!

0

Elitekilla117riachi

Răspuns 5 ani în urmă on Introduction

Hahah Vă mulțumesc pentru complimentele :) De fapt, am vrut să fac mai mult pentru ea, dar din cauza crizei de timp nu am putut să se potrivească într-o mulțime de detalii am vrut. Aș dori să adaug o anumită culoare armei, dar nu aveam timp pentru ele. Și am vrut să-i trag o față pe braț cu un baston, dar deja înfășurat și gata să-i dea pentru Crăciun. Hehehe. Cred că o va plăcea. De asemenea, am vrut să mă ridic în picioare, dar mi-a fost teamă că benzile de cauciuc ar pune prea multă greutate pe servos. Usa este deja destul de grea. Ultima mișcare pe care am păstrat-o pentru că te ține în suspans așteptând să iasă afară. Hahaha, dar apreciez tot ajutorul prietenul meu! Categoric merită!

0

chuckletushy

acum 5 ani

Trebuie să fac asta … e minunat

0

wrs715

Acum 5 ani pe Introducere

Acesta este primul proiect pe care l-am văzut folosind un Arduino în care m-am gândit: "Da, merită. Acum trebuie să obțin una." O treabă fantastică!

0

siliconghost

Acum 5 ani pe Introducere

Wow, trebuia să faci un proiect comun! Iubiți-vă spinul pentru a-l face mai interesant!

0

bob3030

acum 5 ani

Un dispozitiv inutil al unui om este altul, cu totul minunat, din lumea asta, ne-am gândit, amuzanți să avem, râvnit de un dispozitiv inutil. Vă mulțumim pentru actualizările proiectului. Vă mulțumim pentru postare.

0

wobbler

Acum 5 ani pe Introducere

Gândul 1: Folosirea unui Arduino pentru acest lucru este o depășire ridicolă
Gândul 2: După vizionarea videoclipului - Folosirea unui Arduino pentru acest lucru este doar un geniu pur!
Mă îndoiesc de creativitatea voastră!

0

stumitch

Acum 5 ani pe Introducere

Acest lucru este foarte grozav! Îmi amintesc de o personalitate Wall-E. Vă mulțumim pentru un astfel de proiect minunat!

0

gazillabytes

Acum 5 ani pe Introducere

Cu adevărat inutil! Nimic. Sunt inspirat și trebuie să construiesc unul pentru biroul meu. Mulțumiri.