Actionneur: réglage des positions de la fourhce
This commit is contained in:
parent
fc4e40da02
commit
4f8dc2b99b
210
Actionneurs/Actionneurs.ino
Normal file
210
Actionneurs/Actionneurs.ino
Normal file
@ -0,0 +1,210 @@
|
||||
#include <SCServo.h>
|
||||
|
||||
#define SERVO_FOUCHE 5
|
||||
#define SERVO_PINCE_GAUCHE 8
|
||||
#define SERVO_PINCE_DROITE 9
|
||||
|
||||
#define FOURCHE_TRANSPORT 5, 307
|
||||
#define FOURCHE_LEVEE 5, 227
|
||||
#define FOURCHE_PRISE 5, 345
|
||||
|
||||
SMS_STS sms_sts;
|
||||
|
||||
int ID_Feetech = 4;
|
||||
|
||||
struct position_t{
|
||||
int nb_tour;
|
||||
uint position;
|
||||
} cible_haute, cible_basse, actuelle;
|
||||
|
||||
void Moteur_set(int vitesse){
|
||||
ledcWrite(3, 0);
|
||||
ledcWrite(4, 0);
|
||||
}
|
||||
|
||||
void setup()
|
||||
{
|
||||
Serial.begin(115200);//sms舵机波特率115200
|
||||
Serial1.begin(1000000,SERIAL_8N1, RX, TX);//sts舵机波特率1000000
|
||||
sms_sts.pSerial = &Serial1;
|
||||
delay(1000);
|
||||
sms_sts.WheelMode(ID_Feetech);//舵机ID1切换至电机恒速模式
|
||||
//sms_sts.WriteSpe(ID_Feetech, 2400, 100);
|
||||
cible_haute.nb_tour = 0;
|
||||
cible_haute.position = 500;
|
||||
|
||||
cible_basse.nb_tour = 2;
|
||||
cible_basse.position = 1500;
|
||||
|
||||
actuelle.nb_tour = 0;
|
||||
|
||||
//Servo fourche (12V)
|
||||
ledcAttach(5, 50, 12);
|
||||
// ledcWrite(5, 307); // Neutre
|
||||
ledcWrite(5, 307); // Position de transport
|
||||
//ledcWrite(5, 227); // Position levée (butée haute)
|
||||
//ledcWrite(5, 345); // Position de prise
|
||||
|
||||
|
||||
while(1){
|
||||
ledcWrite(FOURCHE_PRISE);
|
||||
delay(1000);
|
||||
ledcWrite(FOURCHE_TRANSPORT);
|
||||
delay(1000);
|
||||
ledcWrite(FOURCHE_LEVEE);
|
||||
delay(1000);
|
||||
ledcWrite(FOURCHE_TRANSPORT);
|
||||
delay(5000);
|
||||
|
||||
}
|
||||
|
||||
|
||||
// Servo pinces à aimant
|
||||
ledcAttach(8, 50, 12);
|
||||
ledcWrite(8, 307);
|
||||
|
||||
ledcAttach(9, 50, 12);
|
||||
ledcWrite(9, 307);
|
||||
|
||||
// Moteur
|
||||
ledcAttach(3, 2000, 8);
|
||||
ledcWrite(3, 0);
|
||||
ledcAttach(4, 2000, 8);
|
||||
ledcWrite(4, 0);
|
||||
|
||||
|
||||
if(sms_sts.FeedBack(ID_Feetech)!=-1){
|
||||
actuelle.position = sms_sts.ReadPos(-1);
|
||||
}else{
|
||||
do{
|
||||
Serial.println("Erreur lecture");
|
||||
delay(1000);
|
||||
}while(sms_sts.FeedBack(ID_Feetech) ==-1);
|
||||
actuelle.position = sms_sts.ReadPos(-1);
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
||||
void goto_position(int servo_id, position_t position){
|
||||
// Actualise la position
|
||||
struct position_t precedente;
|
||||
static int loin = 1;
|
||||
precedente = actuelle;
|
||||
if(sms_sts.FeedBack(servo_id)!=-1){
|
||||
actuelle.position = sms_sts.ReadPos(-1);
|
||||
}
|
||||
if(abs((int)actuelle.position - (int)precedente.position) > 2000){
|
||||
// Rebouclage compteur
|
||||
if(actuelle.position < precedente.position){
|
||||
// Sens positif
|
||||
actuelle.nb_tour++;
|
||||
}else{
|
||||
actuelle.nb_tour--;
|
||||
}
|
||||
}
|
||||
|
||||
// Sens de déplacement
|
||||
if(actuelle.nb_tour != position.nb_tour){
|
||||
if(loin != 1){
|
||||
loin = 1;
|
||||
sms_sts.WheelMode(servo_id);
|
||||
if(actuelle.nb_tour < position.nb_tour){
|
||||
sms_sts.WriteSpe(servo_id, 2400, 50);
|
||||
}else{
|
||||
sms_sts.WriteSpe(servo_id, -2400, 50);
|
||||
}
|
||||
}
|
||||
}else{
|
||||
if(loin != 0){
|
||||
loin = 0;
|
||||
sms_sts.ServoMode(servo_id);
|
||||
sms_sts.WritePosEx(ID_Feetech, position.position, 2400, 50);
|
||||
}
|
||||
}
|
||||
Serial.printf(">cible_pos:%d\n",position.position);
|
||||
Serial.printf(">cible_nb_tour:%d\n",position.nb_tour);
|
||||
Serial.printf(">act_pos:%d\n",actuelle.position);
|
||||
Serial.printf(">act_nb_tour:%d\n",actuelle.nb_tour);
|
||||
|
||||
}
|
||||
|
||||
void loop()
|
||||
{
|
||||
static int m_pos=0;
|
||||
static unsigned long myTime=0;
|
||||
static position_t cible;
|
||||
|
||||
/*
|
||||
//舵机(ID1)以最高速度V=60*0.732=43.92rpm,加速度A=50*8.7deg/s^2,运行至P1=4095位置
|
||||
sms_sts.WritePosEx(1, 4095, 2400, 50);
|
||||
delay((4095-0)*1000/(60*50) + (60*50)*10/(50) + 50);//[(P1-P0)/(V*50)]*1000+[(V*50)/(A*100)]*1000 + 50(误差)
|
||||
|
||||
//舵机(ID1)以最高速度V=60*0.732=43.92rpm,加速度A=50*8.7deg/s^2,运行至P0=0位置
|
||||
sms_sts.WritePosEx(1, 0, 2400, 50);
|
||||
delay((4095-0)*1000/(60*50) + (60*50)*10/(50) + 50);//[(P1-P0)/(V*50)]*1000+[(V*50)/(A*100)]*1000 + 50(误差)
|
||||
*/
|
||||
Serial.print(">millis:");
|
||||
Serial.println(millis());
|
||||
if(millis() > myTime + 8000){
|
||||
myTime = millis();
|
||||
if(m_pos){
|
||||
//sms_sts.WritePosEx(ID_Feetech, 4095, 2400, 50);
|
||||
//sms_sts.WriteSpe(ID_Feetech, 2400, 50);
|
||||
cible = cible_haute;
|
||||
m_pos = 0;
|
||||
}else{
|
||||
m_pos ++;
|
||||
//sms_sts.WriteSpe(ID_Feetech, -2400, 50);
|
||||
//sms_sts.WritePosEx(ID_Feetech, 0, 2400, 50);
|
||||
//sms_sts.WriteSpe(ID_Feetech, -80, 100);
|
||||
cible = cible_basse;
|
||||
}
|
||||
}
|
||||
goto_position(ID_Feetech, cible);
|
||||
int ID = sms_sts.Ping(ID_Feetech);
|
||||
if(ID!=-1){
|
||||
Serial.print("Servo ID:");
|
||||
Serial.println(ID, DEC);
|
||||
delay(100);
|
||||
}else{
|
||||
Serial.println("Ping servo ID error!");
|
||||
delay(2000);
|
||||
}
|
||||
|
||||
int Pos;
|
||||
int Speed;
|
||||
int Load;
|
||||
int Voltage;
|
||||
int Temper;
|
||||
int Move;
|
||||
int Current;
|
||||
if(sms_sts.FeedBack(ID)!=-1){
|
||||
Pos = sms_sts.ReadPos(-1);
|
||||
Speed = sms_sts.ReadSpeed(-1);
|
||||
Load = sms_sts.ReadLoad(-1);
|
||||
Voltage = sms_sts.ReadVoltage(-1);
|
||||
Temper = sms_sts.ReadTemper(-1);
|
||||
Move = sms_sts.ReadMove(-1);
|
||||
Current = sms_sts.ReadCurrent(-1);
|
||||
Serial.print(">Position:");
|
||||
Serial.println(Pos);
|
||||
Serial.print(">Speed:");
|
||||
Serial.println(Speed);
|
||||
Serial.print(">Load:");
|
||||
Serial.println(Load);
|
||||
Serial.print(">Voltage:");
|
||||
Serial.println(Voltage);
|
||||
Serial.print(">Temper:");
|
||||
Serial.println(Temper);
|
||||
Serial.print(">Move:");
|
||||
Serial.println(Move);
|
||||
Serial.print(">Current:");
|
||||
Serial.println(Current);
|
||||
delay(50);
|
||||
}else{
|
||||
Serial.println("FeedBack err");
|
||||
delay(500);
|
||||
}
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user