Bin neu in der Arduino Umgebung und kenne mich noch nicht so gut aus, hab aber schon (in meinen Augen) großes vor. Ich würde gerne ein paar Kinetic Balls (mal bei Google suchen) basteln. Hab da an 10 Stück gedacht, zu Beginn soll’s aber erstmal einer werden der gut funktioniert.
Aus Kostengründen würde ich am liebsten ein Arduino Nano nehmen. Hinzu kommt ein Nema 17 Schrittmotor, sowie der Treiber Chip A4988. Soweit so gut, hab da auch schon diverse Anleitungen gefunden mit Code, aber die beziehen sich alle rein auf den Code, also man hat keine Möglichkeit die Position des Schrittmotors mittels potentiometer zu bestimmen. Hab aber auch Videos gefunden, wo das eindeutig funktioniert hat. Es geht also.
Ich möchte nun aber nicht ein Potentiometer nehmen, sondern ein DMX Shield und dieses dann mit einem DMX Lichtpult ansteuern. Also wenn ich den Fader auf 100% hoch ziehe, soll der Motor beispielsweise 100 Umdrehungen im Uhrzeigersinn machen. Wenn ich ihn dann auf 50 runter ziehe, soll er 50 Umdrehungen gegen den Uhrzeigersinn machen.
Also klappt mein Vorhaben? Ist das auch alles mit einem Arduino Nano händelbar? Ist ein DMX Shield mit einem Potentiometer vergleichbar?
Kann ich nicht sagen. Nema17 sagt gar nichts über die elektrischen Daten des Motors aus und darum kann ich keine Aussagen treffen ob der Motor mit dem A4988 gut funktioniert.
Der Rest müßte so programmierbar sein wie Du Dir das vorstellst.
Muuuuuuuux:
Also der Motor funktioniert auf jedenfall. Hat er zumindest bei jemand anderem.
Das lasse ich mal so im Raum stehen.
Passt das auch alles an ein Arduino Nano? Hab bedenken, dass er zu wenig Pins hat?
Der Schrittmotortreiber braucht 2 Pins und der DMX 3.
Ein Endschalter wäre nett und braucht noch einen Pin. Bleiben noch 14 pins und 2 analoge Eingänge.
Also hier mal ein paar specs zum Motor:
Marke: OSM
Stromart: Gleichstrom
Anschlussbelegung: 4 Draht zweipolig
Nennstrom pro Phase: 2A
Nennspannung: 12-24VDC
Wiedersagend pro Phase: 1.4 ohm
Vollschrittwinkel: 1.8 Grad (200 Schritte)
Haltemoment: 59Ncm
@HotSystems:
Die 2 besagten Videos sind 4 Jahre alt, von Chinesen und in den Kommentaren haben einige schon fragen gestellt, worauf der Interpret nicht geantwortet hat.
Nennstrom pro Phase: 2A
Nennspannung: 12-24VDC
Wiedersagend pro Phase: 1.4 ohm
Das passt nicht zusammen.
2A * 1.4 Ohm = 2,8V
Die Nennspannung des Motors ist also 2,8V
Die meinen damit die Spannung für den Treiber.
Dann ist dein Treiber richtig, und du kannst da mit 24V drauf gehen.
Ich würde allerdings die DRV8825 wählen.
Etwas leistungsfähiger.
Vertragen eine höhere Spannung, so könntest du deinen 2,8V Motor Treiber mit 36V betreiben.
(evtl. Decay Hack anwenden)
Ah okay, aber cool, dann Probier ich das mal aus! Danke dir!
Und wie sieht das mit dem DMX Shield aus? Wird das behandelt wie ein normaler Potentiometer? Kann mir das irgendwie nicht schlüssig machen.
Ja also mit DMX generell kenne ich mich ja aus, komme aus der Lichttechnik. Aber wie die Programmierung dahinter aussieht weiß ich leider nicht. Möchte aber unbedingt dieses Projekt durchziehen :‘D
Muuuuuuuux:
Und wie sieht das mit dem DMX Shield aus? Wird das behandelt wie ein normaler Potentiometer? Kann mir das irgendwie nicht schlüssig machen.
Die DMX-Shields, die ich kenne, sorgen (nur) für eine "Übersetzung" in die richtigen elektrischen Spezifikationen.
DMX basiert ja auf RS-485, verwendet wird ein symmetrisches Übertragungsverfahren, die differenziellen Pegel liegen zwischen +/- 1,5 und +/- 5 Volt.
Um alles andere muss sich der Arduino kümmern bzw. der Sketch den du schreibst.
Als erste Inspiration könnte vielleicht folgendes dienen:
Muuuuuuuux:
Also wenn ich den Fader auf 100% hoch ziehe, soll der Motor beispielsweise 100 Umdrehungen im Uhrzeigersinn machen. Wenn ich ihn dann auf 50 runter ziehe, soll er 50 Umdrehungen gegen den Uhrzeigersinn machen.
Da musst imho noch am Ablauf arbeiten, denn wenn der Stepper die 100 Umdrehungen gemacht hat, und der Fader immer noch auf 100 ist, wird der Stepper wieder 100 Umdrehungen machen.
Und änderst den Fader während den 100 Steps wieder auf 0, kommst an den 50 vorbei.
Diese Art der Bedienung mit einem 0-100 Fader und einer einmaligen Umdrehung bei Änderung stell ich mir aufwendig vor.
Lass mal das ganze DMX Gedöns weg - und versuch das mal nur mit einem Poti und einem einfachen Stepper Sketch.
Jo hab’s jetzt mal erstmal ohne DMX gemacht und mit nem stinknormalen Potentiometer.
Nutze die AccelStepper Library und es funktioniert eigentlich ganz gut.
Einziges Problem ist, dass wenn ich den Poti von 0 auf 100 drehe gibt er Gas, bremst dann runter und gibt dann nochmal Gas, bis er zum stehen kommt und den Wert erreicht hat. Als würde er die ganze Strecke irgendwie in zwei Abschnitten durchlaufen.
Muuuuuuuux:
Jo hab’s jetzt mal erstmal ohne DMX gemacht und mit nem stinknormalen Potentiometer.
Nutze die AccelStepper Library und es funktioniert eigentlich ganz gut.
Einziges Problem ist, dass wenn ich den Poti von 0 auf 100 drehe gibt er Gas, bremst dann runter und gibt dann nochmal Gas, bis er zum stehen kommt und den Wert erreicht hat. Als würde er die ganze Strecke irgendwie in zwei Abschnitten durchlaufen.
Kann das sein, dass das am Potentiometer liegt?
alles kann sein.
Du erwartest Dir wirklich einen Antwort ohne uns den Sketch zu zeigen?
Oh, pardon... Hatte ihn kopiert, aber anscheinend nicht eingefügt
// AccelStepper Setup
AccelStepper stepper(1, 2, 3); // 1 = Nicht belegt
// Nano Pin 2 connected to STEP pin of Easy Driver
// Nano Pin 3 connected to DIR pin of Easy Driver
// Variables to store current, previous and move position
int val = 0;
int previous = 0;
int long newval = 0;
void setup() {
stepper.setMaxSpeed(8000); // Set speed fast enough to follow pot rotation
stepper.setAcceleration(20000); // High Acceleration to follow pot rotation
}
void loop() {
val = analogRead(A4); // Read Potentiometer current value
if ((val > previous+15) || (val < previous-15)) { // Check that a move of the pot is at least > or < than 6
newval = map(val, 0, 1023, 0, 1600); // Map value (1600 = 1 stepper shaft rotation)
stepper.runToNewPosition(newval); // Move stepper to new position
previous = val; // save current value into variable previous
}
}