Arduino quadrupède
Composants et fournitures
| × | 1 | ||||
| × | 12 | ||||
| × | 1 | ||||
| × | 4 | ||||
| × | 4 | ||||
| × | 4 | ||||
| × | 2 | ||||
| × | 1 |
Outils et machines nécessaires
|
Applications et services en ligne
|
À propos de ce projet
Quadrupède basé sur Arduino ! Quadruped signifie bot à quatre pattes, qui ressemble fondamentalement à une araignée à quatre pattes, alors apprenons comment l'araignée marche et essayons de la reproduire avec Arduino.
Fournitures :
Étape 1 : composants requis
- 1 X Arduino Mega ou Arduino Uno
- 1 X PCB percé
- 12 X Servomoteurs (9 g)
- 1 capteur à ultrasons HC-SR04
- 4 LED RVB
- Carton
Étape 2 : Maintenir la CG
le centre de gravité (CG) est le facteur principal pendant la marche. Le centre de gravité reste au centre du corps pour maintenir l'équilibre si le CG se déplace hors du centre sur certaines limites, l'équilibre sera affecté et entraînera une chute
Voyons donc comment maintenir le CG en marchant.
Si chaque jambe est à 45 degrés, le centre de gravité sera parfaitement central au centre, mais si nous déplaçons une jambe, le centre de gravité se déplacera de ce côté, ce qui entraînera une chute de ce côté.
Donc, pour éviter cela, les deux extrémités des jambes sont maintenues à un angle supérieur à 45 degrés en fonction de la taille du bot, de sorte que les trois jambes formeront un triangle, où le CG sera à l'intérieur et la quatrième jambe sera libre de se déplacer et de CG restera à l'intérieur d'un triangle.
Étape 3 : Procédure de marche
- C'est la position de départ, avec deux jambes (C, D) étendues d'un côté et les deux autres jambes (A, B) tirées vers l'intérieur.
- La jambe en haut à droite (B) se soulève et se tend, loin devant le robot.
- Toutes les jambes se déplacent vers l'arrière, déplaçant le corps vers l'avant.
- La jambe arrière gauche (D) se soulève et avance le long du corps. Cette position est l'image miroir de la position de départ.
- La jambe en haut à gauche (B) se soulève et se tend, loin devant le robot.
- Encore une fois, toutes les jambes se déplacent vers l'arrière, déplaçant le corps vers l'avant.
- La jambe arrière droite se soulève (B) et recule dans le corps, nous ramenant à la position de départ.
Étape 4 :Plans pour Quadrupède LEGS.pdf CORPS.pdf
Étape 5 :Construction du corps
Construisez le corps selon PDF.
Étape 6 :Connexion du circuit
Créez votre propre blindage en fonction de vos besoins, l'arduino mega a 15 broches pwm, utilisez-en 12 pour les connexions servo et 3 pour la led RBG et deux broches pour le capteur à ultrasons
Étape 7 :Initialisation du servo
- Téléchargez le programme sur arduino mega et commencez à assembler la jambe selon l'image
#include Servo servo[4][3] ; //définir les ports des servosconst int servo_pin[4][3] ={ {10,11,2}, {3,4 ,5}, {6,7,8}, {9, 12, 13} };void setup(){ //initialise tous les servos pour (int i =0; i <4; i++) { for (int j =0; j <3; j++) { servo[i][j].attach(servo_pin[i][j]); retard(20); } }}void loop(void){ for (int i =0; i <4; i++) { for (int j =0; j <3; j++) { servo[i][j].write(90); retard(20); } }}
Étape 8 :Étape finale
/* Comprend ------------------------------------------ -------------------------*/#include //pour définir et contrôler les servos#include // pour régler une minuterie pour gérer tous les servos#define ledred 46#define ledblue 44#define ledgreen 45/* Servos --------------------------- -----------------------------------------*///définir 12 servos pour 4 jambesServo servo[4][3];//définir les ports des servosconst int servo_pin[4][3] ={ {2, 3, 4}, {20, 6, 7}, {8, 9, 17}, { 16, 12, 13} };/* Taille du robot ------------------------------------ ---------------------*/const float length_a =55;const float length_b =77.5;const float length_c =27.5;const float length_side =71;const float z_absolute =-28;/* Constantes pour le mouvement ------------------------------------------ -----------*/const float z_default =-50, z_up =-30, z_boot =z_absolute;const float x_default =62, x_offset =0;const float y_start =0, y_step =40;const float y_default =x_default;/* variables pour le mouvement ---------------- ------------------------------------*/volatile float site_now[4][3]; //coordonnées en temps réel de la fin de chaque legvolatile float site_expect[4][3] ; //coordonnées attendues de la fin de chaque legfloat temp_speed[4][3] ; //la vitesse de chaque axe doit être recalculée avant chaque movefloat move_speed; //mouvement speedfloat speed_multiple =1; //vitesse de mouvement multipleconst float spot_turn_speed =4;const float leg_move_speed =8;const float body_move_speed =3;const float stand_seat_speed =1;volatile int rest_counter; //+1/0.02s, pour le repos automatique//paramètre des fonctions const float KEEP =255;//définir PI pour le calculconst float pi =3.1415926;/* Constantes pour le virage ------------- -------------------------------------------*///temp lengthconst float temp_a =sqrt(pow(2 * x_default + length_side, 2) + pow(y_step, 2));const float temp_b =2 * (y_start + y_step) + length_side;const float temp_c =sqrt(pow(2 * x_default + length_side , 2) + pow(2 * y_start + y_step + length_side, 2));const float temp_alpha =acos((pow(temp_a, 2) + pow(temp_b, 2) - pow(temp_c, 2)) / 2 / temp_a / temp_b);//site pour turnconst float turn_x1 =(temp_a - length_side) / 2;const float turn_y1 =y_start + y_step / 2;const float turn_x0 =turn_x1 - temp_b * cos(temp_alpha);const float turn_y0 =temp_b * sin (temp_alpha) - turn_y1 - length_side;/* ---------------------------------------- ----------------------------------*//* - fonction de configuration -------- -------------------------------------------------- -----------------*/configuration vide(){ pi nMode(ledred,OUTPUT);pinMode(ledblue,OUTPUT);pinMode(ledgreen,OUTPUT); //démarrer la série pour le débogage Serial.begin(115200); Serial.println("Le robot démarre l'initialisation"); //initialiser le paramètre par défaut set_site(0, x_default - x_offset, y_start + y_step, z_boot); set_site(1, x_default - x_offset, y_start + y_step, z_boot); set_site(2, x_default + x_offset, y_start, z_boot); set_site(3, x_default + x_offset, y_start, z_boot); for (int i =0; i <4; i++) { for (int j =0; j <3; j++) { site_now[i][j] =site_expect[i][j]; } } //démarrer le service d'asservissement FlexiTimer2::set(20, servo_service); FlexiTimer2::start(); Serial.println("Servo service démarré"); //initialise les servos servo_attach(); Serial.println("Servos initialisés"); Serial.println("Initialisation du robot terminée");}void servo_attach(void){ for (int i =0; i <4; i++) { for (int j =0; j <3; j++) { servo[i] [j].attache(servo_pin[i][j]); retard (100); } }}void servo_detach(void){ pour (int i =0; i <4; i++) { pour (int j =0; j <3; j++) { servo[i][j].detach(); retard (100); } }}/* - fonction de boucle ------------------------------------------- ---------------------------------*/void loop(){ analogWrite(ledred,255); Serial.println("Stand"); supporter(); retard (2000); analogWrite(ledred, 0); analogWrite(ledblue,255); Serial.println("Avancer"); step_forward(5) ; retard (2000); analogWrite(ledblue, 0); analogWrite(ledgreen,255); Serial.println("Reculez"); step_back(5) ; retard (2000); analogWrite(ledgreen, 0); analogWrite(ledred,255); analogWrite(ledblue,255); Serial.println("Tourner à gauche"); tourner_gauche(5) ; retard (2000); analogWrite(ledgreen,255); analogWrite(ledred, 0); analogWrite(ledblue,255); Serial.println("Tourner à droite"); tourner_à droite(5) ; retard (2000); analogWrite(ledgreen,255); analogWrite(ledred,255); analogWrite(ledblue, 0); Serial.println("Vague de la main"); hand_wave(3); retard (2000); Serial.println("Vague de la main"); poignée_de_main(3) ; retard (2000); entier x=100 ; for(int i=0;i<5;i++) { analogWrite(ledgreen,255); analogWrite(ledred,255);//white analogWrite(ledblue,255); retard(x); analogWrite(ledvert,255);//jaune analogWrite(ledred,255); analogWrite(ledblue, 0); retard(x); analogWrite(ledgreen,255);//cyan analogWrite(ledred,0); analogWrite(ledblue,255); retard(x); analogWrite(ledgreen, 0); analogWrite(ledred,255);//violet analogWrite(ledblue,255); retard(x); analogWrite(ledgreen, 0); analogWrite(ledred,255);//red analogWrite(ledblue,0) ; retard(x); analogWrite(ledgreen,0) ;//blue analogWrite(ledred,0) ; analogWrite(ledblue,255); retard(x); analogWrite(ledgreen,255); analogWrite(ledred, 0); analogWrite(ledblue, 0); //vert délai(x); } analogWrite(ledgreen,0) ; analogWrite(ledred, 0); analogWrite(ledblue, 0); //Serial.println("Danse du corps"); //body_dance(10);//delay(2000); //Serial.println("Sit");// sit(); delay(1000);}/* - sit - fonction de blocage ------------------------------------- ----------------------------------------------------*/void sit(void){ move_speed =stand_seat_speed; for (int leg =0; leg <4; leg++) { set_site(leg, KEEP, KEEP, z_boot); } wait_all_reach();}/* - stand - fonction de blocage ------------------------------------- ----------------------------------------------------*/void stand(void){ move_speed =stand_seat_speed; for (int leg =0; leg <4; leg++) { set_site(leg, KEEP, KEEP, z_default); } wait_all_reach();}/* - spot tourner vers la gauche - fonction de blocage - paramètres pas à pas voulus tourner --------------------------- ------------------------------------------------*/ void turn_left(unsigned int step){ move_speed =spot_turn_speed; while (step--> 0) { if (site_now[3][1] ==y_start) { //leg 3&1 move set_site(3, x_default + x_offset, y_start, z_up); wait_all_reach(); set_site(0, turn_x1 - x_offset, turn_y1, z_default); set_site(1, turn_x0 - x_offset, turn_y0, z_default); set_site(2, turn_x1 + x_offset, turn_y1, z_default); set_site(3, turn_x0 + x_offset, turn_y0, z_up); wait_all_reach(); set_site(3, turn_x0 + x_offset, turn_y0, z_default); wait_all_reach(); set_site(0, turn_x1 + x_offset, turn_y1, z_default); set_site(1, turn_x0 + x_offset, turn_y0, z_default); set_site(2, turn_x1 - x_offset, turn_y1, z_default); set_site(3, turn_x0 - x_offset, turn_y0, z_default); wait_all_reach(); set_site(1, turn_x0 + x_offset, turn_y0, z_up); wait_all_reach(); set_site(0, x_default + x_offset, y_start, z_default); set_site(1, x_default + x_offset, y_start, z_up); set_site(2, x_default - x_offset, y_start + y_step, z_default); set_site(3, x_default - x_offset, y_start + y_step, z_default); wait_all_reach(); set_site(1, x_default + x_offset, y_start, z_default); wait_all_reach(); } else { //leg 0&2 move set_site(0, x_default + x_offset, y_start, z_up); wait_all_reach(); set_site(0, turn_x0 + x_offset, turn_y0, z_up); set_site(1, turn_x1 + x_offset, turn_y1, z_default); set_site(2, turn_x0 - x_offset, turn_y0, z_default); set_site(3, turn_x1 - x_offset, turn_y1, z_default); wait_all_reach(); set_site(0, turn_x0 + x_offset, turn_y0, z_default); wait_all_reach(); set_site(0, turn_x0 - x_offset, turn_y0, z_default); set_site(1, turn_x1 - x_offset, turn_y1, z_default); set_site(2, turn_x0 + x_offset, turn_y0, z_default); set_site(3, turn_x1 + x_offset, turn_y1, z_default); wait_all_reach(); set_site(2, turn_x0 + x_offset, turn_y0, z_up); wait_all_reach(); set_site(0, x_default - x_offset, y_start + y_step, z_default); set_site(1, x_default - x_offset, y_start + y_step, z_default); set_site(2, x_default + x_offset, y_start, z_up); set_site(3, x_default + x_offset, y_start, z_default); wait_all_reach(); set_site(2, x_default + x_offset, y_start, z_default); wait_all_reach(); } }}/* - spot tourner à droite - fonction de blocage - paramètres pas à pas voulu tourner ------------------------------ ----------------------------------------------------------*/void turn_right( pas int non signé){ move_speed =spot_turn_speed; while (step--> 0) { if (site_now[2][1] ==y_start) { //leg 2&0 move set_site(2, x_default + x_offset, y_start, z_up); wait_all_reach(); set_site(0, turn_x0 - x_offset, turn_y0, z_default); set_site(1, turn_x1 - x_offset, turn_y1, z_default); set_site(2, turn_x0 + x_offset, turn_y0, z_up); set_site(3, turn_x1 + x_offset, turn_y1, z_default); wait_all_reach(); set_site(2, turn_x0 + x_offset, turn_y0, z_default); wait_all_reach(); set_site(0, turn_x0 + x_offset, turn_y0, z_default); set_site(1, turn_x1 + x_offset, turn_y1, z_default); set_site(2, turn_x0 - x_offset, turn_y0, z_default); set_site(3, turn_x1 - x_offset, turn_y1, z_default); wait_all_reach(); set_site(0, turn_x0 + x_offset, turn_y0, z_up); wait_all_reach(); set_site(0, x_default + x_offset, y_start, z_up); set_site(1, x_default + x_offset, y_start, z_default); set_site(2, x_default - x_offset, y_start + y_step, z_default); set_site(3, x_default - x_offset, y_start + y_step, z_default); wait_all_reach(); set_site(0, x_default + x_offset, y_start, z_default); wait_all_reach(); } else { //leg 1&3 move set_site(1, x_default + x_offset, y_start, z_up); wait_all_reach(); set_site(0, turn_x1 + x_offset, turn_y1, z_default); set_site(1, turn_x0 + x_offset, turn_y0, z_up); set_site(2, turn_x1 - x_offset, turn_y1, z_default); set_site(3, turn_x0 - x_offset, turn_y0, z_default); wait_all_reach(); set_site(1, turn_x0 + x_offset, turn_y0, z_default); wait_all_reach(); set_site(0, turn_x1 - x_offset, turn_y1, z_default); set_site(1, turn_x0 - x_offset, turn_y0, z_default); set_site(2, turn_x1 + x_offset, turn_y1, z_default); set_site(3, turn_x0 + x_offset, turn_y0, z_default); wait_all_reach(); set_site(3, turn_x0 + x_offset, turn_y0, z_up); wait_all_reach(); set_site(0, x_default - x_offset, y_start + y_step, z_default); set_site(1, x_default - x_offset, y_start + y_step, z_default); set_site(2, x_default + x_offset, y_start, z_default); set_site(3, x_default + x_offset, y_start, z_up); wait_all_reach(); set_site(3, x_default + x_offset, y_start, z_default); wait_all_reach(); } }}/* - aller de l'avant - fonction de blocage - étapes de l'étape de paramètre voulues -------------------------------- -------------------------------------------*/void step_forward(unsigned int step){ move_speed =leg_move_speed; while (step--> 0) { if (site_now[2][1] ==y_start) { //leg 2&1 move set_site(2, x_default + x_offset, y_start, z_up); wait_all_reach(); set_site(2, x_default + x_offset, y_start + 2 * y_step, z_up); wait_all_reach(); set_site(2, x_default + x_offset, y_start + 2 * y_step, z_default); wait_all_reach(); move_speed =body_move_speed; set_site(0, x_default + x_offset, y_start, z_default); set_site(1, x_default + x_offset, y_start + 2 * y_step, z_default); set_site(2, x_default - x_offset, y_start + y_step, z_default); set_site(3, x_default - x_offset, y_start + y_step, z_default); wait_all_reach(); move_speed =leg_move_speed; set_site(1, x_default + x_offset, y_start + 2 * y_step, z_up); wait_all_reach(); set_site(1, x_default + x_offset, y_start, z_up); wait_all_reach(); set_site(1, x_default + x_offset, y_start, z_default); wait_all_reach(); } else { //leg 0&3 move set_site(0, x_default + x_offset, y_start, z_up); wait_all_reach(); set_site(0, x_default + x_offset, y_start + 2 * y_step, z_up); wait_all_reach(); set_site(0, x_default + x_offset, y_start + 2 * y_step, z_default); wait_all_reach(); move_speed =body_move_speed; set_site(0, x_default - x_offset, y_start + y_step, z_default); set_site(1, x_default - x_offset, y_start + y_step, z_default); set_site(2, x_default + x_offset, y_start, z_default); set_site(3, x_default + x_offset, y_start + 2 * y_step, z_default); wait_all_reach(); move_speed =leg_move_speed; set_site(3, x_default + x_offset, y_start + 2 * y_step, z_up); wait_all_reach(); set_site(3, x_default + x_offset, y_start, z_up); wait_all_reach(); set_site(3, x_default + x_offset, y_start, z_default); wait_all_reach(); } }}/* - revenir en arrière - fonction de blocage - étapes de l'étape de paramètre souhaitées -------------------------------- -------------------------------------------*/void step_back(unsigned int step){ move_speed =leg_move_speed; while (step--> 0) { if (site_now[3][1] ==y_start) { //leg 3&0 move set_site(3, x_default + x_offset, y_start, z_up); wait_all_reach(); set_site(3, x_default + x_offset, y_start + 2 * y_step, z_up); wait_all_reach(); set_site(3, x_default + x_offset, y_start + 2 * y_step, z_default); wait_all_reach(); move_speed =body_move_speed; set_site(0, x_default + x_offset, y_start + 2 * y_step, z_default); set_site(1, x_default + x_offset, y_start, z_default); set_site(2, x_default - x_offset, y_start + y_step, z_default); set_site(3, x_default - x_offset, y_start + y_step, z_default); wait_all_reach(); move_speed =leg_move_speed; set_site(0, x_default + x_offset, y_start + 2 * y_step, z_up); wait_all_reach(); set_site(0, x_default + x_offset, y_start, z_up); wait_all_reach(); set_site(0, x_default + x_offset, y_start, z_default); wait_all_reach(); } else { //leg 1&2 move set_site(1, x_default + x_offset, y_start, z_up); wait_all_reach(); set_site(1, x_default + x_offset, y_start + 2 * y_step, z_up); wait_all_reach(); set_site(1, x_default + x_offset, y_start + 2 * y_step, z_default); wait_all_reach(); move_speed =body_move_speed; set_site(0, x_default - x_offset, y_start + y_step, z_default); set_site(1, x_default - x_offset, y_start + y_step, z_default); set_site(2, x_default + x_offset, y_start + 2 * y_step, z_default); set_site(3, x_default + x_offset, y_start, z_default); wait_all_reach(); move_speed =leg_move_speed; set_site(2, x_default + x_offset, y_start + 2 * y_step, z_up); wait_all_reach(); set_site(2, x_default + x_offset, y_start, z_up); wait_all_reach(); set_site(2, x_default + x_offset, y_start, z_default); wait_all_reach(); } }}// ajouter par RegisHsuvoid body_left(int i){ set_site(0, site_now[0][0] + i, KEEP, KEEP); set_site(1, site_now[1][0] + i, GARDER, GARDER); set_site(2, site_now[2][0] - i, GARDER, GARDER); set_site(3, site_now[3][0] - i, GARDER, GARDER); wait_all_reach();}void body_right(int i){ set_site(0, site_now[0][0] - i, KEEP, KEEP); set_site(1, site_now[1][0] - i, GARDER, GARDER); set_site(2, site_now[2][0] + i, GARDER, GARDER); set_site(3, site_now[3][0] + i, GARDER, GARDER); wait_all_reach();}void hand_wave(int i){ float x_tmp; float y_tmp; float z_tmp; move_speed =1 ; if (site_now[3][1] ==y_start) { body_right(15); x_tmp =site_now[2][0] ; y_tmp =site_now[2][1] ; z_tmp =site_now[2][2] ; move_speed =body_move_speed; for (int j =0; j i / 4) move_speed =body_dance_speed * 2; if (j> i / 2) move_speed =body_dance_speed * 3; set_site(0, GARDER, y_default - 20, GARDER); set_site(1, GARDER, y_default + 20, GARDER); set_site(2, GARDER, y_default - 20, GARDER); set_site(3, GARDER, y_default + 20, GARDER); wait_all_reach(); set_site(0, GARDER, y_default + 20, GARDER); set_site(1, GARDER, y_default - 20, GARDER); set_site(2, GARDER, y_default + 20, GARDER); set_site(3, GARDER, y_default - 20, GARDER); wait_all_reach(); } move_speed =body_dance_speed; head_down(30);}/* - service microservos/fonction d'interruption de la minuterie/50Hz - lorsque le site est défini, cette fonction déplace le point final vers celui-ci en ligne droite - temp_speed[4][3] doit être défini avant de définir le site attendu , il s'assure que le point final se déplace en ligne droite et décide de la vitesse de déplacement. -------------------------------------------------- -------------------------*/void servo_service(void){ sei(); flottant statique alpha, bêta, gamma ; for (int i =0; i <4; i++) { for (int j =0; j <3; j++) { if (abs(site_now[i][j] - site_expect[i][j])>=abs(temp_speed[i][j])) site_now[i][j] +=temp_speed[i][j] ; else site_now[i][j] =site_expect[i][j] ; } cartésien_vers_polaire(alpha, bêta, gamma, site_now[i][0], site_now[i][1], site_now[i][2]); polar_to_servo(i, alpha, bêta, gamma); } rest_counter++;}/* - définit l'un des sites attendus des points de terminaison - cette fonction définira temp_speed[4][3] en même temps - fonction non bloquante --------------- -------------------------------------------------- ----------*/void set_site(int leg, float x, float y, float z){ float length_x =0, length_y =0, length_z =0; if (x !=KEEP) length_x =x - site_now[leg][0]; if (y !=KEEP) length_y =y - site_now[leg][1]; if (z !=KEEP) length_z =z - site_now[leg][2]; float longueur =sqrt(pow(length_x, 2) + pow(length_y, 2) + pow(length_z, 2)); temp_speed[leg][0] =length_x / length * move_speed * speed_multiple; temp_speed[leg][1] =length_y / length * move_speed * speed_multiple; temp_speed[leg][2] =length_z / length * move_speed * speed_multiple; if (x !=KEEP) site_expect[leg][0] =x; if (y !=KEEP) site_expect[leg][1] =y; if (z !=KEEP) site_expect[leg][2] =z;}/* - attend que l'un des points finaux se déplace pour attendre le site - fonction de blocage ----------------- -------------------------------------------------- --------*/void wait_reach(int leg){ while (1) if (site_now[leg][0] ==site_expect[leg][0]) if (site_now[leg][1] ==site_expect[leg][1]) if (site_now[leg][2] ==site_expect[leg][2]) break;}/* - attend que tous les points finaux se déplacent pour attendre le site - fonction de blocage ---- -------------------------------------------------- ---------------------*/void wait_all_reach(void){ pour (int i =0; i <4; i++) wait_reach(i);}/* - site trans du cartésien au polaire - modèle mathématique 2/2 ------------------------------------- ----------------------------------------------------*/void cartesian_to_polar(volatile float &alpha, volatile float &beta , volatile float &gamma, volatile float x, volatile float y, volatile float z){ //calcule wz degré float v, w; w =(x>=0 ? 1 :-1) * (sqrt(pow(x, 2) + pow(y, 2))); v =w - longueur_c; alpha =atan2(z, v) + acos((pow(length_a, 2) - pow(length_b, 2) + pow(v, 2) + pow(z, 2)) / 2 / length_a / sqrt(pow(v , 2) + pow(z, 2))); beta =acos((pow(length_a, 2) + pow(length_b, 2) - pow(v, 2) - pow(z, 2)) / 2 / length_a / length_b); //calculer x-y-z degré gamma =(w>=0) ? atan2(y, x) :atan2(-y, -x); //trans degré pi->180 alpha =alpha / pi * 180; bêta =bêta / pi * 180 ; gamma =gamma / pi * 180;}/* - site trans du polaire au microservos - carte du modèle mathématique au fait - les erreurs enregistrées dans l'eeprom seront ajoutées ----------------- -------------------------------------------------- --------*/void polar_to_servo(int leg, float alpha, float beta, float gamma){ if (leg ==0) { alpha =90 - alpha; bêta =bêta ; gamma +=90; } else if (leg ==1) { alpha +=90; bêta =180 - bêta ; gamma =90 - gamma; } else if (leg ==2) { alpha +=90; bêta =180 - bêta ; gamma =90 - gamma; } else if (leg ==3) { alpha =90 - alpha; bêta =bêta ; gamma +=90; } servo[jambe][0].write(alpha); servo[leg][1].write(beta); servo[leg][2].write(gamma);}
Connectez les broches led
- Ça y est, votre quadrupède est prêt !
- Télécharger le programme.
- Connectez le servo selon les broches définies dans le programme.
Code
- araignée
- spider_fix.ino
araignéeArduino
spider_fix.inoArduino
// Locate the initial position of legs // RegisHsu 2015-09-09#includeServo servo[4][3];//define servos' portsconst int servo_pin[4][3] ={ {10,11,2}, {3,4,5}, {6,7,8}, {9, 12, 13} };void setup(){ //initialize all servos for (int i =0; i <4; i++) { for (int j =0; j <3; j++) { servo[i][j].attach(servo_pin[i][j]); delay(20); } }}void loop(void){ for (int i =0; i <4; i++) { for (int j =0; j <3; j++) { servo[i][j].write(90); delay(20); } }}
Pièces et boîtiers personnalisés
Schémas
Processus de fabrication
- Visualiseur de musique Arduino DIY LUMAZOID
- Panneau LCD avec Arduino pour Flight Simulator
- Arduino avec Bluetooth pour contrôler une LED !
- Lutte contre le coronavirus :minuterie de lavage des mains simple
- Mixeur de couleurs Arduino RVB
- Contrôler une matrice LED avec Arduino Uno
- Traitement DIY Arduino RADIONICS MMachine
- DMX RGB LED extérieur
- Jeu de roulette LED