Go Down

Topic: verlauf fehler. (Read 100 times) previous topic - next topic

Djamalx

Aug 18, 2019, 02:38 pm Last Edit: Aug 18, 2019, 10:54 pm by uwefed Reason: add COD TAGS </>
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.

Code: [Select]
/*
  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

Serenifly

#1
Aug 18, 2019, 02:45 pm Last Edit: Aug 18, 2019, 02:52 pm by Serenifly
Bitte Code Tags verwenden, damit man es auch lesen kann!!

Code: [Select]

attachInterrupt(digitalPinToInterrupt(encoder_pin_Motor_0), Rad::updateEncoder, CHANGE);

Du hast die Methode jetzt statisch gemacht damit das mit dem Funktionszeiger klappt. Und dann noch die Variablen statisch gemacht damit die Methode darauf zugreifen kann.

Was da genau abläuft hast du aber scheinbar nicht verstanden. Statische Elemente sind für alle Objekte der Klasse gleich. Das ist selten so gewünscht. Und schlägt hier fehlt, da du damit praktische keine getrennten Objekte mehr hast


Man kann Interrupts auch per Hand programmieren. Dann bist du nicht auf die Arduino API und ihre Limitationen beschränkt.
Oder viel besser: auf Pin-Interrupts verzichten! Das ist sowieso unnötig. Dreh-Encoder lassen sich schön auslesen wenn man sie regelmäßig in einem Timer-Interrupt abragt (Polling). Alle 1 oder 2ms reicht da je nach Geschwindigkeit.

Code: [Select]
void werteEncoder(String werte,  String infos, String werte_1,String infos_1, String werte_2 , String infos_2)const;
Objekte solltest du immer als Referenz übergeben. Sonst wird eine Kopie angelegt.

Korrekt:
Code: [Select]

void werteEncoder(String& werte, ...)

uwefed

Welche Arduino verwendest Du denn?
Grüße Uwe

ElEspanol

#3
Aug 19, 2019, 03:35 pm Last Edit: Aug 19, 2019, 03:36 pm by ElEspanol
nun schalte ich drei motoren bekomme ich alles was ich brauche aber wenn ich die 4 motoren anschalte das lauft das programm nicht mehr.
Kommasetzung wäre nicht schlecht. Groß/Kleinschreibung wäre dann das Sahnehäubchen.

Siehe: Komm wir essen Opa

Go Up