Moin moin aus HU.
Ich bin Fernmelder und Netzwerker im Ruhestand und bin dem 3D Virus verfallen. . Dafür habe ich mir einen 3D Fotoscanner gebaut, der ja nun gesteuert werden muss.
Daher beschäftige ich mich seit Kurzem mit der Arduino UNO Programmierung. Ich möchte damit den Foto Scanner steuern. Bisher hat das auch gut geklappt. Nun möchte ich ein Poti einbinden, um die Bilderzahl pro Umdrehung einzustellen.
Ich habe auf dem UNO ein CNC Shield und steuere damit 4 Stepper Nema 17 und den Fotoapparat. Tasten für Hoch, Runter, Kippen sowie Relaissteuerung für den Auslöser, Umkehrtaste und Starttaste für den Scann mit Drehteller sind da auch dran. Nun habe ich das Problem, das die FOR Schleife für den Drehteller nicht funktioniert. Die Schleife fängt bei 13 an und spring auch in unregelmäßigen Abständen nach oben. Das Programm sieht momentan etwas zerfleddert aus, weil ich versucht habe, den Fehler ein zu grenzen. Vielleicht hat ja jemand einen Tip für mich. Der Drehteller mach eine Umdrehung bei 6400 Steps.
Hier das Programm:
#define Poti 0
// --------------------PIN Benennung----------------------------------
int Kamera=10; // Kameraauslöser Servosteuerung alt Y Endstop
//int Servo2=11; // frei alt Z endstop
int StepStpHoch=4; // step Hoch alt step z
int StepStpDreh=3; // Step Drehen Dreehteller alt step y
int StepStpKipp=2; // Step Kippen alt step x
int StepDirHoch=7; // Die Hoch Hoch alt z Dir
int StepDirDreh=6; // Drehteller alt y DIR
int StepDirKipp=5; // Kippen alt x Dir
int StepAllEna=8; // alle Stepper einschalten
int EndstopHoch=9; // Endstop x Achse alt Endstop X
int Start=0; // schwarz alt RX min
int TastePlusMinus=1; // Gelb Plus Minus alt TX Endstop
int TasteHochtief=12; // grün Hoch/tief alt enable spin
int TasteKippen=13; // braun Kippen alt spin dir
//----------------------------Variablen----------------------------------
int Dauer=6400; //6443 Umdrehungen Teller hier 2 x 360° 12886
int Tempo=10; // Umdrehungsgeschwindigkeit
int Hub=1; //Hubgeschwindigkeit
int Kipp=3; //Kippgeschwindigkeit
int Klick=0;
int Servopause=1500; //Zeit für die Einstellung des Servos auf Klick
int Klickmenge=200; // Fotos pro Umdrehung Wert 200 ca 30 Fotos
int Speicherpause=3500; //Die Zeit. die ein Foto digital abgespeichert wird
int Bilder=0;
void setup()
{
Serial.begin(9600);
pinMode(Poti,INPUT);
//--------------------Ausgabe/ Lesen/Schreiben--------------------------
// Pin Funktion einstellen
pinMode(Kamera, OUTPUT); // rRXals digital für Kamerasteuerung
pinMode(1, OUTPUT); //TX als digital- für Kamerasteuerung
pinMode(StepAllEna, OUTPUT);
pinMode(StepDirHoch, OUTPUT);
pinMode(StepStpHoch, OUTPUT);
pinMode(StepDirDreh, OUTPUT);
pinMode(StepStpDreh, OUTPUT);
pinMode(StepDirKipp, OUTPUT);
pinMode(StepStpKipp, OUTPUT);
pinMode(EndstopHoch,INPUT); // Endstop für Spindel unten alt X Endstop
pinMode(Start,INPUT); // Start Knopf alt Y Endstop
pinMode(TastePlusMinus,INPUT); // Plus Minus alt Z endstop
pinMode(TasteHochtief,INPUT); // Hoch/tief alt enable spin
pinMode(TasteKippen,INPUT); // Kippen alt spin dir
// Pullup Widerstände für die Tasten einschalten
pinMode(EndstopHoch, INPUT_PULLUP); //9 Pullup ein
pinMode(Start, INPUT_PULLUP); //10 Pullup ein
pinMode(TastePlusMinus, INPUT_PULLUP); //11 Pullup ein
pinMode(TasteHochtief,INPUT_PULLUP); //12 Pullup ein
pinMode(TasteKippen, INPUT_PULLUP); //13 Pullup ein
digitalWrite(StepAllEna,HIGH); // set Ena aus
}
//---------------------------------Programmablauf----------------------
void loop(){
int schleifer = analogRead(Poti);
Serial.print("Schleiferposition: ");
Serial.println(schleifer) ;
if(schleifer < 10)
{
schleifer=10;
}
Klickmenge=Dauer/schleifer;
digitalWrite(StepAllEna,LOW); // Motoren an
if (digitalRead(Start)==LOW) //Unterprogramm Teller drehen
{
Drehen();
}
if (digitalRead(TasteHochtief)==LOW){ //Unterprogramm Hoch/Tief fahren
Heben();
}
if (digitalRead(TasteKippen)==LOW){ //Unterprogramm Kamera kippen
Kippen();
}
}
//-------------------------Unterprogramme-----------------------------
void Drehen()
{
Klick=0;
for (int Durchlauf=0; Durchlauf<Dauer;Durchlauf++) //Zeitschleife für eine Umdrehung
{
// Abbruch einleiten--------------------------------------------------
if(digitalRead(TastePlusMinus)==LOW) //Start zum Abbruch gedrückt
{
// int Durchlauf=(Dauer); // i auf Endwert setzen.
continue; // Schleife verlassen
// Abbruch einleiten--------------------------------------------------
}
Serial.print("Klicks: ");
Serial.println(Klick);
Serial.print("Durchlauf: ");
Serial.println(Durchlauf);
delay(500);
//Kamera starten------------------------------------------------------------
// if(Klick > Klickmenge) // Zeitpunkt für Klick
// {
// Klick=0; // Klickzeit neu szarten
// digitalWrite(Kamera,HIGH); // Kamera an
// delay(Servopause); // Zeit bis Servo drausen ist//
// digitalWrite(Kamera,LOW); // Kamera aus
// delay(Speicherpause);
// }
//Kamera Starten -------------------------------------------------------------
// Motor drehen-------------------------------------------
digitalWrite(StepStpDreh,HIGH); //Takt High
delay(10); //Verzögerung
digitalWrite(StepStpDreh,LOW); //Takt low
delay(10);
// Motor drehen-------------------------------------------
Klick=Klick+1; // Zeitpunkt für Klick raufrechnen
}
}
//---------------------------heben/Senken---------------------------
void Heben()
{
//digitalWrite(StepAllEna,LOW); // Motoren an
do
{
if(digitalRead(TastePlusMinus)==LOW) //Plus/ MinusTaste gedrückt
{
digitalWrite(StepDirHoch, LOW); //Nach oben drehen
} else
{
digitalWrite(StepDirHoch, HIGH); //Wenn Plus/Minus nicht gedrückt,
// nach unten drehen
}
if (digitalRead(EndstopHoch)==HIGH) //Wenn Endstop ausgelöst
{
digitalWrite(StepDirHoch, LOW); //Dann nach oben drehen
}
digitalWrite(StepStpHoch,HIGH); //Takt High
digitalWrite(StepStpHoch,LOW); //Takt low
}
while (digitalRead(TasteHochtief)==LOW); // Ausführen, so lange
// Wie Taste HT gedrückt ist
//digitalWrite(StepAllEna,HIGH); // Motoren aus
}
//-----------------------Kippen--------------------------
void Kippen(){
//digitalWrite(StepAllEna,LOW); // Motoren an
do
{
if (digitalRead(TastePlusMinus)==LOW) // Wenn Plus/Minus gedrückt
{
digitalWrite(StepDirKipp, HIGH); //Kippen nach Plus drehen
}
else
{
digitalWrite(StepDirKipp, LOW); //Sonst nach Minus drehen
}
digitalWrite(StepStpKipp,HIGH); //Takt High
delay(Kipp); //Verzögerung
digitalWrite(StepStpKipp,LOW); //Takt LOW
delay(Kipp); //Verzögerung
}
while (digitalRead(TasteKippen)==LOW); //Solange Taste Kippen gedrückt ist
//digitalWrite(StepAllEna,HIGH); // Motoren aus
}