Table des matières:

Comment créer un robot de basket-ball autonome à l'aide d'un IRobot créé comme base : 7 étapes (avec photos)
Comment créer un robot de basket-ball autonome à l'aide d'un IRobot créé comme base : 7 étapes (avec photos)

Vidéo: Comment créer un robot de basket-ball autonome à l'aide d'un IRobot créé comme base : 7 étapes (avec photos)

Vidéo: Comment créer un robot de basket-ball autonome à l'aide d'un IRobot créé comme base : 7 étapes (avec photos)
Vidéo: Cette Fille a 200 de QI 2024, Novembre
Anonim
Comment créer un robot de basket-ball autonome à l'aide d'un IRobot créé comme base
Comment créer un robot de basket-ball autonome à l'aide d'un IRobot créé comme base

Ceci est mon entrée pour le défi iRobot Create. La partie la plus difficile de tout ce processus pour moi a été de décider ce que le robot allait faire. Je voulais démontrer les fonctionnalités intéressantes de Create, tout en ajoutant une touche de robot. Toutes mes idées semblaient soit tomber dans la catégorie des ennuyeux mais utiles, soit cool et peu pratiques. À la fin, cool et peu pratique l'a emporté et le robot de basket-ball est né. Après réflexion, j'ai réalisé que cela pouvait être pratique. Supposons que vous utilisiez du papier orange et que toutes vos poubelles aient des panneaux verts…

Étape 1: Acquérir des pièces

En raison de la limite de temps du concours, la plupart des pièces que j'ai utilisées étaient « sur étagère ». Pièces de robot "stock" utilisées: Créer (x1) -- à partir d'iRobot www.irobot.comXBC V.3.0 (x1) -- à partir de Botball www.botball.orgCréer un câble Roomba (x1) -- à partir de Botball www.botball.orgServo (x2) -- de Botball www.botball.orgTélémètre pointu (x1) -- de Botball www.botball.orgBriques LEGO assorties -- de LEGO www.lego.com6-32 vis à métaux (x4) -- de McMaster www.mcmaster.com "Created" Robot Parts Used: feuille de PVC extrudée de 3/8" d'épaisseur - ce truc est génial, mais je ne me souviens pas d'où je l'ai eu, mais c'est comme ça https://www.lynxmotion.com/Category.aspx?CategoryID=62Autres parties: Ballon orange "POOF" -- de WalMart Poubelle ressemblant à un but de basket -- de LowesGreen " backboard " -- extra PVC peint en vert vif

Étape 2: créer la pièce unique

Créer la pièce unique
Créer la pièce unique

La seule pièce que j'ai dû fabriquer était une plaque boulonnée au Create et offrant un espacement LEGO. L'espacement des trous des briques LEGO est de 8 mm, mais j'ai fait un double espacement pour gagner du temps. Le PVC extrudé est un jeu d'enfant à travailler. Il peut être coupé avec un couteau utilitaire, mais il est rigide et solide. Je prends souvent le robot par cette plaque et je n'ai pas encore eu de problème.

Étape 1: Coupez la feuille à 3,5" x 9,5", vous pouvez la couper avec un couteau tout usage. Étape 2: Percez les trous pour les vis de création. Les vis de création forment une boîte de 2 et 5/8" par 8 et 5/8". Étape 3: percez les trous espacés des briques LEGO. Utilisez un foret de 3/16" et j'ai espacé les trous de 16 mm. Astuce: j'ai disposé la feuille dans un programme de CAO, l'ai imprimée en taille réelle et collée sur la feuille. Ensuite, je l'ai utilisé comme guide pour la découpe et forage.

Étape 3: Assemblage du robot

Assemblage du robot
Assemblage du robot
Assemblage du robot
Assemblage du robot
Assemblage du robot
Assemblage du robot

J'aime construire des choses aussi simplement que possible, de cette façon, quand elles sautent de la table, vous n'avez pas à reconstruire autant !

1. Vissez la plaque nouvellement façonnée sur le dessus du Create 2. Construisez un bras pour saisir le ballon 3. Construisez un bras pour tenir la caméra 4. Construisez un support pour le télémètre 5. Montez le XBC et connectez tous les câbles

Étape 4: Programmation du robot

J'ai décidé d'utiliser le XBC comme contrôleur principalement à cause de son suivi des couleurs intégré. Parce que j'ai décidé d'utiliser le XBC comme cerveau de l'opération, j'ai programmé mon robot en Interactive C, ou comme je l'appelle IC. IC est gratuit et peut être téléchargé sur www.botball.org. IC est très similaire à C++, mais possède plusieurs bibliothèques intégrées. Il s'avère que David Miller de l'Université d'Oklahoma a écrit une bibliothèque pour le Create qui peut être téléchargée à partir de sa page à l'adresse https://i-borg.engr.ou.edu/~dmiller/create/. Avec ces ressources et les manuels de création, j'étais prêt à programmer. Mais le prochain grand défi était qu'est-ce que je voulais qu'il fasse ? Je voulais un robot qui puisse aller ramasser des balles oranges et les marquer dans un panier. Mon objectif semblait simple, et aurait probablement pu l'être, mais plus je me penchais sur ce que le Create pouvait faire, plus je voulais qu'il le fasse. Ma liste finale ressemblait à ceci:1. Trouvez la boule orange2. Ramassez la boule orange3. Localisez le panier4. Mettez le ballon dans le panierWhile1. Éviter les objets2. Ne rien tomber (comme une table)3. Détecter la charge de la batterie et s'arrimer à la base d'accueil lorsqu'elle est faibleOh, et tout cela est complètement autonome, c'est-à-dire que tout est préprogrammé.

Étape 5: Coder

C'est peut-être compliqué, mais ça marche.#use "createlib.ic"#use "xbccamlib.ic"#define cam 0//camera servo port#define arm 3//arm servo port#define et (analog(0)) //et port/*Le câble de création doit également être branché. La prise d'alimentation, la prise à 3 broches dans le port 8 et celle étiquetée UX dans JP 28 (à côté du port USB) avec le U vers la caméra*/ #define c_down 5//camera servo down#define a_down 17//arm servo down#define hold 50//servo hold ball#define attrapé 27//bras servo position pour éviter de se coincer sur la table#define shoot 150//servo lancer la balle#define track_c 25//camera servo track close position#define track_f 45//caméra servo track position éloignée#define center 120//center of camera vision#define inrange 30//track_y coordonnée quand la balle est dans la griffe#define ball 0//canal de la balle orange#define ball_x (track_x(ball, 0))//coordonnée x de la balle#define ball_y (track_y(ball, 0))//coordonnée y de la balle#define slow 100//speed of slow motor#define fast 175//speed of fast motor#define clear 0.2//s bondir pour reculer devant les obstacles#définir le temps 0.5 //1.0 est un virage à droite de 90 degrés#définir le repos 0,05//temps de dormir tout en suivant les blobs#définir la vitessea 175//vitesse de tourner à éviter#define back_s -200//speed to loin de l'objet heurté#define straight 32767//conduire en ligne droite#define backb 2//canal de la couleur principale du panneau#define square 1//canal de la couleur d'accent du panneau#define track_d 250//position de la caméra pour le suivi de l'objectif# define track_find 70//position de la caméra pour un suivi long#define reverse 2.25//temps de sommeil pour un 180#define back_f -150//back fast speed#define back_sl -125//back slow speed#define center_x 178//true x center of cam#define center_y 146//true y center of camint pida;//éviter le processus pidb;//track processint pidc;//score processint have_ball = 0;//indique quelle fonction nous sommes invoid main(){ long ch; enable_servos();//activer les servos init_camera();//démarrer la caméra cconnect();//connecter pour créer avec un contrôle total start_a();//démarrer la fonction d'évitement start_b();//démarrer la fonction ball_tracking while(1) { if(r_button()||gc_ldrop||gc_rdrop){//si ramassé ou bouton d'épaule r kill(pida); tuer(pidb); tuer(pidc); disable_servos(); déconnecter(); pause;} create_battery_charge(); display_clear(); printf("charge = %l\n", gc_battery_charge); if(gc_battery_charge<1200l||b_button()){ kill(pida); tuer(pidb); tuer(pidc); lancer(); have_ball=0; create_demo(1); while(b_button()); while(gc_battery_charge<2800l&&!b_button()){ create_battery_charge(); display_clear(); printf("charge = %l\n", gc_battery_charge); sommeil(1.0);} cconnect(); arrière(); sommeil(2.0); commencer un(); start_b();} }}void Avoid(){ while(1){//repeat forever create_sensor_update();//mettre à jour toutes les valeurs du capteur //create_drive (speeda, straight); if(gc_lbump==1){//left bump Avoid_right();}//tourne à droite pour éviter else if(gc_rbump==1){//right bump Avoid_left();}//tourne à gauche pour éviter else if(gc_lfcliff==1){//falaise avant gaucheevi_right();} else if(gc_rfcliff==1){//falaise avant droiteevi_left();} else if(gc_lcliff==1){//falaise gaucheevi_right();} else if(gc_rcliff==1){//right cliff Avoid_left();} }}void track_ball(){ kill(pidc); while(!have_ball){//répéter jusqu'à obtenir la balle track_update(); far();//définit la caméra prête();//définit le bras while(et<255){//jusqu'à ce que la valeur maximale se produise lorsque la balle est attrapée track_update();//met à jour l'image de la caméra if(ball_x<=(center-5)){//si la balle est laissée track_update(); create_drive_direct(lent, rapide);//tourner à gauche sleep(rest);} else if(ball_x>=(center+5)){//si la balle est à droite track_update(); create_drive_direct(rapide, lent);// tourner à droite sleep(rest);} else if(ball_x(center-5)){// si la balle est centrée track_update(); create_drive_straight(fast);//go straight sleep(rest);} } grab();//grab ball beep();//make noise stop();//stop driving have_ball=1;//make note that J'ai la balle } start_c();//trouver le panier sleep(1.0);//sommeil pour que je ne fasse rien quand je me fais tuer}void find_basket(){ kill(pidb);//kill ball tracking process find();//mettre la caméra en place track_set_minarea(1000);//le panneau arrière est grand, donc ne cherchez que les gros blobs tandis que (have_ball){//pendant que j'ai la balle track_update(); while(track_x(backb, 0)=(center_x+20)){// while not centered track_update(); if(track_x(backb, 0)>=(center_x+20)){//si le panneau arrière est à gauche track_update(); create_spin_CCW(100);}//tourner à gauche else if(track_x(backb, 0)<=(center_x-20)){//si le panneau arrière est à droite track_update(); create_spin_CW(300-center_x);}// tourner à droite en ralentissant à l'approche du centre } stop(); while(track_size(backb, 0)<=(6000)){//tandis que la taille de la cible est inférieure à 6000 pixels track_update(); if(track_x(backb, 0)<=(center_x-5)){//si la cible est à gauche track_update(); create_drive_direct(lent, rapide);//tourner à gauche sleep(rest);} else if(track_x(backb, 0)>=(center_x+5)){//si la cible est à droite track_update(); create_drive_direct(fast, slow);// tourner à droite sleep(rest);} else if(track_x(backb, 0)(center_x-5)){// si la cible est centrée track_update(); create_drive_straight(fast);//go straight sleep(rest);} } stop(); //create_drive_straight(fast);// se rapproche un peu //sleep(1.0); //arrêter(); sommeil(1.0); create_spin_CW(speeda);//spin right sleep(reverse);//sommeil assez longtemps pour un arrêt de 180 tours(); down (); // pose la caméra pour suivre le sommeil du panneau arrière (1.0); track_set_minarea(200);//utiliser une taille min plus petite, puisque nous sommes pointés dessus et que nous allons nous rapprocher while(track_y(backb, 0)>=(center_y-140)){//tandis que la cible est inférieure à la y coordonnée track_update(); if(track_x(backb, 0)<=(center_x-5)){//si la cible est à gauche track_update(); back_right();//tourner à gauche sleep(rest);} else if(track_x(backb, 0)>=(center_x+5)){//si la cible est à droite track_update(); back_left();// tourner à droite sleep(rest);} else if(track_x(backb, 0)(center_x-5)){// si la cible est centrée track_update(); back();//allez directement dormir(repos);} } stop(); bip(); jeter (); // shoot sleep (1.0); have_ball=0;//rappel j'ai lancé la balle et je ne l'ai pas } start_b();//retour au suivi de balle sleep(1.0);//ne rien faire jusqu'à ce que ce processus meure}void cconnect(){ create_connect (); create_full();//pour un contrôle total des capteurs de rebord create_power_led(0, 255);}//LED d'alimentation verte déconnecter(){ stop();//arrêter de bouger create_disconnect();}void back_away(){ back(); dormir (clair); stop();}void rotate_l(){ create_spin_CCW(speeda); Temps de sommeil); stop();}void rotate_r(){ create_spin_CW(speeda); Temps de sommeil); stop();}void stop(){ create_drive(0, straight);}void back(){ create_drive(back_s, straight);}void ready(){ set_servo_position(arm, a_down);}void check(){ set_servo_position (cam, track_c);}void far(){ set_servo_position(cam, track_f);}void ledge(){ set_servo_position(arm, attrapé);}void throw(){ int a; for(a=50; a>=30; a-=1){// préparez-vous set_servo_position(arm, a);} set_servo_position(arm, shoot);}void grab(){ int a; for(a=0; a<=hold; a+=1){//lever le bras en douceur set_servo_position(arm, a);}}void down(){ set_servo_position(cam, track_d);}void find(){ set_servo_position (cam, track_find);}void start_a(){ pida = start_process(avoid());}void start_b(){ pidb = start_process(track_ball());}void start_c(){ pidc = start_process(find_basket());}void kill(int pid){ CREATE_BUSY;//attend la fin du processus de création en cours et prend la priorité kill_process(pid); CREATE_FREE;//j'ai fini stop();}void Avoid_left(){ kill(pidb);//stop tout le reste kill(pidc); rebord (); // ramasser la griffe pour qu'elle ne se coince pas sur la table back_away (); // back away rotate_l (); // pivoter loin de l'obstacle prêt (); // remettre la griffe if (have_ball) {//si j'ai le ballon start_c();}//commencer le suivi des buts else if(!have_ball){//si je n'ai pas le ballon start_b();}//commencer le suivi du ballon}void Avoid_right() { tuer(pidb); tuer(pidc); rebord(); reculer(); rotation_r(); prêt(); if(have_ball){ start_c();} else if(!have_ball){ start_b();}}void back_left(){ create_drive_direct(back_f, back_sl);}void back_right(){ create_drive_direct(back_sl, back_f);}

Étape 6: Cela en valait-il la peine ?

Les coûts étaient: Créer + batterie + doc = 260 $ Kit de démarrage XBC (xbc, cam, briques LEGO, capteurs) = 579 $ PVC + peinture + vis = environ 20 $ Coût total = 859 $ J'avais déjà le kit de démarrage XBC de Botball, donc le coût pour moi, c'était le coût de la création. Je pense que cela en valait la peine, et la meilleure partie est que toutes les pièces que j'ai utilisées sont réutilisables, si je pouvais me résoudre à séparer ce bot. Cette vidéo montre la sous-routine éviter, sur une table. Cette vidéo montre le robot marquant 5 balles oranges dans un but. J'ai seulement aidé à accélérer le processus, il aurait finalement trouvé la balle 5 tout seul.

Étape 7: Conclusion

Le résultat final est un robot qui peut ramasser et marquer des balles oranges dans un but tout seul.

J'ai adoré travailler sur ce projet. Plus je travaillais sur ce robot, plus je m'y attachais. Je lui parle maintenant comme s'il s'agissait d'un animal de compagnie. J'espère que cela vous a aidé dans votre prochain projet. Il y a beaucoup de gens que je dois remercier, mais il y en a trop. Comme Bernard de Chartres l'a dit si élégamment: « nous sommes comme des nains sur les épaules de géants, de sorte que nous pouvons voir plus qu'eux, et les choses à une plus grande distance, non en vertu d'une acuité visuelle de notre part, ou distinction, mais parce que nous sommes portés haut et élevés par leur taille géante."

Conseillé: