Go Down

Topic: 24V DC Motor aansturen (Read 684 times) previous topic - next topic

StijnNijhuis

Hallo allemaal,

Dit is mijn idee. Ik wil door middel van de Arduino Uno in combinatie met een 2voudig relais een 24V DC motor aansturen. Hiermee wil ik namelijk de tv ''uit het plafond laten komen'' en wanneer je geen tv kijkt deze weer ''laten verdwijnen''. Het motor-aansluitschema is als volgt:

Rood: Altijd 24V
Zwart: Altijd 24V
Blauw: 5V signaal voor aan / uit
Wit: 0 of 5V om de draairichting te bepalen.

Het relais aansturen met de arduino is me al gelukt. Ik gebruik hiervoor een IR signaal. Alleen nu komt mijn probleem. Ik wil gebruik maken van eindschakelaars. 2 stuks om precies te zijn. Ik zou het als volgt willen programmeren:

if eindschakelaar1 = high en ik geef het gewenste ir signaal
then 5V op blauw. Net zo lang totdat eindschakelaar2 hoog word.

if eindschakelaar2 = high en ik geef het gewenste ir signaal
then 5V op blauw en 5V op wit om de draairichting te wisselen.

Dit vervolgens ook net zo lang totdat eindschakelaar1 weer wor geraakt.

Het lukt me echter niet om de voorwaarden er in te programeren. Heb al van alles geprobeerd en gezocht maar zit nu toch echt op een dood spoor.

Mijn probleem is dus eigenlijk vrij simpel. Is het mogelijk om voorwaarden aan een actie te hangen?
De eindschakelaars die ik gebruik hebben geen COMMON, kan dit het probleem zijn? Of bedraad ik handmatig iets verkeerd? Ik zou graag jullie ideeën en hopelijk ook oplossingen horen.

Alvast bedankt,

Stijn

MAS3

Hoi StijnNijhuis, welkom.

Natuurlijk is dat mogelijk.
Maar om dat goed te doen, zou je eigenlijk eens mo9eten bekijken hoe je het zelf zou doen, en wat de code die je gebouwd hebt nu eigenlijk precies doet.

Ik lees je code als volgt:

* Kijk of er iets via IR binnen komt.
* Kijk wat er dan binnenkomt, en besluit wat je daar dan wat mee zal gaan doen.
* Kijk ook of er een eindschakelaar goed staat om te kunnen doen wat jij wilde doen.
* Voer de actie uit.

* Kijk of er een eindschakelaar in een bepaalde stand staat, en wanneer dat zo is, voer dan een actie uit.
* Kijk of een andere eindschakelaar in een bepaalde stand staat, en voer dan weer een andere actie uit.

Je blijft dit heel erg snel na elkaar doen, en de laatste 2 acties zijn niet afhankelijk van iets anders dan de eindschakelaars.

Uiteindelijk resulteert dit er in dat je het IR commando moet blijven uitzenden, en dat wanneer je een eindwaarde hebt bereikt, er altijd weer terug gegaan zal worden.
Sterker nog, eens er een eindwaarde is bereikt, zal je tv heen en weer gaan jojo'en.

Wat je volgens mij wilde bereiken, is dat je ziet dat er een afstandbedienings-signaal binnen komt, en je dan kijkt of je een bepaalde beweging mag gaan maken.
Tot nog toe doe je dat ook.
Maar als je eenmaal hebt gezien dat je kunt gaan bewegen, hoef je niet meer te controleren of er op een knop word gedrukt.
Wel moet je kunnen zien of je het einde al bereikt hebt.
En dat doe je nu dus niet helemaal goed.

Ik raad je aan om te kijken of je kunt gaan bewegen zoals je dat nu al doet, en dan te onthouden dat de betreffende beweging uitgevoerd kan worden.
Vervolgens voer je de beweging ook uit zolang de eindstand niet bereikt is.

Misschien denk je dat je dat nu doet, maar zo lees ik je code dus niet.



Have a look at "blink without delay".
Did you connect the grounds ?
Je kunt hier ook in het Nederlands terecht: http://arduino.cc/forum/index.php/board,77.0.html

StijnNijhuis

Hallo MAS3,

Oké, de fout zit dus echt in het programmeren. Ik ga proberen te doen wat je zegt. Maar ik zou dus geen Loop moeten gebruiken?

MAS3

Natuurlijk moet je wel de loop blijven gebruiken, maar je moet het verloop ervan beïnvloeden.
Dat betekent dat je niet bij elke iteratie (elke keer als de loop weer opnieuw begint), precies hetzelfde moet doen.
Jouw loop word elke seconde duizenden en nog eens duizenden malen doorlopen.
Das best vaak, vind je niet.

Als er eenmaal een afstandbedienings-signaal is binnengekomen, en je hebt gezien dat de beweging ook gemaakt kan worden, dan hoef je niet meer naar dat IR signaal te kijken totdat de beweging ten einde is.
Tenzij je wil dat de beweging alleen gemaakt word zolang er op het knopje gedrukt word, maar daarvoor heb je dan weer een andere extra handeling nodig.
En als de beweging ten einde is, dan hoef je ook niet meer een beweging in de andere richting te starten.

Je zou het misschien niet verwachten, maar ook dit is iets wat je gaat begrijpen als je je verdiept in Blink Without Delay .

Have a look at "blink without delay".
Did you connect the grounds ?
Je kunt hier ook in het Nederlands terecht: http://arduino.cc/forum/index.php/board,77.0.html

shooter

ik zou de eindschakelaars hard in het elektrisch schema zetten en dan kun je met diodes de motor wel in de goede richting laten lopen, maar niet in de verkeerde.
werkt zeker en altijd ipv code.
paul deelen
shooter@home.nl
making controls with codesys PLC and arduino

StijnNijhuis

#5
Sep 04, 2018, 08:23 pm Last Edit: Sep 04, 2018, 08:24 pm by StijnNijhuis
Hallo allemaal,

Ik heb geprobeerd het programma aan te passen zoals jullie hebben voorgesteld. Maar ik heb het idee dat de eindschakelaars niet binnen komen. Ik heb het als volgt aangesloten. Vanaf de 5v van de arduino naar de eindschakelaars en vanaf de andere kant van de eindschakelaars naar pootje 3 en 7. Wat kan hiervan de oorzaak zijn?

Alvast bedankt.

MAS3

Hoi.

Je hebt nu wel de eindschakelaar aan een vast nivo gehangen (5 volt), maar die 5 volt staat alleen aan de andere kant van de schakelaar als de schakelaar aan staat.
Weet jij wat er aan de andere kant van de schakelaar staat wanneer de schakelaar niet aan staat ?
Want ik weet het niet, en je Arduino ook niet.
Die zit er naar te kijken en ziet van alles voorbij komen.
Soms zal ie daaruit de conclusie trekken dat de ingang hoog is, en soms (iets minder vaak) dat die laag is, maar het blijft maar een beetje gokken.

Daarom moet je in dit soort gevallen zorgen dat de ingang een gedefinieerd nivo ziet, wanneer er geen ander nivo aangeboden word.
In dit geval zou je dan de ingangspin van je Arduino via een weerstand (van een relatief hoge waarde) aan GND hangen.
Nu word je ingang naar nul getrokken door de weerstand tenzij de schakelaar een sterkere 5 volt aan die ingang brengt, waardoor die 5 volt gezien zal worden.

Maar dan moet je een weerstand gaan toevoegen en das lang niet altijd gewenst.
Jouw Arduino biedt daarom de mogelijkheid om een ingang omhoog te trekken (pull up), jij moet er met je schakelaar dan harder aan trekken om 'm omlaag te krijgen.
Met andere woorden, de schakelaar moet dan aan GND en jij moet op zoek gaan naar een LOW in plaats van een HIGH.
En je moet de ingang definiëren als INPUT_PULLUP in plaats van alleen als INPUT.
In de voorbeelden bij je IDE zit ook een voorbeeld dat hier over gaat, zodat je het gebruik er van kunt bestuderen.

Ik zie trouwens erg weinig verschil tussen versie 3.0 en 3.1 van jouw code, maar ik heb ze niet echt naast elkaar gelegd,
Have a look at "blink without delay".
Did you connect the grounds ?
Je kunt hier ook in het Nederlands terecht: http://arduino.cc/forum/index.php/board,77.0.html

StijnNijhuis

#7
Sep 05, 2018, 02:26 pm Last Edit: Sep 05, 2018, 02:27 pm by StijnNijhuis
Hallo,

Als ik het goed begrijp moet ik dus in plaats van 5V de GND gebruiken om naar de eindschakelaars toe te gaan. En een kleine aanpassing in het programma. Dit heb ik geprobeerd maar het werkt nogsteeds niet. Iemand nog tips...? Of ziet iemand misschien wat ik fout doe?

Alvast bedankt

MAS3

Hoi.

Lees mijn antwoorden altijd meerdere malen door, want ik probeer er zoveel mogelijk informatie in te stoppen.
Schijnbaar heb je nog niet alle informatie uit mijn vorige bericht ontvangen, want in onderstaande code is inderdaad wat veranderd (ik heb ze nu wel naast elkaar gelegd), maar niet alles dat nodig is.
Alleen pinmode aanpassen is niet voldoende.

Code: [Select]
#include <IRremote.h>
 
const int RECV_PIN = 4;
const int eindschakelaarboven = 3;
const int eindschakelaarbeneden = 7;
const int blauwhigh = 2; //Blauwe draad van 10 hier naar toe op een input,
const int withigh = 5; //Witte draad van 11 hier naar toe op een input
const int blauw = 10;
const int wit = 11;

IRrecv irrecv(RECV_PIN);
decode_results results;

 
void setup(){
  Serial.begin(9600);
  irrecv.enableIRIn();

  pinMode(blauw, OUTPUT);
  pinMode(wit, OUTPUT);
  pinMode(voeding, OUTPUT);
  pinMode(eindschakelaarboven, INPUT_PULLUP);
  pinMode(eindschakelaarbeneden, INPUT_PULLUP);
  pinMode(blauwhigh, INPUT);
  pinMode(withigh, INPUT);

  digitalWrite(blauw, HIGH);
  digitalWrite(wit, LOW);

}
 
void loop(){
    
  if (irrecv.decode(&results)) {
    switch(results.value) {
      case 0xFFA857:
         if(eindschakelaarboven == HIGH && blauwhigh == HIGH){
              digitalWrite(wit, HIGH);
              digitalWrite(blauw, LOW);
         }
      break;
      case 0xFF629D:
         if(eindschakelaarbeneden == HIGH && blauwhigh == HIGH){
              digitalWrite(blauw, LOW);
         }
      break;
      }
      Serial.println(results.value, HEX);
      irrecv.resume();
  }
  if(eindschakelaarboven == HIGH && withigh == LOW && blauwhigh == LOW){
    digitalWrite(blauw, HIGH);
  }
  
  if(eindschakelaarbeneden == HIGH && withigh == HIGH && blauwhigh == LOW){
    digitalWrite(blauw, HIGH);
    digitalWrite(wit, LOW);
  }
}
Have a look at "blink without delay".
Did you connect the grounds ?
Je kunt hier ook in het Nederlands terecht: http://arduino.cc/forum/index.php/board,77.0.html

StijnNijhuis

Hallo iedereen. Ik heb volgensmij alle tips van MAS3 geprobeerd. Maar het wil me nog steeds niet lukken. Ik heb de inputs veranderd tesamen met de code. Heeft iemand misschien een stuk code en aansluit schema over hoe ik een eindschakelaar moet gebruiken. Het wil me gewoon echt niet lukken.

Alvast bedankt.

MAS3

Hoi Stijn.

Laat de code zien die je nu hebt.
Dan kunnen we ook zien hoe jij bedacht hebt het te doen en je wijzen op problemen die in die code te zien zijn zodat jij dat op kunt lossen.
Op die wijze kun je leren.
Je zult erg weinig leren van code die iemand anders voor jou maakt, en die jij vervolgens nog steeds niet snapt.
Wanneer je de volgende keer de code wil uitbreiden of op andere wijze wil wijzigen, loop je meteen weer vast.
Dus dat schiet dan niet op.
Have a look at "blink without delay".
Did you connect the grounds ?
Je kunt hier ook in het Nederlands terecht: http://arduino.cc/forum/index.php/board,77.0.html

StijnNijhuis

Hallo,

Dit is hoe ik het programma nu heb. Ik heb geprobeerd met 5v en een weerstand op de eindschakelaars. En ik het het geprobeerd met de eindschakelaars aan GND, toen had ik in de code een klein beetje anders en ging ik op zoek naar een LOW. Toch ''ziet'' de arduino de eindschakelaars nog niet..
Iemand nog een oplossing..?

MAS3

Hoe weet je dat de eindschakelaars niet gezien worden ?

Ik zie dat je nu eerst de waarde van de eindschakelaars binnenhaalt, en dan gaat verwerken.
Maar ik vraag me af hoe jij weet wat de Arduino wel en niet kan zien.
Misschien kun je iets maken waardoor je, om te testen, kunt meekijken met wat de Arduino kan zien.
Daar kun je vast wel meerdere oplossingen voor bedenken.
Sterker nog, in je code doe je al iets soortgelijks.

Er zijn een aantal manieren om te gaan debuggen.
Vaak word bijvoorbeeld vergeten hoe snel de code uiteindelijk zal worden uitgevoerd.
Maar dat kun je voor jezelf wel duidelijker maken door de boel te gaan vertragen.
Dan zet je op bepaalde punten een pauze neer en als je alle problemen hebt opgelost haal je dat natuurlijk weer weg.
Dit is 1 van de zeldzame gevallen waar delay() wel nuttig is.
Doe je delay(1000), dan word er een seconde lang niets meer gedaan.
Dat is meer dan genoeg om te kunnen zien of er een relais ineens word ingeschakeld.
Want die heeft geen seconde nodig voor dat inschakelen, maar wel heel veel meer tijd dan 1 iteratie.
En als je telkens tegengestelde signalen zou gaan geven, dan doet je relais dus niets.
Je code word dan ineens heel traag uitgevoerd, maar jij kunt dan elke stap precies volgen.

Volgens mij is het slimmer om, wanneer je eenmaal het afstandbedieningssignaal hebt gezien, je gaat onthouden dat dat signaal er was.
Pas als je klaar bent met de afhandeling van wat je daar ook mee wil doen, kun je vergeten dat je dat signaal gezien hebt.

Ik snap nog steeds niet waarvoor de regels 51 tot en met 58 nodig zijn.


Verder vind ik de namen die je aan je variabelen geeft, niet de slimste.
Want wat wit en blauw is dat ga ik niet voor jou onthouden.
Ja, dat dat de kleuren van de draden zijn die je gebruikt hebt dat weet ik wel.
Maar waar ze voor zijn, geen idee.
Wanneer je over 2 jaar deze code nog eens opduikt, dan word het best lastig om uit te vinden wat je er ook al weer mee bedoelde.
Uiteraard maakt dit voor de Arduino niets uit (de Arduino zelf weet zelfs helemaal niet van de namen die je er aangegeven hebt), zolang de juiste namen maar worden gebruikt.

De belangrijkste informatie in dit antwoord, heb ik je eerder al gegeven
Have a look at "blink without delay".
Did you connect the grounds ?
Je kunt hier ook in het Nederlands terecht: http://arduino.cc/forum/index.php/board,77.0.html

Go Up