Startwert 32767 Potentiometer - HILFE!

Moin,
ich erarbeite mir gerade eine 4-achsige Controllereinheit für einen Simulator. Die Potis sind mechanisch im Weg begrenzt, den Code habe ich mir mehr oder weniger "zusammengesammelt" und angepasst. Grundlegend funktionieren alle 4 Achsen und werden ausgelesen, auch der Bereich von 0-100% in der Achsenkalibrierung werden erreicht. Allerding ist der Startwert in der Windows-Achskalibrierung immer auf 32767 bzw. 49%. Erst nach dem ersten bewegen springt der Wert auf 0. Dies führt zu Komplikationen in Programmen, für die ich den Controller verwenden will. Ich habe bisher viel versucht, aber nichts scheint zu funktionieren. Kann mir bitte jemand helfen?

#include <Encoder.h>
#include <Joystick.h>


Joystick_ Joystick;

Encoder acel(0,4);
Encoder freno(1,5);
Encoder inver(2,6);
Encoder zwei(3,7);

long acelnew;
long frenonew;
long invernew;
long zweinew;

long posiacel=-999;
long posifreno=-999;
long posiinver=-999;
long posizwei=-999;

char data[3][80];
byte cnt = 0;
byte pos = 0;
boolean started = false;
boolean finished = false;
char ButtonMap[80];
char LocoName[80];

void setup() {
  Joystick.begin();
  Joystick.setRzAxisRange(0,24);
  Joystick.setRyAxisRange(0,24);
  Joystick.setZAxisRange(0,24);
  Joystick.setRxAxisRange(0,24);
  
  Serial.begin(9600);  
}


void loop() {
  acelnew = acel.read();
  frenonew = freno.read();
  invernew = inver.read();
  zweinew = zwei.read();
  UpdatePosition();
  ReadSerial();
  }

  
void ReadSerial(){  
  while(Serial.available() > 0) {
    char nextChar = Serial.read();
    if(nextChar == '<') { 
      started = true;
      finished = false;
      pos = 0;
      cnt = 0;
      data[0][0] = '\0';
      data[1][0] = '\0';
      data[2][0] = '\0';
    }
    else if(nextChar == '>') { 
      finished = true;
      break; 
    }
    else if(nextChar == ':') { 
      pos++;
      cnt = 0;
    }
    else {
      data[pos][cnt] = nextChar; 
      cnt++;
      data[pos][cnt] = '\0';
    }
  } 
  if(started && finished) { 
    UpdateHardware();
  }
}


void UpdatePosition(){
  if (acelnew !=posiacel) {
    Joystick.setRzAxis(acelnew);
    posiacel = acelnew; 
  }
  else if (frenonew !=posifreno) {
    Joystick.setRyAxis(frenonew);
     posifreno = frenonew;
  }
  else if (invernew !=posiinver) {
    Joystick.setZAxis(invernew);
     posiinver = invernew;  
  }    
  else if (zweinew !=posizwei) {
    Joystick.setRxAxis(zweinew);
     posizwei = zweinew;
  }
}

void UpdateHardware() {
  if(!strcmp(data[0],"locochanged")){
    strcpy(ButtonMap, data[1]);
    strcpy(LocoName, data[2]);
    return;
  }
  }

Im englischen Teil des Forum müssen die Beiträge und Diskussionen in englischer Sprache verfasst werden.
Deswegen wurde diese Diskussion in den deutschen Teil des Forums verschoben.

mfg ein Moderator.

Hallo,

welche Werte bzw. welche Variablen sind auf 32767 ?
Was ist deine "Windows-Achskalibrierung" ?
Pauschal gesagt, spätestes im setup() muss dafür gesorgt werden, dass alle entscheidenden Variablen ihren passenden Ausgangswert bekommen, wenn in loop() mit sauberen Ausgangswerten von Anfang an gearbeitet werden muss.

Thanks for so many movings! Best wishes for next year!


In den Beispielen steht das hinter Joystick.setnnAxisRange(0,24);. Schon mal probiert?

Auf welcher Hardware soll das laufen? Beim UNO sind die Pins 0 und 1 nicht frei verfügbar.

1 Like

Leonardo und so weiter, was eine USB-Host-Schnittstelle hat. - wegen Joystick.

Der kompiliert auch fehler- und warnungsfrei.
Dem fehlt vermutlich ein Initialer Funktionsaufruf bei dem die Werte erst gesetzt und dann ausgegeben werden.
32767 ist der oberste Wert für int16_t.

Ich habe mir zwar ein paar Sachen angeeignet, bin aber Laie. Entschuldigt, falls ich etwas stümperhaft bin.

Wie kann ich den initialen Funktionsaufruf umsetzen?

Ich benutze die aktuelle Version der JoystickLibrary 2.1.1., wie beschrieben liegt der Startwert bei 32767, nach dem ersten Tastendruck oder bewegen der Potentimeter springt er auf 0 und fährt dann bis 65535 (100%).
Ich habe festgestellt, dass wenn ich die JoystickLibrary Auf 2.0.8. downgrade, ich das Problem in die andere Richtung habe. Startwert ist 0, aber dafür ist maximal ein Wert von 32767 (49%) zu erreichen statt 65535.

Das liegt an der Definition der Variablen.
Der Typ int (int16_t) hat einen Werteumfang von 65535, aber im Bereich von -32768 bis 32767.
Wenn Du aus diesem Datentyp einen unsigned int (uint16_t) machst, erfolgt die von Dir gewünschte Darstellung.

Ich auch.
Einstiegslektüre bis ca. Seite 95 sind Grundlagen, die Du immer brauchst.
https://www.arduinoforum.de/code-referenz

Kann ich das in meinem Code einbetten oder muss ich dafür die JoystickLibrary ändern?

Mach mal aus Deinen long Variablen unsigned int
Mal sehen, was draus wird.

Die -999 wird Dir dann angemeckert. Las die einfach weg, dann wird mit 0 initialisiert.

Joystick, Maus und Tastatur sind alles HID.
Gehen damit auch über V-USB und so mit fast allen AVR.
Ein nativer USB Port ist somit nicht nötig.
Schöner, ja, aber nicht nötig.

Hallo,

@ TO:
Link zu deiner Library?

Nötig nicht, aber viel einfacher. Wenn man den ATmega16U2 des Arduino UNO R3 als HDI umprogrammiert, kann mn den UNO nicht mehr über USB programmieren, sondern nur mehr mit einem ISP Programmierer, den man schon zum umprogrammieren des ATmega16U2 braucht.
Ja, man kann einen anderen Arduino UNO R3 als ISP Programmierer programmieren / verwenden.
[IRONIE-MODUS] Man kann einen Arduino UNO R3 auch für eine HV Programmierung* verwenden, das tut dann aber niemend. [/IRONIE-MODUS]

Die ISP Programmierung ist zwar kein Hexenwerk aber wieso komplizierter wenn man fürs gleiche Geld wie einen orginalen UNO R3 einen orginalen Leonardo bekommt wo man keine ISP Programmierung braucht.

Grüße Uwe

*HV Programmierung:
Wenn man durch sehr unbedachtes Fuse Setting den ATmega so blockiert hat, daß man mittels ISP Programmierung nicht mehr zu ihm vordringt, gibt es eine HV Programmierung bei den man durch 12V Impulse am Resetpin den internen Speicher (Fuse) zurücksetzen kann und somit ihn in einen programmierfähigen Zustand bringt.
Wen's interessiert:

Atmel Flip ist durchaus in der Lage den 16U2 zu beschreiben.
So ist es problemlos möglich den 16U2 zum ISP Programmer, Serial-USB Konverter oder HID zu machen, ohne einen ISP Programmer zu haben.

Immerhin kann man V-USB im/am m328p betreiben und gleichzeitig den bisherigen Upload Weg beibehalten. Ohne am 16U2, Fuses oder Bootloader rum zu fummeln.

V-USB ist sogar der einfachste und billigste Weg, wenn man ein Board mit CH340 oder einen Nano/Mini verwenden möchte.

Kein HVPP Programmer erforderlich.

Habe ich gemacht, Problemstellung unverändert, auch wenn mit 0 initialisiert.

Bei Version 2.1.0. nimmt er Startwert 32767 und fährt nach erstem Ändern von 0 bis 65535
Bei Version 2.0.8. Startwert 0 und fährt nach Ändern von -32767 bis +32767

Hallo,

ich weiß nicht so richtig wie ich dir helfen kann. Aber du musst Debugausgaben einbauen und erstmal ohne Windows PC Software testen. Rein mit Arduino IDE und dem seriellen Monitor. Du gibts einen Range von 0 ... 24 vor und erhälst im Kalibrierfenster 32767 o.ä.? Erstmal muss reproduzierbar sein was der µC an Rohwerten ausgibt, auch nach Reset, also das was ab setup() passiert. Dazu Sketch auf das Notwendigste abspecken.
Was nicht hilft ist zwischen den Lib Versionen hin- und herspringen.

Edit:
Wenn das alles sauber sein sollte, kann es noch sein das der Effekt nur im Kalibrierfenster auftritt und sonst gar keine negative Wirkung zeigt. Sieht aus als wenn nur eine erste Abfrage nach Änderung fehlt auf dem Windows-PC. Um das zu widerlegen oder zu bestätigen musst du auf µC Ebene debuggen.

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.