制御S
をテンプレートにして作成
[
凌宮
|
鉄道
|
一覧
|
検索
|
最新
] [
ソース
]
開始行:
###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 (*aStateChange...
: 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, fCtrlStateCha...
cStatelessToggleButton vDirButton (pDir , fCtrlStateCha...
void fCtrlStateChanged() {
analogWrite(pPowerDir1, (vPowerButton.vState && vDirBu...
analogWrite(pPowerDir2, (vPowerButton.vState && !vDirBu...
}
bool neutral = false;
cStatelessToggleButton vNeutralButton (pDir , [](){neut...
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;
}
}
void setup() {
Serial.begin(9600);
setPwvWidth0311(256);
//setPwvWidth0311(1024);
//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;
Serial.print("\nbase == ");
Serial.println(base);
for(int i = 0; i<avesz; i++) {
avebf[i] = 0;
}
}
//#define ASIA
//#define D51
//#define C57103
#define C575xHK800
//#define DD51
//#define DD51K
//#define DE15
//#define DF200
//#define KIHA40
//#define KIHA100 //KATO
//#define KIHA120
//#define KIHA181x5
//#define KIHA183
//#define KIHA187
//#define KTR8000
//#define Renfe592
#ifdef ASIA
int vIdleMax = 5; int vIdleAcc = 25; int vAccDiv = 2; ...
#endif
#ifdef D51
int vIdleMax = 1; int vIdleAcc = 2; int vAccDiv = 4; ...
#endif
#ifdef C57103
//int vIdleMax = 1; int vIdleAcc = 2; int vAccDiv = 4;...
int vIdleMax = 5; int vIdleAcc = 25; int vAccDiv = 2; ...
#endif
#ifdef C57xHK800
int vIdleMax = 5; int vIdleAcc = 2; int vAccDiv = 3; ...
#endif
#ifdef DD51
int vIdleMax = 5; int vIdleAcc = 25; int vAccDiv = 3; ...
#endif
#ifdef DD51K
int vIdleMax = 5; int vIdleAcc = 35; int vAccDiv = 3; ...
#endif
#ifdef DE15
int vIdleMax = 5; int vIdleAcc = 20; int vAccDiv = 4; ...
#endif
#ifdef DF200
int vIdleMax = 5; int vIdleAcc = 30; int vAccDiv = 3; ...
#endif
#ifdef KIHA40
int vIdleMax = 10; int vIdleAcc = 12; int vAccDiv = 9; ...
#endif
#ifdef KIHA100
int vIdleMax = 5; int vIdleAcc = 15; int vAccDiv = 6; ...
#endif
#ifdef KIHA120
int vIdleMax = 10; int vIdleAcc = 20; int vAccDiv = 5; ...
#endif
#ifdef KIHA181
int vIdleMax = 30; int vIdleAcc = 10; int vAccDiv = 3; ...
#endif
#ifdef KIHA183
int vIdleMax = 5; int vIdleAcc = 20; int vAccDiv = 3; ...
#endif
#ifdef KIHA181x5
int vIdleMax = 10; int vIdleAcc = 35; int vAccDiv = 4; ...
#endif
#ifdef KIHA187
int vIdleMax = 8; int vIdleAcc = 30; int vAccDiv = 4; ...
#endif
#ifdef KTR8000
int vIdleMax = 8; int vIdleAcc = 12; int vAccDiv = 6; ...
#endif
#ifdef Renfe592
int vIdleMax = 5; int vIdleAcc = 20; int vAccDiv = 3; ...
#endif
double liner(double ival, double imin, double imax, doubl...
{
if (ival < imin) return omin;
if (ival > imax) return omax;
double irange = imax - imin;
double orange = omax - omin;
double rate = orange / irange;
double oval = rate * (ival - imin) + omin;
return oval;
}
bool idlingState = true;
int steamCount = 10;
void loop() {
int value = analogRead(iAna0);
int ave = Ave(value);
int acc = 0;
vPowerButton.fUpdate();
vDirButton .fUpdate();
acc = (ave - base) / vAccDiv;
if (acc > 254) acc = 254;
if (true) {
Serial.print(value*0);
Serial.print("\t");
Serial.print(acc);
Serial.print("\t");
Serial.println(vPowerButton.vState);
Serial.print("\t");
Serial.println(steamCount);
}
if (vPowerButton.vState && acc > vIdleMax) {
if (--steamCount == 0) {
int vLapidAcc = 243;
double vMaxStream = 12;
double ka = (vMaxStream - 2) / (vIdleAcc - vLapidAc...
double kb = vMaxStream - ka * vIdleAcc;
//steamCount = 3;
steamCount = ka * acc + kb;
steamCount = (int)liner(acc, 30, 40, 10, 3); // C57...
//steamCount = 3;
if (steamCount < 1) steamCount = 1;
//acc = acc * 30/8;
acc = acc * 35/20;
if (false) {
Serial.print(acc);
Serial.print("\t");
Serial.print(steamCount);
Serial.println("");
}
}
//acc /= 2;
if (vDirButton.vState) {
analogWrite(pPwm1, 0 );
analogWrite(pPwm2, acc);
} else {
analogWrite(pPwm2, 0 );
analogWrite(pPwm1, acc);
}
}
else
{
analogWrite(pPwm2, acc);
analogWrite(pPwm1, acc);
}
delay(vIdleDelay/1);
}
###
終了行:
###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 (*aStateChange...
: 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, fCtrlStateCha...
cStatelessToggleButton vDirButton (pDir , fCtrlStateCha...
void fCtrlStateChanged() {
analogWrite(pPowerDir1, (vPowerButton.vState && vDirBu...
analogWrite(pPowerDir2, (vPowerButton.vState && !vDirBu...
}
bool neutral = false;
cStatelessToggleButton vNeutralButton (pDir , [](){neut...
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;
}
}
void setup() {
Serial.begin(9600);
setPwvWidth0311(256);
//setPwvWidth0311(1024);
//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;
Serial.print("\nbase == ");
Serial.println(base);
for(int i = 0; i<avesz; i++) {
avebf[i] = 0;
}
}
//#define ASIA
//#define D51
//#define C57103
#define C575xHK800
//#define DD51
//#define DD51K
//#define DE15
//#define DF200
//#define KIHA40
//#define KIHA100 //KATO
//#define KIHA120
//#define KIHA181x5
//#define KIHA183
//#define KIHA187
//#define KTR8000
//#define Renfe592
#ifdef ASIA
int vIdleMax = 5; int vIdleAcc = 25; int vAccDiv = 2; ...
#endif
#ifdef D51
int vIdleMax = 1; int vIdleAcc = 2; int vAccDiv = 4; ...
#endif
#ifdef C57103
//int vIdleMax = 1; int vIdleAcc = 2; int vAccDiv = 4;...
int vIdleMax = 5; int vIdleAcc = 25; int vAccDiv = 2; ...
#endif
#ifdef C57xHK800
int vIdleMax = 5; int vIdleAcc = 2; int vAccDiv = 3; ...
#endif
#ifdef DD51
int vIdleMax = 5; int vIdleAcc = 25; int vAccDiv = 3; ...
#endif
#ifdef DD51K
int vIdleMax = 5; int vIdleAcc = 35; int vAccDiv = 3; ...
#endif
#ifdef DE15
int vIdleMax = 5; int vIdleAcc = 20; int vAccDiv = 4; ...
#endif
#ifdef DF200
int vIdleMax = 5; int vIdleAcc = 30; int vAccDiv = 3; ...
#endif
#ifdef KIHA40
int vIdleMax = 10; int vIdleAcc = 12; int vAccDiv = 9; ...
#endif
#ifdef KIHA100
int vIdleMax = 5; int vIdleAcc = 15; int vAccDiv = 6; ...
#endif
#ifdef KIHA120
int vIdleMax = 10; int vIdleAcc = 20; int vAccDiv = 5; ...
#endif
#ifdef KIHA181
int vIdleMax = 30; int vIdleAcc = 10; int vAccDiv = 3; ...
#endif
#ifdef KIHA183
int vIdleMax = 5; int vIdleAcc = 20; int vAccDiv = 3; ...
#endif
#ifdef KIHA181x5
int vIdleMax = 10; int vIdleAcc = 35; int vAccDiv = 4; ...
#endif
#ifdef KIHA187
int vIdleMax = 8; int vIdleAcc = 30; int vAccDiv = 4; ...
#endif
#ifdef KTR8000
int vIdleMax = 8; int vIdleAcc = 12; int vAccDiv = 6; ...
#endif
#ifdef Renfe592
int vIdleMax = 5; int vIdleAcc = 20; int vAccDiv = 3; ...
#endif
double liner(double ival, double imin, double imax, doubl...
{
if (ival < imin) return omin;
if (ival > imax) return omax;
double irange = imax - imin;
double orange = omax - omin;
double rate = orange / irange;
double oval = rate * (ival - imin) + omin;
return oval;
}
bool idlingState = true;
int steamCount = 10;
void loop() {
int value = analogRead(iAna0);
int ave = Ave(value);
int acc = 0;
vPowerButton.fUpdate();
vDirButton .fUpdate();
acc = (ave - base) / vAccDiv;
if (acc > 254) acc = 254;
if (true) {
Serial.print(value*0);
Serial.print("\t");
Serial.print(acc);
Serial.print("\t");
Serial.println(vPowerButton.vState);
Serial.print("\t");
Serial.println(steamCount);
}
if (vPowerButton.vState && acc > vIdleMax) {
if (--steamCount == 0) {
int vLapidAcc = 243;
double vMaxStream = 12;
double ka = (vMaxStream - 2) / (vIdleAcc - vLapidAc...
double kb = vMaxStream - ka * vIdleAcc;
//steamCount = 3;
steamCount = ka * acc + kb;
steamCount = (int)liner(acc, 30, 40, 10, 3); // C57...
//steamCount = 3;
if (steamCount < 1) steamCount = 1;
//acc = acc * 30/8;
acc = acc * 35/20;
if (false) {
Serial.print(acc);
Serial.print("\t");
Serial.print(steamCount);
Serial.println("");
}
}
//acc /= 2;
if (vDirButton.vState) {
analogWrite(pPwm1, 0 );
analogWrite(pPwm2, acc);
} else {
analogWrite(pPwm2, 0 );
analogWrite(pPwm1, acc);
}
}
else
{
analogWrite(pPwm2, acc);
analogWrite(pPwm1, acc);
}
delay(vIdleDelay/1);
}
###
ページ名:
s-IMG_6285.JPG
288件
[
詳細
]
s-IMG_6286.JPG
296件
[
詳細
]
s-IMG_6344.JPG
272件
[
詳細
]
s-IMG_6352.JPG
275件
[
詳細
]
s-IMG_6355.JPG
268件
[
詳細
]
000006.2014.0521.0114.11576.png
266件
[
詳細
]
s-IMG_6391.JPG
420件
[
詳細
]
s-IMG_6388.JPG
409件
[
詳細
]
s-IMG_6396.JPG
446件
[
詳細
]
s-IMG_6397.JPG
407件
[
詳細
]
s-IMG_6399.JPG
415件
[
詳細
]
s-IMG_6400.JPG
441件
[
詳細
]
s-IMG_6403.JPG
392件
[
詳細
]
s-IMG_6278.JPG
362件
[
詳細
]
s-IMG_6282.JPG
354件
[
詳細
]
s-IMG_6344.JPG
342件
[
詳細
]
s-IMG_6350.JPG
335件
[
詳細
]
s-IMG_6351.JPG
355件
[
詳細
]
000001.2014.0520.0036.44593.png
329件
[
詳細
]
000005.2014.0520.0044.58237.png
350件
[
詳細
]
[
凌宮
|
鉄道
|
一覧
|
検索
|
最新
] [
ソース
]