Serial Communication - Too Slow??
I have a relatively sophisticated setup with a BS2e and an Arduino (ATmega168). The BS2e is communicating to a hacked Roomba, while receiving data from the Arduino regarding servo position, and readings from an IR sensor, and then making decisions based on the data. The robot that I have put together with this setup, so far, is extremely (mentally) slow. The BS2e can't catch up, it seems, to obtain the servo and IR sensor data, fast enough so that it get get the full resolution of the revolutions of the servo (yes, you may need to read that again), and every IR reading between one pule of the servo (this is a standard hobby servo). So, the data that the BS2e sees is a little 'late', meaning that data was from a couple milliseconds ago, and that's too slow. So, if there's an object really far in front of the IR sensor, then the robot will see it and turn, but if it's too close, then it will trigger the bumper switch on the Roomba. The robot will then act a few milliseconds later, but not fast enough so that right when the bumper touches the wall/plany/etc., it turns away; even then it will still be pushing against the object for a reasonable amount of time. The reason why I have a BS2e and an Arduino together is for ease of use. The Arduino has an A/D converter, and can do tasks that the BS2e can't, and the BS2e has features that the Arduino can't muster. So I thought I'd combine them; it's easier. But how can I speed this robot up? I know Parallax does not support the Arduino, but maybe someone that knows about C code can help? I mean, all these programming languages have SOMETHING in common. Below is the BS2e code.
And here's the Arduino code:
▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔
Giggly Googley!
Post Edited (NoBo780) : 3/3/2008 3:15:31 AM GMT
' {$STAMP BS2e}
' {$PBASIC 2.5}
DD PIN 13 ' blue
RXD PIN 14 ' orange
TXD PIN 15 ' green
LED PIN 8
LSRB PIN 2
LSRF PIN 1
INPUT TXD
ARX PIN 1 ' data in from Arduino
BAUDFAST CON 32 ' 19,200 bps
BAUDMED CON 84 ' 9,600 bps
BAUDSLOW CON 396 ' 2,400 bps
R_START CON 128
R_BAUD CON 129
R_CONTROL CON 130
R_FULL CON 132
R_POWER CON 133
R_SPOT CON 134
R_CLEAN CON 135
R_DRIVE CON 137
R_MOTORS CON 138
R_SONG CON 140
R_PLAY CON 141
R_SENSORS CON 142
SENS_BUMPWHEEL VAR Byte
SENS_WALL VAR Bit
SENS_CLIFF_L VAR Bit
SENS_CLIFF_FL VAR Bit
SENS_CLIFF_FR VAR Bit
SENS_CLIFF_R VAR Bit
SENS_VWALL VAR Bit
SENS_MOTOROVER VAR Byte
SENS_DIRT_L VAR Byte
SENS_DIRT_R VAR Byte
i VAR Byte
BUMP_RIGHT VAR SENS_BUMPWHEEL.BIT0
BUMP_LEFT VAR SENS_BUMPWHEEL.BIT1
WHEELDROP_C VAR SENS_BUMPWHEEL.BIT4
WHEELDROP_L VAR SENS_BUMPWHEEL.BIT3
WHEELDROP_R VAR SENS_BUMPWHEEL.BIT2
MOTOROVER_L VAR SENS_MOTOROVER.BIT4
MOTOROVER_R VAR SENS_MOTOROVER.BIT3
IRVAL VAR Byte(3)
PULSES VAR Word
LOW DD
PAUSE 100
HIGH DD
PAUSE 2000
FOR i = 1 TO 3
LOW DD
LOW LED
PAUSE 250
HIGH DD
HIGH LED
PAUSE 250
NEXT
SEROUT RXD, BAUDFAST, [noparse][[/noparse]R_START]
PAUSE 100
SEROUT RXD, BAUDFAST, [noparse][[/noparse]R_BAUD, 3] ' 3 == 2400 bps
PAUSE 100
SEROUT RXD, BAUDSLOW, [noparse][[/noparse]R_START]
PAUSE 100
SEROUT RXD, BAUDSLOW, [noparse][[/noparse]R_CONTROL]
PAUSE 100
Main:
DEBUG "at the top", CR
GOSUB Update_Sensors
IF BUMP_RIGHT THEN
GOSUB Spin_Left
PAUSE 1000
ELSEIF BUMP_LEFT THEN
GOSUB Spin_Right
PAUSE 1000
ENDIF
GOSUB Go_Forward
PAUSE 100
GOTO Main
Update_Sensors:
DEBUG "update sensors",CR
SEROUT RXD, BAUDSLOW, [noparse][[/noparse]R_SENSORS, 1]
SERIN TXD, BAUDSLOW, 2000, No_Data,
[noparse][[/noparse]SENS_BUMPWHEEL,SENS_WALL,
SENS_CLIFF_L,SENS_CLIFF_FL,SENS_CLIFF_FR,SENS_CLIFF_R,
SENS_VWALL,SENS_MOTOROVER,SENS_DIRT_L,SENS_DIRT_R]
Read_IR:
DEBUG "reading IR",CR
SERIN ARX,BAUDMED,[noparse][[/noparse]WAIT("PULSE"),DEC4 PULSES]
IF PULSES > 1300 AND PULSES < 1500 THEN
SERIN ARX,BAUDMED,[noparse][[/noparse]WAIT("IR"),DEC4 IRVAL]
IF IRVAL > 200 THEN
GOSUB Spin_Right
ENDIF
ELSEIF PULSES > 1500 AND PULSES < 1700 THEN
SERIN ARX,BAUDMED,[noparse][[/noparse]WAIT("IR"),DEC4 IRVAL]
IF IRVAL > 200 THEN
GOSUB Spin_Right
ENDIF
ELSEIF PULSES > 1700 AND PULSES < 1900 THEN
SERIN ARX,BAUDMED,[noparse][[/noparse]WAIT("IR"),DEC4 IRVAL]
IF IRVAL > 200 THEN ' detected middle
GOSUB Spin_Right
ENDIF
ELSEIF PULSES > 1900 AND PULSES < 2100 THEN
SERIN ARX,BAUDMED,[noparse][[/noparse]WAIT("IR"),DEC4 IRVAL]
IF IRVAL > 200 THEN
GOSUB Spin_Left
ENDIF
ELSEIF PULSES > 2100 AND PULSES < 2300 THEN
SERIN ARX,BAUDMED,[noparse][[/noparse]WAIT("IR"),DEC4 IRVAL]
IF IRVAL > 200 THEN
GOSUB Spin_Left
ENDIF
ENDIF
DEBUG "pulses",CR
DEBUG DEC4 PULSES
DEBUG "ir",CR
DEBUG DEC4 IRVAL
RETURN
No_Data:
DEBUG "no data!",CR
RETURN
Done:
PAUSE 1000
SEROUT RXD, BAUDSLOW, [noparse][[/noparse]R_POWER] ' turn off
STOP
Spin_Left:
SEROUT RXD, BAUDSLOW, [noparse][[/noparse]R_DRIVE,$00,$c8,$00,$01]
RETURN
Spin_Right:
FOR i = 1 TO 10
SEROUT RXD, BAUDSLOW, [noparse][[/noparse]R_DRIVE,$00,$c8,$ff,$ff]
NEXT
RETURN
Go_Forward:
SEROUT RXD, BAUDSLOW, [noparse][[/noparse]R_DRIVE,$00,$c8,$80,$00]
RETURN
Go_Stop:
SEROUT RXD, BAUDSLOW, [noparse][[/noparse]R_DRIVE,$00,$00,$00,$00]
RETURN
And here's the Arduino code:
int servoPin = 3;
int irPin = 0;
int val = 0;
int pulses;
void setup() {
Serial.begin(9600);
pinMode(servoPin, OUTPUT);
}
void loop()
{
if(pulses >= 2300)
{ pulses = 2300;
do
{
pulses = pulses - 50;
digitalWrite(servoPin, HIGH);
delayMicroseconds(pulses);
digitalWrite(servoPin, LOW);
delay(20);
readir();
} while(pulses >= 1300);
}
else if(pulses <= 1300)
{ pulses = 1300;
do
{
pulses = pulses + 50;
digitalWrite(servoPin, HIGH);
delayMicroseconds(pulses);
digitalWrite(servoPin, LOW);
delay(20);
readir();
} while(pulses <= 2300);
}
}
void readir()
{
val = analogRead(irPin);
//delay(5);
Serial.println("PULSE");
delay(5);
Serial.println(pulses);
delay(5);
Serial.println("IR");
delay(5);
Serial.println(val);
}
▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔
Giggly Googley!
Post Edited (NoBo780) : 3/3/2008 3:15:31 AM GMT

Comments
▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔
Giggly Googley!
I really think you need to use a Propeller. It can do the servo(s), ADC, and multiple serial interfaces and have plenty of processing power for the actual work of navigation.
▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔
Giggly Googley!