Hallo zusammen,
ich befasse mich seit kurzer Zeit mit dem Arduino UNO und dem Roboclaw 2X 30A.
Informationen:
Arduino UNO Version 1.8.19
Basicmicro Roboclaw 2X30A Version 1.0.0.71
2X 12V BLDC Motoren für ein Panorama Display.
Problemstellung:
Die gesamte Einstellung der Motoren wie PID sowie die abfrage bzw. die Positionierung über die Encoder (Hallgeber) funktionieren einwandfrei.
Ein entsprechende Sketch habe ich erstellt und hier mit eingefügt.
Ich habe 4 Positionen (accl/speed/deccl/Position) die im Automatikbetrieb (Taster) über den Sketch abgearbeitet werden. Funktioniert einwandfrei.
Jetzt habe ich 4 weitere Taster sowie Anzeige LED´s angeschlossen und möchte eine "Schrittkette" programmieren.
Drücke Taster 1 - fahre auf Pos1
Drücke Taster 2 - fahre von Pos 1 auf 2 usw.
Ich habe schon if while Schleifen sowie mit Merkern versucht es zu realisieren, leider bisher ohne Erfolg.
Vielleicht könnt ihr mir helfen, dafür wäre ich sehr dankbar.
Hier ist der aktuelle Sketch:
//Buffered Drive M1 with signed Speed, Accel, Deccel and Position
//Includes required to use Roboclaw library
#include <SoftwareSerial.h>
#include "RoboClaw.h"
//See limitations of Arduino SoftwareSerial
SoftwareSerial serial(10, 11);
RoboClaw roboclaw(&serial, 10000);
#define address 0x80
#define ledPOS1 8
#define tasterPOS1 2
#define ledPOS2 13
#define tasterPOS2 4
#define ledPOS3 12
#define tasterPOS3 7
#define ledPOS4 5
#define tasterPOS4 3
#define ledPOS5 6
#define tasterPOS5 9
int merker0 = HIGH;
int merker1 = LOW;
int merker2 = LOW;
int merker3 = LOW;
int merker4 = LOW;
boolean enabledled1, enabledled2, enabledled3, enabledled4, enabledled5 = false; // True, wenn die LED leuchtet, sonst false.
boolean buttonPOS1, buttonPOS2, buttonPOS3, buttonPOS4, buttonPOS5 = false; // True, wenn der Taster gedrückt wird, sonst false.
//Display Encoder and Speed for Motor 1
void displayspeed(void)
{
uint8_t status1, status2;
bool valid1, valid2;
int32_t enc1 = roboclaw.ReadEncM1(address, &status1, &valid1);
int32_t speed1 = roboclaw.ReadSpeedM1(address, &status2, &valid2);
if (valid1) {
Serial.print("Encoder1:");
Serial.print(enc1, DEC);
Serial.print(" ");
Serial.print(status1, HEX);
Serial.print(" ");
}
if (valid2) {
Serial.print("Speed1:");
Serial.print(speed1, DEC);
Serial.print(" ");
}
Serial.println();
}
void setup() {
//Open Serial and roboclaw at 38400bps
Serial.begin(57600);
roboclaw.begin(38400);
Serial.println("Starting...");
pinMode( tasterPOS1, INPUT_PULLUP); // wir definieren den tasterPin als Eingang mit Pull Up
pinMode( ledPOS1, OUTPUT); // wir definieren den ledPin als Ausgang
pinMode( tasterPOS2, INPUT_PULLUP);
pinMode( ledPOS2, OUTPUT);
pinMode( tasterPOS3, INPUT_PULLUP);
pinMode( ledPOS3, OUTPUT);
pinMode( tasterPOS4, INPUT_PULLUP);
pinMode( ledPOS4, OUTPUT);
pinMode( tasterPOS5, INPUT_PULLUP);
pinMode( ledPOS5, OUTPUT);
}
void loop() {
//Taster POS1 entprellen LED 1
if (digitalRead(tasterPOS1) == LOW) {
buttonPOS1 = true;
delay(10);
}
if (digitalRead(tasterPOS1) == HIGH && buttonPOS1 == true) {
buttonPOS1 = false;
if (ledPOS1 == true) {
digitalWrite(ledPOS1, LOW);
enabledled1 = false;
} else {
digitalWrite(ledPOS1, HIGH);
enabledled1 = true;
}
}
//Taster POS2 entprellen LED 2
if (digitalRead(tasterPOS2) == LOW) {
buttonPOS2 = true;
delay(10);
}
if (digitalRead(tasterPOS2) == HIGH && buttonPOS2 == true) {
buttonPOS2 = false;
if (enabledled2 == true) {
digitalWrite(ledPOS2, LOW);
enabledled2 = false;
} else {
digitalWrite(ledPOS2, HIGH);
enabledled2 = true;
}
}
//Taster Pos3 entprellen LED 3
if (digitalRead(tasterPOS3) == LOW) {
buttonPOS3 = true;
delay(10);
}
if (digitalRead(tasterPOS3) == HIGH && buttonPOS3 == true) {
buttonPOS3 = false;
if (enabledled3 == true) {
digitalWrite(ledPOS3, LOW);
enabledled3 = false;
} else {
digitalWrite(ledPOS3, HIGH);
enabledled3 = true;
}
}
//Taster Pos4 entprellen LED 4
if (digitalRead(tasterPOS4) == LOW) {
buttonPOS4 = true;
delay(10);
}
if (digitalRead(tasterPOS4) == HIGH && buttonPOS4 == true) {
buttonPOS4 = false;
if (enabledled4 == true) {
digitalWrite(ledPOS4, LOW);
enabledled4 = false;
} else {
digitalWrite(ledPOS4, HIGH);
enabledled4 = true;
}
}
//Taster Pos5 entprellen LED 5
if (digitalRead(tasterPOS5) == LOW) {
buttonPOS5 = true;
delay(10);
}
if (digitalRead(tasterPOS5) == HIGH && buttonPOS5 == true) {
buttonPOS5 = false;
if (enabledled5 == true) {
digitalWrite(ledPOS5, LOW);
enabledled5 = false;
} else {
digitalWrite(ledPOS5, HIGH);
enabledled5 = true;
}
}
// Ablaufsteuerung-------------------------------------------------------------------------------
// 1. Wert Beschleunigung
// 2. Wert Geschwindigkeit max = 1685 Qpps
// 3. Wert Entschleunigung
// 4, Wert Position
// 5. Wert Buffer Der Puffer kann auf 1 oder 0 gesetzt werden. Bei einem Wert von 0 wird der Befehl gepuffert
// und in der gesendeten Reihenfolge ausgeführt. Bei einem Wert von 1 wird der aktuell laufende Befehl angehalten,
// alle anderen Befehle im Puffer werden gelöscht und der neue Befehl wird ausgeführt.
if (merker0 == HIGH && buttonPOS1 == HIGH);
{
merker1 = HIGH;
merker0 = LOW;
}
do {
//Von Startposition 0 auf Schwenkposition 1 - volle Geschwindigkeit
roboclaw.SpeedAccelDeccelPositionM1(address, 200, 1685, 200, 11000, 1);
break;
}
while (merker1 == HIGH && buttonPOS2 == HIGH);
{
merker2 = HIGH;
merker1 = LOW;
}
do {
//Schwenkposition 1 Display schwenken - halbe Geschwindigkeit
roboclaw.SpeedAccelDeccelPositionM1(address, 200, 842, 200, 15000, 0);
break;
}
while (merker2 == HIGH && buttonPOS3 == HIGH);
{
merker3 = HIGH;
merker2 = LOW;
}
do {
// Von Schwenkposition 2 auf Kino Position 3 - viertel Geschwindigkeit
roboclaw.SpeedAccelDeccelPositionM1(address, 200, 421, 200, 20000, 0);
break;
}
while (merker3 == HIGH && buttonPOS4 == HIGH);
{
merker4 = HIGH;
merker3 = LOW;
}
do {
// Von Kino Position 3 auf Startposition 0 - volle Geschwindigleit
roboclaw.SpeedAccelDeccelPositionM1(address, 200, 1685, 200, 0, 0);
break;
}
while (merker4 == HIGH && buttonPOS5 == HIGH);
{
merker0 = HIGH;
merker4 = LOW;
}
exit (0);
}