hi leute.
ich habe mir ein code um 4 motoren zu steuren und die werte der encoder zu empfangen.
nun schalte ich drei motoren bekomme ich alles was ich brauche aber wenn ich die 4 motoren anschalte das lauft das programm nicht mehr.
hierbei ist mein code.
/*
Autor: Segning Tazeo cyrille
Datum. 16.08.2019
Motor steuerung mit Display anzeige
*/
#include <Wire.h>
#include "Rad.h"
#include "Display.h"
Display* d;
Rad rechteRad_1(pinMotor_0_0, pinMotor_1_0, pwmMotor_0_1, encoder_pin_Motor_0, "PWM rechte rad_1 "),
rechteRad_2(pinMotor_1_0, pinMotor_1_1, pwmMotor_1_0, encoder_pin_Motor_1, "PWM rechte rad_2 "),
linkeRad_1(pinMotor_2_0, pinMotor_2_1, pwmMotor_2_0, encoder_pin_Motor_2, "PWM linke rad_1 "),
linkeRad_2(pinMotor_3_0, pinMotor_3_1, pwmMotor_3_0, encoder_pin_Motor_3, "PWM linke rad_2 ");
double Rad:: m_encoderValue = 0;
void setup() {
Serial.begin(9600);
attachInterrupt(digitalPinToInterrupt(encoder_pin_Motor_0), Rad::updateEncoder, CHANGE);
attachInterrupt(digitalPinToInterrupt(encoder_pin_Motor_1), Rad::updateEncoder, CHANGE);
attachInterrupt(digitalPinToInterrupt(encoder_pin_Motor_2), Rad::updateEncoder, CHANGE);
attachInterrupt(digitalPinToInterrupt(encoder_pin_Motor_3), Rad::updateEncoder, CHANGE);
delay(200);
rechteRad_1.fahren();
rechteRad_2.fahren();
linkeRad_1.fahren();
linkeRad_2.fahren();
d->initialisierung();
}
void loop() {
rechteRad_1.encoder();
rechteRad_2.encoder();
linkeRad_1.encoder();
linkeRad_2.encoder();
}
#include "Arduino.h"
#include <stdlib.h>
#include "Display.h"
#ifndef RAD_H
#define RAD_H
#define encoder_pin_Motor_0 3
#define encoder_pin_Motor_1 2
#define encoder_pin_Motor_2 19
#define encoder_pin_Motor_3 18
#define pinMotor_0_0 4
#define pinMotor_0_1 5
#define pwmMotor_0_1 11
#define pinMotor_1_0 6
#define pinMotor_1_1 7
#define pwmMotor_1_0 10
#define pinMotor_2_0 52
#define pinMotor_2_1 12
#define pwmMotor_2_0 8
#define pinMotor_3_0 13
#define pinMotor_3_1 50
#define pwmMotor_3_0 9
class Rad
{
public:
Rad(int pinMotor_1, int pinMotor_2, int pinPwmMotor_1, int encoderPin, String radBezeichnung);
void geschwindigkeitHoch(double pwm);
double encoder();
void fahren();
static void updateEncoder() ;
virtual ~Rad();
private:
int m_pinMotor_1_0;
int m_pinMotor_1_1;
int m_pinPwmMotor;
String m_radBezeichnung;
int m_encoderPin;
static double m_encoderValue;
int m_interval;
long m_previousMillis ;
long m_currentMillis;
double m_pwmSinale;
bool m_measureRpm ;
double m_encoderoutput;
int m_rpm;
Display display_; //unsere rad hat ein display
};
#endif
#include "Rad.h"
Rad::Rad(int pinMotor_1, int pinMotor_2, int pinPwmMotor_1, int encoderPin, String radBezeichnung)
{
m_pinMotor_1_0 = pinMotor_1;
m_pinMotor_1_1 = pinMotor_2;
m_radBezeichnung = radBezeichnung;
m_pwmSinale = 68;
pinMode(pinMotor_1, OUTPUT);
pinMode(pinMotor_2, OUTPUT);
pinMode(pinPwmMotor_1, OUTPUT);
pinMode(encoderPin, INPUT_PULLUP);
Serial.println(m_radBezeichnung);
m_interval = 1000;
m_previousMillis = 0;
m_currentMillis = 0;
m_measureRpm = true;
m_encoderoutput = 915;
m_rpm = 0;
}
void Rad::geschwindigkeitHoch(double pwm)
{
if (m_pwmSinale < 125) {
m_pwmSinale += pwm;
analogWrite(m_pinPwmMotor, m_pwmSinale);
} else {
m_pwmSinale -= pwm;
analogWrite(m_pinPwmMotor, m_pwmSinale);
}
}
void Rad::fahren()
{
digitalWrite(m_pinMotor_1_0, HIGH); //digital output
digitalWrite(m_pinMotor_1_1, LOW);
}
double Rad::encoder()
{
m_currentMillis = millis();
if (m_currentMillis - m_previousMillis > m_interval)
{
m_previousMillis = m_currentMillis;
geschwindigkeitHoch(1);
m_rpm = (float)(m_encoderValue * 60 / m_encoderoutput);
// Only update display when there have readings
if (m_pwmSinale > 0 || m_rpm > 0) {
Serial.print(" " + (String)m_pwmSinale + " " + m_radBezeichnung );
Serial.print(m_encoderValue);
Serial.print(" pulse / ");
Serial.print(m_encoderoutput);
Serial.print(" pulse per rotation x 60 seconds = ");
Serial.print(m_rpm);
Serial.println(" RPM");
display_.werteEncoder((String)m_pwmSinale, m_radBezeichnung, (String)m_encoderValue, " pulse / r x 60 sec", (String)m_rpm, " RPM" );
}
m_encoderValue = 0;
}
}
void Rad::updateEncoder()
{
m_encoderValue++;
}
Rad::~Rad()
{
}
#include "Arduino.h"
#include <stdlib.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#ifndef DISPLAY_H
#define DISPLAY_H
#define SCREEN_WIDTH 128 // OLED display width, in pixels
#define SCREEN_HEIGHT 32 // OLED display height, in pixels
// Declaration for an SSD1306 display connected to I2C (SDA, SCL pins)
#define OLED_RESET 4 // Reset pin # (or -1 if sharing Arduino reset pin)
#define NUMFLAKES 10 // Number of snowflakes in the animation example
#define LOGO_HEIGHT 16
#define LOGO_WIDTH 16
class Display
{
public:
Display();
void werteEncoder(String werte, String infos, String werte_1,String infos_1, String werte_2 , String infos_2)const;
void initialisierung();
//virtual ~Display();
protected:
String m_werte;
String m_infos;
};
#endif
#include "Display.h"
Adafruit_SSD1306 display_1(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);
Adafruit_SSD1306 display_2(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);
Display::Display()
{
// display_2.begin(SSD1306_SWITCHCAPVCC, 0x3C);
m_werte = "";
m_infos = "";
}
void Display::initialisierung()
{
display_1.begin("y0", 0x3D);
display_2.begin("y1", 0x3C);
if (!display_1.begin("y0", 0x3D)) { // Address 0x3C for 128x32
Serial.println(F("SSD1306 allocation failed"));
for (;;); // Don't proceed, loop forever
}
display_1.display();
delay(20); // Pause for 0.2 seconds
display_2.display();
delay(20); // Pause for 0.2 seconds
// Clear the buffer
display_1.clearDisplay();
// Clear the buffer
display_2.clearDisplay();
}
void Display::werteEncoder(String werte, String infos, String werte_1,String infos_1, String werte_2 , String infos_2) const {
//m_werte=
display_1.clearDisplay();
display_2.clearDisplay();
display_1.setTextSize(1); // Normal 1:1 pixel scale
display_2.setTextSize(1); // Normal 1:1 pixel scale
display_1.setTextColor(WHITE); // Draw white text
display_2.setTextColor(WHITE); // Draw white text
display_1.setCursor(0, 0); // Start at top-left corner
display_2.setCursor(0, 0); // Start at top-left corner
display_1.println(F("KING, DJAMAL!"));
display_2.println(F("DARK, ANGEL!"));
display_1.setTextSize(1);
display_1.setTextColor(WHITE);
display_1.println(werte);
display_1.println(werte_1);
display_1.println(werte_2);
//display_1.startscrollright(0x00, 0x0F);
display_2.setTextSize(1);
display_2.setTextColor(WHITE);
display_2.println(infos);
display_2.println(infos_1);
display_2.println(infos_2);
//display_2.startscrollright(0x00, 0x0F);
display_1.display();
display_2.display();
delay(10);
}
danke im voraus