Sommario:

Roller a sfera automatizzato con Arduino e un servo: 3 passaggi
Roller a sfera automatizzato con Arduino e un servo: 3 passaggi

Video: Roller a sfera automatizzato con Arduino e un servo: 3 passaggi

Video: Roller a sfera automatizzato con Arduino e un servo: 3 passaggi
Video: costruire un Macchina per Cocktail Domotica con Arduino! - Ep.3 2024, Luglio
Anonim
Image
Image

Questo è un semplice piccolo progetto Arduino e servo che richiede circa due ore per essere completato. Usa un servo per sollevare un'estremità del tappo di un barattolo in modo da far girare una sfera d'acciaio attorno alla circonferenza interna. Si avvia da solo, può cambiare velocità e può far girare due (o più?) palline contemporaneamente. Divertente da costruire e lavorare. È possibile giocare con i parametri di temporizzazione per velocità probabilmente ancora più elevate. Alcuni sensori ad effetto hall con una sfera magnetica potrebbero essere utilizzati per renderlo una macchina più intelligente in grado di calcolare i parametri migliori.

Dovrei menzionare che qualcuno qui su instructables.com ha una macchina con rulli a sfera più sofisticata:

Materiale necessario:

Arduino Uno (o qualsiasi Arduino)

Scudo servo (opzionale)

Servo 9g

tappo del barattolo

palla d'acciaio

un po' di legno di scarto

Passaggio 1: creare una base e un supporto per cappuccio incernierato

Realizza base e supporto per cappelli incernierato
Realizza base e supporto per cappelli incernierato

La base è solo un pezzo di legno su cui montare il pezzo di legno incernierato. Il legno incernierato dovrebbe essere più grande di un tappo di vaso che utilizzerai e avere abbastanza spazio per le cerniere e per montare il servo.

Ho usato piccole cerniere di plastica per velivoli e le ho semplicemente incollate al legno incernierato e alla base.

Passaggio 2: allungare il braccio del servo e collegare il servo

Allunga il braccio del servo e attacca il servo
Allunga il braccio del servo e attacca il servo
Allunga il braccio del servo e attacca il servo
Allunga il braccio del servo e attacca il servo

Per realizzare un braccio del servo più lungo ho semplicemente attaccato un pezzo di legno di 5 centimetri al braccio del servo con un paio di piccole viti e dadi. Il braccio del servo dovrebbe essere a 90 gradi sul servo quando è orizzontale rispetto alla base.

Ho appena incollato a caldo il servo al supporto in legno incernierato, ma ho scoperto che se lo lasci funzionare per più di qualche minuto, il servo riscalderà la colla a caldo e lascerà andare il legno. Quindi è garantito un metodo di attaccamento migliore.

Passaggio 3: caricare ed eseguire lo schizzo

Carica ed esegui schizzo
Carica ed esegui schizzo

Ho collegato il mio servo al pin 7 usando uno scudo perché è semplicemente conveniente e costano solo pochi dollari. Se non hai uno scudo, collega il filo del segnale del servo al pin 7 su Arduino, il filo rosso a 5v su Arduino e il filo di terra a GND su Arduino. L'arduino dovrebbe fornire abbastanza corrente per azionare il servo. Uso lo shield perché è facile usare una tensione esterna solo per il servo.

Ecco lo schizzo. Ho scritto una routine di controllo della velocità del servo in modo da alterare la velocità del servo perché probabilmente non funzionerà bene alla massima velocità.

È possibile modificare il timingDelay per ottenere diverse velocità di rotolamento della palla. Puoi anche modificare il terzo parametro della funzione myServo() per cambiare anche la velocità.

///////////////////////////////////////////////// ///////////////////////////////////////////////// ////////////// // creato da Jim Demello, Shangluo University, 2017

// sei libero di usare, manipolare, fare quello che vuoi con questo codice, il mio nome non è richiesto

// Questa routine consente di interpolare qualsiasi numero di servi, basta aggiungere nuove righe se il numero di servi supera 4

//////////////////////////////////////////////////////////////////////////////////////////////////////////////////

#includere

Servo mioservo1, mioservo2; // crea un oggetto servo per controllare un servo

int servoRead(int servoNumber) {

int servoCorrente;

if (servoNumber== 1) { servoCurrent = myservo1.read(); }

if (servoNumber== 2) { servoCurrent = myservo2.read(); }

ritorno servocorrente;

}

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 angolo di curvatura;

if (servoNum== 1) { curAngle = myservo1.read(); }

if (servoNum== 2) { curAngle = myservo2.read(); }

if (curAngle < newAngle) {

for(int angolo=angolocur;angolo < nuovoAngolo;angolo += angoloInc) {

if (servoNum == 1) myservo1.write(angolo);

if (servoNum == 2) myservo2.write(angolo);

ritardo(incDelay); }

}

else if (curAngle > newAngle) {

for(int angolo=angolocurva;angolo > nuovoAngolo;angolo -= angoloInc) {

if (servoNum == 1) myservo1.write(angolo);

if (servoNum == 2) myservo2.write(angolo);

ritardo(incDelay); }

}

}

void interpolate2Servos(int servo1, int servo1Position, int servo2, int servo2Position, int numeroPassi, int timeDelay){

int servo1Corrente, servo2Corrente;

servo1Current = servoRead(servo1);

servo2Current = servoRead(servo2);

// Serial.print("Servo3Pos e Current "); Serial.print(servo3Position); Serial.print(" "); Serial.println(servo3Current);

// Serial.print("Servo4Pos e Current "); Serial.print(servo4Position); Serial.print(" "); Serial.println(servo4Current);

// Serial.print("Servo5Pos e Current "); Serial.print(servo5Position); Serial.print(" "); Serial.println(servo5Current);

// Serial.print("Servo6Pos e 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;

per (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 e b offset "); Serial.print(aOffsetTotal); Serial.print(" ");Serial.println(bOffsetTotal); ritardo(10);

ritardo(timeDelay);

}// termina per

//////////////////////////////////////

// mi occupo dei resti del modulo //

/////////////////////////////////////

if (servo1Position != servo1Current) servoWrite(servo1, servo1Position);

if (servo2Position != servo2Current) servoWrite(servo2, servo2Position);

}

int timingDelay = 100;

int servoDelay = 100;

int degGap = 10;

// Questo è il grado iniziale (deve essere inferiore al grado finale)

int degStart = 0;

// Questi sono i gradi finali (deve essere maggiore del grado iniziale)

int degEnd = 360;

//Questo è il raggio del cerchio

int raggio = 8;

configurazione nulla()

{

Serial.begin(9600);

ritardo(100);

mioservo1.attach(7); // collega il servo sul pin 7 all'oggetto servo

mioservo1.write(90);

myservo2.attach(8); // collega il servo sul pin 8 all'oggetto servo

myservo2.write(90);

ritardo(1000); // aspetta che arrivi il servo

interpolate2Servos(1, 90, 2, 90, 10, 60); // neutro

ritardo(1000);

}

ciclo vuoto() {

temporizzazione Ritardo = 15; // lavora a 10

servoRitardo = 4;

spin4();

//interpolate2Servos(, 90, 2, 90, 1, 60); // neutro

//ritardo(1000);

// uscita (0); //pausa programma - premi reset per continuare

}

void spin3() {

interpolate2Servos(1, 90, 2, 110, 1, 60); // neutro

delay(timingDelay);

interpolate2Servos(1, 90, 2, 80, 1, 60); // neutro

delay(timingDelay);

}

void spin2() {

//interpolate2Servos(, 80, 2, 90, 1, 50); // neutro

delay(timingDelay);

interpolate2Servos(1, 80, 2, 80, 1, 60); // neutro

delay(timingDelay);

interpolate2Servos(1, 110, 2, 80, 1, 60); // neutro

delay(timingDelay);

//interpolate2Servos(1, 110, 2, 110, 1, 60); // neutro

delay(timingDelay);

}

void spin1() {

// int deg = (degStart / (180 / 3.14));

float deg = (degStart * 3.141592 / 180); // converte i gradi in radianti

float xPos = 90 + (cos(deg) * raggio);

// xPos = round(xPos);

float yPos = 90 + (sin(deg) * raggio);

// yPos = round(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); // neutro

mioservo1.write(xPos);

myservo2.write(yPos);

delay(timingDelay);

if (degStart >= degEnd) {

degStart = 0;

if (degGap > 180)

gradiGap = 180;

//degGap = 0;

altro

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;

float k = 20 * (sin ((3.14 * i)/180)) + 90;

mioservo1.write(j);

mioservo2.write(k);

Serial.print(j);

Serial.print(", ");

Serial.println(k);

ritardo(100);

}

}

Consigliato: