Obsah:
2025 Autor: John Day | [email protected]. Naposledy zmenené: 2025-01-13 06:58
Jedná sa o jednoduchý malý projekt Arduino a servo, ktorého dokončenie trvá asi dve hodiny. Pomocou serva zdvihnite jeden koniec uzáveru nádoby a roztočte oceľovú guľu po vnútornom obvode. Je samočinný, môže meniť rýchlosť a môže točiť dvoma (alebo viacerými?) Loptičkami naraz. Zábava stavať a pracovať. S časovacími parametrami sa dá hrať pravdepodobne ešte vo vyšších rýchlostiach. Na to, aby bol inteligentnejší stroj, ktorý dokáže zistiť najlepšie parametre, by bolo možné použiť niekoľko senzorov s Hallovým efektom s magnetickou guľou.
Mal by som spomenúť, že niekto tu na instructables.com má sofistikovanejší stroj s valčekmi:
Potrebný materiál:
Arduino Uno (alebo akékoľvek Arduino)
Servo štít (voliteľné)
9g servo
zavárací uzáver
oceľová guľa
nejaký šrot
Krok 1: Vyrobte si základňu a sklopný držiak uzáveru
Základňa je len kus dreva, na ktorý je možné zavesiť zavesený kus dreva. Kĺbové drevo by malo byť väčšie ako uzáver nádoby, ktorý budete používať, a mal by mať dostatok miesta na pánty a montáž serva.
Použil som malé plastové závesy lietadiel na diaľkové ovládanie a len ich zalepil horným závesom k závesnému drevu a základni.
Krok 2: Predĺžte rameno servo a pripevnite servo
Aby som vyrobil dlhšie servo rameno, pripevnil som k servo ramenu 5 centimetrový kus dreva niekoľkými malými skrutkami a maticami. Rameno serva by malo byť na servo v 90 stupňoch, keď je vodorovne k základni.
Práve som za tepla nalepil servo na sklopný držiak na drevo, ale zistil som, že ak ho necháte bežať dlhšie ako niekoľko minút, servo zohreje horúce lepidlo a pustí ho z dreva. Preto je zaručená lepšia metóda pripevnenia.
Krok 3: Načítajte a spustite náčrt
Svoje servo som pripevnil na pin 7 pomocou štítu, pretože je to jednoducho pohodlné a stoja len pár dolárov. Ak nemáte štít, pripojte signálny vodič serva k pinu 7 na Arduino, červený vodič k 5v na Arduino a uzemňovací vodič k GND na Arduino. Arduino by malo poskytovať dostatok prúdu na obsluhu serva. Používam štít, pretože je ľahké použiť externé napätie iba pre servo.
Tu je náčrt. Napísal som rutinu regulátora rýchlosti serva, aby som zmenil rýchlosť serva, pretože pravdepodobne nebude fungovať dobre pri plnej rýchlosti.
Časovanie oneskorenia môžete zmeniť, aby ste dosiahli rôzne rýchlosti valenia lopty. Na zmenu rýchlosti môžete tiež zmeniť tretí parameter funkcie myServo ().
////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////// //////////////// // vytvoril Jim Demello, Shangluo University, 2017
// pomocou tohto kódu môžete voľne používať, manipulovať a robiť si čokoľvek, moje meno nie je povinné
// Táto rutina umožňuje interpolovať ľubovoľný počet serv, stačí pridať nové riadky, ak počet serva prekročí 4
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////
#zahrnúť
Servo myservo1, myservo2; // vytvorenie objektu serva na ovládanie serva
int servoRead (int servoNumber) {
int servoCurrent;
if (servoNumber == 1) {servoCurrent = myservo1.read (); }
if (servoNumber == 2) {servoCurrent = myservo2.read (); }
vrátiť servoCurrent;
}
void servoWrite (int servoNumber, int offset) {
if (servoNumber == 1) {myservo1.write (offset); }
if (servoNumber == 2) {myservo2.write (offset); }
}
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) {
pre (int uhol = curAngle; uhol <newAngle; uhol += uholInc) {
if (servoNum == 1) myservo1.write (uhol);
if (servoNum == 2) myservo2.write (uhol);
oneskorenie (vrátane oneskorenia); }
}
else if (curAngle> newAngle) {
pre (int uhol = curAngle; uhol> newAngle; uhol -= uholInc) {
if (servoNum == 1) myservo1.write (uhol);
if (servoNum == 2) myservo2.write (uhol);
oneskorenie (vrátane oneskorenia); }
}
}
void interpolate2Servos (int servo1, int servo1Position, int servo2, int servo2Position, int numberSteps, int timeDelay) {
int servo1Current, servo2Current;
servo1Current = servoRead (servo1);
servo2Current = servoRead (servo2);
// Serial.print ("Servo3Pos a aktuálny"); Serial.print (servo3Position); Serial.print (""); Serial.println (servo3Current);
// Serial.print ("Servo4Pos a aktuálny"); Serial.print (servo4Position); Serial.print (""); Serial.println (servo4Current);
// Serial.print ("Servo5Pos a aktuálny"); Serial.print (servo5Position); Serial.print (""); Serial.println (servo5Current);
// Serial.print ("Servo6Pos a aktuálny"); 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;
pre (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 ("Ofset aab" "); Serial.print (aOffsetTotal); Serial.print (""); Serial.println (bOffsetTotal); oneskorenie (10);
oneskorenie (časové oneskorenie);
} // koniec pre
//////////////////////////////////////
// postarajte sa o zvyšky modula //
/////////////////////////////////////
if (servo1Position! = servo1Current) servoWrite (servo1, servo1Position);
if (servo2Position! = servo2Current) servoWrite (servo2, servo2Position);
}
int timingDelay = 100;
int servoDelay = 100;
int degGap = 10;
// Toto je počiatočný stupeň (musí byť menší ako koncový stupeň)
int degStart = 0;
// Toto sú koncové stupne (musia byť väčšie ako počiatočný stupeň)
int degEnd = 360;
// Toto je polomer kruhu
vnútorný polomer = 8;
neplatné nastavenie ()
{
Serial.begin (9600);
oneskorenie (100);
myservo1.attach (7); // pripevní servo na pine 7 k objektu serva
myservo1.write (90);
myservo2.attach (8); // pripevní servo na kolíku 8 k objektu serva
myservo2.write (90);
oneskorenie (1000); // čaká, kým sa tam servo dostane
interpolate2Servos (1, 90, 2, 90, 10, 60); // neutrálne
oneskorenie (1000);
}
prázdna slučka () {
timingDelay = 15; // funguje o 10
servoDelay = 4;
spin4 ();
// interpolate2Servos (1, 90, 2, 90, 1, 60); // neutrálne
// oneskorenie (1000);
// exit (0); // pozastavenie programu - pokračujte kliknutím na reset
}
void spin3 () {
interpolate2Servos (1, 90, 2, 110, 1, 60); // neutrálne
oneskorenie (timingDelay);
interpolate2Servos (1, 90, 2, 80, 1, 60); // neutrálne
oneskorenie (timingDelay);
}
void spin2 () {
// interpolate2Servos (1, 80, 2, 90, 1, 50); // neutrálne
oneskorenie (timingDelay);
interpolate2Servos (1, 80, 2, 80, 1, 60); // neutrálne
oneskorenie (timingDelay);
interpolate2Servos (1, 110, 2, 80, 1, 60); // neutrálne
oneskorenie (timingDelay);
// interpolate2Servos (1, 110, 2, 110, 1, 60); // neutrálne
oneskorenie (timingDelay);
}
void spin1 () {
// int deg = (degStart / (180 / 3,14));
float deg = (degStart * 3,141592 / 180); // prevod stupňov na radiány
plavák xPos = 90 + (cos (deg) * polomer);
// xPos = okrúhly (xPos);
plavák yPos = 90 + (sin (deg) * polomer);
// yPos = okrúhly (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); // neutrálne
myservo1.write (xPos);
myservo2.write (yPos);
oneskorenie (timingDelay);
if (degStart> = degEnd) {
degStart = 0;
ak (degGap> 180)
degGap = 180;
// degGap = 0;
inak
degGap = degGap + 2;
degGap = degGap - 2;
// degStart = degStart +degGap;
}
degStart = degStart + degGap;
}
void spin4 () {
pre (int i = 0; i <= 360; i ++) {
float j = 20 * (cos ((3,14 * i)/180)) + 90;
float k = 20 * (sin ((3,14 * i)/180)) + 90;
myservo1.write (j);
myservo2.write (k);
Serial.print (j);
Serial.print (",");
Serial.println (k);
oneskorenie (100);
}
}