Een dc motor laten stoppen doormiddel van een microswitch.

Hallo,

Ik ben een autodakraam aan het programmeren met een Texas instruments launchpad.

Het dakraam heeft 4 knoppen: "dak open" "dak dicht" "zonnenscherm open" "zonnenscherm dicht"

Nu is de bedoeling dat het dak start doormiddel van op de startknop te drukken. Dit heb ik allemaal al werkend. Het dak moet stoppen als het de eindschakelaars bereikt heeft. Hierna moet het dak ook weer dicht te maken zijn. Op een een of andere manier reageert mijn code niet op de eindschakelaars en valt hierna uit op de voeding. Ik hoop dat iemand mij kan helpen.

Hierbij mijn code

int knop1 = 11;     //Button 1 roof open.
int knop2 = 12;     //Button 2 roof close.
int knop3 = 13;     //Button 3 sunshade close.
int knop4 = 19;     //Button 4 sunshade open.

int M1L = 35;       //Motor roof open.
int M1R = 36;       //Motor roof close.
int M2L = 37;       //Motor sunshade open.
int M2R = 38;       //Motor sunshade close.

int sensor1 = 34;   //sensor, roof open. (microswitch) 
int sensor2 = 33;   //sensor, roof close. (microswitch)
int sensor3 = 32;   //Sensor, sunshade open. (microswitch)
int sensor4 = 31;   //Sensor, sunshade close. (microswitch)

int buttonStatus1 = 0;
int buttonStatus2 = 0;
int buttonStatus3 = 0;
int buttonStatus4 = 0;

void setup ()
{
pinMode (knop1, INPUT);
pinMode (knop2, INPUT);
pinMode (knop3, INPUT);
pinMode (knop4, INPUT);

pinMode (M1L, OUTPUT);
pinMode (M1R, OUTPUT);
pinMode (M2L, OUTPUT);
pinMode (M2R, OUTPUT);

pinMode (sensor1, INPUT);
pinMode (sensor2, INPUT);
pinMode (sensor3, INPUT);
pinMode (sensor4, INPUT);

digitalWrite(knop1, LOW);
digitalWrite(knop2, LOW);
digitalWrite(knop3, LOW);
digitalWrite(knop4, LOW);

digitalWrite(sensor1, LOW);
digitalWrite(sensor2, LOW);
digitalWrite(sensor3, LOW);
digitalWrite(sensor4, LOW);

Serial.begin(9600);

}

void loop()
{
buttonStatus1 = digitalRead(knop1); 
buttonStatus2 = digitalRead(knop2);
buttonStatus3 = digitalRead(knop3);
buttonStatus4 = digitalRead(knop4);

{ if (buttonStatus1 == HIGH && buttonStatus2 == LOW && buttonStatus3 == LOW && buttonStatus4 == LOW) //Dak open.
  do
  {
  digitalWrite(M1L, HIGH); 
  digitalWrite(M1R, LOW);
  }while(digitalRead (sensor2 == LOW)); 
}  
{ if (buttonStatus1 == LOW && buttonStatus2 == HIGH && buttonStatus3 == LOW && buttonStatus4 == LOW) //Dak dicht.
  do
  {
  digitalWrite(M1L, LOW); 
  digitalWrite(M1R, HIGH);
  }while(digitalRead (sensor1 == LOW));
}
{ if (buttonStatus1 == LOW && buttonStatus2 == LOW && buttonStatus3 == HIGH && buttonStatus4 == LOW) //Zonnenscherm open.
  do
  {
  digitalWrite(M2L, HIGH); 
  digitalWrite(M2R, LOW);
  }while(digitalRead (sensor4 == LOW));
}
{ if (buttonStatus1 == LOW && buttonStatus2 == LOW && buttonStatus3 == LOW && buttonStatus4 == HIGH) //Zonnenscherm dicht.
  do
  {
  digitalWrite(M2L, LOW); 
  digitalWrite(M2R, HIGH);
  }while(digitalRead (sensor3 == LOW));
}
}

Mijn circuit werkt met pull-up weerstanden en de signalen komen gewoon binnen.

alvast bedankt!

Hallo Siem,

Het feit dat je zegt dat de voeding uitvalt doet mij vermoeden dat je eindschskelaar die vaststelt of het dak open is te ver naar buiten (of binnen), het is maar hoe je het bekijkt. Ik zal het anders uitleggen, als je het dak laat opengaan dan bouwt er zich oo het einde van deze beweging een mechanische weerstand op, zeker wanneer je het dak iets te ver open llaat gaan, omdat je eindschakelaar iets te laat bediend wordt. wanneer je dan op de knoo drukt om het raam terug open te laten gaan ondervindt de motor zodanig veel mechanische weerstand dat de stroom te hoog wordt, het is ook eeen aanloopstroom, die altijd hoger is, waardoor het heel goed mogelijk is dat je veiligheid van je voeding getriggerd wordt, en alles uitvalt. het is heel eenvoudig om dit te testen. hou me even op de hoogte of dit het probleem is?

Groetjes, Mike

Ik zou zeggen, gooi er eens what serial prints in om te kijken wat er precies gebeurd.

Niet de reden waarom het niet werkt, maar waarom al die extra { and } ?

Zijn het zonnescherm en het raam op een of andere manier afhankelijk van elkaar? Kun je bv het raam niet openen als het zoonescherm dicht is? Indien dat niet het geval is zouden je condities in the ifs worden vereenvoudigd.

Hallo,

Bedankt voor de antwoorden.

Mike:
Ik kan de eindschakelaars met de hand bedienen maar dan stopt het dak ook niet…

Sterretje:
Het dak en het zonnenscherm zijn niet afhankelijk van elkaar. En zonder al die ands werken de startknoppen van het dak op een een of andere manier niet.

Sorry, dat had 'en' moeten zijn. Het gaat om de { en de } die je op verschillende plekken neer hebt gegooid zonder duidelijk reden.

bv.

{ if (buttonStatus1 == LOW && buttonStatus2 == HIGH && buttonStatus3 == LOW && buttonStatus4 == LOW) //Dak dicht.
^
[color=red]deze[/color]
  do
  {
  digitalWrite(M1L, LOW);
  digitalWrite(M1R, HIGH);
  }while(digitalRead (sensor1 == LOW));
}
^
[color=red]en deze[/color]

Als het raam en het zonnescherm onafhankelijk van elkaar kunnen worden bediend snap ik niet waarom je all vier de knoppen controleert.

Hallo Sterretje,

Als ik niet alle knoppen controleer krijg ik het dak niet aan de praat op een een of andere manier.

ja dat is een simpele he.
als je op een knop drukt dan gaat er in de do loop een motor draaien. als de sensor aangaat, dan springt de routine verder naar de volgende, maar je zet de motor niet uit.
dus direct onder de while moet je alle motoren uitzetten. dus M1L enz op LOW.

Een while is een heel gevaarlijke regel. Want het ding kan je hele code blokkeren, en word daarvoor ook heel vaak bewust gebruikt.

Je zegt hier: "Zolang Sensor 3 LAAG is," Of dat wil je zeggen, want die regel staat vol van schrijffouten en slordigheden. Dat is niet heel ernstig, maar het kan veel beter en daarom benoem ik dat hier.

Dit is die regel:

 }while(digitalRead (sensor3 == LOW));

Om eerlijk te zijn heb ik geen idee wat het resultaat van die regel zal zijn, maar wel dat het niet doet wat je hier bedoelde. Het begint met de slordigheid dat de while direct komt na de sluitende } en niet op een volgende regel staat. Voor de IDE maakt dat niet uit en die zal dat gewoon accepteren. Maar de lezer zal het de wenkbrauwen even doen fronsen. Dus het mag, maar is niet netjes.

Maar wat er fout is, is digitalRead (sensor3 == LOW). Wat je daar wil doen, is een waarde aan een ingang lezen, en dan beoordelen (right ?). Maar dat is niet wat je doet. Want Sensor3 == LOW levert je iets anders op dan je wellicht zou denken. Dit is wat ik er van verwacht, maar ook ik kan me vergissen:

Sensor3 == LOW maakt het automatisch een vergelijking. Eerder heb je aan Sensor3 de waarde 32 (van pin 32) gehangen. En nu vergelijk je 32 met LOW. LOW is 0 (nul), en daarmee niet gelijk aan 32. Het resultaat van die vergelijking is dus negatief oftewel 0. Daarmee is digitalRead (sensor3 == LOW) hetzelfde als digitalRead (0) Dat word dan weer erg lollig, want die actie leest dus wat er binnenkomt op de seriële poort (pin 0).

Ik vermoed dat wat je hier netjes wilde neerzetten, zou zijn:

 }
  while (digitalRead (sensor3) == LOW) {
    voeg hier je uit te voeren code in
  }

Hier boven staat al iets van wat je daar eventueel zou kunnen invoegen.

Het is dus heel belangrijk hoe en waar je de verschillende soorten haakjes neerzet.

mas3: het is een do while en geen while do, komt wel op hetzelfde neer hoor. zou ook slimmer zijn want nu gaat de loop altijd er een keer doorheen waardoor de motor start, maar het stopt nooit.

Hallo,

Bedankt voor de antwoorden.

MAS3:

Met die regel probeer ik de zeggen dat de motor blijft draaien totdat sensor3 de waarde 0 geeft. Want deze sensor is NC waardoor de normale waarde zonder dat hij bediend 1 is.

Misschien gebruik ik de while functie verkeerd dat weet ik niet.

Ik ga eens proberen om uw code in te voegen en dan kijken wat het dak doet.

siemvanharen: Ik ga eens proberen om uw code in te voegen en dan kijken wat het dak doet.

Het hele dak 8)

Hoi siemvanharen.

}while(digitalRead (sensor3 == LOW));

Met die regel probeer ik de zeggen dat de motor blijft draaien totdat sensor3 de waarde 0 geeft.

Dat komt redelijk overeen met wat ik vermoedde, alleen had ik (bewust) niet de betreffende waardes benoemd.

Het woord while vertaalt zich naar het Nederlands als "terwijl", of wellicht beter "zo lang als". Jij beschrijft dat je op zoek bent naar iets dat overeen komt met "tot dat", en dat is precies het tegenovergestelde. Als je while combineert met nul of LOW, dan doe je dus een handeling zo lang de voorwaarde (dat de waarde nul word gezien) van de while geldig is. Shooter wees me er op dat het hier een do...while loop betreft, iets dat ik nog niet kende. Maar het doet niets af aan hoe het werkt, alleen de volgorde waarin dit gedaan word verandert. Dus in jouw code komt de handeling vòòr de test die onderdeel uit maakt van je while regel.

Maar wat jij het laatst zei, en wat er in je code staat, komt niet met elkaar overeen. Want je zegt dus dat er iets gedaan moet worden, terwijl de nul waarde ingelezen word. Door die omgekeerde volgorde, word er dus wel eerst altijd iets gedaan, namelijk:

  {
  digitalWrite(M2L, LOW);
  digitalWrite(M2R, HIGH);
  }

En zoals ook al door shooter werd aangegeven, deze actie word nooit ongedaan gemaakt.

De waarschuwing die ik eerder gaf over de while, blijft van kracht. Want als er eenmaal beweging word gezet in dat dak van je, word je opgesloten in een stukje code dat als een bezetene continu op een knopje zit te drukken dat het dak in beweging moet zetten. En dat terwijl het knopje allang was ingedrukt. Das niet nodig en bijzonder inefficiënt, maar het is niet verboden en leidt tot nog toe ook niet tot grote problemen. Dit is ook zo wanneer je de aangegeven fouten hebt opgelost.

En nu is het alweer te ver voorbij mijn bedtijd, dus ik stop er voor vandaag mee.

{ if (buttonStatus1 == HIGH && buttonStatus2 == LOW && buttonStatus3 == LOW && buttonStatus4 == LOW) //Dak open.
 // hier aanzetten
digitalWrite......
 do
  {// helemaal niks doen
//  digitalWrite(M1L, HIGH); // hier zet je de motor aan
//  digitalWrite(M1R, LOW);
  }while(digitalRead (sensor2 == LOW)); 
}  
// hier motor uit digitalWrite low low

Hallo,

Bedankt voor al jullie antwoorden.
Na nog heel wat codes geschreven te hebben is het gelukt.
Het dak werkt naar de eisen die ik had.

Hier de code:

int knop1 = 11;     //Knop 1 dak open.
int knop2 = 12;     //Knop 2 dak dicht.
int knop3 = 13;     //Knop 3 zonnenscherm dicht.
int knop4 = 19;     //Knop 4 zonnenscherm open.

int M1L = 35;       //Motor dak open.
int M1R = 36;       //Motor dak dicht.
int M2L = 37;       //Motor zonnenscherm open.
int M2R = 38;       //Motor zonnenscherm dicht.

int sensor1 = 34;   //sensor, dak open. (microswitch)
int sensor2 = 33;   //sensor, dak dicht. (microswitch)
int sensor3 = 32;   //Sensor, zonnenscherm open. (microswitch)
int sensor4 = 31;   //Sensor, zonnenscherm dicht. (microswitch)

void setup()
{
  pinMode(knop1, INPUT);
  pinMode(knop2, INPUT);
  pinMode(knop3, INPUT);
  pinMode(knop4, INPUT);
  
  pinMode(M1L, OUTPUT);
  pinMode(M1R, OUTPUT);
  pinMode(M2L, OUTPUT);
  pinMode(M2R, OUTPUT);
  
  pinMode(sensor1, INPUT);
  pinMode(sensor2, INPUT);
  pinMode(sensor3, INPUT);
  pinMode(sensor4, INPUT);
}

void loop()
{
  digitalWrite(knop1, LOW);
  digitalWrite(knop2, LOW);
  digitalWrite(knop3, LOW);
  digitalWrite(knop4, LOW);
  
  digitalWrite(M1L, LOW);
  digitalWrite(M1R, LOW);
  digitalWrite(M2L, LOW);
  digitalWrite(M2R, LOW);
  
  digitalWrite(sensor1, LOW);
  digitalWrite(sensor2, LOW);
  digitalWrite(sensor3, LOW);
  digitalWrite(sensor4, LOW);

  if (digitalRead(knop1) == HIGH) {
    while (digitalRead(sensor1) < HIGH) {
      digitalWrite(M1L, HIGH);
      digitalWrite(M1R, LOW);
    }
  }

  if (digitalRead(knop2) == HIGH) {
    while (digitalRead(sensor2) < HIGH) {
      digitalWrite(M1R, HIGH);
      digitalWrite(M1L, LOW);
    }
  }

  if (digitalRead(knop4) == HIGH) {
    while (digitalRead(sensor3) < HIGH) {
      digitalWrite(M2L, LOW);
      digitalWrite(M2R, HIGH);
    }
  }

  if (digitalRead(knop3) == HIGH) {
    while (digitalRead(sensor4) < HIGH) {
      digitalWrite(M2R, LOW);
      digitalWrite(M2L, HIGH );
    }
  }
}

Groetjes,
Siem

Die digitalWrite van die knoppen in de loop kun je weglaten hoor

Mooi dat je het werkend hebt gekregen.

Toch zijn er nog wel puntjes.
Omdat je (neem ik aan) ook graag van wil leren, noem ik wat puntjes op die mij opvallen.

Ik vind de namen van je variabelen niet erg duidelijk.
De IDE kan dat niets schelen, zolang de namen maar uniek zijn.
Maar voor jezelf lijkt me dat toch wel wat lastig, als je na de kerst nog een naar die code gaat kijken.
Daarom zou ik eerder knop1 de naam OpenDak geven, en knop3 OpenScherm.
Dat impliceert dus ook dat de even knopnummers voor sluiten zijn, en de oneven voor openen, want lijkt nu ook willekeurig.
Die namen gelden natuurlijk ook voor dingen als M1L en sensor1.

In je code kijk je eerst of er een knop word ingedrukt, en vervolgens ga je zolang de knop word ingedrukt iets doen.
Das dubbelop.
Die if… kan weg want je doet die controle al in de while…

Als je het op deze manier doet, dan moet je dus de knop ingedrukt houden want als je 'm loslaat, zal de motor stoppen bij de volgende keer dat loop gestart word.
Dat zeg ik bewust zo, want heb je al bedacht wat er zou kunnen gebeuren als een of andere grapjas alle knoppen gelijktijdig gaat indrukken en ingedrukt houdt ?
Daar kun je vast wel iets tegen verzinnen lijkt me.

Verder voorzie je in microswitches, maar je doet er niets mee.
Dat kan tot schade lijden, als de knoppendrukker effe niet op zit te letten.
Is ook oplosbaar hoor.

Je zegt dat het nu werkt naar de eisen die je hebt, maar deze code werkt niet naar de beschrijving die je in je 1e post gaf:

Nu is de bedoeling dat het dak start doormiddel van op de startknop te drukken. Dit heb ik allemaal al werkend. Het dak moet stoppen als het de eindschakelaars bereikt heeft.

Een beetje jammer dat je je eisen schijnbaar hebt bijgesteld, toen je er met de code niet meteen uitkwam.

Hallo MAS3,

Ik zal er aan gaan werken dat de variabelen beter benaamd zijn.

Ik heb de eisen van mijn project niet veranderd. Misschien leest u het verkeerd of heb ik het niet helemaal duidelijk beschreven.

De bedoeling is: Als er op de knop wordt gedrukt voor het dak dicht moet het dak lopen tot dat het de eindschakelaar bereikt. Dit geldt hetzelfde voor alle andere knoppen.

Ik wil wel nog knoppen toevoegen dat het dak manueel bestuurbaar is.

Ik begrijp niet helemaal wat u hier bedoeld.

Verder voorzie je in microswitches, maar je doet er niets mee.

Bedankt, Groetjes Siem

siemvanharen: Als er op de knop wordt gedrukt voor het dak dicht moet het dak lopen tot dat het de eindschakelaar bereikt.

En dat brengt meteen de vraag: wat moet er gebeuren als de knop wordt losgelaten terwijl het dakraam beweegt? Misschien is het duidelijk in de code maar het is niet duidelijk in aangehaalde specificatie.

Hallo Sterretje.

Het dak moet dan gewoon doorlopen tot aan de eindschakelaar.

Ik wil later nog knoppen gaan toevoegen zodat hij met de hand bedienbaar is naar de gewenste stand.

Bedankt, Siem

Ik heb je code niet goed gelezen, en gemist dat je eerst naar knop1 en vervolgens naar sensor1 kijkt.
Ik las dus 2 keer knop1.
Dit komt doordat ik te laat op de lange werkdag je code zat te bekijken (na middernacht), en ook een beetje door de niet geheel handige namen in je code.
Jouw code doet dus niets dubbelop en doet wel degelijk iets met de eindschakelaars.

Daarmee zijn al mijn opmerkingen na die over de variabele namen onterecht, dus sorry daarvoor.

Nou ja, die opmerking over iemand die het spul verkeerd zou kunnen bedienen verdient nog wel wat aandacht want dat kan nog steeds.
Een heel belangrijke opmerking wat mij betreft: je sluit je code in zichzelf op als er ergens een knopdruk wordt geregistreerd.
Dit opsluiten is het gevolg van de while… instructie, en dat is waarom dat een blokkerende code word genoemd.
Dat kan dus 4 keer gebeuren.
Dit maakt je code nogal dom in de zin van als er iets aangevangen wordt, kan er niets anders meer gedaan en/of gecontroleerd worden.
Iemand die per ongeluk op een knop drukt, moet eerst afwachten tot alle andere knopdrukken verwerkt zijn, voor 'ie iets kan doen tegen een onbedoeld openen of sluiten.
Dit is oplosbaar en het is wenselijk dat je dat gaat leren voor volgende projecten.