Servo und Multi-function Shield stören sich gegeseitig

Hallo,

ich muss für eine Belegarbeit ein Projekt erstellen, dabei ghabe ich mich für ein Rückfahrsytem (in Code mit RFS abgekürzt) entschieden. Ich habe nun also den Code geschrieben wie ich ihn brauche, habe aber ein Problem. Kurz zur geplanten Funktionsweise:

Über einen Ultraschallsensor HC-SR04 wird die Distanz zum Hindernis ausgemessen, dann wird je nach Entfernung eine Zeile im serial monitor ausgegeben und es gibt einen beep-ton (auskommentiert in Code). Auf der 7-Segmente Anzeige des Multi-function Shield soll dann dieser bestimmter Wortlaut geschrieben werden. Überschreitet die Distance dann einen bestimmten Wert soll ein Servomotor (Miuzei Micro Servo 9g MS18) eine Abdeckung schließen. Ist die Abdeckung dann geschlossen kann sie per Knopfdruck (A2) wieder geöffnet bleiben und bleibt dann 10s mindestenst auf bis es wieder geschlossen werden kann.

Mein Problem:
Je nach Anordnung der Zeilen im void setup, funktioniert entweder der servo oder die Anzeige des Multi-function Shield nicht. Aufgefallen ist mir dass es an Zeile 22 liegt, die allerdings nötig ist.

#include <Servo.h>
#include <Wire.h>
#include <TimerOne.h>
#include <I2C.h>
#include <II2C.h>
#include <MPU6050.h>
#include <MultiFuncShield.h>

Servo servo; 
int trigger=9; //Trigger-Pin des Ultraschallsensors an Pin7 des Arduino-Boards 
int echo=A5; // Echo-Pim des Ultraschallsensors an Pin6 des Arduino-Boards 
long dauer=0; // Das Wort dauer ist jetzt eine Variable, unter der die Zeit gespeichert wird, die eine Schallwelle bis zur Reflektion und zurück benötigt. Startwert ist hier 0.
long entfernung=0; // Das Wort „entfernung“ ist jetzt die variable, unter der die berechnete Entfernung gespeichert wird. Info: Anstelle von „int“ steht hier vor den beiden Variablen „long“. Das hat den Vorteil, dass eine größere Zahl gespeichert werden kann. Nachteil: Die Variable benötigt mehr Platz im Speicher.
int taster=A2;

void setup()
{
Serial.begin (9600); //Serielle kommunikation starten, damit man sich später die Werte am serial monitor ansehen kann.
pinMode(trigger, OUTPUT); // Trigger-Pin ist ein Ausgang
pinMode(echo, INPUT); // Echo-Pin ist ein Eingang
Timer1.initialize(); //nötig für MFS um zu funktionieren
MFS.initialize(&Timer1); //PROBLEM!! nötig für MFS
servo.attach(6);
pinMode(taster, INPUT);
}
void loop()
{
digitalWrite(trigger, LOW); //Hier nimmt man die Spannung für kurze Zeit vom Trigger-Pin, damit man später beim senden des Trigger-Signals ein rauschfreies Signal hat.
delay(5); //Dauer: 5 Millisekunden
digitalWrite(trigger, HIGH); //Jetzt sendet man eine Ultraschallwelle los.
delay(10); //Dieser „Ton“ erklingt für 10 Millisekunden.
digitalWrite(trigger, LOW);//Dann wird der „Ton“ abgeschaltet.
dauer = pulseIn(echo, HIGH); //Mit dem Befehl „pulseIn“ zählt der Mikrokontroller die Zeit in Mikrosekunden, bis der Schall zum Ultraschallsensor zurückkehrt.
entfernung = (dauer/2) * 0.03432; //Nun berechnet man die Entfernung in Zentimetern. Man teilt zunächst die Zeit durch zwei (Weil man ja nur eine Strecke berechnen möchte und nicht die Strecke hin- und zurück). Den Wert multipliziert man mit der Schallgeschwindigkeit in der Einheit Zentimeter/Mikrosekunde und erhält dann den Wert in Zentimetern.
if (entfernung >= 500 || entfernung <= 0) //Wenn die gemessene Entfernung über 500cm oder unter 0cm liegt,…
{
Serial.println("Kein Messwert"); //dann soll der serial monitor ausgeben „Kein Messwert“, weil Messwerte in diesen Bereichen falsch oder ungenau sind.
}
else if (entfernung > 150)
{
  MFS.write("zu");
  Serial.print("zu");
  servo.write(180); //schließt Abdeckung
}
else if (entfernung > 100)
{
  Serial.print("sehr weit");
  MFS.write("");
  //MFS.beep(20);
}
else if (entfernung > 75)
{
  Serial.print("fern");
  MFS.write("FERN");
  //MFS.beep(15);
}
else if (entfernung > 50)
{
  Serial.print("nah");
  MFS.write("NAH");
  //MFS.beep(10);
}
else if (entfernung > 15)
{
  Serial.print("eng");
  MFS.write("ENG");
  //MFS.beep(8);
}
else if (entfernung <= 15)
{
  Serial.print("stop");
  MFS.write("STOP");
  //MFS.beep(5);
  if (digitalRead(taster) == LOW) {
  servo.write(0); //öffnet Abdeckung
  delay(10000); //Zeit um auch bei zu großer Entfernung RFS aktiviert zu haben, wenn man z.B. noch zu weit weg steht
}
}
Serial.print("\t");
Serial.print(entfernung);
Serial.println("");
delay(1000); //Das delay von einer Sekunde sorgt in ca. jeder neuen Sekunde für einen neuen Messwert.
}

In dieser Anordnung funktioniert der Servo, jedoch nicht die Anzeigen des Multi-function Shields.

void setup()
{
Serial.begin (9600); //Serielle kommunikation starten, damit man sich später die Werte am serial monitor ansehen kann.
pinMode(trigger, OUTPUT); // Trigger-Pin ist ein Ausgang
pinMode(echo, INPUT); // Echo-Pin ist ein Eingang
Timer1.initialize(); //nötig für MFS um zu funktionieren
servo.attach(6);
MFS.initialize(&Timer1); //PROBLEM!! nötig für MFS
pinMode(taster, INPUT);
}

In dieser Anordnung funktionieren die Funktionen des Multi-function Shields aber nicht der servo.

Ich habe leider auch keine andere funktionierende library gefunden für das Multi-function Shield. Ich hoffe ihr könnt mir helfen.

Wie wird das Servo mit Energie versorgt?

Das MFS ist an den PC angeschlossen und der servo an das MFS

Das Servo würde sich über eine eigene Spannumgsversorgung freuen.

Der servo funtioniert an sich. Die Stromversorgung stellt eigentlich kein Problem dar

Ok,
dann habe ich das nicht verstanden.

Ich wünsche einen geschmeidigen Tag und viel Spass beim Programmieren in C++.

vermutlich kommen da die Timer der beiden Libraries durcheinandern.

Variante 1:
http://cool-web.de/arduino/multi-function-shield-servo-motor.htm

Variante 2:
die Servo.h verwenden und die Anzeige neue schreiben so dass die Shift Register ohne Timer auskommen.

Variante 1 hat geklappt, musste nur mein Code mit einbauen. Vielen herzlichen Dank! Schönen Tag noch!

Nehme an Du hast einen Arduino UNO
Du benutzt Teile des Controllers doppelt.

  1. Timer wie schon gesagt. Die Servo Bibliothek benutzt den Timer1. Dieser kann für andere Funktionen nicht genutzt werden.
  2. Auf den Pin A4 und A5 ist die I2C Schnittstelle. Wenn Du I2C verwenden willst dann müssen diese pin unbenutzt bleiben.
    Wiso benutzt Du 3 Bibliotheken für I2C? (Wire.h, I2C.h, II2C.h)

Grüße Uwe

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