Étape 9: Réservoir de direction W/continue Rotation Servos
Assurez-vous de remercier mon merveilleux modèle Sid (ci-dessus photo) pour être tel un bon sport, tandis que je me sers lui à peaufiner mon programme.
/ * Ceci sera croquis sera lu tous les 8 canaux d’un récepteur RC et les valeurs par l’intermédiaire de série d’entrée
moniteur. Programmé pour l’Arduino Uno et Adafuit Servo pilote Board(pins A5-SCL and A4-SDA).
Mon émetteur est également définie en mode 3 donc le joystick droit est comme suit :
Axe de verticle = canal 3
Horixontal axe = canal 4
===========================================================================================*/
Bibliothèques incluses
#include
#include
Activer le mode debug d’entrer des données par l’intermédiaire de série
/ * 0 = OFF, 1 = Engineering Data activé, 2 = Raw Data On, 3 = valeur Servo sortie,
4 = Eng raw & sortie de données Servo, 5 = sortie de données steer Tank, * /
const int debug = 0 ;
Tableaux pour les emplacements de broche de canal et les données des canaux
const int canaux = 8 ;
const int [] chPin = {2,3,4,5,6,7,8,9} ; Emplacements de code PIN
int chEng [8] ; Données du magasin Massé
int chSer [8] ; Stockage de valeur de servo
Signal de RX massant valeurs
const int RXLo = 920 ;
const int RXHi = 1640 ;
const int RXDeadLo = 1265 ;
const int RXDeadHi = 1295 ;
const int RXMid = 1280 ;
Gammes de servo
const int Serlon = 130 ;
const int serMid = 330 ;
const int serHi = 530 ;
const int tankLo = 250 ;
const int tankHi = 410 ;
Sortie de servo
Adafruit_PWMServoDriver servo=Adafruit_PWMServoDriver(0x40) ;
const int freq = 50 ;
const int serNum = 8 ;
int ch3 ; Variable de steer Tank
int ch4 ; Variable de Steer Tank
Configurer les emplacements de code pin, serial, débute ou I2C
void setup() {}
Si (débogage > 0) {}
Serial.Begin(115200) ; Nous allons PLAID !
}
Broches d’entrée :
pour (int i = 0; i pinMode(chPin[i],INPUT) ;
}
servo.Begin() ;
servo.setPWMFreq(freq) ;
} //End du programme d’installation
Programme principal
void loop() {}
Passer des valeurs de chy à chz, chx à chy et lire les nouvelles valeurs
pour (int i = 0; i chEng[i]=pulseIn(chPin[i],HIGH) ;
Signal de massage
chEng [i] = contraindre (chEng [i], RXLo, RXHi) ; Couper le bas et l’extrémité supérieure
Si (chEng [i] < = RXDeadHi & & chEng [i] > = RXDeadLo) {//Create bande morte
chEng [i] = RXMid ;
}
Mapper les valeurs de l’Eng à la sortie de servo
Si (chEng [i] > = RXLo & & chEng [i] < = RXDeadLo) {//Map plage inférieure des valeurs
chSer [i] = carte (chEng [i], RXLo, RXDeadLo, serLo, serMid) ;
}
ElseIf (chEng [i] == RXMid) {//Map valeur du milieu
chSer [i] = serMid ;
}
ElseIf (chEng [i] > = RXDeadHi & & chEng [i] < = RXHi) {//Map plage la plus élevée des valeurs
chSer [i] = carte (chEng [i], RXDeadHi, RXHi, serMid, serHi) ;
}
} //End de boucle For
Steer de réservoir à l’aide du stick analogique droit, outputing à deux servos de rotation continue
/ * En utilisant le système cartésien quadrant et toute valeur donnée au moteur droit est inversé à
assurer le bon fonctionnement * /
Premier quadrant.
/ * Flip gamme servo droit en ce qui concerne la position de l’axe vertical. Cela permet de garder le
ensemble servo de gauche à la position verticale et réduire le speed.* servos droite /
Si (chSer [2] > = serMid & & chSer [3] > = serMid) {}
CH3 = chSer [2] ;
CH4=Map(chSer[3],serMid,serHi,chSer[2],serMid) ;
}
Deuxième Quadrant
/ * Flip gamme servo gauche en ce qui concerne la position verticale de l’axe. Celui-ci n’est pas comme
détroit vers l’avant dans le Quadrant 1, mais l’exemple de code suivant, que j’utilisais avant devrait
apparence similaire.
CH3=Map(chSer[3],serLo,serMid,serMid,serHi) ;
servo.setPWM(2,0,map(ch3,serHi,serMid,chSer[2],serMid)) ;
Comment je suis arrivé avec ce qui suit est par simplification et pour sauver la santé.* /
ElseIf (chSer [2] > serMid & & ch3=map(chSer[3],serLo,serMid,serMid,chSer[2]) chSer [3] ;
CH4 = chSer [2] ;
}
Troisième Quadrant
/ * Flip la gamme servo droit en ce qui concerne la position verticale de l’axe. La servocommande gauche
continueront à voyager vers l’arrière tandis que le servo de droit est slowed.* /
ElseIf (chSer [2] < = serMid & & chSer [3] < = serMid) {}
CH3 = chSer [2] ;
CH4=Map(chSer[3],serMid,serLo,chSer[2],serMid) ;
}
Quatrième Quadrant
/ * Flip la gamme servo gauche en ce qui concerne la position de l’axe vertivle, le servo de droite
sera continut voyageant vers l’arrière pendant la servocommande gauche est slowed.* /
else {if(chSer[2]serMid)
CH4 = chSer [2] ;
CH3=Map(chSer[3],serMid,serLo,chSer[2],serMid) ;
}
/ * Activer CCW Rotation en inversant le servo de droite et transfert servo gauche pour ce qui est
le axis.* horizontal /
Si (chSer [2] == serMid & & chSer [3] > = serMid) {}
CH3 = chSer [3] ;
CH4=Map(chSer[3],serMid,serHi,serMid,serLo) ;
}
/ * Activer la Rotation CW par transfert servo droite et marche arrière servo gauche pour ce qui est
le axis.* horizontal /
Si (chSer [2] == serMid & & chSer [3] < = serMid) {}
CH3 = chSer [3] ;
CH4=Map(chSer[3],serMid,serLo,serMid,serHi) ;
}
Remapper variables pour donner la meilleure sensibilité et la pleine gamme n’est pas nécessaire pour atteindre la pleine vitesse.
CH3=Map(CH3,serLo,serHi,tankLo,tankHi) ;
CH4=Map(CH4,serLo,serHi,tankLo,tankHi) ;
Renversant le signal de servo de droite, signal du canal 4.
Si (ch4 > = serMid) {}
CH4=Map(CH4,serMid,serHi,serMid,serLo) ;
}
ElseIf (ch4=map(ch4,serMid,serLo,serMid,serHi) de ch4 ;
}
Sortie au pilote de servo
servo.setPWM(2,0,ch3) ;
servo.setPWM(3,0,ch4) ;
Sortie de débogage
Si (debug == 1 || debug == 4) //Engineering données
{
Serial.Print ("EngData| CH1: ") ;
Serial.Print (chEng[0]) ;
Serial.Print ("| CH2: ") ;
Serial.Print (chEng[1]) ;
Serial.Print ("| CH3: ") ;
Serial.Print (chEng[2]) ;
Serial.Print ("| CH4: ") ;
Serial.Print (chEng[3]) ;
Serial.Print ("| CH5: ") ;
Serial.Print (chEng[4]) ;
Serial.Print ("| CH6: ") ;
Serial.Print (chEng[5]) ;
Serial.Print ("| CH7: ") ;
Serial.Print (chEng[6]) ;
Serial.Print ("| Ch8: ") ;
Serial.Print (chEng[7]) ;
Serial.println ("|") ;
}
Si (debug == 3 || debug == 4)
{
Serial.Print ("SerData| CH1: ") ;
Serial.Print (chSer[0]) ;
Serial.Print ("| CH2: ") ;
Serial.Print (chSer[1]) ;
Serial.Print ("| CH3: ") ;
Serial.Print (chSer[2]) ;
Serial.Print ("| CH4: ") ;
Serial.Print (chSer[3]) ;
Serial.Print ("| CH5: ") ;
Serial.Print (chSer[4]) ;
Serial.Print ("| CH6: ") ;
Serial.Print (chSer[5]) ;
Serial.Print ("| CH7: ") ;
Serial.Print (chSer[6]) ;
Serial.Print ("| Ch8: ") ;
Serial.Print (chSer[7]) ;
Serial.println ("|") ;
}
Si (debug == 5) {}
Serial.Print(CH3) ;
Serial.Print("|") ;
Serial.println(CH4) ;
}
} //End de programme principal
Je sais pas comment j’ai fait le réservoir de direction est loin d’être optimale, mais c’est comment j’ai pensé à elle. Le quatrième quadrant ne fonctionne pas et j’ai encore à faire fonctionner. Ce n’est que les grandes d’un problème puisqu’il s’agit d’une preuve de robot de concept dans le travail avec contrôle RC et Arduino avant que je déménage à pleine échelle.
Faites-moi savoir si vous avez des questions, et je ferai de mon mieux pour répondre et mettre à jour en conséquence. Veuillez inclure l’étape et certains détails expliquant votre problème pour m’aider à obtenir sur la même page avec vous.