arrexx roboter fahrgestell soll auf geräusch losfahren

Hallo,
wir müssen im NWT Unterricht ein Projekt mit einem Arduino Uno machen.
Einige Grundkenntnisse haben wir schon.
Wir haben einen Arduino Uno und ein ARX-CH09 Chassis Fahrgestell --> http://www.reichelt.de/Robotik/ARX-CH09/3/index.html?;ACTION=3;LA=2;ARTICLE=102236;GROUPID=5728;artnr=ARX-CH09;SID=11UMDEMX8AAAIAAFLHfc0bb8301f20e9257dba51131d26b40ceb6

Wir möchten, dass der Arexx auf Geräusch fährt z.B. auf Klatschen
Wir haben den Arduino schon mit den Motoren verbunden..jedoch haben wir noch Probleme bei einem Programm, da wir nur die Grundkentnisse besitzen.
Wir brauchen dringend Hilfe, da wir nur wenig Zeit haben. ( in 2 Wochen sollte es fertig sein )

Wir wären euch sehr dankbar für euere Hilfe (:
Danke schon mal!

Habt Ihr Euch das Projekt selbst ausgedacht, oder was das eine Vorgabe?
Ihr schreibt, das Ihr schon wißt, wie Ihr alles verkablen müßt.
Das bedeutet also Ihr habt schon eine Schaltung um die Motoren zu steuern und eine Hardware die auf das Klatschen reagiert?

Wie habt Ihr getestet, ob Eure Verkabelung funktioniert? Dazu muss es ja schon ein Programm geben.

Was habt Ihr denn bereits an Programm fertig?

Hier wird Euch sicher keiner Euer Projekt fertig programmieren, aber helfen wenn es klemmt, können wir schon.

Postet doch mal den Code den Ihr schon habt und wie Eure Schaltung für die Motoren und die "Geräuscherkennung" am Arduino aussieht.

Mario.

Wenn die Motoren schon auf einem Steckbrett verkabelt sind, könnt Ihr doch damit anfangen die beiden Motoren zu steuern. Wie sind denn die Motoren an den Arduino angeschlossen? Also welche Pins, wie sieht die Spannungsversorgung aus etc.

Habt Ihr denn schon irgendwas mal auf den Arduino geladen? Z.B. den Blink-Sketch der die LED des Arduino blinken läßt?

Ohne Details kann Euch hier keiner helfen.

Habt Ihr Euch denn schon mal Gedanken über die Struktur des Programms gemacht. Dabei geht es nicht um die Details, sondern eine ungefähre Vorstellung was wann wie passieren soll. Sowas nennt man Programmablaufplan: http://de.wikipedia.org/wiki/Programmablaufplan
Damit kann man sich erstmal in Ruhe mit der Lösung eines Problems beschäftigen, ohne sich mit den Details der Programmiersprache herum zu ärgern.

Du solltest die Informationen liefern, die auch gefordert wurden:

mkl0815:
Postet doch mal den Code den Ihr schon habt und wie Eure Schaltung für die Motoren und die "Geräuscherkennung" am Arduino aussieht.

Immerhin gibt es schon die Angabe, dass ihr einen L293D verwendet.

mkl0815:
Habt Ihr Euch denn schon mal Gedanken über die Struktur des Programms gemacht. Dabei geht es nicht um die Details, sondern eine ungefähre Vorstellung was wann wie passieren soll.

Wie soll der Roboter reagieren. Bei Geräuschen einfach geradeaus fahren? Im Bogen? Vorwärts? Rückwärts? Wenn ja, wie lange? Eine bestimmte Zeit? Solange das Geräusch anhält? Ich hoffe, ihr versucht keine Sprachsteuerung zu integrieren... :wink:

Bevor jetzt immer neue Ideen kommen, was der Roboter alles machen soll, wäre es gut, erstmal überhaupt was zu haben. Also, her mit dem Code den es schon gibt und überlegt euch ein Konzept und einen Ablauf Eures Programms.
Am Anfang in "Funktionsblöcken". Orientiert Euch dabei schon daran, das es beim Arduino ein setup() gibt, das einmal an Anfang aufgerufen wird und ein loop(), das endlos immer wieder aufgerufen wird. Dort packt Ihr Eure Funktionsblöcke rein (sowas wie "Klatschen erkannt", "stop", "geradeaus fahren", "linkskurve", "rechtskurve" etc.). Ihr könnt am Ende nicht einfach drauflos programmieren, mit etwas Planung wird es einfacher und übersichtlicher.
ABER WIR BRAUCHEN DEN CODE DEN IHR SCHON HABT.

Also fehlt euch nach wie vor die Hardware zur Auswertung der Geräusche? :astonished: Was habt ihr denn seit dem 6.12. geschafft?
Ich würde vorschlagen, dass ihr zur Geräuschauswertung auf die Schaltung zurückgrift, wie sie im Schaltplan zum Arduino Esplora verbaut ist. Da kann man zumindest davon ausgehen, dass diese funktioniert:
http://arduino.cc/en/uploads/Main/arduino-esplora-schematic.pdf (Darstellung oben rechts). Den Ausgang der Teilschaltung könnt ihr dann direkt an einen Analogeingang legen, der Umweg über den Multiplexer/Demultiplexer wie beim Esplora entfällt. Dann einfach einen Schwellwert definieren und darüber ein Fahren-Flag setzen. Beim nächsten Klatschen kehrt man das Flag einfach wieder um.
Für den Doppelklatsch wertet man die Zeitdifferenz zwischen der ersten und der zweiten Schwellwertüberschreitung aus. Ist diese klein genug (z.B. 500 ms), kann man kurzzeitig lenken, in eurem Fall werden sich wohl beide Antriebsräder unterschiedlich schnell drehen.

Dann mal ran ans Werk! :wink:

vllt. hilft der link weiter: http://www.arduino.cc/en/Tutorial/KnockSensor. Ist eine Anleitung, wie man aus einem 10ct Piezo-element einen Klatschsensor macht.

dlca:
vllt. hilft der link weiter: http://www.arduino.cc/en/Tutorial/KnockSensor. Ist eine Anleitung, wie man aus einem 10ct Piezo-element einen Klatschsensor macht.

Nach dem von mir gelernten Englisch ist ein "knock sensor" aber ein "Klopfsensor".
D.h. wenn der Sensor an ein Gehäuse oder an ein Türblatt geschraubt wird, kann man erkennen, ob jemand anklopft.

Ein Klatschsensor wäre ein "clap sensor". Wenn es also funktionieren soll, ohne dass man dem Roboter erst einen Klaps auf den Allerwertesten geben muss, würde ich eher nach Basteleien mit "clap sensor" als mit "knock sensor" Ausschau halten.

jurs:
Nach dem von mir gelernten Englisch ist ein "knock sensor" aber ein "Klopfsensor".
D.h. wenn der Sensor an ein Gehäuse oder an ein Türblatt geschraubt wird, kann man erkennen, ob jemand anklopft.

Kann ich durch eigene Erfahrung bestätigen. Ziel war es bei mir, diese Schaltung nachzubasteln: How-To: Arduino high speed photography trigger - Make:
Dort wird ein Piezo-Element verwendet, um bei lauten Geräusche den Blitz einer Kamera auszulösen. Wie gesagt, ich habs nachgebaut aber es funktionierte nicht. Beim direkten Klopfen, selbst bei kleinen Berührungen hatte ich ein Signal vom Sensor, der Schall hingegen bewirkte nichts. Daher ist der Piezo wohl nicht die beste Wahl für dieses Projekt.

das knock nicht gleich Klatschen ist, ist mir schon klar...
ich hatte nur mal an anderer Stelle gelesen, dass man mit Piezos auch rudimentär Schallwellen wahrnehmen kann, daher die Idee.

blumensmili:
@mkl0815
Wir haben noch kein Programm geschrieben, da wir erst recherchiert haben und den Roboter zusammen gebaut haben.. Nun haben wir erst den Lautsprecher getestet und kommen nun zum programmieren..aber da wir nur die Grundkenntnisse haben fälllt uns dies sehr schwer!
void setup und void loop kennen wir, da wir (wie oben genannt) schon Beispiele ( LED blinkt etc. ) programmiert haben.

Aber das ist doch auch schon mal eine Aussage. Es gibt also noch gar nichts. OK, nicht gut, aber dann eben von Null an.
Teilt Ihr Euch in die Arbeit ein (jeder arbeitet an etwas anderem) oder macht Ihr die Arbeiten immer zusammen (beide arbeiten am gleichen)?

Um am Ende ein einigermaßen funktionierendes Programm zu haben, müßt Ihr noch einige Teilprobleme lösen. Da die meisten davon unabhängig sind, kann man die auch unabhängig voneinander lösen.
z.b.

  • "geradeaus fahren" : Was muss dafür gemacht werden? Beide motoren mit gleicher Drehzahl fahren. Wie macht man das?
  • "kurve fahren" : Wie macht man das? ...
  • "klatschen erkennen" ...
  • "wie erkenne ich das doppelt geklatscht wurde?"
  • wie halte ich an und vor allem wann?

Das sind die Funktionsblöcke die ich meine. Es gibt sicher noch weitere die Euch da einfallen.
Diese Funktionsblöcke nehmt ihr dann und baut Euch einen Abaufplan für Euer Programm. Das hat noch nichts mit programmieren zu tun, hilft Euch aber später ungemein, weil Ihr schrittweise vorgehen könnt.
In diesem Ablaufplan werden dann die einzelnen Funktionen miteinander verknüpft.

Beispiel: Roboter soll bei einmal klatschen losfahren und nach 10 sekunden von alleine wieder stehenbleiben. Wird geklatscht während der Roboter fährt, soll er auch stehenbleiben.

  • loop() - Anfang
  • prüfen ob klatschen erkannt wurde
  • klatschen erkannt - ja -> prüfe ob motor an (1)
  • klatschen erkannt - nein -> prüfe ob 10 sekunden abgelaufen (2)
  • (1) prüfe ob motor an:
    • motor an -> motor aus
    • motor aus -> motor an, sekundenzähler auf null setzen
  • (2) prüfe ob sekunden abgelaufen:
    • 10 sekunden rum? -> motor aus
  • loop() - Ende -> loop() Anfang

Das ist nur ein einfaches Beispiel, das Euch zeigen soll, was ich meine. Damit könnt Ihr auch ohne die Hardware schon einiges für Euer Programm machen. Euer Ablaufplan wird etwas komplizierter, da ihr ja auch das doppelt klatschen bercksichtigen müßt.

blumensmili:
@sth77
Also seit dem 6.12 haben wir es erst mal nur mit dem Lautsprecher getestet:

Lautsprecher ist gut, das ist quasi ein umgekehrtes "dynamisches Mikrofon".

Leider wird das Ausgangssignal (Spannung) zu klein sein, um es ohne eine vorherige Verstärkung am Arduino messen zu können.

Ich würde den Lehrer mal fragen nach:

  • Mini-Verstärkerschaltung (um die Spannung des Lautsprecher-Mikrofons zu verstärken)
  • einem Kondensator 1 bis 100 Mikrofarad
  • einer Gleichrichter-Diode
    Den Kondensator und die Diode zum Ankoppeln des Signals an den Arduino.

Ich habe mal kurz mit dieser Schaltung getestet: Ein Draht vom Arduino Analogeingang zu einem Kondensator 100 uF zu einem Lautsprecheranschluss und ein Draht von Ground zum anderen Lautsprecheranschluss.

#define INPUTPIN A5
void setup () 
{
  Serial.begin(9600);
}

void loop () 
{
    if ( analogRead(INPUTPIN)>20 ) Serial.println("Klapp");
}

Eine Gleichrichterdiode habe ich gerade nicht zur Hand.

Der Code funktioniert nur, wenn man direkt mit dem Finger auf die Lautsprechermembrane tippt.

Wenn man direkt vor dem Lautsprecher in die Hände klatscht, passiert gar nichts.
Da fehlt eine Verstärkung!

Bei mir im Raum liefert analogRead(INPUTPIN) im ruhigen Raum meistens "11" als Wert.
Wenn ich statt 20 nur 12 als Erkennungsschwelle im Programm setze:
if ( analogRead(INPUTPIN)>12 ) Serial.println("Klapp");
dann funktioniert es mit Klatschen direkt vor dem Lautsprecher gerade so eben.

Den notwendigen Verstärkungsfaktor für eine gute Erkennung am Arduino schätze ich mal auf 100 bis 500.
Vielleicht eine Transistorverstärkung?

Ich würde für die Geräuscheerkennung folgendes Analog Sound Module benutzen:

Und zwar in folgender Konfiguration:

Damit man nicht nur erkennen kann ob es ein Geräusch gibt, sondern um auch dessen Richtung erkennen zu können !

Falls die Benutzung eines solchen Fertigmoduls im Projekt erlaubt sein sollte !

Falls nicht, vielleicht hilft euch dann die Schematik der Schaltung:

Den LM358 gibt es auch als DIP-Version und ist recht günstig im Preis:
http://www.ebay.de/itm/10-x-LM358-LM358N-DUAL-LOW-POWER-OP-DIL8-TOP-NEU-/380158231325?pt=Bauteile&hash=item588332431dLM358-LM358N-DUAL-LOW-POWER-OP-DIL8-TOP-NEU-/380158231325?pt=Bauteile&hash=item588332431d

Falls ein Geräusch zu kompliziert ist, nehmt doch einfach einen Fototransistor oder einen LDR (lichtempfindlicher Widerstand) und steuert den Roboter über eine Taschenlampe. Das dürfte deutlich einfacher werden.

Wäre es nicht einfacher das Auto einfach anzupusten, damit es losfährt? ]:smiley:
Der Kraftaufwand ist vermutlich der gleiche :slight_smile:

Aber Scherz beiseite, wenn Ihr das Auto nur fahren lassen wollt, wenn ein Ton erkannt wird, erleichtert das die Programmierung ungemein.
Denn wenn "Ton an" -> "Motor an", ansonsten "Motor aus".

Das ist doch dann schon überschaubar. Vor allem könnt Ihr beide gleichzeitig an Eurem Problem arbeiten.

Eine erstellt das Programm um die Motoren zu steuern. Am Anfang kann man das z.B. mit einem Taster machen, oder im einfachsten Fall einfach zwei lange Drähte. Einen an Masse / GND einen an ein Arduino-Pin. Mehr braucht man nicht. Dann noch pinMode(PIN,INPUT_PULLUP) im setup, um das Pin zum Eingang zu machen. Mit digitalRead(PIN) fragt man das pin dann ab. Liefert die Funktion HIGH sind die Drähte nicht verbunden, liefert die Funktion LOW sind die Drähte verbunden. Das wertet man dann erstmal als "Ton erkannt" und läßt das Auto losfahren.

Die zweite von Euch beiden kümmert sich in der Zwischenzeit um die Schaltung zum Erkennen Eurer Tröte. Daraus wird dann am Ende eine Funktion z.B. "int readTroete(int pin);" die ein HIGH liefert, wenn ein Ton erkannt wurde oder ein LOW, wenn nicht.
Diese Funktion setzte man dann an Stelle des digitalRead(pin) von oben ein, achtet darauf das sich die Logik von "Low == losfahren" zu "HIGH == losfahren" geändert hat und ist im Prinzip fertig.

analogRead() ist in der loop besser aufgehoben. Weiterhin nutzt ihr nur zwei Pins für beide Motoren? Ich bin davon ausgegangen, dass ihr zumindest den L293 als H-Brücke benutzt: http://www.arduino-tutorial.de/2010/06/motorsteuerung-mit-einem-h-bridge-ic/
Das Verwenden von delay() in der loop ist zwar keine vorbildliche Lösung, da aber keine zusätzlichen Sensoren ausgewertet werden, ist dies zu verschmerzen.
Das doppelte Low-Setzen der Motorpins in den eigenen Funktionen ist ziemlich unnütz. Gerade in der stoppen() macht ihr das für jeden Motorpin doppelt. Das doppelte ist alles andere als logisch.

Deutsch: http://www.arduino-tutorial.de/2010/06/motorsteuerung-mit-einem-h-bridge-ic/ (schon genannt worden)
http://www.schule-bw.de/unterricht/faecher/nwt/unterrichtseinheiten/kurs/micro_pics/manuskript.pdf (euer Manuskript, Seite 11)
Englisch: http://luckylarry.co.uk/arduino-projects/control-a-dc-motor-with-arduino-and-l293d-chip/
http://www.instructables.com/id/Control-your-motors-with-L293D-and-Arduino/

Besser ist es, eigenen Code zu zeigen - dann können wir sagen, wo euer Denkfehler liegt/lag.

Das sieht doch schon recht gut aus. Ich würde aber noch eine Funktion "stop()" ins Programm aufnehmen, sonst dreht sich am Ende der Fahrsequenz der Roboter links herum auf der Stelle bis der nächste Ton erkannt wird.
Zum Programm:

int m2PinGeschw = 1;
int m2PinRichtung = 1;

Hier müssen unterschiedliche Pins verwendet werden. Außerdem könnt Ihr Pin 0 und Pin 1 nicht verwenden, wenn Ihr Ausgaben über die serielle Schnittstelle machen wollt. Pin 1 ist außerdem kein PWM Pin, daher klappt dort das analogWrite() nicht.
Mario.