Trying to get a servo to move smoothly using for loop

Hi there, i am kinda new to coding with arduino and processing but i hope someone can help. Its for school. I am trying to control a servo with face recognition using the x coordinates. i am using a for loop int i = 0, i < etc... but the servo isnt doing what i want it to do. Is it even possible what i am trying to do here? below here is the processing code, the arduino code works so i wont put it in.

import processing.javafx.*; //importeer bibliotheken

import ch.bildspur.vision.*;
import ch.bildspur.vision.result.*;

import processing.core.PApplet;
import processing.core.PConstants;
import processing.core.PImage;
import processing.video.Capture;

import processing.serial.*;

PImage inputImage;  // Variabele aangemaakt
Serial arduinoPort; //poortvariabele om te verbinden met arduino

Capture cam; //camerabeelden vastleggen

DeepVision vision; //beeldverwerking deepvision
CascadeClassifierNetwork faceNetwork; //detecteren van gezichten

GenderNetwork genderNetwork; //variabele voor geslachten herkennen
DeepVision deepVision = new DeepVision(this);
YOLONetwork hallo; //Variabele hallo word aangemaakt

ResultList<ObjectDetectionResult> detections;
ResultList<ObjectDetectionResult> halloo;
ResultList<ClassificationResult> genders;

int servoHoek = 0; //variabele voor servoHoek op 0

public void setup() {
  size(640, 480, FX2D); //grootte beeld, rendermodus
  colorMode(HSB, 360, 100, 100); //kleur

  println("creating network...");
  hallo = deepVision.createCrossHandDetector(256);
  vision = new DeepVision(this); //nieuwe beeldverwerking 
  faceNetwork = vision.createCascadeFrontalFace(); //voor detecteren van gezichten
  genderNetwork = vision.createGenderClassifier(); //voor geslacht

  println("loading model...");
  faceNetwork.setup(); //haalt gegevens op
  genderNetwork.setup();

  println("setup camera...");
  cam = new Capture(this, "pipeline:autovideosrc"); //vastleggen van camerabeelden
  cam.start(); //start hier
  
  inputImage = new PImage(320, 240, RGB);  
  String portName = Serial.list()[7];   //String aanmaken voor de port waarin arduino is aangesloten in mijn geval port [7]
  arduinoPort = new Serial(this, portName, 9600);
  
}

public void draw() {
  background(55); //grijs

  if (cam.available()) { //frame camera beschikbaar?
    cam.read(); //lezen en opslaan in cam
  }

  if (cam.width == 0) { //is breedte frame camera gelijk aan 0
    return; //verlaat functie
  }
  
  inputImage.copy(cam, 0, 0, cam.width, cam.height, 0, 0, inputImage.width, inputImage.height); //kopieert het camerabeeld naar de inputImage-variabele.

  
  image(cam, 0, 0); //camerabeeld op scherm
  detections = faceNetwork.run(cam); //detecteert gezichten, slaat resultaten op in detections
  genders = genderNetwork.runByDetections(cam, detections); //'' voor geslacht

  noFill(); //
  strokeWeight(2f); //2px dikte van de lijn om het gezicht
  
  hallo.setConfidenceThreshold(0.5f);


  
  stroke(200, 80, 100); //kleur, verzadiging, helderheid
  for (int i = 0; i < detections.size(); i++) { //for loop, meerdere keren uitvoeren, voor elke detectie in detections
                                                // zet i op 0, i kleiner dan aantal detecties? i telkens verhogen met 1
    ObjectDetectionResult face = detections.get(i); //haalt variabele i op van detections en sla op in 'face'
    ClassificationResult gender = genders.get(i); // voor geslacht

    rect(face.getX(), face.getY(), face.getWidth(), face.getHeight()); //rechthoek tekenen, X en Y van positie gezicht & breedte en hoogte van gezicht
    text(gender.getClassName(), face.getX(), face.getY()); //tekst van geslacht, positie X en Y van gezicht 

    //Y-as waarde (hoogte) wordt gemapped in een waarde die bij de servo gebruikt kan worden & zal in een variabale verplaatst worden
    int positionY = (int)(map(face.getY(), 0, 1023, 0, 180));  //10 op het scherm is gelijk aan 180 graden van de servo, 200 is 100 graden
    //179 en niet 180 graden omdat ik online gelezen had dat niet elke servo tot 180 ging, ook toen ik 179 glitchte de servo minder
    arduinoPort.write(positionY); //Een opgeslagen waarde gaat naar de arduino toe, doormiddel van de eerder aangemaakte arduinoPort 

    println(positionY);  // De Y waarde word geprint (getyped)
  
    if (gender.getClassName().equals("female")){ //als geslacht female is
    arduinoPort.write('F'); //voer F (female) uit op arduino
    delay(100); //100 millisec
  } else if (gender.getClassName().equals("male")) { //als geslacht male is
    arduinoPort.write('M'); //voer M (male) uit op arduino
    delay(100);
  }
 }

}
   //Y-as waarde (hoogte) wordt gemapped in een waarde die bij de servo gebruikt kan worden & zal in een variabale verplaatst worden
    int positionY = (int)(map(face.getY(), 0, 1023, 0, 180));  //10 op het scherm is gelijk aan 180 graden van de servo, 200 is 100 graden
    //179 en niet 180 graden omdat ik online gelezen had dat niet elke servo tot 180 ging, ook toen ik 179 glitchte de servo minder
    arduinoPort.write(positionY); //Een opgeslagen waarde gaat naar de arduino toe, doormiddel van de eerder aangemaakte arduinoPort 

That jitters. You might want to do some filtering, e.g. make positionY global float (not int) and do someting like positionY = positionY*0.9+0.1*(map(face.getY(), 0, 1023, 0, 180));

1 Like

i changed the int to a float and used the code you gave me. But now i cant arduino.write a float. Any tips?

why not?

idk, this is the error message: The method write(byte[]) in the type Serial is not applicable for the arguments (float)

Don't know what your arduinoPort.write() function does, but arduinoPort.write((int)positionY) would do the same as in your initial code. If that makes sense I don't know.

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