Robot Arm Programação automática com inversão para manual

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;;..

Exibições: 1695

Responder esta

Respostas a este tópico

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!

RSS

© 2024   Criado por Marcelo Rodrigues.   Ativado por

Badges  |  Relatar um incidente  |  Termos de serviço