Arduino Mega & Trinket Code
Arduino Mega & Trinket Code
Arduino Mega
#include <Wire.h>
#include <PID_v1.h>
#include <PID_AutoTune_v0.h>
#define pwm 12
#define throttlepin 5
#define setpin 6
#define led 13
#define trig 11
#define echo 10
#define onled 22
#define cruiseled 23
#define distancewarnled 24
#define ebrakeled 25
#define easymodeled 26
#define easymodepbutton 27
double Kp = 0.1;
double Ki = 0.1;
double Kd = 0.0;
double dKp = 1;
double dKi = .1;
double dKd = 0.1;
void setup()
{
Serial.begin(9600);
Wire.begin();
pinMode(throttlepin, INPUT);
pinMode(setpin, INPUT);
//pinMode(18, INPUT);
pinMode(led, OUTPUT);
pinMode(echo, INPUT);
pinMode(trig, OUTPUT);
//pinMode(easymodepbutton, INPUT);
pinMode(easymodeled, OUTPUT);
pinMode(onled, OUTPUT);
pinMode(cruiseled, OUTPUT);
pinMode(distancewarnled, OUTPUT);
pinMode(ebrakeled, OUTPUT);
digitalWrite(onled, HIGH);
speedPID.SetMode(AUTOMATIC);
speedPID.SetOutputLimits(min, max);
speedPID.SetSampleTime(200);
distancePID.SetMode(AUTOMATIC);
distancePID.SetOutputLimits(min, max);
distancePID.SetSampleTime(50);
setsig = pulseIn(setpin, HIGH);
if(setsig > 1900)
{setbuttonold = 1;}
if(setsig < 1100)
{setbuttonold = 0;}
distancewarn = safedistance + 100;
//attachInterrupt(4, distanceread, CHANGE);
attachInterrupt(5, speedcal, CHANGE);
attachInterrupt(4, easymode, FALLING);
}
void loop()
{
Serial.print("distance:");
Serial.println(distance);
if (avgcount == 5)
{avgwheelspeed = (wheelspeedsum/5);
wheelspeedsum = 0;
avgcount = 0;
}
Serial.print("avgwheelspeed:");
Serial.print(avgwheelspeed);
if(avgwheelspeed < 3)
{speedPID.SetTunings(4, 1, 0);}
else
{
digitalWrite(cruiseled, LOW);
digitalWrite(distancewarnled, LOW);
cruisespeedwdist = 0;
pwmamount = rxsig;
}
if(setbutton != setbuttonold)
{
if(cruiseset == 0)
{
cruiseset = 1;
cruisespeed = avgwheelspeed;
cruisespeedwdist = rxsig;
cruisespeedwspeed = rxsig;
pwmamount = rxsig;
}
else if (rxsig > pwmamount)
{
cruiseset = 1;
cruisespeed = avgwheelspeed;
cruisespeedwdist = rxsig;
cruisespeedwspeed = rxsig;
pwmamount = rxsig;
}
else
{cruiseset = 0;}
}
setbuttonold = setbutton;
Serial.print("cruisespeed:");
Serial.print(cruisespeed);
//Emergency Braking
if(ebrake == 1)
{if ((rxsig < 1525) && (avgwheelspeed < 3))
{ebrake = 0;
digitalWrite(ebrakeled, LOW);}
else
{pwmamount = 1500;}
}
else if((distance < ebrakedistance) && (avgwheelspeed > 4))
if(pwmamount > 1470)
{cruiseset = 0;
ebrake = 1;
avgwheelspeed = 0;
Wire.beginTransmission(4); // transmit to device #4
Wire.write(165); // sends pwmamountbyte
Wire.endTransmission();
delay(60);
Wire.beginTransmission(4); // transmit to device #4
Wire.write(100); // sends pwmamountbyte
Wire.endTransmission(); // stop transmitting
digitalWrite(ebrakeled, HIGH);
delay(1000);
}
void speedcal()
{speedcount = speedcount + 1;}
void easymode()
{if((millis()-easymodemillis) > 2000)
{easymodemillis = millis();
if(easymodeon == 1)
{easymodeon = 0;}
else
{easymodeon = 1;}}
}
Trinket
#include <TinyWireS.h>
#define pwm 1
int pwmamount = 1500;
int pwmamountbyte = 150;
unsigned long prevmicros;
digitalWrite(pwm, LOW);
interrupts();
}