Arduino: besturen van loodsdeuren met behulp van Arduino

Gestart door philippe_007, 01 juli 2015, 23:41:49 PM

philippe_007

Een collega modelbouwer vroeg mij enkele weken geleden om de deuren van zijn loods automatisch te laten sluiten en openen.
Een ideaal projectje om met een Arduino te besturen.

voor dit project heb ik gebruik gemaakt van een Arduino Pro Mini, functioneel niet veel verschil met een Arduino Uno buiten de prijs, grote en aantal IO poorten.
Voor dit project zijn er slecht 4 poorten (1 input, 3 output) nodig.

Het openen/sluiten van de deuren gebeurd met een simpele druk op een drukknop.

De opbouw van het printje is voor verbetering vatbaar, bij het volgend project zal ik zelf printjes maken ipv gebruik te maken van een testprint en de nodige draden te solderen  :-[ .

Eerst de opstelling gemaakt met behulp van een Arduino uno en testbord



eens deze versie op punt was alles overgebouwd naar een mini board



hier een filmpje, beeld is niet 100% ok,

https://youtu.be/4-UwpSoBVUs



philippe_007

#1
Voor deze die interesse hebben in de code (vrij te gebruiken, te verbeteren of weet ik veel wat mee te doen).
Indien er verbeteringen zijn, wat zeker mogelijk zal zijn, dan hoor ik het graag....

#include <Servo.h>

# auteur Philippe May
# 30/06/2015

Servo servoDeur1;                     // pin 6
int   servoDeur1StartPos = 43;         // 43 startpositie servo rechter deur (dicht)
int   servoDeur1EindPos = 145;        // 145 eindpositie servo rechter deur (open)
int   servoDeur1Status;               // status van de deur tijdens openen of sluiten

Servo servoDeur2;                     // pin 7
int   servoDeur2StartPos = 150;       // 150 startpositie servo linker deur (dicht)
int   servoDeur2EindPos = 47;         // 47 eindpositie servo linker deur (open) 
int   servoDeur2Status;               // status van de deur tijdens openen of sluiten

int   servoAttachDetach = 1;          // 1 = Detach - 0 = Attach

int   tijdOpenDicht = 10000;          // Tijd om de deuren te openen of te sluiten
int   tijdPerStap;                    // hulpvariable om tijd te bepalen
int   tijdPositie = 0;                // teller om de tijd te bepalen

int   drukknop = 2;                   // pin 2 voor drukknop
int   statusDrukknop = 0;             // status drukknop - 0 niet ingedrukt - 1 ingedrukt

int   openDicht;                      // 0 = open - 1 = dicht

int   led = 3;                        // Controle Led

int   eersteLoop = 0;

void setup() {
  Serial.begin(115200);     
 
  Serial.println("Start void setup");
 
  servoDeur1Status = servoDeur1EindPos;
  servoDeur2Status = servoDeur2EindPos;
 
 
  servoDeur2.attach(7);

  Serial.println("Servo 2 op:");
  Serial.println(servoDeur2Status);
  servoDeur2.write(servoDeur2Status);
  delay(1000);
  servoDeur2.detach();
 
  servoDeur1.attach(6);
  Serial.println("Servo 1 op:");
  Serial.println(servoDeur1Status);
  servoDeur1.write(servoDeur1Status);
  delay(1000);
  servoDeur1.detach();
 
  pinMode(drukknop, INPUT);   
  openDicht = 1;
 
  pinMode(led, OUTPUT);
  digitalWrite(led, LOW);               // Led uit
 
  tijdPerStap = round(tijdOpenDicht / ((servoDeur1EindPos - servoDeur1StartPos) + (servoDeur2StartPos - servoDeur2EindPos)));
  Serial.println(tijdPerStap);
  Serial.println("einde void setup");
}

void sluitDeuren(){ 
  if (servoAttachDetach == 1) {
    Serial.println("Start void sluitDeuren");
    servoDeur1.attach(6);
    servoDeur2.attach(7);
    servoAttachDetach = 0;
  }
  digitalWrite(led, HIGH);
  if (servoDeur2Status > servoDeur2EindPos) {
    servoDeur2Status = servoDeur2Status - 1;
    servoDeur2.write(servoDeur2Status);
  }
  else {
    if (servoDeur1Status < servoDeur1EindPos) {
      servoDeur1Status = servoDeur1Status + 1;
     servoDeur1.write(servoDeur1Status);
    }
  }
  if ((servoDeur1Status == servoDeur1EindPos) and (servoDeur2Status == servoDeur2EindPos)) {
    openDicht = 1;
    statusDrukknop = 0;
    digitalWrite(led, LOW);
    servoDeur1.detach();
    servoDeur2.detach();
    servoAttachDetach = 1;
    Serial.println("Servo 2 op:");
    Serial.println(servoDeur2Status);
    Serial.println("Servo 1 op:");
    Serial.println(servoDeur1Status);
    Serial.println("Einde void sluitDeuren");
  }
}

void openDeuren(){
  if (servoAttachDetach == 1) {
    Serial.println("Start void openDeuren");
    servoDeur1.attach(6);
    servoDeur2.attach(7);
    servoAttachDetach = 0;
    digitalWrite(led, HIGH);
  }
  if (servoDeur1Status > servoDeur1StartPos) {
     servoDeur1Status = servoDeur1Status - 1;
    servoDeur1.write(servoDeur1Status);
  }
  else {
    if (servoDeur2Status < servoDeur2StartPos) {
      servoDeur2Status = servoDeur2Status + 1;
      servoDeur2.write(servoDeur2Status);
    }
  }
  if ((servoDeur1Status == servoDeur1StartPos) and (servoDeur2Status == servoDeur2StartPos)) { 
    openDicht = 0;
    statusDrukknop = 0;
    digitalWrite(led, LOW);
    servoDeur1.detach();
    servoDeur2.detach();
    servoAttachDetach = 1;
    Serial.println("Servo 2 op:");
    Serial.println(servoDeur2Status);
    Serial.println("Servo 1 op:");
    Serial.println(servoDeur1Status);
    Serial.println("Einde void openDeuren");
  }
}

void loop(){
  if (statusDrukknop == 0 and digitalRead(drukknop) == HIGH) {
     statusDrukknop = 1;
     tijdPositie = 0;
  }
 
  if ((openDicht == 1) and (statusDrukknop == 1) and (tijdPositie == 0)) {
    openDeuren();
  }
  if ((openDicht == 0) and (statusDrukknop == 1) and (tijdPositie == 0)) {
    sluitDeuren();
  }
  tijdPositie = tijdPositie + 1;
  if (tijdPositie > tijdPerStap) {
    tijdPositie = 0;
  }
  delay(1);
}




bekie

#2
Bedankt om dit te delen.
 

minitreintje

Tof projectje!
Met de DCC library kun je nog DCC ondersteuning leveren :)



groeten,
Dylan
Märklin C-rail modulebaan met Arduino

loebaske

Knap werk, ga me toch eens moeten verdiepen in die Arduino...

dani

leuk projectje, inderdaad.  Ik had het nog niet gezien, maar nu wel :-)

Ik heb wel de indruk dat je programma code een pak simpeler zou kunnen, maar misschien heb je het met een bepaalde reden zo gedaan ? voor latere uitbreiding ?    Ook vraag ik me af waarom je telkens een attach() en detach() doet bij elke beweging ?  Had je jitter bij je servo's of wil je gewoon besparen op energie door ze stroomloos te zetten ?   Je zou de deuren ook tegelijk kunnen bedienen door te gaan "interlacen" op de servo's...  zijnde :  elk om beurt een stapje zetten en dat snel achter elkaar
De kruik is te water gegaan...
De kruik is niet meer.

dani

en nog een kleine opmerking ivm de gebruikte chip :   je had eventueel een ATTiny85 kunnen inzetten, die heeft 8 pins waarvan  6 I/O's.
Alleen vraag ik me af of hij met de  <servo.h> overweg kan.  Ik geloof dat je dan bij deze generatie de  <softservo.h>  zou moeten inzetten, wat ik toch eens ga testen !    Dan heb je helemaal niks anders meer nodig dan  de 8 pins chip.
De kruik is te water gegaan...
De kruik is niet meer.

philippe_007

Dani,

de attach(), detach() heb ik inderdaad oorspronkelijk gebruikt om de jitter  bij het opstarten te verhinderen, maar dat werkt niet... Ondertussen voor de jitter (dat eigenlijk een inistialisatie is bij opstarten) te verhinderen gebruik ik relais met vertraging, zo krijgen de servo's pas na enkele seconden dat de arduino is opgestart stroom.
De attach/Detach gebruik ik ook in de code omdat goedkope servo's wel eens durven te zomen, als de stroom wordt afgesloten, dan heb je daar geen last van.

De code kan inderdaad veel simpelder geschreven worden als je de µprocessor gewoon laat werken en niet vrijgeeft voor andere commando's. Met de huidige prijs van een arduino uno of een ander model is dit niet echt een probleem. Maar als je nog een noodknop of andere toeters of bellen wilt gebruiken op de zelfde arduino dan zit je vast tot uw procedure gedaan heeft.
Ik ben dan ook een grote voorstander om steeds de code zo te schrijven dat de µproc niet blijft hangen.

Met de deuren kan je inderdaad zoveel spelen als je wilt, 2 deuren samen laten open, deur na deur, eventeel wat laten schommelen op het einde... Er zijn tal van variaties mogelijk. Het is tenslotte enkel maar wat programeerwerk.

ivm de andere chips heb ik geen idee, ik ken nl niets van electronica. Met een arduino kan ik overweg en deze gebruik ik dan ook in mijn toepassingen, maar er zullen zeker (goedkopere) alternatieven zijn. Alhoewel een arduino pro mini wat voor dit project bruikbaar is kost slecht 1€50.   




dani

inderdaad de pro mini is een absolute topper kwa prijs/inhoud !  Je kan er zelf geen kristal en 328 conrtoller chip voor kopen.

En ik begrijp dat je je processor/controller chip wil vrij houden voor andere zaken, maar daarvoor kan je ook interrupts gebruiken, hoewel je heel beperkt bent in aantal interrupts dat je beschikbaar hebt.  Dus ik snap je wel.  Daarom dat ik ook niet zomaar zei "het kan simpeler", omdat ik al wel vermoedde dat er meer achter zat.   
De kruik is te water gegaan...
De kruik is niet meer.

Ajean

@ philippe_007,

Welke relais met vertraging gebruikt U?

Gr.

Ajean

raf

filmpke van mijn loods

https://youtu.be/RJRHUatqqqI

morgen een beter en meteen van op de baan
de las led is nog en rode omdat ik geen blauwe meer had liggen

gr raf
If I make mistakes in "spelling"
Remember it's the pen, that's bad
Don't lay the blame on me.

Gerolf

Ik werd een beetje zeeziek bij het kijken ... statiefje ?  ;)
Het bewegen van de loodsdeuren ging wel mooi en zonder schokken  8)
Groeten uit "Marche-en-Bières"   ** Modelspoor is plezant **   TPIII-H0-DC-Zelfbouw

raf

@ gerolf haha dat komt door mijn zomer hobby he man LOL ;D

na de programmacode te hebben bekeken vroeg ik me al af waarom elke deur apart open/dicht ging

je doet dus de twee niet tegelijk laten op/aftellen
wat bij mij wel gebeurt want ik kan zelfs al de deuren tegelijk laten open en dicht gaan
zie je straks op het filmpje
+ ik kan de verlichting nog schakelen en het las licht
nu schakelt de binnen verlichting maar dat moeten dus de buiten lichten worden alsook die op het terrein zelf wat er aan verlichting komt te staan
ik zou er nu eventueel nog een rook generator mee aan kunnen hangen met een 5 de knop er bij zodat ook nog een schoorsteen en dergelijke begint te roken
ik heb nog 4 pootjes over om hier van alles mee te doen
het las licht vraagt tijdens het openen en sluiten te veel reken kracht en word dus tijdelijk uitgeschakeld

gr raf
If I make mistakes in "spelling"
Remember it's the pen, that's bad
Don't lay the blame on me.

philippe_007

Hey Raf,
tof dat je aan de hand van mijn voorbeeld een eigen versie hebt gemaakt.
opletten met de rookgenerators, best een relais tussen plaatsen zodat je de poorten op de Arduino niet opblaast.