Ein Slider steuert einen Servo



Ziel:    Den Winkel eines Servomotors steuern.

Ein Java-Programm sendet Informationen zu Arduino.
Das Java Programm (es ist ein sog. "Frontend") enthält einen Slider (Schieberegler), der die Werte 0 bis 180 liefert.
Diese Werte werden über USB an den Arduino gesendet.
Arduino benutzt diese Werte zum Steuern des Winkels (0 ... 180 Grad) eines Servomotors, der an Pin 9 angeschlossen ist.

Du solltest vorher unbedingt die Experimente Servo und Datenübertragung mit Java erfolgreich durchgeführt haben.



  



Java-Programm:

Du legst eine neue Klasse namens "EinServoMotor" an.

Ist die geforderte Klasse bei Dir angelegt, steht schon einwenig Code darin. Diesen vorhandenen Code kannst Du komplett löschen und statt dessen dort den folgenden Programmcode hineinkopieren:


import javax.swing.BorderFactory;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JSlider;
import javax.swing.event.ChangeEvent;
import javax.swing.event.ChangeListener;

import jssc.SerialPort;
import jssc.SerialPortException;

@SuppressWarnings("serial")
public class EinServoMotor extends JFrame implements ChangeListener {

    JPanel panelEinServo;
    JSlider sli;
    JLabel lbl;
    int gradZahl;
    SerialPort sp;
   
    public static void main(String[] args) {
        new EinServoMotor();
    }
   
    public EinServoMotor() {
        this.setDefaultCloseOperation(EXIT_ON_CLOSE);
        this.setTitle("Servo");
        this.setBounds(400, 120, 160, 600);
        this.setResizable(false);
        this.setLayout(null);
        this.createPanels();
        this.setVisible(true);

        // Hier DEINEN Port eintragen!
        this.sp = new SerialPort("COM3");
       
        try {
            sp.openPort();
            sp.setParams(9600, 8, 1, 0);
        } catch (SerialPortException e) {
            e.printStackTrace();
        }
    }

    private void createPanels() {
        panelEinServo = new JPanel();
        panelEinServo.setBounds(30, 10, 100, 550);
        panelEinServo.setLayout(null);
        panelEinServo.setBorder(BorderFactory.createTitledBorder("Gradzahl"));
        this.add(panelEinServo);
       
        sli = new JSlider(JSlider.VERTICAL, 0, 180, 0);
        sli.setBounds(25, 60, 50, 445);
        sli.setMajorTickSpacing(20); // grosse Striche
        sli.setPaintTicks(true); // Striche sichtbar
        sli.setPaintLabels(true); // Zahlen sichtbar

        panelEinServo.add(sli);
        sli.addChangeListener(this);
        sli.addChangeListener(this);

        lbl = new JLabel("90 Grad");
        lbl.setBounds(20, 510, 60, 25);
        lbl.setHorizontalAlignment(JLabel.CENTER);
        panelEinServo.add(lbl);

    }

    @Override
    public void stateChanged(ChangeEvent e) {
        gradZahl = sli.getValue();
        lbl.setText(String.valueOf(gradZahl) + " Grad");
       
        try {   
            sp.writeInt(gradZahl);
        } catch (SerialPortException spe) {
            spe.printStackTrace();
        }
    }   
}





Arduino-Programm:

#include <Servo.h>
Servo meinServomotor; 

int gradZahl;

void setup() {
  Serial.begin(9600);
  meinServomotor.attach(9); //Servo an Pin 9
}


void loop() {

  if (Serial.available() > 0) {
    gradZahl=Serial.read();
  }

  meinServomotor.write(gradZahl);

  delay(10);
}





Eine Erweiterung dieses Programmes mit 6 Sliders findest Du hier.