Howdy. My team and I have been working on a remote controlled kart for school that we essentially inherited from another team. It hasn't been responding well to the RC controls in forward mode, but, weirdly, does pretty good in reverse. I can't begin to explain why it would work better in one direction as none of us are well-versed in electronics. But based on some reading I'm beginning to suspect it's a grounding issue: nothing is grounded to the aluminum and steel kart itself. I have the schematic here, but I wanted to see if anyone had some input before I just started running wires from everything labeled "GND" to a common ground point on the chassis. Is there a simpler way to do it? Does anything else about this jump out at you? Thank you for your time.
Please post the code that you are using following the advice given in the link below when posting code
Oh, sorry. I assumed it was more a question of ground, so I didn't think it was necessary. But I suppose it could be code, too. Here it is:
#define MTR 5 //motor right
#define MTL 6 //motor left
#define DIR_R 7 //right direction
#define DIR_L 8 //left direction
#define FWD LOW
#define RVS HIGH
void setup() {
pinMode(10,INPUT); //Channel 1 (steer)
pinMode(11,INPUT); //Channel 3 (throttle)
pinMode(9,INPUT); //Channel 5 (direction)
pinMode(MTR,OUTPUT);
pinMode(MTL,OUTPUT);
pinMode(FWD,OUTPUT);
pinMode(RVS, OUTPUT);
Serial.begin(9600);
}
int steer; //steering number
int throttle; //throttle number
int pwm = 0; // pwm number
int fwd = 1 ;
int direc = analogRead(A0);
void speedFunct(){
//full power
if(pwm >= 250){
analogWrite(MTR,255);
analogWrite(MTL,255);
}
//no power
else if(pwm <= 0){
analogWrite(MTR,0);
analogWrite(MTL,0);
}
//percentage of power (duty cycle)
else{
analogWrite(MTR,pwm);
analogWrite(MTL,pwm);
}
}
void steerFunct(){
//drive straight
if(1450 < steer < 1550){
if(fwd == 1){
digitalWrite(DIR_R, FWD);
digitalWrite(DIR_L, FWD);
}
else{
digitalWrite(DIR_R, RVS);
digitalWrite(DIR_L, RVS);
}
speedFunct();
delay(5);
}
//steer right
if(steer >= 1550){
digitalWrite(DIR_R, RVS);
digitalWrite(DIR_L, FWD);
speedFunct();
delay(5);
}
//steer left
if(steer <= 1450){ // 1400
digitalWrite(DIR_R, FWD);
digitalWrite(DIR_L, RVS);
speedFunct();
delay(5);
}
}
void loop() {
//Pin setup
steer = pulseIn(10, HIGH, 250000);
throttle = pulseIn(11, HIGH, 250000);
direc = pulseIn(9, HIGH, 250000);
Serial.println(throttle);
Serial.println(steer);
/***Direction control***/
//Forward
if(direc <= 1000){
analogWrite(DIR_R, FWD);
analogWrite(DIR_L, FWD);
pwm = map(throttle, 990, 1983 ,0 ,255);
fwd = 1;
steerFunct();
delay(5);
Serial.print("Direction: ");
Serial.println("Forward");
Serial.println("\n");
}
//Reverse
if(direc >= 1900){
digitalWrite(DIR_R, RVS);
digitalWrite(DIR_L, RVS);
pwm = map(throttle, 990, 1983 ,0 ,255);
fwd = 0;
steerFunct();
delay(5);
Serial.print("Direction: ");
Serial.println("Reverse");
Serial.println("\n");
}
//Dead Zone(No movement)
if(1400 < direc && direc < 1500){
//pwm = 0;
//speedFunct();
digitalWrite(MTR, LOW);
digitalWrite(MTL,LOW);
delay(5);
Serial.print("Direction: ");
Serial.println("Stop");
Serial.println("\n");
}
delay(5);
}
There are problems with your code which may or may not cause the problem that you describe
For instance
if (1450 < steer < 1550)
is not the way to test whether a variable is within a range. It should be
if (1450 < steer && steer < 1550)
Personally I prefer
if (steer > 1450 && steer < 1550)
as I find it easier to read, but there are reasons to do it the first way
Thank you for that, UKHeliBob. Perhaps. I'd rather not touch that until I rule out the grounding issues as I'm fairly certain it's something that needs to be done, regardless. I made a mock up of what I think I'd like to do (in green).
Am I putting any of the components in danger? Is grounding both sides of the motor driver unnecessary?
It is wrong. Fix it now and be done with it
Turns out it was RFI. Not code or grounding related. Thanks anyway.
I take it that you fixed the problem with the sketch
If you're talking about the schematic, I don't know what you're referring to. If you're talking about the code, no - I'm hoping to make bigger changes to it now, anyway.
Have you fixed
if (1450 < steer < 1550)
It wasn't necessary to solve my previous problem, but I'll certainly see about it in my next code change.
This topic was automatically closed 120 days after the last reply. New replies are no longer allowed.