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.



slagboom
 
Deel:
Meldingen
Alles wissen

[Opgelost] slagboom

4 Berichten
2 Gebruikers
0 Reactions
2,948 Bekeken
(@arendt)
New Member
Deelgenomen: 9 jaar geleden
Berichten: 2
Topic starter  

Even voorstellen: Ik ben Arent, een prutsende beginner op het Arduino-pad. 

Voor het museum waar ik werk (vrijwilliger) moet een slagboom(voor een tentoonstelling, niet voor de parkeerplaats) komen die op een pir-melder reageert.
Hiervoor heb ik het volgende geschreven: 

int ledPin1 = 13;   //in1 en in2 of 4 channel relay sets polarity - +
int ledPin2 = 12;   //in3 en in4 of 4 channel relay change polarit + -
int inputPin = 2;   // PIR input
int val = 0;

void setup()  {
  pinMode(ledPin1, OUTPUT);  //in1 en in2 open gate
  pinMode(ledPin2, OUTPUT);  //in3 en in4 close gate
 
  pinMode(inputPin, INPUT);  
}

void loop() {
val = digitalRead(inputPin);
if (val == HIGH) {
  digitalWrite(ledPin1, LOW);
  delay(3000);         //motor opens gate
  digitalWrite(ledPin1, HIGH);
  delay(6000);              //motor has no voltage, gate keeps open
  digitalWrite(ledPin2, LOW);
  delay(3000);      //motor closes gate
  digitalWrite(ledPin2, HIGH);
} 

else  {
  digitalWrite(ledPin1, HIGH);
  digitalWrite(ledPin2, HIGH);
 
}} 
Dit werkt perfect: de motor draait enige tijd linksom; slagboom omhoog, enige tijd stroomloos; slagboom blijft omhoog. Daarna schakelen 2 andere relais in die de polariteit omdraaien en de boom gaat weer naar beneden omdat de motor nu rechtsom draait. 
Mooier zou zijn dan wanneer de slagboom naar beneden gaat en de pir-wordt geactiveerd, de boom weer naar boven gaat/danwel in de open positie blijft staan, zodat de volgende persoon/personen niet tegen een gesloten boom aankijken en moeten wachten tot ie weer beneden is voordat ie weer omhoog gaat.
Alvast dank voor uw opmerkingen en een fijne Pasen.

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

Hoi Arendt!

Ik zie dat posten in het forum gelukt is .

Voor wat betreft jouw project: Wat voor motor gebruik je?
Stappenmotor of servo had misschien een eenvoudigere oplossing geweest - dan zou je namelijk de relays achterwege kunnen laten.
Maar .. ik heb zelf maar bar weinig met motors gedaan ... dus als het zo werkt - prima! 

Ik zie dat je de motor 3 seconden aanzet om omhoog te gaan, 6 seconden wachten en dan weer 3 seconden de motor aan.
Het probleem zit 'm dus in de delays die je gebruikt.

Eigenlijk zou je de tijd library moeten gebruiken en een status moeten zetten voor de slagboom (openen, open, sluiten, gesloten). De time library kun je vanuit de Arduino IDE installeren. Sketch -> Include Library -> Manage Libraries -> scroll naar "Time, by Michael Margolis" en click op "Install".

Ik kan de code hier niet testen (m'n kleine neefje is er met de Arduino vandoor), maar zoiets als:

#include <Time.h>
#define gesloten 0
#define openen 1
#define geopend 2
#define sluiten 3
int SlagboomStatus = 0; // begin gesloten
time_t StatusStart = 0; // gebruiken we om te timen
int ledPin1 = 13; //in1 en in2 of 4 channel relay sets polarity - +
int ledPin2 = 12; //in3 en in4 of 4 channel relay change polarit + -
int inputPin = 2; // PIR input
int val = 0;
void setup() {
  pinMode(ledPin1, OUTPUT); //in1 en in2 open gate
  pinMode(ledPin2, OUTPUT); //in3 en in4 close gate
  pinMode(inputPin, INPUT);  
}
void loop() {
  val = digitalRead(inputPin);
  if(val==HIGH) { // Iemand staat voor de PIR, slagboom moet dus open
    SlagboomStatus = openen;
    StatusStart = now();
    digitalWrite(ledPin1, LOW);
  } else if ((SlagboomStatus!=openen)&&(SlagboomStatus!=sluiten)) {
    digitalWrite(ledPin1, HIGH); // motors uit als we met iets bezig zijn
    digitalWrite(ledPin2, HIGH);
  }
  
  // Lopende processen aflopen 
  if(SlagboomStatus==openen) { // -> slagboom is bezig met openen
    if(now()-StatusStart>=3000) { // Stop motor na 3 seconden
      digitalWrite(ledPin1, HIGH); 
      SlagboomStatus = geopend;
      StatusStart = now();
    }
  } 
  else if(SlagboomStatus==geopend) { // -> slagboom is open
    if(now()-StatusStart>=6000) { // Laat de slagboom tot 6 sec openstaan
      digitalWrite(ledPin2, LOW); // en na 6 seconden weer sluiten
      SlagboomStatus = sluiten;
      StatusStart = now();
    }
  }
  else if(SlagboomStatus==sluiten) { // -> slagboom is aan het sluiten
    if(now()-StatusStart>=3000) { // Laat de motor tot 3 seconden lopen
      digitalWrite(ledPin2, HIGH); 
      SlagboomStatus = gesloten;
      StatusStart = now();
    }
  }

Dus we blijven de loop() herhalen terwijl de slagboom omhoog of omlaag gaat, zodat we kunnen opvangen dat er weer iemand voor de slagboom staat.

Kan zijn dat je de code een beetje moet tweaken ... 


   
BeantwoordenCiteren
(@arendt)
New Member
Deelgenomen: 9 jaar geleden
Berichten: 2
Topic starter  

Dag Hans.

Dank voor je snelle reactie. Ik weet niet wat tweaken is 

Ik verwijs naar de bijlage

Over de constructie en motor: De slagboom is een holle PVC buis van 75mm. en heeft een scharnierpunt. In het gedeelte dat naar beneden gaat als de slagboom omhoog gaat, zit een motortje van een accuschroefmachine 12V 4A, en dat heeft de constructie nodig!. Dit motortje laat een spindel (draadstang M10) draaien. De spindel duwt/trekt een gewicht als de spindel draait. Hierdoor verplaatst het zwaartepunt zich in de buis en gaat de slagboom open dan wel dicht.

 Mijn bedoeling is, dat zodra de PIR geactiveerd wordt ledpin2 weer HIGH wordt (de motor wordt spanningsloos) en heel even later (om kortsluiting op het relaisbordje, vanwege het ompolen te voorkomen) ledpin1 weer LOW wordt (de slagboom gaat weer omhoog).  Zoals het er nu uitziet kom je dan in de knoop met de draaitijd van de motor (hoe lang was de motor al bezig om de boom te laten zakken..) maar dat kan ik wel ondervangen door de boom van tiltschakelaars te voorzien die de stroom naar de relaisspoelen (via het jumpertje) onderbreekt. Zo draait de Arduino altijd hetzelfde riedeltje af zonder dat het invloed heeft op het slagboom-mechaniek (=wringen omdat de boom al maximaal hoog staat en de Arduino wil, bijvoorbeeld, nog een seconde doordraaien).

Het vet en cursief gedrukte wil ik ergens in mijn sketch inbouwen. 

Ik hoop van harte dat mijn verhaal duidelijk is

Als je reageert, alvast mijn dank!


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

Tweaken = Prullen/Prusten/Rommelen ....

Je zou ook kunnen kijken hoe lang de actie al loopt en daar iets mee doen in de code, immers "now()-StatusStart" geeft de gelopen tijd.
Dus als de motor de boom omlaag aan het doen is en dit al 2 seconden doet, dan kun je dus stellen dat het weer omhoog brengen van de slagboom ook maar 2 seconden hoeft te duren. Een micro-switch kan idd de motor uitzetten als het schuifgewicht (aan beide kanten) een bepaalde positie heeft bereikt! Dat is natuurlijk ook een mooie oplossing (die ik in m'n oude 3D printer ook gebruikt zag).

Overigens zie ik wel een blunder in m'n code  ... ik gebruik milliseconden terwijl, als ik me niet vergis, de tijd functie met hele seconden telt - maar dat kan ik mis hebben. Heb hier zelf even geen Arduino liggen en al zeker geen slag boom .

Ik vindt het mechanische deel wel leuk opgelost - mooi gedaan! Daar had ik zelf niet eens aan gedacht!

Misschien kun je het even HIGH houden nabootsen met een condensator? Hangt natuurlijk wel af van hoe lang je dat HIGH wil houden natuurlijk.
Hier had een stappen-motor misschien handiger geweest: je moet immers stappen tellen en de benodigde pulsen geven om naar rechts of naar links te gaan. Door het tellen weet je al waar je bent. Maar eerlijk gezegd heb ik maar heel weinig stappen-motor ervaring.


   
BeantwoordenCiteren
Deel: