Jak ozvučit rc auto ?

Domácí úpravy na TT-01

Moderátoři: rotruck, Loupák83, Honza D, tjjack

Odpovědět
Návštěvník

Jak ozvučit rc auto ?

Příspěvek od Návštěvník »

Nevíte někdo jak si jednoduše vyrobit zvukový modul který by reagoval na napětí přímo od motoru ?
upír
Píšu hodně
Píšu hodně
Příspěvky: 344
Registrován: pát led 27, 2006 10:39 pm
Bydliště: Brno

Příspěvek od upír »

Sorry nějak jsem se zapoměl regnout.
severan
Píšu hodně
Píšu hodně
Příspěvky: 352
Registrován: pon led 23, 2006 4:23 pm
Bydliště: Chomutov

Příspěvek od severan »

Tak to by mě zajímalo taky.

Severan.
Peugeot 206 WRC na TB-01
Uživatelský avatar
CYBERDREAM
ČESTNÝ ČLEN
ČESTNÝ ČLEN
Příspěvky: 3536
Registrován: pon led 23, 2006 4:21 pm
Bydliště: Blansko
Kontaktovat uživatele:

Příspěvek od CYBERDREAM »

Tak to by mě zajímalo taky.
Tamiya dělá zvukový modul ke kamionům, stojí ale cca 4.000 a navíc je tam zvuk kamionu :D
Porsche Boxster, 150 kW, 205ps, 2490 ccm, 16V, 0-100 6.7s, max 250 km, abs, krouťák 245Nm, Carrera 17" 205/50+255/40, komplet v el., ineriér v kůži
PORSCHE, vše ostatní je kompromis!!!
upír
Píšu hodně
Píšu hodně
Příspěvky: 344
Registrován: pát led 27, 2006 10:39 pm
Bydliště: Brno

Příspěvek od upír »

CYBERDREAM píše:Tak to by mě zajímalo taky.
Tamiya dělá zvukový modul ke kamionům, stojí ale cca 4.000 a navíc je tam zvuk kamionu :D
Ten je zbytečně drahej musí to jít nějak jednoduše vyrobit.
upír
Píšu hodně
Píšu hodně
Příspěvky: 344
Registrován: pát led 27, 2006 10:39 pm
Bydliště: Brno

Příspěvek od upír »

Fx píše:Tady je kod nejakyho zvukovyho modulu pro lodicku, kdyby to nekomu k necemu pomohlo :-)

Popravdě řečeno si nedokážu představit, že bych něco takovýho bastlil, protože jsem jednou jedinkrát zkoušel udělat ATMEL ovládání displeje z kopírky a byl to takovej voser... :-/

;*******************************************************************
; Soundmodul
;*******************************************************************
; Soundmodul fuer Modelljacht
;
; Processor-Options
; Oscillator: RC
; Watchdog Timer: on
; Codeprotection: off
; Powerup Timer: off (es gibt einen eigenen)
;
; Ralf Engels 12.08.1999 1. Version
; 19.08.1999 Aenderung fuer interrupt
; 28.08.1999 Aufteilung in verschiedene Files

LIST p=16C84 ; PIC16C84 is the target processor
include <p16c84.inc>

radix dec

include <sounddef.inc>

;***********************************************************
; Pin - Functions
; RA 0
; RA 1
; RA 2
; RA 3 Vin (Voltage Input)
; RA 4 Empfaenger Eingang (Puls)
; RB 0 LED Out (normal)
; RB 1 LED Out (pulsed)
; RB 2 Eprom enable
; RB 3 Addr clk
; RB 4-7 Addr out
;***********************************************************

PulsCount EQU 0x10
LastPulsCount EQU 0x11 ; Puls Count des letzten Durchgangs
ValidPulsCount EQU 0x12 ; Letzter gueltiger PulsCount (d.h. zweimal vorgekommen)
LedCount EQU 0x13 ; && 0x14

Flags EQU 0x15 ; verschiedene Flags
; Bit 7 ! 6 ! 5 ! 4 ! 3 2 1 0
; Vin low bearbeitet ! program erh ! ! don't repeat !

Random EQU 0x16
ActSample EQU 0x17 ; actual Sample to be played
Program EQU 0x18 ; actual Program
SampleCount EQU 0x19 ; && 0x1A && 0x1B

SireneValue EQU 0x1C ; && 0x1D, 1E

I EQU 0x23 ; Scratch Variable
J EQU 0x24 ; Scratch Variable

K EQU 0x25 ; Sample Variable
L EQU 0x26 ; Sample Variable

LOOPTIME EQU 147 ; Zeit fuer eine Schleife

_ResetVector EQU 0x00
_IntVector EQU 0x04

ORG _ResetVector
goto Main
ORG _IntVector
goto Interrupt



Initialisierung
Main ; call pause ; remove for debug

SwitchToBank1 ; First initialising all Ports

Let TRISA, B'11111000' ; some A Ports input
Let TRISB, B'00000000' ; all B Port output
Let OPTION_REG, B'10001000' ; no prescaler

SwitchToBank0
Let INTCON, B'00000000' ; no Interrupts

Let PORTA, 0xFF
Let PORTB, 0x07 ; disable eprom

Let PulsCount, 0
Let LastPulsCount, 15
Let ValidPulsCount, 15
clrf LedCount
clrf LedCount+1

Let Flags, 0

clrf ActSample

clrf I ; read Program from Eeprom
call readByte
movfw I
andlw 0x03
movwf Program

clrf SampleCount
clrf SampleCount+1
clrf SampleCount+2

clrf SireneValue
clrf SireneValue+1
clrf SireneValue+2

Let INTCON, B'10100000' ; enable timer interrupt

; ------------ Main loop -----------------

loop goto loop


; ------------------------------------
; ------------ interrupt -------------
; ------------------------------------
; wird alle 100 us aufgerufen

Interrupt
movlw 255 - LOOPTIME ; set timer value
addwf TMR0, f

ledLogic1
call pulsLogic
call sampleLogic

clrwdt ; Den Watchdog clearen
bcf INTCON, T0IF ; Den Interrupt clearen

ledLogic2
retfie

; ----------------------------------
; ------------ Puls Logic ----------
; ----------------------------------
; decodiert die Empfaenger Pulse
; laufzeit max 18 cycles

pulsLogic
btfsc PORTA, 4
goto pulsHigh
; goto pulsLow

pulsLow
movfw PulsCount
btfsc STATUS, Z
goto waitForNextPuls ; wartet auf naechsten puls
; else

subwf LastPulsCount, w ; if PulsCount == LastPulsCount
btfsc STATUS, Z
goto equalPuls
; goto differentPuls

differentPuls
movfw PulsCount
movwf LastPulsCount
clrf PulsCount

incf Random, f
retlw 0

equalPuls
movfw PulsCount
movwf LastPulsCount
movwf ValidPulsCount
clrf PulsCount

swapf Random, f
retlw 0

waitForNextPuls
nop
incf Random, f
movlw 0x32
xorwf Random, f
nop
nop
retlw 0

pulsHigh
incf PulsCount, f
nop
nop
incf Random, f
movlw 0xc5
xorwf Random, f
swapf Random, f
nop
nop
retlw 0

; ------------------------------------
; ---------- Sample Logic ------------
; ------------------------------------
; spiele sample

sampleLogic
Let PCLATH, HIGH sampleSwitch ; don´t forget to set the High Address
movfw ActSample

sampleSwitch
addwf PCL, f ; switch ActSample
goto noSample ; case 0
goto testSample ; case 1
goto sireneSample ; case 2
goto achtungSample ; case 3
goto divehornSample ; case 4
goto platzDaSample ; case 5
goto quack1Sample ; case 6
goto quack2Sample ; case 7
goto quack3Sample ; case 8
goto quack4Sample ; case 9
goto shiphornSample ; case 10
goto trainSample ; case 11
goto pauseSample ; case 12
goto martinhornSample ; case 13

retlw 0 ; should not be reached

; +++++++++++++ noSample +++++++++++++++
noSample
btfsc PORTA, 3
goto selectNewSample
btfsc Flags, 7
goto selectNewSample

goto startAchtungSample

selectNewSample ; ---- select new Sample ----
bsf PORTB, 2 ; disable eprom

Let PCLATH, HIGH newSampleSwitch ; don´t forget to set the High Address
movfw ValidPulsCount
andlw 31

newSampleSwitch
addwf PCL, f ; switch ValidPulsCount
goto wideLeft
goto wideLeft
goto wideLeft
goto wideLeft
goto wideLeft
goto wideLeft
goto wideLeft
goto wideLeft
goto wideLeft
goto wideLeft
goto wideLeft ; 10
goto wideLeft
goto littleLeft
goto littleLeft
goto littleLeft
goto middle ; 15
goto middle
goto middle
goto littleRight
goto littleRight
goto wideRight ; 20
goto wideRight
goto wideRight
goto wideRight
goto wideRight
goto wideRight
goto wideRight
goto wideRight
goto wideRight
goto wideRight
goto wideRight ; 30
goto wideRight

wideLeft
nextProgram
btfsc Flags, 6 ; don't repeat programming
retlw 0

bsf Flags, 6

incf Program, w
andlw 0x03
movwf Program ; Program = (Program+1) % 4

clrf I
movfw Program
movwf J
call writeByte

retlw 0

littleLeft
bcf Flags, 6 ; can Program

movfw Program
btfsc STATUS, Z
goto startShiphornSample
addlw -1
btfsc STATUS, Z
goto startDivehornSample
addlw -1
btfsc STATUS, Z
goto startSireneSample
goto startTrainSample
retlw 0

middle
startNoSample
bcf Flags, 4 ; darf wieder Samples spielen
retlw 0

littleRight
wideRight
movfw Program
btfsc STATUS, Z
goto startDivehornSample
addlw -1
btfsc STATUS, Z
goto startPlatzDaSample
addlw -1
btfsc STATUS, Z
goto startMartinhornSample
goto startQuackSample
retlw 0

startTestSample
clrf SireneValue
Let ActSample, 1
retlw 0

startSireneSample
clrf SireneValue
clrf SireneValue+1
Let ActSample, 2
retlw 0

startAchtungSample
bsf Flags, 7 ; Vin low bearbeitet
bsf Flags, 4 ; nicht sofort wiederholen
startSampleM 0x00, 0x01, 0x00, 3

startDivehornSample
startSampleM 0x00, 0x3e, 0x16, 4

startPlatzDaSample
btfsc Flags, 4
retlw 0

bsf Flags, 4 ; nicht sofort wiederholen
startSampleM 0x00, 0x68, 0x2b, 5

startQuackSample
Let PCLATH, HIGH sampleSwitch ; don´t forget to set the High Address
movfw Random
andlw 0x07

btfss Flags, 4 ; erstes quack ist keine Pause
andlw 0x03

quackSwitch
addwf PCL, f ; switch Random
goto startQuack1 ; case 0
goto startQuack2 ; case 1
goto startQuack3 ; case 2
goto startQuack4 ; case 3
goto startPause ; case 4
goto startPause ; case 5
goto startPause ; case 6
goto startPause ; case 7

startQuack1
startSampleM 0x00, 0x8a, 0xb1, 6

startQuack2
startSampleM 0x00, 0xa0, 0x29, 7

startQuack3
startSampleM 0x00, 0xa7, 0x6e, 8

startQuack4
startSampleM 0x00, 0xb7, 0x99, 9

startShiphornSample
startSampleM 0x00, 0xc4, 0x04, 10

startTrainSample
startSampleM 0x00, 0xc8, 0x49, 11

startPause
clrf SireneValue
movfw Random
andlw B'001111'
movwf SireneValue+1
Let ActSample, 12
retlw 0

startMartinhornSample
Let SireneValue, 0x0F
clrf SireneValue+1
Let ActSample, 13
retlw 0


; 00100-03e15 3d15 achtung.raw
; 03e16-0682b 2a16 divehorn.raw
; 0682b-08ab0 2285 platzDa.raw
; 08ab1-0a029 1579 quack1.raw
; 0a029-0a76d 744 quack2.raw
; 0a76e-0b798 102b quack3.raw
; 0b799-0c404 c6c quack4.raw
; 0c404-0c849 455 shiphorn.raw
; 0c849-1072e 3ee5 train.raw


; +++++++++++++ testSample +++++++++++++++
testSample
incf SireneValue, f
Let I, 255
btfsc SireneValue, 0
clrf I

call fastToEprom

retlw 0

; +++++++++++++ sireneSample +++++++++++++++
sireneSample
incf SireneValue, f

btfsc STATUS, Z ; if( !SireneValue ) SireneValue+1 = 0;
clrf SireneValue+1

movfw SireneValue
movwf I

call fastToEprom

movfw SireneValue
subwf SireneValue+1, w ; if SireneValue < SireneValue+1
btfsc STATUS, C
retlw 0

clrf SireneValue
incf SireneValue+1, f

btfss SireneValue+1, 7
retlw 0

clrf ActSample
retlw 0

; +++++++++++++ achtungSample +++++++++++++++
achtungSample
playSampleTo 0x00, 0x3e, 0x15

clrf ActSample
retlw 0

; +++++++++++++ divehornSample +++++++++++++++
divehornSample
playSampleTo 0x00, 0x68, 0x2b

clrf ActSample
retlw 0

; +++++++++++++ platzDaSample +++++++++++++++
platzDaSample
playSampleTo 0x00, 0x8a, 0xb0

clrf ActSample
retlw 0

; +++++++++++++ quack1Sample +++++++++++++++
quack1Sample
playSampleTo 0x00, 0xa0, 0x29

clrf ActSample
retlw 0

; +++++++++++++ quack2Sample +++++++++++++++
quack2Sample
playSampleTo 0x00, 0xa7, 0x6d

clrf ActSample
retlw 0

; +++++++++++++ quack3Sample +++++++++++++++
quack3Sample
playSampleTo 0x00, 0xb7, 0x98

clrf ActSample
retlw 0

; +++++++++++++ quack4Sample +++++++++++++++
quack4Sample
playSampleTo 0x00, 0xc4, 0x04

clrf ActSample
retlw 0

; +++++++++++++ shiphornSample +++++++++++++++
shiphornSample
playSampleTo 0x00, 0xc4, 0x49

clrf ActSample
retlw 0

; +++++++++++++ trainSample +++++++++++++++
trainSample
playSampleTo 0x01, 0x07, 0x2e

clrf ActSample
retlw 0

; +++++++++++++ pauseSample +++++++++++++++
pauseSample
decfsz SireneValue, f
retlw 0

decfsz SireneValue+1, f
retlw 0

clrf ActSample
retlw 0

; +++++++++++++ martinhornSample +++++++++++++++
martinhornSample
call getMartinhornSample

movwf I
call fastToEprom

decfsz SireneValue+1, f
retlw 0

decfsz SireneValue, f
retlw 0

clrf ActSample
retlw 0

; ------------ veryFastToEprom --------
; addressiert das Eprom mit einem nibble
; ?? cycles von Call bis return

veryFastToEprom

swapf SampleCount+2, f

movlw B'00000111' ; clear port b
andwf PORTB, f

movfw SampleCount+2
andlw B'11110000'
iorwf PORTB, f ; set data
swapf SampleCount+2, f

retlw 0


; ------------ fastToEprom --------
; addressiert das Eprom mit einem byte ( in I )
; ?? cycles von Call bis return

fastToEprom
bsf PORTB, 2 ; disable eprom

movlw B'00000111' ; clear port b
andwf PORTB, f

bsf PORTB, 3 ; clock high
nop
bcf PORTB, 3 ; clock low

; ----
bsf PORTB, 3 ; clock high
nop
bcf PORTB, 3 ; clock low

bsf PORTB, 3 ; clock high
nop
bcf PORTB, 3 ; clock low

; ----
movfw I
andlw B'11110000'
iorwf PORTB, f ; set data
bsf PORTB, 3 ; clock high
swapf I, f

movlw B'00000111' ; clear port b
andwf PORTB, f

movfw I
andlw B'11110000'
iorwf PORTB, f ; set data
swapf I, f

bcf PORTB, 2 ; enable eprom

retlw 0



; ------------ toEprom --------
; addressiert das Eprom
; 41 cycles von Call bis return

toEprom
swapf SampleCount, f

bsf PORTB, 2 ; disable eprom

movlw B'00000111' ; clear port b
andwf PORTB, f

movfw SampleCount
andlw B'11110000'
iorwf PORTB, f ; set data
bsf PORTB, 3 ; clock high

movlw B'00000111' ; clear port b
andwf PORTB, f

; ----
movfw SampleCount+1
andlw B'11110000'
iorwf PORTB, f ; set data
bsf PORTB, 3 ; clock high
swapf SampleCount+1, f

movlw B'00000111' ; clear port b
andwf PORTB, f

movfw SampleCount+1
andlw B'11110000'
iorwf PORTB, f ; set data
bsf PORTB, 3 ; clock high

movlw B'00000111' ; clear port b
andwf PORTB, f

; ----
movfw SampleCount+2
andlw B'11110000'
iorwf PORTB, f ; set data
bsf PORTB, 3 ; clock high
swapf SampleCount+2, f

movlw B'00000111' ; clear port b
andwf PORTB, f

movfw SampleCount+2
andlw B'11110000'
iorwf PORTB, f ; set data

bcf PORTB, 2 ; enable eprom

swapf SampleCount, f
swapf SampleCount+1, f
swapf SampleCount+2, f

retlw 0


; *************************** readByte *************************
; Precondition: Bank 0 selected,
; Address of Byte in I
; Postcondition: Byte in I
readByte:
movfw I
movwf EEADR
SwitchToBank1
bsf EECON1, RD
SwitchToBank0
movfw EEDATA
movwf I
retlw 0


; *************************** writeByte *************************
; Precondition: Bank 0 selected,
; Address of Byte in I
; Byte in J
writeByte
movfw I
andlw 0x3f
movwf EEADR
movfw J
movwf EEDATA

SwitchToBank1
bcf EECON1, EEIF ; Initiate Write
bsf EECON1, WREN
movlw 0x55
movwf EECON2
movlw 0xaa
movwf EECON2
bsf EECON1, WR

writeComplete ; Wait for Write complete
btfsc EECON1, WR
goto writeComplete

bcf EECON1, WREN
SwitchToBank0
return

; ---------- Pause --------
; eine kleine Pause, benutzt I
; 262 657 Zyklen
pause
clrf I
movlw 0x00
pauseLoop
addlw 1
btfss STATUS, Z
goto pauseLoop
incfsz I, f
goto pauseLoop

retlw 0

; --------- incSampleCount ------------
; returns 0 falls SampleCount+2 == 0, sonst 1
; braucht etwa zehn zyklen im 1. Fall, 6 sonst

incSampleCount
incf SampleCount+2, f
btfss STATUS, Z
retlw 1
incf SampleCount+1, f
btfsc STATUS, Z
incf SampleCount, f
retlw 0

; ------------ getMartinshornSample --------------
; gibt in W das Sample fuer ein Martinshorn zurueck.
; index auf den Wert sind SampleValue und SampleValue+1

getMartinhornSample
Let PCLATH, HIGH getMartinSwitch ; don´t forget to set the High Address

movfw SireneValue+1
andlw 0x07

btfss SireneValue, 3
iorlw 0x08

addwf PCL, f ; switch SpeedConfig
getMartinSwitch
retlw 128
retlw 255
retlw 128
retlw 0
retlw 128
retlw 255
retlw 128
retlw 0

retlw 128
retlw 200
retlw 255
retlw 200
retlw 128
retlw 56
retlw 0
retlw 56

END
Já jsem chtěl jen jednoduchej návod na zvuk do auta a ne takovou změť nicneříkajících řádků.
Kdo tomu rozumí ať mě dá vědět a já se před ním hluboce ukloním.
upír
Píšu hodně
Píšu hodně
Příspěvky: 344
Registrován: pát led 27, 2006 10:39 pm
Bydliště: Brno

Příspěvek od upír »

Fx píše: Mě napadá fakt leda nějakej programovatelnej obvod, kterej bude ovládat "cosi, co umí generovat zvuky a dají se do toho nahrát samply" v závislosti na otáčkách motoru, tj. něco, co bude snímat impulzy, pak v závislosti na nich to bude zvukově přidávat nebo ubírat otáčky.

Základních problémů je několik, některý primitivní, některý složitý:

1. snímání otáček a jejich počítání
2. mít něco, do čeho půjde nahrát už navzorkovaný samply zvuku auta (např. se dají vykrást need for speed :lol:)
3. mít něco, co to bude schopný přehrát
4. naprogramovat obvod, kterej to celý bude ovládat... Hodně štěstí :) [/list]
Nejdeš na to moc vědecky ? Není náhodou nějaká jednodužší cesta ?
upír
Píšu hodně
Píšu hodně
Příspěvky: 344
Registrován: pát led 27, 2006 10:39 pm
Bydliště: Brno

Příspěvek od upír »

Fx píše: A jak jinak to chceš udělat, aby to mělo zvuk motoru podle otáček? Jediná mně známá jednodušší cesta je asi taková, jakou volej malí kluci, když jedou na kole a chtěj "motor"... Strčej do výpletu kola klacek :)

Ono to zas tak složitý není (teoreticky), prostě sejmeš otáčky, vyhodnotíš a podle toho "zahraješ" zvuk motoru...
Nevím jak to udělat jinak bych nezaložil tohle téma a z toho co tady píšeš moc chytrej nejsem kdyby jsi aspoň rozepsal nějaký součástky co k tomu jsou zapotřebí, tak bych se aspoň pokusil to vyrobit.
skautik1
Pravidelný navštěvník
Pravidelný navštěvník
Příspěvky: 129
Registrován: úte led 24, 2006 9:46 am

Příspěvek od skautik1 »

no to proste neni tak jednoduche...

1. jednoduchy generator sumu nejake frekvence, pri zvysovani otacek se bude frekvence zvysovat - tzn. defakto stejny zvuk jako vydava motorek s prevody, nejspis jen o neco hlubsi

2. generator zvuku rizeny nejakym mikroprocesorem, coz uz jde i mimo me :), ale zase tam toho muze byt podstatne vice (simulace razeni, brzdeni apod.)

no a k tomuhle je ta zmet tech pismenek co poslal FX
Odpovědět

Zpět na „Domácí úpravy“