Kazalo:
2025 Avtor: John Day | [email protected]. Nazadnje spremenjeno: 2025-01-13 06:58
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);
}
}