RE: Arduino, Servo ungewollte Bewegung...

#26 von moppe , 05.10.2014 12:31

Was du erleben, kannst du fernen mit Abschaltung der Spannung und servoimpuls bis Servo, wenn der Servo nicht ist in Bewegung....

Aber dann sollte sie externer Hardware bauen für Abschaltung der Versorgung bis der einzelner Servo

Oder nur ein ESU Switchpilot servo nutzen.


Klaus


"Meine" Modellbahn:http://www.modelbaneeuropa.dk
Dänisches Bahnforum: http://www.baneforum.dk
PIKO C4 "Horror Gallery": http://moppe.dk/PIKOC4.html


 
moppe
Trans Europ Express (TEE)
Beiträge: 8.743
Registriert am: 07.08.2011
Homepage: Link
Ort: Norddeusche halbinsel
Gleise Roco, PECO, Märklin/Trix, PIKO,
Spurweite H0, H0e, N, Z
Steuerung Z21, Lenz, MpC Gahler+Ringsmeier, Games on Track/Faller
Stromart AC, DC, Digital, Analog


RE: Arduino, Servo ungewollte Bewegung...

#27 von Eisenhorn ( gelöscht ) , 05.10.2014 13:04

Moin,

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
 

//----------------------------------------------------------------------
// Servo Georg
//----------------------------------------------------------------------
#include <Servo.h>
Servo servo;
// Der Taster muß den Pin auf Ground/Masse/Minus schalten,
/*** Atmega328 Konfiguration hier!!! ***/
/*
#define tasterPin1 8 //Taster1 an Pin 8 angeschlossen
#define tasterPin2 9 //Taster2 an Pin 9 angeschlossen
#define Servo_Pin 12 //Servo an Pin 12
*/
/*** Alternative 8-pinnige ATtiny45 Anschlusskonfiguration hier ***/
// von hier...
#define tasterPin1 8 //Taster1 an IC Pin 2 des Attiny 45
#define tasterPin2 9 //Taster2 an IC Pin 3 des Attiny 45
#define Servo_Pin 12 //Servo an IC Pin 5 des Attiny 45
// bis hier
 
int Stellung1 =50; //ServoStellung 1 (Einstellbar zwischen Min 0° bis max.180° Winkel, auf)
int Stellung2 = 165; //ServoStellung 2 (Einstellbar zwischen Min 0° bis max.180° Winkel, zu)
int Stellung_bisher; // Für Vergleich
const int Warten = 19; // 19 MilliSekunden Warten nach Stellschritt. Nicht verändern!
void Servo_move(int servo,int Stellung_Neu);
//-------------------------------------------------------------
void setup()
{
pinMode(tasterPin1, INPUT); //tasterPin1 (Pin 8) wird als INPUT definiert
pinMode(tasterPin2, INPUT); //tasterPin2 (Pin 9) wird als INPUT definiert
digitalWrite(tasterPin1,HIGH); // Interen Pullupwiderstand aktivieren
digitalWrite(tasterPin2,HIGH); // Interen Pullupwiderstand aktivieren
servo.attach(Servo_Pin);
servo.write(Stellung_bisher);
Serial.begin(9600);
 
Stellung_bisher=Stellung1; // Ruhestellung
}
//-------------------------------------------------------------
void loop()
{
if (digitalRead(tasterPin1) == LOW)
Servo_move(Servo_Pin, Stellung1);
if (digitalRead(tasterPin2) == LOW)
Servo_move(Servo_Pin, Stellung2);
delay(20);
servo.write(Stellung_bisher);
}
//-------------------------------------------------------------
/*** Ab hier nichts ändern, bestimmt das Timingverhalten!!! ***/
 
void set_value(int pos){ //Funktion zum umgehen von Fehler meldung
servo.write(pos);
}
 
void Servo_move(int servo,int Stellung_neu){
int Schritt;
if (Stellung_neu == Stellung_bisher) return;
Schritt = (Stellung_neu > Stellung_bisher) ? 1 : -1;
while(Stellung_bisher != Stellung_neu){
Stellung_bisher+=Schritt;
// Servo stellen
//servo.write();
set_value(90);
delay(Warten);
}
}
 
 



Ist ohne eeprom!
Was du auf jeden fall übenehmen solltes ist der Präprozessor #define befehl:http://arduino.cc/en/Reference/Define
um Pins zu benennen Speicher für Int zu reservieren ist nicht optimal, du willst es später ja eh nicht ändern.

Dann habe ich das ganze mit der Servo lib gelöst, der auruf servo.write hat allerdings direkt in deiner Funktion eine fehler erzeugt, das muss ich mir noch mal ansehen, da ich das nicht verstehe...
Vieleicht hat hier ja jemand eine idee

Gruß Lars


Eisenhorn

RE: Arduino, Servo ungewollte Bewegung...

#28 von spielbahn ( gelöscht ) , 05.10.2014 14:15

Zitat von Eisenhorn
.....Was du auf jeden fall übenehmen solltes ist der Präprozessor #define befehl:http://arduino.cc/en/Reference/Define
um Pins zu benennen Speicher für Int zu reservieren ist nicht optimal,....


Zitat aus obigem Link (http://arduino.cc/en/Reference/Define):
"In general, the const keyword is preferred for defining constants and should be used instead of #define."
Im angegeben Link zu #define wird empfohlen, #define nicht zu verwenden.


spielbahn

RE: Arduino, Servo ungewollte Bewegung...

#29 von spielbahn ( gelöscht ) , 05.10.2014 14:43

Zitat von Z-Welt
...... Betätige ich den Taster für Tor zu, bewegt sich das Tor noch weiter auf (( ca, 3Grad )) und geht dann aber langsam , wie es soll, in Stellung Zu.......


Kann ich mir nicht erklären....
Vielleicht stellst Du nochmal den kompletten geänderten Sketch ein.


spielbahn

RE: Arduino, Servo ungewollte Bewegung...

#30 von Eisenhorn ( gelöscht ) , 05.10.2014 14:48

Zitat von spielbahn

Zitat von Eisenhorn
.....Was du auf jeden fall übenehmen solltes ist der Präprozessor #define befehl:http://arduino.cc/en/Reference/Define
um Pins zu benennen Speicher für Int zu reservieren ist nicht optimal,....


Zitat aus obigem Link (http://arduino.cc/en/Reference/Define):
"In general, the const keyword is preferred for defining constants and should be used instead of #define."
Im angegeben Link zu #define wird empfohlen, #define nicht zu verwenden.




Jup wenn man damit zum Beispiel rechnet, oder Verwechslunggefahr durch Bezeichnung besteht.
Aber ich habe mal gelernt die Pin zuweißung immer durch #define zumachen, spart ja auch Speicher!


Eisenhorn

RE: Arduino, Servo ungewollte Bewegung...

#31 von Z-Welt ( gelöscht ) , 05.10.2014 20:08

Hallo,
hier ist noch mal der Sketch, stelle Montag oder Dienstag noch mal ein Video vom Ablauf ein.
Trotzdem schon mal Danke an alle Beteiligte, es ist doch ein interessantes Thema. Programmierung hat doch viele Wege.
MfG Georg

#include <EEPROM.h>

int tasterPin1 = 8; //Taster1 an IC Pin 2 des Attiny 45
int tasterPin2 = 9; //Taster2 an IC Pin 3 des Attiny 45
int Servo_Pin = 12; //Servo an IC Pin 5 des Attiny 45

int Stellung1 =0; //ServoStellung 1 (Einstellbar zwischen Min 0° bis max.180° Winkel, auf)
int Stellung2 = 92; //ServoStellung 2 (Einstellbar zwischen Min 0° bis max.180° Winkel, zu)
int Stellung_bisher; // Für Vergleich
const int Warten = 19; // 19 MilliSekunden Warten nach Stellschritt. Nicht verändern!
void Servo_move(int servo,int Stellung_Neu);

void setup(){
pinMode(tasterPin1, INPUT); //tasterPin1 (Pin wird als INPUT definiert
pinMode(tasterPin2, INPUT); //tasterPin2 (Pin 9) wird als INPUT definiert
digitalWrite(tasterPin1,HIGH); // Interen Pullupwiderstand aktivieren
digitalWrite(tasterPin2,HIGH); // Interen Pullupwiderstand aktivieren
pinMode(Servo_Pin,OUTPUT);

Stellung_bisher=EEPROM.read(0);
Servo_move(Servo_Pin, Stellung_bisher);
}

void loop(){
if (digitalRead(tasterPin1) == LOW)
Servo_move(Servo_Pin, Stellung1);
if (digitalRead(tasterPin2) == LOW)
Servo_move(Servo_Pin, Stellung2);
delay(20);
}

void Servo_move(int servo,int Stellung_neu){
int Schritt;
if (Stellung_neu == Stellung_bisher) return;
Schritt = (Stellung_neu > Stellung_bisher) ? 1 : -1;
while(Stellung_bisher != Stellung_neu){
Stellung_bisher+=Schritt;
// Servo stellen
digitalWrite(servo,HIGH);
delayMicroseconds((Stellung_bisher * 10)+500);
digitalWrite(servo,LOW);
delay(Warten);
}
EEPROM.write(0, Stellung_bisher);
}


Z-Welt

RE: Arduino, Servo ungewollte Bewegung...

#32 von spielbahn ( gelöscht ) , 05.10.2014 20:34

Hallo!

Entferne mal vor der Setup-Routine die Zeile:
void Servo_move(int servo,int Stellung_Neu);


Ansonsten fällt mir nichts auf.....
(Höchstens in der letzten Zeile sollte bei EEPROM.write anstelle Stellung_bisher besser Stellung_neu stehen, was aber eigentlich nichts ausmachen sollte, da an dieser Stelle des Programmablaufs beide Werte gleich sein müssten.)


spielbahn

RE: Arduino, Servo ungewollte Bewegung...

#33 von Eisenhorn ( gelöscht ) , 05.10.2014 20:47

Zitat von spielbahn
Hallo!

Entferne mal vor der Setup-Routine die Zeile:
void Servo_move(int servo,int Stellung_Neu);


Ansonsten fällt mir nichts auf.....
(Höchstens in der letzten Zeile sollte bei EEPROM.write anstelle Stellung_bisher besser Stellung_neu stehen, was aber eigentlich nichts ausmachen sollte, da an dieser Stelle des Programmablaufs beide Werte gleich sein müssten.)



Moin,

Dann aber die ganze Funktions beachreibung hoch kopieren!

So wie ist es jetzt ist ist es meiner Meinung nach besserer Programmierstil.
Aber die Pin Namen als int würde ich ändern,
Das ist ganz schlechter Stil und kann bei großen Projekten schnell Fehler finden

Gruß Lars


Eisenhorn

RE: Arduino, Servo ungewollte Bewegung...

#34 von Z-Welt ( gelöscht ) , 05.10.2014 20:57

Hallo,

etwa so : Sketch nur geändert, aber noch nicht getestet, erst Montag oder Dienstag


#include <EEPROM.h>



int Stellung1 =0; //ServoStellung 1 (Einstellbar zwischen Min 0° bis max.180° Winkel, auf)
int Stellung2 = 92; //ServoStellung 2 (Einstellbar zwischen Min 0° bis max.180° Winkel, zu)
int Stellung_bisher; // Für Vergleich
const int Warten = 19; // 19 MilliSekunden Warten nach Stellschritt. Nicht verändern!
void Servo_move(int servo,int Stellung_Neu);

void setup(){
pinMode(tasterPin1, INPUT); //tasterPin1 (Pin wird als INPUT definiert
pinMode(tasterPin2, INPUT); //tasterPin2 (Pin 9) wird als INPUT definiert
digitalWrite(tasterPin1,HIGH); // Interen Pullupwiderstand aktivieren
digitalWrite(tasterPin2,HIGH); // Interen Pullupwiderstand aktivieren
pinMode(Servo_Pin,OUTPUT);

Stellung_bisher=EEPROM.read(0);
Servo_move(Servo_Pin, Stellung_bisher);
}

void loop(){
if (digitalRead(tasterPin1) == LOW)
Servo_move(Servo_Pin, Stellung1);
if (digitalRead(tasterPin2) == LOW)
Servo_move(Servo_Pin, Stellung2);
delay(20);
}

{
int Schritt;
if (Stellung_neu == Stellung_bisher) return;
Schritt = (Stellung_neu > Stellung_bisher) ? 1 : -1;
while(Stellung_bisher != Stellung_neu){
Stellung_bisher+=Schritt;
// Servo stellen
digitalWrite(servo,HIGH);
delayMicroseconds((Stellung_bisher * 10)+500);
digitalWrite(servo,LOW);
delay(Warten);
}
EEPROM.write(0, Stellung_bisher);
}


Z-Welt

RE: Arduino, Servo ungewollte Bewegung...

#35 von Eisenhorn ( gelöscht ) , 05.10.2014 21:02

Zitat von Z-Welt
Hallo,

etwa so : Sketch nur geändert, aber noch nicht getestet, erst Montag oder Dienstag

// Servo Georg
//----------------------------------------------------------------------

// Der Taster muß den Pin auf Ground/Masse/Minus schalten,
/*** Atmega328 Konfiguration hier!!! ***/
/*


int Stellung1 =0; //ServoStellung 1 (Einstellbar zwischen Min 0° bis max.180° Winkel, auf)
int Stellung2 = 92; //ServoStellung 2 (Einstellbar zwischen Min 0° bis max.180° Winkel, zu)
int Stellung_bisher; // Für Vergleich
const int Warten = 19; // 19 MilliSekunden Warten nach Stellschritt. Nicht verändern!
void Servo_move(int servo,int Stellung_Neu);
//-------------------------------------------------------------
void setup()
{
pinMode(tasterPin1, INPUT); //tasterPin1 (Pin wird als INPUT definiert
pinMode(tasterPin2, INPUT); //tasterPin2 (Pin 9) wird als INPUT definiert
digitalWrite(tasterPin1,HIGH); // Interen Pullupwiderstand aktivieren
digitalWrite(tasterPin2,HIGH); // Interen Pullupwiderstand aktivieren
pinMode(Servo_Pin,OUTPUT);

Stellung_bisher=Stellung1; // Ruhestellung
}
//-------------------------------------------------------------
void loop()
{
if (digitalRead(tasterPin1) == LOW)
Servo_move(Servo_Pin, Stellung1);
if (digitalRead(tasterPin2) == LOW)
Servo_move(Servo_Pin, Stellung2);
delay(20);
}
//-------------------------------------------------------------
/*** Ab hier nichts ändern, bestimmt das Timingverhalten!!! ***/ ab hier Zeile entfernt
{
int Schritt;
if (Stellung_neu == Stellung_bisher) return;
Schritt = (Stellung_neu > Stellung_bisher) ? 1 : -1;
while(Stellung_bisher != Stellung_neu){
Stellung_bisher+=Schritt;
// Servo stellen
digitalWrite(servo,HIGH);
delayMicroseconds((Stellung_bisher * 10)+500);
digitalWrite(servo,LOW);
delay(Warten);
}
}



Das wird noch funktionieren da der Compiler nun nicht weiß welche Anweisung zu der Funktion gehört


Eisenhorn

RE: Arduino, Servo ungewollte Bewegung...

#36 von spielbahn ( gelöscht ) , 05.10.2014 21:17

Zitat von Z-Welt
.......
#include <EEPROM.h>

int tasterPin1 = 8; //Taster1 an IC Pin 2 des Attiny 45
int tasterPin2 = 9; //Taster2 an IC Pin 3 des Attiny 45
int Servo_Pin = 12; //Servo an IC Pin 5 des Attiny 45

int Stellung1 =0; //ServoStellung 1 (Einstellbar zwischen Min 0° bis max.180° Winkel, auf)
int Stellung2 = 92; //ServoStellung 2 (Einstellbar zwischen Min 0° bis max.180° Winkel, zu)
int Stellung_bisher; // Für Vergleich
const int Warten = 19; // 19 MilliSekunden Warten nach Stellschritt. Nicht verändern!
void Servo_move(int servo,int Stellung_Neu);

void setup(){
pinMode(tasterPin1, INPUT); //tasterPin1 (Pin wird als INPUT definiert
pinMode(tasterPin2, INPUT); //tasterPin2 (Pin 9) wird als INPUT definiert
digitalWrite(tasterPin1,HIGH); // Interen Pullupwiderstand aktivieren
digitalWrite(tasterPin2,HIGH); // Interen Pullupwiderstand aktivieren
pinMode(Servo_Pin,OUTPUT);

Stellung_bisher=EEPROM.read(0);
Servo_move(Servo_Pin, Stellung_bisher);
}

void loop(){
if (digitalRead(tasterPin1) == LOW)
Servo_move(Servo_Pin, Stellung1);
if (digitalRead(tasterPin2) == LOW)
Servo_move(Servo_Pin, Stellung2);
delay(20);
}

void Servo_move(int servo,int Stellung_neu){
int Schritt;
if (Stellung_neu == Stellung_bisher) return;
Schritt = (Stellung_neu > Stellung_bisher) ? 1 : -1;
while(Stellung_bisher != Stellung_neu){
Stellung_bisher+=Schritt;
// Servo stellen
digitalWrite(servo,HIGH);
delayMicroseconds((Stellung_bisher * 10)+500);
digitalWrite(servo,LOW);
delay(Warten);
}
EEPROM.write(0, Stellung_bisher);
}



War wohl etwas missverständlich formuliert. Die rot markierte Zeile sollte raus.

(Klar könnten die int auch als byte deklariert werden, aber Speicher ist ja üppig übrig... und einen Eleganzwettbewerb wollen wir auch nicht gewinnen. )


spielbahn

RE: Arduino, Servo ungewollte Bewegung...

#37 von Eisenhorn ( gelöscht ) , 05.10.2014 21:19

Zitat von spielbahn

Zitat von Z-Welt
.......
#include <EEPROM.h>

int tasterPin1 = 8; //Taster1 an IC Pin 2 des Attiny 45
int tasterPin2 = 9; //Taster2 an IC Pin 3 des Attiny 45
int Servo_Pin = 12; //Servo an IC Pin 5 des Attiny 45

int Stellung1 =0; //ServoStellung 1 (Einstellbar zwischen Min 0° bis max.180° Winkel, auf)
int Stellung2 = 92; //ServoStellung 2 (Einstellbar zwischen Min 0° bis max.180° Winkel, zu)
int Stellung_bisher; // Für Vergleich
const int Warten = 19; // 19 MilliSekunden Warten nach Stellschritt. Nicht verändern!
void Servo_move(int servo,int Stellung_Neu);

void setup(){
pinMode(tasterPin1, INPUT); //tasterPin1 (Pin wird als INPUT definiert
pinMode(tasterPin2, INPUT); //tasterPin2 (Pin 9) wird als INPUT definiert
digitalWrite(tasterPin1,HIGH); // Interen Pullupwiderstand aktivieren
digitalWrite(tasterPin2,HIGH); // Interen Pullupwiderstand aktivieren
pinMode(Servo_Pin,OUTPUT);

Stellung_bisher=EEPROM.read(0);
Servo_move(Servo_Pin, Stellung_bisher);
}

void loop(){
if (digitalRead(tasterPin1) == LOW)
Servo_move(Servo_Pin, Stellung1);
if (digitalRead(tasterPin2) == LOW)
Servo_move(Servo_Pin, Stellung2);
delay(20);
}

void Servo_move(int servo,int Stellung_neu){
int Schritt;
if (Stellung_neu == Stellung_bisher) return;
Schritt = (Stellung_neu > Stellung_bisher) ? 1 : -1;
while(Stellung_bisher != Stellung_neu){
Stellung_bisher+=Schritt;
// Servo stellen
digitalWrite(servo,HIGH);
delayMicroseconds((Stellung_bisher * 10)+500);
digitalWrite(servo,LOW);
delay(Warten);
}
EEPROM.write(0, Stellung_bisher);
}



War wohl etwas missverständlich formuliert. Die rot markierte Zeile sollte raus.

(Klar könnten die int auch als byte deklariert werden, aber Speicher ist ja üppig übrig... und einen Eleganzwettbewerb wollen wir auch nicht gewinnen. )




Auch das dürfte nicht funktionieren da die Funktion aufgerufen wird bevor sie definiert ist!

Zum int ich finde halt das der Datentyp dafür nicht da ist, und Pins werden so wie ich es gelernt habe immer per define definiert.

Edit: Gerade mal in die Andruino IDE eingegeben, damit geht es merkwürdiger weiße.
Wieder mal wieder ein fehler meinerseits
direkt im avr gcc logischer weiße nicht:D:D


Eisenhorn

RE: Arduino, Servo ungewollte Bewegung...

#38 von spielbahn ( gelöscht ) , 05.10.2014 21:59

Zitat von Eisenhorn
.......
Auch das dürfte nicht funktionieren da die Funktion aufgerufen wird bevor sie definiert ist!

Zum int ich finde halt das der Datentyp dafür nicht da ist, und Pins werden so wie ich es gelernt habe immer per define definiert.

Edit: Gerade mal in die Andruino IDE eingegeben, damit geht es merkwürdiger weiße.
Wieder mal wieder ein fehler meinerseits
direkt im avr gcc logischer weiße nicht:D:D



Wir reden von Arduinos.
Keine C++ Programmierung - für gestandene gelernte Programmierer sicher gewöhnungsbedürftig.
Aber für Einsteiger ganz praktikabel. Die IDE nimmt einem eben vieles ab. (Und macht manchmal unerwartete Dinge...)

Es geht aber nicht um "Besserwisserei" sondern um die Lösung des Problems von Georg. Um bei dem Problem der "3Grad" eine Lösung zu finden, ist mir nur die rot markierte Zeile aufgefallen, vielleicht startet die ArduinoIDE bei der (in der Arduinoumgebung nicht nötigen) Definition schon einen Aufruf.....


spielbahn

RE: Arduino, Servo ungewollte Bewegung...

#39 von Z-Welt ( gelöscht ) , 06.10.2014 13:31

Hallo,
ich habe diesen Sketch vom (( Uli )) --- So 5. Okt 2014, 21:17 Uhr. mit der rot gezeichneten entfernten Zeile in den Arduino geladen. Arduino an ein Netzgerät gehängt. Funktion getestet , einmal mit Einschalten und aufgeregelter Spannung und einmal direkt eingeschaltet mit 7,5 Volt, hier bei zuckt das Servo und bei geöffnetem Tor zuckt das Servo kurz um dann das Tor zu schließen.
in den nächsten Tagen mal einen ATtiny 45 bespielen.
MfG Georg

https://www.youtube.com/watch?v=HNPIDbtJlgc


Z-Welt

RE: Arduino, Servo ungewollte Bewegung...

#40 von spielbahn ( gelöscht ) , 06.10.2014 14:02

Ich habe mir das Video mal genauer angesehen. Meine Beobachtung:
Beim Einschalten (Tür in Stellung zu) zuckt das Servo und macht die Tür etwas weiter zu und steht bei einem Winkel etwas größer als im EEPROM gespeichert. Kommt jetzt ein auf-Befehl springt es schnell auf die gespeicherte zu-Stellung um dann normal aufzugehen. Das schnelle Springen auf die gespeicherte Stellung fällt nicht auf, da es in der Bewegungsrichtung liegt.
Beim Einschalten (Tür in Stellung auf) zuckt das Servo und macht die Tür etwas zu und steht wieder bei einem Winkel etwas größer als im EEPROM gespeichert. Kommt jetzt ein zu-Befehl springt es schnell auf die gespeicherte auf-Stellung um dann normal zuzugehen. Das schnelle Springen auf die gespeicherte Stellung fällt jetzt auf, da es entgegen der Bewegungsrichtung liegt.
Das Problem ist somit das Einschaltzucken des Servos.
Zu dieser Frage gab es aber schon einige Threads - siehe mein früherer Hinweis.
Ein Problem könnte auch sein, dass das Servo nur nach Tastendruck ein Signal bekommt - bei Servo_move -, ansonsten wird kein ServoSignal ausgegeben. Wird ein Servo über Timer gesteuert, erhält es permanent ein Steuersignal. Evtl. sollte man den Sketch dahingehend abändern, dass man die servo-lib verwendet.


spielbahn

RE: Arduino, Servo ungewollte Bewegung...

#41 von Eisenhorn ( gelöscht ) , 06.10.2014 18:45

Zitat von spielbahn

Zitat von Eisenhorn
.......
Auch das dürfte nicht funktionieren da die Funktion aufgerufen wird bevor sie definiert ist!

Zum int ich finde halt das der Datentyp dafür nicht da ist, und Pins werden so wie ich es gelernt habe immer per define definiert.

Edit: Gerade mal in die Andruino IDE eingegeben, damit geht es merkwürdiger weiße.
Wieder mal wieder ein fehler meinerseits
direkt im avr gcc logischer weiße nicht:D:D



Wir reden von Arduinos.
Keine C++ Programmierung - für gestandene gelernte Programmierer sicher gewöhnungsbedürftig.
Aber für Einsteiger ganz praktikabel. Die IDE nimmt einem eben vieles ab. (Und macht manchmal unerwartete Dinge...)

Es geht aber nicht um "Besserwisserei" sondern um die Lösung des Problems von Georg. Um bei dem Problem der "3Grad" eine Lösung zu finden, ist mir nur die rot markierte Zeile aufgefallen, vielleicht startet die ArduinoIDE bei der (in der Arduinoumgebung nicht nötigen) Definition schon einen Aufruf.....




Bin kein gelernt Programmierer und die Librarys sind intern C++
Ne aber das mit int kann bei größeren Projekten schon zu Problemen führen.

Zum Thema:

Zitat von spielbahn
Ich habe mir das Video mal genauer angesehen. Meine Beobachtung:
Beim Einschalten (Tür in Stellung zu) zuckt das Servo und macht die Tür etwas weiter zu und steht bei einem Winkel etwas größer als im EEPROM gespeichert. Kommt jetzt ein auf-Befehl springt es schnell auf die gespeicherte zu-Stellung um dann normal aufzugehen. Das schnelle Springen auf die gespeicherte Stellung fällt nicht auf, da es in der Bewegungsrichtung liegt.
Beim Einschalten (Tür in Stellung auf) zuckt das Servo und macht die Tür etwas zu und steht wieder bei einem Winkel etwas größer als im EEPROM gespeichert. Kommt jetzt ein zu-Befehl springt es schnell auf die gespeicherte auf-Stellung um dann normal zuzugehen. Das schnelle Springen auf die gespeicherte Stellung fällt jetzt auf, da es entgegen der Bewegungsrichtung liegt.
Das Problem ist somit das Einschaltzucken des Servos.
Zu dieser Frage gab es aber schon einige Threads - siehe mein früherer Hinweis.
Ein Problem könnte auch sein, dass das Servo nur nach Tastendruck ein Signal bekommt - bei Servo_move -, ansonsten wird kein ServoSignal ausgegeben. Wird ein Servo über Timer gesteuert, erhält es permanent ein Steuersignal. Evtl. sollte man den Sketch dahingehend abändern, dass man die servo-lib verwendet.



Wie das ganze mit der servo lib aussehen könnte hatte ich ja schon gepostet, bin mir aber nicht sicher ob es das Problem löst, muss gerade für ein Projekt mit einem Arduino rum spielen, dabie ist mir aufgefallen das die OUT Pins immer gleich VDD anliegen haben eventuell könnte der servo das schon als Stellsignal deuten, dann würde das bei mlangsamen hochregeln nicht auftreten, da der Kontroller schon bei niedrigeren Spannungen(3.3V) anfängt zuarbeiten.
Die Schaltschwelle für den Servo aber noch nciht erreicht ist.

Das ist aber nur eine Theorie.

Gruß Lars


Eisenhorn

RE: Arduino, Servo ungewollte Bewegung...

#42 von Bodo , 07.10.2014 07:30

Hallo zusammen,

gegen unkontrollierte Bewegungen schalte ich über ein Relais die Servospannung erst ein, wenn der Arduino komplett gestartet und die Grundstellung vorgegeben ist:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
 
#include &lt;Servo.h&gt; 

Servo sperrsignal_1; // create servo object sperrsignal_1 to control Sperrsignal Gleis 1
Servo hauptsignal_1; // create servo object to control a servo
Servo sperrsignal_2; // create servo object to control a servo
Servo hauptsignal_2; // create servo object to control a servo
 
int const sperrsignal_1_pin = 9;
int const sperrsignal_1_sh0 = 135;
int const sperrsignal_1_sh1 = 70;
int sperrsignal_1_pos = 135;
 
int const hauptsignal_1_pin = 10;
int const hauptsignal_1_hp0 = 175;
int const hauptsignal_1_hp1 = 90;
int hauptsignal_1_pos = 175;
 
...
 
int const servos_relais_pin = 7;
 
...
 
void setup() {
sperrsignal_1.attach(sperrsignal_1_pin); // attaches sperrsignal_1 on pin 9
hauptsignal_1.attach(hauptsignal_1_pin); // attaches hauptsignal_1 on pin 10
sperrsignal_2.attach(sperrsignal_2_pin); // attaches sperrsignal_2 on pin 11
hauptsignal_2.attach(hauptsignal_2_pin); // attaches hauptsignal_2 on pin 12
pinMode(servos_relais_pin, OUTPUT); // Relais-Pin Servo-Spannung
sperrsignal_1.write(sperrsignal_1_sh0); // Sperrsignal Gleis 1 in Grundstellung (SH0)
hauptsignal_1.write(hauptsignal_1_hp0); // Hauptsignal Gleis 1 in Grundstellung (HP0)
sperrsignal_2.write(sperrsignal_2_sh0); // Sperrsignal Gleis 2 in Grundstellung (SH0)
hauptsignal_2.write(hauptsignal_2_hp0); // Hauptsignal Gleis 2 in Grundstellung (HP0)
digitalWrite(servos_relais_pin, HIGH); // Servo-Spannung einschalten
}
 
 



Hier der dazugehörige "Prinzip-Schaltplan". Leider habe ich in Fritzing keine besseren Komponenten (Relais/Servo) gefunden (und den Stützkondensator vergessen) - bei den handelsüblichen Servos ist natürlich "+5V" in der Mitte und "Pulse" gegenüber von Masse, die anderen Transistoren des Arrays werden für die Weichenansteuerung benötigt und das ULN2803A passt so schön neben die Arduino-Pins ...:





Sofern die Signale beim Abschalten der Spannung in Grundstellung liegen, ist ein leichtes Zucken nur spürbar, aber an den Signalen nicht sichtbar. Ansonsten natürlich auch hier Anfahren der Soll-Position mit Höchstgeschwindigkeit - aber mit dem EEPROM-Thema werde ich mich dann beschäftigen, wenn der Rest funktioniert.

Wenn das auch noch bei allen vier Signalen reproduzierbar so funktioniert, werde ich auch nach jeder Fahrstraßenschaltung die Servospannung wieder abschalten, um "Stör-Zucken" zu unterbinden.

Viele Grüße, Bodo


Die Freiheit des Menschen liegt nicht darin, dass er tun kann, was er will, sondern dass er nicht tun muss, was er nicht will. (Jean-Jacques Rousseau)

Meine Anlage - Meine Dauerbaustelle
Platinen für Modellbahn- und Arduino-Anwendungen


 
Bodo
InterCityExpress (ICE)
Beiträge: 2.475
Registriert am: 28.04.2005
Homepage: Link
Gleise C-Gleis, Lenz 0
Spurweite H0, 0
Steuerung MS2 & CS2
Stromart Digital


RE: Arduino, Servo ungewollte Bewegung...

#43 von TTbeilroder , 29.11.2018 16:38

Hallo,
es ist ja nun schon eine gewisse Zeit vergangen...
Gibt es neuste Erkenntnisse??
Wie wurde das "Problemzucken" gelöst?
Würde mich Interessieren.
Gruß


TTbeilroder  
TTbeilroder
InterRegioExpress (IRE)
Beiträge: 264
Registriert am: 07.10.2018


RE: Arduino, Servo ungewollte Bewegung...

#44 von Ingolf , 29.11.2018 16:47

Moin zusammen,

die Zuckungen hatte ich bei einigen CN-Servos auch mal, meistens beim Einschalten.
Abhilfe schaffte ein 4,7 K Widerstand vom Steueranschluß des Servos nach 5V.

Weitere Abhilfe schaffte eine Änderung des Sketches, damit der Servo nicht bis an die Endanschläge fährt, hier hatte ich die meisten Zuckungen.

Viel Erfolg

Grüße Ingo


Ingolf  
Ingolf
InterRegioExpress (IRE)
Beiträge: 302
Registriert am: 30.08.2015


RE: Arduino, Servo ungewollte Bewegung...

#45 von Stadtbahner , 29.11.2018 17:50

Aus Neugier frage ich: Was sind CN-Servos?


Viele Grüße, Stadtbahner

Meine kleine Parkettbahn "Bärlin", neu: Gleisplan #024 mit BR 023, 80 und 218 .
Dieser Beitrag endet hier. Sie können noch bis zum nächsten Beitrag mitlesen.


 
Stadtbahner
EuroCity (EC)
Beiträge: 1.472
Registriert am: 17.11.2014
Gleise Trix C-Gleis
Spurweite H0
Steuerung DCC, z21, MultiMaus, Rocrail
Stromart Digital


RE: Arduino, Servo ungewollte Bewegung...

#46 von Railcar ( gelöscht ) , 29.11.2018 19:18

Hi,
Ganz einfach - CN Servos sind Servos aus ChiNa, dort Recht günstig zu bekommen, aber die gleichen/selben Servos sind auch von deutschen Händlern zu zum Teil horrenden Preisen erhältlich.

Und schon geht die Diskussion wieder los - China ja nein Billigheimer Lohndumping ich-kaufe-nur-deutsche-artikel usw.


Railcar

RE: Arduino, Servo ungewollte Bewegung...

#47 von TTbeilroder , 29.11.2018 19:41

Nö, Ulli
Wir wollen doch nur Klären, warum Servos beim Einschalten "Zappeln"


TTbeilroder  
TTbeilroder
InterRegioExpress (IRE)
Beiträge: 264
Registriert am: 07.10.2018


RE: Arduino, Servo ungewollte Bewegung...

#48 von Railcar ( gelöscht ) , 29.11.2018 20:15

Hi,
also ich nutze die Moba-Tools und bei mir zappelt nix. Ich setze Franz-Peters (Microbahner) DCC Decoder als Servodecoder für Weichen und Signale sowie einige Gimmicks ein, und da machen die Servos genau das was sie sollen, da gibt's kein Eigenleben.


Railcar

RE: Arduino, Servo ungewollte Bewegung...

#49 von Stadtbahner , 29.11.2018 23:05

Hallo Ulrich, danke für die Erläuterung.
Billig-Servos haben mir in RC-Cars nur Probleme bereitet. Z.B. von Carson Modelsport: Langsam, zittrig und laut. Zucken beim Einschalten, Zentrierung driftet mit der Zeit ab. So etwas miserables war ich z.B. von Acoms nicht gewöhnt.

Nutze darum inzwischen nur noch welche von Futaba und Savöx. Die sind ihren Preis wert. Verrichten ihren Dienst unauffällig und zuverlässig. In meinen älteren Modellen stecken auch noch Standardservos von Acoms, Tamiya (Futaba) und Graupner (JR).

Vorsicht, Ebay ist mit gefälschten Markenservos von sehr schlechter Qualität überschwemmt. Üblicherweise kommen die von chinesischen Händlern. Bei Futabas Standardservo S3003 gibt es mehr Fälschungen am Markt als Originale, ähnlich ist es bei TowerPro-Servos. Die Links enthalten Vergleichsbilder Original Vs. Fälschung.

Eine Einführung zu Servos von chinesischen Herstellern mit Empfehlungen und Warnungen.

Testbericht China-Servo TowerPro/Hextronic MG995, vermutlich eine Fälschung.
Und ein Videobericht zum gleichen Servo.


Viele Grüße, Stadtbahner

Meine kleine Parkettbahn "Bärlin", neu: Gleisplan #024 mit BR 023, 80 und 218 .
Dieser Beitrag endet hier. Sie können noch bis zum nächsten Beitrag mitlesen.


 
Stadtbahner
EuroCity (EC)
Beiträge: 1.472
Registriert am: 17.11.2014
Gleise Trix C-Gleis
Spurweite H0
Steuerung DCC, z21, MultiMaus, Rocrail
Stromart Digital


RE: Arduino, Servo ungewollte Bewegung...

#50 von TTbeilroder , 01.12.2018 17:11

Hallo,
wie macht Ihr das im Einzelnen, mit der Spannungsversorgung???
Arduino und Servo getrennt oder beides nur Zeitverzögert von einer Spannungsversorgung?
Ich gehe davon aus, das getrennt optimaler ist??
Gruss


TTbeilroder  
TTbeilroder
InterRegioExpress (IRE)
Beiträge: 264
Registriert am: 07.10.2018


   


  • Ähnliche Themen
    Antworten
    Zugriffe
    Letzter Beitrag
Xobor Einfach ein eigenes Forum erstellen
Datenschutz