Innholdsfortegnelse:
- Trinn 1: Lag base og hengslet hetteholder
- Trinn 2: Lag en lengre servoarm og fest servoen
- Trinn 3: Last og kjør skisse
Video: Automatisert ballrulle med Arduino og en servo: 3 trinn
2024 Forfatter: John Day | [email protected]. Sist endret: 2024-01-30 11:21
Dette er et enkelt lite Arduino- og servoprosjekt som tar omtrent to timer å fullføre. Den bruker en servo til å løfte den ene enden av et glasslokk for å snurre en stålkule rundt den indre omkretsen. Den starter selv, kan endre hastighet og kan snurre to (eller flere?) Baller samtidig. Morsomt å bygge og komme i gang. Timingsparametrene kan spilles med for sannsynligvis enda raskere hastigheter. Noen få hall -effektsensorer med en magnetisk ball kan brukes til å gjøre den til en smartere maskin som kan finne ut de beste parameterne.
Jeg skal nevne at noen her på instructables.com har en mer sofistikert ballrullemaskin:
Materialer som trengs:
Arduino Uno (eller hvilken som helst Arduino)
Servoskjold (valgfritt)
9g servo
glasslokk
stål ball
litt skrapvirke
Trinn 1: Lag base og hengslet hetteholder
Basen er bare et stykke tre å montere det hengslede treverket på. Det hengslede treverket skal være større enn et glasshett som du vil bruke og ha nok plass til hengslene og til å montere servoen.
Jeg brukte små rc -flyhengsler av plast og limte dem bare til det hengslede treet og basen.
Trinn 2: Lag en lengre servoarm og fest servoen
For å lage en lengre servoarm, festet jeg bare et 5 centimeter stykke tre til servoarmen med et par små skruer og muttere. Servoarmen skal være 90 grader på servoen når den er horisontal i forhold til basen.
Jeg har akkurat limt servoen til den hengslede treholderen, men jeg fant ut at hvis du lar den gå i mer enn noen minutter, vil servoen varme opp det varme limet og slippe fra treet. Så en bedre festemetode er berettiget.
Trinn 3: Last og kjør skisse
Jeg festet servoen min til pin 7 ved hjelp av et skjold fordi det er praktisk og de koster bare noen få dollar. Hvis du ikke har et skjerm, kobler du servosignaltråden til pinne 7 på Arduino, den røde ledningen til 5v på Arduino og jordledningen til GND på Arduino. Arduinoen skal gi nok strøm til å betjene servoen. Jeg bruker skjoldet fordi det er enkelt å bruke en ekstern spenning bare for servoen.
Her er skissen. Jeg skrev en servohastighetsregulator -rutine for å endre hastigheten på servoen fordi den sannsynligvis ikke vil fungere bra ved full hastighet.
Du kan endre timingDelay for å få forskjellige rullingshastigheter. Du kan også endre den tredje parameteren i myServo () -funksjonen for å også endre hastighet.
//////////////////////////////////////////// ///////////////////////////////////////////// //////////////// // laget av Jim Demello, Shangluo University, 2017
// du er fri til å bruke, manipulere, gjøre hva du vil med denne koden, mitt navn er ikke nødvendig
// Denne rutinen gjør at et hvilket som helst antall servoer kan interpoleres, bare legg til nye linjer hvis antall servoer overstiger 4
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////
#inkludere
Servo myservo1, myservo2; // lage servoobjekt for å kontrollere en servo
int servoRead (int servoNumber) {
int servoCurrent;
if (servoNumber == 1) {servoCurrent = myservo1.read (); }
if (servoNumber == 2) {servoCurrent = myservo2.read (); }
returner 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;
hvis (servoNum == 1) {curAngle = myservo1.read (); }
hvis (servoNum == 2) {curAngle = myservo2.read (); }
if (curAngle <newAngle) {
for (int vinkel = curAngle; vinkel <newAngle; vinkel += vinkelInc) {
hvis (servoNum == 1) myservo1.write (vinkel);
hvis (servoNum == 2) myservo2.write (vinkel);
forsinkelse (incDelay); }
}
else if (curAngle> newAngle) {
for (int vinkel = curAngle; vinkel> nyAngle; vinkel -= vinkelInc) {
hvis (servoNum == 1) myservo1.write (vinkel);
hvis (servoNum == 2) myservo2.write (vinkel);
forsinkelse (incDelay); }
}
}
void interpolate2Servos (int servo1, int servo1Position, int servo2, int servo2Posisjon, int numberSteps, int timeDelay) {
int servo1Current, servo2Current;
servo1Current = servoRead (servo1);
servo2Current = servoRead (servo2);
// Serial.print ("Servo3Pos og Current"); Serial.print (servo3Position); Serial.print (""); Serial.println (servo3Current);
// Serial.print ("Servo4Pos og Current"); Serial.print (servo4Position); Serial.print (""); Serial.println (servo4Current);
// Serial.print ("Servo5Pos og Current"); Serial.print (servo5Position); Serial.print (""); Serial.println (servo5Current);
// Serial.print ("Servo6Pos og Current"); 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;
for (int x = 0; x
if (servo1Position> servo1Current) {cOffsetTotal = cOffsetTotal + cOffset; }
annet {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 og b Offset"); Serial.print (aOffsetTotal); Serial.print (""); Serial.println (bOffsetTotal); forsinkelse (10);
forsinkelse (timeDelay);
} // slutt for
//////////////////////////////////////
// ta vare på modulo -rester //
/////////////////////////////////////
if (servo1Position! = servo1Current) servoWrite (servo1, servo1Position);
if (servo2Position! = servo2Current) servoWrite (servo2, servo2Position);
}
int timingDelay = 100;
int servoDelay = 100;
int degGap = 10;
// Dette er startgraden (må være mindre enn sluttgrad)
int degStart = 0;
// Dette er sluttgradene (må være større enn startgraden)
int degEnd = 360;
// Dette er sirkelradiusen
int radius = 8;
ugyldig oppsett ()
{
Serial.begin (9600);
forsinkelse (100);
myservo1.attach (7); // fester servoen på pinne 7 til servoobjektet
myservo1.write (90);
myservo2.attach (8); // fester servoen på pinne 8 til servoobjektet
myservo2.write (90);
forsinkelse (1000); // venter på at servoen kommer dit
interpolate2Servos (1, 90, 2, 90, 10, 60); // nøytral
forsinkelse (1000);
}
void loop () {
timingDelay = 15; // jobber klokken 10
servoDelay = 4;
spin4 ();
// interpolate2Servos (1, 90, 2, 90, 1, 60); // nøytral
// forsinkelse (1000);
// exit (0); // pause program - trykk på reset for å fortsette
}
void spin3 () {
interpolate2Servos (1, 90, 2, 110, 1, 60); // nøytral
forsinkelse (timingDelay);
interpolate2Servos (1, 90, 2, 80, 1, 60); // nøytral
forsinkelse (timingDelay);
}
void spin2 () {
// interpolate2Servos (1, 80, 2, 90, 1, 50); // nøytral
forsinkelse (timingDelay);
interpolate2Servos (1, 80, 2, 80, 1, 60); // nøytral
forsinkelse (timingDelay);
interpolate2Servos (1, 110, 2, 80, 1, 60); // nøytral
forsinkelse (timingDelay);
// interpolate2Servos (1, 110, 2, 110, 1, 60); // nøytral
forsinkelse (timingDelay);
}
void spin1 () {
// int deg = (degStart / (180 / 3.14));
flyte deg = (degStart * 3.141592 / 180); // konvertere grader til radianer
flyte xPos = 90 + (cos (deg) * radius);
// xPos = rund (xPos);
float yPos = 90 + (sin (deg) * radius);
// yPos = rund (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); // nøytral
myservo1.write (xPos);
myservo2.write (yPos);
forsinkelse (timingDelay);
if (degStart> = degEnd) {
degStart = 0;
hvis (degGap> 180)
degGap = 180;
// degGap = 0;
ellers
degGap = degGap + 2;
degGap = degGap - 2;
// degStart = degStart +degGap;
}
degStart = degStart + degGap;
}
void spin4 () {
for (int i = 0; i <= 360; i ++) {
float j = 20 * (cos ((3.14 * i)/180)) + 90;
flyte k = 20 * (sin ((3.14 * i)/180)) + 90;
myservo1.write (j);
myservo2.write (k);
Serial.print (j);
Serial.print (",");
Serial.println (k);
forsinkelse (100);
}
}
Anbefalt:
Akvariedesign med automatisert kontroll av grunnleggende parametere: 4 trinn (med bilder)
Akvariedesign med automatisert kontroll av grunnleggende parametere: Introduksjon I dag er marin akvariumpleie tilgjengelig for alle akvarister. Problemet med å skaffe seg et akvarium er ikke vanskelig. Men for innbyggernes fulle livsstøtte, beskyttelse mot tekniske feil, enkelt og raskt vedlikehold og pleie
Automatisert modellbaneoppsett som kjører to tog (V2.0) - Arduino -basert: 15 trinn (med bilder)
Automatisert modellbaneoppsett som kjører to tog (V2.0) | Arduino -basert: Automatisering av modelljernbanelinjer ved hjelp av Arduino -mikrokontrollere er en fin måte å slå sammen mikrokontrollere, programmering og modelljernbane til en hobby. Det er en haug med prosjekter tilgjengelig for å kjøre et tog autonomt på en modelljernbane
Modelljernbanelayout med automatisert sidespor: 13 trinn (med bilder)
Modelljernbanelayout med automatisert sidespor: Å lage modelltogoppsett er en flott hobby, og automatisering av det vil gjøre det mye bedre! La oss ta en titt på noen av fordelene med automatiseringen: Billig drift: Hele oppsettet styres av en Arduino mikrokontroller, ved hjelp av en L298N mo
Enkel automatisert modellbaneoppsett - Arduino kontrollert: 11 trinn (med bilder)
Enkel automatisert modelljernbaneoppsett | Arduino kontrollert: Arduino mikrokontrollere er et flott tillegg til modelljernbaner, spesielt når det gjelder automatisering. Her er en enkel og enkel måte å komme i gang med modelljernbaneautomatisering med Arduino. Så, uten videre, la oss komme i gang
Automatisert vannmotor med nivåindikator: 6 trinn (med bilder)
Automatisert vannmotor med nivåindikator: Hei alle, velkommen til nok en instruerbar. I dette prosjektet vil vi lære å lage en helautomatisk vanntanknivåkontroller med vannstandsindikatorfunksjon ved hjelp av Arduino Nano. Arduino er hjernen til dette prosjektet. Det vil ta innspill fra