arduino project almost working

For the discussion of Arduino related topics.

Moderator: phalanx

arduino project almost working

Postby Jeeptronics » Wed Apr 19, 2017 8:53 pm

I am building a controller for the automatic transmission in my rock crawler. the intention is to provide full manual control of the 4 forward gears. I have the controller shifting the gears as it needs to. i just need to add a neutral feature using an input pin. I have a bit of code written but it is not working correctly.
Code: Select all
int gear = 1;
// output pins for transistor controlled solenoids
int solA = 7;
int solB = 6;
// input pins for up down /  with pullup resistors
int gearup = 9;
int geardown = 10;
// input pin for neutral safety switch(nss)
int nss = 8;



void setup() {
   pinMode(solA, OUTPUT);
   pinMode(solB, OUTPUT);
   pinMode(gearup, INPUT);
   pinMode(geardown, INPUT);
   pinMode(nss, INPUT_PULLUP);
}

void loop() {
   
   
   // intention is when nss pin 8 is high it will show GEAR 4 when the shift lever is in park, reverse or neutral the soleniod state for gear 4 serves as a neutral.
 //I cannot make this feature work!!!
   if (nss == HIGH) {
      digitalWrite(solA, 0);
      digitalWrite(solB, 0);
   }   
//intention is when nss is pulled low by placing the shift leever into drive thus grounding pin 8 it will start in first gear
// i cannot make this work!!
  if (nss == LOW) {
    digitalWrite(solA, 1);
    digitalWrite(solB, 0);
  }
   
   
   //this section works as it should
   if (gear == 1) {
      digitalWrite(solA, 1);
      digitalWrite(solB, 0);
      
   }
   if (gear == 2) {
      digitalWrite(solA, 1);
      digitalWrite(solB, 1);
      
      
   }
   if (gear == 3) {
      digitalWrite(solA, 0);
      digitalWrite(solB, 1);
   }
   if (gear == 4) {
      digitalWrite(solA, 0);
      digitalWrite(solB, 0);
   }
   
   //takes care of gear switching
   
   delay(180);//delay to prevent going through gears too quick from holding the button or pressing too long
   
   
   gear += digitalRead(geardown) - digitalRead(gearup); // non debounced! But may not be a problem because of the delay by gear change
   if (gear < 1) gear = 1;
      if (gear > 4) gear = 4;
         //limits to actual gearset
   
   
}




please advise me on how to make the neutral safety switch active in this code.
Jeeptronics
 
Posts: 2
Joined: Wed Apr 19, 2017 8:19 pm

Re: arduino project almost working

Postby lyndon » Thu Apr 20, 2017 11:16 am

First, a few comments on structure. I would make the pin definitions either #define or const int to indicate that they should never change. I'd also make them all uppercase as this is pretty much a de facto indication of a constant in the C/C++ world.

Next, the bug is that you are never updating "nss" You check it, but it's never initialized to anything. i.e., this
Code: Select all
if (nss == LOW) {
    digitalWrite(solA, 1);
    digitalWrite(solB, 0);
  }


Should be
Code: Select all
if (digitalRead(nss) == LOW)
{
    digitalWrite(solA, HIGH);
    digitalWrite(solB, LOW);
}
else
{
    ????
    Probably want your gear switching code here
}
lyndon
Support Volunteer
 
Posts: 1502
Joined: Thu Jul 17, 2008 6:37 pm
Location: Minnesota, USA

Re: arduino project almost working

Postby Valen » Fri Apr 21, 2017 4:01 pm

[quote]Next, the bug is that you are never updating "nss" You check it, but it's never initialized to anything. i.e., this[quote]I'm agreeing on how the code should be different. But "the bug" is of a different kind then you explain. Imho, the bug is a misunderstanding of how to read GPIO pins and comparing it with low or high states. "nss" is defined as a variable, and according to the comments meant as a pin number (constant). But his error is in thinking that nss==LOW means the same as 'is the pin-state of nss equal to LOW?'. It actually means "is 8 equal to LOW" or "is 8 equal to 0". 8 is never equal to 0. Never equal to HIGH (1) either. The same goes for "gear".

Jeeptronics, please consult the documentation on digitalRead how to read digital pin states and assign a variable to that.
https://www.arduino.cc/en/Reference/digitalRead
Valen
Support Volunteer
 
Posts: 1553
Joined: Wed Dec 22, 2010 2:05 am

Re: arduino project almost working

Postby Jeeptronics » Fri Apr 21, 2017 7:07 pm

Thank you for the suggestions! I was able to get the controller working correctly.
Jeeptronics
 
Posts: 2
Joined: Wed Apr 19, 2017 8:19 pm

Re: arduino project almost working

Postby lyndon » Mon Apr 24, 2017 1:48 pm

Valen wrote:
Next, the bug is that you are never updating "nss" You check it, but it's never initialized to anything. i.e., this
I'm agreeing on how the code should be different. But "the bug" is of a different kind then you explain. Imho, the bug is a misunderstanding of how to read GPIO pins and comparing it with low or high states. "nss" is defined as a variable, and according to the comments meant as a pin number (constant). But his error is in thinking that nss==LOW means the same as 'is the pin-state of nss equal to LOW?'. It actually means "is 8 equal to LOW" or "is 8 equal to 0". 8 is never equal to 0. Never equal to HIGH (1) either. The same goes for "gear".

Jeeptronics, please consult the documentation on digitalRead how to read digital pin states and assign a variable to that.
https://www.arduino.cc/en/Reference/digitalRead


Yes, that's a much clearer way of explaining what I was trying to say :-)
lyndon
Support Volunteer
 
Posts: 1502
Joined: Thu Jul 17, 2008 6:37 pm
Location: Minnesota, USA


Return to Arduino

Who is online

Users browsing this forum: No registered users and 2 guests