Pagina1 van 1
Forum

Welkom bij de Tweaking4All gemeenschapsforums!
Voor je gaat deelnemen, bekijk de Forum Regels!

Specifieke onderwerpen: Start het onderwerp met de naam van het programma of systeem.
Bijvoorbeeld “MacOS X – Jouw vraag“, of bijvoorbeeld “MS Word – Jouw Tip of Truc“.

Merk op: Omschakelen naar een andere taal zal niet werken als je een post aan het lezen bent aangezien er waarschijnlijk geen vertaling beschikbaar is.



Arduino - automatis...
 
Deel:
Meldingen
Alles wissen

[Opgelost] Arduino - automatische schuifdeur sluiting voor buscamper

65 Berichten
2 Gebruikers
1 Reactions
9,550 Bekeken
 Hans
(@hans)
Famed Member Admin
Deelgenomen: 12 jaar geleden
Berichten: 2865
 

De error vertelt je dat je "void setup()" geherdefinieerd hebt. (redefinition of 'void setup()')

Dat klopt ook, want je hebt inderdaad de oude "void setup()} niet verwijderd - even over het hoofd gezien denk ik 😊 

In onderstaand voorbeeld de rode code weghalen - de blauwe code is de herdefinitie van void setup (laten staan):

#include "CytronMotorDriver.h"
 // Pins voor de motor: PWM = Pin 3, DIR = Pin 4
#define motorDIRpin 4
#define motorPWMpin 3

// Configure the motor driver.
CytronMD motor(PWM_DIR, motorPWMpin, motorDIRpin);

#define rc1pin 2 // gebruik pin 2 voor reedcontact 1
#define rc2pin 7 // gebruik pin 7 voor reedcontact 2

// deze functie draait 1x als de Arduino aangezet wordt
void setup() {
  // nog doen we nog niks
}
void setup() {
  pinMode(rc1pin, INPUT);
  pinMode(rc2pin, INPUT);
}
// de loop blijft herhalen tot de Arduino wordt uitgezet.
void loop() {
  if (digitalRead(rc1pin) == HIGH) {
    MotorActie();
  }

  delay(300); // kleine pauze
}

void MotorActie() {
  // de stappen die nodig zijn om de motor aan te zetten en de omwenteling af te handelen
  // dus: Motor AAN
  motor.setSpeed(255); // 100% snelheid - evt aanpassen aan wat wenselijk is

  // Laat motor lopen to rc2 gesloten wordt
  while (digitalRead(rc2pin) == LOW) {
    // niks doen tot rc2 HIGH wordt, en dus niet meer LOW is
  }

  // als rc2 gesloten wordt, stop de motor
  motor.setSpeed(0);
}

   
BeantwoordenCiteren
(@anne-jan)
Eminent Member
Deelgenomen: 5 jaar geleden
Berichten: 37
Topic starter  

PS.

Ik heb de void setup op verschillende plekken geprobeerd.


   
BeantwoordenCiteren
(@anne-jan)
Eminent Member
Deelgenomen: 5 jaar geleden
Berichten: 37
Topic starter  

 

Ter verduidelijking toch maar even weer een video gemaakt.

Er veranderd aan de uitvoering niets, hij gaat nog steeds niet opstarten als rc2 gesloten is en ook niet als ik de Arduino aan de stroom zet.

Dit bericht is gewijzigd 5 jaar geleden door ajrumph

   
BeantwoordenCiteren
 Hans
(@hans)
Famed Member Admin
Deelgenomen: 12 jaar geleden
Berichten: 2865
 

Dat is jammer 😞

OK, laten we wat tests doen.

 

Test 1 - motor AAN met RC1

  1. het starten van de Arduino = motor niet aan
  2. als RC1 HIGH gaat -> Motor aan

Eerst kijken dus of we het RC1 deel aan de gang kunnen krijgen. Hiervoor zet ik even commentaar-tekens voor de code van rc2 (rood):

#include "CytronMotorDriver.h"
 // Pins voor de motor: PWM = Pin 3, DIR = Pin 4
#define motorDIRpin 4
#define motorPWMpin 3

// Configure the motor driver.
CytronMD motor(PWM_DIR, motorPWMpin, motorDIRpin);

#define rc1pin 2 // gebruik pin 2 voor reedcontact 1
#define rc2pin 7 // gebruik pin 7 voor reedcontact 2

// deze functie draait 1x als de Arduino aangezet wordt
void setup() {
  pinMode(rc1pin, INPUT);
  pinMode(rc2pin, INPUT);
}
// de loop blijft herhalen tot de Arduino wordt uitgezet.
void loop() {
  if (digitalRead(rc1pin) == HIGH) {
    MotorActie();
  }

  delay(300); // kleine pauze
}

void MotorActie() {
  // de stappen die nodig zijn om de motor aan te zetten en de omwenteling af te handelen
  // dus: Motor AAN
  motor.setSpeed(255); // 100% snelheid - evt aanpassen aan wat wenselijk is

  // Laat motor lopen to rc2 gesloten wordt
  //while (digitalRead(rc2pin) == LOW) {
    // niks doen tot rc2 HIGH wordt, en dus niet meer LOW is
  //}

  // als rc2 gesloten wordt, stop de motor
  //motor.setSpeed(0);
}

Dit om uit te sluiten dat RC2 niet te snel de motor weer uitzet.
Merk op: we kunnen eventueel de serieel monitor gebruiken om het e.e.a. zichtbaar te maken op de PC. Maar dat kunnen we, als dat onhandig is, ook later doen.

OK, als dit werkt (start Arduino = motor UIT, zodra RC1 HIGH => motor AAN, en deze blijft lopen), dan weten we dat de code voor RC1 goed is.

 

 

Test 2 - Motor UIT met RC2

Wat zou kunnen zijn is dat de Arduino te snel RC2 leest en daardoor meteen weer uitgaat.
We zouden dit even kunnen proberen op te vangen door een vertraging in de RC2 code te zetten.
Bijvoorbeeld (ik heb de commentaar tekens voor de RC2 code weer verwijderd in dit voorbeeld):

#include "CytronMotorDriver.h"
 // Pins voor de motor: PWM = Pin 3, DIR = Pin 4
#define motorDIRpin 4
#define motorPWMpin 3

// Configure the motor driver.
CytronMD motor(PWM_DIR, motorPWMpin, motorDIRpin);

#define rc1pin 2 // gebruik pin 2 voor reedcontact 1
#define rc2pin 7 // gebruik pin 7 voor reedcontact 2

// deze functie draait 1x als de Arduino aangezet wordt
void setup() {
  pinMode(rc1pin, INPUT);
  pinMode(rc2pin, INPUT);
}
// de loop blijft herhalen tot de Arduino wordt uitgezet.
void loop() {
  if (digitalRead(rc1pin) == HIGH) {
    MotorActie();
  }

  delay(300); // kleine pauze
}

void MotorActie() {
  // de stappen die nodig zijn om de motor aan te zetten en de omwenteling af te handelen
  // dus: Motor AAN
  motor.setSpeed(255); // 100% snelheid - evt aanpassen aan wat wenselijk is
delay(2000); // tijdelijke pauze om RC1/RC2 conflict te voorkomen
// Laat motor lopen to rc2 gesloten wordt while (digitalRead(rc2pin) == LOW) { // niks doen tot rc2 HIGH wordt, en dus niet meer LOW is } // als rc2 gesloten wordt, stop de motor //motor.setSpeed(0); }

Ik heb als delay waarde 2 seconden gekozen, ik weet niet of dat een geschikte waarde is, maar het zal wel lukken voor onze test.

Als de tweede test ook correct gaat, dan weten we in ieder geval dat de stappen werken en dat RC2 te snel gelezen werd. 

 

Als alternatief voor de RC2 stop kunnen we overwegen de omgekeerde optie te gebruiken. Daarmee bedoel ik: motor laten lopen zolang RC2 niet HIGH is.
Geen idee of dat uit gaat maken - ik vermoed van niet, maar de moeite om even te testen.

void MotorActie() {
  // de stappen die nodig zijn om de motor aan te zetten en de omwenteling af te handelen
  // dus: Motor AAN
  motor.setSpeed(255); // 100% snelheid - evt aanpassen aan wat wenselijk is
delay(2000); // tijdelijke pauze om RC1/RC2 conflict te voorkomen
// Laat motor lopen to rc2 gesloten wordt while (digitalRead(rc2pin) != HIGH) { // niks doen tot rc2 zolang rc2 niet HIGH is } // als rc2 gesloten wordt, stop de motor //motor.setSpeed(0); }

 

Ik vermoed echter dat de vertraging in Test 2 al de oplossing biedt. 


   
BeantwoordenCiteren
(@anne-jan)
Eminent Member
Deelgenomen: 5 jaar geleden
Berichten: 37
Topic starter  

Bedankt Hans,

Ik ga morgen alle opties even testen en laat het dan weten. Ik denk dat optie 2 heel goed de oplossing zou kunnen zijn, we gaan het zien.


   
BeantwoordenCiteren
(@anne-jan)
Eminent Member
Deelgenomen: 5 jaar geleden
Berichten: 37
Topic starter  

Test 1 - motor AAN met RC1,

Werkt niet, nadat ik de sketch upload gaat de motor continu draaien en reageerde op geen enkel rc meer.

Test 2 - Motor UIT met RC2,

geeft het zelfde resultaat, nadat ik de sketch upload gaat de motor continu draaien en reageerde ook nu op geen enkel rc meer.

Dus in de eerste sketch die hieronder staat, werkt rc1 naar behoren en doet rc2 niet wat hij moet doen. Namelijk de motor stoppen als hij gesloten wordt en de motor weer laten lopen als rc1 open is geweest en weer gesloten wordt, terwijl rc2 nog steeds gesloten is.

#include "CytronMotorDriver.h"
// Pins voor de motor: PWM = Pin 3, DIR = Pin 4
#define motorDIRpin 4
#define motorPWMpin 3

// Configure the motor driver.
CytronMD motor(PWM_DIR, motorPWMpin, motorDIRpin);

#define rc1pin 2 // gebruik pin 2 voor reedcontact 1
#define rc2pin 7 // gebruik pin 7 voor reedcontact 2

void setup() {
pinMode(rc1pin, INPUT);
pinMode(rc2pin, INPUT);
}
// de loop blijft herhalen tot de Arduino wordt uitgezet.
void loop() {
if(digitalRead(rc1pin)==HIGH) {
MotorActie();
}

delay(300); // kleine pauze
}

void MotorActie() {
// de stappen die nodig zijn om de motor aan te zetten en de omwenteling af te handelen
// dus: Motor AAN
motor.setSpeed(255); // 100% snelheid - evt aanpassen aan wat wenselijk is

// Laat motor lopen to rc2 gesloten wordt
while (digitalRead(rc2pin)==LOW) {
// niks doen tot rc2 HIGH wordt, en dus niet meer LOW is
}

// als rc2 gesloten wordt, stop de motor
motor.setSpeed(0);
}

DIT RODE GEDEELTE WERKT NOG NIET ZO HET ZOU MOETEN??

deze video is met de sketch, Test 2 - Motor UIT met RC2

Even weer een video van de situatie, anders weet ik ook niet meer welk resultaat bij welke welke sketch hoort.

 


   
BeantwoordenCiteren
 Hans
(@hans)
Famed Member Admin
Deelgenomen: 12 jaar geleden
Berichten: 2865
 

Ik denk dat we gewoon even vanaf nul moeten beginnen, stap voor stap opbouwen, want er gebeuren hier dingen die ik niet zou verwachten.
Zo moeilijk kan het gewoon niet zijn.

Laten we daarom eerst Test 1 werkende krijgen.

Ik begrijp van jouw dat deze dus niet werkt.

Ik heb de code wat ingekort in de hoop dat we eventuele secundaire issue kunnen vermijden.
Ik heb de pauze op 100 ms gezet.
Gaat de motor nu lopen als je RC1 sluit?

#include "CytronMotorDriver.h"
#define motorDIRpin 4
#define motorPWMpin 3

CytronMD motor(PWM_DIR, motorPWMpin, motorDIRpin);

#define rc1pin 2 // gebruik pin 2 voor reedcontact 1
#define rc2pin 7 // gebruik pin 7 voor reedcontact 2

// deze functie draait 1x als de Arduino aangezet wordt
void setup() {
  pinMode(rc1pin, INPUT);
  pinMode(rc2pin, INPUT);
}
// de loop blijft herhalen tot de Arduino wordt uitgezet. void loop() { if (digitalRead(rc1pin) == HIGH) { MotorActie(); } delay(100); // kleine pauze } void MotorActie() { motor.setSpeed(255); // 100% snelheid - evt aanpassen aan wat wenselijk is }

 

Ik zie vaak ook dat men de pin waarde uit leest naar een variabele.
Ik heb daar nooit behoefte aan gehad, maar wie weet. De code wordt dan:

#include "CytronMotorDriver.h"
#define motorDIRpin 4
#define motorPWMpin 3

CytronMD motor(PWM_DIR, motorPWMpin, motorDIRpin);

#define rc1pin 2 // gebruik pin 2 voor reedcontact 1
#define rc2pin 7 // gebruik pin 7 voor reedcontact 2

int knopWaarde = 0;
// deze functie draait 1x als de Arduino aangezet wordt void setup() { pinMode(rc1pin, INPUT); pinMode(rc2pin, INPUT); }
// de loop blijft herhalen tot de Arduino wordt uitgezet. void loop() {
knopWaarde = digitalRead(rc1pin); if (knopWaarde == HIGH) { MotorActie(); } delay(100); // kleine pauze } void MotorActie() { motor.setSpeed(255); // 100% snelheid - evt aanpassen aan wat wenselijk is }

 

Laten we dit eerst aan de gang krijgen 😊 

Mocht dit nog niet werken dan gaan we do motor ook uit het verhaal verwijderen en kijken hoe we een reedcontact aan het werk krijgen.


   
BeantwoordenCiteren
(@anne-jan)
Eminent Member
Deelgenomen: 5 jaar geleden
Berichten: 37
Topic starter  

Nee werkt beide niet Hans. de motor blijft continu lopen bij deze sketches.


   
BeantwoordenCiteren
(@anne-jan)
Eminent Member
Deelgenomen: 5 jaar geleden
Berichten: 37
Topic starter  

Bij deze sketch werkt rc1 wel.

dit is de eerste sketch die je gestuurd had.

#include "CytronMotorDriver.h"
// Pins voor de motor: PWM = Pin 3, DIR = Pin 4
#define motorDIRpin 4
#define motorPWMpin 3

// Configure the motor driver.
CytronMD motor(PWM_DIR, motorPWMpin, motorDIRpin);

#define rc1pin 2 // gebruik pin 2 voor reedcontact 1
#define rc2pin 7 // gebruik pin 7 voor reedcontact 2

// deze functie draait 1x als de Arduino aangezet wordt
// Dit doet hij dus niet!

void setup() {
// nog doen we nog niks
}

// de loop blijft herhalen tot de Arduino wordt uitgezet.
void loop() {
if (digitalRead(rc1pin) == HIGH) {
MotorActie();
}
delay(100); // kleine pauze
}

void MotorActie() {
// de stappen die nodig zijn om de motor aan te zetten
// en de omwenteling af te handelen
// dus: Motor AAN
motor.setSpeed(255); // 50% snelheid - evt aanpassen aan wat wenselijk is

// Laat motor lopen to rc2 gesloten wordt Dit doet hij dus ook niet?
while (digitalRead(rc2pin) == LOW) {
// niks doen tot rc2 HIGH wordt, en dus niet meer LOW is
}

// als rc2 gesloten wordt, stop de motor Dit zou hij dus inderdaad moeten?
motor.setSpeed(0);
}

 

Ik denk dat we dus op de sketch door moeten borduren.

Het enige wat er nu nog moet gebeuren, dat we rc2 werkend krijgen.


   
BeantwoordenCiteren
(@anne-jan)
Eminent Member
Deelgenomen: 5 jaar geleden
Berichten: 37
Topic starter  

Dan hebben we het over deze situatie video.

Mits rc2 maar open is, werkt rc1 zo hij moet werken.

 


   
BeantwoordenCiteren
 Hans
(@hans)
Famed Member Admin
Deelgenomen: 12 jaar geleden
Berichten: 2865
 
Posted by: @anne-jan

Nee werkt beide niet Hans. de motor blijft continu lopen bij deze sketches.

Als dat het geval is dan is er fundamenteel iets fout. Kun je RC1 tijdelijk door een schakelaar vervangen?

Deze code moet eerst werken - dus eerst RC2 even zo veel mogelijk weg laten en loskoppelen, dus de schakeling zo simpel mogelijk houden.
Vervolgens RC1 door een schakelaar vervangen (of twee draadjes en even kort contact maken).

De beginstand even vergeten, en RC2 en alle extra bedrading weg laten.

Overigens zie ik een ledje in de reedcontacten ...?

#include "CytronMotorDriver.h"
#define motorDIRpin 4
#define motorPWMpin 3

CytronMD motor(PWM_DIR, motorPWMpin, motorDIRpin);

#define rc1pin 2 // gebruik pin 2 voor reedcontact 1
#define rc2pin 7 // gebruik pin 7 voor reedcontact 2

// deze functie draait 1x als de Arduino aangezet wordt
void setup() {
  pinMode(rc1pin, INPUT);
  pinMode(rc2pin, INPUT);
}
// de loop blijft herhalen tot de Arduino wordt uitgezet. void loop() { if (digitalRead(rc1pin) == HIGH) { MotorActie(); } delay(100); // kleine pauze } void MotorActie() { motor.setSpeed(255); // 100% snelheid - evt aanpassen aan wat wenselijk is }

Overigens als dit NOG niet de motor laat lopen, dan is er echt iets niet OK en zullen we nog een stap terug gaan door b.v. de motor weg te laten een eerst een LEDje proberen i.p.v de motor.


   
BeantwoordenCiteren
(@anne-jan)
Eminent Member
Deelgenomen: 5 jaar geleden
Berichten: 37
Topic starter  

Ik heb nu rc1 en rc2 verwijderd.

En nu gaat de motor spontaan lopen, zonder enkele schakeling, dit lijkt mij niet te kloppen toch? Als ik de GND of de PWM loskoppel van de Arduino dan stopt de motor.

Als ik de DIR loskoppel blijft hij gewoon doorlopen.

Dus het enige wat er nu is aangesloten, is de MD13S aan de Arduino.

PWM aan pin 3 van de Arduino

GND  aan pin GND van de Arduino

DIR aan pin 4 van de Arduino

Nog maar even geen schakelaar geprobeerd.

Dit moet eerst opgelost toch?


   
BeantwoordenCiteren
(@anne-jan)
Eminent Member
Deelgenomen: 5 jaar geleden
Berichten: 37
Topic starter  

 

Dit is het schema van de rc1 en rc2.

De LED geeft aan of de rc open of gesloten is. In gesloten toestand brande LED.

Dit bericht is gewijzigd 5 jaar geleden door ajrumph

   
BeantwoordenCiteren
 Hans
(@hans)
Famed Member Admin
Deelgenomen: 12 jaar geleden
Berichten: 2865
 
Posted by: @anne-jan

Ik heb nu rc1 en rc2 verwijderd.

En nu gaat de motor spontaan lopen, zonder enkele schakeling, dit lijkt mij niet te kloppen toch?

Voor zover ik begrijp (nogmaals: ik heb de benodigde componenten niet in huis):

Als er PWM signaal is, dan loopt de motor (tempo afhankelijk van de PWM frequentie). Als de motor meteen begint te draaien dan moeten we misschien dit in void setup doen om de motor stil te zetten bij het starten:

void setup {
  motor.setSpeed(0); // Stop
}

Beetje vreemd dat de motor meteen begint te lopen, niet iets wat ik zou verwachten?
Overigens het PWM signaal is (denk ik) tussen GND en PWM, dus als je een van de 2 loskoppelt dan stopt de motor inderdaad.

Ik heb nog even gezocht naar de MD13S documentatie (dit was het model wat jij gebruikte he?).
Daar zie ik dat dus inderdaad WPM HIGH moet zijn om de motor te laten draaien. de DIR pin bepaald dan in welke richting (LOW versus HIGH).

 

Wat de reedcontacten betreft: Uit het schema lijkt het alsof er al een debounce ingebakken zit. De + gaat aan de Arduino +5V, en de min aan de PIN denk ik.
Beetje lastig als je niks hebt liggen om te testen 😊 

Daarom ook: een gewone schakelaar gebruiken om te testen zodat we de motor aanzetten als eerste aan de gang krijgen.
Het idee dus: de Arduino start (motor UIT), druk op de schakelaar die RC1 vervangt => motor gaat AAN en die blijft aan omdat we geen code hebben om het weer stil te zetten.

Ik ga dan uit van een maak drukschakelaar (dus contact als de schakelaar is ingedrukt, en contact breken bij het loslaten van de schakelaar) - of twee draadjes die even kort tegen elkaar gehouden worden.

#include "CytronMotorDriver.h"
#define motorDIRpin 4
#define motorPWMpin 3

CytronMD motor(PWM_DIR, motorPWMpin, motorDIRpin);

#define rc1pin 2 // pin 2 aan schakelaar, de2 pin van schakelaar aan +5V Arduino

// deze functie draait 1x als de Arduino aangezet wordt
void setup() {
motor.setSpeed(0); // Stop pinMode(rc1pin, INPUT); }
// de loop blijft herhalen tot de Arduino wordt uitgezet. void loop() { if (digitalRead(rc1pin) == HIGH) { MotorActie(); } delay(100); // kleine pauze } void MotorActie() { motor.setSpeed(255); // 100% snelheid - evt aanpassen aan wat wenselijk is }

   
BeantwoordenCiteren
(@anne-jan)
Eminent Member
Deelgenomen: 5 jaar geleden
Berichten: 37
Topic starter  

Oké Hans, Test uitgevoerd, motor doet niets.

Ook voor alle zekerheid de 2 draadjes van de schakelaar kort met elkaar verbonden, maar de motor loopt niet.


   
BeantwoordenCiteren
Pagina 2 / 5
Deel: