Inhoudsopgave:
2025 Auteur: John Day | [email protected]. Laatst gewijzigd: 2025-01-13 06:57
Dit is een eenvoudig klein Arduino- en servoproject dat ongeveer twee uur in beslag neemt. Het gebruikt een servo om het ene uiteinde van een potdop op te tillen om een stalen bal rond de binnenomtrek te laten draaien. Het is zelfstartend, kan van snelheid veranderen en kan twee (of meer?) ballen tegelijk draaien. Leuk om te bouwen en aan de slag te gaan. Met de timingparameters kan worden gespeeld voor waarschijnlijk nog hogere snelheden. Een paar hall-effectsensoren met een magnetische bal zouden kunnen worden gebruikt om er een slimmere machine van te maken die de beste parameters kan achterhalen.
Ik moet vermelden dat iemand hier op instructables.com een meer geavanceerde balrollermachine heeft:
Benodigde materialen:
Arduino Uno (of een Arduino)
Servo schild (optioneel)
9g-servo
pot dop
stalen kogel
wat sloophout
Stap 1: Maak een basis en scharnierende dophouder
De basis is slechts een homp hout om het scharnierende stuk hout op te monteren. Het scharnierende hout moet groter zijn dan een potdop die u gaat gebruiken en voldoende ruimte hebben voor de scharnieren en om de servo te monteren.
Ik gebruikte kleine plastic scharnieren voor rc-vliegtuigen en plakte ze gewoon aan het scharnierende hout en de basis.
Stap 2: Maak een langere servo-arm en bevestig de servo
Om een langere servo-arm te maken heb ik gewoon een stuk hout van 5 centimeter aan de servo-arm bevestigd met een paar kleine schroeven en moeren. De servo-arm moet zich in een hoek van 90 graden op de servo bevinden wanneer deze horizontaal is ten opzichte van de basis.
Ik heb de servo gewoon warm op de scharnierende houten houder gelijmd, maar ik ontdekte dat als je hem langer dan een paar minuten laat draaien, de servo de hete lijm zal opwarmen en het hout loslaat. Een betere bevestigingsmethode is dus gerechtvaardigd.
Stap 3: Laad en voer Sketch uit
Ik heb mijn servo op pin 7 bevestigd met een schild omdat het gewoon handig is en ze maar een paar dollar kosten. Als je geen schild hebt, bevestig dan de servosignaaldraad aan pin 7 op de Arduino, de rode draad aan 5v op de Arduino en de aardedraad aan GND op de Arduino. De Arduino moet voldoende stroom leveren om de servo te bedienen. Ik gebruik het schild omdat het gemakkelijk is om een externe spanning alleen voor de servo te gebruiken.
Hier is de schets. Ik heb een servo-snelheidsregelaar-routine geschreven om de snelheid van de servo te veranderen, omdat deze waarschijnlijk niet goed zal werken op volle snelheid.
U kunt de timingDelay wijzigen om verschillende snelheden van het rollen van de bal te krijgen. U kunt ook de derde parameter van de functie myServo() wijzigen om ook de snelheid te wijzigen.
////////////////////////////////////////////////// ////////////////////////////////////////////////// ////////////// // gemaakt door Jim Demello, Shangluo University, 2017
// je bent vrij om deze code te gebruiken, te manipuleren, te doen wat je wilt, mijn naam is niet vereist
// Met deze routine kan een willekeurig aantal servo's worden geïnterpoleerd, voeg gewoon nieuwe regels toe als het aantal servo's groter is dan 4
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////
#erbij betrekken
Servo myservo1, myservo2; // maak een servo-object om een servo te besturen
int servoRead (int servoNumber) {
int servoCurrent;
if (servoNumber== 1) { servoCurrent = myservo1.read(); }
if (servoNumber== 2) { servoCurrent = myservo2.read(); }
retour servoCurrent;
}
ongeldig 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 hoek=curAngle;angle < newAngle;angle += angleInc) {
if (servoNum == 1) myservo1.write(hoek);
if (servoNum == 2) myservo2.write(hoek);
vertraging (incDelay); }
}
else if (curAngle > newAngle) {
for(int hoek=curAngle;angle> newAngle;angle -= angleInc) {
if (servoNum == 1) myservo1.write(hoek);
if (servoNum == 2) myservo2.write(hoek);
vertraging (incDelay); }
}
}
void interpolate2Servos(int servo1, int servo1Position, int servo2, int servo2Positie, int numberSteps, int timeDelay){
int servo1Current, servo2Current;
servo1Current = servoRead (servo1);
servo2Current = servoRead (servo2);
// Serial.print ("Servo3Pos en stroom "); Serial.print(servo3Positie); Serieel.print(" "); Serial.println(servo3Current);
// Serial.print ("Servo4Pos en stroom "); Serial.print(servo4Positie); Serieel.print(" "); Serial.println(servo4Current);
// Serial.print ("Servo5Pos en stroom "); Serial.print(servo5Positie); Serieel.print(" "); Serial.println(servo5Current);
// Serial.print ("Servo6Pos en stroom "); Serial.print(servo6Positie); Serieel.print(" "); Serial.println(servo6Current);
// Serieel.println(" ");
int cOffset = (servo1Position - servo1Current); cOffset = abs(cOffset)/numberSteps;
int dOffset = (servo2Position - servo2Current); dOffset = abs(dOffset)/numberSteps;
int cOffsetTotaal=0, dOffsetTotaal=0;
cOffsetTotaal = servo1Current;
dOffsetTotal = servo2Current;
voor (int x=0; x
if (servo1Position > servo1Current) { cOffsetTotal = cOffsetTotal + cOffset; }
anders {cOffsetTotal = cOffsetTotaal - cOffset; }
if (servo2Position> servo2Current) { dOffsetTotal = dOffsetTotal + dOffset; }
anders { dOffsetTotaal = dOffsetTotaal - dOffset; }
if (servo1Position != servo1Current) servoWrite(servo1, cOffsetTotal);
if (servo2Position != servo2Current) servoWrite(servo2, dOffsetTotal);
// Serial.print ("a en b Offset "); Serial.print(aOffsetTotaal); Serial.print(" ");Serial.println(bOffsetTotal); vertraging(10);
vertraging (tijdvertraging);
}// eindigen voor
//////////////////////////////////////
// zorg voor modulo restanten //
/////////////////////////////////////
if (servo1Position != servo1Current) servoWrite(servo1, servo1Position);
if (servo2Position != servo2Current) servoWrite(servo2, servo2Position);
}
int timingDelay = 100;
int servoDelay = 100;
int degGap = 10;
// Dit is de begingraad (moet kleiner zijn dan de eindgraad)
int degStart = 0;
// Dit zijn de eindgraden (moet groter zijn dan de startgraad)
int degEnd = 360;
//Dit is de straal van de cirkel
int-straal = 8;
ongeldige setup()
{
Serieel.begin(9600);
vertraging (100);
mijnservo1.attach(7); // bevestigt de servo op pin 7 aan het servo-object
mijnservo1.write(90);
mijnservo2.attach(8); // bevestigt de servo op pin 8 aan het servo-object
mijnservo2.write(90);
vertraging (1000); // wacht op de servo om daar te komen
interpolate2Servos(1, 90, 2, 90, 10, 60); // neutraal
vertraging (1000);
}
lege lus() {
tijdvertraging = 15; // werkt bij 10
servovertraging = 4;
spin4();
//interpolate2Servos (1, 90, 2, 90, 1, 60); // neutraal
//vertraging (1000);
// uitgang (0); // pauzeer programma - druk op reset om door te gaan
}
ongeldig spin3() {
interpolate2Servos(1, 90, 2, 110, 1, 60); // neutraal
vertraging (timingDelay);
interpolate2Servos(1, 90, 2, 80, 1, 60); // neutraal
vertraging (timingDelay);
}
ongeldig spin2() {
//interpolate2Servos (1, 80, 2, 90, 1, 50); // neutraal
vertraging (timingDelay);
interpolate2Servos(1, 80, 2, 80, 1, 60); // neutraal
vertraging (timingDelay);
interpolate2Servos(1, 110, 2, 80, 1, 60); // neutraal
vertraging (timingDelay);
// interpolate2Servos (1, 110, 2, 110, 1, 60); // neutraal
vertraging (timingDelay);
}
ongeldig spin1() {
// int deg = (degStart / (180 / 3.14));
float deg = (degStart * 3.141592 / 180); // converteer graden naar radialen
float xPos = 90 + (cos(deg) * straal);
// xPos = rond (xPos);
float yPos = 90 + (sin(deg) * straal);
// yPos = rond (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); // neutraal
mijnservo1.write(xPos);
myservo2.write(yPos);
vertraging (timingDelay);
if (degStart >= degEnd) {
degStart = 0;
als (degGap > 180)
degGap = 180;
//degGap = 0;
anders
degGap = degGap + 2;
degGap = degGap - 2;
// degStart = degStart +degGap;
}
degStart = degStart + degGap;
}
ongeldig spin4() {
for(int i=0; i<=360; i++){
zwevend j = 20 * (cos ((3.14 * i)/180)) + 90;
float k = 20 * (sin ((3.14 * i)/180)) + 90;
mijnservo1.write(j);
mijnservo2.write(k);
Seriële.print(j);
Serieel.print(", ");
Serieel.println(k);
vertraging (100);
}
}