Obsah:
2025 Autor: John Day | [email protected]. Naposledy změněno: 2025-01-13 06:57
Jedná se o jednoduchý malý projekt Arduino a servo, jehož dokončení trvá přibližně dvě hodiny. Pomocí serva zvedne jeden konec víčka nádoby tak, aby roztáčel ocelovou kouli po vnitřním obvodu. Je to samočinné spouštění, může měnit rychlost a může točit dvě (nebo více?) Koule najednou. Zábava stavět a pracovat. S časovacími parametry lze hrát pravděpodobně ještě rychleji. Mohlo by být použito několik senzorů s Hallovým efektem s magnetickou koulí, aby byl chytřejší stroj, který dokáže zjistit nejlepší parametry.
Měl bych zmínit, že někdo zde na instructables.com má důmyslnější stroj s kuličkovými válečky:
Potřebné materiály:
Arduino Uno (nebo jakékoli Arduino)
Servo štít (volitelně)
9g servo
jar cap
ocelový míč
nějaký šrot
Krok 1: Vyrobte základnu a sklopný držák víčka
Základna je jen kus dřeva, na který lze připevnit závěsný kus dřeva. Kloubové dřevo by mělo být větší než víčko nádoby, které budete používat, a mít dostatek místa pro závěsy a pro montáž serva.
Použil jsem malé plastové závěsy RC letadel a jen je přilepil na závěsné dřevo a základnu.
Krok 2: Vytvořte delší servo rameno a připojte servo
Abych vyrobil delší rameno serva, připevnil jsem na rameno serva 5 centimetrů dřeva pomocí několika malých šroubů a matic. Servo rameno by mělo být na 90 stupňů na servu, když je vodorovně k základně.
Právě jsem za tepla nalepil servo na kloubový držák dřeva, ale zjistil jsem, že pokud ho necháte běžet déle než několik minut, servo zahřeje horké lepidlo a pustí ho ze dřeva. Je tedy zaručena lepší metoda připevnění.
Krok 3: Načtěte a spusťte skicu
Připojil jsem své servo na pin 7 pomocí štítu, protože je to pohodlné a stojí jen pár dolarů. Pokud nemáte štít, připojte signální vodič serva ke kolíku 7 na Arduinu, červený vodič k 5v na Arduinu a uzemňovací vodič k GND na Arduinu. Arduino by mělo poskytovat dostatek proudu pro provoz serva. Používám štít, protože je snadné použít externí napětí jen pro servo.
Tady je skica. Napsal jsem rutinu ovladače rychlosti serva, abych změnil rychlost serva, protože to pravděpodobně nebude fungovat dobře při plné rychlosti.
Můžete změnit časové zpoždění, abyste získali různé rychlosti otáčení míče. Také můžete změnit třetí parametr funkce myServo () a změnit rychlost.
////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////// //////////////// // vytvořil Jim Demello, Shangluo University, 2017
// s tímto kódem můžete svobodně používat, manipulovat, dělat, co chcete, moje jméno není povinné
// Tato rutina umožňuje interpolovat libovolný počet serv, stačí přidat nové řádky, pokud počet serv přesáhne 4
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////
#zahrnout
Servo myservo1, myservo2; // vytvoření objektu serva pro ovládání serva
int servoRead (int servoNumber) {
int servoCurrent;
if (servoNumber == 1) {servoCurrent = myservo1.read (); }
if (servoNumber == 2) {servoCurrent = myservo2.read (); }
vrátit 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) {
for (int angle = curAngle; angle <newAngle; angle += angleInc) {
if (servoNum == 1) myservo1.write (úhel);
if (servoNum == 2) myservo2.write (úhel);
zpoždění (včetně Zpoždění); }
}
else if (curAngle> newAngle) {
for (int angle = curAngle; angle> newAngle; angle -= angleInc) {
if (servoNum == 1) myservo1.write (úhel);
if (servoNum == 2) myservo2.write (úhel);
zpoždění (včetně Zpoždění); }
}
}
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ální"); Serial.print (servo3Position); Serial.print (""); Serial.println (servo3Current);
// Serial.print ("Servo4Pos a aktuální"); Serial.print (servo4Position); Serial.print (""); Serial.println (servo4Current);
// Serial.print ("Servo5Pos a aktuální"); Serial.print (servo5Position); Serial.print (""); Serial.println (servo5Current);
// Serial.print ("Servo6Pos a aktuální"); 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;
pro (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 ("a a b offset"); Serial.print (aOffsetTotal); Serial.print (""); Serial.println (bOffsetTotal); zpoždění (10);
zpoždění (timeDelay);
} // konec pro
//////////////////////////////////////
// postarejte se o zbytky modulo //
/////////////////////////////////////
if (servo1Position! = servo1Current) servoWrite (servo1, servo1Position);
if (servo2Position! = servo2Current) servoWrite (servo2, servo2Position);
}
int timingDelay = 100;
int servoDelay = 100;
int degGap = 10;
// Toto je počáteční stupeň (musí být menší než koncový stupeň)
int degStart = 0;
// Toto jsou koncové stupně (musí být větší než počáteční stupeň)
int degEnd = 360;
// Toto je poloměr kruhu
int poloměr = 8;
neplatné nastavení ()
{
Serial.begin (9600);
zpoždění (100);
myservo1.attach (7); // připojí servo na pinu 7 k objektu serva
myservo1.write (90);
myservo2.attach (8); // připojí servo na pinu 8 k objektu serva
myservo2.write (90);
zpoždění (1000); // čeká, až se tam servo dostane
interpolate2Servos (1, 90, 2, 90, 10, 60); // neutrální
zpoždění (1000);
}
prázdná smyčka () {
timingDelay = 15; // funguje v 10
servoDelay = 4;
spin4 ();
// interpolate2Servos (1, 90, 2, 90, 1, 60); // neutrální
// zpoždění (1000);
// exit (0); // pozastavení programu - pokračujte stisknutím reset
}
void spin3 () {
interpolate2Servos (1, 90, 2, 110, 1, 60); // neutrální
zpoždění (timingDelay);
interpolate2Servos (1, 90, 2, 80, 1, 60); // neutrální
zpoždění (timingDelay);
}
void spin2 () {
// interpolate2Servos (1, 80, 2, 90, 1, 50); // neutrální
zpoždění (timingDelay);
interpolate2Servos (1, 80, 2, 80, 1, 60); // neutrální
zpoždění (timingDelay);
interpolate2Servos (1, 110, 2, 80, 1, 60); // neutrální
zpoždění (timingDelay);
// interpolate2Servos (1, 110, 2, 110, 1, 60); // neutrální
zpoždění (timingDelay);
}
void spin1 () {
// int deg = (degStart / (180 / 3,14));
float deg = (degStart * 3,141592 / 180); // převod stupňů na radiány
float xPos = 90 + (cos (deg) * radius);
// xPos = kulatý (xPos);
float yPos = 90 + (sin (deg) * radius);
// yPos = kulatý (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ální
myservo1.write (xPos);
myservo2.write (yPos);
zpoždění (timingDelay);
if (degStart> = degEnd) {
degStart = 0;
if (degGap> 180)
degGap = 180;
// degGap = 0;
jiný
degGap = degGap + 2;
degGap = degGap - 2;
// degStart = degStart +degGap;
}
degStart = degStart + degGap;
}
void spin4 () {
pro (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);
zpoždění (100);
}
}