Olá ,estou buscando informações sobre como montar uma programação em que o braço robótico possa trabalhar tanto no automático quanto no modo manual através de potenciômetros ,alguém poderia dar uma força?(indicar o caminho), Segue o link: Robot Arm com o braço em programação automática ,gostaria de adicionar o(s) Potenciômetros p/ que ao tocar no pushButton ou algum tipo de chave ele interrompa a programação e vá para modo manual;;..
Tags:
Leo, bom dia.
Muito legal o seu robot.
Voce mesmo fez as peças dele ou é um Kit?
Para facilitar a nossa participação na solução da sua dificuldade, sugiro voce postar aqui ou no PASTEBIN, o código que comanda o robot.
Rui,
O Braço Robo do vídeo foi um Kit para elaborar e aprender a programação o Robo da foto é o projeto que estou montando e pretendo aplicar a função a programação desse braço não vem ao caso, pois não serve como base para o que preciso já que a programação será com outra Library a <VarSpeedServo.h> ,pois o Robo projeto irá trabalhar com o servo MG996R o qual é necessário o controle da velocidade ,segue uma base que estou utilizando para esse novo caso :
#include <VarSpeedServo.h>
const int NBR_SERVOS = 4; // the number of servos
VarSpeedServo Servos[NBR_SERVOS]; // servo objects
int servoPins[NBR_SERVOS] = {8,9,10,11 }; // servo pins
int servoSpeeds[NBR_SERVOS] = {30,10,50,50 }; // sweep speed, 1 is slowest, 255 fastest)
int servoMinPosition[NBR_SERVOS] = {10,10,10,10 }; // the minumum servo angle
int servoMaxPosition[NBR_SERVOS] = {170,90,100,80 }; // the maximum servo angle
void setup()
{
for(int i=0; i < NBR_SERVOS; i++)
{
Servos[i].attach(servoPins[i]);
Servos[i].slowmove(servoMinPosition[i],servoSpeeds[i]) ; // start sweeping from min position
}
}
void loop()
{
// sweep the servos
for(int i=0; i < NBR_SERVOS; i++)
{
if( Servos[i].read() == servoMinPosition[i])
Servos[i].slowmove(servoMaxPosition[i],servoSpeeds[i]) ;
else if( Servos[i].read() == servoMaxPosition[i])
Servos[i].slowmove(servoMinPosition[i],servoSpeeds[i]) ;
}
}
Leo, boa trade.
Vou montar no proto um servo e testar .
Com um botão apertado voce quer que ele vá para o manual, e no manual com
voce um potenciometro voce variar o que? A velocidade ou a posição do servo?
Rui
Boa tarde Rui , gostaria que o start fosse no modo automático e quando pressionado o botão eu possa operar manualmente através de dois Módulos Joystick, no caso são quatro servos inicialmente para teste no braço atual e 5 no novo projeto mas se conseguirmos chegar no comando para um servo"piloto"tudo está resolvido....
Leo, bom dia,
Estou testando com meu servo fraquinho.
Depois conto o resultado.
Rui
Obrigado Rui!
Uma ótima tarde !
Leo, boa tarde.
Como estou com visitas demorei a escrever o código.
Escrevi este código simples com um botão e 2 poteciomentros.
Qdo voce carrega o codigo ele entra em automatico e fica movendo o motro entr 0o e 180o..
Ao apertar o botão ele entra em manual e vai para posição e velocidade ajustadas nos potenciometros.
Variando os potenciometros ele vai a posição e velocidade.
Ao apertar novamente o botão ele volta para automatico.
Motor no D8;
Potenciometro de posição em A0;
Potenciometro de velocidade em A1;
Botão em D2. (Entre D2 e GND).
Rui
#include <VarSpeedServo.h>
VarSpeedServo Servos1; // servo objects
int ServoPin = 8; // output to servomotor
int PosPin = 0; // Entrada analógica Cnt de posição manual
int VelPin = 1; // Entrada analógica Cnt de velocidade manual
int ServoPos = 0; // variavel para a posição do servo
int ServoVel = 0; // variavel para a velocidade do servo
int Leitura = 0;
int Botao = 2; // Botão seleção Auto/Manual tem que ser no pino 2
int Bt_Sts = 0; // variavel para flag do botao do servo
long debouncing_time = 500; //Debouncing Time in Milliseconds
volatile unsigned long last_micros; // variavel deboucing do botao
// ------------------------------- Seup ---------------------------
void setup()
{
//Serial.begin(9600); // Para debug
pinMode(Botao,INPUT); // botao entrada
digitalWrite(Botao,HIGH); // Pull-up
Servos1.attach(ServoPin); // Define pino de sáida do servo
attachInterrupt(0, debounceInterrupt, FALLING); // Enable interrupt 0 no pino D2
}
// ------------------------------- Debouncing ---------------------------
void debounceInterrupt() // Evita debouncing no botao
{
noInterrupts(); // bloqueia interrupt
if((long)(micros() - last_micros) >= debouncing_time * 1000) // Calcula tempo de debouncing
{
if (Bt_Sts == 1) Bt_Sts = 0; // Se estava em manual muda para auto
else Bt_Sts = 1; // Se estava em auto muda para manual
last_micros = micros(); // Salva tempo de debouncing
interrupts(); // libera interrupt
}
}
// --------------------------- loop --------------------------
void loop()
{
if (Bt_Sts == 1) // Se estiver em manual
{
ServoPos = analogRead(PosPin); // Le valor pot posição
delay(10); // tempo para ADC
ServoPos = int(ServoPos/5.6); // Calcula posição (1023/180)
ServoVel = analogRead(VelPin); // Le valor pot velocidade
delay(10); // tempo para ADC
ServoVel = int(ServoVel/4); // Calcula velocidade (1023/255)
Servos1.slowmove(ServoPos,ServoVel) ; // Move para valor de ServoPos em ServoVel
delay(1000); // tempo para o movimento
}
else // Se estiver em Auto
{
Servos1.slowmove(180,255) ; // Move até 180o em max vel
delay(1000); // tempo para o movimento
Servos1.slowmove(0,255) ; // Move até 0o em max vel
delay(1000); // tempo para o movimento
}
}
Bom dia Rui !
Muito obrigado pelo Apoio , vou adaptar para minhas necessidades agora ,testei com um servo pequeno por enquanto e ficou perfeito , TKS!
Bem-vindo a
Laboratorio de Garagem (arduino, eletrônica, robotica, hacking)
© 2024 Criado por Marcelo Rodrigues. Ativado por