Kazalo:
- Korak: Naredite držalo za bazo in pokrovček
- 2. korak: Podaljšajte servo roko in jo pritrdite
- 3. korak: Naložite in zaženite skico
Video: Samodejni kroglični valj z Arduinom in enim servo: 3 koraki
2024 Avtor: John Day | [email protected]. Nazadnje spremenjeno: 2024-01-30 12:02
To je preprost mali Arduino in servo projekt, ki traja približno dve uri. Uporablja servo za dvig enega konca pokrova kozarca, tako da zavrtite jekleno kroglo po notranjem obodu. Samodejno se zažene, lahko spremeni hitrost in lahko vrti dve (ali več?) Kroglici hkrati. Zabavno graditi in delati. S časovnimi parametri se je mogoče igrati za verjetno še hitrejše hitrosti. Nekaj senzorjev za efekt dvorane z magnetno kroglo bi lahko uporabili, da bi postal pametnejši stroj, ki bi lahko ugotovil najboljše parametre.
Naj omenim, da ima nekdo na spletnem mestu instructables.com bolj izpopolnjen stroj za valjanje kroglic:
Potrebni materiali:
Arduino Uno (ali kateri koli Arduino)
Servo ščit (neobvezno)
9 g servo
pokrovček za kozarec
jeklena krogla
nekaj odpadnega lesa
Korak: Naredite držalo za bazo in pokrovček
Osnova je le kos lesa, na katerega lahko pritrdite tečaj lesa. Les na tečajih mora biti večji od pokrova kozarca, ki ga boste uporabili, in imeti dovolj prostora za tečaje in namestitev servomotorja.
Uporabil sem majhne plastične tečaje za letalske diske in jih lepil z vlečenim lesom na tečajih in podnožjem.
2. korak: Podaljšajte servo roko in jo pritrdite
Za daljšo servo roko sem na servo roko samo z nekaj majhnimi vijaki in maticami pritrdil 5 centimetrski kos lesa. Servo ročica mora biti na servo, ko je vodoravna glede na podlago, 90 stopinj.
Pravkar sem vroče zlepil servo na tečajno držalo za les, vendar sem ugotovil, da bo servo segrel vroče lepilo in ga spustil iz lesa, če ga pustite delovati dlje kot nekaj minut. Zato je boljša metoda pritrditve upravičena.
3. korak: Naložite in zaženite skico
Svoj servo sem pritrdil na pin 7 s ščitnikom, ker je to preprosto priročno in stanejo le nekaj dolarjev. Če nimate ščita, priključite servo signalno žico na pin 7 na Arduinu, rdečo žico na 5v na Arduinu in ozemljitveno žico na GND na Arduinu. Arduino mora zagotavljati dovolj toka za delovanje servo. Ščit uporabljam, ker je enostavno uporabiti zunanjo napetost samo za servo.
Tukaj je skica. Napisal sem rutino krmilnika hitrosti servo, da bi spremenil hitrost servo, ker verjetno ne bo dobro deloval pri polni hitrosti.
Časovni zamik lahko spremenite, da dosežete različne hitrosti valjanja žoge. Za spremembo hitrosti lahko spremenite tudi tretji parameter funkcije myServo ().
//////////////////////////////////////////////////////// //////////////////////////////////////////////////////// //////////////// // ustvaril Jim Demello, Univerza Shangluo, 2017
// s to kodo lahko prosto uporabljate, manipulirate in delate karkoli želite, moje ime ni potrebno
// Ta rutina omogoča interpolacijo poljubnega števila servomotorjev, samo dodajte nove vrstice, če število servomotorjev presega 4
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////
#vključi
Servo myservo1, myservo2; // ustvarite servo objekt za nadzor servo
int servoRead (int servoNumber) {
int servoCurrent;
if (številka servo == 1) {servoCurrent = myservo1.read (); }
if (številka servo == 2) {servoCurrent = myservo2.read (); }
povratni servoTok;
}
void servoWrite (int servoNumber, int offset) {
if (številka servo == 1) {myservo1.write (odmik); }
if (številka servo == 2) {myservo2.write (odmik); }
}
void myServo (int newAngle, int angleInc, int incDelay, int servoNum) {
int curAngle;
if (servoNum == 1) {curAngle = myservo1.read (); }
if (servoNum == 2) {curAngle = myservo2.read (); }
if (curAngle <newAngle) {
for (int kot = curAngle; kot <newAngle; kot += angleInc) {
if (servoNum == 1) myservo1.write (kot);
if (servoNum == 2) myservo2.write (kot);
zakasnitev (incDelay); }
}
else if (curAngle> newAngle) {
for (int kot = curAngle; kot> newAngle; kot -= angleInc) {
if (servoNum == 1) myservo1.write (kot);
if (servoNum == 2) myservo2.write (kot);
zakasnitev (incDelay); }
}
}
void interpolate2Servos (int servo1, int servo1Position, int servo2, int servo2Polition, int numberSteps, int timeDelay) {
int servo1Current, servo2Current;
servo1Current = servoRead (servo1);
servo2Current = servoRead (servo2);
// Serial.print ("Servo3Pos in tok"); Serial.print (servo3Position); Serial.print (""); Serial.println (servo3Current);
// Serial.print ("Servo4Pos in tok"); Serial.print (servo4Position); Serial.print (""); Serial.println (servo4Current);
// Serial.print ("Servo5Pos in tok"); Serial.print (servo5Position); Serial.print (""); Serial.println (servo5Current);
// Serial.print ("Servo6Pos in tok"); Serial.print (servo6Position); Serial.print (""); Serial.println (servo6Current);
// Serial.println ("");
int cOffset = (servo1Position - servo1Current); cOffset = abs (cOffset)/numberSteps;
int dOffset = (servo2Position - servo2Current); dOffset = abs (dOffset)/numberSteps;
int cOffsetTotal = 0, dOffsetTotal = 0;
cOffsetTotal = servo1Current;
dOffsetTotal = servo2Current;
za (int x = 0; x
if (servo1Position> servo1Current) {cOffsetTotal = cOffsetTotal + cOffset; }
else {cOffsetTotal = cOffsetTotal - cOffset; }
if (servo2Position> servo2Current) {dOffsetTotal = dOffsetTotal + dOffset; }
else {dOffsetTotal = dOffsetTotal - dOffset; }
if (servo1Position! = servo1Current) servoWrite (servo1, cOffsetTotal);
if (servo2Position! = servo2Current) servoWrite (servo2, dOffsetTotal);
// Serial.print ("odmik a in b"); Serial.print (aOffsetTotal); Serial.print (""); Serial.println (bOffsetTotal); zamuda (10);
zakasnitev (timeDelay);
} // konec za
//////////////////////////////////////
// poskrbimo za modularne ostanke //
/////////////////////////////////////
if (servo1Position! = servo1Current) servoWrite (servo1, servo1Position);
if (servo2Position! = servo2Current) servoWrite (servo2, servo2Position);
}
int timingDelay = 100;
int servoDelay = 100;
int degGap = 10;
// To je začetna stopnja (mora biti manjša od končne stopnje)
int degStart = 0;
// To so končne stopnje (morajo biti večje od začetne stopnje)
int degEnd = 360;
// To je polmer kroga
int polmer = 8;
void setup ()
{
Serial.begin (9600);
zamuda (100);
myservo1.attach (7); // pritrdi servo na pin 7 na servo objekt
myservo1.write (90);
myservo2.attach (8); // pritrdi servo na pin 8 na servo objekt
myservo2.write (90);
zamuda (1000); // čaka na servo, da pride tja
interpolate2Servos (1, 90, 2, 90, 10, 60); // nevtralno
zamuda (1000);
}
void loop () {
timingDelay = 15; // deluje ob 10
servoDelay = 4;
spin4 ();
// interpolate2Servos (1, 90, 2, 90, 1, 60); // nevtralno
// zakasnitev (1000);
// izhod (0); // začasno ustavi program - za nadaljevanje pritisnite reset
}
void spin3 () {
interpolate2Servos (1, 90, 2, 110, 1, 60); // nevtralno
zamuda (timingDelay);
interpolate2Servos (1, 90, 2, 80, 1, 60); // nevtralno
zamuda (timingDelay);
}
void spin2 () {
// interpolate2Servos (1, 80, 2, 90, 1, 50); // nevtralno
zamuda (timingDelay);
interpolate2Servos (1, 80, 2, 80, 1, 60); // nevtralno
zamuda (timingDelay);
interpolate2Servos (1, 110, 2, 80, 1, 60); // nevtralno
zamuda (timingDelay);
// interpolate2Servos (1, 110, 2, 110, 1, 60); // nevtralno
zamuda (timingDelay);
}
void spin1 () {
// int deg = (degStart / (180 / 3.14));
float deg = (degStart * 3.141592 / 180); // pretvorimo stopinje v radiane
float xPos = 90 + (cos (stop) * polmer);
// xPos = okrogel (xPos);
float yPos = 90 + (sin (stop) * polmer);
// yPos = okrogel (yPos);
Serial.print ("degGap ="); Serial.print (degGap); Serial.print ("deg ="); Serial.print (deg); Serial.print ("cos ="); Serial.print (cos (deg)); Serial.print ("degStart ="); Serial.print (degStart); Serial.print ("x ="); Serial.print (xPos); Serial.print ("y ="); Serial. println (yPos);
// interpolate2Servos (1, xPos, 2, yPos, 1, servoDelay); // nevtralno
myservo1.write (xPos);
myservo2.write (yPos);
zamuda (timingDelay);
if (degStart> = degEnd) {
degStart = 0;
če (degGap> 180)
degGap = 180;
// degGap = 0;
drugače
degGap = degGap + 2;
degGap = degGap - 2;
// degStart = degStart +degGap;
}
degStart = degStart + degGap;
}
void spin4 () {
za (int i = 0; i <= 360; i ++) {
float j = 20 * (cos ((3,14 * i)/180)) + 90;
plovec k = 20 * (sin ((3,14 * i)/180)) + 90;
myservo1.write (j);
myservo2.write (k);
Serijski.tisk (j);
Serial.print (",");
Serial.println (k);
zamuda (100);
}
}
Priporočena:
Zaklepanje vzmetenja z enim gumbom: 3 koraki
Zaklepanje vzmetenja z enim gumbom: gorska kolesa s polnim vzmetenjem zagotavljajo gladko vožnjo, vendar pogosto zahtevajo blokiranje vzmetenja pri pedaliranju navkreber. V nasprotnem primeru se vzmetenje stisne, ko stojite na pedalih in zapravljate ta trud. Proizvajalci koles to vedo in zagotavljajo
Najpreprostejši samodejni napajalnik za hišne ljubljenčke z Arduinom: 3 koraki
Najpreprostejši samodejni napajalnik za hišne ljubljenčke z Arduinom: Pozdravljeni ljubitelji hišnih ljubljenčkov! Globoko v sebi si vsi želimo imeti ljubkega malega mladička ali mucka ali verjetno celo ribjo družino. Toda zaradi zasedenega življenja pogosto dvomimo vase: 'Ali bom lahko skrbel za svojega hišnega ljubljenčka?' Primarna odgovornost
Varnostni sistem za varnost žensk z enim dotikom: 3 koraki
Varnostni sistem za ženske varnost z enim dotikom: Varnostni sistem za ženske z enim dotikom z uporabo mikrokrmilnika 8051V današnjem svetu je varnost žensk najpomembnejša težava v sami državi. Danes so ženske nadlegovane in v težavah in včasih, ko je potrebna nujna pomoč. Ni potrebnih lokacij
Samopostrežni bife z enim gumbom: 4 koraki
Samopostrežni bife z enim gumbom: OPOMBA: Za sistem obrokov Kang Chiao neuporaben, če niste v naši šoli. Naprave imajo dve uporabi. Z njim lahko preskočite dolgočasen postopek izbire obrokov, tako da za vas izberete samopostrežni bife, kar je resnično koristno za ljudi, ki želijo samo jesti
Preprost samodejni preskus kondenzatorja / merilnika kapacitivnosti z Arduinom in ročno: 4 koraki
Preprost samodejni preskus kondenzatorja / merilnika kapacitivnosti z Arduinom in ročno: Pozdravljeni! Za to fizikalno enoto potrebujete:* napajalnik z 0-12V* en ali več kondenzatorjev* en ali več polnilnih uporov* štoparica* multimeter za napetost merjenje* arduino nano* zaslon 16x2 I²C* 1/4 W upori z 220, 10k, 4,7M an