Table des matières:

Rouleau à billes automatisé avec Arduino et un servo : 3 étapes
Rouleau à billes automatisé avec Arduino et un servo : 3 étapes

Vidéo: Rouleau à billes automatisé avec Arduino et un servo : 3 étapes

Vidéo: Rouleau à billes automatisé avec Arduino et un servo : 3 étapes
Vidéo: La vérité derrière le personnage de Farine de Blé 2024, Juillet
Anonim
Image
Image

Il s'agit d'un simple petit projet Arduino et servo qui prend environ deux heures. Il utilise un servo pour soulever une extrémité d'un bouchon de pot afin de faire tourner une bille d'acier autour de la circonférence intérieure. Il démarre automatiquement, peut changer de vitesse et peut faire tourner deux (ou plus ?) balles à la fois. Amusant à construire et à travailler. Les paramètres de synchronisation peuvent être joués avec des vitesses probablement encore plus rapides. Quelques capteurs à effet Hall avec une boule magnétique pourraient être utilisés pour en faire une machine plus intelligente capable de déterminer les meilleurs paramètres.

Je dois mentionner que quelqu'un ici à instructables.com a une machine à rouleaux à billes plus sophistiquée:

Les matériaux nécessaires:

Arduino Uno (ou n'importe quel Arduino)

Bouclier servo (facultatif)

Servo 9g

bouchon de pot

bille d'acier

quelques chutes de bois

Étape 1: Fabriquer la base et le porte-capuchon à charnière

Faire la base et le support de capuchon articulé
Faire la base et le support de capuchon articulé

La base est juste un morceau de bois sur lequel monter le morceau de bois articulé. Le bois à charnière doit être plus grand qu'un couvercle de bocal que vous utiliserez et avoir suffisamment de place pour les charnières et pour monter le servo.

J'ai utilisé de petites charnières d'avion rc en plastique et je les ai juste collées à chaud sur le bois à charnière et la base.

Étape 2: faites un bras servo plus long et fixez le servo

Faire un bras de servo plus long et attacher le servo
Faire un bras de servo plus long et attacher le servo
Faire un bras de servo plus long et attacher le servo
Faire un bras de servo plus long et attacher le servo

Pour faire un bras de servo plus long, j'ai juste attaché un morceau de bois de 5 centimètres au bras de servo avec quelques petites vis et écrous. Le bras du servo doit être à 90 degrés sur le servo lorsqu'il est horizontal par rapport à la base.

Je viens de coller à chaud le servo sur le support en bois à charnière, mais j'ai constaté que si vous le laissez fonctionner plus de quelques minutes, le servo chauffera la colle chaude et lâchera le bois. Une meilleure méthode de fixation est donc justifiée.

Étape 3: Charger et exécuter l'esquisse

Charger et exécuter l'esquisse
Charger et exécuter l'esquisse

J'ai attaché mon servo à la broche 7 à l'aide d'un blindage car c'est juste pratique et ils ne coûtent que quelques dollars. Si vous n'avez pas de blindage, fixez le fil de signal du servo à la broche 7 de l'Arduino, le fil rouge à 5v sur l'Arduino et le fil de terre à GND sur l'Arduino. L'arduino doit fournir suffisamment de courant pour faire fonctionner le servo. J'utilise le shield car il est facile d'utiliser une tension externe juste pour le servo.

Voici le croquis. J'ai écrit une routine de contrôleur de vitesse d'asservissement afin de modifier la vitesse du servo car il ne fonctionnera probablement pas bien à pleine vitesse.

Vous pouvez modifier le timingDelay pour obtenir différentes vitesses de roulement de balle. Vous pouvez également modifier le troisième paramètre de la fonction myServo() pour modifier également la vitesse.

/////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////// ////////////// // créé par Jim Demello, Shangluo University, 2017

// vous êtes libre d'utiliser, manipuler, faire ce que vous voulez avec ce code, mon nom n'est pas requis

// Cette routine permet d'interpoler n'importe quel nombre de servos, il suffit d'ajouter de nouvelles lignes si le nombre de servos dépasse 4

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

#comprendre

Servo myservo1, myservo2; // créer un objet servo pour contrôler un servo

int servoRead(int servoNumber) {

int servoCurrent;

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

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

retour servoCurrent;

}

void servoWrite(int servoNumber, int offset) {

if (servoNumber==1) { monservo1.write(offset); }

if (servoNumber==2) { monservo2.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 angle=curAngle;angle < newAngle;angle += angleInc) {

if (servoNum == 1) monservo1.write(angle);

if (servoNum == 2) monservo2.write(angle);

delay(incDelay); }

}

else if (curAngle > newAngle) {

for(int angle=curAngle;angle > newAngle;angle -= angleInc) {

if (servoNum == 1) monservo1.write(angle);

if (servoNum == 2) monservo2.write(angle);

delay(incDelay); }

}

}

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

int servo1Current, servo2Current;

servo1Current = servoRead(servo1);

servo2Current = servoRead(servo2);

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

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

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

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

int cOffsetTotal=0, dOffsetTotal=0;

cOffsetTotal = servo1Current;

dOffsetTotal = servo2Current;

pour (entier 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 et b Offset "); Serial.print(aOffsetTotal); Serial.print(" ");Serial.println(bOffsetTotal); retard(10);

delay(timeDelay);

}// fin pour

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

// prend en charge les restes modulo //

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

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

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

}

int timingDelay = 100;

int servoDelay = 100;

int degGap = 10;

// Ceci est le degré de départ (doit être inférieur au degré de fin)

int degDébut = 0;

// Ce sont les degrés de fin (doit être supérieur au degré de début)

int degEnd = 360;

//C'est le rayon du cercle

rayon int = 8;

void setup()

{

Serial.begin(9600);

retard (100);

monservo1.attach(7); // attache le servo sur la broche 7 à l'objet servo

monservo1.write(90);

monservo2.attach(8); // attache le servo sur la broche 8 à l'objet servo

monservo2.write(90);

retard(1000); // attend que le servo y arrive

interpoler2Servos(1, 90, 2, 90, 10, 60); // neutre

retard(1000);

}

boucle vide() {

Délai de synchronisation = 15; // travaille à 10

Délai d'asservissement = 4;

spin4();

//interpoler2Servos(1, 90, 2, 90, 1, 60); // neutre

//retard(1000);

// sortie(0); //pause programme - appuyez sur reset pour continuer

}

void spin3() {

interpoler2Servos(1, 90, 2, 110, 1, 60); // neutre

delay(timingDelay);

interpoler2Servos(1, 90, 2, 80, 1, 60); // neutre

delay(timingDelay);

}

void spin2() {

//interpoler2Servos(1, 80, 2, 90, 1, 50); // neutre

delay(timingDelay);

interpoler2Servos(1, 80, 2, 80, 1, 60); // neutre

delay(timingDelay);

interpoler2Servos(1, 110, 2, 80, 1, 60); // neutre

delay(timingDelay);

//interpoler2Servos(1, 110, 2, 110, 1, 60); // neutre

delay(timingDelay);

}

void spin1() {

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

float deg = (degStart * 3.141592 / 180); // convertir les degrés en radians

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

// xPos = round(xPos);

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

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

// interpoler2Servos(1, xPos, 2, yPos, 1, servoDelay); // neutre

monservo1.write(xPos);

monservo2.write(yPos);

delay(timingDelay);

if (degStart >= degEnd) {

degDébut = 0;

si (degGap > 180)

degGap = 180;

//degGap = 0;

autre

degGap = degGap + 2;

degGap = degGap - 2;

// degStart = degStart +degGap;

}

degStart = degStart + degGap;

}

void spin4() {

for(int i=0; i<=360; i++){

flottant j = 20 * (cos ((3.14 * i)/180)) + 90;

flottant k = 20 * (péché ((3.14 * i)/180)) + 90;

monservo1.write(j);

monservo2.write(k);

Serial.print(j);

Serial.print(", ");

Serial.println(k);

retard (100);

}

}

Conseillé: