Progetto nuovo Bobcat pala compatta.

Buon giorno. Sono uno studente dell'universita' di padova iscritto a Psicologia. Sto realizzando un progetto utilizzando un make makey per progettare un nuovo tipo di cloche per una pala compatta Bobcat.
Sto passando ad arduino perche' i code di cui necessito non possono essere scritti nel terminale di makey makey.
Dovrei avere dei code per permettere alle mie due cloche di trasdurre il segnale input meccanico in elettrico output rilevabile da un computer che utilizza un software simulatore di tale bobcat.
Nello specifico i code dovrebbero riguardare l'utilizzo di due joysticks sotitutivi le cloche:
comando avanti (tutte due le cloche avanti contemporaneamente)
comando indietro (tutte due le cloche indietro contemporaneamente)
comando svolta destra (cloche sinistra avanti + cloche destra indietro)
comando svolta sinistra (cloche sinistra indietro + cloche destra avanti)

superiormente ad ogni yoystick e' montato uno stick playstation per controllare
il carrello e la pala.

Nello specifico:
stick sinistro avanti (carrello su)
stick sinistro indietro (carrello giu')
stick destro avanti (apertura pala)
stick destro indietro (chiusura pala)

i comandi dovrebbero essere essere progressivi.

Qualcuno potrebbe aiutarmi?

Grazie anticipatamente.
Buona giornata.
Nicolo'

Avevo già fatto stessa domanda nel forum inglese nel quale ho ricevuto alcune utili risposte.
Ho provato ad usare i code postati nel forum passandoli ad un professionista ma per questioni tempistiche mi ha chiesto se possibile di arrangiarmi perché è un periodo molto “busy” per lui.

Vi passo quindi i code ricevuti con le risposte.

Vi ringrazio ancora per la cortese attenzione.

Buona Giornata.

Nicolò

Prima risposta

Really - the code to do this is dead simple; if you can get one joystick to control a single motor, you just duplicate that and off you go:

  1. Read joystick input (analogRead() - value 0 - 1023)

  2. Map that value to positive/neg values (most likely) - so map() to -512 to +511, for instance.

  3. Send those values out the serial port, and the code on the other end (VR API interface or whatnot) will need to interpret them and apply them to the transformation matrix of the excavator object and/or camera (all will depend on how the software works, scene graph, etc - but that goes beyond this discussion)

  4. Do that for each joystick - then send a serial stream data packet indicating the values

Actually - you could eliminate step 2 - just send the values of the joysticks directly to the API, and do the mapping of values on the PC end.

Seconda risposta:

/ Simple demonstration to show how to move a servo with a joystick
//   or potentiometer so that the servo does not lose its position
//   when the joystick centres itself

#include <Servo.h>

byte servoPin = 7;  // servo signal connection
Servo myServo;
int servoPos = 90;
int servoMax = 130;
int servoMin = 45;
int servoMove = 3;  // number of degrees per movement

byte potPin = A0;   // center pin of joystick or potentiometer connected here
int potValue = 0;
int potCentre = 512; // adjust to suit your joystick
int potDeadRange = 50; // movements by this much either side of centre are ignored

unsigned long curMillis;
unsigned long readIntervalMillis = 100;
unsigned long lastReadMillis;

void setup() {
  Serial.begin(9600);
  Serial.println("Starting JoystickServo.ino");
  
  myServo.attach(servoPin);
  myServo.write(servoPos);
}

void loop() {
  curMillis = millis();
  readJoystick();
  moveServo();
  showPosition();
}

void readJoystick() {
        // check the time
  if (curMillis - lastReadMillis >= readIntervalMillis) {
     lastReadMillis += readIntervalMillis;
        // read the joystick
     potValue = analogRead(potPin);
        // figure if a move is required
     if (potValue > potCentre + potDeadRange) {
        servoPos += servoMove;
     }
     if (potValue < potCentre - potDeadRange) {
        servoPos -= servoMove;
     }
        // check that the values are within limits
     if (servoPos > servoMax) {
        servoPos = servoMax;
     }
     if (servoPos < servoMin) {
        servoPos = servoMin;
     }
  }
}

void moveServo() {
  myServo.write(servoPos);
}

void showPosition() {
  Serial.print("PotValue ");
  Serial.print(potValue);
  Serial.print("   ServoPos ");
  Serial.println(servoPos);
}