Setze Deinen Code bitte in Codetags (</>-Button oben links im Forumseditor oder [code] davor und [/code] dahinter ohne *).
Dann ist er auch auf mobilen Geräten besser lesbar.
Das kannst Du auch noch nachträglich ändern.
Außerdem entferne bitte die unnötigen Leerzeilen und formatiere den Code ordentlich (+T in der IDE hilft Dir dabei).
Die Beschreibung was du machen möchtest ist schon recht detailliert. Aber was ist jetzt deine Frage?
Sollen das noch unvollständige Programm die unausgeschriebene Aufforderung sein dein Programm zu vollenden?
Wahrscheinlich nicht. Deshalb wäre es sehr hilfreich wenn du eine wirklich konkrete Frage stellen würdest.
Es mag sein, dass dir als NOOB keine "Fachfrage" einfällt. Das macht überhaupt nichts. Du wirst irgendeine Vermutung haben was für Codezeilen noch dazu müssen. Schreibe diese Vermutung als Frage. Dann haben wir einen konkreten Ansazpunkt. Ohne so eine Frage wirkt das auf mich wie "schreibe mal mein Programm fertig" oder wie "schreibe mir mal einen kompletten Anfänger-Kurs zugeschnitten auf mein Projekt.
Hallo Stefan, danke für deine Antwort. Nei es soll keiner das Prog. zu Ende schreiben.
Ich dachte da an einen Tip wie ich das angehen muss. Bislang drehen die Motoren ja erst mal, nur wie Frage ich die "endstop" ab und erkläre die Umschaltung der Motoren.
Nein nicht pro Motor sondern Pro Seite , es sind 3 Motoren im 3 Eck angeordnet....es soll eine Art Roboter werden wie zb Staubsauger, nur das der hier auf Getreide Fährt und im Raum Kreuz und Quer umher Fährt, wenn er anstößt ändert er die Richtung.....einer der 3 Motoren dreht dabei entgegengesetzt und bringt den so etwas aus der Bahn um nicht immer die Gleiche Linie zu Fahren. So soll auch verhindert werden das er sich im Kreis Dreht.....wegen dem Kabel.
einen Taster der einen elektrischen Kontakt schließt kann man abfragen mit
// man muss angeben an welchem IO-Pin der Taster angeschlossen ist
// mal angenommen er ist an IO-PIN 12 angeschlossen
const int Endschalter = 12
if (digitalRead(Endschalter == HIGH) {
mach was
}
ob man die Abfrage nun
if (digitalRead(Endschalter == HIGH)
oder
if (digitalRead(Endschalter == LOW)
lauten muss hänt davon ab auf welche Art und Weise man den Taster angeschlossen hat.
Wenn dir jetzt immer noch ziemlich unklar ist wie man es macht. Weißt du bis jetzt ziemlich wenig
und es empfiehlt sich sich Grundlagen zu erarbeiten. Es tut mir Leid das so schreiben zu müssen aber es ist wahr
Mit ganz wenig Grundlagenwissen würdest du wirklich wegen jedem Fitzelchen hier erneut nachfragen.
Du kannst das machen und ich werde auch antworten sofern du eine jeweils eine konkrete Frage stellst,
Ich vermute aber das dir das keinen Spaß macht. Deswegen fange mal an hier zu lesen
Ja und jetzt wäre gut du würdest als Fragender den potentiellen Antwortgebern so viel wie möglich an Arbeit abnehmen in dem du selbst im Datenblatt nachschaust wenn man das CNC-Shield auf den Arduino aufsteckt welche IO-Port nummern werden da mit den Endschaltern verbunden.
Oder wenn du nicht weist wie man diese IO-Port-Nummern herausfindest
eben genau das als konkrete Frage stellst und dann wenigstens aus dem Datenblatt zitierst oder einen Democode von AZ-delivery zur Verfügung stellst.
wilbur245:
... es soll eine Art Roboter werden wie zb Staubsauger, nur das der hier auf Getreide Fährt und im Raum Kreuz und Quer umher Fährt, wenn er anstößt ändert er die Richtung ... wegen dem Kabel.
Vor meinem geistigen Auge fährt ein Mähdrescher selbständig über ein Getreidefeld, angetrieben von Schrittmotoren, als Treiber DRV8825, mit Energie versorgt durch ein Kabel.
Ne Kein Mähdrescher..... nur ein Kleiner Robot im Silo der über einen Sensor die Feuchtigkeit Loggt. Der soll aber nicht über den Arduino.....der Fährt nur mit.
Die Stepper sollen Bürstenwalzen statt Räder bekommen damit er nicht versinkt.
Die Pin für die Endstop sind 9-10-11 wie auf dem Uno angegeben
Mein Tipp sind die MobaTools, die per Bibliotheksmanager geladen werden können. Mit Beispiel Stepper_02 kannst Du anfangen. Anstelle von delayTime.running() fragst Du den Taster ab. Wegen des anderen Treibers dann MoToStepper myStepper( 200, A4988 ); und byte myStepper.attach( 2, 5 ); je nach "Achse".
wilbur245:
der Motor bzw das vom Motor angetriebene läuft gegen einen Mikroschalter.......
Ein einfacher Taster die sind auf dem Shield auch Definiert.
Das wird schon.
Die Pin für die Endstop sind 9-10-11 wie auf dem Uno angegeben
Motor 1 und 2 drehen rechts rum, Motor 3 Links. Zwischen den Motoren ist jeweils ein "Endstop" wenn
zwischen 1+2 der Endstop ausgelöst wird sollen sie umschalten auf 1+3 Links drehen. 2 Rechts drehen.
Als ich das zuerst las, kam mir der Aufbau eines Rummel-Fahrgeschäftes in den Sinn.
Viel anders ist das hier aber tatsächlich nicht.
Als erstes musst Du für Deine Endschalter die Eingänge definieren und dann auf die Stellungen reagieren.
Da es Microschalter sind - also mechanisch - werden sie prellen
Das lässt sich ausmerzen. Bis dahin geht aber noch einiges an Wasser den Bach runter.
Vom Prinzip her hast Du ja bereits den Ansatz, 2 Motoren drehen in Richtung a - der andere in Richtung b.
Jetzt musst Du nur auf den "Anstoss" reagieren.
Kein Hexenwerk - lässt sich aufdröseln, aber von mir nocheinmal die Bitte: Modifiziere Deinen eingestellten Code so, das der auch lesbar ist. Bei sovielen Leerzeilen und alles ohne Einrückung, kommt kein Mensch hinterher.
Leerzeilen raus - STRG-T drücken - Und den Code da oben in Deinem Post ersetzen - geht unten rechts über modify.
StefanL38:
Oder wenn du nicht weist wie man diese IO-Port-Nummern herausfindest
Das was Du meinst, sind PIN! Ein Port ist etwas anderes. Und hat keine Nummern.
agmue:
Mein Tipp sind die MobaTools
Die Idee ist nicht schlecht - aber nur drei sich (fast gleichmässig) drehende Stepper und drei Ereignistasten und dazu einen absoluen Neuling - da steigt wohlmöglich der Frustfaktor...
my_xy_projekt:
Die Idee ist nicht schlecht - aber nur drei sich (fast gleichmässig) drehende Stepper und drei Ereignistasten und dazu einen absoluen Neuling - da steigt wohlmöglich der Frustfaktor...
Ich halte die MobaTools für dieses Projekt besonders geeignet, weil sie
die interruptgesteuerte Motorsteuerung enthalten, so daß selbst eine blockierende Programmierung die Motoren nicht aus dem Takt bringt
eine Tastenentprellung enthält
einen Ersatz für millis bereitstellt
Nach meiner Einschätzung benötigt der TO sowiso eine für ihn steile Lernkurve, um das Projekt zu einem Erfolg zu führen.
Selbstverständlich kann ich mich komplett irren
Beispielsweise erinnere ich mich an RudiDL5, der verhalten anfing und mich dann mit Lichtgeschwindigkeit überholt hat. Seine Bescheidenheit habe ich damals fehlinterpretiert. Er war einer von denen, die mir OOP schmackhaft gemacht haben. Anleitung: Endlicher Automat mit millis()
agmue:
Beispielsweise erinnere ich mich an RudiDL5, der verhalten anfing und mich dann mit Lichtgeschwindigkeit überholt hat. Seine Bescheidenheit habe ich damals fehlinterpretiert. Er war einer von denen, die mir OOP schmackhaft gemacht haben. Anleitung: Endlicher Automat mit millis()
Ich hatte es eigentlich für Dich nicht als Leseempfehlung gedacht, aber bitte gerne ;D
Eine Suche im Forum nach "agmue anleitung" fördert noch mehr zu Tage, teilweise etwas angestaubt, aber auch mit Links zu vergleichbaren Themen.
Um den Frustfaktor niedrig zu halten, habe ich mit den MobaTools und einem Motor ein Beispiel zusammengestellt. Der Motor dreht endlos. Wird der Endtaster gedrückt, ändert sich die Drehrichtung.
#define MAX8BUTTONS
#include <MobaTools.h>
MoToStepper Step_X(200, A4988);
MoToTimer delayTime;
enum {X_ACHSE};
const byte pinEndstop[] = { 9 }; // pinEndstop_X
const byte anzahlTaster = sizeof(pinEndstop); // Anzahl der angeschlossenen Taster
button_t getHW( void ) {
button_t tasterTemp = 0;
for (byte i = 0; i < anzahlTaster; i++) {
bitWrite( tasterTemp, i, !digitalRead(pinEndstop[i]) ); // Fragt den Taster ab und merkt sich den Status
}
return tasterTemp;
}
MoToButtons Taster( getHW, 20, 500 );
void setup() {
for (byte i = 0; i < anzahlTaster; i++) { // Bei Abfrage auf < kann man das -1 sparen
pinMode(pinEndstop[i], INPUT_PULLUP); // gedrückt = LOW
}
Step_X.attach( 2, 5 ); // STEPpin, DIRpin
Step_X.setSpeed( 800 ); // = 80 U/Min (motorspezifisch)
Step_X.setRampLen( 50 ); // Beschleunigung (motorspezifisch)
}
void loop() {
Taster.processButtons();
static byte status; // Schrittkettenstatus
static int8_t richtung = 1; // vorwärts = 1; stop = 0; rückwärts = -1
switch (status) {
case 0:
Step_X.rotate(richtung);
if (Taster.pressed(X_ACHSE)) { // Endstop_X betätigt
Step_X.rotate(0); // 0 = Stopp mit Rampe
status++;
}
break;
case 1:
if ( !Step_X.moving() ) { // warten bis die Bewegung abgeschlossen ist
delayTime.setTime(100); // Timer aufziehen
status++;
}
break;
case 2:
if ( !delayTime.running() ) { // warten bis delay-Zeit abgelaufen ist
richtung *= -1; // Richtung wechseln
status = 0;
}
break;
default:
status = 0;
}
}