Arduino e potenciômetro estão dando problema

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.