En attendant de trouver une solution pour l'Arduino Nano, j'ai commencer à faire le programme, et ayant un peu de mal avec la méthode de mike118, j'en ai fais une plus débutante, dites moi ce que vous en pensez :
Le programme est séparé en deux fichiers pour une meilleure lisibilité :
Fichier principal :
//Bibliothèques et fichiers : #include <Wire.h> #include <Adafruit_PWMServoDriver.h> #include "config.h" //Driver : Adafruit_PWMServoDriver pwm = Adafruit_PWMServoDriver(); //SDA->4 SCL->5 #define RALENTI 5 //Pause entre chaque degrès uint8_t pos; //Serial : String msgRecu; int x,msg; void setup() { Serial.begin(9600); pwm.begin(); pwm.setPWMFreq(50); //Fréquence utilisée par les servos analogiques yield(); } void loop() { //Réception de l'information : while(Serial.available()) { delay(3); char c = Serial.read(); msgRecu += c; } if(msgRecu.length() > 0) { Serial.println(msgRecu); msg = msgRecu.toInt(); //Réactions à l'information switch(msg) { case 1: //Debout debout(); break; case 2: //Couché couche(); break; case 3: //Avance avance(); break; case 4: //Recule recule(); break; case 5: droite(); break; case 6: gauche(); break; case 7: hello(); break; } msgRecu=""; } } void servo(uint8_t i,int pos, int posant) { if (i == 3 or i == 4 or i == 5 or i == 6 or i == 10 or i == 11) { if (pos <= posant) //Si la position à atteindre est inférieure ou égale à la position antérieure { for(uint8_t g = posant; g > pos; g--) { x = map(g,180,0,servomin[i],servomax[i]); pwm.setPWM(i,0,x); delay(RALENTI); } } else { for(uint8_t g = posant; g < pos; g++) { x = map(g,180,0,servomin[i],servomax[i]); pwm.setPWM(i,0,x); delay(RALENTI); } } } else { if (pos <= posant) { for(uint8_t g = posant; g > pos; g--) { x = map(g,0,180,servomin[i],servomax[i]); pwm.setPWM(i,0,x); delay(RALENTI); } } else { for(uint8_t g = posant; g < pos; g++) { x = map(g,0,180,servomin[i],servomax[i]); pwm.setPWM(i,0,x); delay(RALENTI); } } } } void debout() //Paramètres : 0 { #define POSDEBOUT 60 servo(avG[HA],POSDEBOUT,pos); servo(avD[HA],POSDEBOUT,pos); servo(arG[HA],POSDEBOUT,pos); servo(arD[HA],POSDEBOUT,pos); servo(avG[GE],POSDEBOUT,pos); servo(avD[GE],POSDEBOUT,pos); servo(arG[GE],POSDEBOUT,pos); servo(arD[GE],POSDEBOUT,pos); servo(avG[CH],POSDEBOUT,pos); servo(avD[CH],POSDEBOUT,pos); servo(arG[CH],POSDEBOUT,pos); servo(arD[CH],POSDEBOUT,pos); } void couche() //Paramètres : 0 { #define POSCOUCHEHA 80 #define POSCOUCHEGE 120 #define POSCOUCHECH 100 servo(avG[HA],POSCOUCHEHA,POSDEBOUT); servo(avD[HA],POSCOUCHEHA,POSDEBOUT); servo(arG[HA],POSCOUCHEHA,POSDEBOUT); servo(arD[HA],POSCOUCHEHA,POSDEBOUT); servo(avG[GE],POSCOUCHEGE,POSDEBOUT); servo(avD[GE],POSCOUCHEGE,POSDEBOUT); servo(arG[GE],POSCOUCHEGE,POSDEBOUT); servo(arD[GE],POSCOUCHEGE,POSDEBOUT); servo(avG[CH],POSCOUCHECH,POSDEBOUT); servo(avD[CH],POSCOUCHECH,POSDEBOUT); servo(arG[CH],POSCOUCHECH,POSDEBOUT); servo(arD[CH],POSCOUCHECH,POSDEBOUT); } void droite() //Paramètres : Angle { } void gauche() //Paramètres : Angle { } void hello() //Paramètres : 0 { } void avance() //Parmètres : 0 { } void recule() //Paramètres : 0 { }
Et le fichier que j'ai appelé config.h :
//Servo: uint8_t num[] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11}; //N'oubliez pas do modifier ces 3 lignes ! uint8_t servomin[] = {105, 100, 110, 100, 95, 100, 100, 100, 100, 90, 100, 100}; //Liste des longueurs minimums d'impulsions int servomax[] = {460,450, 380, 430, 420, 430, 450, 440, 440, 410, 440, 440}; //Liste des longueurs maximums d'impulsions //Pattes : uint8_t avG[] = {num[0], num[1], num[2]}; //Servo de la hanche, du genoux et de la cheville de la patte Avant Gauche uint8_t avD[] = {num[3], num[4], num[5]}; //Servo de la hanche, du genoux et de la cheville de la patte Avant Droite uint8_t arG[] = {num[6], num[7], num[8]}; //Servo de la hanche, du genoux et de la cheville de la patte Arrière Gauche uint8_t arD[] = {num[9], num[10], num[11]}; //Servo de la hanche, du genoux et de la cheville de la patte Arrière Droite #define AVG 0 #define AVD 1 #define ARG 2 #define ARD 3 // Articulations : uint8_t ha[] = {avG[0], avD[0], arG[0], arD[0]}; //Liste contenant les servos des hanches uint8_t ge[] = {avG[1], avD[1], arG[1], arD[1]}; //Liste contenant les servos des genoux uint8_t ch[] = {avG[2], avD[2], arG[2], arD[2]}; //Liste contenant les servos des chevilles #define HA 0 #define GE 1 #define CH 2
Et voici jusqu'où j'ai pu aller avec la méthode de mike :
La partie du programme permettant de ralentir les servos n'est pas encore au point mais est nécessaire dû à la fragilité du plastique, sans cette partie après environ 2 h de test de marche archaique (3 états pour chaque pattes n'ont pas l'air d'être suffisant pour le faire avancer) certains liaisons peuvent se briser aux endroits les plus fragiles telles que les fixations du "fémur" au niveau des hanches, partie très fines (mais il y a des pièces de rechanges pour la version plastique).