Inhoudsopgave:

Geautomatiseerde balroller met Arduino en één servo - Ajarnpa
Geautomatiseerde balroller met Arduino en één servo - Ajarnpa

Video: Geautomatiseerde balroller met Arduino en één servo - Ajarnpa

Video: Geautomatiseerde balroller met Arduino en één servo - Ajarnpa
Video: How to use MicroPython on Your Arduino? 2024, Juli-
Anonim
Image
Image

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

Maak een basis- en scharnierkaphouder
Maak een basis- en scharnierkaphouder

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

Maak een langere servo-arm en bevestig de servo
Maak een langere servo-arm en bevestig de servo
Maak een langere servo-arm en bevestig de servo
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

Schets laden en uitvoeren
Schets laden en uitvoeren

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);

}

}

Aanbevolen: