I am trying to run my code but get some erros , please help.
prototype for 'Motor::Motor(int,int,int,int)' does not any match any in class 'Motor'
Arduino:1.8.15 (Linux), Kart:"Arduino Uno"
motor.cpp:5:1: error: prototype for 'Motor::Motor(int, int, int, int)' does not match any in class 'Motor'
Motor::Motor(int plus, int minus, int en_a, int en_b) {
^~~~~
In file included from /home/ahmet/Masaüstü/navbot/motor.cpp:2:0:
/home/ahmet/snap/arduino/current/Arduino/libraries/Motor/Motor.h:33:7: error: candidates are: constexpr Motor::Motor(Motor&&)
class Motor
^~~~~
/home/ahmet/snap/arduino/current/Arduino/libraries/Motor/Motor.h:33:7: error: constexpr Motor::Motor(const Motor&)
/home/ahmet/snap/arduino/current/Arduino/libraries/Motor/Motor.h:36:9: error: Motor::Motor(int, int)
Motor(int dir, int pwn);
^~~~~
motor.cpp:16:29: error: no 'void Motor::rotate(int)' member function declared in class 'Motor'
void Motor::rotate(int value) {
^
navbot:11:24: error: no matching function for call to 'Motor::Motor(int, int, int, int)'
Motor right(11,10,20,21);
^
In file included from /home/ahmet/Masaüstü/navbot/navbot.ino:4:0:
/home/ahmet/snap/arduino/current/Arduino/libraries/Motor/Motor.h:36:9: note: candidate: Motor::Motor(int, int)
Motor(int dir, int pwn);
^~~~~
/home/ahmet/snap/arduino/current/Arduino/libraries/Motor/Motor.h:36:9: note: candidate expects 2 arguments, 4 provided
/home/ahmet/snap/arduino/current/Arduino/libraries/Motor/Motor.h:33:7: note: candidate: constexpr Motor::Motor(const Motor&)
class Motor
^~~~~
/home/ahmet/snap/arduino/current/Arduino/libraries/Motor/Motor.h:33:7: note: candidate expects 1 argument, 4 provided
/home/ahmet/snap/arduino/current/Arduino/libraries/Motor/Motor.h:33:7: note: candidate: constexpr Motor::Motor(Motor&&)
/home/ahmet/snap/arduino/current/Arduino/libraries/Motor/Motor.h:33:7: note: candidate expects 1 argument, 4 provided
navbot:12:21: error: no matching function for call to 'Motor::Motor(int, int, int, int)'
Motor left(9,8,18,19);
^
In file included from /home/ahmet/Masaüstü/navbot/navbot.ino:4:0:
/home/ahmet/snap/arduino/current/Arduino/libraries/Motor/Motor.h:36:9: note: candidate: Motor::Motor(int, int)
Motor(int dir, int pwn);
^~~~~
/home/ahmet/snap/arduino/current/Arduino/libraries/Motor/Motor.h:36:9: note: candidate expects 2 arguments, 4 provided
/home/ahmet/snap/arduino/current/Arduino/libraries/Motor/Motor.h:33:7: note: candidate: constexpr Motor::Motor(const Motor&)
class Motor
^~~~~
/home/ahmet/snap/arduino/current/Arduino/libraries/Motor/Motor.h:33:7: note: candidate expects 1 argument, 4 provided
/home/ahmet/snap/arduino/current/Arduino/libraries/Motor/Motor.h:33:7: note: candidate: constexpr Motor::Motor(Motor&&)
/home/ahmet/snap/arduino/current/Arduino/libraries/Motor/Motor.h:33:7: note: candidate expects 1 argument, 4 provided
In file included from /snap/arduino/61/hardware/arduino/avr/cores/arduino/Arduino.h:258:0,
from sketch/navbot.ino.cpp:1:
/home/ahmet/Masaüstü/navbot/navbot.ino: In function 'void setup()':
navbot:65:46: error: 'class Motor' has no member named 'en_a'
attachInterrupt(digitalPinToInterrupt(left.en_a), change_left_a, CHANGE);
^
/snap/arduino/61/hardware/arduino/avr/variants/standard/pins_arduino.h:79:37: note: in definition of macro 'digitalPinToInterrupt'
#define digitalPinToInterrupt(p) ((p) == 2 ? 0 : ((p) == 3 ? 1 : NOT_AN_INTERRUPT))
^
navbot:65:46: error: 'class Motor' has no member named 'en_a'
attachInterrupt(digitalPinToInterrupt(left.en_a), change_left_a, CHANGE);
^
/snap/arduino/61/hardware/arduino/avr/variants/standard/pins_arduino.h:79:53: note: in definition of macro 'digitalPinToInterrupt'
#define digitalPinToInterrupt(p) ((p) == 2 ? 0 : ((p) == 3 ? 1 : NOT_AN_INTERRUPT))
^
navbot:66:46: error: 'class Motor' has no member named 'en_b'
attachInterrupt(digitalPinToInterrupt(left.en_b), change_left_b, CHANGE);
^
/snap/arduino/61/hardware/arduino/avr/variants/standard/pins_arduino.h:79:37: note: in definition of macro 'digitalPinToInterrupt'
#define digitalPinToInterrupt(p) ((p) == 2 ? 0 : ((p) == 3 ? 1 : NOT_AN_INTERRUPT))
^
navbot:66:46: error: 'class Motor' has no member named 'en_b'
attachInterrupt(digitalPinToInterrupt(left.en_b), change_left_b, CHANGE);
^
/snap/arduino/61/hardware/arduino/avr/variants/standard/pins_arduino.h:79:53: note: in definition of macro 'digitalPinToInterrupt'
#define digitalPinToInterrupt(p) ((p) == 2 ? 0 : ((p) == 3 ? 1 : NOT_AN_INTERRUPT))
^
navbot:67:47: error: 'class Motor' has no member named 'en_a'
attachInterrupt(digitalPinToInterrupt(right.en_a), change_right_a, CHANGE);
^
/snap/arduino/61/hardware/arduino/avr/variants/standard/pins_arduino.h:79:37: note: in definition of macro 'digitalPinToInterrupt'
#define digitalPinToInterrupt(p) ((p) == 2 ? 0 : ((p) == 3 ? 1 : NOT_AN_INTERRUPT))
^
navbot:67:47: error: 'class Motor' has no member named 'en_a'
attachInterrupt(digitalPinToInterrupt(right.en_a), change_right_a, CHANGE);
^
/snap/arduino/61/hardware/arduino/avr/variants/standard/pins_arduino.h:79:53: note: in definition of macro 'digitalPinToInterrupt'
#define digitalPinToInterrupt(p) ((p) == 2 ? 0 : ((p) == 3 ? 1 : NOT_AN_INTERRUPT))
^
navbot:68:47: error: 'class Motor' has no member named 'en_b'
attachInterrupt(digitalPinToInterrupt(right.en_b), change_right_b, CHANGE);
^
/snap/arduino/61/hardware/arduino/avr/variants/standard/pins_arduino.h:79:37: note: in definition of macro 'digitalPinToInterrupt'
#define digitalPinToInterrupt(p) ((p) == 2 ? 0 : ((p) == 3 ? 1 : NOT_AN_INTERRUPT))
^
navbot:68:47: error: 'class Motor' has no member named 'en_b'
attachInterrupt(digitalPinToInterrupt(right.en_b), change_right_b, CHANGE);
^
/snap/arduino/61/hardware/arduino/avr/variants/standard/pins_arduino.h:79:53: note: in definition of macro 'digitalPinToInterrupt'
#define digitalPinToInterrupt(p) ((p) == 2 ? 0 : ((p) == 3 ? 1 : NOT_AN_INTERRUPT))
^
/home/ahmet/Masaüstü/navbot/navbot.ino: In function 'void loop()':
navbot:117:10: error: 'class Motor' has no member named 'rotate'
left.rotate(left_output);
^~~~~~
navbot:119:11: error: 'class Motor' has no member named 'rotate'
right.rotate(right_output);
^~~~~~
/home/ahmet/Masaüstü/navbot/navbot.ino: In function 'void change_left_a()':
navbot:137:24: error: 'class Motor' has no member named 'en_a'
if (digitalRead(left.en_a) == HIGH) {
^~~~
navbot:139:26: error: 'class Motor' has no member named 'en_b'
if (digitalRead(left.en_b) == LOW) {
^~~~
navbot:149:26: error: 'class Motor' has no member named 'en_b'
if (digitalRead(left.en_b) == HIGH) {
^~~~
/home/ahmet/Masaüstü/navbot/navbot.ino: In function 'void change_left_b()':
navbot:162:24: error: 'class Motor' has no member named 'en_b'
if (digitalRead(left.en_b) == HIGH) {
^~~~
navbot:164:26: error: 'class Motor' has no member named 'en_a'
if (digitalRead(left.en_a) == HIGH) {
^~~~
navbot:174:26: error: 'class Motor' has no member named 'en_a'
if (digitalRead(left.en_a) == LOW) {
^~~~
/home/ahmet/Masaüstü/navbot/navbot.ino: In function 'void change_right_a()':
navbot:190:25: error: 'class Motor' has no member named 'en_a'
if (digitalRead(right.en_a) == HIGH) {
^~~~
navbot:192:27: error: 'class Motor' has no member named 'en_b'
if (digitalRead(right.en_b) == LOW) {
^~~~
navbot:202:27: error: 'class Motor' has no member named 'en_b'
if (digitalRead(right.en_b) == HIGH) {
^~~~
/home/ahmet/Masaüstü/navbot/navbot.ino: In function 'void change_right_b()':
navbot:215:25: error: 'class Motor' has no member named 'en_b'
if (digitalRead(right.en_b) == HIGH) {
^~~~
navbot:217:27: error: 'class Motor' has no member named 'en_a'
if (digitalRead(right.en_a) == HIGH) {
^~~~
navbot:227:27: error: 'class Motor' has no member named 'en_a'
if (digitalRead(right.en_a) == LOW) {
^~~~
exit status 1
prototype for 'Motor::Motor(int, int, int, int)' does not match any in class 'Motor'
This report would have more information with
"Show verbose output during compilation"
option enabled in File -> Preferences.
Navbot.ino
//Import Motor - Cytron SPG30E-30K
#include "Motor.h"
#include <ros.h>
#include <geometry_msgs/Twist.h>
#include<PID_v1.h>
ros::NodeHandle nh;
Motor right(11,10,20,21);
Motor left(9,8,18,19);
volatile long encoder0Pos = 0; // encoder 1
volatile long encoder1Pos = 0; // encoder 2
double left_kp = 3.8 , left_ki = 0 , left_kd = 0.03; // modify for optimal performance
double right_kp = 4 , right_ki = 0 , right_kd = 0.03;
double right_input = 0, right_output = 0, right_setpoint = 0;
PID rightPID(&right_input, &right_output, &right_setpoint, right_kp, right_ki, right_kd, DIRECT);
double left_input = 0, left_output = 0, left_setpoint = 0;
PID leftPID(&left_input, &left_output, &left_setpoint, left_kp, left_ki, left_kd, DIRECT);
float demandx=0;
float demandz=0;
double demand_speed_left;
double demand_speed_right;
unsigned long currentMillis;
unsigned long prevMillis;
float encoder0Diff;
float encoder1Diff;
float encoder0Error;
float encoder1Error;
float encoder0Prev;
float encoder1Prev;
void cmd_vel_cb( const geometry_msgs::Twist& twist){
demandx = twist.linear.x;
demandz = twist.angular.z;
}
ros::Subscriber<geometry_msgs::Twist> sub("cmd_vel", cmd_vel_cb );
void setup() {
nh.initNode();
nh.subscribe(sub);
// Serial.begin(115200);
rightPID.SetMode(AUTOMATIC);
rightPID.SetSampleTime(1);
rightPID.SetOutputLimits(-100, 100);
leftPID.SetMode(AUTOMATIC);
leftPID.SetSampleTime(1);
leftPID.SetOutputLimits(-100, 100);
// Serial.println("Basic Encoder Test:");
attachInterrupt(digitalPinToInterrupt(left.en_a), change_left_a, CHANGE);
attachInterrupt(digitalPinToInterrupt(left.en_b), change_left_b, CHANGE);
attachInterrupt(digitalPinToInterrupt(right.en_a), change_right_a, CHANGE);
attachInterrupt(digitalPinToInterrupt(right.en_b), change_right_b, CHANGE);
}
void loop() {
currentMillis = millis();
if (currentMillis - prevMillis >= 10){
prevMillis = currentMillis;
// if(Serial.available()>0){
// char c = Serial.read();
// if(c == 'a'){
// demandx = 0.5;
// demandz=0;
// }else if (c == 'b'){
// demandx = -0.5;
// demandz = 0;
// }else if(c == 'c'){
// demandx = 0;
// demandz = 1;
// }else if(c == 'd'){
// demandx = 0;
// demandz = 1;
// }else if(c == 'e'){
// demandx = 0;
// demandz = 0;
// }
// }
demand_speed_left = demandx - (demandz*0.1075);
demand_speed_right = demandx + (demandz*0.1075);
/*PID controller for speed control
Base speed being 1 ms and the demand_speed variables controlling it at fractions of the base.
The PID controller keeps trying to match the difference
in encoder counts to match with the required amount, hence controlling the speed. */
encoder0Diff = encoder0Pos - encoder0Prev; // Get difference between ticks to compute speed
encoder1Diff = encoder1Pos - encoder1Prev;
encoder0Error = (demand_speed_left*39.65)-encoder0Diff; // 3965 ticks in 1m = 39.65 ticks in 10ms, due to the 10 millis loop
encoder1Error = (demand_speed_right*39.65)-encoder1Diff;
encoder0Prev = encoder0Pos; // Saving values
encoder1Prev = encoder1Pos;
left_setpoint = demand_speed_left*39.65; //Setting required speed as a mul/frac of 1 m/s
right_setpoint = demand_speed_right*39.65;
left_input = encoder0Diff; //Input to PID controller is the current difference
right_input = encoder1Diff;
leftPID.Compute();
left.rotate(left_output);
rightPID.Compute();
right.rotate(right_output);
// Serial.print(encoder0Pos);
// Serial.print(",");
// Serial.println(encoder1Pos);
}
}
// ************** encoders interrupts **************
// ************** encoder 1 *********************
void change_left_a(){
// look for a low-to-high on channel A
if (digitalRead(left.en_a) == HIGH) {
// check channel B to see which way encoder is turning
if (digitalRead(left.en_b) == LOW) {
encoder0Pos = encoder0Pos + 1; // CW
}
else {
encoder0Pos = encoder0Pos - 1; // CCW
}
}
else // must be a high-to-low edge on channel A
{
// check channel B to see which way encoder is turning
if (digitalRead(left.en_b) == HIGH) {
encoder0Pos = encoder0Pos + 1; // CW
}
else {
encoder0Pos = encoder0Pos - 1; // CCW
}
}
}
void change_left_b(){
// look for a low-to-high on channel B
if (digitalRead(left.en_b) == HIGH) {
// check channel A to see which way encoder is turning
if (digitalRead(left.en_a) == HIGH) {
encoder0Pos = encoder0Pos + 1; // CW
}
else {
encoder0Pos = encoder0Pos - 1; // CCW
}
}
// Look for a high-to-low on channel B
else {
// check channel B to see which way encoder is turning
if (digitalRead(left.en_a) == LOW) {
encoder0Pos = encoder0Pos + 1; // CW
}
else {
encoder0Pos = encoder0Pos - 1; // CCW
}
}
}
// ************** encoder 2 *********************
void change_right_a(){
// look for a low-to-high on channel A
if (digitalRead(right.en_a) == HIGH) {
// check channel B to see which way encoder is turning
if (digitalRead(right.en_b) == LOW) {
encoder1Pos = encoder1Pos - 1; // CW
}
else {
encoder1Pos = encoder1Pos + 1; // CCW
}
}
else // must be a high-to-low edge on channel A
{
// check channel B to see which way encoder is turning
if (digitalRead(right.en_b) == HIGH) {
encoder1Pos = encoder1Pos - 1; // CW
}
else {
encoder1Pos = encoder1Pos + 1; // CCW
}
}
}
void change_right_b(){
// look for a low-to-high on channel B
if (digitalRead(right.en_b) == HIGH) {
// check channel A to see which way encoder is turning
if (digitalRead(right.en_a) == HIGH) {
encoder1Pos = encoder1Pos - 1; // CW
}
else {
encoder1Pos = encoder1Pos + 1; // CCW
}
}
// Look for a high-to-low on channel B
else {
// check channel B to see which way encoder is turning
if (digitalRead(right.en_a) == LOW) {
encoder1Pos = encoder1Pos - 1; // CW
}
else {
encoder1Pos = encoder1Pos + 1; // CCW
}
}
}
Motor.cpp
#include "Arduino.h"
#include "Motor.h"
Motor::Motor(int plus, int minus, int en_a, int en_b) {
pinMode(plus,OUTPUT);
pinMode(minus,OUTPUT);
pinMode(en_a,INPUT_PULLUP);
pinMode(en_b,INPUT_PULLUP);
Motor::plus = plus;
Motor::minus = minus;
Motor::en_a = en_a;
Motor::en_b = en_b;
}
void Motor::rotate(int value) {
if(value>=0){
//Max Voltage with 16V battery with 12V required
//(12/16)*255 ~=190
// Serial.println("called");
// Serial.println(plus);
int out = map(value, 0, 100, 0, 190);
analogWrite(plus,out);
analogWrite(minus,0);
}else{
//Max Voltage with 16V battery with 12V required
//(12/16)*255 ~=190
int out = map(value, 0, -100, 0, 190);
analogWrite(plus,0);
analogWrite(minus,out);
}
}
Motor.h
/*
Motor.h - Library for working with the Cytron SPG30E-30K.
Created by Vinay Lanka, January 27, 2021.
*/
#ifndef Motor_h
#define Motor_h
#include "Arduino.h"
class Motor {
public:
//Constructor - Plus and Minus are the Motor output / en_a and en_b are the encoder inputs
Motor(int plus, int minus, int en_a, int en_b);
//Spin the motor with a percentage value
void rotate(int value);
//Motor Outputs - plus is one direction and minus is the other
int plus;
int minus;
//Encoder Inputs
int en_a;
int en_b;
};
#endif