probleem DC-motor in combi met servo motor

Dag Allemaal,

ik heb een sketch waarbij ik een DC-motortje link- en rechtsom kan laten draaien dmv een drukknop of een infrarood afstandsbediening.Tot zover werkt alles.

Nu wil ik hierbij een servomotor aan toevoegen. De code hiervan op zich werkt ook. Maar nu blijkt de DC-motor te sputteren, de potentiometer voor toerentalregeling werkt niet, en ik meet rare spanningen op de servo-output terwijl ik die niet uitstuur.

Ik heb gemerkt dat als ik de regel: "myServo.attach(3);" in comment zet, er geen probleem met dc-motor zijn.

Wij kan me verder helpen?
Alvast bedankt.

#include <Servo.h>
#include <IRremote.h>

long myTime = 0;
Servo myServo; // create a servo object
const int poolMotor = 5;

const int controlPin1 = 2; // connected to pin 7 on the H-bridge
const int controlPin2 = 4; // connected to pin 2 on the H-bridge
const int enablePin = 9; // connected to pin 1 on the H-bridge
const int btnFrontStage = 12; // connected to the switch for turning brushed motor on and off
const int btnDivingBoard = 8; // connected to the switch for turning diving board servo motor on
const int potPin = A0; // connected to the potentiometer's output

const int irReceivePin = 7; // connected to IRreceiver OUT
IRrecv irrecv(irReceivePin);
decode_results results;

// create some variables to hold values from your inputs
int onOffFrontstageState = 0; // current state of the on/off switch
int previousFrontStageState = 0; // previous position of the on/off switch
int directionSwitchState = 0; // current state of the direction switch
int previousDirectionSwitchState = 0; // previous state of the direction switch

int motorEnabled = 0; // Turns the motor on/off
int motorSpeed = 0; // speed of the motor
int motorDirection = 1; // current direction of the motor
int buttonPushCounter = 0; // counter for the number of button presses
int irResult = 0;

void setup() {
myServo.write(0);
myServo.attach(3); // <---- probleem als ik deze regel uncomment
// initialize the inputs and outputs
pinMode(btnDivingBoard, INPUT);
pinMode(btnFrontStage, INPUT);
pinMode(controlPin1, OUTPUT);
pinMode(controlPin2, OUTPUT);
pinMode(enablePin, OUTPUT);
pinMode(poolMotor, OUTPUT);

pinMode(irReceivePin, INPUT);
irrecv.enableIRIn(); // Start the receiver
// pull the enable pin LOW to start
digitalWrite(enablePin, LOW);
myTime = millis();
Serial.begin(9600);
}

void loop() {

long key;
// read the value of the on/off switch
onOffFrontstageState = digitalRead(btnFrontStage);
delay(1);

// read the value of the pot and divide by 4 to get a value that can be
// used for PWM
motorSpeed = analogRead(potPin) / 4;
/* if (myTime + 2000 <= millis()) {
Serial.print("motorSpeed: ");
Serial.println(motorSpeed);
Serial.print("potPin: ");
Serial.println(analogRead(potPin));
Serial.print("seconds: ");
Serial.println(millis() / 1000);
myTime = millis();
}*/

// if the on/off button changed state since the last loop()
if (onOffFrontstageState != previousFrontStageState) {
// change the value of motorEnabled if pressed
if (onOffFrontstageState == HIGH) {
motorEnabled = !motorEnabled;
buttonPushCounter ++;
}
}

// if the direction button changed state since the last loop()
if (directionSwitchState != previousDirectionSwitchState) {
// change the value of motorDirection if pressed
if (directionSwitchState == HIGH) {
motorDirection = !motorDirection;
}
}

// change the direction the motor spins by talking to the control pins
// on the H-Bridge
if (motorDirection == 1) {
digitalWrite(controlPin1, HIGH);
digitalWrite(controlPin2, LOW);
} else {
digitalWrite(controlPin1, LOW);
digitalWrite(controlPin2, HIGH);
}

if (irrecv.decode(&results))
{
irrecv.resume(); // Receive the next value
key = results.value;

Serial.println(key);
if (key == 16716015) //druk <
{
buttonPushCounter = 1;
}
else if (key == 16726215) //druk ok
{
buttonPushCounter = 2;
}
else if (key == 16734885) //druk >
{
buttonPushCounter = 3;
}
else if (key == 16736925) //druk 2
{
startDivingBoard();
}
}
switch (buttonPushCounter) {
case 1: // motor left
motorDirection = 1;
motorEnabled = 1;
break;
case 2:
motorEnabled = 0;
break;
case 3: // motor right
motorDirection = 0;
motorEnabled = 1;
break; // motor stop
default:
motorEnabled = 0;
buttonPushCounter = 0;
break;
}
// if the motor is supposed to be on
if (motorEnabled == 1) {
// PWM the enable pin to vary the speed
analogWrite(enablePin, motorSpeed);
} else { // if the motor is not supposed to be on
//turn the motor off
analogWrite(enablePin, 0);
}
// save the current on/off switch state as the previous
previousDirectionSwitchState = directionSwitchState;
// save the current switch state as the previous
previousFrontStageState = onOffFrontstageState;
}

void startDivingBoard() {
for (int i = 0; i <= 2; i++) {
myServo.write(45);
delay(400);
myServo.write(0);
delay(400);
}
delay(150);
digitalWrite(poolMotor, HIGH);
delay(200);
digitalWrite(poolMotor, LOW);
}

fleaCircus.ino (4.62 KB)

Hallo,

Last mij raden? Je voedt dit alles met een gewoon 9v batterij? Indien ja, zou ik dat alles eens proberen samen te laten werken met 6x1,5v batterijen, of nog beter een voeding.
Dit hoeft helemaal niet duur te zijn, je hebt al 220v naar 9-28 volt op Banggood. Ik ben niet 100% zeker van die 28v, maar weet wel zeker dat het laagste voltage 9v is, en ze kosten zo rond de 10 euro. De laatste zijn uitgevoerd met een US stekker waar je dan zo een plastic ding bij krijgt om het bij ons te laten werken. Doe jezelf een groot plezier IVM veiligheid en knip die stekker eraf en zet er een EU stekker op.

Groetjes,

Mike

Mikeb1970:
Hallo,

Last mij raden? Je voedt dit alles met een gewoon 9v batterij? Indien ja, zou ik dat alles eens proberen samen te laten werken met 6x1,5v batterijen, of nog beter een voeding.
Dit hoeft helemaal niet duur te zijn, je hebt al 220v naar 9-28 volt op Banggood. Ik ben niet 100% zeker van die 28v, maar weet wel zeker dat het laagste voltage 9v is, en ze kosten zo rond de 10 euro. De laatste zijn uitgevoerd met een US stekker waar je dan zo een plastic ding bij krijgt om het bij ons te laten werken. Doe jezelf een groot plezier IVM veiligheid en knip die stekker eraf en zet er een EU stekker op.

Groetjes,

Mike

Hoi Mike,

Klopt. De arduino is usb gevoed. De motoren voorlopig via 9v batterij.
Dus volgens jou is het een voeding probleem?
Ik verwacht nog een bestelling met o.a. een voeding van 12V/2A. Daarmee wil ik alles aansturen. Arduino, een LED-looplichtje, en een 4 tal servo's en een DC-motortje. Niet allen tegelijk, maar sequentieel.

Bedankt voor de info.

Groeten,
Patrick

Snor:
De motoren voorlopig via 9v batterij.

Natuurlijk is het een voeding probleem. Op dit forum kun je regelmatig lezen dat een 9V batterij voor een rookmelder is en niet voor een Arduino project.

Een kleine servo motor kan 500mA vragen op het moment dat die servo motor begint met draaien. Als er geen 500mA beschikbaar is, dan kan je board gaan resetten of rare dingen gaan doen.
Sommigen kopen een extra sterke servo motor, die kan zomaar een paar Ampère nodig hebben.

Hoe gaat je vier servo motoren gebruiken met een 12V voeding ? Een servo motor heeft 5V or 6V nodig. De 5V pin van het Arduino board is niet eens sterk genoeg voor één servo motor. Is de LEDstrip ook voor 5V ?

Gebruik altijd 'unsigned long' zodra je iets met millis() doet.

Zodra je een myServo.attach(3) doet, dan komt er een signaal op pin 3 te staan. Dat kun je niet met een multimeter meten.

Ik volg hierbij de voorbeelden van sketches van mijn Arduino starterkit. Daarin wordt de bijgeleverde servo ook via een 9V batterij gevoed.

Vandaar dat ik een 12V/2A voeding heb gekocht voor meer vermogen.

12V wil ik omlaag transformeren via een L7805 spanningsregelaar.

Ik snap alleen niet waarom de dc-motor rare dingen doet als ik myServo.attach(3) toepas. Zonder dat pin 3 ook maar aan iets geconnecteerd is, alsook de servo niet.
Stuur ik de dc-motor aan, meet ik verandering in waarden op de multimeter op pin 3. Wat heeft dat met de dc-motor sturing te maken?

Naast het voedingsprobleem is er nog een ander probleem

lees dit

On boards other than the Mega, use of the library disables analogWrite() (PWM) functionality on pins 9 and 10, whether or not there is a Servo on those pins.

Er zijn nogal wat voorbeelden die het eenvoudig houden en in de praktijk nauwelijks werken.

Maar als je servo motor nog helemaal niet aangesloten is, dan is het iets anders :o

Gebruik je een Arduino Uno ?
Die gebruikt zelf al Timer0 voor millis(), dat is normaal. Dan blijven Timer1 en Timer2 nog over.

Servo : Servo - Arduino Reference
Die gebruikt Timer1.

Gebruik je deze IRremote ? GitHub - Arduino-IRremote/Arduino-IRremote: Infrared remote library for Arduino: send and receive infrared signals with multiple protocols
Die gebruikt Timer1 en Timer2.

Je hebt blijkbaar een conflict met de timers.
Ik weet niet zomaar een oplossing voor een Arduino Uno. Het is mogelijk een extern board te gebruiken: Overview | Adafruit PCA9685 16-Channel Servo Driver | Adafruit Learning System
Deze gebruikt Timer5 van een Arduino Mega 2560: irremote servocontrol, timer conflict? solved! - Programming Questions - Arduino Forum

Een L7805 kan erg warm worden. Zijn de DC motors 12 Volt ? Is het mogelijk om alles op 5V te doen ? Er zijn goedkope DC-DC converters op AliExpress, maar de kwaliteit is niet zo goed. Zonder belasting kunnen de goedkoopste stuk gaan.

ArdLab_Gent:
Naast het voedingsprobleem is er nog een ander probleem

lees dit

On boards other than the Mega, use of the library disables analogWrite() (PWM) functionality on pins 9 and 10, whether or not there is a Servo on those pins.

[OPGELOST]
Met dank aan ArdLab_Gent