Probleem met motortjes Asuro

Pagina: 1
Acties:

  • koffieprutser
  • Registratie: Mei 2010
  • Laatst online: 09-10 18:03
Hoi, ik heb gisteren een Asuro in elkaar gezet en vandaag ben ik begonnen met programmeren. Het is de bedoeling om hem gewoon recht door te laten rijden en als hij dan botst moet ie een paar seconden omkeren. Dat lukte niet meteen en daarom heb ik het opnieuw gedaan op een andere manier met de LEDs. Als hij aangaat gaat de statusled rood branden, als je een knop indrukt wordt die groen en als je hem loslaat blijft hij dat nog even om later weer rood te worden. Dat is deze code:
#include "asuro.h"

int main(void)
{
Init();
unsigned int teller;
while (1) {

do
{StatusLED(RED);}
while (PollSwitch()==0);

StatusLED(GREEN);
teller = 0;
while (teller < 1000) {
Sleep(255);
teller ++;
}
}
while(1);
return 0;
}

Je zou zeggen: vervang die led dingen door motor commando's en klaar is kees! Maar als je dat doet en de robot aan zet blijft de robot zonder de knoppen aan te raken meteen hangen in de 'groene led modus' en hij rijdt dus nooit vooruit..

PS: Ik heb al geprobeerd te posten op het forum van Arexx maar dat is zo dood als een pier :( En ik weet dat er hier mensen zitten die ook een Asuro hebben, vandaar dat ik het hier plaats.

Acties:
  • 0 Henk 'm!

  • Avar
  • Registratie: Mei 2010
  • Laatst online: 09-10 15:22
Aangezien je nog geen reply hebt wil ik wel een poging wagen. Geen ervaring met Asuro maar wel met microcontrollers en programmeren in het algemeen, dus wie weet.
Werkt de code wel met de led commando's? Zo ja, dan zou je de led commando's er in kunnen laten staan in plaats van ze te vervangen door motor commando's, dan kan je zien of hij inderdaad gelijk naar groen gaat of dat je mischien iets geks doet in de aansturing van de motoren.

Er vallen me trouwens ook een paar dingen op in de code:
- StatusLED(RED); voorzien van { }, {StatusLED(GREEN); niet?
- de onderste while(1), waarom?

Acties:
  • 0 Henk 'm!

  • koffieprutser
  • Registratie: Mei 2010
  • Laatst online: 09-10 18:03
Avar schreef op vrijdag 12 augustus 2011 @ 20:18:
Er vallen me trouwens ook een paar dingen op in de code:
- StatusLED(RED); voorzien van { }, {StatusLED(GREEN); niet?
- de onderste while(1), waarom?
statusLED(RED); zit in de do while loop van 'vooruit rijden' die de hele tijd checkt of hij nog niet is ingedrukt, als de knop wordt ingedrukt gaat ie dus meteen uit die loop, voert dat eronder uit en dan gaat ie weer opnieuw omdat alles in een loop staat.

die onderste while is gewoon uit de voorbeeldcode en daar komt ie in principe niet, die kan idd weg :)

Het is trouwens C.

Ik heb dat wat jij zegt ook geprobeerd en dan zie je dat hij de hele tijd in groen blijft hangen als de motordingen erbij staan. Ook heb ik hiervoor iets geschreven wat hierop leek, maar dan zonder de pauze na het terugrijden/groene led commando. Dat werkte dan wel weer... maar dat is natuurlijk waardeloos omdat dan zodra hij terugrijdt en de knop los is meteen weer vooruit rijdt :9

edit: Het is trouwens ook niet de combinatie pauze-motortjes,want alleen dat werkt wel. Waardoor je zou kunnen concluderen dat de motortjes de detectie van de schakelaars storen, wat niet heel onwaarschijnlijk is omdat hij met motortjes in dit programma heeeeel af en toe weer een fractie van een seconde in de vooruit/rode led stand gaat.

[ Voor 14% gewijzigd door koffieprutser op 13-08-2011 00:03 ]


Acties:
  • 0 Henk 'm!

  • Avar
  • Registratie: Mei 2010
  • Laatst online: 09-10 15:22
Ja, ik zat ook al te denken aan een storing van de schakelaar detectie door de motortjes, dus heb ik het schema er maar even bijgepakt. Ze hebben 6 schakelaars op een AD ingang gezet, dus als je spanning een beetje fluctueert doordat de motortjes draaien dan kan je inderdaad wel een valse detectie verwachten.
Ik zou je programma zo uitbreiden dat je een aantal keer op pollswitch() controleert, bijvoorbeeld met
code:
1
2
3
4
5
6
7
teller = 0;
while (teller < 10)
{
   if (pollswitch>0) {teller++;}
   else {teller = 0;}
}
teller = 0;

Waarbij die 10 natuurlijk willekeurig gekozen is, ik weet niet hoe lang die routine pollswitch() er over doet, maar daar moet je maar een beetje mee experimenteren.
Je kan ook als test de meest storingsgevoelige schakelaar er uit gooien door (pollswitch() > 0) te vervangen door (pollswitch() > 1) of zelfs (pollswitch() > 2). Genoeg om weer eens mee te spelen denk ik ;)

Acties:
  • 0 Henk 'm!

  • koffieprutser
  • Registratie: Mei 2010
  • Laatst online: 09-10 18:03
dat met die meerdere checks van je is me (nog) niet helemaal gelukt of het werkt niet, maar ik heb dat met meerdere knopjes gedaan en het werkt!
#include "asuro.h"

int main(void)
{
Init();
unsigned int teller;
while (1) {

while (PollSwitch()<32){
StatusLED(RED);
MotorDir (FWD,FWD);
MotorSpeed (130,140);}

StatusLED(GREEN);
MotorDir (RWD,RWD);
MotorSpeed (180,110);
teller = 0;
while (teller < 1000) {
Sleep(255);
teller ++;
}
}
while(1);
return 0;
}

dat 32 betekent 3 knopjes, volgens mij is 2 knopjes dan 8 of 16. Maar dit werkt iig goed :)

ik weet iig zeker dat het aan die motortjes ligt en de spanning die ze jatten (of zoiets), ik zette net de motortjes op lagere snelheden en toen werkte het wel, maar dan staan ze zo traag dat ze niet draaien maar piepen...

[ Voor 14% gewijzigd door koffieprutser op 14-08-2011 19:11 ]


Acties:
  • 0 Henk 'm!

  • koffieprutser
  • Registratie: Mei 2010
  • Laatst online: 09-10 18:03
Okee, ik heb eindelijk een simpele maar effectieve oplossing:
na het vooruitrijcommando zit een kleine pauze zodat hij een heeeeel klein stukje vooruit rijdt, dan stopt ie de motortjes even, dan kan er weer worden gecheckt, en dan kan ie weer een klein stukje rijden (3ms :P).
#include "asuro.h"

int main(void)
{
Init();
unsigned int teller;
while (1) {

while (PollSwitch()<1){
StatusLED(RED);
MotorDir (FWD,FWD);
MotorSpeed (140,150);
Sleep(255);
MotorSpeed (0,0);
Sleep(55);
}

StatusLED(GREEN);
MotorDir (RWD,RWD);
MotorSpeed (100,200);
teller = 0;
while (teller < 300) {
Sleep(255);
teller ++;
}
MotorSpeed (0,0);
Sleep(255);
}
while(1);
return 0;
}

Acties:
  • 0 Henk 'm!

  • Avar
  • Registratie: Mei 2010
  • Laatst online: 09-10 15:22
dat met die meerdere checks van je is me (nog) niet helemaal gelukt of het werkt niet...
Het zo kunnen dat de boel zodaning verstoord wordt door de draaiende motortjes dat er constant een schakelaar gemeten wordt, dan gaat de truuk natuurlijk niet op.
dat 32 betekent 3 knopjes, volgens mij is 2 knopjes dan 8 of 16. Maar dit werkt iig goed :)
Voor zover ik de documentatie begrijp zijn het bitjes in het antwoord van Pollswitch:

Schakelaar 1: 1 (00000001)
Schakelaar 2: 2 (00000010)
Schakelaar 3: 4 (00000100)
Schakelaar 4: 8 (00001000)
Schakelaar 5: 16 (00010000)
Schakelaar 6: 32 (00100000)

32 is dus schakelaar 6, 34 schakelaar 2 en 6 (00100010) enz.
Pagina: 1