Go Down

Topic: Hilfe, plötzlicher Stromimpuls (Read 242 times) previous topic - next topic

Kaputtccino87

Oct 13, 2019, 10:33 am Last Edit: Oct 13, 2019, 10:48 am by Kaputtccino87
Huhu, ich bin neu hier und gleich mal ne Frage an euch.
Ich habe mir eine Schaltung aufgebaut die soweit funktioniert, aber es kommt zu willkürlichen Stromimpulsen, sodass jeder Motor kurz anfährt, obwohl ich nichts mache.
Ich habe folgendes: Ein PS2 Controller inkl. Antenne, ein Servo, vier Steppmotoren und zwei Gleichstrommotoren. Meine Vermutung ist, dass der Haltestrom der Stepper das Problem ist, eventuell würden Kondensatoren helfen, im Moment hängt jeder Stepper an an einer UNL2003 Platine und alles teilt sich eine Stromversorgung, oder soll ich anstatt UNL2003 jeden Stepper über eine HBrücke L298N ansteuern.
Weil es recht nervig ist wenn plötzlich der Servo einen Impuls bekommt und seine Position ohne Eingabe anfährt. Eine zweite Stromkreislauf wäre auch möglich, hat da jemand eine Idee für mich? Vielen lieben Dank.

combie

Wer seine Meinung nie zurückzieht, liebt sich selbst mehr als die Wahrheit.

Quelle: Joseph Joubert

uwefed

#2
Oct 13, 2019, 11:04 am Last Edit: Oct 13, 2019, 11:04 am by uwefed
Mit Deinen Angaben ist leider keine sinnvolle Antwort  zu geben.
Wir brauchen Schaltbild (auch mit Bleistift auf Papier gezeichnet und abfotografiert), die verwendeten Teile (bitte Link auf Händler wo Du sie eingekauft hast) und Sketch.

Grüße Uwe

HotSystems

Dann miss doch mal mit einem Oszi wo dieser Impuls herkommt.
Dann sehen wir weiter.
Gruß Dieter

I2C = weniger ist mehr: weniger Kabel, mehr Probleme. 8)

postmaster-ino

Hi

So wie sich Das Verworrene dort liest, zucken die Servos.
Die Stepper werden wohl 28BYJ-48 sein - sonst wäre mir noch kein Stepper unter gekommen, Der am ULN2003 betrieben wird - kleiner Tip(p): an einem Treiber darfst Du nur bis Halbschritt runter - bei x_tel-Schritten dürfte die Verbindung der beiden Mittelanzapfungen der Spulen stören - ungetestet! L298 kann nur Voll- und Halbschritt, Der sollte also 'von Haus aus' klappen - ist aber unnötig.

Bitte umschreibe Dein Problem besser - bis jetzt sehe ich nur, daß irgend etwas bei Dir ungewollt 'zuckt' - was genau davon ... kA.

MfG
anscheinend ist Es nicht erwünscht, einen Foren-internen Link als 'Homepage' einzubinden, damit JEDER nur einen Klick von combie's Liste zum Thema State-Maschine entfernt ist.
... dann eben nicht ...

uwefed

Ich sehe ein Spannungsversorgungsproblem aber ohne nähere Angaben ist es Stochern im Nebel.

Grüße Uwe

ElEspanol

Beschreibung der Stromversorgung und Fotos vom Aufbau schaden auch nicht bei der Suche nach einer Lösung

Kaputtccino87

Huhu, ja sorry, hab vorhin am Handy geschrieben, dass Problem hat wirklich etwas mit der Speedabfrage der Steppermotoren zu tun, dass klappt jetzt besser, ich habe gleich noch eine Frage: ich habe im loop-Teil mehrere "if"-Abfragen, welcher Motor laufen soll wenn Taste x gedrückt wird usw...

ich habe als Standardwert einen Servo auf 90° der bei der einen Taste 45° links drehen soll und bei der anderen Taste 45° rechts drehen soll, aber es funktioniert nur die untere Abfrage, außer ich mach ein delay, dann läuft es aber nicht wie gewünscht und der Servo fährt verzögert und nicht 100%ig, dass liegt ja am loop Teil, jetzt meine Frage: wie löst man so ein Problem..

Code: [Select]

#include <PS2X_lib.h>
#include <Wire.h>
#include <Stepper.h>
#include <Servo.h>
 
const int stepsPerRevolution = 2048;

PS2X ps2x;

int error = 0;
byte type = 0;
byte vibrate = 0;

Stepper myStepper = Stepper(stepsPerRevolution, 26, 28, 27, 29);
Stepper myStepper2 = Stepper(stepsPerRevolution, 32, 34, 33, 35);
Stepper myStepper3 = Stepper(stepsPerRevolution, 38, 40, 39, 41);
Stepper myStepper4 = Stepper(stepsPerRevolution, 44, 46, 45, 47);

#define L2 ps2x.Button(PSB_L2)
#define L1 ps2x.Button(PSB_L1)
#define R2 ps2x.Button(PSB_R2)
#define R1 ps2x.Button(PSB_R1)
#define PAD_UP ps2x.Button(PSB_PAD_UP)
#define PAD_RIGHT ps2x.Button(PSB_PAD_RIGHT)
#define PAD_LEFT ps2x.Button(PSB_PAD_LEFT)
#define PAD_DOWN ps2x.Button(PSB_PAD_DOWN)
#define TRIANGLE ps2x.Button(PSB_TRIANGLE)
#define CIRCLE ps2x.Button(PSB_CIRCLE)
#define SQUARE ps2x.Button(PSB_SQUARE)
#define CROSS ps2x.Button(PSB_CROSS)
#define SELECT ps2x.Button(PSB_SELECT)
#define START ps2x.Button(PSB_START)
#define R3 ps2x.Button(PSB_R3)
#define L3 ps2x.Button(PSB_L3)
  

const int motorPin1  = 7;
const int motorPin2  = 6;
const int motorPin3  = 9;
const int motorPin4  = 8;
int speed = 180;


int standard = 90;
int links = 135;
int rechts = 45;

Servo servoblau;

void setup(){
  
  Serial.begin(9600);
    
 error = ps2x.config_gamepad(25,23,22,24, true, true);

   type = ps2x.readType();
     switch(type) {
       case 0:
        Serial.println("Unknown Controller type");
       break;
       case 1:
        Serial.println("DualShock Controller Found");
       break;
     }
    
 

pinMode(motorPin1, OUTPUT);
pinMode(motorPin2, OUTPUT);
pinMode(motorPin3, OUTPUT);
pinMode(motorPin4, OUTPUT);

analogWrite(motorPin1, 0);
analogWrite(motorPin2, 0);
analogWrite(motorPin3, 0);
analogWrite(motorPin4, 0);

servoblau.attach(3);
 



}



void loop(){
ps2x.read_gamepad();




if (PAD_RIGHT) {
servoblau.write(rechts);
 } else {
  servoblau.write(standard);
  }
  
delay(10);

if (PAD_LEFT) {
servoblau.write(links);
 } else {
  servoblau.write(standard);
  }
  
delay(10);

if(R1){
analogWrite(motorPin1, 150000);
analogWrite(motorPin2, 0);
analogWrite(motorPin3, 150000);
analogWrite(motorPin4, 0);
}  else {
analogWrite(motorPin1, 0);
analogWrite(motorPin2, 0);
analogWrite(motorPin3, 0);
analogWrite(motorPin4, 0);
}

delay(10);

if(R2){
analogWrite(motorPin1, 0);
analogWrite(motorPin2, 150000);
analogWrite(motorPin3, 0);
analogWrite(motorPin4, 150000);
} else {
analogWrite(motorPin1, 0);
analogWrite(motorPin2, 0);
analogWrite(motorPin3, 0);
analogWrite(motorPin4, 0);
}

delay(10);
    if(PAD_UP) {
    myStepper.step(1);
  }

    if(PAD_DOWN)
    {
    myStepper.step(-1);
  }  
 
    if(R3) {
    myStepper2.step(1);
  }

    if(L3)
    {
    myStepper2.step(-1);
  }

    if(L2) {
    myStepper3.step(1);
  }

    if(L1)
    {
    myStepper3.step(-1);
    }
    if(SQUARE) {
    myStepper4.step(1);
  }

    if(TRIANGLE)
    {
    myStepper4.step(-1);
  }      





delay(10);
}


z.B.: PAD_LEFT, sollte er halt links drehen, tut er aber nicht
ich habe auch schon diverse ==HIGH und ==LOW Abfragen gemacht...
ich komm da gerade nicht weiter lol....
und ja, ihr werdet euch wohl gleich auf meinen "Sketch" übergeben wollen, weil der so schlecht und n00biehaft ist, aber ich bitte um Nachsicht, ist mein erster....
Die Stepper laufen ganz gut, auch zu gleicher Zeit und auch die Gleichstrommotoren, aber der Servo läuft nicht, nur 45° nach rechts... außer ich dreh die Zeile um, dann dann läuft er links aber rechts nicht mehr. DANKE EUCH!!

Übrigens, ich möchte einen Stapler bauen (realisieren)
Vor- Rückwärtsantrieb
Servo für Lenkung
Mast hoch- und runter
Mast vor- und zurückkippen
Gabelbreite verstellbar
und das alles per PS2 Controller

postmaster-ino

Hi

Deinem switch fehlt der default: Bereich.
Schaue Dir an, welche Werte Du bei analogWrite ausgeben kannst - 150'000 sind's nicht!

Auch würde ich die ganzen 'magic numbers' - also die festen Zahlen - pbnerhalb des Sketch einstellen (const byte/const uint32_t/whatever) und im Sketch nur die Namen benutzen - so kannst Du durch Ändern EINER Zeile die Funktionalität des ganzen Sketch anpassen.

Deinen Ausführungen konnte ich noch nicht wirklich entnehmen, was bereits funktioniert.
Wen ndas Servo nur in eine Richtung fährt - istwas an de nAbfragen falsch - beide Richtungen klappen ja, wenn Du den Servo-Befehl anpasst.
Lasse Dir anzeigen, WAS Dein Sketch WO macht - viieele Serial.print mit eindeutigen Hinweisen und Variablen ausgeben lassen.

MfG
anscheinend ist Es nicht erwünscht, einen Foren-internen Link als 'Homepage' einzubinden, damit JEDER nur einen Klick von combie's Liste zum Thema State-Maschine entfernt ist.
... dann eben nicht ...

Deltaflyer

#9
Oct 13, 2019, 08:48 pm Last Edit: Oct 13, 2019, 08:54 pm by Deltaflyer
Hi,

Code: [Select]

if (PAD_RIGHT) {
servoblau.write(rechts);
 } else {
  servoblau.write(standard);
  }
  
delay(10);

if (PAD_LEFT) {
servoblau.write(links);
 } else {
  servoblau.write(standard);
  }
  
delay(10);


Das kann beim oberen nicht funktionieren, weil die anweisung sagt im oberen teil "stelle den Servo nach rechts" Damit begint die Servolib auch. Nur läuft die loop ja weiter und gleich danach schaut er ob PAD links gedrückt ist, (was ja, da du rechts drückst nicht der fall ist) und deshalb setzt er gleich wieder die Anweisung "Servo in Standardstellung"
So kann es nicht gehen.

Mach es so:

Code: [Select]

if (PAD_RIGHT) {
  servoblau.write(rechts);
 }
else
{
  if (PAD_LEFT) {
  servoblau.write(links);
 }
else
{
  servoblau.write(standard);
 }
  


so müsste es gehen.

LG Stefan

Tommy56

@Deltaflyer: Du hast aber auch schon von Codetags gehört? ;)

Gruß Tommy
"Wer den schnellen Erfolg sucht, sollte nicht programmieren, sondern Holz hacken." (Quelle unbekannt)

Deltaflyer

Sorry Tommy,
das zweite öffnende CodeTag wurde wohl nicht  richtig interpretiert.
Hab im quick-Editor geschrieben, und da muss ich die Code Tags ja von Hand schreiben.

Der Wille zu codeTags war jedenfalls schonmal vorhanden, nur an der Ausführung hats gehapert.


LG Stefan

Tommy56

Es hat mich bei Dir eigentlich auch gewundert.

Gruß Tommy
"Wer den schnellen Erfolg sucht, sollte nicht programmieren, sondern Holz hacken." (Quelle unbekannt)

Deltaflyer

Ja, bin ja lange genug hier, um zu wissen wie es geht mit den Code Tags , und irgendwann lerne ich sicher auch noch, etwas schneller zu schreiben. *lol*

LG Stefan

Kaputtccino87

Wow Stefan, vielen lieben dank, das funktioniert! :D Wusste nicht das nach einem else Zweig gleich noch ein if kommen darf, supi...

Go Up