Facharbeitprojekt: Servomotor mit Näherungssensor (HC-SR04)

Hallo Zusammen!
Ich bin Einsteiger in die Arduinowelt und habe mir für meine Facharbeit als experimentellen Teil ein Projekt mit dem HC-SR04 und Servomotor ausgesucht.
Nach einigen vielen Versuchen komme ich allerdings nicht wirklich an mein Ziel.
Meine Vorstellung war, dass sich der Servomotor um 90° dreht, wenn man ein Objekt vor den Sensor hält. Nimmt man das Objekt wieder weg, so sollte der Motor wieder zurück drehen bzw. schließen.
Könnte mir hier vielleicht jemand helfen?
Ich kann gerne meine Ansätze mal hier Anfügen...
Liebe Grüße

#include <Servo.h>
#include <stdio.h>
Servo servo1;

long zeit=0;
long entfernung1 = 0;
long entfernung2 = 0;
int zu = 5;
int auf = 90;
int anzahl = 2;

void setup() {
  // put your setup code here, to run once:
# define TRIGGER 3 
# define ECHO 2
Serial.begin(115200);
pinMode(TRIGGER,OUTPUT);
pinMode(9,OUTPUT);
servo1.attach(9);
servo1.write(zu);
}

void loop() {
  // put your main code here, to run repeatedly:
  for (int i=0; i <= anzahl-1; i++){
    zeit=0;
    noInterrupts();                    
    digitalWrite(TRIGGER, LOW);
    delayMicroseconds(13);
    digitalWrite(TRIGGER, HIGH);        
    delayMicroseconds(20);
    digitalWrite(TRIGGER, LOW);
    zeit = pulseIn(ECHO, HIGH);         
    interrupts();
  
for (int i=0; i <= anzahl -1; i++)
{
  servo1.write(zu);
  entfernung2 = entfernung1 / anzahl;
  Serial.println(entfernung2);
  if (entfernung2 > 9550){
    digitalWrite(9, HIGH);
    Serial.println("open");
    servo1.write(auf);
    delay(3000);
    digitalWrite(9, LOW);
    servo1.write(zu);
    delay(1000);
  }
}Vorformatierter Text

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.

Die 4 sek Wartezeit "delay(3000)" + 1000 machen alles zu Nichte bei delay putzt der Procesor seine Bit, Bytes = macht Garnichts. Delay raus millis () benutzen.

Warum werden die interrupts gesperrt / entsperrt?

Wozu sind die beiden for-schleifen gut?

Warum möchtest du das Servo auf "HIGH" schalten??

       digitalWrite(9, HIGH);

Vielen Dank für deine Rückmeldung!

Ich hatte mir einige YouTube Videos und Internetanleitungen angeschaut, weshalb ich dachte das wäre so richtig.
Die interrupts sind falsch, wie ich mittlerweile weiß.
Die beiden for Schleifen wollte ich dazu nutzen, um eine Aktion durchzuführen.
Den Servo schalte ich doch auf HIGH, um ihn quasi zu aktivieren, oder nicht?

Aber vielleicht weißt du ja wie es richtig ist?

https://www.google.de/search?as_q=arduino+servo+demo-code&as_epq=&as_oq=&as_eq=&as_nlo=&as_nhi=&lr=&cr=&as_qdr=all&as_sitesearch=&as_occt=any&safe=images&as_filetype=&tbs=

Ich fasse es nicht. Da wird auf den Arduino-docs das Servo über den Spannungsregler des Arduinos mit Strom versorgt. Da ist Überlastung des Spannungsreglers vorporgrammiert
grafik

Wenn dann mit extra Stromversorgung

Wo siehst Du da Arduino Servo Motor Basics Docs? Ich sehe da einen geschmeidigen Google-Kram.
Und einen Servo aus den 5V des Uno zu betreiben ist kein Unding.

Gut. Du kannst Google benutzen.
Und nu?
Ich versuche vergeblich auf das rot eingekreiste zu klicken.

@benediktloebach1210

mit dem google link den ich gepostet habe werden eine Menge links angezeigt unter denen es Democodes gibt die zeigen wie man - im Prinzip - ein Servo ansteuert.

Diese Facharbeit könntest du als Gelegenheit nutzen so zu arbeiten wie im richtigen Job.
Als ich anno 2001 bei einer Sondermaschinenbaufirma als Software-Entwickler angefangen habe sah mein zweiter Arbeitstag so aus:

Chefprogrammierer: "Für diese Maschine braucht der Kunde eine Anbindung an die Leittechnik über folgende Zusatzsoftware (Siemens Sicalis) die wir in unsere Steuerungssoftware integrieren müssen.
Hier ist die Dokumentation dazu. Programmieren Sie ein Testprogramm das die Kommunikation zwischen dem Maschinen-PC und dem Leittechnik-PC demonstriert."

Da diese Software für die ganze Firma neu war gab es niemanden den ich hätte fragen können.
Ich habe dann angefangen die Dokumentaion zu lesen und zu programmieren.
Am nächsten Tag funktionierte die Demo-Software.

Auf den Arduino-Seiten gibt es auch Dokumentation

Da gibt es dann wiederum eine Rubrik für die library servo und darin wird dann die Funktion der einzelnen Befehle beschrieben.

vgs

Einen (unvollständigen) link abschreiben ist was anderes als einen Text mit dazugehörigen LINK in den Post einzufügen.
Du bist uns noch den eingekreisten Link schuldig.

Grüße Uwe

Der Arduino kann schon einen (normalen) Servo via 5V versorgen. 2 würd ich nicht anhängen.

Es ist auch richtig daß man den Servo mittels separaten Netzteil versorgen kann. Dies ist unbedingt notwendig wenn man Starke Servos oder Servos mit Versorgungsspannung höher als 4,8-6V verwendet.
Grüße Uwe

Servo und USS mögen sich nicht gleichzeitig am UNO, gerade mal probiert. Externe 5 V sind also notwendig.

Das WWW enthält viele gute Informationen, wenn man weiß, wo man suchen sollte.

Wenn Du Dir etwa die Beispiele der MobaTools anschaust, kommst Du schnell zum Ziel:

#include <MobaTools.h>
MoToTimebase messimpuls;
MoToServo meinServo;

const byte echoPin = 2;
const byte trigPin = 4;
const byte servoPin = 8;
const uint16_t MINENTFERNUNG = 30;
const uint16_t MINWINKEL = 40;
const uint16_t MAXWINKEL = 120;

volatile uint16_t entfernung = 0;

void setup()
{
  Serial.begin (115200);
  messimpuls.setBasetime( 100 );
  meinServo.attach(servoPin, true);
  meinServo.setSpeed( 50 );
  pinMode(trigPin, OUTPUT);
  pinMode(echoPin, INPUT);
  attachInterrupt(digitalPinToInterrupt(echoPin), echo_interrupt, CHANGE);
}

void loop()
{
  messung();
  bewegung();
}

void bewegung()
{
  static uint16_t vorher = 0;

  if (vorher != entfernung)
  {
    vorher = entfernung;
    Serial.print(entfernung);
    Serial.println(" cm");
    if (entfernung < MINENTFERNUNG)
    {
      meinServo.write(MINWINKEL);
    } else {
      meinServo.write(MAXWINKEL);
    }
  }
}

void messung()
{
  static byte state = 0;

  switch (state)
  {
    case 0:
      if ( messimpuls.tick() ) state = 1;
      break;

    case 1:
      digitalWrite(trigPin, HIGH);
      state = 2;
      break;

    case 2:
    default:
      digitalWrite(trigPin, LOW);
      state = 0;
      break;
  }
}

void echo_interrupt()
{
  static volatile uint32_t echo_start = 0;

  switch (digitalRead(echoPin))
  {
    case HIGH:
      echo_start = micros();
      break;

    case LOW:
      entfernung = (micros() - echo_start) / 58;  // in cm
      break;
  }
}

Jetzt mußt Du das auf Deine Arbeit anpassen :slightly_smiling_face:

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