Fórum témák

» Több friss téma
Fórum » Arduino
A klónok CH340 Soros-USB illesztőjének drivere (Letöltés)
Lapozás: OK   547 / 855
(#) Vacok hozzászólása Aug 1, 2019 /
 
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?
(#) morgo válasza Vacok hozzászólására (») Aug 1, 2019 /
 
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
(#) Vacok válasza morgo hozzászólására (») 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.
(#) kissi válasza Vacok hozzászólására (») Aug 1, 2019 /
 
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 !
(#) Vacok válasza kissi hozzászólására (») Aug 1, 2019 /
 
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
(#) mateatek válasza Vacok hozzászólására (») Aug 1, 2019 2 /
 
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ő.
(#) KoblogPerGyok válasza Vacok hozzászólására (») Aug 1, 2019 /
 
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?
(#) Rober_4 válasza KoblogPerGyok hozzászólására (») Aug 1, 2019 /
 
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.
(#) Rober_4 válasza Vacok hozzászólására (») Aug 1, 2019 /
 
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
(#) Vacok válasza Rober_4 hozzászólására (») Aug 1, 2019 /
 
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
(#) Rober_4 válasza Vacok hozzászólására (») 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
(#) sargarigo válasza Vacok hozzászólására (») 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 Billentyűhangnak elég lehet ez is. Ha kell több hang, akkor az elemek átkapcsolásával végülis az is megoldható.
A hozzászólás módosítva: Aug 1, 2019
(#) Vacok válasza sargarigo hozzászólására (») Aug 2, 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.
(#) Vacok válasza Rober_4 hozzászólására (») Aug 2, 2019 /
 
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
(#) Pulyka válasza Vacok hozzászólására (») 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
(#) vargham válasza Pulyka hozzászólására (») 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
(#) Pulyka válasza vargham hozzászólására (») 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
(#) Pulyka válasza vargham hozzászólására (») 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.
(#) vargham válasza Pulyka hozzászólására (») Aug 2, 2019 /
 
Ha delay-t használsz, akkor ott vár a CPU. Nem fog egyszerre villogtatni meg ciripelni.
Miért nem használtál ciklust?
(#) Pulyka válasza vargham hozzászólására (») Aug 2, 2019 /
 
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?
(#) kaqkk válasza Pulyka hozzászólására (») Aug 2, 2019 /
 
(#) jeges hozzászólása Aug 2, 2019 /
 
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?

  1. int button = A0;
  2. int state=0;
  3. setup rész
  4.  
  5. pinMode(button,INPUT);
  6.  
  7.  
  8. loop rész
  9.  
  10. state = analogRead(button);
  11. if(state >= 1023 ){  }
A hozzászólás módosítva: Aug 2, 2019
(#) djusee válasza jeges hozzászólására (») 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.
  1. int button = A0;
  2. setup rész
  3.     pinMode(button,INPUT);
  4. loop rész    
  5.     if(digitalRead(button) == HIGH ){  }

Í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
  1. pinMode(button,INPUT_PULLUP);

Plussz gondolj a prellre is
A hozzászólás módosítva: Aug 2, 2019
(#) jeges válasza djusee hozzászólására (») 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
(#) djusee válasza jeges hozzászólására (») Aug 3, 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:
„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.”
, 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ó.
(#) djusee válasza jeges hozzászólására (») Aug 3, 2019 /
 
Ismét gugli, másnak is volt hasonló gondja ha gyakran hívta az analogRead függvényt, rakj be pár milliszekundumos delayt a függvényhívások közé. Táp stabil?
(#) Pulyka válasza kaqkk hozzászólására (») Aug 3, 2019 /
 
Köszi.
(#) jeges válasza djusee hozzászólására (») Aug 3, 2019 /
 
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?
(#) jeges válasza djusee hozzászólására (») Aug 3, 2019 /
 
Igy néz ki a teljes sor

  1. if(state >= 1023 ){ count = count + 1; delay(500); mode_display(); }
A hozzászólás módosítva: Aug 3, 2019
(#) djusee válasza jeges hozzászólására (») 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
  1. if(state >= 1020 ){  }

Szerintem delay-t próbára használd, ha ez megoldja akkor millis() -el időzíts és pollingolj.
Következő: »»   547 / 855
Bejelentkezés

Belépés

Hirdetés
XDT.hu
Az oldalon sütiket használunk a helyes működéshez. Bővebb információt az adatvédelmi szabályzatban olvashatsz. Megértettem