First off, let me say that i have a total of about 10 hours of learning C++/ Arduino language (flipping back and forth between what code means what). I have a degree in Industrial Engineering (not electrical at all) and have programmed via ladder logic in college and work. I saw someone else's project like this and figured it was the best idea since sliced bread to take my competitiveness to the next level. they really didnt share any code or script so that left me with trying to figure everything out on my own. The script that I wrote below ultimately is taken from several other peoples scripts that I found online and adapted to fit. I do not have an arduino at this time (just ordered the Mega as I hope that this can also run a few other things in my race car such as dash, fire suppression system...).
This is my first post here and I know people always get sour if the post is in the wrong section. If that is so, I am sorry. I am just here to learn.
The idea of the program is very simple... in a way. I have 4 hall sensors, one on each wheel of the vehicle. They will detect a magnet attached to the backside of my disk brake and then change that into a RPM. That RPM will then be compared front to back as well as left to right in order to determine any differences in wheel speed aka loss of traction. It will be computed by river front / passenger front)*100) in order to get the percent difference between the two. This will then be compared to a Pot percentage. I will use the Pot to set my driving conditions. such as, when I am drag racing, I want to maintain as near 100% traction as possible since I am trying to apply max power to the ground vs. when I am warming up the tires and I need them to spin. or when driving in the rain, loss of traction could be considered 90%. All of this feeds into my if else statements resulting in the cutting of both fuel injector and spark to one cylinder per %5 of traction loss over required amount (100% required, 85% determined, 3 cylinders will be cut). The goal here is to make a traction control system for a drag / race car (non legal) that can be fine tuned by the driver. there is a lot more that needs to be adjusted in order to get it dialed in but I am hoping that I can start with the code that I have.
int rawValue;
int oldValue;
byte potPercentage;
byte oldPercentage;
// Hall sensor Code
int hallsensor = 2; // Hall sensor at pin 2 Driver front
int hallsensor = 3; // Hall sensor at pin 3 Passenger front
int hallsensor = 18; // Hall sensor at pin 18 Driver rear
int hallsensor = 19; // Hall sensor at pin 19 Passenger rear
volatile byte counter;
unsigned int rpm;
unsigned long passedtime;
int fdriverHall = 2; // Front driver set up
volatile byte counter fd;
unsigned int rpm fd;
unsigned long passedtime fd;
int fpassengerHall = 3; // Front passenger set up
volatile byte counter fp;
unsigned int rpm fp;
unsigned long passedtime fp;
int rdriverHall = 18; // Rear driver set up
volatile byte counter rd;
unsigned int rpm rd;
unsigned long passedtime rd;
int rpassengerHall = 19; // rear passenger setup
volatile byte counter rp;
unsigned int rpm rp;
unsigned long passedtime rp;
cylinder 1 = 4
cylinder 2 = 5
cylinder 3 = 6
cylinder 4 = 7
cylinder 5 = 8
cylinder 6 = 9
cylinder 7 = 10
cylinder 8 = 11
void setup() {
Serial.begin(115200); // set serial monitor to this value, or change the value
pinMode (A0, INPUT); // set Pot pin A0 to input
// Cylinder control output setup
pinMode ( cylinder 1, OUTPUT); // pin mode cylinder 1
pinMode ( cylinder 2, OUTPUT); // pin mode cylinder 2
pinMode ( cylinder 3, OUTPUT); // pin mode cylinder 3
pinMode ( cylinder 4, OUTPUT); // pin mode cylinder 4
pinMode ( cylinder 5, OUTPUT); // pin mode cylinder 5
pinMode ( cylinder 6, OUTPUT); // pin mode cylinder 6
pinMode ( cylinder 7, OUTPUT); // pin mode cylinder 7
pinMode ( cylinder 8, OUTPUT); // pin mode cylinder 8
pinMode (fdriverHall, INPUT); // Hall sensor Driver front input
attachInterrupt(fdriverHall, isr, RISING); //Interrupt for front driver Hall sensor
fdriver counter = 0;
fdriver rpm = 0;
fdriver passedtime = 0; //Initialise the values
pinMode (fpassengerHall, INPUT); // Hall sensor Passenger front input
attachInterrupt(fpassengerHall, isr, RISING); //Interrupt for front passenger Hall sensor
fpassenger counter = 0;
fpassenger rpm = 0;
fpassenger passedtime = 0; //Initialise the values
pinMode (rdriverHall, INPUT); // Hall sensor Driver rear input
attachInterrupt(rdriverHall, isr, RISING); //Interrupt for rear driver Hall sensor
rdriver counter = 0;
rdriver rpm = 0;
rdriver passedtime = 0; //Initialise the values
pinMode (rpassengerHall, INPUT); // Hall sensor Passenger rear input
attachInterrupt(rpassengerHall, isr, RISING); //Interrupt for rear passenger Hall sensor
rpassenger counter = 0;
rpassenger rpm = 0;
rpassenger passedtime = 0; //Initialise the values
}
void loop() {
// front driver wheel RPM calculator
fdriver rpm = 60*1000/(millis() - fdriver passedtime)*fdriver counter;
fdriver passedtime = millis();
fdriver counter = 0;
// front passenger wheel RPM calculator
fpassenger rpm = 60*1000/(millis() - fpassenger passedtime)*fpassenger counter;
fpassenger passedtime = millis();
fpassenger counter = 0;
// rear driver wheel RPM calculator
rdriver rpm = 60*1000/(millis() - rdriver passedtime)*rdriver counter;
rdriver passedtime = millis();
rdriver counter = 0;
// rear passenger wheel RPM calculator
rpassenger rpm = 60*1000/(millis() - rpassenger passedtime)*rpassenger counter;
rpassenger passedtime = millis();
rpassenger counter = 0;
// pot code
// converts the position of a 10k lin(B) pot to 0-100%
// pot connected to A0, 5volt and ground
rawValue = analogRead(A0); // read input twice
rawValue = analogRead(A0); // ignore bad hop-on region of a pot by removing 8 values at both extremes
rawValue = constrain(rawValue, 8, 1015); // add some deadband
if (rawValue < (oldValue - 4) || rawValue > (oldValue + 4)) oldValue = rawValue; // convert to percentage
potPercentage = map(oldValue, 8, 1008, 0, 100); // Only print if %value changes
if (oldPercentage != potPercentage) oldPercentage = potPercentage;
// Math for calculating slip in wheel speed or loss of traction
// 5% loss of traction. I am hoping 5% will acount for rpm differance in wheel RPM while turning. If not, I can change it to 3 or higher... havent done the math on this yet.
if ((fdriver rpm/fpassenger rpm)*100) <= (potPercentage-5) || ((rdriver rpm/rpassenger rpm)*100) <= (potPercentage-5) || ((fdriver rpm/rdriver rpm)*100) <= (potPercentage-5) || ((fpassenger rpm/rpassenger rpm)*100) <= (potPercentage-5) digitalWrite (cylinder 1, LOW);
else digitalWrite (cylinder 1, HIGH);
// 10% loss of traction below required or pot set
if ((fdriver rpm/fpassenger rpm)*100) <= (potPercentage-10) || ((rdriver rpm/rpassenger rpm)*100) <= (potPercentage-10) || ((fdriver rpm/rdriver rpm)*100) <= (potPercentage-10) || ((fpassenger rpm/rpassenger rpm)*100) <= (potPercentage-10) digitalWrite (cylinder 2, LOW);
else digitalWrite (cylinder 2, HIGH);
// 15% loss of traction below required or pot set
if ((fdriver rpm/fpassenger rpm)*100) <= (potPercentage-15) || ((rdriver rpm/rpassenger rpm)*100) <= (potPercentage-15) || ((fdriver rpm/rdriver rpm)*100) <= (potPercentage-15) || ((fpassenger rpm/rpassenger rpm)*100) <= (potPercentage-15) digitalWrite (cylinder 3, LOW);
else digitalWrite (cylinder 3, HIGH);
// 20% loss of traction below required or pot set
if ((fdriver rpm/fpassenger rpm)*100) <= (potPercentage-20) || ((rdriver rpm/rpassenger rpm)*100) <= (potPercentage-20) || ((fdriver rpm/rdriver rpm)*100) <= (potPercentage-20) || ((fpassenger rpm/rpassenger rpm)*100) <= (potPercentage-20) digitalWrite (cylinder 4, LOW);
else digitalWrite (cylinder 4, HIGH);
// 25% loss of traction below required or pot set
if ((fdriver rpm/fpassenger rpm)*100) <= (potPercentage-25) || ((rdriver rpm/rpassenger rpm)*100) <= (potPercentage-25) || ((fdriver rpm/rdriver rpm)*100) <= (potPercentage-25) || ((fpassenger rpm/rpassenger rpm)*100) <= (potPercentage-25) digitalWrite (cylinder 5, LOW);
else digitalWrite (cylinder 5, HIGH);
// 30% loss of traction below required or pot set
if ((fdriver rpm/fpassenger rpm)*100) <= (potPercentage-30) || ((rdriver rpm/rpassenger rpm)*100) <= (potPercentage-30) || ((fdriver rpm/rdriver rpm)*100) <= (potPercentage-30) || ((fpassenger rpm/rpassenger rpm)*100) <= (potPercentage-30) digitalWrite (cylinder 5, LOW);
else digitalWrite (cylinder 5, HIGH);
}