Sommario:
- Passaggio 1: creare una base e un supporto per cappuccio incernierato
- Passaggio 2: allungare il braccio del servo e collegare il servo
- Passaggio 3: caricare ed eseguire lo schizzo
Video: Roller a sfera automatizzato con Arduino e un servo: 3 passaggi
2024 Autore: John Day | [email protected]. Ultima modifica: 2024-01-30 10:00
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
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
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
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:
FLEXBALL - Una Sfera PCB Flessibile da Cento Pixel con WiFi: 6 Passaggi (con Immagini)
FLEXBALL: una sfera PCB flessibile da cento pixel con WiFi: Ciao produttori, è il produttore moekoe! Flexball si basa su un PCB flessibile dotato di 100 LED indirizzabili WS2812 2020. È controllato da un ESP8285-01f, il più piccolo modulo basato su ESP di Espressif. Inoltre ha un accelerometro ADXL345
Layout di ferrovia modello automatizzato con due treni (V2.0) - Basato su Arduino: 15 passaggi (con immagini)
Layout di ferrovia modello automatizzato con due treni (V2.0) | Basato su Arduino: l'automazione dei layout di modellismo ferroviario utilizzando i microcontrollori Arduino è un ottimo modo per unire microcontrollori, programmazione e modellismo ferroviario in un unico hobby. Ci sono un sacco di progetti disponibili sulla gestione autonoma di un treno su un modello di ferrovia
Layout di modellismo ferroviario con raccordo automatizzato: 13 passaggi (con immagini)
Layout di modellini ferroviari con binari di raccordo automatizzati: Realizzare layout di modellini di treni è un grande hobby, automatizzarlo lo renderà molto migliore! Diamo un'occhiata ad alcuni dei vantaggi della sua automazione: Funzionamento a basso costo: l'intero layout è controllato da un microcontrollore Arduino, utilizzando un mo
Motore ad acqua automatizzato con indicatore di livello: 6 passaggi (con immagini)
Motore ad acqua automatizzato con indicatore di livello: Ciao a tutti, benvenuti in un altro Instructable. In questo progetto impareremo come creare un controller del livello del serbatoio dell'acqua completamente automatico con la funzione di indicatore del livello dell'acqua utilizzando Arduino Nano.Arduino è il cervello di questo progetto. Ci vorranno input da
ESP2866 Sfera luminosa con ricarica wireless: 5 passaggi (con immagini)
ESP2866 Light Orb con ricarica wireless: lo scopo di questo progetto è realizzare una semplice lampada controllata tramite Wi-Fi con ricarica wireless. L'intenzione è quella di creare qualcosa di fantastico con pochi componenti. Potrebbe ad esempio essere usato come regalo o luce notturna wireless (o entrambi se lo desideri)