Estou fazendo um braço mecânico para a faculdade e montei um circuito usando potenciômetros, usando a protoboard estava tudo funcional, mas tinha um problema de mal contato, por isso meu professor sugeriu soldar os fios aos potenciômetros.
Quando fiz isso, por incrível que pareça, o problema piorou, quando estava fazendo o troubleshooting um dos servos começou a estalar quando eu mexia ele (alimentação desligada) um dos servos não se mexia mais e o arduino começou a levar um tempo para começar a rodar o código e, enquanto não rodava, mandava sinais aleatórios para o monitor serial e ficava girando os servos loucamente. Não sei se é problema da placa, só dos potenciômetros, dos servos ou até da fonte externa. O que eu faço?
A primeira coisa é que servos puxam muita corrente e precisam ter alimentação propria separada para que a alimentação do Arduino fique estabilizada. Depois é necessrio ver seu código .
Não terás cometido um erro ao soldar e a ligar de novo? Já experimentaste com um multimetro a ver se o potenciometro funciona correctamente? Outra coisa a ter em atenção com potenciómetros é que muitos vão até zero Ohm. Se decidiste ser criativo podes estar a criar um curto circuito.
Sem ver o circuito e código não podemos ajudar muito mais.
Foi colocada alimentação separada, agradeço a resposta, o código funcionava antes de soldar, mas ele é:
#include <VarSpeedServo.h>
// Definir pinos e constantes
#define Led 13
#define bot1 6
#define bot2 7
const int numPosicoes = 5;
const unsigned long intervaloLeitura = 2500;
VarSpeedServo servo[4];
int posicao[numPosicoes][4];
int t = 0;
int j = 0;
unsigned long timer = 0; // Declaramos a variável timer
int valservo[4];
int pot[4];
int valpot[4];
void setup() {
// Inicializar servos e pinos
for (int i = 0; i < 4; i++) {
servo[i].attach(i + 2, 500, 2500);
pinMode(A0 + i, INPUT);
}
Serial.begin(9600);
pinMode(bot1, INPUT_PULLUP);
pinMode(bot2, INPUT_PULLUP);
pinMode(Led, OUTPUT);
}
void interpolarServo(int servoIndex, int posicaoInicial, int posicaoFinal, unsigned long tempoTotal) {
unsigned long startTime = millis();
while (millis() - startTime <= tempoTotal) {
float progresso = float(millis() - startTime) / float(tempoTotal);
int posicaoIntermediaria = int(progresso * (posicaoFinal - posicaoInicial)) + posicaoInicial;
servo[servoIndex].write(posicaoIntermediaria);
delay(20); // Ajuste isso para um intervalo de atualização adequado
}
}
void loop() {
// Controle manual
while (digitalRead(bot1) != 0 && digitalRead(bot2) != 0 && j == 0) {
valservo[0] = servo[0].read();
pot[0] = analogRead(A0);
valpot[0] = map(pot[0], 0, 1023, 0, 30);
servo[0].write(valpot[0]);
valservo[1] = servo[1].read();
pot[1] = analogRead(A1);
valpot[1] = map(pot[1], 0, 1023, 0, 100);
servo[1].write(valpot[1]);
valservo[2] = servo[2].read();
pot[2] = analogRead(A2);
valpot[2] = map(pot[2], 0, 1023, 0, 60);
servo[2].write(valpot[2]);
valservo[3] = servo[3].read();
pot[3] = analogRead(A3);
valpot[3] = map(pot[3], 0, 1023, 0, 120);
servo[3].write(valpot[3]);
digitalWrite(Led, LOW);
}
// Escrever as posições no intervalo especificado
if (millis() - timer >= intervaloLeitura) {
for (int i = 0; i < 4; i++) {
int pot = analogRead(A0 + i);
int valpot = map(pot, 0, 1023, 0, 180);
Serial.println("*********************************************************************");
Serial.print("Pot");
Serial.print(i + 1);
Serial.print(": ");
Serial.println(pot);
Serial.print("Angulo: ");
Serial.println(valpot);
}
timer = millis();
}
// Ler as posições
while (digitalRead(bot2) == 0) {
for (int i = 0; i < 4; i++) {
int pot = analogRead(A0 + i);
posicao[t][i] = valpot[i];
}
digitalWrite(Led, HIGH);
t = (t + 1) % numPosicoes;
Serial.println("Posição salva");
delay(2000);
}
// Realizar as posições
while (digitalRead(bot1) == 0 || j > 0) {
for (int i = 0; i < 4; i++) {
servo[i].slowmove(posicao[j][i], 27);
}
digitalWrite(Led, HIGH);
j = (j + 1) % numPosicoes;
Serial.println("Posição ativa");
delay(2500);
}
}
Acho que nao foi o caso do curto por causa do tipo de potenciômetro, já que na protoboard ele funcionava mas o código é:
// Pedro Alécio
// RA: 22018122
#include <VarSpeedServo.h>
// Definir pinos e constantes
#define Led 13
#define bot1 6
#define bot2 7
const int numPosicoes = 5;
const unsigned long intervaloLeitura = 2500;
VarSpeedServo servo[4];
int posicao[numPosicoes][4];
int t = 0;
int j = 0;
unsigned long timer = 0; // Declaramos a variável timer
int valservo[4];
int pot[4];
int valpot[4];
void setup() {
// Inicializar servos e pinos
for (int i = 0; i < 4; i++) {
servo[i].attach(i + 2, 500, 2500);
pinMode(A0 + i, INPUT);
}
Serial.begin(9600);
pinMode(bot1, INPUT_PULLUP);
pinMode(bot2, INPUT_PULLUP);
pinMode(Led, OUTPUT);
}
void interpolarServo(int servoIndex, int posicaoInicial, int posicaoFinal, unsigned long tempoTotal) {
unsigned long startTime = millis();
while (millis() - startTime <= tempoTotal) {
float progresso = float(millis() - startTime) / float(tempoTotal);
int posicaoIntermediaria = int(progresso * (posicaoFinal - posicaoInicial)) + posicaoInicial;
servo[servoIndex].write(posicaoIntermediaria);
delay(20); // Ajuste isso para um intervalo de atualização adequado
}
}
void loop() {
// Controle manual
while (digitalRead(bot1) != 0 && digitalRead(bot2) != 0 && j == 0) {
valservo[0] = servo[0].read();
pot[0] = analogRead(A0);
valpot[0] = map(pot[0], 0, 1023, 0, 30);
servo[0].write(valpot[0]);
valservo[1] = servo[1].read();
pot[1] = analogRead(A1);
valpot[1] = map(pot[1], 0, 1023, 0, 100);
servo[1].write(valpot[1]);
valservo[2] = servo[2].read();
pot[2] = analogRead(A2);
valpot[2] = map(pot[2], 0, 1023, 0, 60);
servo[2].write(valpot[2]);
valservo[3] = servo[3].read();
pot[3] = analogRead(A3);
valpot[3] = map(pot[3], 0, 1023, 0, 120);
servo[3].write(valpot[3]);
digitalWrite(Led, LOW);
}
// Escrever as posições no intervalo especificado
if (millis() - timer >= intervaloLeitura) {
for (int i = 0; i < 4; i++) {
int pot = analogRead(A0 + i);
int valpot = map(pot, 0, 1023, 0, 180);
Serial.println("*********************************************************************");
Serial.print("Pot");
Serial.print(i + 1);
Serial.print(": ");
Serial.println(pot);
Serial.print("Angulo: ");
Serial.println(valpot);
}
timer = millis();
}
// Ler as posições
while (digitalRead(bot2) == 0) {
for (int i = 0; i < 4; i++) {
int pot = analogRead(A0 + i);
posicao[t][i] = valpot[i];
}
digitalWrite(Led, HIGH);
t = (t + 1) % numPosicoes;
Serial.println("Posição salva");
delay(2000);
}
// Realizar as posições
while (digitalRead(bot1) == 0 || j > 0) {
for (int i = 0; i < 4; i++) {
servo[i].slowmove(posicao[j][i], 27);
}
digitalWrite(Led, HIGH);
j = (j + 1) % numPosicoes;
Serial.println("Posição ativa");
delay(2500);
}
}
E não consigo anexar o arquivo do circuito pois sou usuário novo, mas vou colocar o link do tinkercad Circuit design Pedro Alécio | Tinkercad
Podes desligar 4 servos e experimentar com um? Depois vai adicionando um a um e vê se notas alguma diferença.
A placa do arduino que estava dando problema, foi defeito de fabricação aparentemente, troquei a placa e funcionou, perdi 2 motores no processo, mas o problema foi resolvido. Muito obrigado pela ajuda.
This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.