Danke für deine Antwort,
ich habe jetzt zwei programme geschrieben ,allerdings ohne gyro und ich weiss nicht genau wie und was ich integrieren kann um die Daten vom Gyro auszulesen und zum andern Asuro zu senden ??
//Der Master-ASURO soll nach dem Einschalten einen Meter vor und zurückfahren und sendet ständig das Signal an den Slave-ASURO. Wenn der ASURO-Slave in der Nähe(im Piconetz) ist, dann kann er das Signal empfangen und dreht sich im Kreis. Sobald der Master ausgeht oder nicht mehr in Reichweite ist, stoppt der ASURO-Slave sich bewegen und macht nach zwei Sekunden macht er eine Halbkreis Drehung und bleibt dann Stehen. Der Programmablauf wiederholt sich wenn man den ASURO-Master wieder eingeschalte//
Das Programmteil für den ASURO-Master:
Code:
#include "asuro.h"
#include "myasuro.h"
void fahren (
int distance,
int speed)
{
unsigned long enc_count;
int tot_count = 0;
int diff = 0;
int l_speed = speed, r_speed = speed;
/* stop the motors until the direction is set */
MotorSpeed (0, 0);
/* if distance is NOT zero, then take this value to go ... */
if (distance != 0)
{
/* calculate tics from mm */
enc_count = abs (distance) * 10000L;
enc_count /= MY_GO_ENC_COUNT_VALUE;
if (distance < 0)
MotorDir (RWD, RWD);
else
MotorDir (FWD, FWD);
}
EncoderSet (0, 0);
/* now start the machine */
MotorSpeed (l_speed, r_speed);
while (tot_count < enc_count)
{
SerPrint("C\n\r");
tot_count += encoder [LEFT];
diff = encoder [LEFT] - encoder [RIGHT];
if (diff > 0)
{ /* Left faster than right */
if ((l_speed > speed) || (r_speed > 244))
l_speed -= 10;
else
r_speed += 10;
}
if (diff < 0)
{ /* Right faster than left */
if ((r_speed > speed) || (l_speed > 244))
r_speed -= 10;
else
l_speed += 10;
}
/* reset encoder */
EncoderSet (0, 0);
MotorSpeed (l_speed, r_speed);
Msleep (1);
}
MotorDir (BREAK, BREAK);
}
void fahren2 (
int distance,
int speed)
{
unsigned long enc_count;
int tot_count = 0;
int diff = 0;
int l_speed = speed, r_speed = speed;
/* stop the motors until the direction is set */
MotorSpeed (0, 0);
/* if distance is NOT zero, then take this value to go ... */
if (distance != 0)
{
/* calculate tics from mm */
enc_count = abs (distance) * 10000L;
enc_count /= MY_GO_ENC_COUNT_VALUE;
if (distance < 0)
MotorDir (RWD, RWD);
else
MotorDir (FWD, FWD);
}
/* ... else take the value degree for a turn */
else
{
/* calculate tics from degree */
enc_count = abs (degree) * MY_TURN_ENC_COUNT_VALUE;
enc_count /= 360L;
if (degree < 0)
MotorDir (RWD, FWD);
else
MotorDir (FWD, RWD);
}
/* reset encoder */
EncoderSet (0, 0);
/* now start the machine */
MotorSpeed (l_speed, r_speed);
while (tot_count < enc_count)
{
SerPrint("V\n\r");
tot_count += encoder [LEFT];
diff = encoder [LEFT] - encoder [RIGHT];
if (diff > 0)
{ /* Left faster than right */
if ((l_speed > speed) || (r_speed > 244))
l_speed -= 10;
else
r_speed += 10;
}
if (diff < 0)
{ /* Right faster than left */
if ((r_speed > speed) || (l_speed > 244))
r_speed -= 10;
else
l_speed += 10;
}
/* reset encoder */
EncoderSet (0, 0);
MotorSpeed (l_speed, r_speed);
Msleep (1);
}
MotorDir (BREAK, BREAK);
}
int main (void)
{
Init();
EncoderInit();
unsigned char senden, abfang;
unsigned char taste, taste2;
int i = 0;
senden = 0; // sende-Variable auf null setzen
while(1) {
fahren(1000,0,180);
fahren2(-1000,0,180);
Msleep(200);
}
return 0;
}
Das Programm für den ASURO -Slave:
Code:
#include "asuro.h"
#include "myasuro.h"
void rechts (
int distance,
int degree,
int speed)
{
unsigned long enc_count;
int tot_count = 0;
int diff = 0;
int l_speed = speed, r_speed = speed;
/* stop the motors until the direction is set */
MotorSpeed (0, 0);
/* if distance is NOT zero, then take this value to go ... */
if (distance != 0)
{
/* calculate tics from mm */
enc_count = abs (distance) * 10000L;
enc_count /= MY_GO_ENC_COUNT_VALUE;
if (distance < 0)
MotorDir (RWD, RWD);
else
MotorDir (FWD, FWD);
}
/* ... else take the value degree for a turn */
else
{
/* calculate tics from degree */
enc_count = abs (degree) * MY_TURN_ENC_COUNT_VALUE;
enc_count /= 360L;
if (degree < 0)
MotorDir (RWD, FWD);
else
MotorDir (FWD, RWD);
}
/* reset encoder */
EncoderSet (0, 0);
/* now start the machine */
MotorSpeed (l_speed, r_speed);
while (tot_count < enc_count)
{
tot_count += encoder [LEFT];
diff = encoder [LEFT] - encoder [RIGHT];
if (diff > 0)
{ /* Left faster than right */
if ((l_speed > speed) || (r_speed > 244))
l_speed -= 10;
else
r_speed += 10;
}
if (diff < 0)
{ /* Right faster than left */
if ((r_speed > speed) || (l_speed > 244))
r_speed -= 10;
else
l_speed += 10;
}
/* reset encoder */
EncoderSet (0, 0);
MotorSpeed (l_speed, r_speed);
//Msleep (1);
}
}
int main (void)
{
Init();
EncoderInit();
unsigned char senden;
while(1)
{
SerRead(&senden, 1,0); // ein Zeichen empfangen
if(senden == 'C'){
GoTurn(0,360,150);
BackLED(ON,ON);
}
else if(senden == 'V'){
GoTurn(0,-360,150);
BackLED(OFF,OFF);
StatusLED(YELLOW);
}
}
return 0;
}
Lesezeichen