Hilfe bei Wickelmaschine für Tonabnehmer

Hallo Leute,

Ich bräuchte Hilfe bei einem aktuellen Projekt.
Ich baue eine Wickelmaschine um Tonabnehmer für Gitarren zu wickeln.

Soweit läuft alles ganz gut.
Im Video seht Ihr den aktuellen Stand

Die Wicklungen zähle ich mit einem Hallsensor.
Ich würde gerne noch einen Schrittmotor ansteuern der den Draht auf dem Tonabnehmer verteilt.
(Siehe Foto)

Der Motor soll dann in Abhängigkeit der gezählten Windungen nach rechts wandern.
Ab einer bestimmten Anzahl von Windungen dann wieder zurück.

Hoffe das war zu verstehen ::slight_smile:

Meine Frage wäre, wie ich den Schrittmotor Programmieren kann

Danke schon mal!

hi,

ich würde mal nach schrittmotor linear googeln. scheint mir für so etwas geeignet.

gruß stefan

JackKean:
Meine Frage wäre, wie ich den Schrittmotor Programmieren kann

Welche Übersetzung hat der Motor? 64*64 = 4096 Schritte pro Umdrehung?

Die Programmbibliothek AccelStepper kann Dich unterstützen.

// Definition für den Schrittmotortreiber
#include <AccelStepper.h>
// Motor 28BYJ-48 Windungen: Pins 1-5-3, 2-5-4. 5:VDD; IN1 = /IN3, IN2 = /IN4
#define IN1 6
#define IN2 8
#define IN3 7
#define IN4 9
AccelStepper stepper(AccelStepper::HALF4WIRE, IN1, IN2, IN3, IN4);
...
void setup() {
  stepper.setMaxSpeed(1000);
  stepper.setAcceleration(500);
...
}
void loop() {
    stepper.run();
...
          stepper.moveTo(Schritte);
...
}

Eisebaer:
ich würde mal nach schrittmotor linear googeln. scheint mir für so etwas geeignet.

Hallo Stefan,
der kleine Schrittmotor hat ein Getriebe eingebaut, das könnte auch passen.

Ich würde einen Servomotor statt des Schrittmotors nehmen. Wie breit ist denn ein Spulenwickel?

hi,

Hallo Stefan,
der kleine Schrittmotor hat ein Getriebe eingebaut, das könnte auch passen.

klar, durchaus. linearantrieb scheint mir nur irgendwie logischer für so etwas. hat nicht auch ein cd/dvd-laufwerk so'n ding verbaut, das man verwenden könnte? die verschublänge sollte auch reichen...

gruß stefan

Bekomm es nicht hin. Hab jetzt eigentlich eine Vernünftige Programmierung für den Drahtzufuhrmotor. Aber sobald ich dn In mein Projekt einbinde Läuft es nicht mehr.

Hab die Betroffenen Zeilen am Ende eingefügt.

Komm hier einfach nicht weiter!

#include <Wire.h>  
#include <LiquidCrystal_I2C.h>
#include <Stepper.h>

const int sensorPin = 8;
const int buttonPin = 7;
const int stepsPerRevolution = 200; 

int sensorState = 0;
int counter = 0;
int sensorStateHIGH = 0;

int dreh = 5; 
int pwm = 6;
int buttonPin3 = 9;
int buttonPin2 = 10;
int sensorPin2 = A0;

int sensorValue = 0;
int buttonState = LOW;

LiquidCrystal_I2C lcd(0x3f, 2, 1, 0, 4, 5, 6, 7, 3, POSITIVE);  // Set the LCD I2C address
Stepper myStepper(stepsPerRevolution, 10, 11, 12, 13);


void setup()   /*----( SETUP: RUNS ONCE )----*/
{
 
  pinMode(sensorPin, INPUT);  
  pinMode(buttonPin, INPUT);
  pinMode(dreh, OUTPUT);
 pinMode(pwm, OUTPUT);


   digitalWrite(dreh, LOW); 
 analogWrite(pwm, 0); 


 

 lcd.begin(16,2);   // initialize the lcd for 16 chars 2 lines, turn on backlight

 myStepper.setSpeed(10);

// ------- Quick 3 blinks of backlight  -------------
 for(int i = 0; i< 3; i++)
 {
   lcd.backlight();
   delay(50);
   lcd.noBacklight();
   delay(50);
 }
 lcd.backlight(); // finish with backlight on  

//-------- Write characters on the display ------------------
// NOTE: Cursor Position: (CHAR, LINE) start at 0  
 lcd.setCursor(0,0); //Start at character 4 on line 0
 lcd.print("-Wickelmaschine-");
 delay(1000);





}/*--(end setup )---*/


void loop()   /*----( LOOP: RUNS CONSTANTLY )----*/
{
sensorState = digitalRead(sensorPin);
if (sensorState == HIGH)
 {    
   sensorStateHIGH = 1;
   
 }

 if (sensorState == LOW && sensorStateHIGH == 1)
 {
  counter++;
   sensorStateHIGH = 0;

   
   
  
}
{ { buttonState = digitalRead(buttonPin3);
if (buttonState == HIGH) {

 digitalWrite(dreh, LOW); 
  
sensorValue = analogRead(sensorPin2);
 analogWrite(pwm, sensorValue); 

 
   }
buttonState = digitalRead(buttonPin2);
    if (buttonState == HIGH) {

 digitalWrite(dreh, LOW); 
 analogWrite(pwm, 0); 

   } }




  buttonState = digitalRead(buttonPin);
if (buttonState == HIGH) {
     // wait a bit for the entire message to arrive
     delay(100);
     // clear the screen
  counter = 0000;}
    lcd.setCursor(0,1); //Start at character 4 on line 0
 lcd.print("    ");
     // read all the available characters
lcd.setCursor(0,1); //Start at character 0 on line 0
lcd.print(counter);
 lcd.setCursor(7,1);
 lcd.print("Windungen");

 //{myStepper.step(stepsPerRevolution); Diese Funktion soll starten sobald der Motor läuft
// delay(100);


 //myStepper.step(-stepsPerRevolution); Diese Funktion soll starten sobald der Motor läuft
 //delay(100);   

  
 }

}/* --(end main loop )-- */


/* ( THE END ) */

Hier nochmal ein Video dazu

Hab jetzt zumindest herausbekommen woran es liegt. Bei der Funktion Stepsperrevolution wartet das Programm die Zeitfolge ab anstatt durchzulaufen. Was kann ich dagegen tun?

JackKean:
Hab jetzt zumindest herausbekommen woran es liegt. Bei der Funktion Stepsperrevolution wartet das Programm die Zeitfolge ab anstatt durchzulaufen. Was kann ich dagegen tun?

Die delay()s herauswerfen und den Sketch sumschreiben um die Wartezeiten mit millis() machen.
Grüße Uwe

Könntest Du das bitte etwas konkreter schreiben? Was meinst du damit, in Millis?

Stepper.step() ist eine blockierende Funktion, hier also eher unbrauchbar. Ich würde es mal mit der AccelStepper Bibliothek versuchen.

JackKean:
Was meinst du damit, in Millis?

siehe: https://www.arduino.cc/en/Tutorial/BlinkWithoutDelay

DrDiettrich:
Stepper.step() ist eine blockierende Funktion, hier also eher unbrauchbar. Ich würde es mal mit der AccelStepper Bibliothek versuchen.

Oder Du versuchst es mal mit meiner MobaTools Lib. Die hat zwar keine Beschleunigungsrampe für den Stepper, die Du in deinem Fall m.M. nach auch nicht brauchst. Dafür würde sie auch funktionieren ohne dass Du deine paar delays rausschmeisst.

Was Du bei einem Stepper aber in jedem Fall brauchst, ist ein Referenzpunkt, um die Position des Steppers feststellen zu können. Beim Start deines Programms weist Du ja nicht, wo der Stepper steht.

Basierend auf #10: Pin 10 ist doppelt belegt.

JackKean:
Könntest Du das bitte etwas konkreter schreiben? Was meinst du damit, in Millis?

Leider ist delay blockierend, was bei mehreren quasi parallelen Abläufen vermieden werden muß. Daher nutzt man millis für Zeiten.

Ein Denkanstoß:

#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#include <AccelStepper.h>

const int sensorPin = 8;
const int buttonPin = 7;

int sensorState = 0;
int counter = 0;
int sensorStateHIGH = 0;

int dreh = 5;
int pwm = 6;
int buttonPin3 = 9;
int buttonPin2 = 4;
int sensorPin2 = A0;

int sensorValue = 0;
int buttonState = LOW;
int16_t schritte = -200, altschritte = schritte;

LiquidCrystal_I2C lcd(0x27, 2, 1, 0, 4, 5, 6, 7, 3, POSITIVE);  // Set the LCD I2C address
AccelStepper myStepper(4, 10, 12, 11, 13);

void setup()   /*----( SETUP: RUNS ONCE )----*/
{
  pinMode(sensorPin, INPUT_PULLUP);
  pinMode(buttonPin, INPUT_PULLUP);
  pinMode(buttonPin2, INPUT_PULLUP);
  pinMode(buttonPin3, INPUT_PULLUP);
  pinMode(dreh, OUTPUT);
  pinMode(pwm, OUTPUT);
  digitalWrite(dreh, LOW);
  analogWrite(pwm, 0);
  lcd.begin(16, 2);  // initialize the lcd for 16 chars 2 lines, turn on backlight
  myStepper.setMaxSpeed(100);
  myStepper.setAcceleration(500);

  // To do: Fahrt zum Referenzpunkt

  // ------- Quick 3 blinks of backlight  -------------
  for (int i = 0; i < 3; i++)
  {
    lcd.backlight();
    delay(50);
    lcd.noBacklight();
    delay(50);
  }
  lcd.backlight(); // finish with backlight on

  //-------- Write characters on the display ------------------
  // NOTE: Cursor Position: (CHAR, LINE) start at 0
  lcd.setCursor(0, 0); //Start at character 4 on line 0
  lcd.print("-Wickelmaschine-");
  delay(1000);
  lcd.setCursor(0, 0); //Start at character 4 on line 0
  lcd.print("                ");
}/*--(end setup )---*/


void loop()   /*----( LOOP: RUNS CONSTANTLY )----*/
{
  sensorState = digitalRead(sensorPin);
  if (sensorState == HIGH)
  {
    sensorStateHIGH = 1;
  }

  if (sensorState == LOW && sensorStateHIGH == 1)
  {
    counter++;
    sensorStateHIGH = 0;
  }
  buttonState = digitalRead(buttonPin3);
  if (buttonState == HIGH)
  {
    digitalWrite(dreh, LOW);
    sensorValue = analogRead(sensorPin2);
    analogWrite(pwm, sensorValue);
  }
  buttonState = digitalRead(buttonPin2);
  if (buttonState == HIGH)
  {
    digitalWrite(dreh, LOW);
    analogWrite(pwm, 0);
  }

  buttonState = digitalRead(buttonPin);
  if (buttonState == HIGH)
  {
    counter = 0;
  }
  if (!(millis() % 100))
  {
    if (altschritte != schritte)
    {
      altschritte = schritte;
      lcd.setCursor(0, 0); //Start at character 4 on line 0
      lcd.print("                ");
      lcd.setCursor(0, 0); //Start at character 4 on line 0
      lcd.print(schritte);
    }
    lcd.setCursor(0, 1); //Start at character 4 on line 0
    lcd.print("    ");
    lcd.setCursor(0, 1); //Start at character 0 on line 0
    lcd.print(counter);
    lcd.setCursor(7, 1);
    lcd.print("Windungen");
  }
  if (myStepper.distanceToGo() == 0)
  {
    schritte *= -1;
    myStepper.move(schritte);
  }
  myStepper.run();
}/* --(end main loop )-- */

MicroBahner:
Oder Du versuchst es mal mit meiner MobaTools Lib.

Habe ich mir runtergeladen, werde ich ausprobieren :slight_smile:

Super! Danke. Hab es hinbekommen.

Hier ein Video zur Fertigen Wickelmaschine. Erster Pickup ist schon fertig.

Ich hätte noch eine weitere Frage.

Der Counter scheint beim Zählen immer wieder auszusetzen.
Auf dem Video kann man es sehen.
Am Hallsensor leuchtet die LED bei jedem Durchgang. Es muss also am Arduino liegen.
Ist diese eventuell zu langsam für die Impulse?

JackKean:
Am Hallsensor leuchtet die LED bei jedem Durchgang. Es muss also am Arduino liegen.
Ist diese eventuell zu langsam für die Impulse?

Mit welcher maximalen Frequenz kommen die Signale, wie lange ist der Impuls von Sensor, wie sieht Dein aktueller Sketch aus?