Forum: Mikrocontroller und Digitale Elektronik Arduino Sketch komme nicht weiter


von Marcel T. (tauti1991)


Lesenswert?

Guten Tag
Habe mir diesen Sketch ( 
http://www.mpmab.com/private/projects/styled-12/styled-4/index.html ) 
zum Vorbild genommen.

Wollte aber nicht das der Ablauf einfach so losgeht, also wenn er vom 
Empfänger Strom bekommt, sondern über einen anderen Schalter der auch am 
RC-Empfänger ist

// RC-Maßstab
   int rc_pin = 2 ;
   Int rc_pin = 3 ;

2 ist dann für die Sound Veränderungen zuständig
3 soll jetzt denn Sketch starten U. auch ausschalten.

Wie könnte ich das umschreiben?


Erst die SD einlesen lassen bis : Serial . println ( "SD ok" );

Dann vielleicht mit pinMode u. digitalread (high, low) davor einsetzen, 
das ich es mit rc_pin 3 starten kann (Start. wav)

Dann weiter mit denn ersten Sound play  init. wav


O. Wie sonst?

: Verschoben durch Moderator
von Stefan F. (Gast)


Lesenswert?

Das ist aber extrem ungeschickt programmiert:
1
   43:     throttle = (duration - 700) / 16;
2
   44:  
3
   45:     //Set new throttle value
4
   46:     if(throttle <= 25){
5
   47:       currThrottle = 1;
6
   48:     };
7
   49:     if((throttle >= 25) && (throttle <= 50)){
8
   50:       currThrottle = 2;
9
   51:     };
10
   52:     if((throttle >= 50) && (throttle <= 75)){
11
   53:       currThrottle = 3;
12
   54:     };
13
   55:     if(throttle >= 75){
14
   56:       currThrottle = 4;
15
   57:     };

Denn bei den Werten 25, 50 und 75 treffen jeweils zwei Bedingungen zu. 
Ausserdem könnte man das so verkürzen:
1
currThrottle = 1+ (duration - 700) / 400

Und für den Code dahinter hätte ich switch/case verwendet, aber das ist 
Geschmacks-Sache.

Zu deiner Frage: Ich habe sie nicht verstanden, fürchte ich.

Dieser Sketch scheint vier unterschiedliche Sounds abzuspielen, je nach 
Einstellung des Steuerknüppels. Wenn du zusätzlich einen anderen 
Schalter von der Fernbedienung auswerten möchtest, musst den 
entsprechenden Ausgangskanal des Empfängers auswerten. Also brauchst du 
eine zweite Signal-Leitung zum Empfänger und einen zweiten Aufruf von 
pulseIn() mit der entsprechenden Pin-Nummer. Abhängig von dem Ergebnis 
könntest du dann den Rest des Programms ausführen. Etwa so:
1
int rc_pin = 2;
2
int rc_pin_button = 3;
3
...
4
5
void playsound()
6
{
7
   ... // hier kommt alles rein, was vorher in loop() war.
8
}
9
10
11
// neue loop:
12
13
void loop()
14
{  
15
    noInterrupts();
16
    duration = pulseIn(rc_pin_button, HIGH);
17
    interrupts();
18
19
    if (duration > 1800)
20
    {
21
        playsound();
22
    }
23
}

von Marcel T. (tauti1991)


Lesenswert?

Ja, der Code spielt 4 verschiedene Sounds ab bei 4 verschiedene Stellung 
des Knüppels.
Das wird alles über ein Kanal abgenommen

Ich möchte denn Code so abspielen dass der Code nicht nach ein paar Sec. 
automatisch startet sondern über einen anderen Kanal/Taster startet.
Der sollte ein Startsound abspielen U. Dann danach über die 
Knüppelstellung Sounds ausgeben.
Beim beenden des Codes soll am besten ein Endsound abspielen U. 
ausgehen.


Also soll der neue Kanal/Taster::
High : Startsound
Neutral : Knüppelstellung anderer Schalter
Low : Endsound

von Stefan F. (Gast)


Lesenswert?

Einen Ansatz dazu hast du ja jetzt. Nun musst du nur noch die 
Wiederholschleifen so anordnen, wie du es haben willst.

von G.Rundsätzlich (Gast)


Lesenswert?

Marcel T. schrieb:
> 3 soll jetzt denn Sketch starten U. auch ausschalten.

Der Code im Mikrocontroller läuft immer, solange er sich nicht im 
Sleep-State befindet. Das gilt damit auch für ein Programm, dass du als 
Arduino Sketch draufgespielt hast.

von Marcel T. (tauti1991)


Lesenswert?

Also wenn ich das richtig verstanden habe

Das es nicht automatiach Startet muss ich einsetzen:
1
void loop()
2
{  
3
    noInterrupts();
4
    duration = pulseIn(rc_pin_button, HIGH);
5
    interrupts();
6
7
    if (duration > 1800)
8
    {
9
        playsound(); start.wav
10
    }
11
}
Das ich es über denn Schalter wieder ausschalten kann
1
void loop()
2
{  
3
    noInterrupts();
4
    duration = pulseIn(rc_pin_button, LOW);
5
    interrupts();
6
7
    if (duration > 1800)
8
    {
9
        playsound(); stop.wav
10
    }
11
}

: Bearbeitet durch Moderator
von Stefan F. (Gast)


Lesenswert?

Ich glaube, du solltest erst die Grundlagen der Programmiersprache C 
anhand eines Tutorials lernen und dann dass bisschen C++ das Arduino 
verwendet.

Sonst fehlt und hier die gemeinsame Sprache, auf der wir aufbauen 
können.

von Marcel T. (tauti1991)


Lesenswert?

Naja ganz Unwissen bin ich nicht.

Kann bis jetzt Licht steuern o. a einzelne Töne abspielen

Aber mit Sounds abspielen die mit verschiedene Schaltstellungen 
funktionieren kenne ich mich net so gut aus

Wo kann man so ein Tutorial anschauen?

von Stefan F. (Gast)


Lesenswert?

> Wo kann man so ein Tutorial anschauen?

Du hast selbst ein Beispielprogramm herausgesucht, welches mit 
pulseIn(pin,HIGH) die Position der Steuerknüppel ausliest und abhängig 
davon unterschiedliche Sound-Files mit tmrpcm.play(dateiname) abspielt.

Dazu kann ich Dir noch sagen, dass die Pulse vom Fernsteuer-Empfänger 
normalerweise zwischen 1000 und 2000 Millisekunden lang sind. Wobei 1500 
als optimaler Mittelwert festgelegt ist. In der Realität weichen die 
Steuerknüppel immer ein bisschen davon ab, deswegen kann man das an den 
meisten Fernbedienungen fein-justieren.

Bei Schaltern und Tastern erzeugen die Fernbedienungen einfach kurze 
Impulse (<1500ms) für "aus" und lange Impulse (>1500ms) für "an".

Eventuell willst du noch die Funktion millis() verwenden, um Zeiten zu 
messen oder um Dinge erst nach Ablauf einer gewissen Zeit zu machen.

Mit Serial.println(text) kannst du Debug-Meldungen ausgeben.

Damit hast du alles, was du brauchst. Der Rest ist C und ein 
klitze-kleines bisschen von C++. Wobei der C++ Anteil einfach und 
offensichtlich ist, dass du für dieses Projekt keine C++ Anleitung 
benötigst. ( Serial.println("Hallo") ist bereits C++ Ausdruck ).

Das von Dir gesuchte Tutorial hast du somit direkt vor der Nase. Wenn du 
das noch nicht verstehst, dann musst du entweder die Programmiersprache 
erlernen (kann ich schlecht einschätzen) oder erst einmal mit 
einfacheren Aufgaben üben. Typischerweise fängt man damit an, eine LED 
blinken zu lassen. Als nächsten Schritt könntest du versuchen, die 
beiden Kanäle vom R/C Empfänger mit pulseIn(pin,HIGH) einzulesen und den 
gemessenen Wert (das sind die Millisekunden) als Debug Meldung 
auszugeben. Als drittes spielst du einen Sound ab, wenn ein R/C Kanal 
einen Wert >1700 liefert.

Taste Dich langsam Schritt für Schritt bis zum Ziel vor. Es ist keine 
Schande, wenn man fremde Programme nicht versteht. Diese zu verändert 
macht vorher allerdings keinen Sinn. Da ist es oft einfacher, ein 
eigenes Programm aufzubauen und nur kleine Details vom fremden Programm 
abzugucken.

von Marcel T. (tauti1991)


Lesenswert?

Hallo,
so habe jetzt mich viel belesen u. einen Sketch 
geschreiben/umgearbeitet.
aber leider spielt er aber es immer noch nicht richtig ab.

Der abstell.wav wird richtig abgespielt, immer wenn ich dem Sender aus 
mache.
der anlass.wav wird nur einmal abgespielt, wenn ich denn Empfänger an 
mache, also hat nix mit denn Sender zutun.
wenn ich es zum zweiten mal anschalte spielt er sofort die 1.wav ab.

wie kann ich das umschreiben das die anlass.wav auch immer beim 
anschalten des Senders angeht u. danach dann erst 1.wav abspielt?

Mir wurde aber auch noch besser gefallen das ich anlass u. abstell.wav 
über einen anderen Schalter ein u. ausschalten kann.
Geht das auch?

Sketch:
1
#include <SD.h>                      // need to include the SD library
2
#define SD_ChipSelectPin 4  //using digital pin 4 on arduino nano 328, can use other pins
3
#include <TMRpcm.h>           //  also need to include this library...
4
#include <SPI.h>
5
6
TMRpcm tmrpcm;   // create an object for use in this sketch
7
8
unsigned long time = 0;
9
int numLoop = 0;
10
int throttle = 0;
11
int prevThrottle = 0;
12
int currThrottle = 0;
13
int playingSound = 0;
14
15
//RC scale
16
int rc_pin = 2;
17
unsigned long duration;
18
unsigned long prevDuration;
19
20
21
void setup() {
22
  tmrpcm.speakerPin = 9; //5,6,11 or 46 on Mega, 9 on Uno, Nano, etc
23
  Serial.begin(9600);
24
  if (!SD.begin(SD_ChipSelectPin)) {  
25
    Serial.println("SD fail");
26
    return;   // don't do anything more if not
27
  }
28
  else {
29
    Serial.println("SD ok");
30
  }
31
  //PLay init file to tell sound version
32
  Serial.println("anlass.wav");
33
  tmrpcm.play("anlass.wav");
34
  while (tmrpcm.isPlaying()) {
35
    delay(2000);
36
  };
37
  Serial.println("setup end");
38
}
39
40
void loop() {
41
42
  //Read throttel value
43
  ++numLoop;
44
  if (numLoop == 30000) {
45
    noInterrupts();
46
    duration = pulseIn(rc_pin, HIGH);
47
    interrupts();
48
49
    numLoop = 0;
50
    Serial.println(currThrottle);
51
    //Set new throttle value
52
53
    if (duration <= 990) {
54
      currThrottle = 0;
55
    };
56
    if ((duration > 990) && (duration <= 1050)) {
57
      currThrottle = 1;
58
    };
59
    if ((duration > 1050) && (duration <= 1167)) {
60
      currThrottle = 2;
61
    };
62
    if ((duration > 1167) && (duration <= 1332)) {
63
      currThrottle = 3;
64
    };
65
    if ((duration > 1332) && (duration <= 1498)) {
66
      currThrottle = 4;
67
    };
68
    if ((duration > 1498) && (duration <= 1664)) {
69
      currThrottle = 5;
70
    };
71
    if ((duration > 1664) && (duration <= 1830)) {
72
      currThrottle = 6;
73
    };
74
    if (duration > 1830) {
75
      currThrottle = 7;
76
    };
77
78
    //If currThrottle != prevThrottle set start playing new file
79
    if (currThrottle != prevThrottle) {
80
81
      if ((currThrottle == 0) && (prevThrottle > 0)) {
82
        tmrpcm.play("abstell.wav");
83
        Serial.println("abstell.wav)");
84
        while (tmrpcm.isPlaying()) {}
85
        prevThrottle = currThrottle;
86
      }
87
      if (currThrottle == 1) {
88
        if (currThrottle > prevThrottle) {
89
          tmrpcm.play("anlass.wav");
90
          Serial.println("anlass.wav");
91
          while (tmrpcm.isPlaying()) {}
92
        }
93
        playingSound = 1;
94
        prevThrottle = currThrottle;
95
      }
96
      if (currThrottle == 2) {
97
        tmrpcm.play("1.wav");
98
        Serial.println("1.wav");
99
        prevThrottle = currThrottle;
100
        playingSound = 1;
101
      }
102
      if (currThrottle == 3) {
103
        tmrpcm.play("2.wav");
104
        Serial.println("2.wav");
105
        prevThrottle = currThrottle;
106
        playingSound = 2;
107
      }
108
      if (currThrottle == 4) {
109
        tmrpcm.play("3.wav");
110
        Serial.println("3.wav");
111
        prevThrottle = currThrottle;
112
        playingSound = 3;
113
      }
114
      if (currThrottle == 5) {
115
        tmrpcm.play("4.wav");
116
        Serial.println("4.wav");
117
        prevThrottle = currThrottle;
118
        playingSound = 4;
119
      }
120
      if (currThrottle == 6) {
121
        tmrpcm.play("5.wav");
122
        Serial.println("5.wav");
123
        prevThrottle = currThrottle;
124
        playingSound = 5;
125
      }
126
      if (currThrottle == 7) {
127
        tmrpcm.play("6.wav");
128
        Serial.println("6.wav");
129
        prevThrottle = currThrottle;
130
        playingSound = 6;
131
      }
132
    }
133
 
134
    if ((currThrottle = prevThrottle) && (tmrpcm.isPlaying() == 0)) {
135
136
      if (playingSound == 1) {
137
        tmrpcm.play("1.wav");
138
        Serial.println("again 1.wav");
139
        prevThrottle = currThrottle;
140
      }
141
      if (playingSound == 2) {
142
        tmrpcm.play("2.wav");
143
        Serial.println("again 2.wav");
144
        prevThrottle = currThrottle;
145
      }
146
      if (playingSound == 3) {
147
        tmrpcm.play("3.wav");
148
        Serial.println("again 3.wav");
149
        prevThrottle = currThrottle;
150
      }
151
      if (playingSound == 4) {
152
        tmrpcm.play("4.wav");
153
        Serial.println("again 4.wav");
154
        prevThrottle = currThrottle;
155
      }
156
      if (playingSound == 5) {
157
        tmrpcm.play("5.wav");
158
        Serial.println("again 5.wav");
159
        prevThrottle = currThrottle;
160
      }
161
      if (playingSound == 6) {
162
        tmrpcm.play("6.wav");
163
        Serial.println("again 6.wav");
164
        prevThrottle = currThrottle;
165
      }
166
    }
167
  }
168
}

[Mod: bitte nachfolgenden Post beachten!]

: Bearbeitet durch Moderator
von Erklehr Behr (Gast)


Angehängte Dateien:

Lesenswert?

Marcel T. schrieb:
> Sketch:

Jetzt geht das wieder los!

Kannst du lesen? Dann bitte handle danach was du hier
zu lesen bekommst.

von Stefan F. (Gast)


Lesenswert?

Marcel T. schrieb:
> so habe jetzt mich viel belesen u. einen Sketch
> geschreiben/umgearbeitet

In der kurzen Zeit: kann nicht sein. "viel" ist für mich was anderes.

Finde heraus, welches Signal der Empfänger beim Einschalten des Senders 
liefert. Dafür wirst du wohl einen Logic Analyzer benötiegn.

Aber wundere dich nicht, wenn ein anderer Sender oder Empfänger sich an 
diesem Punkt ganz anders verhält. Beim Modellbau soll man immer zuerst 
den Sender und dann den Empfänger einschalten. Die umgekehrte 
Reihenfolge führt in der regel zu undefiniertem Verhalten.

von Marcel T. (tauti1991)


Lesenswert?

Endschuldigung das ich denn Sketch nicht so eingefügt habe.

Würde denn Sketch jetzt so gerne beibehalten.

Aber würde nur gerne um einen zweiten Schalter erweitern der:
HIGH Hupe 1
LOW  Hupe 2 abpielt

Wie muss ich das schreiben das beide am gleichen Lautsprecher 
funktionieren?

Muss dass dann so glöst werden wie hier beschreiben:
https://funduino.de/25-der-interrupt-befehl-attachinterrupt


mit denn void playsound funktioniert es bei mir nicht (wird auch nicht 
farbig) muss ich da erst was runter laden?

: Bearbeitet durch User
von Stefan F. (Gast)


Lesenswert?

Hier wird Dir niemand ein fertiges Programm liefern.

Die Funktion attachInterrupt() ist der völlig falsche Weg. Ich dachte es 
sei längst klar, dass du die Signale der Fernsteuerung mit 
pulseIn(pin,HIGH) erfassen kannst.

Alles, was du brauchst, hast du bereits vorliegen. Du musst die Befehle 
nur wie gewünscht kombinieren.

Das playsound() nicht mehr funktioniert finde ich gelinde gesagt 
überraschend. Da frage ich mich schon, was du die ganze zeit vorher 
gemacht hast.

Auf meine Hilfestellungen bis du soweit ich das sehen kann gar nicht 
eingegangen und deine wirre Aufgabenbeschreibung hast du mit jedem 
einzelnen Beitrag durch noch mehr verwirrenden Text weiter verwaschen. 
Ich denke, da ist schon die Ursache des Problems. Um Software zu 
entwickeln, muss man einen klaren Kopf behalten:

- Die Aufgabe aus Benutzer-Sicht beschreiben, und zwar eindeutig 
unmissverständlich.
- Die gegebenen Voraussetzungen erfassen
- Ein technisches Lösungskonzept erstellen
- Das Lösungskonzept in kleine überschaubare Arbeitspakete zerlegen
- Die aktuellen Mittel erfassen, die zur Lösung bereit stehen.
- Die fehlenden Mittel erfassen und beschaffen (kann auch Know-How 
betreffen)
- Erst danach kann man mit der Programmierung (dem Schreiben des 
Quelltextes) beginnen.

Ich denke, das hast du einfach (noch) nicht drauf. Ich kann es Dir im 
Rahmen dieses Forums nicht beibringen. So oder so bist du jetzt an der 
Reihe. Entweder entwickelst du das selbst oder suchst Dir ein anderes 
Hobby.

von Marcel T. (tauti1991)


Lesenswert?

Wollte damit sagen das was hier oben steht nicht funktioniert.

Wenn ich alles was jetzt im void loop steht in void playsound kopiere u. 
Dann so void loop schreibe spielt er nix mehr ab

Wenn es so gehen würde könnte ich denn 2 Schalter ja gleich schreiben 
wie denn ersten aber nur mit andere U. weniger Sounds.
Der Schalter für die Hupe hat ja nur 3 Stellungen. Ein, aus, ein

c]C-Code[/c
Int rc_pin = 2;
int rc_pin_button = 3;
...

void playsound()
{
   ... // hier kommt alles rein, was vorher in loop() war.
}


// neue loop:

void loop()
{
    noInterrupts();
    duration = pulseIn(rc_pin, HIGH);
    interrupts();

    if (duration > 1800)
    {
        playsound();
    }
}

von Marcel T. (tauti1991)


Lesenswert?

Kann ich überhaupt 2 Befehle über einen Ausgang schalten?
Da ja jetzt 2 Schalter [PIN 2,3] eingelesen werden U. nur einen Ausgang 
[PIN9] gibt.

O. Muss ich jetzt auch 2 Ausgänge haben, 2Signalleitungen an PIN9| 
Lautsprecher.

von Erklehr Behr (Gast)


Lesenswert?

Marcel T. schrieb:
> c]C-Code[/c

Da ist Hopfen und Malz verloren.

Beitrag #5687168 wurde von einem Moderator gelöscht.
Beitrag #5687188 wurde von einem Moderator gelöscht.
von Marcel T. (tauti1991)


Lesenswert?

Nicht meinen Beitrag löschen
Sondern alles hier bitte löschen.

Kann ich mich auch richtig hier abmelden?
Mein Namen usw.

Bringt mir nix hier.

c]C-Code[/c
Wollte damit alles in ein Code umwandeln

Beitrag #5687237 wurde von einem Moderator gelöscht.
von Erklehr Behr (Gast)


Lesenswert?

Marcel T. schrieb:
> Bringt mir nix hier.

Ja vielleicht bist du hier wirklich am falschen Ort.
Zumindest zur falschen Zeit. Lerne vernünftig und wir
sehen uns in zwei Jahren wieder.

Beitrag #5687244 wurde von einem Moderator gelöscht.
Beitrag #5687271 wurde von einem Moderator gelöscht.
Beitrag #5687392 wurde von einem Moderator gelöscht.
von Stefan F. (Gast)


Lesenswert?

Welche Werte liefert denn pusleIn() für die möglichen 
Schlater-Positionen an der Fernbedienung? Davon hängt alles Weitere ab.

Das habe ich weiter oben schon einmal geschrieben - mit anderen Worten.

> Kann ich überhaupt 2 Befehle über einen Ausgang schalten?
> Da ja jetzt 2 Schalter [PIN 2,3] eingelesen werden U. nur einen Ausgang
> [PIN9] gibt.
> O. Muss ich jetzt auch 2 Ausgänge haben, 2Signalleitungen an PIN9|
> Lautsprecher.

Wenn du mich total anhängen wolltest, ist Dir das hiermit gelungen. Das 
versteht kein normaler Mensch. Ich kann Dir nicht mehr helfen.

von Marcel T. (tauti1991)


Lesenswert?

Mit denn letzten meine ich:

Kann ich überhaupt 2 Befehle über einen Ausgang schalten.

Habe jetzt 2 schalter die ich einlesen möchte.
Heißt möchte denn Sketch um ein Schalter erweitern, (int rc_pin_horn=3:)

Kann ich 2 Schalter (PIN2 und PIN3) über ein Ausgangssignal (PIN9) 
ausgeben?
Heißt 2Töne gleichzeitig  (Töne kommen von PIN2 und PIN3) auf einen 
LAutsprecher ausgeben (PIN9) o. muss ich da dann noch ein Kabel an denn 
LAutsprecher anschließen o. braucht man dann 2 Lautsprecher.
Um 2 Töne von 2 verschiedenen Schalter zu erzeugen


Die Werte sind die gleichen wie in denn Sketch.
Brauche aber nur -
- Mittelwert - 1500       - keinen Ton abspielen
- oben       - 1830-2000  - horn1.wav
- unten      - 0-500      - horn2. wav

Wollte die genauen werde auch über einen seriellen Monitor auslesen mit 
IDE 1.8.8.
kann zwar über Werkzeuge das Programm öffnen, aber weiß bis jetzt nicht 
weiter

von Marcel T. (tauti1991)


Lesenswert?

aber wenn ich jetzt in denn Sketch pulseIn(rc_pin_horn) erweitere und 
die gleichen werde unten lassen will, gibt er nix mehr richtig aus o. 
geht fast nix mehr wenn ich es hoch lade.

Muss ja denn Schalter einlesen mit pulseIn und dann die werte danach 
brauche ich auch nur andere Sounds soll jetzt der neue Schalter 
abspielen
1
void loop() {
2
3
  //Read throttel value
4
  ++numLoop;
5
  if (numLoop == 30000) {
6
    noInterrupts();
7
    duration = pulseIn(rc_pin, HIGH);
8
    duration2 = pulseIN(rc_pin_horn, HIGH); // erweitert für Horn/Hupe
9
    interrupts();
10
11
    numLoop = 0;
12
    Serial.println(currThrottle);
13
    //Set new throttle value
14
15
    if (duration <= 990) {
16
      currThrottle = 0;
17
    };
18
    if (duration > 990) {
19
    currThrottle = 1;
20
  };
21
  if ((duration > 1050) && (duration <= 1167))
22
     ((duration2 > 1050) && (duration2 <= 1167)){
23
    currThrottle = 2;
24
    currThrottle2 = 2;
25
  };
26
  if ((duration > 1167) && (duration <= 1332)) {
27
    currThrottle = 3;
28
  };
29
  if ((duration > 1332) && (duration <= 1498))
30
     ((duration2> 1332) && (duration2 <=1498)) {
31
    currThrottle = 4;
32
    currThrottle2 = 4;
33
  };
34
  if ((duration > 1498) && (duration <= 1664)) {
35
    currThrottle = 5;
36
  };
37
  if ((duration > 1664) && (duration <= 1830)) 
38
     ((duration2 >1664) && (duration2 <= 1830)){
39
    currThrottle = 6;
40
    currThrottle = 6;
41
  };
42
  if (duration > 1830) {
43
    currThrottle = 7;
44
  };

Auch Töne geht jetzt nicht einfach zu erweitern da ich ja trotzdem denn 
neuen schalter einlesen muss. (pulseIn und werte)

Komme einfach nicht weiter, um denn Sketch um einen Schalter mit 
WAV.daten zu erweitern.

von Dieter F. (Gast)


Lesenswert?

Marcel T. schrieb:
> Bringt mir nix hier.

Stimmt.

> c]C-Code[/c
> Wollte damit alles in ein Code umwandeln

Bist Du Zauberer? Oder meintest Du Kot? :-)


Mal im Ernst:

Wage Dich langsam an die Arduino-Programmierung heran. Tutorials gibt es 
"ohne Ende". Dann kannst Du irgendwann Dein Projekt umsetzen.

Wenn Du ein Programm sinnfrei mit einem anderen Programm mischt kommt 
nichts verwertbares heraus. Hier wird Dir das niemand zusammenflicken.

Also: Eigne Dir die Grundlagen an und stelle dann vernünftige Fragen.

von Marcel T. (tauti1991)


Lesenswert?

Möchte mir sowas nachbauen
https://www.youtube.com/watch?v=D-_IvxzKwkg

denn Sketch kann man da in einen Polnischen Forum runterladen aber, 
kabiere nicht wo die Soundtaten sind?

von Dieter F. (Gast)


Lesenswert?

Marcel T. schrieb:
> Möchte mir sowas nachbauen
> Youtube-Video "RC Ship Sound module version  1.5 sounds the diesel boat
> engine sound an fog horn."

Und ich möchte zum Mond fliegen :-)

von Stefan F. (Gast)


Lesenswert?

Marcel T. schrieb:
> Read throttel value

Ich sag jetzt mal besser nicht, was mir gerade durch den Kopf ging. Es 
war jedenfalls ein (für mich) lustiger flotter Spruch.

Sag mal, hast du unsere Antworten überhaupt verstanden, oder führst du 
hier einen Monolog?

von Marcel T. (tauti1991)


Lesenswert?

Dieter F. schrieb
> Und ich möchte zum Mond fliegen :-)

Klar habe ich alle Antworten gelesen
Sind alle sehr hilfreich

von Stefan F. (Gast)


Lesenswert?

Marcel T. schrieb:
> Klar habe ich alle Antworten gelesen, Sind alle sehr hilfreich

Die Frage war, ob du sie verstanden hast. Ich habe nicht das Gefühl, 
denn du hast fast nichts davon umgesetzt und keine Rückfrage 
beantwortet.

von Marcel T. (tauti1991)


Lesenswert?

Welche Rückfragen noch?

pulsIn habe ich gelesen das man es nur einmal nutzen kann U. Sonst alles 
blockiert.

Alles, außer das mit denn Viod soundplay das ich alles was jetzt in loop 
steht darein kopieren soll.
Aber dann geht der Skeh nicht mehr.

von Stefan F. (Gast)


Lesenswert?

Es hat keinen Sinn. Ist nicht böse gemeint, aber dieser Thread hier 
verläuft hoffnungslos.

von Marcel T. (tauti1991)


Lesenswert?

Kann man nicht mit diesen Befehle einen zusätzlichen PIN auslesen und 
einfügen:
attachInterrupt: 
https://funduino.de/25-der-interrupt-befehl-attachinterrupt
PinChanceInderupt:

Der Arduino Nano hatt doch 2 PINS (2,3) wo mann Inderupt ausfüren kann.
Kann man nicht damit ein Inderupt/pulsIn kurz unterbrechen u. dann da 
denn Hupe/Horn Sound einfügen??



Wollte es jetzt so ungefähr lösen, aber leider spelt er jetzt nix ab

Meine Idee wäre mit 2 Interrupt befehle die ich einmal für RC_PIN 
schreibe und eins für RC_PIN_HORN schreibe
Mit attachInterrupt(digitalPinToInterrupt(rc_pin), playsound, CHANGE); 
wollte ich sie dann aufrufen.



1
#define RC_PIN_INTERRUPT // INTERRUPT 0 = DIGITAL PIN 2 - use the interrupt number in attachInterrupt
2
#define HORN_PIN_INTERRUPT // INTERRUPT 1 = DIGITAL PIN 3 - use the interrupt number in attachInterrupt
3
#define RC_PIN 2      // RC Throttle input pin
4
#define RC_PIN_HORN 3        // RC Horn input pin
5
#include <SD.h>                      // need to include the SD library
6
#define SD_ChipSelectPin 4  //using digital pin 4 on arduino nano 328, can use other pins
7
#include <TMRpcm.h>           //  also need to include this library...
8
#include <SPI.h>
9
10
TMRpcm tmrpcm;   // create an object for use in this sketch
11
12
unsigned long time = 0;
13
int numLoop = 0;
14
int throttle = 0;
15
int prevThrottle = 0;
16
int currThrottle = 0;
17
int playingSound = 0;
18
19
//RC scale
20
int rc_pin = 2;
21
int rc_pin_horn = 3;
22
unsigned long duration;
23
unsigned long prevDuration;
24
25
26
void setup() {
27
  tmrpcm.speakerPin = 9; //5,6,11 or 46 on Mega, 9 on Uno, Nano, etc
28
  Serial.begin(9600);
29
  pinMode(rc_pin, INPUT);
30
  pinMode(rc_pin_horn, INPUT);
31
  attachInterrupt(digitalPinToInterrupt(rc_pin), playsound, CHANGE);
32
  attachInterrupt(digitalPinToInterrupt(rc_pin_horn), playhorn, CHANGE);
33
  if (!SD.begin(SD_ChipSelectPin)) {  // see if the card is present and can be initialized:
34
    Serial.println("SD fail");
35
    return;   // don't do anything more if not
36
  }
37
  else {
38
    Serial.println("SD ok");
39
  }
40
  //PLay init file to tell sound version
41
  Serial.println("anlass.raw");
42
  tmrpcm.play("anlass.raw");
43
  while (tmrpcm.isPlaying()) {
44
    delay(2000);
45
  };
46
  Serial.println("setup end");
47
  
48
}
49
50
void loop() {
51
  
52
}
53
void playhorn () {
54
//Alles was dann das Horn abspielen soll
55
}
56
void playsound () {
57
//Alles was dann der RC_PIN abspielen soll
58
  ++numLoop;
59
  if (numLoop == 30000) {
60
    noInterrupts();
61
    duration = pulseIn(rc_pin, HIGH);
62
    interrupts();
63
64
    numLoop = 0;
65
    Serial.println(currThrottle);
66
    //Set new throttle value
67
68
    if (duration <= 990) {
69
      currThrottle = 0;
70
    };
71
    if (duration > 990) {
72
    currThrottle = 1;
73
  };
74
  if ((duration > 1050) && (duration <= 1167)) {
75
    currThrottle = 2;
76
  };
77
  if ((duration > 1167) && (duration <= 1332)) {
78
    currThrottle = 3;
79
  };
80
  if ((duration > 1332) && (duration <= 1498)) {
81
    currThrottle = 4;
82
  };
83
  if ((duration > 1498) && (duration <= 1664)) {
84
    currThrottle = 5;
85
  };
86
  if ((duration > 1664) && (duration <= 1830)) {
87
    currThrottle = 6;
88
  };
89
  if (duration > 1830) {
90
    currThrottle = 7;
91
  };
92
93
  //If currThrottle != prevThrottle set start playing new file
94
  if (currThrottle != prevThrottle) {
95
96
    if ((currThrottle == 0) && (prevThrottle > 0)) {
97
        tmrpcm.play("abstell.raw");
98
        Serial.println("abstell.raw)");
99
        while (tmrpcm.isPlaying()) {}
100
        prevThrottle = currThrottle;
101
      }
102
      if (currThrottle == 1) {
103
        if (currThrottle > prevThrottle) {
104
          tmrpcm.play("anlass.raw");
105
          Serial.println("anlass.raw");
106
          while (tmrpcm.isPlaying()) {}
107
        }
108
        playingSound = 1;
109
        prevThrottle = currThrottle;
110
      }
111
      if (currThrottle == 2) {
112
        tmrpcm.play("1.raw");
113
        Serial.println("1.raw");
114
        prevThrottle = currThrottle;
115
        playingSound = 1;
116
      }
117
      if (currThrottle == 3) {
118
        tmrpcm.play("2.raw");
119
        Serial.println("2.raw");
120
        prevThrottle = currThrottle;
121
        playingSound = 2;
122
      }
123
      if (currThrottle == 4) {
124
        tmrpcm.play("stand.raw");
125
        Serial.println("stand.raw");
126
        prevThrottle = currThrottle;
127
        playingSound = 3;
128
      }
129
      if (currThrottle == 5) {
130
        tmrpcm.play("stand.raw");
131
        Serial.println("stand.raw");
132
        prevThrottle = currThrottle;
133
        playingSound = 4;
134
      }
135
      if (currThrottle == 6) {
136
        tmrpcm.play("5.raw");
137
        Serial.println("5.raw");
138
        prevThrottle = currThrottle;
139
        playingSound = 5;
140
      }
141
      if (currThrottle == 7) {
142
        tmrpcm.play("6.raw");
143
        Serial.println("6.raw");
144
        prevThrottle = currThrottle;
145
        playingSound = 6;
146
      }
147
    }
148
    // Serial.println(tmrpcm.isPlaying());
149
    if ((currThrottle = prevThrottle) && (tmrpcm.isPlaying() == 0)) {
150
151
    if (playingSound == 1) {
152
        tmrpcm.play("1.raw");
153
        Serial.println("again 1.raw");
154
        prevThrottle = currThrottle;
155
      }
156
      if (playingSound == 2) {
157
        tmrpcm.play("2.raw");
158
        Serial.println("again 2.raw");
159
        prevThrottle = currThrottle;
160
      }
161
      if (playingSound == 3) {
162
        tmrpcm.play("stand.raw");
163
        Serial.println("again stand.raw");
164
        prevThrottle = currThrottle;
165
      }
166
      if (playingSound == 4) {
167
        tmrpcm.play("stand.raw");
168
        Serial.println("again stand.raw");
169
        prevThrottle = currThrottle;
170
      }
171
      if (playingSound == 5) {
172
        tmrpcm.play("5.raw");
173
        Serial.println("again 5.raw");
174
        prevThrottle = currThrottle;
175
      }
176
      if (playingSound == 6) {
177
        tmrpcm.play("6.raw");
178
        Serial.println("again 6.raw");
179
        prevThrottle = currThrottle;
180
      }
181
    }
182
  }
183
}

von Joachim B. (jar)


Lesenswert?

Marcel T. schrieb:
> Kann man nicht mit

was genau hast du hier nicht verstanden?
Beitrag "Re: Arduino Sketch komme nicht weiter"

von Marcel T. (tauti1991)


Lesenswert?

Oh, kann ich das noch ändern?

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.