Teleskopsteuerung mit Teensy 3.1 und Nunchuk

Hallo community,
Ich beschäftige mich erst seit kurzem mit dem Arduino. Eigentlich erst anläßlich des Projekts "Teleskopsteuerung". Der mechanische Aufbau ist soweit klar und in Arbeit. Nur der inteligente Teil macht mir Kopfzerbrechen - und das schon am Anfang!

Es ist geplant die Teleskopmontierung mit dem Steuerkreuz des Nunchuks zu steuern ( fein zum korrigieren = microschritt und grob zum verfahren = vollschritt) ausserdem sollen die Koordinaten und die Sternzeit (brauch ich eh zum rechnen) angezeigt werden. Später soll dann evt. noch ein Menü zur Parametereingabe dazukommen. Eine Ansteuerung mittels Pc ala goto ist nicht geplant. Zur Schonung der Mechanik und um keine Schritte zu verlieren brauche ich eine Rampe.
Ich finde aber einfach keinen zielführenden Ansatz für ein sanftes Beschleunigen bzw. Abbremsen der Schrittmotorbewegung. Der Nunchuk liefert Werte von -127 bis 128 nahezu stufenlos. Ich möchte die tatsächliche Beschleunigung schrittweise bis auf den Wert des Nunchuks ansteigen lassen. Das klappt auch bis auf ein paar Sonderfälle. Aber wie bekomme ich das jetzt mit den Impulsen oder viel mehr mit den Pausen dazwischen hin? Es sollen natürlich beide Achsen gleichzeitig bedient werden, die Impulse sollen gezählt, in Koordinaten umgerechnet und angezeigt werden - und die Nachführung per TimerInterrupt funkt da auch noch dazwischen. Ich brauch keine fertige Programmierung - das will ich selbst hinkriegen - nur eine zündende Idee!
Wer kann helfen??
Unten der angehängte Quellcode

MfG Grissu112

long racount = 0; // Schrittzaehler RA
long decount = 0; // Schrittzaehler DE
int joyX = 0; // Nunchuk X-Achse
int joyY = 0; // Nunchuk Y-Achse
int butZ = 0; // Nunchuk Z-Button
int tmpX = 0; // aktuelle Beschleunigung X-Achse
int tmpY = 0; // aktuelle Beschleunigung Y-Achse
int timerX = 0; // Umlaeufe je Impuls X
int timerY = 0; // Umlaeufe je Impuls Y
int sw = 10; // Rampensteigung
int NS = 0; // Zeiger Nord- oder Suedhalbkugel 0=nord
int OW = 0; // Zeiger Ost- oder Westlage Teleskop 0=ost

void setup()
{
  pinMode(A0, INPUT); //Ersatz fuer Nunchuk X
  pinMode(A1, INPUT); //Ersatz fuer Nunchuk Y
  pinMode(2, OUTPUT); // microstep
  pinMode(3, INPUT); // Ersatz fuer Nunchuk Z
  pinMode(4, OUTPUT); // RA Dir
  pinMode(5, OUTPUT); // RA Step
  pinMode(6, OUTPUT); // DE Dir
  pinMode(7, OUTPUT); // DE Step
}


void loop()
{
joyX = (analogRead(A0) - 512) / 5;
joyY = (analogRead(A1) - 512) / 5;
butZ = digitalRead(3);

timerX ++; 
if (joyX < 0) {digitalWrite(4, HIGH); joyX = abs(joyX);} else {digitalWrite(4, LOW);} // Drehrichtung
if (tmpX < joyX - sw) tmpX = tmpX + sw; 
else if (tmpX > joyX + sw) tmpX = tmpX - sw; 
else {tmpX = joyX;} 

timerY ++; 
if (joyY < 0) {digitalWrite(6, HIGH); joyY = abs(joyY);} else {digitalWrite(6, LOW);} // Drehrichtung
if (tmpY < joyY - sw) tmpY = tmpY + sw; 
else if (tmpY > joyY + sw) tmpY = tmpY - sw; 
else {tmpY = joyY;}

if (butZ == 1) {digitalWrite(2, LOW);} else digitalWrite(2, HIGH); // microschritt oder vollschritt           

if (tmpX == 0) timerX = 1; 
else if (tmpX > 100/timerX) {
    digitalWrite(5, LOW); 
    delayMicroseconds (1); 
    digitalWrite(5, HIGH); 
    delayMicroseconds (1); 
    digitalWrite(5, LOW);
		if (digitalRead(4) == HIGH) {racount = racount - 1 -(15*butZ);} 
    	else {racount = racount + 1 +(15*butZ);} timerX = 0;}

if (tmpY == 0) timerY = 1; 
else if (tmpY > 100/timerY) {
    digitalWrite(7, LOW); 
    delayMicroseconds (1); 
    digitalWrite(7, HIGH); 
    delayMicroseconds (1); 
    digitalWrite(7, LOW);
		if (digitalRead(6) == HIGH) {decount = decount - 1 -(15*butZ);} 
		else {decount = decount + 1 +(15*butZ);} timerY = 0;}
}

Kannst Du erklären, weshalb eine Bibliothek wie z.B. AccelStepper (AccelStepper: AccelStepper library for Arduino) für Deinen Fall nicht funktioniert?

pylon:
Kannst Du erklären, weshalb eine Bibliothek wie z.B. AccelStepper (AccelStepper: AccelStepper library for Arduino) für Deinen Fall nicht funktioniert?

Vieleicht weil's gar kein Arduino ist?
Der Teensy3.1 wird zwar über die Arduino IDE programmiert ist aber kein Produkt von Arduino.
Grüße Uwe

Hallo ,

Kannst Du erklären, weshalb eine Bibliothek wie z.B. AccelStepper (AccelStepper: AccelStepper library for Arduino) für Deinen Fall nicht funktioniert?

Würde schon funktionieren, aber damit kann ich die Schritte nicht zählen, glaub ich. Zumindest wüßte ich nicht wie. Wenn das gänge, wäre es ja toll. Allerdings brauche ich einen großen Teil der Funktionen gar nicht. Der Teensy ist zwar nicht Hardwarekompatibel zum Arduino, lässt sich aber zu großen Teilen wie einer behandeln und programmieren! Mir war bei der Auswahl das kompakte Design mit ordentlich Rechenleistung, Echtzeituhr und vielen Pins wichtig.

Die Rampe funktioniert jetzt schon soweit ganz gut, allerdings frhlt mir noch die zündende Idee, wie ich den Wert umsetzen soll. Wie schon geschrieben 2 Schrittmotoren simultan mit Zählen der Schritte und noch anderen Berechnungen ( Position und Ausgabe auf 5110 LCD)

Tobias

Mein Einwand war als Vorschlag gedach Dich an das Teensy -Forum zu wenden.
Grüße Uwe

Das "Problem" ist ja nicht Teensy - spezifisch udn ein deutschsprachiges Forum hab ich noch nicht gefunden.

MfG Tobias

Würde schon funktionieren, aber damit kann ich die Schritte nicht zählen, glaub ich.

Wieso willst Du Schritte zählen, das macht doch die Bibliothek für Dich. Du gibst an, welche Position angesteuert werden soll, welche max. Beschleunigung und Geschwindigkeit eingehalten werden soll und den Rest macht die Bibliothek.

Das "Problem" ist ja nicht Teensy - spezifisch udn ein deutschsprachiges Forum hab ich noch nicht gefunden.

Das Problem ist sehr häufig eben schon der Teensy bzw. dessen andere Hardware. Bei der AccelStepper-Bibliothek wird jedoch scheinbar kein hardware-spezifischer Code eingesetzt, somit sollte sie auch auf dem Teensy funktionieren.

Sowie ich verstehe hat der Teensy modifizierte Core Files, so dass damit der ganze Standard Arduino Kram entsprechend läuft.

Für "on the metal" Programmierung gibt es auf der Seite eine Reihe von Libs die für den Teensy angepasst wurden, wenn z.B. Timer verwendet werden:
http://www.pjrc.com/teensy/td_libs.html

Guten Morgen,

Wieso willst Du Schritte zählen, das macht doch die Bibliothek für Dich. Du gibst an, welche Position angesteuert werden soll, welche max. Beschleunigung und Geschwindigkeit eingehalten werden soll und den Rest macht die Bibliothek.

Wäre das Projekt ein X-y(-z) Tisch, wäre die Bibliothek genau das richtige. ABER Ich möchte keine "go to" Steuerung sondern viel einfacher eine Joysticksteuerung bei welcher die Position angezeigt wird. Für das Problem go to gibt es für den Arduino + PC schon komplett fertige Lösungen. Also Erfassung der analogen Joystickwerte, umrechnen in Geschwindigkeit und Richtung (bis hierher läuft der Code bereits!) Steuerung der beiden Schrittmotoren mit Beschleunigungs- bzw. Bremsrampe, zählen der Impulse Impulse am "Step" Ausgang. Dazu berechnen und Anzeige der akt Pos.(muß nicht zwingend bei jedem Durchlauf passieren - 2x je Sekunde reicht da völlig). Per Interrupt kommt dann noch die Nachführung rund 30 Impulse/s auf der X-Achse (Erdrotation) dazu - das ist allerdings (genau wie die Timerroutinen "Teensy - Kram"). Mir geht's darum die Geschwindigkeitswerte für X und Y jeweils -127 bis +127 in "Takt" jeweils am "Step" Anschluß des Pololu-treibers umzusetzen und zu zählen.

Teensyduino: Using Arduino Libraries with Teensy USB development board

Den Link hab ich mir vorgemerkt! mit der Accelstepper beschäftige ich mich mal näher, vielleicht gibt es da doch einen Ansatz.

Tobias