Artıq bir düyməni Arduinoya bağlamağa baxdıq və "sıçrayan" əlaqələr mövzusuna toxunduq. Bu, təkrarlanan düymələrə basmağa səbəb olan və düymə vurmalarını proqramlı şəkildə idarə etməyi çətinləşdirən çox cansıxıcı bir fenomendir. Əlaqə sıçrayışından necə qurtulacağımız barədə danışaq.
Zəruri
- - Arduino;
- - həssas düymə;
- - nominal dəyəri 10 kOhm olan müqavimət;
- - İşıq yayan diod;
- - birləşdirici tellər.
Təlimat
Addım 1
Kontakt sıçrayış mexaniki açarlar, düymələr, keçid açarları və rölelərdə yaygın bir fenomendir. Kontaktların ümumiyyətlə elastikliyə sahib olan metallardan və ərintilərdən hazırlandığına görə fiziki olaraq bağlandıqda dərhal etibarlı bir əlaqə qurmurlar. Qısa müddət ərzində təmaslar bir neçə dəfə bağlanır və bir-birini dəf edir. Nəticədə, elektrik cərəyanı dərhal deyil, ardıcıl eniş-yoxuşdan sonra sabit bir vəziyyət alır. Bu keçici effektin müddəti təmas materialından, ölçüsündən və dizaynından asılıdır. Təsvir, toxunma düyməsinin kontaktları bağlandıqda tipik bir oscillogram göstərir. Sabit vəziyyətə keçid anından etibarən vaxtın bir neçə milisaniyə olduğu görülə bilər. Buna "sıçrayış" deyilir.
Bu təsir işıqlandırma, mühərriklər və ya digər ətalət sensorları və cihazlarını idarə etmək üçün elektrik dövrələrində nəzərə çarpmır. Ancaq məlumatların sürətli bir oxunması və işlənməsi olduğu dövrlərdə (frekansların "sıçrayış" impulsları ilə eyni qaydada və ya daha yüksək olduğu) bu bir problemdir. Xüsusilə 16 MHz-də işləyən Arduino UNO, 0-dan 1-ə keçid əvəzinə bir və sıfır ardıcıllığını qəbul edərək kontakt sıçrayışını tutmaqda əladır.
Addım 2
Kontakt sıçrayışın dövrənin düzgün işləməsinə necə təsir göstərdiyini görək. Aşağı açılan bir müqavimət dövrü istifadə edərək saat düyməsini Arduinoya bağlayaq. Düyməni basaraq LED-i yandıracağıq və düymə yenidən basılana qədər yanacağıq. Aydınlıq üçün, xarici bir LED-i rəqəmsal pin 13-ə bağlayırıq, baxmayaraq quraşdırılmış birindən imtina edilə bilər.
Addım 3
Bu vəzifəni yerinə yetirmək üçün ağla gələn ilk şey:
- düymənin əvvəlki vəziyyətini xatırlayın;
- mövcud vəziyyətlə müqayisə etmək;
- vəziyyət dəyişibsə, LED vəziyyətini dəyişdiririk.
Belə bir eskiz yazaq və Arduino yaddaşına yükləyək.
Dövrə açıldıqda, kontakt sıçrayışının təsiri dərhal görünür. LED-in düyməni basdıqdan dərhal sonra yanmadığı və ya yanaraq sonra söndüyü və ya düyməni basdıqdan dərhal sonra sönməməsi, ancaq açıq qalması ilə özünü göstərir. Ümumiyyətlə, dövrə sabit işləmir. Və LED-i açan bir tapşırıq üçün bu o qədər də vacib deyilsə, digər, daha ciddi tapşırıqlar üçün bu sadəcə qəbuledilməzdir.
Addım 4
Vəziyyəti düzəltməyə çalışacağıq. Kontakt sıçrayışının kontakt bağlandıqdan sonra bir neçə milisaniyə ərzində baş verdiyini bilirik. Düymənin vəziyyətini dəyişdirdikdən sonra 5 saniyə gözləyək. Bir adam üçün bu vaxt demək olar ki, bir anlıqdır və bir şəxsin bir düyməsini basmaq ümumiyyətlə daha uzun çəkir - bir neçə on milisaniyə. Və Arduino bu qədər qısa müddətdə əla işləyir və bu 5 saniyə bir düyməyə basaraq kontaktların sıçrayışını kəsməyə imkan verəcəkdir.
Bu eskizdə, girişin () düyməsini əvvəlki vəziyyətinə gətirdiyimiz debounce () prosedurunu (ingilis dilində "sıçrama" sadəcə "sıçrayış", "de" prefiksi əks proses deməkdir) elan edəcəyik. Bir düyməyə basma 5 msn-dən çox davam edirsə, bu, həqiqətən bir basışdır.
Mətbuatı aşkar edərək, LED vəziyyətini dəyişdiririk.
Eskizi Arduino lövhəsinə yükləyin. İndi hər şey daha yaxşıdır! Düymə uğursuz işləyir, basıldıqda, LED vəziyyəti istədiyimiz kimi dəyişir.
Addım 5
Bənzər funksionallıq Bounce2 kitabxanası kimi xüsusi kitabxanalar tərəfindən təmin edilir."Mənbələr" bölməsindəki linkdən və ya https://github.com/thomasfredericks/Bounce2 veb saytından yükləyə bilərsiniz. Kitabxananı quraşdırmaq üçün Arduino inkişaf mühitinin kitabxanalar qovluğuna yerləşdirin və IDE-ni yenidən başladın.
"Bounce2" kitabxanasında aşağıdakı üsullar var:
Sıçrama () - "Sıçrama" obyektinin başlanması;
boşluq intervalı (ms) - gecikmə vaxtını milisaniyələrlə təyin edir;
boş yerə qoşma (pin nömrəsi) - düymənin bağlı olduğu pimi təyin edir;
int update () - obyekti yeniləyir və pin vəziyyəti dəyişmişsə true, əks halda false verir;
int read () - pinin yeni vəziyyətini oxuyur.
Kitabxanadan istifadə edərək eskizimizi yenidən yazaq. Düymənin keçmiş vəziyyətini indiki ilə xatırlaya və müqayisə edə bilərsiniz, ancaq alqoritmi sadələşdirək. Düyməyə basıldıqda, presləri sayacağıq və hər tək basış LED-i açacaq və hər cüt basaraq da sönəcək. Bu eskiz qısa, oxunması asan və istifadəsi asan görünür.