Einige Fragen bzgl "Leave me Alone Box"

Hallo zusammen.

Ich wende mich hier an euch da ich da ein paar Fragen habe.
Mein Vorhaben : Ich will eine Leave me Alone Box bauen, mit verschiedenen Reaktionen. (Useless Box with Surprises - YouTube)
Diese beinhalten 2 8x8 LED Matrixen, einen Ultraschallsensor, einen Servo-Motor und 2 kleine DC Motoren als Antrieb .. Habe dazu den Arsuino UNO R3.

  • Die beiden DC Motoren werden schon über externe Spannung und einem L293D Motor Treiber angesteuert... bei diversen Test zeigt sich aber, das das Ansteuern des Servos extrem spinnt ... er zuckt und ruckelt vor sich hin statt das zu machen was er soll. Brauch auch dieser eine externe Spannung? Falls ja ... irgendwelche Vorschläge?
    Seltsamerweise klappte das Ansteuern direkt über VCC des Arduinos problemlos, versuche ich exakt das selbe jetzt, ohne den ganzen zusätzlichen Kram, so spinnt das Teil >:(

  • Der Ultraschallsensor soll als Bewegungsmelder dienen, nähert sich was dem Kippschalter, so folgt eine Reaktion, zB "Box fährt ruckartig zurück". Ist es da möglich die Entfernung dann in einem Wert zu speichern und in einer do while schleife auf Verringerung der Entfernung zu warten?

Vielen Dank im Vorraus!

Ich versteh's nicht, wo Du jetzt wo was angeschlossen hast.
Servo an separate Stromversorgung, also nicht über den UNO ist aber in jedem Fall anzuraten.

schm4nd:
Brauch auch dieser (Servo) eine externe Spannung? Falls ja ... irgendwelche Vorschläge?

Ja. Ich verwende Stepdown-Wandler. Also 9 V vom Netzteil an VIN vom Arduino und Eingang vom Stepdown, den auf 5 V am Ausgang einstellen, damit den Servo versorgen. Natürlich gibt es noch andere Möglichkeiten.

schm4nd:
Ist es da möglich die Entfernung dann in einem Wert zu speichern

Ja.

schm4nd:
... in einer do while schleife ...

do while ist schlecht, weil loop schon eine Schleife ist.

schm4nd:
... auf Verringerung der Entfernung zu warten?

Ja.

Also:
Folgende Bauteile werden verbaut:
5V Servo
2x 6V DC Motor, angesteuert über L293D Motor Treiber mit eigener 6V Spannungsversorgnung
2x 8x8 LED Matrix Module, angesteuert über MAX7219 LED Display Treiber.
HC SR-04 Ultraschallsensor.

Bei umlegen des Kippschalters auf der Box soll der Servo einen Arm bewegen, der die Box öffnet und den Schalter umlegt. Dazu sollen verschiedene Reaktionen der Box kommen wie oben als Beispiel genannt.
Alles ist, wenn oben nicht anders vermerkt, an den arduino angeschlossen und soll über ebendiesen gesteuert werden.
Was mich wundert ist das der Servo bei den anfänglichen Tests problemlos direkt per Arduino gesteuert werden konnte, das aber jetzt, mit dem selben Test-sketch von damals, nichtmehr möglich ist ...
Warum keine for-schleife? Wie kann ich denn anders "Auf Eingabe warten"?

Würde ein Struktogramm vllt helfen um den Programmablauf dar zu stellen den ich mir so überlegt habe?

lg

Sketch zeigen und nochmal: worüber läuft die Stromversorgung für den Servo?

Hast du Masse verbunden? Eine gemeinsame Masse brauchst du trotzdem. Lediglich die Versorgungsspannung kommt von einem externen Netzteil

Warum keine for-schleife? Wie kann ich denn anders "Auf Eingabe warten"?

Indem du in loop() ständig abfragst.

Hier mag das vielleicht nicht wichtig sein. Aber bei anderen Anwendung willst du auch nebenbei noch was anderes machen während du "wartest" dass ein Ereignis eintritt.

Die Stromversorgung für den Servo lief bisher über Arduino ... habe den Stepdown-Wandler schon bestellt.
Sketch befindet sich noch im Rohbau, sollte aber verständlich sein worauf ich hinaus will... hoffe ich :smiley:

#include <Servo.h>            // Einbinden der Servo-Library
Servo myservo;

#include <LedControl.h>         // Einbinden der LED Control - Library
LedControl lc = LedControl(5, 7, 6, 2);    // Zuweisung LED Matrix Ausgänge
#include <NewPing.h>          // Einbinden der NewPing Library -> Ultraschallsensor
NewPing sonar(2, 3, 30);        // Zuweisung Ultraschallsensor

int kippschalter = 0;
int motor1plus = 10;
int motor1minus = 11;
int motor2plus = 12;
int motor2minus = 13;
int count;
int zufall;
int zeit1, zeit2;
int zeitvergangen;
int pos;

void setup()        // Setup läuft ein mal oder bei betätigen des Reset tasters
{
	myservo.attach(9);        // Zuweisung PWM Ausgang Servo
	pinMode(0, INPUT_PULLUP);   // KIPPSCHALTER
	pinMode(10, OUTPUT);      // Motor M1 +
	pinMode(11, OUTPUT);      // Motor M1 -
	pinMode(12, OUTPUT);      // Motor M2+
	pinMode(13, OUTPUT);      // Motor M2-
	lc.shutdown(0, false);
	lc.setIntensity(0, 8);
	lc.shutdown(1, false);
	lc.setIntensity(1, 8);
	//
	zeitvergangen = 11000;
	zeit1 = 0;
}


void loop()       // Loop läuft in Schleife
{
	do
	{
		lc.clearDisplay(0);
		lc.clearDisplay(1);
		lc.setRow(0, 0, B00011100);
		lc.setRow(0, 1, B00100010);
		lc.setRow(0, 2, B01011101);
		lc.setRow(0, 3, B01011101);
		lc.setRow(0, 4, B00100010);
		lc.setRow(0, 5, B10011100);
		lc.setLed(0, 5, 0, true);
		lc.setLed(0, 6, 0, true);
		lc.setLed(0, 7, 0, true);
		lc.setLed(1, 0, 0, true);
		lc.setLed(1, 1, 0, true);
		lc.setRow(1, 2, B10011100);
		lc.setRow(1, 3, B00100010);
		lc.setRow(1, 4, B01011101);
		lc.setRow(1, 5, B01011101);
		lc.setRow(1, 6, B00100010);
		lc.setRow(1, 7, B00011100);
		delay(5000);
		lc.setRow(0, 0, B00011100);
		lc.setRow(0, 1, B00100000);
		lc.setRow(0, 2, B01000000);
		lc.setRow(0, 3, B01000000);
		lc.setRow(0, 4, B00100000);
		lc.setRow(0, 5, B10011100);
		lc.setLed(0, 5, 0, true);
		lc.setLed(0, 6, 0, true);
		lc.setLed(0, 7, 0, true);
		lc.setLed(1, 0, 0, true);
		lc.setLed(1, 1, 0, true);
		lc.setRow(1, 2, B10011100);
		lc.setRow(1, 3, B00100000);
		lc.setRow(1, 4, B01000000);
		lc.setRow(1, 5, B01000000);
		lc.setRow(1, 6, B00100000);
		lc.setRow(1, 7, B00011100);
		delay(200);
	} while (digitalRead(kippschalter) == HIGH || zeitvergangen >10000 );
	if (digitalRead(kippschalter) == LOW)
	{
		count++;
		if (count < 5)										// STANDARD REAKTION
		{
			for (pos = 0; pos < 90; pos= pos+1)				// Servo fährt von 0° - 90° in Schritten von 1°
			{
				myservo.write(pos);
				delay(15);
			}
			for (pos = 90; pos < 180; pos = pos + 2)		// Servo fährt von 90° - 180° in Schritten von 2°
			{
				myservo.write(pos);
				delay(15);
			}
			for (pos = 180; pos >0; pos = pos + 1)			// Servo fährt von 90° - 180° in Schritte non 1 ° 
			{
				myservo.write(pos);
				delay(15);
			}
			zeit1 = millis();
		}
		else
		{
			if (count <= 20)
			{
				zufall = random(21);
				switch (zufall)
				{
				case 1:
					break;
				case 2:
					break;
				case 3:
					break;
				case 4:
					break;
				case 5:
					break;
				case 6:
					break;
				case 7:
					break;
				case 8:
					break;
				case 9:
					break;
				case 10:
					break;
				case 11:
					break;
				case 12:
					break;
				case 13:
					break;
				case 14:
					break;
				case 15:
					break;
				case 16:
					break;
				case 17:
					break;
				case 18:
					break;
				case 19:
					break;
				case 20:
					break;
				}
				zeit1 = millis();
			}
			else
			{
				// REAKTION AUFGABE!
			}
		}
	}
	zeit2 = millis();
	zeitvergangen = 0;
	zeitvergangen = zeit2 - zeit1;
}

Die ganzen Cases sollen später die verschiedenen Reaktionen sein...

5V Servo -> davon gibt es viele, der Strom ist entscheidend!
2x 6V DC Motor, angesteuert über L293D Motor Treiber mit eigener 6V Spannungsversorgnung -> OK
2x 8x8 LED Matrix Module, angesteuert über MAX7219 LED Display Treiber. -> Stromversorgung 128 LEDs?
HC SR-04 Ultraschallsensor. -> braucht auch etwas Strom, könnte der Tropfen sein, der das Faß ...

TowerPro SG90 Micro Servo 9g ist es.

... noch ne eigene Versorgung für die Matrix?! :\

Auf Pin0 liegt ein Kippschalter.
Pin0 und Pin1 sind für die Serielle Schnittstelle reserviert und können Probleme bereiten.

Edit
Ich hoffe, dir ist auch klar, dass diese US-Module unter 10cm nicht mehr richtig arbeiten.

HotSystems:
Auf Pin0 liegt ein Kippschalter.
Pin0 und Pin1 sind für die Serielle Schnittstelle reserviert und können Probleme bereiten.

Edit
Ich hoffe, dir ist auch klar, dass diese US-Module unter 10cm nicht mehr richtig arbeiten.

Oh okay danke, wird umgelegt, habe noch freie Pins...

Ist nicht so tragisch, der Sensor wird irgendwo auf die tischplatte gerichtet sein und dann messen, werde ich also irgendwie schon hin bekommen.

Auch blockierst du deinen Sketch durch die zahlreichen delays.