
This is what I understood so far. The write() function is needed for zeroset() and step().
-zeroset() puts every servo to 90 degrees
-step1() puts every servo from 90 to 45 degrees
As you can see below, I modified them putting johnwasser's code in the loop
PWMServo si(pwm, i);
These two functions are defined in walking.cpp and declared in walking.h. The .ino file need the .cpp and .h files in order to run. I included the files with "#include" according to the diagram that I uploaded. Here are the codes and errors.
//Test_h_cpp.ino
#include "Arduino.h"
#include <Wire.h>
#include "walking.h"
#include "walking.cpp"
#include "PWMServo.h"
#include <Adafruit_PWMServoDriver.h>
void setup() {
// put your setup code here, to run once:
Serial.begin(9600);
pwm.begin();
pwm.setPWMFreq(60);
delay(100);
walking::zeroset();
delay(1000);
}
void loop() {
walking::step1();
}
//PWMServo.h
#include "Arduino.h"
#include <Adafruit_PWMServoDriver.h>
class PWMServo
{
public:
PWMServo(Adafruit_PWMServoDriver &_driver, int _index, int _min = 150, int _max = 510) : PWMdriver(_driver)
{
PWMDriver = _driver;
index = _index;
ticksMinimum = _min;
ticksMaximum = _max;
}
void write(int angle)
{
int ticks = map(angle, 0, 180, ticksMinimum, ticksMaximum);
PWMdriver->setPWM(index, 0, ticks);
}
private:
Adafruit_PWMServoDriver &PWMdriver;
int index;
int ticksMinimum;
int ticksMaximum;
};
// File: walking.cpp
#include "PWMServo.h"
walking::zeroset()
{
for (int i = 0; i < 6; i++) {
PWMServo si(90, i);
delay(100);
}
}
walking::step1()
{
for (int i = 0; i < 4; i++) { //Step 1
PWMServo si(90 - 15 * i);;
delay(100);
if (i < 3) {
PWMServo si(90 - 10 * i);
delay(100);
}
}
}
//walking.h
#ifndef walking_h
#define walking_h
#include "walking.cpp"
class walking
{
public:
// One or more constructors (two in this example)
zeroset();
step1();
private:
};
#endif
//Errors
In file included from C:\Users\utente\Documents\Arduino\Prova_H_CPP\Test_h_cpp.ino\walking.cpp:3:0,
from C:\Users\utente\Documents\Arduino\Prova_H_CPP\Test_h_cpp.ino\walking.h:6,
from C:\Users\utente\Documents\Arduino\Prova_H_CPP\Test_h_cpp.ino\Test_h_cpp.ino.ino:5:
C:\Users\utente\Documents\Arduino\Prova_H_CPP\Test_h_cpp.ino\PWMServo.h: In constructor 'PWMServo::PWMServo(Adafruit_PWMServoDriver&, int, int, int)':
PWMServo.h:11:7: error: 'PWMDriver' was not declared in this scope
PWMDriver = _driver;
^~~~~~~~~
C:\Users\utente\Documents\Arduino\Prova_H_CPP\Test_h_cpp.ino\PWMServo.h:11:7: note: suggested alternative: 'PWMdriver'
PWMDriver = _driver;
^~~~~~~~~
PWMdriver
C:\Users\utente\Documents\Arduino\Prova_H_CPP\Test_h_cpp.ino\PWMServo.h: In member function 'void PWMServo::write(int)':
PWMServo.h:20:16: error: base operand of '->' has non-pointer type 'Adafruit_PWMServoDriver'
PWMdriver->setPWM(index, 0, ticks);
^~
In file included from C:\Users\utente\Documents\Arduino\Prova_H_CPP\Test_h_cpp.ino\walking.h:6:0,
from C:\Users\utente\Documents\Arduino\Prova_H_CPP\Test_h_cpp.ino\Test_h_cpp.ino.ino:5:
C:\Users\utente\Documents\Arduino\Prova_H_CPP\Test_h_cpp.ino\walking.cpp: At global scope:
walking.cpp:5:1: error: 'walking' does not name a type; did you mean 'walking_h'?
walking::zeroset()
^~~~~~~
walking_h
walking.cpp:14:1: error: 'walking' does not name a type; did you mean 'walking_h'?
walking::step1()
^~~~~~~
walking_h
In file included from C:\Users\utente\Documents\Arduino\Prova_H_CPP\Test_h_cpp.ino\Test_h_cpp.ino.ino:5:0:
C:\Users\utente\Documents\Arduino\Prova_H_CPP\Test_h_cpp.ino\walking.h:13:13: warning: ISO C++ forbids declaration of 'zeroset' with no type [-fpermissive]
zeroset();
^
C:\Users\utente\Documents\Arduino\Prova_H_CPP\Test_h_cpp.ino\walking.h:14:11: warning: ISO C++ forbids declaration of 'step1' with no type [-fpermissive]
step1();
^
In file included from C:\Users\utente\Documents\Arduino\Prova_H_CPP\Test_h_cpp.ino\walking.cpp:3:0,
from C:\Users\utente\Documents\Arduino\Prova_H_CPP\Test_h_cpp.ino\Test_h_cpp.ino.ino:6:
PWMServo.h:6:7: error: redefinition of 'class PWMServo'
class PWMServo
^~~~~~~~
In file included from C:\Users\utente\Documents\Arduino\Prova_H_CPP\Test_h_cpp.ino\walking.cpp:3:0,
from C:\Users\utente\Documents\Arduino\Prova_H_CPP\Test_h_cpp.ino\walking.h:6,
from C:\Users\utente\Documents\Arduino\Prova_H_CPP\Test_h_cpp.ino\Test_h_cpp.ino.ino:5:
C:\Users\utente\Documents\Arduino\Prova_H_CPP\Test_h_cpp.ino\PWMServo.h:6:7: note: previous definition of 'class PWMServo'
class PWMServo
^~~~~~~~
In file included from C:\Users\utente\Documents\Arduino\Prova_H_CPP\Test_h_cpp.ino\Test_h_cpp.ino.ino:6:0:
C:\Users\utente\Documents\Arduino\Prova_H_CPP\Test_h_cpp.ino\walking.cpp:5:18: warning: ISO C++ forbids declaration of 'zeroset' with no type [-fpermissive]
walking::zeroset()
^
C:\Users\utente\Documents\Arduino\Prova_H_CPP\Test_h_cpp.ino\walking.cpp: In member function 'int walking::zeroset()':
walking.cpp:8:22: error: cannot bind non-const lvalue reference of type 'Adafruit_PWMServoDriver&' to an rvalue of type 'Adafruit_PWMServoDriver'
PWMServo si(90, i);
^
In file included from C:\Users\utente\Documents\Arduino\Prova_H_CPP\Test_h_cpp.ino\PWMServo.h:4:0,
from C:\Users\utente\Documents\Arduino\Prova_H_CPP\Test_h_cpp.ino\walking.cpp:3,
from C:\Users\utente\Documents\Arduino\Prova_H_CPP\Test_h_cpp.ino\walking.h:6,
from C:\Users\utente\Documents\Arduino\Prova_H_CPP\Test_h_cpp.ino\Test_h_cpp.ino.ino:5:
C:\Users\utente\Documents\Arduino\libraries\Adafruit_PWM_Servo_Driver_Library/Adafruit_PWMServoDriver.h:78:3: note: after user-defined conversion: Adafruit_PWMServoDriver::Adafruit_PWMServoDriver(uint8_t)
Adafruit_PWMServoDriver(const uint8_t addr);
^~~~~~~~~~~~~~~~~~~~~~~
In file included from C:\Users\utente\Documents\Arduino\Prova_H_CPP\Test_h_cpp.ino\walking.cpp:3:0:
C:\Users\utente\Documents\Arduino\Prova_H_CPP\Test_h_cpp.ino\PWMServo.h: In constructor 'PWMServo::PWMServo(Adafruit_PWMServoDriver&, int, int, int)':
PWMServo.h:11:7: error: 'PWMDriver' was not declared in this scope
PWMDriver = _driver;
^~~~~~~~~
In file included from C:\Users\utente\Documents\Arduino\Prova_H_CPP\Test_h_cpp.ino\walking.cpp:3:0,
from C:\Users\utente\Documents\Arduino\Prova_H_CPP\Test_h_cpp.ino\walking.h:6,
from C:\Users\utente\Documents\Arduino\Prova_H_CPP\Test_h_cpp.ino\Test_h_cpp.ino.ino:5:
C:\Users\utente\Documents\Arduino\Prova_H_CPP\Test_h_cpp.ino\PWMServo.h:9:5: note: initializing argument 1 of 'PWMServo::PWMServo(Adafruit_PWMServoDriver&, int, int, int)'
PWMServo(Adafruit_PWMServoDriver &_driver, int _index, int _min = 150, int _max = 510) : PWMdriver(_driver)
^~~~~~~~
In file included from C:\Users\utente\Documents\Arduino\Prova_H_CPP\Test_h_cpp.ino\Test_h_cpp.ino.ino:6:0:
C:\Users\utente\Documents\Arduino\Prova_H_CPP\Test_h_cpp.ino\walking.cpp: At global scope:
C:\Users\utente\Documents\Arduino\Prova_H_CPP\Test_h_cpp.ino\walking.cpp:14:16: warning: ISO C++ forbids declaration of 'step1' with no type [-fpermissive]
walking::step1()
^
C:\Users\utente\Documents\Arduino\Prova_H_CPP\Test_h_cpp.ino\PWMServo.h:11:7: note: suggested alternative: 'PWMdriver'
PWMDriver = _driver;
^~~~~~~~~
PWMdriver
C:\Users\utente\Documents\Arduino\Prova_H_CPP\Test_h_cpp.ino\walking.cpp: In member function 'int walking::step1()':
walking.cpp:18:28: error: no matching function for call to 'PWMServo::PWMServo(int)'
PWMServo si(90 - 15 * i);;
^
In file included from C:\Users\utente\Documents\Arduino\Prova_H_CPP\Test_h_cpp.ino\walking.cpp:3:0,
from C:\Users\utente\Documents\Arduino\Prova_H_CPP\Test_h_cpp.ino\walking.h:6,
from C:\Users\utente\Documents\Arduino\Prova_H_CPP\Test_h_cpp.ino\Test_h_cpp.ino.ino:5:
C:\Users\utente\Documents\Arduino\Prova_H_CPP\Test_h_cpp.ino\PWMServo.h:9:5: note: candidate: PWMServo::PWMServo(Adafruit_PWMServoDriver&, int, int, int)
PWMServo(Adafruit_PWMServoDriver &_driver, int _index, int _min = 150, int _max = 510) : PWMdriver(_driver)
^~~~~~~~
C:\Users\utente\Documents\Arduino\Prova_H_CPP\Test_h_cpp.ino\PWMServo.h:9:5: note: candidate expects 4 arguments, 1 provided
C:\Users\utente\Documents\Arduino\Prova_H_CPP\Test_h_cpp.ino\PWMServo.h:6:7: note: candidate: constexpr PWMServo::PWMServo(const PWMServo&)
class PWMServo
^~~~~~~~
C:\Users\utente\Documents\Arduino\Prova_H_CPP\Test_h_cpp.ino\PWMServo.h:6:7: note: no known conversion for argument 1 from 'int' to 'const PWMServo&'
C:\Users\utente\Documents\Arduino\Prova_H_CPP\Test_h_cpp.ino\PWMServo.h: In member function 'void PWMServo::write(int)':
PWMServo.h:20:16: error: base operand of '->' has non-pointer type 'Adafruit_PWMServoDriver'
PWMdriver->setPWM(index, 0, ticks);
^~
C:\Users\utente\Documents\Arduino\Prova_H_CPP\Test_h_cpp.ino\PWMServo.h:6:7: note: candidate: constexpr PWMServo::PWMServo(PWMServo&&)
C:\Users\utente\Documents\Arduino\Prova_H_CPP\Test_h_cpp.ino\PWMServo.h:6:7: note: no known conversion for argument 1 from 'int' to 'PWMServo&&'
In file included from C:\Users\utente\Documents\Arduino\Prova_H_CPP\Test_h_cpp.ino\Test_h_cpp.ino.ino:6:0:
walking.cpp:21:30: error: no matching function for call to 'PWMServo::PWMServo(int)'
PWMServo si(90 - 10 * i);
^
In file included from C:\Users\utente\Documents\Arduino\Prova_H_CPP\Test_h_cpp.ino\walking.cpp:3:0,
from C:\Users\utente\Documents\Arduino\Prova_H_CPP\Test_h_cpp.ino\walking.h:6,
from C:\Users\utente\Documents\Arduino\Prova_H_CPP\Test_h_cpp.ino\Test_h_cpp.ino.ino:5:
C:\Users\utente\Documents\Arduino\Prova_H_CPP\Test_h_cpp.ino\PWMServo.h:9:5: note: candidate: PWMServo::PWMServo(Adafruit_PWMServoDriver&, int, int, int)
PWMServo(Adafruit_PWMServoDriver &_driver, int _index, int _min = 150, int _max = 510) : PWMdriver(_driver)
^~~~~~~~
C:\Users\utente\Documents\Arduino\Prova_H_CPP\Test_h_cpp.ino\PWMServo.h:9:5: note: candidate expects 4 arguments, 1 provided
C:\Users\utente\Documents\Arduino\Prova_H_CPP\Test_h_cpp.ino\PWMServo.h:6:7: note: candidate: constexpr PWMServo::PWMServo(const PWMServo&)
class PWMServo
^~~~~~~~
C:\Users\utente\Documents\Arduino\Prova_H_CPP\Test_h_cpp.ino\PWMServo.h:6:7: note: no known conversion for argument 1 from 'int' to 'const PWMServo&'
C:\Users\utente\Documents\Arduino\Prova_H_CPP\Test_h_cpp.ino\PWMServo.h:6:7: note: candidate: constexpr PWMServo::PWMServo(PWMServo&&)
C:\Users\utente\Documents\Arduino\Prova_H_CPP\Test_h_cpp.ino\PWMServo.h:6:7: note: no known conversion for argument 1 from 'int' to 'PWMServo&&'
In file included from C:\Users\utente\Documents\Arduino\Prova_H_CPP\Test_h_cpp.ino\Test_h_cpp.ino.ino:7:0:
C:\Users\utente\Documents\Arduino\Prova_H_CPP\Test_h_cpp.ino\PWMServo.h: At global scope:
PWMServo.h:6:7: error: redefinition of 'class PWMServo'
class PWMServo
^~~~~~~~
C:\Users\utente\Documents\Arduino\Prova_H_CPP\Test_h_cpp.ino\walking.cpp: At global scope:
walking.cpp:5:1: error: 'walking' does not name a type
walking::zeroset()
^~~~~~~
In file included from C:\Users\utente\Documents\Arduino\Prova_H_CPP\Test_h_cpp.ino\walking.cpp:3:0,
from C:\Users\utente\Documents\Arduino\Prova_H_CPP\Test_h_cpp.ino\walking.h:6,
from C:\Users\utente\Documents\Arduino\Prova_H_CPP\Test_h_cpp.ino\Test_h_cpp.ino.ino:5:
C:\Users\utente\Documents\Arduino\Prova_H_CPP\Test_h_cpp.ino\PWMServo.h:6:7: note: previous definition of 'class PWMServo'
class PWMServo
^~~~~~~~
C:\Users\utente\Documents\Arduino\Prova_H_CPP\Test_h_cpp.ino\Test_h_cpp.ino.ino: In function 'void setup()':
Test_h_cpp.ino:14:3: error: 'pwm' was not declared in this scope
pwm.begin();
^~~
Test_h_cpp.ino:18:20: error: cannot call member function 'int walking::zeroset()' without object
walking::zeroset();
^
C:\Users\utente\Documents\Arduino\Prova_H_CPP\Test_h_cpp.ino\Test_h_cpp.ino.ino: In function 'void loop()':
Test_h_cpp.ino:24:18: error: cannot call member function 'int walking::step1()' without object
walking::step1();
^
walking.cpp:14:1: error: 'walking' does not name a type
walking::step1()
^~~~~~~
exit status 1
'PWMDriver' was not declared in this scope
There are several errors because I do not know how to call the functions in the main .ino file using:
A.step1();
and because this is my first multiple file project. Please help me to correct the mistakes. Thank you for your support so far.