I have been trying to build a paddle shifter for a vehicle I have been playing with. Im sure that is ill advised etc. but I have a weird situation I have been having trouble getting my actuator to move when told and when it does move it sure as hell dont want to stop where its told. By itself the actuator part of script works perfect 100 percent but when its all put together it does not want to recognize the goalPosition I am trying to relay. I finally have it working as of now but I cant figure out why. In the Loop lines 197 and 203. If I dont have some type of serial.print there the actuator will not move doesnt matter if its nuclear launch codes or transcripts from "green eggs and ham" if there is no print there it completely ignores the goalPosition. Any thoughts? I am pretty new at this only since about the first of the year. But I usually try to copy off knowledgable sources. I appologize if my script is a little all over the place I have been trying different approaches to get it going. I hope I get this markdown inserted correctly so I dont waste half the day getting yelled at for it.
#define NUM_FWD_GEARS 8 //# number of forward speeds
#define BUTTON_READ_INTERVAL 50ul //mS time between up/down button reads
#define NO_PRESS 0x00 //mask bit mask for no buttons pressed
#define BUTTON_UP_PRESSED 0x01 //mask bit mask for up button pressed
#define BUTTON_DOWN_PRESSED 0x02 //mask bit mask for down button pressed
#define TCC_DELAY 1000ul //mS after TCC is enabled, time delay before activation
const byte buttonUP = A0; //pin Push Button for UP shift
const byte buttonDOWN = A3; //pin Push Button for Down shift
const byte switchTOWMODE = 7; //pin Switch for tow/haul mode
const byte solA = 9; //pin Solenoid A output
const byte solB = 10; //pin Solenoid B output
const byte TCC = 11; //pin TCC output
const int relay1 = 7; // extend relay output pin connection
const int relay2 = A5; // retract relay output pin connection
const int HALL0 = 3; // interupt pin connection - See attachInterrupt() docs for your board
const byte MPS = A4;
volatile int counter = 0;
int counterState = 0; // current state of the button
int lastButtonState = 0; // previous state of the button
int buttonState;
long lastDebounce0 = 0;
long debounceDelay = 10; // Ignore bounces under 10ms
int CurrentPosition = 0;
volatile int goalPosition = 0;
boolean Extending = false;
boolean Retracting = false;
void actuatorExtend(){
digitalWrite(relay1, HIGH); // Always turn one off and then the other on
digitalWrite(relay2, LOW); // so that there are never two relays on (BIG!)
}
void actuatorRetract(){
digitalWrite(relay2, HIGH); // Always turn one off and then the other on
digitalWrite(relay1, LOW); // so that there are never two relays on (BIG!)
}
void actuatorStop() {
digitalWrite(relay2, HIGH);
digitalWrite(relay1, HIGH);
}
byte
gearSelection,
lastGearSelection,
lastUp,
lastDn,
lastTM;
bool
bTCCStatus;
unsigned long
timeTCCSolenoid;
typedef struct structGearSolenoidProfiles
{
byte name;
//byte goalPosition;
//byte solenoid_A;
//byte solenoid_B;
//byte TC;
} sGearSolenoidProfiles;
//
const sGearSolenoidProfiles GearSolenoidProfiles[NUM_FWD_GEARS] =
{
{
.name = 1,
// .goalPosition = 0,
// .solenoid_A = LOW,
//.solenoid_B = LOW,
},
{
.name = 2,
// .goalPosition = 200,
// .solenoid_A = LOW,
// .solenoid_B = HIGH,
},
{
.name = 3,
// .goalPosition = 300,
// .solenoid_A = HIGH,
// .solenoid_B = LOW,
},
{
.name = 4,
// .goalPosition = 400,
// .solenoid_A = LOW,
// .solenoid_B = HIGH,
},
{
.name = 5,
// .goalPosition = 400,
// .solenoid_A = HIGH,
// .solenoid_B = HIGH,
},
{
.name = 6,
// .goalPosition = 400,
// .solenoid_A = HIGH,
// .solenoid_B = LOW,
},
{
.name = 7,
/// .goalPosition = 400,
// .solenoid_A = LOW,
// .solenoid_B = LOW,
},
{
.name = 8,
// .goalPosition = 400,
// .solenoid_A = HIGH,
// .solenoid_B = LOW,
// .TC= HIGH,
}
};//GearSolenoidProfiles[]
void setup()
{
pinMode( buttonUP, INPUT_PULLUP );
lastUp = digitalRead( buttonUP ); //set initial button state
pinMode( buttonDOWN, INPUT_PULLUP );
lastDn = digitalRead( buttonDOWN ); //set initial button state
pinMode( switchTOWMODE, INPUT_PULLUP );
pinMode(MPS,INPUT_PULLUP);
pinMode( solA, OUTPUT ); //Solenoid A set as output
pinMode( solB, OUTPUT ); //Solenoid B set as output
pinMode( TCC, OUTPUT ); //TCC set as output
digitalWrite( solA, HIGH ); //set intital state as off
digitalWrite( solB, HIGH);
digitalWrite( TCC, LOW );
//internal flag for TCC status
bTCCStatus = false;
gearSelection = 0; //start in "1st" gear for this test
lastGearSelection = 0xff; //ensure we change into correct gear first pass by making last != current
Serial.begin(9600);
pinMode(HALL0, INPUT_PULLUP); // hall is an input
attachInterrupt(digitalPinToInterrupt (3), trigger0, CHANGE); // See attachInterrupt() doc for YOUR BOARD
// Set both output pins
pinMode(relay1, OUTPUT);
pinMode(relay2, OUTPUT);
digitalWrite(relay2, HIGH);
digitalWrite(relay1, HIGH);
}
void loop() {
trigger0();
Gear_Selection_Control();
Gear_Solenoid_Control();
TCC_Control();
// Serial.print(CurrentPosition);
// if (Extending == true && CurrentPosition > (GearSolenoidProfiles[gearSelection].goalPosition )) {
// //we have reached our goal, shut the relays off
// actuatorStop();
// Extending = false;
// //Serial.println(CurrentPosition);
// }
// if (Retracting == true && CurrentPosition < (GearSolenoidProfiles[gearSelection].goalPosition )) {
// //we have reached our goal, shut the relay off
// actuatorStop();
// Retracting = false;
// // Serial.println(HALL0);
// }
if (CurrentPosition < goalPosition ) {
Retracting = false;
Extending = true;
actuatorExtend ();
Serial.print("actuator");
}
else if (CurrentPosition == goalPosition ) {
actuatorStop();
Retracting = false;
Extending = false;
Serial.print(goalPosition);
}
if (CurrentPosition > goalPosition) {
Retracting = true;
Extending = false;
actuatorRetract();
Serial.print(goalPosition);
// Serial.print(counter);
}
else if (CurrentPosition == goalPosition ) {
actuatorStop();
Retracting = false;
Extending = false;
}
}//loop
void Gear_Selection_Control( void )
{
byte
btnState;
btnState = ReadButtons();
switch( btnState )
{
case NO_PRESS:
//nothing pressed or not read (interval not elapsed); no action
break;
case BUTTON_UP_PRESSED:
if( gearSelection < (NUM_FWD_GEARS-1) )
gearSelection++;
//Serial.print(counter);
break;
case BUTTON_DOWN_PRESSED:
if( gearSelection > 0 )
gearSelection--;
break;
default:
//only remaining possibility is both pressed; ignore with no action
break;
}//switch
}//void
void Gear_Solenoid_Control( void )
{
if( gearSelection != lastGearSelection )
{
lastGearSelection = gearSelection;
if ((GearSolenoidProfiles[gearSelection].name) == 1) {
Serial.print("Park");
digitalWrite(solA, HIGH);
digitalWrite(solB, LOW);
goalPosition = 0;
}
lastGearSelection = gearSelection;
if ((GearSolenoidProfiles[gearSelection].name) == 2) {
Serial.print("Reverse");
digitalWrite(solA, LOW);
digitalWrite(solB, LOW);
goalPosition = 200;
}
lastGearSelection = gearSelection;
if ((GearSolenoidProfiles[gearSelection].name) == 3) {
Serial.print("Neutral");
digitalWrite(solA, HIGH);
digitalWrite(solB, LOW);
goalPosition = 300;
}
lastGearSelection = gearSelection;
if ((GearSolenoidProfiles[gearSelection].name) == 4) {
Serial.print("First");
digitalWrite(solA, LOW);
digitalWrite(solB, LOW);
goalPosition = 400;
}
lastGearSelection = gearSelection;
if ((GearSolenoidProfiles[gearSelection].name) == 5) {
Serial.print("Second");
digitalWrite(solA, HIGH);
digitalWrite(solB, LOW);
}
lastGearSelection = gearSelection;
if ((GearSolenoidProfiles[gearSelection].name) == 6) {
Serial.print("Third");
digitalWrite(solA, LOW);
digitalWrite(solB, LOW);
}
lastGearSelection = gearSelection;
if ((GearSolenoidProfiles[gearSelection].name) == 7) {
Serial.print("Fourth");
digitalWrite(solA, HIGH);
digitalWrite(solB, LOW);
}
lastGearSelection = gearSelection;
if ((GearSolenoidProfiles[gearSelection].name) == 8) {
Serial.print("Fifth");
digitalWrite(solA, LOW);
digitalWrite(solB, LOW);
}
}
}//Gear_Control
void TCC_Control( void )
{
unsigned long
tNow;
bool
bTCCEnabled;
tNow = millis();
//TCC enabled if:
// - 4th gear is engaged, OR
// - 3rd gear is engaged and tow-mode not selected, AND
// - TCC delay timer has expired
bTCCEnabled = ( (gearSelection == 3) ||
( (gearSelection == 2 && digitalRead( switchTOWMODE ) == HIGH) ) ) &&
( tNow - timeTCCSolenoid >= TCC_DELAY );
//if conditions passed and TCC is now off, turn on its solenoid
if( bTCCEnabled )
{
if( bTCCStatus == false )
{
//turn on TCC
digitalWrite( TCC, HIGH );
bTCCStatus = true;
}//if
}//if
else
{
if( bTCCStatus == true )
{
//turn off TCC
digitalWrite( TCC, LOW );
bTCCStatus = false;
}//if
}//else
}//TCC_Control
//returns a mask:
//0b00000000 - no buttons pressed
//0b00000001 - up pressed
//0b00000010 - down pressed
//0b00000011 - both pressed
//
byte ReadButtons( void )
{
static unsigned long
timeButton = 0;
unsigned long
tNow;
byte
retval,
nowButton;
retval = NO_PRESS;
tNow = millis();
if( (tNow - timeButton) >= BUTTON_READ_INTERVAL )
{
//set up for next read interval
timeButton = tNow;
//read the button and set the flags
nowButton = digitalRead( buttonUP );
if( nowButton != lastUp )
{
lastUp = nowButton;
if( nowButton == LOW )
retval |= BUTTON_UP_PRESSED;
}//if
nowButton = digitalRead( buttonDOWN );
if( nowButton != lastDn )
{
lastDn = nowButton;
if( nowButton == LOW )
retval |= BUTTON_DOWN_PRESSED;
}//if
}//if
return retval;
}//ReadButtons
void trigger0() {
if ( Extending == true) {
counter++;
CurrentPosition = counter;
}
if ( Retracting == true ) {
counter--;
CurrentPosition = counter;
}
}