Hy Leute,
Ich habe die befürchtung das ich meinen Nano zu viel zumute.
kann es sein das zu viel angeschlossen ist??
Hy Leute,
Ich habe die befürchtung das ich meinen Nano zu viel zumute.
kann es sein das zu viel angeschlossen ist??
Nein noch lange nicht
auch nicht mit der strom versorgung der module?.
Seid ich mein script erweitert hab um den Thermistor fäng nämlich alles an zu spinnen, auch wenn ich diesen teil wieder ausklammer?. Davor hatt alles soweit funktioniert.
Ziemlich genau: 42
Interessant!
Leider kann ich aus dieser Fehlermeldung keine Ursache ableiten.
Das kannst du doch nachprüfen in dem du mal die Stromaufnahme am 9V-Eingang misst.
Wenn du noch kein Digitalmultimeter hast, dann hast du tatsächlich zu viel angeschlossen.
Aber nur unter folgenden Aspekten die verhindern dass du vernünftige Fehleranalyse machen kannst:
Also ein Digitalmultimeter besitze ich, musste ja die Spannungen einstellen. Wie macht sich den sowas bemerkbar, schwankt dann die Eingangsspannung?. Ich werde heute Abend das Script mal hochladen. Da wird bestimmt was zu finden sein.
. Bin ja auch nur ein leihe der Spaß dran hatt:slightly_smiling_face:.
Das Backlight des LCD wird vom Spannungsregler des Nano versorgt. Könnte etwas viel sein. Kannst du die Schaltung so umbauen, das du die nicht mit 9V sondern mit 5V versorgst?
Der NTC ist mit 100k recht hochohmig. Das Datenblatt empfiehlt am Eingang des ADC nur 10k. Da du nur einen ADC Eingang benutzt sollte es aber trotzdem gehen.
Die Antenne an D2... RF wirst du damit nicht machen können sondern nur Störungen einfangen.
Würde ich von der Schaltung her nicht erwarten.
Vielleicht ein fehlendes INPUT_PULLUP oder Zugriffe ausserhalb eines Arrays.
Zeig mal deinen Code.
Hy also D2 ist keine Antenne, dieser Pin sendet ein Signal ans mosfet, sehe grad hab das mosfet auf der Zeichnung vergessen.
So hier ist einmal mein Sketch. Könnte bestimmt sauberer sein, aber ich lerne noch, ![]()
#include <LiquidCrystal_I2C.h>
#include <MobaTools.h>
#include <Encoder.h>
LiquidCrystal_I2C lcd(0x27,16,2);
// Pins ENCODER
#define clk A0 // Drehen (Blau)
#define dt A1 // Drehen (Grün)
#define sw A2 // Drucktaster (Gelb)
//Pins A4988 Treiber
#define ena 6
#define ms1 7
#define ms2 8
#define ms3 9
#define stp 10
#define dir 11
//Pins HOTEND / THERMISTOR
#define hot 2
#define ThermistorPin A7
int messungPin1 = LOW;
int messungPinAlt = LOW;
int gui = 0;
int hauptMenue = 1;
int hauptMenueMin = 1;
int hauptMenueMax = 3;
int schrittMenue = 1;
int schrittMenueMin = 1;
int schrittMenueMax = 3;
int motorStatus = 0;
int geschMenue = 1;
int klick = 0;
int speed = 10;
int speedMin = 10;
int speedMax = 100;
int menueDrehrichtung = 1;
int drehrichtung = 1;
int menueHotend = 1;
int tempMaxHotend = 250;
int tempMinHotend = 50;
int tempHotend = 0;
int statusHotend = 0;
// THERMISTOR VARIABLEN
unsigned long ThermistorTimer1 = 0;
unsigned long ThermistorTimer = 1000; // 5 sec auto back
//int ThermistorPin = A7;
int Vo;
float R1 = 100000;
float logR2, R2, T;
float c1 = 1.009249522e-03, c2 = 2.378405444e-04, c3 = 2.019202697e-07;
unsigned long myTimer = 0;
unsigned long myTimeout = 5000; // 5 sec auto back
long altePosition = 0; // Definition der "alten" Position (Diese fiktive alte Position wird benötigt, damit die aktuelle Position später im seriellen Monitor nur dann angezeigt wird, wenn wir den Rotary Head bewegen)
//Motortvariablen
const int stepsPerRev = 3200; // Schritte für eine Umdrehung (200)
MoToStepper stepper01( stepsPerRev, STEPDIR ); // create a stepper instance
//ENCODER
Encoder meinEncoder(dt,clk); // An dieser Stelle wird ein neues Encoder Projekt erstellt. Dabei wird die Verbindung über die zuvor definierten Varibalen (DT und CLK) hergestellt.
void setup(){
// Eingaenge ENCODER
pinMode(clk, INPUT);
pinMode(dt, INPUT);
pinMode(sw, INPUT);
//Ausgaenge A988 Treiber
pinMode(stp, OUTPUT);
pinMode(dir, OUTPUT);
pinMode(ena, OUTPUT);
pinMode(ms1, OUTPUT);
pinMode(ms2, OUTPUT);
pinMode(ms3, OUTPUT);
digitalWrite(ena, HIGH); // Treiber Ausschalten
digitalWrite(ms1, LOW);
digitalWrite(ms2, LOW);
digitalWrite(ms3, LOW);
//HOTEND
pinMode(hot, OUTPUT);
digitalWrite(hot, LOW);
lcd.init();
lcd.backlight();
lcd.setCursor(0,0);
Serial.begin(9600);
updateMenue(); //Menue wird aktualisiert
//long neuePosition = meinEncoder.read(); //Position den EMCODERS wird gespeichert
}
void loop(){
if (millis() > ThermistorTimer1 + ThermistorTimer){
ThermistorTimer1 = millis();
}
if (meinEncoder.read() != altePosition){
//Serial.println("!! ENCODER WURDE GEDREHT !!");
// ############## Menue bewegung minus ##################################
if(meinEncoder.read() < altePosition){ //Menue bewegung GUI 0
if(gui == 0){
hauptMenue--;
if (hauptMenue <= hauptMenueMin){
hauptMenue = hauptMenueMin;
}
//Serial.print("-- Haupt Menue: ");
//Serial.println(hauptMenue);
//Serial.print(altePosition);
//Serial.print(" = ");
//Serial.println(meinEncoder.read());
delay(180);
updateMenue();
}else if (gui == 1){ // GUI 1
schrittMenue--;
if(schrittMenue <= schrittMenueMin){
schrittMenue = schrittMenueMin;
}
//Serial.print("-- Schritt Menue: ");
//Serial.println(schrittMenue);
//Serial.print(altePosition);
//Serial.print(" = ");
//Serial.println(meinEncoder.read());
delay(180);
updtadeMenueSchrittmotor();
}else if (gui == 2){ //GUI 2
//speed--;
speed = speed-2;
myTimer = millis();
stepper01.setSpeed(speed);
if(speed <= speedMin){
speed = speedMin;
}
//Serial.print("-- Geschwindigkeit: ");
//Serial.println(speed);
//Serial.print(altePosition);
//Serial.print(" = ");
// Serial.println(meinEncoder.read());
delay(180);
updateMenueGeschwindigkeit();
}else if (gui == 3){ // GUI 3 Menue Drehrichtung
myTimer = millis();
menueDrehrichtung = 1;
//Serial.println("DREHRICHTUNG LINKS");
delay(180);
updateMenueDrehrichtung();
}else if (gui == 4) { //GUI 4 Temperatur einstellung Hotend --
myTimer = millis();
tempHotend = tempHotend - 5;
if (tempHotend < tempMinHotend) {
tempHotend = 0; //HOTEND wir ausgeschaltet
if (digitalRead(hot) == HIGH) {
digitalWrite(hot, LOW);
statusHotend = 0; // Status HOTEND AUS
}
}
delay(180);
updateMenueHotend();
}
// ############## Menue bewegung plus ##################################
}else if(meinEncoder.read() > altePosition){
if(gui == 0){
hauptMenue++;
if(hauptMenue >= hauptMenueMax){
hauptMenue = hauptMenueMax;
}
//Serial.print("++ Haupt Menue: ");
//Serial.println(hauptMenue);
//Serial.print(altePosition);
//Serial.print(" = ");
//Serial.println(meinEncoder.read());
delay(180);
updateMenue();
}else if(gui == 1){ // GUI 1
schrittMenue++;
if (schrittMenue >= schrittMenueMax){
schrittMenue = schrittMenueMax;
}
//Serial.print("++ Schritt Menue: ");
//Serial.println(schrittMenue);
//Serial.print(altePosition);
//Serial.print(" = ");
//Serial.println(meinEncoder.read());
delay(180);
updtadeMenueSchrittmotor();
}else if (gui == 2){ //GUI 2
//speed++;
speed = speed+2;
myTimer = millis();
//Serial.println(myTimer);
stepper01.setSpeed(speed);
if(speed >= speedMax){
speed = speedMax;
}
//Serial.print("++ Geschwindigkeit: ");
//Serial.println(speed);
//Serial.print(altePosition);
//Serial.print(" = ");
//Serial.println(meinEncoder.read());
delay(180);
updateMenueGeschwindigkeit();
}else if (gui == 3) { // GUI 3 Menue Drehrichtung
myTimer = millis();
menueDrehrichtung = 2;
//Serial.println("DREHRICHTUNG RECHTS");
delay(180);
updateMenueDrehrichtung();
}else if (gui == 4) { //GUI 4 Temperatur einstellung Hotend ++
myTimer = millis();
tempHotend = tempHotend + 5;
if (tempHotend == 5) { //HOTEND wird angeschaltzet sobald 5 grad überschritten wird
tempHotend = tempMinHotend;
if (digitalRead(hot) == LOW){
digitalWrite(hot, HIGH);
statusHotend = 1; // Status HOTEND AN
}
}
if (tempHotend >= tempMaxHotend) {
tempHotend = tempMaxHotend;
}
delay(180);
updateMenueHotend();
}
}
}
//######################### SW Bewegung ####################################
if (!digitalRead(sw)){ //Wenn sw gedrückt mache .....
//Serial.println("!! SW WURDE GEDRUECKT !!");
klick++;
myTimer = millis();
while(!digitalRead(sw)){ // Wenn sw gedrückt bleibt warte
delay(1);
}
if (gui == 0){ // sw bewegung im GUI 0 Hauptmenue
if (hauptMenue == 1){ //courser steht auf Schrittmotor
gui = 1;
updtadeMenueSchrittmotor();
}else if (hauptMenue == 2) { //courser steht auf Hotend
gui = 4;
updateMenueHotend();
}
klick = 0;
}else if (gui == 1){ //sw bewegung im GUI 1 (Schrittmotor Menue)
if (schrittMenue == 1){ // zurück ins Hauptmenue
gui = 0;
hauptMenue = 1;
updateMenue();
}else if (schrittMenue == 2){ //wechselt ins Menue Geschwindigkeit
//Serial.println("!! SPEED !!");
gui = 2;
updateMenueGeschwindigkeit();
}else if (schrittMenue == 3) { // wechselt ins Menue Drehrichtung
//Serial.println("!! DREHRICHTUNG !!");
gui = 3;
updateMenueDrehrichtung();
}
klick = 0;
}else if (gui == 2){ //sw bewegung im GUI 2 (Schrittmotor/SPEED Menue)
if (klick == 1){
if (motorStatus == 0){
//Serial.println("!! MOTOR AN !!");
motorStatus = 1;
digitalWrite(ms1, HIGH);
digitalWrite(ms2, HIGH);
digitalWrite(ms3, HIGH);
digitalWrite(ena, LOW);
stepper01.attach(stp, dir);
stepper01.setSpeed(speed);
stepper01.rotate(drehrichtung);
}else if (motorStatus == 1){
//Serial.println("!! MOTOR AUS !!");
motorStatus = 0;
stepper01.rotate(0);
digitalWrite(ms1, LOW);
digitalWrite(ms2, LOW);
digitalWrite(ms3, LOW);
digitalWrite(ena, HIGH);
}
klick = 0;
}
}else if (gui == 3) { //SW bewegung Menue Drehrichtung linkslauf oder rechtslauf
if (menueDrehrichtung == 1) {
//Serial.println("DREHRICHTUNG LINKS AKTIV");
drehrichtung = 1;
updateMenueDrehrichtung();
}else if (menueDrehrichtung == 2) {
//Serial.println("DREHRICHTUNG RECHTS AKTIV");
drehrichtung = 2;
updateMenueDrehrichtung();
}
}
}
//########### TIMER Zeitueberschreitung ###################
if (gui == 2 || gui == 3 || gui == 4){
if (millis() > myTimer + myTimeout){
if (gui == 2) {
gui = 1;
schrittMenue = 2;
updtadeMenueSchrittmotor();
}else if (gui == 3) {
gui = 1;
schrittMenue = 3;
updtadeMenueSchrittmotor();
}else if (gui == 4){
gui = 0;
hauptMenue = 2;
updateMenue();
}
}
}
if (millis() > ThermistorTimer1 + ThermistorTimer){
Thermistor();
}
altePosition = meinEncoder.read(); // Alte position wird überschrieben ENCODER
delay(500);
}
void updateMenue(){
switch(hauptMenue){
case 0:
hauptMenue = 1;
break;
case 1:
lcd.clear();
lcd.print("<SCHRITTMOTOR>");
lcd.setCursor(0, 1);
lcd.print(" HOTEND ");
break;
case 2:
lcd.clear();
lcd.print(" SCHRITTMOTOR ");
lcd.setCursor(0, 1);
lcd.print("<HOTEND>");
break;
case 3:
lcd.clear();
lcd.print(" HOTEND ");
lcd.setCursor(0, 1);
lcd.print("<LUEFTER>");
break;
case 4:
hauptMenue = 3;
break;
}
}
void updtadeMenueSchrittmotor(){
switch(schrittMenue){
case 0:
schrittMenue = 1;
break;
case 1:
lcd.clear();
lcd.print(" <ZURUECK>");
lcd.setCursor(0, 1);
lcd.print( "GESCHWINDIGKEIT" );
break;
case 2:
lcd.clear();
lcd.print("<GESCHINDIGKEIT>");
lcd.setCursor(0, 1);
lcd.print(" DREHRICHTUNG ");
break;
case 3:
lcd.clear();
lcd.print(" GESCHINDIGKEIT ");
lcd.setCursor(0, 1);
lcd.print("<DREHRICHTUNG>");
break;
case 4:
schrittMenue = 3;
break;
}
}
void updateMenueGeschwindigkeit(){
switch(geschMenue){
case 1:
lcd.clear();
lcd.print("GESCHWINDIGKEIT");
lcd.setCursor(0, 1);
lcd.print(" ");
lcd.print(speed);
break;
}
}
void updateMenueDrehrichtung(){
switch(menueDrehrichtung){
case 0:
menueDrehrichtung = 1;
break;
case 1:
lcd.clear();
lcd.print(" DREHRICHTUNG ");
lcd.setCursor(0, 1);
if (drehrichtung == 1) {
lcd.print(" >LINKS< ");
}else{
lcd.print(" LINKS ");
}
break;
case 2:
lcd.clear();
lcd.print(" DREHRICHTUNG ");
lcd.setCursor(0, 1);
if (drehrichtung == 2) {
lcd.print(" >RECHTS< ");
}else{
lcd.print(" RECHTS ");
}
break;
case 3:
menueDrehrichtung = 2;
break;
}
}
void updateMenueHotend(){
switch(menueHotend){
case 1:
lcd.clear();
lcd.print(" TEMPERATUR ");
lcd.setCursor(0, 1);
lcd.print("CELSIUS: ");
lcd.print(tempHotend);
break;
}
}
void Thermistor(){
Vo = analogRead(ThermistorPin);
R2 = R1 * (1023.0 / (float)Vo - 1.0);
logR2 = log(R2);
T = (1.0 / (c1 + c2*logR2 + c3*logR2*logR2*logR2));
T = T -270;//-273.15;
//T = (T * 9.0)/ 5.0 + 32.0;
T = T*(-1);
if (statusHotend == 1) {
if (T < tempHotend){ // Wenn Temperatur kleiner ist als angegeben dann ....
digitalWrite(hot, HIGH);
}else { //Wenn nicht dann .....
digitalWrite(hot, LOW);
}
}
//Serial.print("Temperature: ");
//Serial.print(T);
//Serial.println(" C");
}
Nein LCD ist an 5v Ausgang vom Nano angeschlossen, die kabel kreuzen sich da. Die 9v gehen nur in VIN Pin des Nanos.
stepper01.attach(stp, dir);
macht man ein einziges mal in
void setup()
und das is gut.
Du stöpselst deinen Schrittmotor im laufenden Betrieb doch nicht an andere IO-pins.
Der wird einmal angeschlossen und dann wird dem Programm einmal mitgeteilt an welchen IO-pins er angeschlossen ist und dann is gut.
So und jetzt poste eine detaillierte Beschreibung was
bedeutet.
Nonsensfrage:
Schält dein Schrittmotor die Orangen gegen den Uhrzeigersinn obwohl er sie mit dem Uhrzeigersinn schälen soll?
Also was bebobachtest du was dein
was du als "spinnen" bezeichnest.
Also sobald ich den Strom anschalte startet alles wie es sollte, aber nach ca. 15 sec. hängt sich mein LCD auf und reagiert nicht mehr. Desweiteren dreht der Servo durch und fängt an zu rattern wenn man am Encoder dreht.
Kaputt.
Kaputt,
Und nochmal.
Ansonsten, kann ich nix dazu sagen.
Ich bin zu doof um so viele if zu überblicken.
wie meinst du kaputt??
Das was du da im Bildplan drin hast ist ein Schrittmotor

Es ist weder ein Servo-Motor

noch ein Modellbauservo
und "rumspinnen" hat zwar mehr Buchstaben als "spinnen" aber totztdem nicht mehr Präzision in der Beschreibung was der Motor macht.
Nonsensfrage:
leuchtet die Motorachse blau?
blinkt die Motorachse grün?
macht die Motorachse kleine Teilbewegungungen vorwärts/rückwarts = ruckelt nur hin und her
brummt der Motor ohne das man auch nur die geringste Drehung an der Motorachse sieht?
Dreht der Motor ca. 30 Grad im Uhrzeigersinn, dann ca. 90 Grad gegen den Uhrzeigersinn dann steht er für ne halbe Sekunde dann dreht er 2 Umdrehungen gegen den Uhrzeigersinn ?
Alles mögliche Interpretationen des Wortes "rumspinnen"
Das Wort "rattern" ist da nicht viel besser.
Man könnte das Geräusch das ein Schrittmotor im normalen Betrieb macht bei niedrigen Drehzahlen durchaus als "rattern" bezeichnen.
Wie sieht die Bewegung der Schrittmotorachse aus?
kleine Stücke im Uhrzeigersinn / gegen den Uhrzeigersinn?
dreht ein kleines Stück dann steht er wieder, dreht ein kleines Stück dann dreht er wieder usw.?
Warum Timing mit Addition nicht funktioniert hat @combie
in dem Link zum größten Teil erklärt.
(warum der Wert in manchen Fällen hin- und her springt ist noch nicht im Detail beschrieben)

Wenn die vergangene Zeit als Subtraktion berechnet wird dann funktioniert es immer. Auch dann wenn die unsigned long variable einen Überlauf hat.
Demo-Code hierzu
unsigned long start;
unsigned long simMillis;
void setup() {
Serial.begin(115200);
Serial.println("Setup-Start");
// 4 before max 4294967295
simMillis = 4294967291;
start = simMillis;
for (byte i = 0; i <= 10; i++) {
Serial.print("simMillis=");
Serial.print(simMillis);
Serial.print(" start=");
Serial.println(start);
Serial.println("simMillis - start");
Serial.print(simMillis);
Serial.print(" - ");
Serial.print(start);
Serial.print(" = ");
Serial.println(simMillis - start);
Serial.println();
simMillis++;
}
}
void loop() {
}
Ausgabe auf dem seriellen Monitor
Setup-Start
simMillis=4294967291 start=4294967291
simMillis - start
4294967291 - 4294967291 = 0
simMillis=4294967292 start=4294967291
simMillis - start
4294967292 - 4294967291 = 1
simMillis=4294967293 start=4294967291
simMillis - start
4294967293 - 4294967291 = 2
simMillis=4294967294 start=4294967291
simMillis - start
4294967294 - 4294967291 = 3
simMillis=4294967295 start=4294967291
simMillis - start
4294967295 - 4294967291 = 4
simMillis=0 start=4294967291
simMillis - start
0 - 4294967291 = 5
simMillis=1 start=4294967291
simMillis - start
1 - 4294967291 = 6
simMillis=2 start=4294967291
simMillis - start
2 - 4294967291 = 7
simMillis=3 start=4294967291
simMillis - start
3 - 4294967291 = 8
simMillis=4 start=4294967291
simMillis - start
4 - 4294967291 = 9
simMillis=5 start=4294967291
simMillis - start
5 - 4294967291 = 10
Hier ist dein Code aber mit Timing-Berechnungen durch Subtraktion
millis() - StartZeit >= Intervall
Ob es direkt compiliert weiß ich nicht weil ich eine andere Encoder.h verwende
#include <LiquidCrystal_I2C.h>
#include <MobaTools.h>
#include <Encoder.h>
LiquidCrystal_I2C lcd(0x27,16,2);
// Pins ENCODER
#define clk A0 // Drehen (Blau)
#define dt A1 // Drehen (Grün)
#define sw A2 // Drucktaster (Gelb)
//Pins A4988 Treiber
#define ena 6
#define ms1 7
#define ms2 8
#define ms3 9
#define stp 10
#define dir 11
//Pins HOTEND / THERMISTOR
#define hot 2
#define ThermistorPin A7
int messungPin1 = LOW;
int messungPinAlt = LOW;
int gui = 0;
int hauptMenue = 1;
int hauptMenueMin = 1;
int hauptMenueMax = 3;
int schrittMenue = 1;
int schrittMenueMin = 1;
int schrittMenueMax = 3;
int motorStatus = 0;
int geschMenue = 1;
int klick = 0;
int speed = 10;
int speedMin = 10;
int speedMax = 100;
int menueDrehrichtung = 1;
int drehrichtung = 1;
int menueHotend = 1;
int tempMaxHotend = 250;
int tempMinHotend = 50;
int tempHotend = 0;
int statusHotend = 0;
// THERMISTOR VARIABLEN
unsigned long Thermistor_Timer1 = 0;
unsigned long ThermistorIntervall = 1000; // 5 sec auto back
//int ThermistorPin = A7;
int Vo;
float R1 = 100000;
float logR2, R2, T;
float c1 = 1.009249522e-03, c2 = 2.378405444e-04, c3 = 2.019202697e-07;
unsigned long myTimer = 0;
unsigned long myTimeout = 5000; // 5 sec auto back
long altePosition = 0; // Definition der "alten" Position (Diese fiktive alte Position wird benötigt, damit die aktuelle Position später im seriellen Monitor nur dann angezeigt wird, wenn wir den Rotary Head bewegen)
//Motortvariablen
const int stepsPerRev = 3200; // Schritte für eine Umdrehung (200)
MoToStepper stepper01( stepsPerRev, STEPDIR ); // create a stepper instance
//ENCODER
Encoder meinEncoder(dt,clk); // An dieser Stelle wird ein neues Encoder Projekt erstellt. Dabei wird die Verbindung über die zuvor definierten Varibalen (DT und CLK) hergestellt.
void setup(){
// Eingaenge ENCODER
pinMode(clk, INPUT);
pinMode(dt, INPUT);
pinMode(sw, INPUT);
//Ausgaenge A988 Treiber
pinMode(stp, OUTPUT);
pinMode(dir, OUTPUT);
pinMode(ena, OUTPUT);
pinMode(ms1, OUTPUT);
pinMode(ms2, OUTPUT);
pinMode(ms3, OUTPUT);
digitalWrite(ena, HIGH); // Treiber Ausschalten
digitalWrite(ms1, LOW);
digitalWrite(ms2, LOW);
digitalWrite(ms3, LOW);
//HOTEND
pinMode(hot, OUTPUT);
digitalWrite(hot, LOW);
lcd.init();
lcd.backlight();
lcd.setCursor(0,0);
Serial.begin(9600);
updateMenue(); //Menue wird aktualisiert
//long neuePosition = meinEncoder.read(); //Position den EMCODERS wird gespeichert
}
void loop(){
if (millis() - Thermistor_Timer1 >= ThermistorIntervall){
Thermistor_Timer1 = millis();
}
if (meinEncoder.read() != altePosition){
//Serial.println("!! ENCODER WURDE GEDREHT !!");
// ############## Menue bewegung minus ##################################
if(meinEncoder.read() < altePosition){ //Menue bewegung GUI 0
if(gui == 0){
hauptMenue--;
if (hauptMenue <= hauptMenueMin){
hauptMenue = hauptMenueMin;
}
//Serial.print("-- Haupt Menue: ");
//Serial.println(hauptMenue);
//Serial.print(altePosition);
//Serial.print(" = ");
//Serial.println(meinEncoder.read());
delay(180);
updateMenue();
}else if (gui == 1){ // GUI 1
schrittMenue--;
if(schrittMenue <= schrittMenueMin){
schrittMenue = schrittMenueMin;
}
//Serial.print("-- Schritt Menue: ");
//Serial.println(schrittMenue);
//Serial.print(altePosition);
//Serial.print(" = ");
//Serial.println(meinEncoder.read());
delay(180);
updtadeMenueSchrittmotor();
}else if (gui == 2){ //GUI 2
//speed--;
speed = speed-2;
myTimer = millis();
stepper01.setSpeed(speed);
if(speed <= speedMin){
speed = speedMin;
}
//Serial.print("-- Geschwindigkeit: ");
//Serial.println(speed);
//Serial.print(altePosition);
//Serial.print(" = ");
// Serial.println(meinEncoder.read());
delay(180);
updateMenueGeschwindigkeit();
}else if (gui == 3){ // GUI 3 Menue Drehrichtung
myTimer = millis();
menueDrehrichtung = 1;
//Serial.println("DREHRICHTUNG LINKS");
delay(180);
updateMenueDrehrichtung();
}else if (gui == 4) { //GUI 4 Temperatur einstellung Hotend --
myTimer = millis();
tempHotend = tempHotend - 5;
if (tempHotend < tempMinHotend) {
tempHotend = 0; //HOTEND wir ausgeschaltet
if (digitalRead(hot) == HIGH) {
digitalWrite(hot, LOW);
statusHotend = 0; // Status HOTEND AUS
}
}
delay(180);
updateMenueHotend();
}
// ############## Menue bewegung plus ##################################
}else if(meinEncoder.read() > altePosition){
if(gui == 0){
hauptMenue++;
if(hauptMenue >= hauptMenueMax){
hauptMenue = hauptMenueMax;
}
//Serial.print("++ Haupt Menue: ");
//Serial.println(hauptMenue);
//Serial.print(altePosition);
//Serial.print(" = ");
//Serial.println(meinEncoder.read());
delay(180);
updateMenue();
}else if(gui == 1){ // GUI 1
schrittMenue++;
if (schrittMenue >= schrittMenueMax){
schrittMenue = schrittMenueMax;
}
//Serial.print("++ Schritt Menue: ");
//Serial.println(schrittMenue);
//Serial.print(altePosition);
//Serial.print(" = ");
//Serial.println(meinEncoder.read());
delay(180);
updtadeMenueSchrittmotor();
}else if (gui == 2){ //GUI 2
//speed++;
speed = speed+2;
myTimer = millis();
//Serial.println(myTimer);
stepper01.setSpeed(speed);
if(speed >= speedMax){
speed = speedMax;
}
//Serial.print("++ Geschwindigkeit: ");
//Serial.println(speed);
//Serial.print(altePosition);
//Serial.print(" = ");
//Serial.println(meinEncoder.read());
delay(180);
updateMenueGeschwindigkeit();
}else if (gui == 3) { // GUI 3 Menue Drehrichtung
myTimer = millis();
menueDrehrichtung = 2;
//Serial.println("DREHRICHTUNG RECHTS");
delay(180);
updateMenueDrehrichtung();
}else if (gui == 4) { //GUI 4 Temperatur einstellung Hotend ++
myTimer = millis();
tempHotend = tempHotend + 5;
if (tempHotend == 5) { //HOTEND wird angeschaltzet sobald 5 grad überschritten wird
tempHotend = tempMinHotend;
if (digitalRead(hot) == LOW){
digitalWrite(hot, HIGH);
statusHotend = 1; // Status HOTEND AN
}
}
if (tempHotend >= tempMaxHotend) {
tempHotend = tempMaxHotend;
}
delay(180);
updateMenueHotend();
}
}
}
//######################### SW Bewegung ####################################
if (!digitalRead(sw)){ //Wenn sw gedrückt mache .....
//Serial.println("!! SW WURDE GEDRUECKT !!");
klick++;
myTimer = millis();
while(!digitalRead(sw)){ // Wenn sw gedrückt bleibt warte
delay(1);
}
if (gui == 0){ // sw bewegung im GUI 0 Hauptmenue
if (hauptMenue == 1){ //courser steht auf Schrittmotor
gui = 1;
updtadeMenueSchrittmotor();
}else if (hauptMenue == 2) { //courser steht auf Hotend
gui = 4;
updateMenueHotend();
}
klick = 0;
}else if (gui == 1){ //sw bewegung im GUI 1 (Schrittmotor Menue)
if (schrittMenue == 1){ // zurück ins Hauptmenue
gui = 0;
hauptMenue = 1;
updateMenue();
}else if (schrittMenue == 2){ //wechselt ins Menue Geschwindigkeit
//Serial.println("!! SPEED !!");
gui = 2;
updateMenueGeschwindigkeit();
}else if (schrittMenue == 3) { // wechselt ins Menue Drehrichtung
//Serial.println("!! DREHRICHTUNG !!");
gui = 3;
updateMenueDrehrichtung();
}
klick = 0;
}else if (gui == 2){ //sw bewegung im GUI 2 (Schrittmotor/SPEED Menue)
if (klick == 1){
if (motorStatus == 0){
//Serial.println("!! MOTOR AN !!");
motorStatus = 1;
digitalWrite(ms1, HIGH);
digitalWrite(ms2, HIGH);
digitalWrite(ms3, HIGH);
digitalWrite(ena, LOW);
stepper01.attach(stp, dir);
stepper01.setSpeed(speed);
stepper01.rotate(drehrichtung);
}else if (motorStatus == 1){
//Serial.println("!! MOTOR AUS !!");
motorStatus = 0;
stepper01.rotate(0);
digitalWrite(ms1, LOW);
digitalWrite(ms2, LOW);
digitalWrite(ms3, LOW);
digitalWrite(ena, HIGH);
}
klick = 0;
}
}else if (gui == 3) { //SW bewegung Menue Drehrichtung linkslauf oder rechtslauf
if (menueDrehrichtung == 1) {
//Serial.println("DREHRICHTUNG LINKS AKTIV");
drehrichtung = 1;
updateMenueDrehrichtung();
}else if (menueDrehrichtung == 2) {
//Serial.println("DREHRICHTUNG RECHTS AKTIV");
drehrichtung = 2;
updateMenueDrehrichtung();
}
}
}
//########### TIMER Zeitueberschreitung ###################
if (gui == 2 || gui == 3 || gui == 4){
if (millis() - myTimer >= myTimeout){
if (gui == 2) {
gui = 1;
schrittMenue = 2;
updtadeMenueSchrittmotor();
}else if (gui == 3) {
gui = 1;
schrittMenue = 3;
updtadeMenueSchrittmotor();
}else if (gui == 4){
gui = 0;
hauptMenue = 2;
updateMenue();
}
}
}
if (millis() - Thermistor_Timer1 >= ThermistorIntervall){
Thermistor();
}
altePosition = meinEncoder.read(); // Alte position wird überschrieben ENCODER
delay(500);
}
void updateMenue(){
switch(hauptMenue){
case 0:
hauptMenue = 1;
break;
case 1:
lcd.clear();
lcd.print("<SCHRITTMOTOR>");
lcd.setCursor(0, 1);
lcd.print(" HOTEND ");
break;
case 2:
lcd.clear();
lcd.print(" SCHRITTMOTOR ");
lcd.setCursor(0, 1);
lcd.print("<HOTEND>");
break;
case 3:
lcd.clear();
lcd.print(" HOTEND ");
lcd.setCursor(0, 1);
lcd.print("<LUEFTER>");
break;
case 4:
hauptMenue = 3;
break;
}
}
void updtadeMenueSchrittmotor(){
switch(schrittMenue){
case 0:
schrittMenue = 1;
break;
case 1:
lcd.clear();
lcd.print(" <ZURUECK>");
lcd.setCursor(0, 1);
lcd.print( "GESCHWINDIGKEIT" );
break;
case 2:
lcd.clear();
lcd.print("<GESCHINDIGKEIT>");
lcd.setCursor(0, 1);
lcd.print(" DREHRICHTUNG ");
break;
case 3:
lcd.clear();
lcd.print(" GESCHINDIGKEIT ");
lcd.setCursor(0, 1);
lcd.print("<DREHRICHTUNG>");
break;
case 4:
schrittMenue = 3;
break;
}
}
void updateMenueGeschwindigkeit(){
switch(geschMenue){
case 1:
lcd.clear();
lcd.print("GESCHWINDIGKEIT");
lcd.setCursor(0, 1);
lcd.print(" ");
lcd.print(speed);
break;
}
}
void updateMenueDrehrichtung(){
switch(menueDrehrichtung){
case 0:
menueDrehrichtung = 1;
break;
case 1:
lcd.clear();
lcd.print(" DREHRICHTUNG ");
lcd.setCursor(0, 1);
if (drehrichtung == 1) {
lcd.print(" >LINKS< ");
}else{
lcd.print(" LINKS ");
}
break;
case 2:
lcd.clear();
lcd.print(" DREHRICHTUNG ");
lcd.setCursor(0, 1);
if (drehrichtung == 2) {
lcd.print(" >RECHTS< ");
}else{
lcd.print(" RECHTS ");
}
break;
case 3:
menueDrehrichtung = 2;
break;
}
}
void updateMenueHotend(){
switch(menueHotend){
case 1:
lcd.clear();
lcd.print(" TEMPERATUR ");
lcd.setCursor(0, 1);
lcd.print("CELSIUS: ");
lcd.print(tempHotend);
break;
}
}
void Thermistor(){
Vo = analogRead(ThermistorPin);
R2 = R1 * (1023.0 / (float)Vo - 1.0);
logR2 = log(R2);
T = (1.0 / (c1 + c2*logR2 + c3*logR2*logR2*logR2));
T = T -270;//-273.15;
//T = (T * 9.0)/ 5.0 + 32.0;
T = T*(-1);
if (statusHotend == 1) {
if (T < tempHotend){ // Wenn Temperatur kleiner ist als angegeben dann ....
digitalWrite(hot, HIGH);
}else { //Wenn nicht dann .....
digitalWrite(hot, LOW);
}
}
//Serial.print("Temperature: ");
//Serial.print(T);
//Serial.println(" C");
}
Ja das ist ein schrittmotor, sorry. Es gibt aber auch Servomotoren an CNC Maschinen und damit arbeite ich täglich, also mit dem Begriff. Deswegen denk ich mal das ich schrittmotor meinte aber Servomotor geschrieben hab.
Zur Beschreibung des rumspinnen's.
Ja wie soll man das erklären?
Der Schrittmotor fängt plötzlich an zu drehen obwohl man ihn nicht einschaltet, er dreht nur in einer Richtung und fängt halt an zu stottern, mal dreht er schneller und mal langsamer, bleibt ab und zu stehen und dreht dan wieder weiter. Die Geräuschkulisse ändert sich halt je nachdem wie schnell oder langsam der Motor dreht.
Danke schön mal für deine Hilfe ich werde mir jetzt mal dein Link durchlesen.
Wenn, dann am 5V Anschluß. Wie auch schon angesprochen wurde, ist der eher nicht dazu da, wesentlich Strom zu liefern. Da ist das Backlight des LCD evtl. schon zu viel. Da brauchst Du eine eigene 5V Stromversorgung.
So mit der Beschreibung kann man jetzt halbwegs was anfangen.
Möglicherweise hat es was mit dem fehlerhaften millis() timing zu tun.
Bei deiner Art das über Addition zu machen könnte es sein, dass die Bedingung abwechseln erfüllt und nicht erfüllt ist und dann könnte das zu solchen Motorbewegungen führen.
Fast egal was für eine Art Fehler vorliegt. Zumindest um bestimmte Fehler ausschließen zu könnenm ganz oft aber auch im den Fehler einzugrenzen macht serielle Ausgabe Sinn.
Dein Motor macht chaotische Bewegungen. Also lasse dir bei jedem Aufruf "Schrittmotor dreh dich" ausgeben wann das passiert und wie viele Schritte da im Befehl stehen.
Danke Leute für eure Antworten, ich werde jetzt erstmal die 5v Spannung entlasten vom Nano und noch eine externe 5v Spannung anlöten (Spannungsregler), am besten gleich so das garnicht mehr vom Nano gezogen wird. Dann werd ich mich dem Skript widmen und die millis() mit Subtraktion verrechnen.
Werd mich melden ob es geklappt hatt oder net^^.