[OPGELOST] Vaag Servo-setup probleempje

Hoi allen,

Ik heb recentelijk een arduino gebruikt om twee beamer-shutters te maken voor de amateurtheatergroep waar ik voor werk. Feitelijk zijn het twee servo's met een grote flap foam-board er aan vast die voor de lens draaien.

Tot eergisteren werkte alles prima, met knopje A ging shutter 1 dicht, met knopje B ging shutter 1 open. En uiteraard C & D voor shutter 2.

Maar toen...

Na een nieuwe upload met verse parameters (precies voor of naast de lens) werkte shutter 1 niet meer. de dag erna werkte shutter 2 nog maar een beetje. Dit wil zeggen: de Servo maakte de bewegingen bijna nooit af, als ie al wat deed... Dus erg hortend en stotend en maar kleine of halve bewegingen.

Ik begin langzaamaan aan mijn kunnen te twijfelen... Zelfs met een verse arduino en verse servo's kreeg ik eerst maar een Shutter aan de praat, maar inmiddels werkt ook dat niet meer naar behoren...

Help....

Groeten Toon.

Ps. Uiteraard heb ik zoals iedereen een beetje haast... Morgen generale repetitie... (des te gemener dat ie tot eergisteren vlekkeloos werkte, en nu opeens niet meer...

Ps. met een test-INO met simpele sweep werkt er iig een servo... ik ga morgen de dubbele setup testen...

Hierbij mijn gebruikte code:

// include servo library
#include <Servo.h>

// create servo objects to control
Servo myservo1;
Servo myservo2;

// variables to store the servo default, start, and end positions
int pos1 = 20 ;
const int maxDeg1 = 20 ;
const int minDeg1 = 140 ;

int pos2 = 70 ;
const int maxDeg2 = 170 ;
const int minDeg2 = 65 ;

// variables for button-pins
const int maxPin1 = 12;
const int minPin1 = 10;

const int maxPin2 = 4;
const int minPin2 = 2;

// servo control pins
const int outputPin1 = 9;
const int outputPin2 = 6;

// initial state of buttons
int maxPressed1 = 0;
int minPressed1 = 0;

int maxPressed2 = 0;
int minPressed2 = 0;

void setup()
{

  // attaches the servo1 to control- and button- pins
  myservo1.attach(outputPin1);
  myservo2.attach(outputPin2);

  // sets buttonpin type
  pinMode(maxPin1, INPUT);
  pinMode(minPin1, INPUT);
  
  pinMode(maxPin2, INPUT);
  pinMode(minPin2, INPUT);

}

void loop()
{
  maxPressed1 = digitalRead(maxPin1);
  minPressed1 = digitalRead(minPin1);
  
  maxPressed2 = digitalRead(maxPin2);
  minPressed2 = digitalRead(minPin2);

  // controlling servo1
  if (maxPressed1) {
    if (pos1 < maxDeg1) pos1 += 1;
    myservo1.write(pos1);
  }
  else

    if (minPressed1) {
      if (pos1 > minDeg1) pos1 -= 1;
      myservo1.write(pos1);
    }
    else


      // controlling servo2
      if (maxPressed2) {
        if (pos2 < maxDeg2) pos2 += 1;
        myservo2.write(pos2);
      }
      else

        if (minPressed2) {
          if (pos2 > minDeg2) pos2 -= 1;
          myservo2.write(pos2);
        }
        else

          // delay to reach position
          delay(20);

}

Waar haal je de voeding vandaan voor de servo's? Als dat van de 5V komt van de Arduino zou je eens kunnen overwegen om een aparte 5V voor de servo's te gebruiken. Wel de GND (-) polen aan elkaar verbinden.
Ik weet niet welke servo's je gebruikt? Als het van die hele goedkope zijn kijk ik nergens meer van op. Heb een keer 20 stuks laten komen.... duidelijk een miskoop.

Dank voor de snelle reactie!

De Arduino Nano en Servo's hebben ieder een eigen voeding, beide Servo's draaien op een 1000mA 5v voeding en de arduino draait op eigen 5v. Heb inderdaad de Grounds doorverbonden.

Het zijn geen goedkope Servo's (Bluebird BMS 620MG).

Het meest verbazende/storende is dat het van het ene op de andere moment niet meer werkt...

Niet dat ik denk dat het veel zal verandere maar ik zou het zo schrijven

// include servo library
#include <Servo.h>

// create servo objects to control
Servo myservo1;
Servo myservo2;

// variables to store the servo default, start, and end positions
int pos1 = 20;
const int maxDeg1 = 20;
const int minDeg1 = 140;

int pos2 = 70;
const int maxDeg2 = 170;
const int minDeg2 = 65;

// variables for button-pins
const int maxPin1 = 12;
const int minPin1 = 10;

const int maxPin2 = 4;
const int minPin2 = 2;

// servo control pins
const int outputPin1 = 9;
const int outputPin2 = 6;

// initial state of buttons
int maxPressed1 = 0;
int minPressed1 = 0;

int maxPressed2 = 0;
int minPressed2 = 0;

void setup()
{

	// attaches the servo1 to control- and button- pins
	myservo1.attach(outputPin1);
	myservo2.attach(outputPin2);

	// sets buttonpin type
	pinMode(maxPin1, INPUT);
	pinMode(minPin1, INPUT);

	pinMode(maxPin2, INPUT);
	pinMode(minPin2, INPUT);
	pinMode(LED_BUILTIN,OUTPUT);

}

void loop()
{
	maxPressed1 = digitalRead(maxPin1);
	minPressed1 = digitalRead(minPin1);

	maxPressed2 = digitalRead(maxPin2);
	minPressed2 = digitalRead(minPin2);

	if (maxPressed1)
	{
		pos1 += 1;
		digitalWrite(LED_BUILTIN,HIGH);
	};
	if (minPressed1)
	{
		pos1 -= 1;
		digitalWrite(LED_BUILTIN,HIGH);
	};
	if (maxPressed2)
	{
		pos2 += 1;
		digitalWrite(LED_BUILTIN,HIGH);
	};
	if (minPressed2)
	{
		pos2 -= 1;
		digitalWrite(LED_BUILTIN,HIGH);
	};
	constrain(pos1, minDeg1, maxDeg1);
	constrain(pos2, minDeg2, maxDeg2);
	myservo1.write(pos1);
	myservo2.write(pos2);
	// delay to reach position
	delay(20);
	digitalWrite(LED_BUILTIN,LOW);
}

Hou de led in de gaten. Die zou enkel mogen branden als je op een knop drukt.
Heb je pull down weerstanden gebruikt?

Ik snap ook niet zo goed waarom je in dit geval met stapjes wil werken. Als je niet blift duwen gaan de shutters niet volledig open en dicht.

Jantje

Slimme simpele test-case!

Bij het drukken van alle schakelaars gaat de LED branden volgens verwachting...

In de schakeling heb ik inderdaad pull-downs gebruikt. maak gebruik van ongeveer deze opzet:

http://blog.oscarliang.net/how-to-control-a-servo/

(Daar heb ik ook de code op gebaseerd :wink:

Maismeel.

(Oh ja, de stapjes zijn vooral om de boel iets te vertragen ivm formaat grote shutter)

Hallo, Ik heb even naar de code gekeken en de setup na gebouwd om het te kunnen testen. Ik ben tot de conclusie gekomen dat
const int maxDeg1 = 20 ;
const int minDeg1 = 140 ;
omgedraaid moeten worden dus
const int maxDeg1 = 140 ;
const int minDeg1 = 20 ;
Dan werkt hij bij mij wel. Heb de code ook wat aangepast zodat het met een while loop werkt dan bewegen de servo's een stuk rustiger. Hoop dat dit u probleem oplost.

// include servo library
#include <Servo.h>

// create servo objects to control
Servo myservo1;
Servo myservo2;

// variables to store the servo default, start, and end positions
int pos1 = 20 ;
const int maxDeg1 = 140 ;
const int minDeg1 = 20 ;

int pos2 = 70 ;
const int maxDeg2 = 170 ;
const int minDeg2 = 65 ;

// variables for button-pins
const int maxPin1 = 12;
const int minPin1 = 10;

const int maxPin2 = 4; 
const int minPin2 = 2; 

// servo control pins
const int outputPin1 = 9;
const int outputPin2 = 6;

// initial state of buttons
int maxPressed1 = 0;
int minPressed1 = 0;

int maxPressed2 = 0;
int minPressed2 = 0;

void setup()
{
Serial.begin(9600);
  // attaches the servo1 to control- and button- pins
  myservo1.attach(outputPin1);
  myservo2.attach(outputPin2);

  // sets buttonpin type
  pinMode(maxPin1, INPUT);
  pinMode(minPin1, INPUT);
  
  pinMode(maxPin2, INPUT);
  pinMode(minPin2, INPUT);

}

void loop()
{
  maxPressed1 = digitalRead(maxPin1);
  minPressed1 = digitalRead(minPin1);
  
  maxPressed2 = digitalRead(maxPin2);
  minPressed2 = digitalRead(minPin2);

  // controlling servo1
  if (maxPressed1==HIGH) {
    Serial.println(pos1);
    while (pos1 <= maxDeg1){ //while loop zodat hij mooi rustig beweegt
     pos1 += 1; 
    myservo1.write(pos1);
    Serial.println(pos1);
     delay(10); //snelheid servo
  }
  }
  
    if (minPressed1==HIGH) {
      Serial.println(pos1);
      while(pos1 >= minDeg1){ //while loop zodat hij mooi rustig beweegt
        pos1 -= 1; 
      myservo1.write(pos1);
      Serial.println(pos1);
      delay(10);//snelheid servo
    
      }
    }
    
    
    
    
     // controlling servo1
  if (maxPressed2==HIGH) {
    while (pos2 <= maxDeg2){ //while loop zodat hij mooi rustig beweegt
     pos2 += 1; 
    myservo2.write(pos2);
     delay(10);//snelheid servo
  }
  }
  
    if (minPressed2==HIGH) {

      while(pos2 >= minDeg2){ //while loop zodat hij mooi rustig beweegt
        pos2 -= 1; 
      myservo2.write(pos2);
      Serial.println(pos2);
      delay(10);//snelheid servo
    
      }
    }
    
}

@Tim14
Goed gezien.
Waarschijnlijk wou maismeel de sluit en open knoppen omkeren. Vandaar dat het vroeger werkte en nu niet meer.
Als ik het juist heb was het beter om deze om te keren

const int maxPin1 = 12;
const int minPin1 = 10;

@maismeel
Je kan je niet voorstellen hoe vaak bij mij iets werkt en dan plotseling niet meer. Dikswijls is dat zo omdat iets werkte om een andere reden dan ik dacht; waardoor een aanpassing (hardware of software) de zaak doet stoppen met werken zonder dat ik geen enkel idee heb waarom.

Met vriendelijke groet
Jantje

@Tim en @Jantje:

Dank voor het meedenken, ik zal even gaan testen volgende week of die parameters omdraaien werkt :slight_smile:

Want:

HET WERKT WEER !!!

Een andere hulplijn kwam met het geniale idee om eerst weer een stapje terug te nemen en met de originele code een klepje te bedienen, en dan vanaf daar weer opbouwen.

Nogmaals dank, en wie weet tot binnenkort als ik weer wat anders verprutst heb. Want heb na dit project wel het arduino-virus te pakken :slight_smile: (Auto-panorama-pan-tilt-kop here I come!)

Gr. M.