Fórum témák
» Több friss téma |
A klónok CH340 Soros-USB illesztőjének drivere (Letöltés)
Sziasztok!
Arduinoban nyomógombokhoz szeretnék megnyomás után egy 500ms-ig tartó sípoló hangot kiadni, kvázi billentyű hang. A tone() függvény testhezálló megoldás lenne, de szükséges hozzá a delay(), ami jelenleg nem kívánatos. A for ciklusban kódolt hangkiadás is ugyanahhoz a végeredményhez vezet, mint a tone() a delay() függvénnyel, megakad a program 500ms-ra. Ötletként támadt a timer COMPA_vect, de ez meg olyan, mintha folyamatosan le-leállna, majd újraindulna, és recseg az egész zümmer. Esetleg van valami ötletetek ilyen hosszú hangkeltésre nyomógomb hatására, ami nem akasztja meg a programot?
Aktív zümmer? Csak magas szintre állítasz egy kimenetet 500 ms-ra, valami apró mosfettel meg kapcsolod a zümmert. De lehet, hogy a tranyó el is hagyható.
A hozzászólás módosítva: Aug 1, 2019
Nem aktív, passzív, és cserélni sincs lehetőségem, mert egy meglévő eszközbe beépített passzív zümmert szeretném használni.
Szia!
Ha passzív, akkor nagyobb a probléma, mert arra hiába adsz 500ms-ig jelet ( pl. '1' folyamatosan ), mert akkor az csak egy kattanást fog kiadni! A passzívnál FOLYAMATOSAN 1-0-1-0...-t kell kiadni a megfelelő frekvenciával 500 ms-ig és akkor fog hangot kiadni! Jó programszervezéssel megoldható megszakítás nélkül is, de ehhez igazából a megszakítás a megfelelő eljárás !
Szia!
Igen én is ezzel kísérletezek. Beállítottam a timer1-et CTC módba, OCR1A=1000, órajel 8MHz, osztás 1 és a meszakítások alkalmával a zümmer lábát egyszer H-ra, egyszer L-re állítja, így adja ki nekem azt a 4000Hz-et, amire szükségem van. A fő programban pedig a millis() függvény használatával 500ms elteltével a TCCR1B regiszter CS10 bit 0-ra állításával leállítom a timert és leáll a hang is. De olyan recsegő hangot ad ki, mintha hangadás közben is leállna majd újraindulna, ezt a tone() függvény alkalmazása során nem tapasztaltam. Bár lehet a zümmer rossz, majd ránézek munka után szlóppal is, mert a tone() csak az egyik lábat rángatja, amíg a másik L szinten van, megszakítás során miután a zümmer mindkét lába digitális pinre van kötve a nagyobb hangerő érdekében minden fél periódusban felcserél a polaritást, lehet a zümmer ezt nem viseli jó, de miután beépített és nem is férek hozzá semmi paramétert nem tudok róla. A hozzászólás módosítva: Aug 1, 2019
A reccsenéssel más alkalmazásban én is küzdöttem. Próbálkozhatsz azzal is, hogy a timert1-et nem CTC módban használod, hanem PWM módban használod. Ha le akarod kapcsolni a hangot, akkor a timert egyszerűen 0, vagy 100% kitöltési tényezőre állítod. Én úgy használom, hogy hang nélkül a timer 100% kitöltésen megy és a kimeneti lába INPUT-ként van beállítva. Ha kell a hang, akkor átállítom a kitöltési tényezőt és a lábat OUTPUT-nak állítom. A hang leállításakor ugyanennek az ellenkezője történik. Így nekem nem reccsen. PWM-nél még az az előny is van, hogy szabályozható a hangerő.
Szia.
A Tone() függvény duration paramétere nem erre szolgál? Vagy az is delay()-t használ? Szerintem nem, de tevedhetek. Amúgy miért kell delay()? A Time csak kiad egy parancsot ami eloallitja a kívánt pwm jelet. Nem így van?
Szerintem a delay a mintaprogramban lehetett két hang közötti várásra. Mint írtátok a millis() illetve kezdőidő, mostidő változók vizsgálatával gyönyörűen lehet időzíteni.
A tone() és a notone() és millis() függvények nagyon jól használhatóak, és szinte nulla rendszerigényűek, attól nem nagyon akadhat a hang. Én a tone() notone() függvényekkel monofonikus szintetizátort csináltam a múltkor. Egyik bekapcsolja, a másik kikapcsolja a hangot. Teljesen jól működött gyors volt, pedig 32 billentyűt szkennelt még mellette, és lcd-re írt i2c-vel. Tehát nem ez lehet a gond. Ha kell küldök kódot
![]()
Megköszönöm a kódot, az is gond, hogy ha tone() függvényt használok, delay() nélkül nem tudok két hangmagasság között átváltani, erre is szükségem lenne egy másik gombnál, hogy egy gombnyomásra két egymást követő rövid, de különböző hangmagasságú hangot ad ki. Meg a noTone() utasítás is csak a delay() használatával működött megfelelően, de ezek szerint csak én nem jöttem rá a jó megoldásra.
A hozzászólás módosítva: Aug 1, 2019
Egyszerre csak egy hang szólhat itt, és összeakadhat ha jól tudom más timert igénylő cuccokkal. Csatoltam egy tone függvényt használó arpeggios monofonikus szintit+midivezérlőt.
Téged itt csak a hangkiad2 eljárás érdekel 290. sor. Ugye itt én akkor adok ki hangot, ha lenyomok egy billentyűt, és megállítom amikor felengedem... Decay az eltelt idő, millissel nézem és vizsgálom. Sajnos itt bebonyolítja, hogy ilyen arpeggiókat indítgatok az adott hangra, sok sikert az értelmezéshez, hibák lehetnek benne, ezt a vonalat nem fejlesztettem tovább, azért küldöm, hogy azt, hogy lenyomok egy gombot és kiadok egy hangot azt gyönyörűen meg lehet vele csinálni, tulajdonképpen ez 32-gombbal csinálja. A gombokat scanneli egy multiplexerrel és loopponként nézi mi van lenyomva. Ez nekem tökéletesen, hiba nélkül működött, nem igényelt megszakítást a gomb vizsgálata. Remélem segít valamit. ![]() A hangmagasságok deffiniálva vannak az elején! A hozzászólás módosítva: Aug 1, 2019
Muszáj szoftverből megoldani? Én tennék rá egy astabilt, aztán csak egy kapcsoló jel kellene, és az astabil meg zümmögtetné a hangszórót. Nincs szükség timerre meg semmi egyébre, csak egyetlen utasításra
![]() A hozzászólás módosítva: Aug 1, 2019
Igen, jó megoldás lenne, de a hardver már elkészült smd-ben, ha megoldható szoftveresen, akkor nem kellene átépíteni. Amikor terveztem, akkor azt gondoltam egyszerübb lesz.
Köszönöm a kódot, áttanulmányozom. Bár most megoldódni látszik a helyzet. A gond valószínűleg az volt, hogy amikor elindult a timert az OCR1A regisztert a program minden egyes lefutása alatt írta, és nem csak egyszer amikor indult. Ezt korrigálva már csak nagyon minimális hiba hallható a kiadott hangban, az meg elviselhető.
A hozzászólás módosítva: Aug 2, 2019
Én is pont ebbe futottam bele, hogy egyszerre csak egy dolgot végez el az arduino.
RGB vezérlőt akartam készíteni, ami egy órán belül elsötétül, mint a naplemente és próbálkoztam a fading művelettel is, csak egy óráig teljesen lefoglalta volna magát, és szerettem volna mellé tücsök ciripelést is, fél óránál mondjuk. Írhattam meg percről-percre az egészet az R-G-B színekre analogWrite-val, 60 szor. ![]() A hozzászólás módosítva: Aug 2, 2019
Idézet: „egyszerre csak egy dolgot végez el az arduino” Egy CPU egy dolgot tud egyszerre csinálni. A programodat kell úgy megírni, hogy ügyesen váltogassa az elvégzendő feladatokat. Idézet: „csak egy óráig teljesen lefoglalta volna magát” Egy ATMega328 azért ennél többre képes. Tudna RGB fade-t, hanggenerálást, de még soros kommunikációt, meg mondjuk LCD animációt is ez idő alatt. Nem egyszerre, csak neked tűnne úgy. Pont, mint a számítógéped. Azon sem annyi szoftver fut egyszerre, ahány magos a CPU-d. Idézet: „Írhattam meg percről-percre az egészet az R-G-B színekre analogWrite-val, 60 szor.” Egy darab analogWrite kell hozzá összesen. Meg egy if. És egy halom szabadideje is marad a CPU-nak. A lényeg, hogy delay-t tilos használni. A hozzászólás módosítva: Aug 2, 2019
Idézet: „A lényeg, hogy delay-t tilos használni.” ..akkor én jól meg leszek büntetve. ![]() ..végülis sikerült(képen alul), amit szerettem volna, csak kicsit csalódott vagyok, hogy ennyire egyszerűre sikerült, pedig fadeval szerettem volna, dehát valahol el kell kezdeni. ![]() Kicsit játszottam a fet lehuzó ellenállásával is, mert a 12V-os RGB szalag még 3V-nál is világít.(ami persze nem meglepő, de a tökéletes színhez még pontosabb érték kellett nekem.) UI:..a késleltetést még átírom, az csak a demó verzióhoz kellett. A hozzászólás módosítva: Aug 2, 2019
"Nem egyszerre, csak neked tűnne úgy." Persze, ezt értem. Ezred, század másodpercek alatt.
"Egy darab analogWrite kell hozzá összesen." ..gondolom a setup környékén kellett volna megadni a naracssárga szín "kezdő" értékeit. Köszönöm azért a segítséget. ![]() ![]() ![]() ![]()
Ha delay-t használsz, akkor ott vár a CPU. Nem fog egyszerre villogtatni meg ciripelni.
Miért nem használtál ciklust?
Mert még nem ismerem, és nem volt probléma a delay-el, eddig.
Utánanézek majd ennek, még tanulófélben vagyok. ![]() UI: ..persze nem a legkönyebb, legegyszerűbb megoldásokat keresem, de egy mp3 modult használok, annak csak egy GND indítójel kell, egy 500ms-os jelet pedig ki tudok adni bármelyik percben az arduino(optokapun keresztül, ha odaér a loopban a progi), és az el tud indítani egy MP3-as modult, rajta egy végtelenített ciripeléssel. Érdemes elmenni programozást tanulni, ha komolyabb dolgokat szeretnék összerakni, vagy sokan a neten keresgélve tanulnak/tanultok?
esp8266 csak egy A0 láb marat szabadon ami egy nyomógomb funkciót töltene be H/L funkciót de a a lenti
if megoldással érdekes dolgokat művel az esp szakadozik a kapcsolat a Rotterrel az if függvényt kiveszem a programból semmi probléma nincs wifivel! Mitöl lehet a probléma?
A hozzászólás módosítva: Aug 2, 2019
Szia, ha digitáliis bemenetként használod az A0-ás lábat akkor szerintem nem kellene az analogRead függvény. Nem tudom hogy ez kihatással van -e wifi kapcsolatra de elég (bocs) katyvasznak tünik.
Így külön kell felhuzó ellenállás az input lábra, nemtudom hogy ESP nél van e beépitett felhuzó ellenállás
Plussz gondolj a prellre is A hozzászólás módosítva: Aug 2, 2019
Szia!
Próbáltam digitalRead is de meg sem szólal esp d1 mini vel ez végkép nem értem lábakat próbáltam A0,17,0 definícióval is külön is belső és külső felhúzó ellenállás is digitális mód nem megy egyszerűen! ![]() Tesztre próbáltam egy LDR rajta az szépen működik jó a A0 pin és a nagy program is szépen megy alatta ! ![]() A hozzászólás módosítva: Aug 2, 2019
Aha, gyors guglizás után látom hogy az ESP nél az analóg láb nem használható digitálisként, mármint NEM fog müködni a digitalRead függvény.
Idézet: „The numeric value of A0 is 17, as defined here. But unlike on an Arduino board, you can't use it as a digital pin. It only work for pin numbers 0-16.” Nemtudom milyen ESP-d van, itt figyelmeztet a maximum input feszültségre az analóg lábon! Idézet: , tehát némelyik NodeMCU lapra adhatsz 3.3V -ot mivel a lap tartalmaz egy feszültségosztót ,máskülönben 1V a max.Esetleg próbálj 1V -ot adni az analóg lábra és persze írasd ki hogy mi az ADC értéke, ha 1023-at eléri akkor nincs feszosztó. „The ESP8266 has a single analog input, with an input range of 0 - 1.0V. If you supply 3.3V, for example, you will damage the chip. Some boards like the NodeMCU have an on-board resistive voltage divider, to get an easier 0 - 3.3V range.”
Ismét gugli, másnak is volt hasonló gondja ha gyakran hívta az analogRead függvényt, rakj be pár milliszekundumos delayt
![]()
igen stabil hisz van egy nagyobb kód ami gond nélkül fut a kapcsolásával de ez az analóg if rész totálra felborít minden ha belerakom amit az első kérdésembe leírtam!
Most nem tudom mi lenne a legjobb? A0 perifériát elhagyni és egy foglalt digitális lábat 2 funkcióval megoldani ! Van egy pir szenzor ami mozgásra 2s ra kapcsol be ehez kapcsolni a kivált nyomó gombot és a lenyomási időt figyelni 2s alatt ami kezelné a nyomógomb funkciót? ![]()
Igy néz ki a teljes sor
A hozzászólás módosítva: Aug 3, 2019
Esetleg I2C portbővítő? Az ADC értéke 0-1023 -ig megy, Te az if -ben a state változót figyeled hogy nagyobb vagy egyenlő e 1023 -nál, ez nem épp korrekt mivel 1023 -nál nem lehet nagyobb értéke a változódnak. Esetleg jobb lenne így
Szerintem delay-t próbára használd, ha ez megoldja akkor millis() -el időzíts és pollingolj. |
Bejelentkezés
Hirdetés |