I am trying to make my own library for step motor control (28byj48 with ULN2003 driver) based on timer interrupts so that it supposed to be a non blocked code. Bellow is my .h, .ccp and example of it. When compile the example, I get tons of erros, also attached bellow. I wonder to have some advice about how to make my code working... Thanks
//this is the Sm.h
#ifndef Sm_h
#define Sm_h
#include "Arduino.h"
class Sm
{
public:
Sm(int pin4, int pin3, int pin2, int pin1);
void run(int steps, int vel, char dir);
int where();
private:
void onTimer1ms();
void go();
int p4,p3,p2,p1,inivel=5;
volatile int xsteps=0;
volatile int xfase=0, xvel=5;
volatile char xdir='R';
};
#endif
//This is the .cpp
#include "Sm.h"
//----------------------------------------------------------------------
Sm::Sm(int pin4, int pin3, int pin2, int pin1)
{
pinMode(pin4,OUTPUT); //define the driver motor pins as output
pinMode(pin3,OUTPUT); //
pinMode(pin2,OUTPUT); //
pinMode(pin1,OUTPUT); //
digitalWrite(pin4,0); //initialize then with zeroes
digitalWrite(pin3,0); //
digitalWrite(pin2,0); //
digitalWrite(pin1,0); //
p4=pin4, p3=pin3, p2=pin2, p1=pin1; //copy pins to internal variables
hw_timer_t *timer1ms = NULL;
timer1ms = timerBegin(0, 80, true); //prescaler of 80 = 80Mhz/80 = 1us (1Mhz) per tick
timerAttachInterrupt(timer1ms, onTimer1ms, true); //usr attached to interrupts (onTimer1ms)
timerAlarmWrite(timer1ms, 1000, true); //usr called each 1000us=1Khz
timerAlarmEnable(timer1ms); //start interrupts generation
}
//----------------------------------------------------------------------
void Sm::run(int steps, int vel, char dir)
{
inivel=vel;xvel=vel;xdir=dir;xsteps=steps;
}
//----------------------------------------------------------------------
int Sm::where()
{
return xsteps;
}
//----------------------------------------------------------------------
void onTimer1ms()
{
xvel--;
if (xvel==0){
xvel=inivel;
if (xsteps>0){
go();
xfase++;
if (xfase==4){xfase=0;xsteps--;}
}
if (xsteps==0){digitalWrite(p1, 0);digitalWrite(p2, 0);digitalWrite(p3, 0);digitalWrite(p4, 0);}
}
}
//----------------------------------------------------------------------
void go()
{
if ((xdir=='R')||(xdir=='r')){
if (xfase==0){
digitalWrite(p1, 1); //0x09
digitalWrite(p2, 0);
digitalWrite(p3, 0);
digitalWrite(p4, 1);
}
if (xfase==1){
digitalWrite(p1, 1); //0x03
digitalWrite(p2, 1);
digitalWrite(p3, 0);
digitalWrite(p4, 0);
}
if (xfase==2){
digitalWrite(p1, 0); //0x06
digitalWrite(p2, 1);
digitalWrite(p3, 1);
digitalWrite(p4, 0);
}
if (xfase==3){
digitalWrite(p1, 0); //0x0C
digitalWrite(p2, 0);
digitalWrite(p3, 1);
digitalWrite(p4, 1);
}
}
if ((xdir=='L')||(xdir=='l')){
if (xfase==0){
digitalWrite(p1, 0); //0x0C
digitalWrite(p2, 0);
digitalWrite(p3, 1);
digitalWrite(p4, 1);
}
if (xfase==1){
digitalWrite(p1, 0); //0x06
digitalWrite(p2, 1);
digitalWrite(p3, 1);
digitalWrite(p4, 0);
}
if (xfase==2){
digitalWrite(p1, 1); //0x03
digitalWrite(p2, 1);
digitalWrite(p3, 0);
digitalWrite(p4, 0);
}
if (xfase==3){
digitalWrite(p1, 1); //0x09
digitalWrite(p2, 0);
digitalWrite(p3, 0);
digitalWrite(p4, 1);
}
}
}
//----------------------------------------------------------------------
//This is the use sample
#include <Sm.h>
Sm sm(4,16,17,5); //define ULN2003 driver motor pins in4,in3,in2,in1
void setup()
{
}
void loop()
{
while (sm.where()>0){} //wait until step motor arrives to its last destination
sm.run(512, 5, 'R'); //start one 360 degrees turn right
while (sm.where()>0){} //wait until step motor arrives to its last destination
sm.run(512, 5, 'L'); //start one 360 degrees turn left
}
//Here the tons of example compiling erros
C:\Users\Antonio Testa\Documents\Arduino\libraries\Sm\src\Sm.cpp: In constructor 'Sm::Sm(int, int, int, int)':
C:\Users\Antonio Testa\Documents\Arduino\libraries\Sm\src\Sm.cpp:21:50: error: invalid use of non-static member function 'void Sm::onTimer1ms()'
timerAttachInterrupt(timer1ms, onTimer1ms, true); //usr attached to interrupts (onTimer1ms)
^
In file included from C:\Users\Antonio Testa\Documents\Arduino\libraries\Sm\src\Sm.cpp:1:
C:\Users\Antonio Testa\Documents\Arduino\libraries\Sm\src\Sm.h:14:8: note: declared here
void onTimer1ms();
^~~~~~~~~~
C:\Users\Antonio Testa\Documents\Arduino\libraries\Sm\src\Sm.cpp: In function 'void onTimer1ms()':
C:\Users\Antonio Testa\Documents\Arduino\libraries\Sm\src\Sm.cpp:41:3: error: 'xvel' was not declared in this scope
xvel--;
^~~~
C:\Users\Antonio Testa\Documents\Arduino\libraries\Sm\src\Sm.cpp:43:10: error: 'vel' was not declared in this scope
xvel=vel;
^~~
C:\Users\Antonio Testa\Documents\Arduino\libraries\Sm\src\Sm.cpp:43:10: note: suggested alternative: 'ceil'
xvel=vel;
^~~
ceil
C:\Users\Antonio Testa\Documents\Arduino\libraries\Sm\src\Sm.cpp:44:9: error: 'xsteps' was not declared in this scope
if (xsteps>0){
^~~~~~
C:\Users\Antonio Testa\Documents\Arduino\libraries\Sm\src\Sm.cpp:44:9: note: suggested alternative: 'mkstemps'
if (xsteps>0){
^~~~~~
mkstemps
C:\Users\Antonio Testa\Documents\Arduino\libraries\Sm\src\Sm.cpp:45:7: error: 'anda' was not declared in this scope
anda();
^~~~
C:\Users\Antonio Testa\Documents\Arduino\libraries\Sm\src\Sm.cpp:45:7: note: suggested alternative: 'rand'
anda();
^~~~
rand
C:\Users\Antonio Testa\Documents\Arduino\libraries\Sm\src\Sm.cpp:46:7: error: 'xfase' was not declared in this scope
xfase++;
^~~~~
C:\Users\Antonio Testa\Documents\Arduino\libraries\Sm\src\Sm.cpp:49:9: error: 'xsteps' was not declared in this scope
if (xsteps==0){digitalWrite(p1, 0);digitalWrite(p2, 0);digitalWrite(p3, 0);digitalWrite(p4, 0);}
^~~~~~
C:\Users\Antonio Testa\Documents\Arduino\libraries\Sm\src\Sm.cpp:49:9: note: suggested alternative: 'mkstemps'
if (xsteps==0){digitalWrite(p1, 0);digitalWrite(p2, 0);digitalWrite(p3, 0);digitalWrite(p4, 0);}
^~~~~~
mkstemps
C:\Users\Antonio Testa\Documents\Arduino\libraries\Sm\src\Sm.cpp:49:33: error: 'p1' was not declared in this scope
if (xsteps==0){digitalWrite(p1, 0);digitalWrite(p2, 0);digitalWrite(p3, 0);digitalWrite(p4, 0);}
^~
C:\Users\Antonio Testa\Documents\Arduino\libraries\Sm\src\Sm.cpp:49:33: note: suggested alternative: 'T1'
if (xsteps==0){digitalWrite(p1, 0);digitalWrite(p2, 0);digitalWrite(p3, 0);digitalWrite(p4, 0);}
^~
T1
C:\Users\Antonio Testa\Documents\Arduino\libraries\Sm\src\Sm.cpp:49:53: error: 'p2' was not declared in this scope
if (xsteps==0){digitalWrite(p1, 0);digitalWrite(p2, 0);digitalWrite(p3, 0);digitalWrite(p4, 0);}
^~
C:\Users\Antonio Testa\Documents\Arduino\libraries\Sm\src\Sm.cpp:49:53: note: suggested alternative: 'T2'
if (xsteps==0){digitalWrite(p1, 0);digitalWrite(p2, 0);digitalWrite(p3, 0);digitalWrite(p4, 0);}
^~
T2
C:\Users\Antonio Testa\Documents\Arduino\libraries\Sm\src\Sm.cpp:49:73: error: 'p3' was not declared in this scope
if (xsteps==0){digitalWrite(p1, 0);digitalWrite(p2, 0);digitalWrite(p3, 0);digitalWrite(p4, 0);}
^~
C:\Users\Antonio Testa\Documents\Arduino\libraries\Sm\src\Sm.cpp:49:73: note: suggested alternative: 'T3'
if (xsteps==0){digitalWrite(p1, 0);digitalWrite(p2, 0);digitalWrite(p3, 0);digitalWrite(p4, 0);}
^~
T3
C:\Users\Antonio Testa\Documents\Arduino\libraries\Sm\src\Sm.cpp:49:93: error: 'p4' was not declared in this scope
if (xsteps==0){digitalWrite(p1, 0);digitalWrite(p2, 0);digitalWrite(p3, 0);digitalWrite(p4, 0);}
^~
C:\Users\Antonio Testa\Documents\Arduino\libraries\Sm\src\Sm.cpp:49:93: note: suggested alternative: 'T4'
if (xsteps==0){digitalWrite(p1, 0);digitalWrite(p2, 0);digitalWrite(p3, 0);digitalWrite(p4, 0);}
^~
T4