Beste,

Ik maak een robot die op een tafel kan rijden zonder er af te vallen. Dit met behulp van ultrasone sensors srf005. Ik heb al een redelijk programma denk ik, de sensors werken en geven een waarde dat normaal de afstand moet zijn (disa en disb). Het geeft enkel niet de juiste afstand weer. Nu dit vind ik niet zo erg, al zou het leuker zijn moest er een juiste waarde op het lcd scherm komen. Nu kom ik 4 cijfers uit beginnend met een 0 en dan 3 getallen als de afstand kort is ongveer <8cm geeft hij 00 en 2 getallen. Dus 00XX in het programma, als de situatie 0xxx zich voordoet moet hij achteruit en draaien of hij valt van de tafel.

Ik heb dus vandaag geprobeerd om er nu ook het 'rijdend' gedeelte bij te voegen. Zou iemand de fouten er uit willen halen en me helpen deze te verbeteren? Ik ben niet zeker of '00xx' enz juist is...


#include <dwengoConfig.h>
#include <dwengoBoard.h>
#include <dwengoDelay.h>
#include <dwengoLCD.h>
#include <dwengoADC.h>
#include <dwengoMotor.h>

#define MAX_SPEED ?              //waarde moet getest worden//
#define MIN_SPEED 0              //0 dan staat de motor stil//

int m,n,x; 
double timea,distancea,disa,timeb, distanceb,disb;
 
void main(void)
{
 initBoard();
 initADC();
 initMotor(); 
 initLCD();
 clearLCD();
 backlightOn();
 
 TRISA = 0b11111111;
 ADCON1 =0b11111111;

 while(TRUE)
 {
  LEDS = 0b00000001;  
  delay_us(10);
  LEDS = 0b00000000;  
  delay_us(100);
  m=0;
 
  while(PORTAbits.AN0==1)
  {
  m++;
  }
 timea=(0.0000004*m); //Calculating the time based on the insturction cyle of the pick by multiplying the count to it 
 disa=(timea*34000); //Caluclating the distance based on time. The signal travles 34000 cm in a second 
 setCursorLCD(0,0);
 appendIntToLCD(disa);
  LEDS = 0b00000010;  
  delay_us(10);
  LEDS = 0b00000000;  
  delay_us(100);
  n=0;
 
  while(PORTAbits.AN1==1)
  {
  n++;
  }

 timeb=(0.0000004*n); //Calculating the time based on the insturction cyle of the pick by multiplying the count to it 
 disb=(timeb*34000); //Caluclating the distance based on time. The signal travles 34000 cm in a second 
 setCursorLCD(1,0);
 appendIntToLCD(disb);

 if(disa==00XX and disb==00xx) {
     setSpeedMotor1(MAX_SPEED);           //vooruit rijden//
     setSpeedMotor2(MAX_SPEED);
   } else if(disa==0xxx and disb==0xxx){
     setSpeedMotor1(-MAX_SPEED);          //achteruit rijden//
     setSpeedMotor2(-MAX_SPEED);
     delay_us(2000);
     setSpeedMotor1(MIN_SPEED);           //stoppen//
     setSpeedMotor2(MIN_SPEED);
     delay_us(500)
     setSpeedMotor1(MAX_SPEED);           //draaien//
     setSpeedMotor2(MIN_SPEED);
     delay_us(?);                         //hoe draai ik 90°???//
     setSpeedMotor1(MIN_SPEED);           //stoppen//
     setSpeedMotor2(MIN_SPEED);
   } else {
     setSpeedMotor1(MIN_SPEED);           //stoppen, waarden kloppen niet dus led's branden//
     setSpeedMotor2(MIN_SPEED);
     LEDS = 0b11111111;
   }
 }
}

Ik werk samen met 'boen' hij heeft ook al enkele vragen over het programma gesteld op dit forum. Dus meer info is eventueel daar te vinden.

Alvast bedankt!

Mvg,
Leysen

Gebruik een counter om de pulslengte te bepalen - hier ga je keihard onderuit als je ook maar iets met ISRs gaat doen. Die counter kun je doorgaans ook wel aan een clock relateren. Dan heb je een stabiele tijdbasis en dus ook een makkelijk te berekenen afstand (die je dus ook prima op je display kunt zetten).

Er zijn wel wat scenario's voor die counter te bedenken. Je kunt een ISR klussen die het ding op bijvoorbeeld een rising edge cleared en op een falling edge uitleest, dat in een global frut en verder niks doet. Dan heb je altijd het laatste lees resultaat. Additioneel zou je dan nog wat kunnen met een timer die ergens overflowt en dat als timeout zien - weet je ook of je laatst gemeten waarde zinnig kan zijn en niet 'eeuwen' geleden gemeten is.

Klinkt wel interessant, bedankt daarvoor! Maar ik weet niet goed hoe ik dat moet doen...

En wat vind je van de rest van het programma? Ik vermoed dat jouw reactie enkel op de afstand sloeg die op het lcd kwam?

al bedankt voor de reactie!

Zoals in de thread van Boen ook al gemeld: dit is helemaal geen C++, gewoon C.
Fouten uit je programma halen is heel moeilijk omdat je gebruik maakt van includes die wij niet kennen. Verder weten we ook al niet hoe je sensoren zijn aangesloten, dus is het lastig om te bepalen wat er gebeurt als je robot aan de rand van de afgrond komt.

[off topic]
wat is hier C++ aan?

hardcore C volgens mij
weinig objecten op een uC wel registers

en functies, die zou je als objecten kunnen zien misschien...
[/off topic]
EDIT sorry had niet de laatste post zijn 1e regel gelezen.

[Bericht gewijzigd door High met Henk op (14%)]

Merkwaardig: http://www.circuitsonline.net/forum/view/96896

[edit] Ahja: je werkt samen :) [/edit]

Geen C++!! C++ ga je niet zo snel zien voorbij komen bij de hobyisten embedded elektronica.
Dus zeg maar volmondig C!

[edit2] Ik hoop dat jouw echte code beter ingesprongen is dan deze. Dit maakt het zeer moeilijk om te lezen![/edit]

[Bericht gewijzigd door Phalox op (21%)]

Op 23 juli 2011 15:52:49 schreef Leysen:
Klinkt wel interessant, bedankt daarvoor! Maar ik weet niet goed hoe ik dat moet doen...

Lezen, veel lezen :)
Ik het kort staat een concept al in mijn eerste reply. Zoek in de datasheet naar timer/counter en naar interrupts.

En wat vind je van de rest van het programma? Ik vermoed dat jouw reactie enkel op de afstand sloeg die op het lcd kwam?

Nee, algemeen op de manier van tijd bepalen, waar je het ook voor doet. Conceptueel legt hetgeen je verzonnen hebt jezelf veel beperkingen op, afgezien van software die nodeloos ingewikkeld wordt.

Verder word ik vrij snel erg verdrietig van 'delays'. Het kan, als je verder niks hoeft. Maar als je ook nog ergens wat anders wilt doen, moet je dat niet willen. 'Voor nu' kan het nog niet zoveel kwaad.

Ok sorry allemaal, ik dacht dat ik in C++ schreef. :)

Hoe mijn sensoren zijn aangesloten. het is een pic18F4550 en de sensoren worden op poorten D0 en D1 aangesloten (het zijn 2 sensors) en op de poorten A0 en A1. Ik weet niet of julie hier wijzer uit worden?

Ik zal misschien mijn probleem ietsje specifieker uitleggen, want ik denk dat de rest vrij in orde is aan het komen :). Ik heb een probleem met deze lijn:


if(disa==00XX && disb==00xx) {

Op mijn lcd scherm kom ik dus een waarde uit in de vorm van 00xx met x getallen, deze waarde krijg ik als hij de tafel detecteerd. Als de sensor over de tafelrand gaat krijg ik een getal van de vorm 0XXX. Nu als ik het laat builden in MPLAB dan geeft hij een fout op die lijn. Nu is de vraag hoe kan ik dat anders in mijn programma zetten?

Ik werk met een dwengoboard, wel leuk om met te knutselen. Moest er iemand geïnteresseerd zijn hier is een link naar de dwengo site:

http://www.dwengo.org/nl

Mvg,
Leysen