- Akku Tests und Balkonkraftwerk Speicher         
Ergebnis 1 bis 10 von 23

Thema: Motorsteuerung über Sensorik

Hybrid-Darstellung

Vorheriger Beitrag Vorheriger Beitrag   Nächster Beitrag Nächster Beitrag
  1. #1
    Benutzer Stammmitglied
    Registriert seit
    28.10.2013
    Beiträge
    34
    Hmm schau mal das funktioniert bereits.
    Ich habe die Sensoren auf meinem Robi drauf und drehe immer ca 500 ms nach links vom Hindernis. Das Programm hierzu ist a bissl komplizierter.
    Was ich mit der Frage erreichen will ( scheint schwierig zu erklären ), ist nur der Zustand, dass ich den Sensor währen der Roboter sich von Hindernis wegbewegt kontrolliert wird.
    Egal ob das durch drehen oder rückwärtsfahren erreicht wird.

    Der Zustand des Sensors soll überwacht werden und (nur als bsp) bei 30 cm wieder die else Bedingung erfüllt sein also weiter gerade aus Fahren.

    Im Prinzip geht es mir darum mit meinem vorh. Kompass dem Robi zu steuern und zwar immer um ca. 90° ++ oder, je nach zustand um 90° -- vom Hindernis wegbewegen.

    Doch wenn ich schon mit dem Sonar solche "Probleme " habe ...

    Ich hoffe ich konnte dir ansatzweise vermitteln was ich damit bewerkstelligen will.
    Mein Problem ist wirklich dass ich kein Programmierer bin Mechanik und Elektrik kein Problem ich tue mir schwer mit C++

    Darum wirklich nur die Frage wie kann ich in der if Anweisung die unter 16 cm mit der "sich vom Hindernis weg Bewegung erledigen damit ich die 20-30 cm erreiche und weiter vorwärts fahren kann.

    Beste Grüße
    Chr.

  2. #2
    Benutzer Stammmitglied
    Registriert seit
    28.10.2013
    Beiträge
    34
    Hat niemand eine Idee.
    Sollte die Erklärung nicht ganz verständlich sein kann ich gerne nochmal versuchen das ganze genauer zu beschreiben.

    VG
    Chr.

  3. #3
    Erfahrener Benutzer Robotik Einstein Avatar von i_make_it
    Registriert seit
    29.07.2008
    Ort
    Raum DA
    Alter
    56
    Beiträge
    2.814
    Welche US-Sensoren hast du denn?
    Bei den hc-sr04 zum Beispiel muß man das Aussenden eines Bursts auslösen und dabei eine Starzeit festhalten dann wartet man bis ein Echo kommt oder die maximale Zeit abgelaufen ist (Was dann heist, das in der Reichweite kein Hinderniss ist oder es nicht detektiert werden kann.)
    Einen einfachen Code (ohne Fehlerauswertung) habe ich hier im dritten Listing:
    https://www.roboternetz.de/community...l=1#post622061
    Das ist für einen Arduino Nano, mit zwei hc-sr04 und einem TCRT5000 fürs Linienfolgen.
    Als Echoeingänge habe ich die Interrupteingänge genutzt, Zusammen mit dem trei laufenden Timer muß ich mich da um nichts weiter kümmern.
    in der normalen Programschleife wird nur der zweite Timerwert vom ersten abgezogen und dann die Umrechnung von Zeit auf Entferung anhand der Werte für die Schallgeschwindigkeit vorgenommen (ohne Temperatur- und Luftfeuchtekompensation, einfach auf 20°C und trockne Luft bezogen).

    Zitat Zitat von zerebrator Beitrag anzeigen
    Würde mich über jegliche Code Vorschläge freuen
    Konkrete Codevorschläde beiziehen sich üblicherweise auch auf eine konkrete Zielplattform.
    C++ kann je nach Zielsystem auch unterschiedlich (vom Umfang und von der Funktion) implementiert sein.
    Grade was die Hardwarespezifischen Funktionen angeht (Was ja bei µC's und Robotenr der wichtige Teil ist).

    Also wäre noch interessant welche Zielplatform, welche IDE und welchen Dialekt (Sprachvariante) Du nutzt.
    Geändert von i_make_it (11.06.2017 um 14:25 Uhr)

  4. #4
    Benutzer Stammmitglied
    Registriert seit
    28.10.2013
    Beiträge
    34
    Hallo i-make_it

    Also mein Mover hat 3 Sensoren er läuft absolut autonom und Problemlos.
    Es geht nicht darum die Sensorik zum laufen zu bringen sondern wirklich um die Tatsache dass ich eine definierte ( hier nur als Beispiel die 30 cm) Entfernung zum Objekt einhalten will.
    Es ist quasi ein Puzzle der später im Gesamtprogramm verwendet wird.

    Mir geht es nur um die Formulierung der Anweisung
    Eigentlich frage ich mich warum die Anweisung mit der schleife nicht das tut was ich eigentlich will.
    Hier liegt mein Problem ich stehe auf dem Schlauch ....

    Ich benutze Arduino IDE 1.06 und 1.69
    Zum ansteuern der Sonar Sensoren eine Library NewPing.h
    Beim Arduino sehr verbreitet.
    Der echte Code würde hier den Rahmen sprengen deshalb habe ich es sehr vereinfacht und wirklich nur auf das wesentliche ( genau darauf wo meine Aufgabe steht) reduziert.

    Arduino hat nur eine Spezifische Programmierumgebung.

    Ich hoffe damit konnte ich die Programmier experten unter Euch ansprechen.

    SG
    Chr.

  5. #5
    Erfahrener Benutzer Robotik Einstein Avatar von i_make_it
    Registriert seit
    29.07.2008
    Ort
    Raum DA
    Alter
    56
    Beiträge
    2.814
    Den Code den Du angegeben hast, kann ich so nicht prüfen,
    Bei Verwendung von newping.h gehört der Aufruf von sonar.ping(); innerhalb der void loop(); und es muß zwichen zwei Aufrufen mindesten 29ms vergehen, was in den Beispielcodes per Delay gelöst wird.
    Ob Du die Randbedingungen einhält oder nicht ist aus Deinem Code nicht erkennbar.

    Bei dem IF Konstrukt wird geprüft ob us1 kleiner 16 ist. Die Zählschleife, erhöht bei jedem Durchlauf us1 um 1, bis us1 > 30 ist. Ein vergleich des tatsächlichen Messwerts mit einem Sollwert findet nicht statt.
    Also: Messe us1, setze us1 gleich us1 geteilt durch roundtrip, wenn us1 kleiner 16 ist zähle us1 hoch bis us größer 30 ist.

    Was Du für Ausgänge setzt, beachte ich absichtlich nicht, denn die Motoren sind physikaliach vorhanden, haben also Masse und Trägheit.
    Du kannst ja mal eine For Schleife nehmen und bei jedem Durchlauf den Wert der Zählervariable mit serial.print ausgeben.
    Von 16 bis 30 zu zählen dauert nur ein paar Nanosekunden da hat sich kein Motor auch überhaupt nur angefangen zu drehen bis die Abbruchbedingung erfüllt ist.

    Für einen Soll-Ist Vergleich ist ein Zählschleife so nicht zu gebrauchen.

    Also ergeben sich folgende Fragen:
    - Wie implementierst Du die minimale Wartezeit von 29ms die sonar.ping(); benötigt?
    - Was hattest du vor mit der Zählschleife an dieser Stelle zu erreichen?
    - Warum enthällt der Else Zweig eine entgegengesetzte Drehung wie die Zählschleife die im IF Zweig steckt? (Das würde den Roboter doch grade wieder in das Hinderniss hineindrehen.)

    Eine gleichzeitige Überprüfung (z.B. mit switch case) wäre sinnvoller, um ein Festfahren in einer engen Bucht zu verhindern, da kann in einem Entscheidungskonstrukt auf alle Sensoren Rücksicht genommen werden, und je nach Fall entschieden werden, ob Linksdrehen, Rechtsdrehen oder Rückwärtsfahren sinnvoller ist.
    Bei sequentieller Auswertung und Reaktion, sind diese Teile unabhängig voneinander.
    Wird also erst links ein Hinderniss erkannt und nach rechts gedreht und dann rechts ein Hinderniss erkannt und nach links gedreht, hängt der Roboter in einer Loop aus der er selbst nicht mehr rauskommt.
    Ein Gedächtniss (Merker) die es ihm erlauben zu erkennen, das er die selbe Handlung grade schon mal durchgeführt hat ohne das es Erfolg brachte ist also sinnvoll um ein Verzweigen in andere Verhaltensmuster zu ermöglichen.

  6. #6
    Benutzer Stammmitglied
    Registriert seit
    28.10.2013
    Beiträge
    34
    Ja endlich jetzt kommen wir der Sache näher.
    Die schleife ... ist ein plumper verusch meinerseits die Aufagbe zu Lösen das es nicht funktioniert ist mir leider auch schon aufgefallen
    Wie gesagt mein Problem ist das ich mich mit Programmieren rel. schlecht auskenne.

    Nehmen wir mal an der Code ( der eigentliche ) Code Passt wir brauchen uns also keine Gedanken machen wieso der Mover nach der else Anweisung wieder auf das Hindernis zusteuert. Die Sensoren werden mit einer Verzögerung abgefragt und verreichten Ihren dienst perfekt. Alles läuft prima.... So jetzt aber benötige ich nur die Routine um meinen Mover rel. exakt 20- 30 oder 40 cm von einem Hindernis ( Wand , Eimer , Bein ..... usw. ) wegzubewegen. Wie Löse ich das softwaretechnisch.
    Dein Ansatz mit Switch Case hört sich gut an doch.
    Ist die Switch Case Anweisung nicht für beispielweise Tastatur eingaben ?
    char choice = Serial1.read();
    Serial.print("Val=");
    Serial.println(choice);

    switch(choice){
    case 'U':
    driveMotors(0, 100); //forward
    break;
    case 'D':
    driveMotors(0, -100); //backward
    break;

    ???

    Wie bewerkstellige ich hier dass er die Prüfung durchführt. ??

Ähnliche Themen

  1. Motorsteuerung über Joystick
    Von konstii im Forum Bauanleitungen, Schaltungen & Software nach RoboterNetz-Standard
    Antworten: 3
    Letzter Beitrag: 18.06.2009, 10:38
  2. LPT motorsteuerung über den drucker
    Von st0rm im Forum Motoren
    Antworten: 1
    Letzter Beitrag: 10.12.2007, 15:45
  3. Motorsteuerung über Fahrtenregler
    Von glory im Forum Motoren
    Antworten: 2
    Letzter Beitrag: 01.06.2007, 20:34
  4. Motorsteuerung über RS232/USB
    Von ama7224290 im Forum Motoren
    Antworten: 0
    Letzter Beitrag: 07.02.2007, 17:24
  5. Motorsteuerung über PI-Regler
    Von Gromit im Forum Allgemeines zum Thema Roboter / Modellbau
    Antworten: 0
    Letzter Beitrag: 19.11.2004, 22:44

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •  

Solar Speicher und Akkus Tests