###c
int iAna0 = 0;
int pPwm1 = 3;
int pPwm2 = 11;
int pPower = 7;
int pDir = 9;
int pPowerDir1 = 5;
int pPowerDir2 = 10;
const int PUSHED = LOW;
int base = 0;
#define avelg 2
#define avesz (1<<avelg)
int avebf[avesz];
int avelc=0;
int ave=0;
class cStatelessToggleButton
{
public:
int vPort;
bool vState;
const int PUSHED = LOW;
void (*vStateChanged)();
private:
int vPushed;
public:
cStatelessToggleButton(int aPort, void (*aStateChanged)() = NULL)
: vPort(aPort)
, vStateChanged(aStateChanged)
{
fInit();
}
void fInit() {
vState = false;
vPushed = false;
pinMode(vPort, INPUT_PULLUP);
}
int fUpdate() {
if (digitalRead(vPort) == PUSHED) {
if (vPushed == false) {
vState = !vState;
vPushed = true;
if (vStateChanged != NULL) vStateChanged();
}
} else {
vPushed = false;
if (vStateChanged != NULL) vStateChanged();
}
}
};
void fCtrlStateChanged();
cStatelessToggleButton vPowerButton(pPower, fCtrlStateChanged);
cStatelessToggleButton vDirButton (pDir , fCtrlStateChanged);
void fCtrlStateChanged() {
analogWrite(pPowerDir1, (vPowerButton.vState && vDirButton.vState) ? 50 : 0);
analogWrite(pPowerDir2, (vPowerButton.vState && !vDirButton.vState) ? 128 : 0);
}
bool neutral = false;
cStatelessToggleButton vNeutralButton (pDir , [](){neutral = !neutral;});
int Ave(int value) {
ave -= avebf[avelc]; avebf[avelc] = value >> avelg;
ave += avebf[avelc];
avelc++;
if (avelc == avesz) avelc = 0;
return ave;
}
void setPwvWidth0311(int r) {
TCCR2B &= B11111000;
switch(r) {
case 0: TCCR2B |= B00000000; break;
case 1: TCCR2B |= B00000001; break;
case 8: TCCR2B |= B00000010; break;
case 32: TCCR2B |= B00000011; break;
default :
case 64: TCCR2B |= B00000100; break;
case 128: TCCR2B |= B00000101; break;
case 256: TCCR2B |= B00000110; break;
case 1024: TCCR2B |= B00000111; break;
}
}
void setPwvWidth0506(int r) {
TCCR0B &= B11111000;
switch(r) {
case 0: TCCR0B |= B00000000; break;
case 1: TCCR0B |= B00000001; break;
case 8: TCCR0B |= B00000010; break;
case 64: TCCR0B |= B00000011; break;
default :
case 256: TCCR0B |= B00000100; break;
case 1024: TCCR0B |= B00000101; break;
}
}
//#define HKS9200
#define DD51
//#define DD51K
//#define DE15
//#define DF200
//#define KIHA20
//#define KIHA40
//#define KIHA75
//#define KIHA75_10V
//#define KIHA100 //KATO
//#define KIHA120
//#define KIHA181x5
//#define KIHA183
//#define KIHA187x4
//#define KIHA187x4_10V
//#define KIHA2000x5_10V
//#define KIHA187x6
//#define KTR8000
//#define Renfe592
//#define Sanriku36
//#define RailBus
#ifdef HKS9200
int vIdleMax = 10; int vIdleAcc = 20; int vAccDiv = 5; int vIdleDelay = 64;
#endif
#ifdef DD51
int vIdleMax = 40; int vIdleAcc = 25; int vAccDiv = 4; int vIdleDelay = 64;
#endif
#ifdef DD51K
int vIdleMax = 5; int vIdleAcc = 35; int vAccDiv = 3; int vIdleDelay = 64;
#endif
#ifdef DE15
int vIdleMax = 5; int vIdleAcc = 20; int vAccDiv = 4; int vIdleDelay = 64;
#endif
#ifdef DF200
int vIdleMax = 5; int vIdleAcc = 30; int vAccDiv = 3; int vIdleDelay = 64;
#endif
#ifdef KIHA20
int vIdleMax = 10; int vIdleAcc = 20; int vAccDiv = 3; int vIdleDelay = 64;
#endif
#ifdef KIHA40
int vIdleMax = 10; int vIdleAcc = 12; int vAccDiv = 9; int vIdleDelay = 14;
#endif
#ifdef KIHA75
int vIdleMax = 8; int vIdleAcc = 30; int vAccDiv = 3; int vIdleDelay = 64;
#endif
#ifdef KIHA75_10V
int vIdleMax = 8; int vIdleAcc = 40; int vAccDiv = 2; int vIdleDelay = 64;
#endif
#ifdef KIHA100
int vIdleMax = 5; int vIdleAcc = 15; int vAccDiv = 4; int vIdleDelay = 64;
#endif
#ifdef KIHA120
int vIdleMax = 10; int vIdleAcc = 20; int vAccDiv = 5; int vIdleDelay = 64;
#endif
#ifdef KIHA181
int vIdleMax = 30; int vIdleAcc = 10; int vAccDiv = 3; int vIdleDelay = 64;
#endif
#ifdef KIHA183
int vIdleMax = 5; int vIdleAcc = 20; int vAccDiv = 3; int vIdleDelay = 64;
#endif
#ifdef KIHA181x5
int vIdleMax = 10; int vIdleAcc = 35; int vAccDiv = 3; int vIdleDelay = 64;
#endif
#ifdef KIHA187x4
int vIdleMax = 8; int vIdleAcc = 30; int vAccDiv = 4; int vIdleDelay = 64;
#endif
#ifdef KIHA187x4_10V
int vIdleMax = 10; int vIdleAcc = 30; int vAccDiv = 2; int vIdleDelay = 64;
#endif
#ifdef KIHA2000x5_10V
int vIdleMax = 4; int vIdleAcc = 18; int vAccDiv = 4; int vIdleDelay = 64;
#endif
#ifdef KIHA187x6
int vIdleMax = 8; int vIdleAcc = 30; int vAccDiv = 2; int vIdleDelay = 64;
#endif
#ifdef KTR8000
int vIdleMax = 8; int vIdleAcc = 12; int vAccDiv = 6; int vIdleDelay = 64;
#endif
#ifdef Renfe592
int vIdleMax = 5; int vIdleAcc = 20; int vAccDiv = 3; int vIdleDelay = 64;
#endif
#ifdef Sanriku36
int vIdleMax = 5; int vIdleAcc = 20; int vAccDiv = 5; int vIdleDelay = 64;
#endif
#ifdef RailBus
int vIdleMax = 8; int vIdleAcc = 25; int vAccDiv = 5; int vIdleDelay = 64;
#endif
class DCar {
bool idlingState;
DCar() {
idlingState = true;
}
void update() {
}
};
void setup() {
Serial.begin(115200);
setPwvWidth0311(256);
//setPwvWidth0506(1);
pinMode(pPwm1, OUTPUT);
pinMode(pPwm2, OUTPUT);
pinMode(pPowerDir1, OUTPUT);
pinMode(pPowerDir2, OUTPUT);
analogWrite(pPwm1, 0);
analogWrite(pPwm2, 0);
analogWrite(pPowerDir1, 50);
analogWrite(pPowerDir2, 128);
base = analogRead(iAna0)+10;
for(int i = 0; i<avesz; i++) {
avebf[i] = 0;
}
Serial.print("\nsetup d");
Serial.print("\nvIdleMax = ");
Serial.print( vIdleMax );
Serial.print("\nvIdleAcc = ");
Serial.print( vIdleAcc );
Serial.print("\nvAccDiv = ");
Serial.print( vAccDiv );
Serial.print("\nvIdleDelay = ");
Serial.print( vIdleDelay );
Serial.print("\n");
Serial.print("\nbase = ");
Serial.print( base );
Serial.print("\n");
Serial.print("engine");
Serial.print(",");
Serial.print("acc");
Serial.print(",");
Serial.print("state");
Serial.print(",");
Serial.print("idle");
//Serial.print(",");
//Serial.print("raw");
Serial.println("");
}
bool idlingState = true;
bool enginePower = true;
void loop() {
int raw = analogRead(iAna0);
int ave = Ave(raw);
int acc = 0;
vPowerButton.fUpdate();
vDirButton .fUpdate();
acc = (ave - base) / vAccDiv;
if (acc > 254) acc = 254;
if (1) {
Serial.print(150 - 5 * (enginePower?1:0));
Serial.print(",");
Serial.print(base + acc);
Serial.print(",");
Serial.print(130 - 5 * (vDirButton.vState?1:0));
Serial.print(",");
Serial.print(base + vIdleMax);
//Serial.print(",");
//Serial.print(raw);
Serial.println("");
}
if (vPowerButton.vState) {
if (!enginePower) {
enginePower = true;
setPwvWidth0311(1024);
}
}
else {
if (enginePower) {
enginePower = false;
setPwvWidth0311(256);
}
}
if (enginePower) {
if (acc < vIdleMax) { //反転振動
if (idlingState) {
analogWrite(pPwm1, vIdleAcc);
analogWrite(pPwm2, 0 );
} else {
analogWrite(pPwm2, vIdleAcc);
analogWrite(pPwm1, 0 );
}
idlingState = !idlingState;
}
else {
if (vDirButton.vState) {
analogWrite(pPwm1, 0 );
analogWrite(pPwm2, acc);
} else {
analogWrite(pPwm2, 0 );
analogWrite(pPwm1, acc);
}
}
}
else
{
if (acc < vIdleMax) {
analogWrite(pPwm1, 0);
analogWrite(pPwm2, 0);
}
else {
if (vDirButton.vState) {
analogWrite(pPwm1, 0 );
analogWrite(pPwm2, acc * 6/5);
} else {
analogWrite(pPwm2, 0 );
analogWrite(pPwm1, acc * 6/5);
}
}
}
delay(vIdleDelay);
}
###