Forum: Mikrocontroller und Digitale Elektronik Arduino Beschleunigungssensor + LED + Taster


von Flo D. (floflovaldo)


Lesenswert?

Hallo,

ich habe etwas als Test mit dem Arduino was vor. Ein 
Beschleunigungssensor gibt den X-, Y- und Z-Wert aus. Diese sollen vom 
Pi ausgelesen werden und wenn der X-/Y-/Z-Wert + oder - 10 unter dem 
ausgelesenen Wert ist soll eine LED kurz leuchten. Das mit dem +-10 habe 
ich nicht hinbekommen. Ich habe erst mal feste Werte angegeben aber 
dadurch das diese sich ab und zu ändern leider suboptimal.

Außerdem soll dann wenn die LED leuchtet, einen Taster betätigen können. 
Dieser soll allerdings nur eine LED bzw. später ein GSM-Modul ansprechen 
wenn der Taster WÄHREND der Leuchtzeit der LED gedrückt wurde.

Kann mir da irgendjemand helfen? Wäre sehr nett

Viele Grüße

Florian

von Max H. (hartl192)


Lesenswert?

Florian D. schrieb:
> ich habe etwas als Test mit dem Arduino was vor. Ein
> Beschleunigungssensor gibt den X-, Y- und Z-Wert aus. Diese sollen vom
> Pi ausgelesen werden
Was jetzt? Arduino oder Pi?

> wenn der X-/Y-/Z-Wert + oder - 10 unter dem
> ausgelesenen Wert ist soll eine LED kurz leuchten.
Das verstehe ich jetzt nich so ganz.

> Das mit dem +-10 habe
> ich nicht hinbekommen. Ich habe erst mal feste Werte angegeben aber
> dadurch das diese sich ab und zu ändern leider suboptimal.
Wie sieht dein Code aus?

: Bearbeitet durch User
von Flo D. (floflovaldo)


Lesenswert?

Hallo, zur ersten Frage. Tut mir leid da war die Autokorrektur Schuld. 
Geht alleine um den Arduino.

Wenn du den Code siehst ist dir das glaube ich ein bisschen klarer.
1
int X = A0;
2
int Y = A1;
3
int Z = A2;
4
 
5
void setup()
6
{
7
  Serial.begin(9600);
8
  pinMode(2, OUTPUT);
9
  pinMode(5, INPUT); //Oder INPUT_PULLUP 
10
}
11
void loop()
12
{
13
  
14
  //Serielle Ausgaben der Werte für Testzwecke 
15
  
16
  Serial.print(" X: ");
17
  Serial.print(analogRead(X));
18
  Serial.print(" Y: ");
19
  Serial.print(analogRead(Y));
20
  Serial.print(" Z: ");
21
  Serial.print(analogRead(Z));
22
  Serial.println();
23
  delay(500);
24
  
25
  int xWert = analogRead(X);
26
  int yWert = analogRead(Y);
27
  int zWert = analogRead(Z);
28
 
29
  //if-Abfragen für xWert
30
  
31
   if (xWert >= 363)
32
    {
33
      digitalWrite(2, HIGH);
34
      delay(3000);
35
      digitalWrite(2, LOW);
36
    }
37
    
38
    if (xWert <= 353)
39
    {
40
      digitalWrite(2, HIGH);
41
      delay(3000);
42
      digitalWrite(2, LOW);
43
    }
44
  
45
  //if-Abfragen für yWert
46
  
47
   if (yWert >= 363)
48
    {
49
      digitalWrite(2, HIGH);
50
      delay(3000);
51
      digitalWrite(2, LOW);
52
    }
53
    
54
      if (yWert <= 350)
55
    {
56
      digitalWrite(2, HIGH);
57
      delay(3000);
58
      digitalWrite(2, LOW);
59
    }
60
    
61
    //if-Abfragen für zWert
62
    
63
     if (zWert >= 307)
64
    {
65
      digitalWrite(2, HIGH);
66
      delay(3000);
67
      digitalWrite(2, LOW);
68
    }
69
    
70
     if (zWert <= 298)
71
    {
72
      digitalWrite(2, HIGH);
73
      delay(3000);
74
      digitalWrite(2, LOW);
75
    }
76
}

von Wolfgang (Gast)


Lesenswert?

Florian D. schrieb:
> pinMode(5, INPUT); //Oder INPUT_PULLUP

Das hängt von deiner Schaltung ab.

von Max H. (hartl192)


Lesenswert?

Florian D. schrieb:
> Ein
> Beschleunigungssensor gibt den X-, Y- und Z-Wert aus. Diese sollen vom
> Pi ausgelesen werden und wenn der X-/Y-/Z-Wert + oder - 10 unter dem
> ausgelesenen Wert ist soll eine LED kurz leuchten.
Das verstehe ich immer noch nicht so ganz. Willst du den neunen mit dem 
vorherigen wert vergleichen?

von Wolfgang (Gast)


Lesenswert?

Florian D. schrieb:
> Außerdem soll dann wenn die LED leuchtet, einen Taster betätigen können.

Wie willst du in deinem Programm von der Betätigung des Tasters 
erfahren, wenn du den Prozessor zwischen Einschalten der LED und 
Ausschalten vollzeit mit Warten beschäftigst?

von Flo D. (floflovaldo)


Lesenswert?

Bis jetzt bin ich nicht weiter gekommen. Deshalb habe ich hier gefragt 
weil ich nicht weiter wusste...

von Flo D. (floflovaldo)


Lesenswert?

Wie genau? Mein Button ist angeschlossen über VCC an der einen Seite und 
an der anderen über nen Widerstand an GND und an einen Digital Pin zum 
auslesen.

von Flo D. (floflovaldo)


Lesenswert?

Ja genau. Es soll quasi eine Bewegung erkannt werden! Und wenn eine 
Bewegung bzw. Beschleunigung ja eigentlich mehr in dem Fall soll die LED 
leuchten.

von Max H. (hartl192)


Lesenswert?

Florian D. schrieb:
> Ja genau. Es soll quasi eine Bewegung erkannt werden!
Dann könntest du es so versuchen:
1
// Untested
2
3
void loop()
4
{
5
  static bool first = false;
6
  static int x_old = 0;
7
  static int y_old = 0;
8
  static int z_old = 0;
9
  
10
  int x_new = analogRead(X);
11
  int y_new = analogRead(Y);
12
  int z_new = analogRead(Z);
13
 
14
  if((abs(x_new - x_old) > 10 || abs(y_new - y_old) > 10 || 
15
      abs(z_new - z_old) > 10) && first)
16
  {
17
    first = true;
18
    digitalWrite(2, HIGH);
19
    delay(3000);
20
    digitalWrite(2, LOW);
21
  }
22
23
  x_old = x_new;
24
  y_old = y_new;
25
  z_old = z_new;
26
}

Florian D. schrieb:
> Wie genau? Mein Button ist angeschlossen über VCC an der einen Seite und
> an der anderen über nen Widerstand an GND und an einen Digital Pin zum
> auslesen.
Dann brauchst du keinen internen Pullup.

: Bearbeitet durch User
von Flo D. (floflovaldo)


Lesenswert?

Ich versuche es direkt aus. Danke schon mal. Gebe gleich Bescheid!

Viele Grüße

Florian

von Flo D. (floflovaldo)


Lesenswert?

Kommt das X, Y und Z nicht deklariert wurden.

von Max H. (hartl192)


Lesenswert?

Ich hab jetzt nur die loop() überarbeitet, der Rest beliebt wie in 
deinem Code.

von Flo D. (floflovaldo)


Lesenswert?

Hallo,

ich habe die Deklaration noch eingefügt von mir. Das ganze sieht dann so 
aus
1
int X = A0;
2
int Y = A1;
3
int Z = A2;
4
5
void setup()
6
{
7
  Serial.begin(9600);
8
  pinMode(2, OUTPUT);
9
  pinMode(5, INPUT); 
10
}
11
12
void loop()
13
{
14
  static bool first = false;
15
  static int x_old = 0;
16
  static int y_old = 0;
17
  static int z_old = 0;
18
  
19
  int x_new = analogRead(X);
20
  int y_new = analogRead(Y);
21
  int z_new = analogRead(Z);
22
 
23
  if((abs(x_new - x_old) > 10 || abs(y_new - y_old) > 10 || 
24
      abs(z_new - z_old) > 10) && first)
25
  {
26
    first = true;
27
    digitalWrite(2, HIGH);
28
    delay(3000);
29
    digitalWrite(2, LOW);
30
  }
31
32
  x_old = x_new;
33
  y_old = y_new;
34
  z_old = z_new;
35
}

Allerdings passiert leider nichts und die LED leuchtet auch nicht. Habe 
gerade auch nachgeschaut, LED funktioniert so einwandfrei.

von Max H. (hartl192)


Lesenswert?

Sry, mein Fehler, so sollte es funktionieren:
1
// Untested
2
void loop()
3
{
4
  static bool first = true;
5
  static int x_old = 0;
6
  static int y_old = 0;
7
  static int z_old = 0;
8
  
9
  int x_new = analogRead(X);
10
  int y_new = analogRead(Y);
11
  int z_new = analogRead(Z);
12
 
13
  if((abs(x_new - x_old) > 10 || abs(y_new - y_old) > 10 || 
14
      abs(z_new - z_old) > 10) && !first)
15
  {
16
    digitalWrite(2, HIGH);
17
    delay(3000);
18
    digitalWrite(2, LOW);
19
  }
20
21
  first = false;
22
  x_old = x_new;
23
  y_old = y_new;
24
  z_old = z_new;
25
}

: Bearbeitet durch User
von Flo D. (floflovaldo)


Lesenswert?

Meinst du etwas so?
1
int X = A0;
2
int Y = A1;
3
int Z = A2;
4
5
void setup()
6
{
7
  Serial.begin(9600);
8
  pinMode(2, OUTPUT);
9
  pinMode(5, INPUT); 
10
}
11
12
void loop()
13
{
14
  static bool first = false;
15
  static int x_old = 0;
16
  static int y_old = 0;
17
  static int z_old = 0;
18
  
19
  int x_new = analogRead(X);
20
  int y_new = analogRead(Y);
21
  int z_new = analogRead(Z);
22
 
23
  if((abs(x_new - x_old) > 10 || abs(y_new - y_old) > 10 || 
24
      abs(z_new - z_old) > 10) && first)
25
      first = true;
26
  {
27
    //first = true;
28
    digitalWrite(2, HIGH);
29
    delay(3000);
30
    digitalWrite(2, LOW);
31
  }
32
33
  x_old = x_new;
34
  y_old = y_new;
35
  z_old = z_new;
36
}

Weil so leuchtet jetzt dauerhaft die LED?

von Max H. (hartl192)


Lesenswert?

Florian D. schrieb:
> Meinst du etwas so?
> ..
> Weil so leuchtet jetzt dauerhaft die LED?
Dass das so nicht funktioniert sollte eigentlich klar sein.

von Flo D. (floflovaldo)


Lesenswert?

Jetzt funktioniert es so halb. Manchmal geht es. Manchmal blinkt die LED 
wie sie will.

von Flo D. (floflovaldo)


Lesenswert?

Tut mir leid. Aber mir ist das wirklich gerade nicht klar.

von Max H. (hartl192)


Lesenswert?

Florian D. schrieb:
> Jetzt funktioniert es so halb. Manchmal geht es. Manchmal blinkt die LED
> wie sie will.
Ist die Schwelle von 10 vllt. ein bisschen zu niedrig? Du könntest 
x_new, y_new und z_new per UART ausgeben um zu sehen ob das Programm 
wirklich reagieren sollte oder ob es ein Bug ist.

Florian D. schrieb:
> Tut mir leid. Aber mir ist das wirklich gerade nicht klar.
Dann solltest du in deinem C(++)-Buch mal nachschlagen wie die Syntax 
von if-Abfragen aussieht, z.B. welche Anweisungen nur bedingt ausgeführt 
werden wenn der if-Abfragen kein {folgt.

: Bearbeitet durch User
von Flo D. (floflovaldo)


Lesenswert?

Funktionieren tut es jetzt. Ich weiß nicht woran es lag auf jeden Fall 
hab ich es jetzt neu drauf und jetzt blinkt die LED genau immer im 3 
Sekunden Takt wie angegeben. Allerdings ohne Unterbrechung.

Nochmal zurück: Wieso sollte es klar sein das es so nicht funktioniert?

von Max H. (hartl192)


Lesenswert?

Florian D. schrieb:
> Allerdings ohne Unterbrechung.
Das schalten der LED hab ich aus deinem Code übernommen.
> Nochmal zurück: Wieso sollte es klar sein das es so nicht funktioniert?

Florian D. schrieb:
1
> if((abs(x_new - x_old) > 10 || abs(y_new - y_old) > 10 ||
2
>       abs(z_new - z_old) > 10) && first)
3
>       first = true; //[1]
4
>   {
5
>     //first = true;
6
>     digitalWrite(2, HIGH);
7
>     delay(3000);
8
>     digitalWrite(2, LOW);
9
>   }
Hier wird nur die mit [1] markierte Zeile Bedingt ausgeführt. Der Teil 
in den {}-Klammern immer, bei jedem durchlauf. Ein bisschen nachdenken 
sollte man beim Programmieren schon, und ja auch beim Arduino.

: Bearbeitet durch User
von Flo D. (floflovaldo)


Lesenswert?

Danke. Also ich habe es jetzt komplett hinter die if-Anweisung. 
Allerdings funktioniert es immer noch nicht bei jeder Beschleunigung. 
Sondern leider nur ab und zu. Kann das an diesem x_old, y_old und z_old 
liegen? Weil die immer aktualisiert werden? Und es deshalb nicht jedes 
mal funktioniert?

von Max H. (hartl192)


Lesenswert?

Florian D. schrieb:
> Allerdings funktioniert es immer noch nicht bei jeder Beschleunigung.
> Sondern leider nur ab und zu.
Hast du das mit dem Ausgeben der x_new, y_new und z_new per UART mal 
versucht?
> Kann das an diesem x_old, y_old und z_old
> liegen? Weil die immer aktualisiert werden?
Sollen sie das nicht. So wie ich es verstanden habe, soll die LED 
angehen, wenn sich eine Beschleunigung zwischen 2 Messungen betragsmäßig 
um mehr als 10 ändert?

: Bearbeitet durch User
von Flo D. (floflovaldo)


Lesenswert?

Ich erkläre das vielleicht nochmal anders: Das ganze steht ruhig da. 
Gibt allerdings trotzdem Werte aus. Diese Werte verändern sich trotzdem 
+-1. Sobald ich das Ganze dann in eine Richtung schiebe, hebe, 
beschleunigt es sich ja. Und genau bei dieser Beschleunigung soll die 
LED angehen. Ich habe es wie gesagt schon mit einer if-Abfrage eines 
festen Wertes versucht, allerdings kam dann ein komplett anderer Wert 
nach dem neu aufspielen und dann blinkte die LED ohne längere Zeit 
aufzuhören. Dies soll aber nicht passieren.

von Flo D. (floflovaldo)


Lesenswert?

Also es sollte quasi immer nur während einer Beschleunigung und das 
ganze zuverlässig auslösen. Das war immer das Problem.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.