Modelspoormagazine forum

Modelspoor, praktijk => Modelspoor-elektronica met microcontrollers => Topic gestart door: philippe_007 op 01 juli 2015, 23:41:49 PM

Titel: Arduino: besturen van loodsdeuren met behulp van Arduino
Bericht door: philippe_007 op 01 juli 2015, 23:41:49 PM
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

(http://i61.tinypic.com/301oo6p.jpg)

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

(http://i59.tinypic.com/1zxlaqe.jpg)

hier een filmpje, beeld is niet 100% ok,

https://youtu.be/4-UwpSoBVUs


Titel: Re: Arduino: besturen van loodsdeuren met behulp van Arduino
Bericht door: philippe_007 op 01 juli 2015, 23:46:29 PM
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);
}



Titel: Re: Arduino: besturen van loodsdeuren met behulp van Arduino
Bericht door: bekie op 04 juli 2015, 22:49:55 PM
Bedankt om dit te delen.
Titel: Re: Arduino: besturen van loodsdeuren met behulp van Arduino
Bericht door: minitreintje op 05 juli 2015, 15:54:46 PM
Tof projectje!
Met de DCC library  (http://mrrwa.org/) kun je nog DCC ondersteuning leveren :)



groeten,
Dylan
Titel: Re: Arduino: besturen van loodsdeuren met behulp van Arduino
Bericht door: loebaske op 05 juli 2015, 16:00:12 PM
Knap werk, ga me toch eens moeten verdiepen in die Arduino...
Titel: Re: Arduino: besturen van loodsdeuren met behulp van Arduino
Bericht door: dani op 13 oktober 2015, 09:23:59 AM
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
Titel: Re: Arduino: besturen van loodsdeuren met behulp van Arduino
Bericht door: dani op 13 oktober 2015, 09:25:56 AM
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.
Titel: Re: Arduino: besturen van loodsdeuren met behulp van Arduino
Bericht door: philippe_007 op 13 oktober 2015, 09:46:28 AM
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.   



Titel: Re: Arduino: besturen van loodsdeuren met behulp van Arduino
Bericht door: dani op 13 oktober 2015, 11:44:12 AM
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.   
Titel: Re: Arduino: besturen van loodsdeuren met behulp van Arduino
Bericht door: Ajean op 01 december 2015, 16:10:46 PM
@ philippe_007,

Welke relais met vertraging gebruikt U?

Gr.

Ajean
Titel: Re: Arduino: besturen van loodsdeuren met behulp van Arduino
Bericht door: raf op 07 december 2015, 18:37:33 PM
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
Titel: Re: Arduino: besturen van loodsdeuren met behulp van Arduino
Bericht door: Gerolf op 08 december 2015, 00:42:50 AM
Ik werd een beetje zeeziek bij het kijken ... statiefje ?  ;)
Het bewegen van de loodsdeuren ging wel mooi en zonder schokken  8)
Titel: Re: Arduino: besturen van loodsdeuren met behulp van Arduino
Bericht door: raf op 08 december 2015, 05:39:58 AM
@ 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
Titel: Re: Arduino: besturen van loodsdeuren met behulp van Arduino
Bericht door: philippe_007 op 08 december 2015, 08:00:19 AM
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.

Titel: Re: Arduino: besturen van loodsdeuren met behulp van Arduino
Bericht door: philippe_007 op 08 december 2015, 08:05:10 AM
Citaat van: Ajean op 01 december 2015, 16:10:46 PM
@ philippe_007,

Welke relais met vertraging gebruikt U?

Gr.

Ajean


Deze gebruik ik:
http://www.aliexpress.com/item/5V-Delay-Relay-Module-With-LED-Indicator-0-10-seconds-Delay-Relay-Module/32456152587.html
Titel: Re: Arduino: besturen van loodsdeuren met behulp van Arduino
Bericht door: raf op 08 december 2015, 08:12:47 AM
heu eigen versie ???? echt nie
ik gebruik een microship pic en geen arduino
mijn code verschilt zo een 100% van die van u
en ik heb een centrale rookgenerator ingepland die meerdere uitgangen heeft .
hij werkt ook niet met die rook olie maar met water .
(http://g02.s.alicdn.com/kf/HTB1XyPFHpXXXXXRXXXXq6xXFXXXX/2015-ultrasonic-nebulizer-diffuser-coconut-shell-handicraft.jpg)

Device 16F628A                ;Gebruik een 16F628A type
  Config INTRC_OSC_NOCLKOUT, WDT_OFF, PWRTE_ON, LVP_OFF, MCLRE_OFF
  All_Digital TRUE
  Xtal 4
  Declare PortB_Pullups On


  Symbol knop1 = PORTB.0
  Symbol knop2 = PORTB.1
  Symbol knop3 = PORTB.2
  Symbol knop4 =PORTB.3
  Symbol motor1 =PORTA.0
  Symbol motor2 =PORTA.1
  Symbol motor3 =PORTA.7
  Symbol motor4 =PORTA.6
  Symbol led1    = PORTA.3
  Symbol led2 = PORTA.2
  Symbol lasled = PORTB.6
  Symbol buiten = PORTB.7

  Dim mini3 As Word
  Dim mini2 As Word
  Dim mini1 As Word
  Dim maxi1 As Word
  Dim maxi3 As Word
  Dim maxi2 As Word
  Dim schak1 As Word
  Dim schak2 As Word
  Dim schak3 As Word
  Dim schak4 As Word

  Dim a As Byte
  Dim b As Byte
  Dim c As Byte
  Dim d As Word
  Dim e As Word
  Dim f As Word
  Dim g As Word
  Dim pauze As Word
  Dim pauze2 As Word
  PORTA = %00000000             
  TRISA = %00000000
  PORTB = %00110000           
  TRISB = %00001111

  mini1 = 1000
  mini2 = 1300
  mini3 = 1500
  maxi1 = 2000
  maxi2 = 2300
  maxi3 = 2400
  schak1 = maxi1
  schak2 = mini1
  schak3 = mini1
  schak4 = maxi1
  pauze = 10
  pauze2 = 200
  led1 = 1
  DelayMS pauze
  led2 = 1
  DelayMS pauze
  lasled = 1
  DelayMS pauze
  buiten = 1
  DelayMS pauze
  led1 = 0
  DelayMS pauze
  led2 = 0
  DelayMS pauze
  lasled = 0
  DelayMS pauze
  buiten = 0
  DelayMS pauze

  start:
  While 1 = 1

      If knop4 = 0 And knop1 = 1 And knop2 = 1 And led1 = 0 And led2 = 0 Then GoSub ledlas
      If knop3 = 1 Then buiten = 0
      If knop3 = 0 Then buiten = 1
      If knop1 = 0  Then GoSub lichtaan1
      If knop2 = 0  Then GoSub lichtaan2
      If knop1 = 1 And schak1 = maxi3 And schak2 = mini1 Then GoSub lichtuit1
      If knop2 = 1 And schak3 = maxi2 And schak4 = mini2  Then GoSub lichtuit2
      If  knop1 = 1 And  d > 0 Then d = d - 1
      If d < 1 And knop1 = 1 Then led1 = 0
      If knop2 = 1 And e > 0 Then e = e - 1
      If e < 1  And knop2 = 1 Then led2 = 0
      If knop1 = 0  Then  schak1 = schak1 + 1
      If knop1 = 0  Then schak2 = schak2 - 1
      If knop2 = 0  Then  schak3 = schak3 + 1
      If knop2 = 0  Then schak4 = schak4 - 1
      If knop1 = 1  Then  schak1 = schak1 - 1
      If knop1 = 1  Then schak2 = schak2 + 1
      If knop2 = 1  Then  schak3 = schak3 - 1
      If knop2 = 1  Then schak4 = schak4 + 1
      If schak1 > maxi3  Then schak1 = maxi3
      If  schak1 < mini1 Then schak1 = mini1

      If schak2 > maxi3 Then schak2 = maxi3
      If  schak2 < mini1 Then schak2 = mini1

      If schak3 > maxi2  Then schak3 = maxi2   
      If  schak3 < mini2 Then schak3 = mini2   

      If schak4 > maxi3 Then schak4 = maxi3 
      If  schak4 < mini2 Then schak4 = mini2   

      Servo motor1,schak1     
      Servo motor2,schak2   
      Servo motor3,schak3   
      Servo motor4,schak4     
                                           

  Wend
  lichtaan1:

  If b = 1 Then Return
  b=1
  led1 = 1
  For g = 1 To pauze2
      DelayMS 20
  Next
  Return

  lichtaan2:
  If c = 1 Then Return
  c = 1
  led2 = 1
  For f = 1 To pauze2
      DelayMS 20
  Next
  Return

  lichtuit1:
  If b = 0 Then Return
  b = 0
  d = 2000
  Return
  lichtuit2:
  If c = 0 Then Return
  c = 0
  e = 2000
  Return
  ledlas:
  lasled   = 1
  DelayMS 5
  lasled = 0
  DelayMS 30
  lasled = 1
  DelayMS 5
  lasled  = 0
  DelayMS 150
  lasled = 1
  DelayMS 5

  lasled = 0
  DelayMS 100
  lasled   = 1
  DelayMS 5
  lasled = 0
  DelayMS 300
  lasled = 1
  DelayMS 5
  lasled  = 0
  DelayMS 150
  lasled = 1
  DelayMS 5

  lasled = 0
  DelayMS 100
  lasled = 1
  DelayMS 5
  lasled = 0
  DelayMS 30
  Return


gr raf
Titel: Re: Arduino: besturen van loodsdeuren met behulp van Arduino
Bericht door: philippe_007 op 08 december 2015, 08:23:44 AM
ah, dan had ik het niet goed verstaan, je schreef
"na de programmacode te hebben bekeken vroeg ik me al af waarom elke deur apart open/dicht ging"
ik dacht dat je mijn code bedoelde.

het gebruik van een microchip Pic is voor later (daarvoor moet ik eerst wat meer elektronica kennen),  aan uw code te zien valt het mee om deze te programmeren.
Titel: Re: Arduino: besturen van loodsdeuren met behulp van Arduino
Bericht door: raf op 08 december 2015, 09:37:49 AM
waarom dacht je dat ik proton gebruik
40 jaar geleden basic leren programmeren en daar ik meer feeling heb met proton ide basic heb ik dus de keuze gemaakt om dat programma aan te kopen .
en het lukt me aardig om wat zaken te programmeren tot nu toe
soms loop ik vast maar dat is dan meer het processor gerelateerd probleem wat processor instructies aan gaat

wat uw code betreft voor arduino daar moest ik eventjes een tijdje op onderzoek uit gaan wat het allemaal betekend en daar zag ik dus dat je de twee deuren niet tegelijk laat openen maar achter elkaar.
als ik nog wat schakelaars bij zet en de code aan pas kan ik elke deur apart laten open gaan maar is dat wel nodig
hier nu een filmpje met de loods op zijn plaats
https://youtu.be/kovsXwt3HPU
en wat loco's die nog gewoon rijden nu zonder de pwm sturing dus het hapert hier en daar een beetje want er is nu niet echt veel over deze sporen gereden
maar de loods deuren werken wel perfect en gerolf zal nu niet zeeziek meer worden  ;D
de loods daarnaast staat ook reeds klaar om te worden aangepast maar deze heeft 3 deuren dus een kleine aanpassing van de gebruikte code en dan kan die in de pic geprogrammeerd worden .

gr raf
Titel: Re: Arduino: besturen van loodsdeuren met behulp van Arduino
Bericht door: philippe_007 op 08 december 2015, 09:45:28 AM
Ziet er goed uit en zonder zeeziekte :-)

Id, hoe de deuren open gaan is een persoonlijke keuze, de 2 afzonderlijk was op vraag van een collega modelbouwer die het zou wou hebben.

Het programmeren heb ik geen problemen mee, het is meer het elektronica gedeelte en hoe een µcontroller programmeren. Maar ben op zoek om een cursus te volgen vanaf september..
Titel: Re: Arduino: besturen van loodsdeuren met behulp van Arduino
Bericht door: raf op 08 december 2015, 10:42:20 AM
http://www.picbasic.nl/frameload.htm?http://www.picbasic.nl/beginners7.htm

kan reeds een goed start zijn mijn gedacht als je in basic wil programmeren
Titel: Re: Arduino: besturen van loodsdeuren met behulp van Arduino
Bericht door: philippe_007 op 08 december 2015, 10:58:00 AM
ziet er inderdaad interessant uit, thx voor de info