Bouwen van een lichtvolger

In deze tutorial bouwen we een kleine robot die steeds in de richting van het meeste licht wijst. De robot is zeer eenvoudig opgebouwd uit een servo en twee lichtsensoren. Dit principe zou bijvoorbeeld gebruikt kunnen worden om een zonnepanneel steeds perfect naar de zon te richten zodat de opbrengst gemaximaliseerd wordt.

Benodigdheden

  1. Een Dwengo-bord
  2. Een Dwengo-programmer
  3. De bijbehorende kabels
  4. Twee fototransistoren met bijhorende 22 kOhm weerstanden
  5. Eventueel een Dwengo-breadbord voor het gemakkelijk bouwen van de analoge schakeling en wat draadjes
  6. Een servo-motor
  7. Een soldeerbout met wat tin voor het ineenknutselen van de sensor

Bouwen van de robot

In deze sectie bouwen we de robot-hardware.

Aansluiten van een servo

Een servo heeft typisch drie draden verbonden met een connector. Twee van deze draden, de voedingsdraden, voorzien de servo van de juiste spanning en met één ervan kan je de positie instellen. De twee voedingsdraden zijn steeds zwart (grond) en rood (5V) van kleur. Om gemakkelijk servo's aan te sluiten is het Dwengo-bord voorzien van twee connectoren: servo1 en servo2. Hierop kan je servo's aansluiten die maximaal zo'n 200 à 400 mA stroom vragen. Sluit de servo zo aan dat de donkerbruine of zwarte draad overeenkomt met het "-"-teken zoals op de foto is weergegeven.

Aansluiten van de servo


In deze tutorial gaan we ervan uit dat er een servo is aangesloten op de connector met naam servo1.

Aansluiten van de sensoren

In de tutorial over ADC toonden we hoe je met een weerstand en een fototransistor een lichtsensor kan bouwen. Voor de lichtvolger moet je de schakeling twee maal bouwen. Nu is het echter de bedoeling dat je de sensoren soldeert zodat deze bevestigd kunnen worden op de servo. Net zoals in de vorige tutorial sluit je de ene sensor aan op AN0 van het Dwengo-bord. De tweede sensor sluit je aan op AN1 van het Dwengo-bord. Let erop dat je het lange beentje van de fototransistor (de emittor) aansluit op de grond. Het korte beentje (de collector) sluit je aan op de weerstand die loopt naar de 5 V-pin. Het aansluiten van de draden kan je gemakkelijk doen met het Dwengo-experimenteerbord. Je krijgt dan een schakeling zoals op de foto.

Schakeling van de lichtvolger


De volledige robot-hardware zou er ongeveer als volgt moeten uitzien.

Overzicht van een werkende lichtvolger

Het programma

Het programma ziet voor de robot vindt je hieronder.

  1. #include <dwengoConfig.h>
  2. #include <dwengoBoard.h>
  3. #include <dwengoServo.h>
  4. #include <dwengoADC.h>
  5.  
  6. #define THRESHOLD 50 // defines light sensitivity
  7.  
  8. void main(void) {
  9. int rightSensor, leftSensor;
  10. unsigned char position;
  11.  
  12. initADC();
  13. initServo();
  14.  
  15. while (TRUE) { // Repeat the following forever
  16.  
  17. // Read light sensors
  18. rightSensor = readADC(0);
  19. leftSensor = readADC(1);
  20.  
  21. // Calculate new possition
  22. if ((leftSensor - rightSensor > THRESHOLD) && (position > 0)) {
  23. position--;
  24. } else if ((rightSensor - leftSensor > THRESHOLD) && (position < 255)) {
  25. position++;
  26. }
  27.  
  28. // Send new possition to servo1
  29. setPosition(1,position);
  30.  
  31. // Give the servo some time to move to the new possition
  32. delay_ms(10);
  33. }
  34. }

Initialisatie

In de lijnen 9-13 wordt de lichtvolger geinitialiseerd. De variabelen leftSensor en rightSensor worden respectivelijk gebruikt om de lichtsterkte van de linker en de rechter sensor bij te houden. De variabele possition wordt gebruikt om de positie van de servo bij te houden. Aangezien we gebruik willen maken van dwengoADC-bibliotheek en de dwengoServo-bibliotheek, worden beide bibliotheken geinitialiseerd.

De controle-lus

De code die ervoor zorgt dat de servo zich naar het licht richt bevind zich in de lijnen 15-33 en herhaald oneindig lang de volgende stappen

  • Lees de sensoren uit en schrijf de waarden in de variabelen leftSensor en rightSensor;
  • Bereken de nieuwe positie van de servo uitgaande van de nieuwe sensorwaarden en schrijf deze waarde in possition;
  • Geef de servo opdracht om naar de nieuwe positie te draaien;
  • Wacht even zodat de servo tijd heeft om de nieuwe positie te bereiken.

Voor het lezen van de sensor waarden maken we gebruik van de readADC-functie die onderdeel uitmaakt van de dwengoADC-bibliotheek. Als argument wordt het in te lezen kanaal meegegeven. Aangezien de rechter lichtsensor aangesloten is op pin AN0, lezen we zijn waarde uit op kanaal 0. De linker lichtsensor is aangesloten op pin AN1 en wordt dus uitgelezen op kanaal 1.

De aanpassing van de servo-positie gebeurt in lijnen 21-26. Als de linker sensor meer licht opvangt dan de rechter moet de servo naar links bewegen en omgekeerd. Let wel op dat meer licht een lagere waarde betekend. Om schokkerig gedrag van de robot te vermijden zorgen weervoor dat niet op het minste verschil in lichsterkte gereageerd wordt. Pas als het verschil de TRESHOLD-waarde overschrijd wordt de positie van de servo aangepast door er 1 bij op te tellen of af te trekken. Ten slotte wordt er ook voor gezorgd dat de servo positie niet onder 0 zakt en niet boven 255 stijgt. De servo kan immers maar posities aannemen in een binnen dit bereik.

Op lijn 29 geven we de servo opdracht om naar de nieuwe positie te draaien met behulp van de setPossition-functie die onderdeel uitmaakt van de dwengoServo-bibliotheek. Deze functie neemt het volgnummer van de servo en de nieuwe positie als argument. Aangezien wij gebruik maken van servo1 is het volgnummer gelijk aan 1.

Als laatste (lijn 32) wachten we even zodat de servo de tijd krijgt om naar de nieuwe positie te draaien. De servo is immers niet oneindig snel.

BroncodeBronbestanden zijn enkel toegankelijk voor geregistreerde gebruikers. Als je al een account hebt op de Dwengo site, gelieve dan in te loggen, anders kan je je eerst registreren.