1

プロセッシングでサーボを制御しようとしています。

基本的に、私が望むのは、処理中にボタンを押して、サーボを 0 から 180 度に戻し、2 秒ごとに戻すことです。処理中に別のボタンを押すと、ポテンショメータを使用してサーボを動かすことができるはずですが、正常に動作させることができません。

たとえば、POT ボタンを押すとサーボが目的の位置に移動しますが、ポテンショメータを動かしても、もう一度ポット ボタンをクリックしない限りサーボは動きません。

これは Arduino に関連するコードです。

   
    void loop ()
    {
      if(Serial.available()){
         val= Serial.read();
            while(val == 1){
              digitalWrite(ledCPM, HIGH);
              digitalWrite(ledPot, LOW);
              digitalWrite(ledFSR,LOW);
              cpmMovement();
              val = Serial.read();
              } 
     
            while(val == 2){
              digitalWrite(ledPot, HIGH);
              digitalWrite(ledCPM, LOW);
              digitalWrite(ledFSR,LOW);
              potMovement();
              val = Serial.read();
            }
            while(val == 3){
            digitalWrite(ledPot, LOW);
            digitalWrite(ledCPM, LOW);
            digitalWrite(ledFSR,HIGH);
            fsrMovement();
            val = Serial.read();
          }
      }
    }
      

      
    void cpmMovement(){unsigned long currentMillis = millis();

            if(currentMillis - previousMillis > interval){
              previousMillis = currentMillis;

              if(positionservo == 0){
                positionservo = 179;
                myservo1.write(positionservo);
              }
              else{
                positionservo = 0;
                myservo1.write(positionservo);
              }
            }
    }

void potMovement(){
  int analogValuePot = analogRead(Pot)/4;
        Serial.print("Potentiometer reading= ");
        Serial.println(analogValuePot); // This will print the raw force value
        int valuePot = map(analogValuePot, 0, 255, 0, 179);     // scale it to use it with the servo (value between 0 and 180)
        myservo1.write(valuePot);  // sets the servo position according to the scaled value
        delay(10);                           // waits for the servo to get there
}
    void fsrMovement(){
            
            force = analogRead(FSR);  // Reads the FSR
          
            Serial.print("Force sensor reading = ");
            Serial.println(force); // This will print the raw force value
            int pos = map(force, 0, 1023, 0, 175); // Scales the force reading to degrees for servo control
            Serial.print("servomotor degrees = ");
            Serial.println(pos); // This will print the adjusted servo reading (an angle)
            myservo1.write(pos); // Write the new angle to the servo
            delay(150); // Delay 150 milliseconds before taking another reading
            
    }

そして、ここでは、他のすべてが正常に機能するため、関連する処理コードを確認できます

import processing.serial.*;


void mousePressed(){
  println("Coordinates: "  + mouseX + "," + mouseY);
  if(pressedCPMButton && currentColorCPM==butColorCPM){ //Changing color CPM to pressed button color
    currentColorCPM = butpreColorCPM;
    currentColorPOT = butColorPOT;
    currentColorFSR = butColorFSR;
    myPort.write(1);   //Send 1 to port
    
    }else if(pressedCPMButton && currentColorCPM==butpreColorCPM){
    currentColorCPM = butColorCPM;
    currentColorPOT = butColorPOT;
    currentColorFSR = butColorFSR;
  }
  if(pressedPOTButton && currentColorPOT==butColorPOT){
    currentColorCPM = butColorCPM;
    currentColorPOT = butpreColorPOT;
    currentColorFSR = butColorFSR;
    myPort.write(2);                                    //Send 2 to port
  }else if(pressedPOTButton && currentColorPOT==butpreColorPOT){
    currentColorCPM = butColorCPM;
    currentColorPOT = butColorPOT;
    currentColorFSR = butColorFSR;
  }
  if(pressedFSRButton && currentColorFSR==butColorFSR){
    currentColorCPM = butColorCPM;
    currentColorPOT = butColorPOT;
    currentColorFSR = butpreColorFSR;
    myPort.write(3);                                   //Send 3 to port
  }else if(pressedFSRButton && currentColorFSR==butpreColorFSR){
    currentColorCPM = butColorCPM;
    currentColorPOT = butColorPOT;
    currentColorFSR = butColorFSR;
  }
}

boolean pressedButtonCPM(int x, int y, int width, int height)  {
  if (mouseX >= x && mouseX <= x+width && 
      mouseY >= y && mouseY <= y+height) {
    return true;
  } else {
    return false;
  }
}

boolean pressedButtonPOT(int x, int y, int width, int height)  {
  if (mouseX >= x && mouseX <= x+width && 
      mouseY >= y && mouseY <= y+height) {
      return true;
  } else {
    return false;
  }
}

boolean pressedButtonFSR(int x, int y, int width, int height)  {
  if (mouseX >= x && mouseX <= x+width && 
      mouseY >= y && mouseY <= y+height) {
    return true;
  } else {
    return false;
  }
}

4

0 に答える 0