Gebruikersavatar
Stefan de Lange
Artikelen: 0
Berichten: 13
Lid geworden op: vr 20 jun 2014, 13:04

Ultrasoon sensor programmeren in C

Hallo, voor een project op school ben ik bezig met het bouwen van een robot. Nu heeft deze robot een sensor om dingen te ''zien'', namelijk de HC-SR04.
Om deze sensor te testen probeer ik een klein programmaatje te schrijven in C, op mbed.org. De microcontroller die ik hiervoor gebruik is de LPC1114FN28. Deze heeft hardwarematige timers en PWM.  Mijn programmeerkennis is echt  0, zelfs voorbeelden op de website kan ik geen touw aan vast knopen. Om de sensor te testen wil ik dat een led zachter of harder gaat branden wanneer je er verder of dichterbij staat. 
 
Ik heb vast een begin gemaakt:
Afbeelding
 
(dp1, dp9 en LED1 zijn poortnummers van de microcontroller)
 
In de datasheet van de sensor (http://www.micropik.com/PDF/HCSR04.pdf) staat dat je alleen een 10uS TTL signaal op de TRIG pin hoeft te zetten om het meten te starten. Zodra het meten gestart is kun je de afstand bepalen door te kijken naar het binnenkomende signaal (echo) en het uitgaande signaal (trig). De formule om de afstand (in cm) te bepalen is: uS / 58 = centimeters. Ik zal dus iets van code moeten schrijven om de microcontroller een signaal op de trig te laten zetten. Vervolgens moet ik code hebben om de afstand te bepalen. De afstand moet de sterkte van het branden van het lampje bepalen.
 
Ik hoop dat jullie me op weg kunnen helpen.
 
Stefan
 
sensor
Artikelen: 0
Berichten: 338
Lid geworden op: vr 27 jan 2012, 11:42

Re: Ultrasoon sensor programmeren in C

Het is niet logisch om de tijd te bepalen tussen Trig out en echo puls, deze tijd is te lang. De HCSR04 zal eerst nog  de echo pulsen moeten versturen, bovendien stuurt de module een echopuls met een bepaalde breedte. De breedte van de echopuls geeft dus de afstand aan. Dit is eenvoudig te testen met een simpel programma zoals met de Arduino is gedaan : http://arduinobasics.blogspot.nl/2012/11/arduinobasics-hc-sr04-ultrasonic-sensor.html De pulsduurmeting wordt in de software gedaan en niet op interruptbasis. 
 
Het genoemde programma is leuk voor een test maar kan beter op interrupt basis. De timers van de LPC1114FN28 zijn te besturen met een ISR routine en meten dan de puls via een counter. Dit draait dan parallel aan het hoofdprogramma. De meting wordt dus in de interrupt routine uitgevoerd en het resultaat kan dan in de main programma lus gebruikt worden. Er is een voorbeeld voor de pic : https://electrosome.com/hc-sr04-ultrasonic-sensor-pic/ Dit programma kan je als basis gebruiken, wel zullen de counters timers iets ingewikkelder zijn in de ARM controller maar hiervoor zijn ook mooie voorbeelden te vinden. Probeer eens de Hello World variant uit namelijk een led laten knipperen met behulp van een timer op interrupt basis oftwel blinky.c
Gebruikersavatar
Stefan de Lange
Artikelen: 0
Berichten: 13
Lid geworden op: vr 20 jun 2014, 13:04

Re: Ultrasoon sensor programmeren in C

Dit ''simpele'' programma is abracadabra voor mij. Er staan allemaal termen in die ik niet begrijp... en ik mag geen arduino gebruiken. Tweede voorbeeld is eigenlijk hetzelfde verhaal, ik heb pas één periode les gehad in programmeren dus ik heb geen idee wat ik met dat voorbeeld moet. 
 
Ik zie in de tweede link wel dit:
 
a = (TMR1L | (TMR1H<<8)); //Reads Timer Value

a = a/58.82; //Converts Time to Distance
 
Ik begrijp de eerste regel niet maar de tweede regel is wat ik nodig had om de lengte dat de echo pulse ''high'' is om te zetten in afstand. 
sensor
Artikelen: 0
Berichten: 338
Lid geworden op: vr 27 jan 2012, 11:42

Re: Ultrasoon sensor programmeren in C

Je begrijpt dus dat de variabele a de waarde van de timer (met daarin de meetwaarde ) heeft overgenomen. Deze waarde heeft hij gekregen doordat in de eerste regel het hoge byte van de timer TMR1H is samengevoegd met het lage byte TMR1L doormiddel van het vertikale streepje dit is een OR operatie en daar heb je vast wel eens van gehoord. Het commando TMR1H<<8  is een zogenaamde linkse schuifoperatie met 8 stappen, ofwel alle bits worden 8 plaatsen naar links opgeschoven. Ik geef toe dat dit in het begin wat vaag klinkt maar dat is een kwestie van wennen.
 
Het abracadabra is te begrijpen door alle stapjes na te lopen, maar dit is niet wat ik bedoelde met mijn uitspraak over een simpel programma of algoritme. Het gaat dan meer om het principe namelijk dat alleen de tijdsduur van de echopuls bepaald hoeft te worden. En daarvoor kan een timer gestart  worden bij de start van de echopuls en aan het einde van de puls wordt deze timer gestopt. Je kunt dit vergelijken met een stopwatch die aan het begin van het event start en bij eind gestopt wordt, de tijdsduur kan dan eenvoudig afgelezen worden en meer is het niet. Alleen moeten we nu nog de details invullen, zoals hoe ga je de tijdsduur meten en wat voor code is daarvoor nodig.
Gebruikersavatar
Stefan de Lange
Artikelen: 0
Berichten: 13
Lid geworden op: vr 20 jun 2014, 13:04

Re: Ultrasoon sensor programmeren in C

Ik denk dat ik het begin te begrijpen. Ik denk echter dat met ''bits schuiven'' niet van toepassing is op de sensor. Ik zou namelijk niet weten waar ik dat voor zou moeten gebruiken. Die variabele a is ook wat ik probeer te krijgen. Als ik een stukje code kan schrijven om de timer te starten bij de stijgende ''edge'' van de echo puls en de timer kan stoppen bij de dalende ''edge'' van de echo puls heb ik de data die nodig is om de afstand te bepalen. 
Gebruikersavatar
Stefan de Lange
Artikelen: 0
Berichten: 13
Lid geworden op: vr 20 jun 2014, 13:04

Re: Ultrasoon sensor programmeren in C

Even een kleine update:
 
Afbeelding
 
Dit is wat ik tot nu toe heb. Ik krijg nog één error maar ik kan zo niet zien waarom ik die error krijg. Zijn er nog veel dingen die ik moet toevoegen? De timer moet starten bij een ''rising edge'' maar volgens mij is dat nu nog niet zo. 
sensor
Artikelen: 0
Berichten: 338
Lid geworden op: vr 27 jan 2012, 11:42

Re: Ultrasoon sensor programmeren in C

De grote lijn klopt aardig nu nog de details zoals de rising edge enzo en verder hebben de variabelen Begin en end hebben nog geen declaratie. Ik zag dat er al het een en ander geprobeerd is op de mbed site ;
https://developer.mbed.org/teams/TVZ-Mechatronics-Team/code/HC-SR04/
 
Er bestaat een functie pin.rise voor het vaststellen van rising of falling edge, maar is wel in C++. 
 
 void HCSR04::init() {
    /** configure the rising edge to start the timer */

    echo.rise(this, &HCSR04::startTimer);

    

 }
 
Het gebruik van pin.rise lijkt op het toepassen van een struct maar dit maakt het wel iets lastiger programmeren.
sensor
Artikelen: 0
Berichten: 338
Lid geworden op: vr 27 jan 2012, 11:42

Re: Ultrasoon sensor programmeren in C

Ik zag dat je in het project gebruik maakt van de mbed.h header file. Met behulp van de mbed.h kun je toegang krijgen tot een bibliotheek met componenten zoals digitalIn voor een input pin. 
 
Je kunt dan een input pin declareren met :
DigitalIn enable(p1);
if (enable) 
              {  doe iets}
 
Op het moment dat enable dus hoog is wordt de opdracht tussen { } uitgevoerd. Maar hoe zorg je ervoor dat je dan de juiste pinnen voor de  LPC1114FN28 aanstuurt. Je moet  mbed.h porten naar de LPC1114FN28 of zoiets.
 
timer begin moet dan afgelezen worden op het moment dat enable hoog wordt.

Terug naar “Informatica en programmeren”