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
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);
}
Bedankt om dit te delen.
Tof projectje!
Met de DCC library (http://mrrwa.org/) kun je nog DCC ondersteuning leveren :)
groeten,
Dylan
Knap werk, ga me toch eens moeten verdiepen in die Arduino...
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
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.
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.
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.
@ philippe_007,
Welke relais met vertraging gebruikt U?
Gr.
Ajean
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
Ik werd een beetje zeeziek bij het kijken ... statiefje ? ;)
Het bewegen van de loodsdeuren ging wel mooi en zonder schokken 8)
@ 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
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.
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
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
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.
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
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..
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
ziet er inderdaad interessant uit, thx voor de info