Arduino und Purebasic Sound wiedergabe

Anfängerfragen zum Programmieren mit PureBasic.
Benutzeravatar
mk-soft
Beiträge: 3855
Registriert: 24.11.2004 13:12
Wohnort: Germany

Re: Arduino und Purebasic Sound wiedergabe

Beitrag von mk-soft »

Wer hat den Arduino programmiert. Du selber?
Alles ist möglich, fragt sich nur wie...
Projekte ThreadToGUI / EventDesigner V3 / OOP-BaseClass-Modul
Downloads auf MyWebspace / OneDrive
druckernrw
Beiträge: 13
Registriert: 27.12.2022 22:52
Computerausstattung: er ist beige
Wohnort: Halle Westf

Re: Arduino und Purebasic Sound wiedergabe

Beitrag von druckernrw »

Ja das programm hab ich gemacht. Es gibt da so hübsche hilfsmittel wie ardublock mit dem man bausteine zusammensetzt und sich so ein code schreibt. Läuft und macht was es soll.
Benutzeravatar
jacdelad
Beiträge: 404
Registriert: 03.02.2021 13:39
Wohnort: Riesa
Kontaktdaten:

Re: Arduino und Purebasic Sound wiedergabe

Beitrag von jacdelad »

So, der Code probiert alle Verbindungsvarianten an COM11 mit 9600 bps durch:

Code: Alles auswählen

Dim Parity.l(4)
Dim Bits.b(1)
Dim StoppBits.f(2)
Dim Handshake.l(3)
Parity(0)=#PB_SerialPort_NoParity
Parity(1)=#PB_SerialPort_EvenParity
Parity(2)=#PB_SerialPort_MarkParity
Parity(3)=#PB_SerialPort_OddParity
Parity(4)=#PB_SerialPort_SpaceParity
Bits(0)=7
Bits(1)=8
StoppBits(0)=1
StoppBits(1)=1.5
StoppBits(2)=2
Handshake(0)=#PB_SerialPort_NoHandshake
Handshake(1)=#PB_SerialPort_RtsHandshake
Handshake(2)=#PB_SerialPort_RtsCtsHandshake
Handshake(3)=#PB_SerialPort_XonXoffHandshake

OpenConsole("Serial Port Test")

For loop1=0 To 4
  For loop2=0 To 1
    For loop3=0 To 2
      For loop4=0 To 3
        OpenSerialPort(0,"COM11",9600,Parity(loop1),Bits(loop2),StoppBits(loop3),Handshake(loop4),1024,1024)
        If IsSerialPort(0)
          Break 4
        EndIf
      Next
    Next
  Next
Next

If IsSerialPort(0)
  PrintN("Verbindung hergestellt!")
  *puffer=AllocateMemory(1024,#PB_Memory_NoClear)
  Repeat
    While AvailableSerialPortInput(0)
      BytesRead=ReadSerialPortData(0,*puffer,1024)
      If BytesRead
        For iLoop=0 To BytesRead-1
          PrintN(Str(PeekL(*puffer)))
        Next
      EndIf
    Wend
    Delay(1000)
  ForEver
Else
  PrintN("Keine Verbindung!")
EndIf
Input()
Kriegst du da eine Verbindung (unabhängig davon, was dann für Daten empfangen werden oder auch nicht)?
Guten Morgen, das ist ein schöner Tnetennba!

PureBasic 6.21/Windows 11 x64/Ryzen 7900X/32GB RAM/3 TB SSD
Synology DS1821+/DX517, 130.9TB+50.8TB+2TB SSD
druckernrw
Beiträge: 13
Registriert: 27.12.2022 22:52
Computerausstattung: er ist beige
Wohnort: Halle Westf

Re: Arduino und Purebasic Sound wiedergabe

Beitrag von druckernrw »

erstmal danke danke das ihr euch da auch gedanken macht.
Hmm, verbinden kann ich es damit. Es dauert ca 20 sek bis da ein paar zahlen ankommen.
dann zeigt er aber andere zahlen an. /:->
Hab es auch noch mit anderen Geschwindigkeiten wie 19200 versucht aber ist genauso.

352980272
352980272
352980272
352980272
352980272
352980272
352980272

da sollten eigentlich zahlen
40000
41250
41500... kommen. immer mit neuer zeile. so zeigt es mir die Arduino ide auch im seriellen monitor an.

Hab es mal mit einem Terminal Programm gecheckt. "Com11, 19200, parity keine, stop bit 1, Bits 8". Damit kommt das richtige an.
Benutzeravatar
jacdelad
Beiträge: 404
Registriert: 03.02.2021 13:39
Wohnort: Riesa
Kontaktdaten:

Re: Arduino und Purebasic Sound wiedergabe

Beitrag von jacdelad »

Dann hast du aber schon mal Schritt eins geschafft: Du hast ihn verbunden.
Bei den Zahlen die kommen kann ich nicht wirklich helfen, solange wir nicht wissen, in welchem Format sie kommen. Sieht mir aber irgendwie nach LongInt aus. Aber vielleicht ist es ein Statuscode und noch nicht die Frequenz.
Guten Morgen, das ist ein schöner Tnetennba!

PureBasic 6.21/Windows 11 x64/Ryzen 7900X/32GB RAM/3 TB SSD
Synology DS1821+/DX517, 130.9TB+50.8TB+2TB SSD
Benutzeravatar
HeX0R
Beiträge: 3042
Registriert: 10.09.2004 09:59
Computerausstattung: AMD Ryzen 7 5800X
96Gig Ram
NVIDIA GEFORCE RTX 3060TI/8Gig
Win11 64Bit
G19 Tastatur
2x 24" + 1x27" Monitore
Glorious O Wireless Maus
PB 3.x-PB 6.x
Oculus Quest 2 + 3
Kontaktdaten:

Re: Arduino und Purebasic Sound wiedergabe

Beitrag von HeX0R »

Wenn das Terminal das richtig anzeigt, kommt es wohl als Ascii Zeichen.
Du hast jetzt die korrekten Bedingungen (Com11, 19200, parity keine, stop bit 1, Bits 8 ), kann ja jetzt nicht so schwer sein, damit zu arbeiten.

Hier mal nen kleines Testgerüst

Code: Alles auswählen

OpenConsole("Serial Port Test")
If OpenSerialPort(0, "COM11", 19200, #PB_SerialPort_NoParity, 8, 1, #PB_SerialPort_NoHandshake, 1024, 1024)
	*Buffer = AllocateMemory(1024)
	PrintN("Press ESC Key to abort")
	PrintN("")
	Repeat
		Length = AvailableSerialPortInput(0)
		If Length = 0
			Delay(25)
		Else
			BytesRead = ReadSerialPortData(0, *Buffer, Length)
			If BytesRead
				Print(PeekS(*Buffer, BytesRead, #PB_Ascii))
			EndIf
		EndIf
	Until Inkey() = #ESC$
Else
	PrintN("Keine Verbindung!")
	Input()
EndIf
druckernrw
Beiträge: 13
Registriert: 27.12.2022 22:52
Computerausstattung: er ist beige
Wohnort: Halle Westf

Re: Arduino und Purebasic Sound wiedergabe

Beitrag von druckernrw »

Ja genau. Da geht es jetzt.
Und wo war nun der Fehler? :bounce:
Jetzt müssen die Zahlen nur noch die Sound ausgabe modifizieren.

Vielen Dank, wieder einen Schritt weiter..

So jetzt mal ne frage zum sound. Ich habe viele sachen auch unter blitzbasic3d vor einiger zeit mal versucht. Muss man sounds auch als channel deklarieren und dann höhe, r/l und lautstärke zu beeinflussen?

und verzeiht meine dumme frage. wie poste ich hier Bilder?
Benubi
Beiträge: 187
Registriert: 22.10.2004 17:51
Wohnort: Berlin, Wedding

Re: Arduino und Purebasic Sound wiedergabe

Beitrag von Benubi »

Hallo

Ein problem beim PB Linux Versionen ist, daß die meisten Manipulationsbefehle Tonhöhe/Frequenz/Panning nicht funktionieren, bestenfalls leere Platzhalter sind.

Hier ist das was du tun könntest, als einfacher workaround, nach Schwierigkeitsstufe geordnet (so stelle ich mir das jedenfalls vor):

1) Verschiedene Sounds benutzen. Jeder sound erhält seinen Frequenzbereich und entsprechend wird jener abgespielt / lauter gestellt, oder ausgeschaltet / gemutet. Das ist ganz in Ordnung so, ich habe bei einigen Spielen zufällig geschaut die auf 3D Engines funktionieren, und so werden Automotoren Geräusche auch gehandhabt, des Weiteren gibt es noch Beschleunigungs- und Entschleunigungssounds, je Frequenzbereich (bzw. Gang im Spiel).

2) Wenn Du einen kurzen Piep Sound benutzt, kannst Du den "einfach" öfter/seltener je Frequenz abspielen lassen.

3) Kombinieren von 1+2

4) Externe audio library benutzen, i.d.R. wird diese dann über DLL/SO eingebunden

5) Linux Audio Befehle direkt benutzen, oder SDL2 (glaube ich). Dafür müsstest Du aber auch etwas in die Audio-Formate dich tiefer einarbeiten und das ist eher für fortgeschrittene Benutzer (ich habe mich da noch nicht hingewagt).
Benutzeravatar
HeX0R
Beiträge: 3042
Registriert: 10.09.2004 09:59
Computerausstattung: AMD Ryzen 7 5800X
96Gig Ram
NVIDIA GEFORCE RTX 3060TI/8Gig
Win11 64Bit
G19 Tastatur
2x 24" + 1x27" Monitore
Glorious O Wireless Maus
PB 3.x-PB 6.x
Oculus Quest 2 + 3
Kontaktdaten:

Re: Arduino und Purebasic Sound wiedergabe

Beitrag von HeX0R »

druckernrw hat geschrieben: 08.01.2023 15:11 Ja genau. Da geht es jetzt.
Und wo war nun der Fehler?
Genaugenommen war es Dein Fehler!
Für eine RS232 Verbindung ist es unerlässlich, die richtigen Kommunikationsparameter zu kennen.
Du selbst hast aber alle auf die falsche Fährte geführt:
com 11 als beispiel.
Das übliche 9600 gedöns....
werte gehen ein .... 11200,11400,11599....44100...700000
9600Baud ist aber was völlig anderes als 19200, d.h. alle Bits kämen bei 9600 völlig verschoben an, genauso mit falscher Datenbitanzahl, Parity Setting, usw. Da kommt dann "Datensalat" an.
Auch so Wischi-Waschi-Aussagen wie "Werte gehen ein"...
Also bitte, wenn Du sowas machen möchtest, musst Du Dich schon erst mal selbst darum kümmern herauszufinden, WIE die Werte denn genau ankommen.
Das kann Integer, Longs, ASCII, UTF-8, oder Bananenschalen sein, und das muss ja in irgendeiner SDK-Anleitung genau beschrieben sein.

Genaugenommen hab ich nur zwischen den Zeilen von all Deinen Aussagen gelesen.
Bei dem Frequenz-Ton bin ich aber raus, falls Dein Programm unter Windows läuft, nimm doch einfach Beep_()
druckernrw
Beiträge: 13
Registriert: 27.12.2022 22:52
Computerausstattung: er ist beige
Wohnort: Halle Westf

Re: Arduino und Purebasic Sound wiedergabe

Beitrag von druckernrw »

Nun gut ich bin Windows nutzer. Habe es auch schon zum laufen bekommen.
Es pfeift schonmal in den entsprechen Frequenzen.
Zusätzlich zu den Zahlen sendet der arduino auch noch andere befehle in Text form. Diese müsste ich jetzt erstmal herausfiltern. Quasi ignorieren. Sonst setzt mir das Programm immer die Frequenz auf "0" wenn so ein befehl kommt.

Code: Alles auswählen

 InitSound()           ; Initialisieren des Sound-Systems
 UseOGGSoundDecoder()  ; Verwenden von Ogg-Dateien
 
 LoadSound(0, "C:\DTMF\TurbineSoundkurz.ogg")
 
OpenConsole("Serial Port Test")
If OpenSerialPort(0, "COM11", 19200, #PB_SerialPort_NoParity, 8, 1, #PB_SerialPort_NoHandshake, 1024, 1024)
	*Buffer = AllocateMemory(1024)
	PrintN("Press ESC Key to abort")
	PrintN("")
	SetSoundFrequency(0, 1000)
	PlaySound(0, #PB_Sound_Loop, 100)

	Repeat
		Length = AvailableSerialPortInput(0)
		If Length = 0
			Delay(25)
		Else
		  
		  BytesRead = ReadSerialPortData(0, *Buffer, Length)
			If BytesRead
			  Wert$ = PeekS(*Buffer, BytesRead, #PB_Ascii)
				Print(Wert$)
			SetSoundFrequency(0, Val(Wert$))
	
			EndIf
		EndIf
	Until Inkey() = #ESC$
Else
	PrintN("Keine Verbindung!")
	Input()
EndIf
ach ja und zu deiner aussage:
9600Baud ist aber was völlig anderes als 19200, d.h. alle Bits kämen bei 9600 völlig verschoben an, genauso mit falscher Datenbitanzahl, Parity Setting, usw. Da kommt dann "Datensalat" an.
ich habe beide geschwindigkeiten ausprobiert um einen fehler auszuschliessen. 9600 und auch 19200. Natürlich habe ich den Arduino auch auf den entsprechenden Wert umprogrammiert.
Antworten