Gude liebe Leute,
ein Kommilitone und ich bauen für ein Uniprojekt gerade einen motorisierten Kamerslide mit Hilfe eines Arduino.
Bautteile:
Nema 17, A4988 Treiber, OLED SSD1306, Rotary Encoder, Arduino Nano, Limit Switches, Slider, Pulley, Riemen
Wir haben schon ein bisschen Code zusammengebastelt, aber kommen nicht mehr weiter. Wir sind beide keine Arduino Virtuosen und versuchen durch andere Codes und Trail & Error unsere Zwecke zu erfüllen.
Deshalb die Frage, ob uns hier jemand unter die Arme greifen könnte und uns hier und da ein paar Tipps oder Denkanstöße geben könnte. Ich möchte nicht dass mir alles vorgekaut wird und erwarte das auch nicht, wenn ihr versteht was ich meine.
Ich erkläre mal kurz was wir uns von dem Slider vorgestellt haben.
Slider mit Endanschlag an beiden Seiten.
Slider soll entweder immer hin und her fahren, oder nur einmal die Strecke zurücklegen.
Einstellung der Geschwindigkeit in Zeit für die Strecke Anschlag rechts zu Anschlag links.
Steuerung über den Rotary Encoder und Anzeige auf Display.
Das heißt das Display braucht einen Start, Stop Button, einen Loop oder Single Button und einen Bereich wo man die Geschwindigkeit (Zeit) einstellen kann.
Vorerst haben wir versucht das Zusammenspiel von Rotary Encoder zu Motor und Display zu verstehen.
Leider sind wir schon dabei gescheitert. ![]()
Folgendes Problem. Mit unserem Code können wir den Motor von der Geschwindigkeit 1 bis 400 laufen lassen und die Zahl wird im seriellen Monitor angezeigt. Der Motor ändert auch seine Geschwindigkeit. Gut. Auf dem Display können wir das ganze auch anzeigen lassen und das funktioniert auch, aber unser Motor dreht dann nicht mehr wie er soll. Keine Ahnung wo daran der Fehler liegt. Ohne Display funktioniert alles normal. Vielleicht liegt das an der Abtastrate und der Arduino ist zu schwach... Keine Ahnung.
Hat da vielleicht jemand einen Tipp woran das liegen kann oder sagt; hey, guckt euch mal die Bibliothek dazu an. Damit läuft das was ihr machen wollt viel einfacher.
Hier mal die Codes
Ohne Display. Funktioniert alles:
#include <Arduino.h>
#include "A4988.h"
// this pin should connect to Ground when want to stop the motor
#define STOPPER_PIN 7
// Motor steps per revolution. Most steppers are 200 steps or 1.8 degrees/step
#define MOTOR_STEPS 200
// Microstepping mode. If you hardwired it to save pins, set to the same value here.
#define MICROSTEPS 16
#define DIR 8
#define STEP 9
// Rotary Encoder Inputs
#define PinCLK 3
#define PinDT 2
#define MS1 10
#define MS2 11
#define MS3 12
A4988 stepper(MOTOR_STEPS, DIR, STEP, MS1, MS2, MS3);
int rpm = 200;
const int dirPin = 8; // Direction
const int stepPin = 9; // Step
int currentStateCLK;
int lastStateCLK;
String currentDir = "";
volatile boolean TurnDetected;
volatile boolean up;
void Rotary()
{
delay(75);
if (digitalRead(PinCLK))
up = !digitalRead(PinDT);
else
up = digitalRead(PinDT);
TurnDetected = true;
delay(75);
}
void setup() {
Serial.begin(115200);
// Configure stopper pin to read HIGH unless grounded
pinMode(STOPPER_PIN, INPUT_PULLUP);
// Set encoder pins as inputs
pinMode(PinCLK, INPUT);
pinMode(PinDT, INPUT);
stepper.begin(rpm, MICROSTEPS);
// if using enable/disable on ENABLE pin (active LOW) instead of SLEEP uncomment next line
// stepper.setEnableActiveState(LOW);
stepper.enable();
// Read the initial state of CLK
// lastStateCLK = digitalRead(CLK);
/*
// Call updateEncoder() when any high/low changed seen
// on interrupt 0 (pin 2), or interrupt 1 (pin 3)
attachInterrupt(0, updateEncoder, CHANGE);
attachInterrupt(1, updateEncoder, CHANGE);
*/
attachInterrupt (0, Rotary, RISING);
Serial.println("START");
delay(1000);
}
void loop() {
if (TurnDetected) {
TurnDetected = false;
if (up) {
if (rpm < 20) {
rpm = rpm + 1;
}
else {
rpm = rpm + 5;
}
if (rpm >= 400) {
rpm = 400;
}
}
else {
if (rpm <= 20) {
rpm = rpm - 1;
}
else {
rpm = rpm - 5;
}
if (rpm <= 1) {
rpm = 1;
}
}
}
Serial.println(rpm);
stepper.setRPM(rpm);
stepper.rotate(1);
}
Hier der Code mit Display, welcher den Motor stört.
#include <Arduino.h>
#include "A4988.h"
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#define SCREEN_WIDTH 128 // OLED display width, in pixels
#define SCREEN_HEIGHT 32 // OLED display height, in pixels
// Declaration for an SSD1306 display connected to I2C (SDA, SCL pins)
#define OLED_RESET 4 // Reset pin # (or -1 if sharing Arduino reset pin)
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);
#define OLED_ADDR 0x3c
// this pin should connect to Ground when want to stop the motor
#define STOPPER_PIN 7
// Motor steps per revolution. Most steppers are 200 steps or 1.8 degrees/step
#define MOTOR_STEPS 200
// Microstepping mode. If you hardwired it to save pins, set to the same value here.
#define MICROSTEPS 16
#define DIR 8
#define STEP 9
// Rotary Encoder Inputs
#define PinCLK 3
#define PinDT 2
#define MS1 10
#define MS2 11
#define MS3 12
A4988 stepper(MOTOR_STEPS, DIR, STEP, MS1, MS2, MS3);
int rpm = 200;
const int dirPin = 8; // Direction
const int stepPin = 9; // Step
int currentStateCLK;
int lastStateCLK;
String currentDir = "";
volatile boolean TurnDetected;
volatile boolean up;
void Rotary()
{
delay(75);
if (digitalRead(PinCLK))
up = !digitalRead(PinDT);
else
up = digitalRead(PinDT);
TurnDetected = true;
delay(75);
}
void setup() {
Serial.begin(115200);
display.begin(SSD1306_SWITCHCAPVCC, 0x3C);
display.clearDisplay();
// Configure stopper pin to read HIGH unless grounded
pinMode(STOPPER_PIN, INPUT_PULLUP);
// Set encoder pins as inputs
pinMode(PinCLK, INPUT);
pinMode(PinDT, INPUT);
stepper.begin(rpm, MICROSTEPS);
// if using enable/disable on ENABLE pin (active LOW) instead of SLEEP uncomment next line
// stepper.setEnableActiveState(LOW);
stepper.enable();
// Read the initial state of CLK
// lastStateCLK = digitalRead(CLK);
/*
// Call updateEncoder() when any high/low changed seen
// on interrupt 0 (pin 2), or interrupt 1 (pin 3)
attachInterrupt(0, updateEncoder, CHANGE);
attachInterrupt(1, updateEncoder, CHANGE);
*/
attachInterrupt (0, Rotary, RISING);
Serial.println("START");
delay(1000);
}
void loop() {
{
if (TurnDetected) {
if (up) {
if (rpm < 20) {
rpm = rpm + 1;
}
else {
rpm = rpm + 5;
}
if (rpm >= 400) {
rpm = 400;
}
}
else {
if (rpm <= 20) {
rpm = rpm - 1;
}
else {
rpm = rpm - 5;
}
if (rpm <= 1) {
rpm = 1;
}
}
TurnDetected = false;
}
stepper.setRPM(rpm);
stepper.rotate(1);
}
Serial.println(rpm);
display.clearDisplay();
display.setTextSize(2);
display.setTextColor(WHITE);
display.setCursor(5, 0);
display.print(rpm);
display.display();
}
Vielen Dank schonmals fürs durchlesen und sorry wenn es etwas unübersichtlich geworden ist ![]()