Hallo zusammen
Erst mal möchte ich mich begrüssen, ich bin neu in dieser Community
Ich bin noch relativ neu in Sachen Arduino-Programmierung und habe leider trotz intensiver Suche im Internet bisher zu keiner Lösung gefunden...
Ich realisiere momentan folgendes Projekt: geplant ist die Steuerung meines Teleskop-Okulars mittels eines Schrittmotors (durch IR-Receiver).
Da die Okulare relativ empfindlich sind, möchte ich den Auszug jedoch mit einem Endstop begrenzen.
Ich möchte, dass bei einem Tastendruck (0-9) die 0 maximaler Auszug bedeutet (1024 Schritte) die Tasten 1-9 jeweils 1/10 des Auszugs bewerkstelligen, die Richtung habe ich mit den Cases "+" & "-" eingearbeitet.
Bisher habe ich die Steuerung relativ gut hinbekommen (jedenfalls funktionieren die Steuertasten...) indem ich folgenden Code gefunden und meinen Bedürfnissen angepasst habe:
#include <IRremote.h>
int END_PIN = 7;
int IR_RECEIVE_PIN = 8;//The definition of the infrared receiver pin 8
int Pin0 = 9;//definition digital 8 pins as pin to control the IN1 (ULN24L01)
int Pin1 = 10;//definition digital 9 pins as pin to control the IN2 (ULN24L01)
int Pin2 = 11;//definition digital 10 pins as pin to control the IN3 (ULN24L01)
int Pin3 = 12;//definition digital 11 pins as pin to control the IN4 (ULN24L01)
int _step = 512;
int _speed = 1;
int dir;
void setup()
{
Serial.begin(38400);
pinMode(Pin0, OUTPUT);//Set digital 8 port mode, the OUTPUT for the output
pinMode(Pin1, OUTPUT);//Set digital 9 port mode, the OUTPUT for the output
pinMode(Pin2, OUTPUT);//Set digital 10 port mode, the OUTPUT for the output
pinMode(Pin3, OUTPUT);//Set digital 11 port mode, the OUTPUT for the output
IrReceiver.begin(IR_RECEIVE_PIN, DISABLE_LED_FEEDBACK); //Initialization infrared receiver
pinMode(END_PIN, INPUT);
}
void loop()
{
if (IrReceiver.decode()) {
switch (IrReceiver.decodedIRData.decodedRawData) {
case 4144561920/*-*/:
dir = 1;
break;
case 2774204160/*+*/:
dir = 0;
break;
case 3860463360/*0*/:
Speed(15);
if (dir == 0) {
Step(1024);//Full out
} else {
Step(-1024);//Full in
}
break;
case 3125149440/*1*/:
Speed(15);//Stepper motor speed = 15 fast
if (dir == 0) {
Step(102);//1/10 out
} else {
Step(-102);//1/10 in
}
break;
case 3108437760/*2*/:
Speed(15);//Stepper motor speed = 15 fast
if (dir == 0) {
Step(204);//2/10 out
} else {
Step(-204);//2/10 in
}
break;
case 3091726080/*3*/:
Speed(15);//Stepper motor speed = 15 fast
if (dir == 0) {
Step(306);//3/10 out
} else {
Step(-306);//3/10 in
}
break;
case 3141861120/*4*/:
Speed(15);//Stepper motor speed = 15 fast
if (dir == 0) {
Step(408);//4/10 out
} else {
Step(-408);//4/10 in
}
break;
case 3208707840/*5*/:
Speed(15);//Stepper motor speed = 15 fast
if (dir == 0) {
Step(510);//5/10 out
} else {
Step(-510);//5/10 in
}
break;
case 3158572800/*6*/:
Speed(15);//Stepper motor speed = 15 fast
if (dir == 0) {
Step(612);//6/10 out
} else {
Step(-612);//6/10 in
}
break;
case 4161273600/*7*/:
Speed(15);//Stepper motor speed = 15 fast
if (dir == 0) {
Step(714);//7/10 out
} else {
Step(-714);//7/10 in
}
break;
case 3927310080/*8*/:
Speed(15);//Stepper motor speed = 15 fast
if (dir) {
Step(816);//8/10 out
} else {
Step(-816);//8/10 in
}
break;
case 4127850240/*9*/:
Speed(15);//Stepper motor speed = 15 fast
if (dir == 0) {
Step(918);//9/10 out
} else {
Step(-918);//9/10 in
}
break;
default :
Step(0); //Stepper motor stop
break;
}
Serial.println(IrReceiver.decodedIRData.decodedRawData);
IrReceiver.resume(); // Receiving the next value
}
}
void Speed(int stepperspeed)//set Stepper speed
{
_speed = 15 - stepperspeed;
if ( _speed < 1) {
_speed = 1;
}
if ( _speed > 15) {
_speed = 15;
}
}
void Step(int _step)//Stepper motor rotation
{
if (_step >= 0) { // Stepper motor forward
for (int i = 0; i < _step; i++) {
setStep(1, 0, 0, 1);
delay(_speed);
setStep(1, 0, 0, 0);
delay(_speed);
setStep(1, 1, 0, 0);
delay(_speed);
setStep(0, 1, 0, 0);
delay(_speed);
setStep(0, 1, 1, 0);
delay(_speed);
setStep(0, 0, 1, 0);
delay(_speed);
setStep(0, 0, 1, 1);
delay(_speed);
setStep(0, 0, 0, 1);
delay(_speed);
}
} else { // Stepper motor backward
for (int i = _step; i < 0; i++) {
setStep(0, 0, 0, 1);
delay(_speed);
setStep(0, 0, 1, 1);
delay(_speed);
setStep(0, 0, 1, 0);
delay(_speed);
setStep(0, 1, 1, 0);
delay(_speed);
setStep(0, 1, 0, 0);
delay(_speed);
setStep(1, 1, 0, 0);
delay(_speed);
setStep(1, 0, 0, 0);
delay(_speed);
setStep(1, 0, 0, 1);
delay(_speed);
}
}
}
void setStep(int a, int b, int c, int d)
{
digitalWrite(Pin0, a);
digitalWrite(Pin1, b);
digitalWrite(Pin2, c);
digitalWrite(Pin3, d);
}
Ich möchte jedoch, dass bei jedem Tastendruck für die Grobeinstellung (0-9) der Stepper zuerst soweit zurückfährt, bis der Endschalter (der an Pin 7 liegt) die Nullposition anzeigt (dies um eine Überlast der Mechanik zu verhindern) und erst dann die entsprechenden Stepps ausfährt...
Ich hoffe, ich konnte meine Problematik einigermassen plausibel schildern und mir kann jemand etwas weiterhelfen
Liebe Grüsse
Dave