Სარჩევი:

არდუინოს სრული მბრუნავი გადაწყვეტა: 5 ნაბიჯი
არდუინოს სრული მბრუნავი გადაწყვეტა: 5 ნაბიჯი

ვიდეო: არდუინოს სრული მბრუნავი გადაწყვეტა: 5 ნაბიჯი

ვიდეო: არდუინოს სრული მბრუნავი გადაწყვეტა: 5 ნაბიჯი
ვიდეო: Lesson 95: Using L293D 4 DC Motors Shield for Arduino UNO and Mega | Arduino Step By Step Course 2024, ნოემბერი
Anonim
არდუინოს სრული მბრუნავი ხსნარი
არდუინოს სრული მბრუნავი ხსნარი

მბრუნავი კოდირება არის ელექტრონული პროექტების შემობრუნებადი კონტროლის ღილაკები, რომლებიც ხშირად გამოიყენება არდუინოს ოჯახის მიკროკონტროლებთან ერთად. ისინი შეიძლება გამოყენებულ იქნას პარამეტრების სრულყოფის, მენიუს ნავიგაციის, ეკრანზე ობიექტების გადაადგილების, ნებისმიერი სახის მნიშვნელობების დასადგენად. ისინი ჩვეულებრივი შემცვლელნი არიან პოტენომეტრებისათვის, რადგან მათი უფრო ზუსტი და უსასრულო ბრუნვა შესაძლებელია, ისინი ერთდროულად ზრდის ან ამცირებენ ერთ დისკრეტულ მნიშვნელობას და ხშირად ინტეგრირდებიან ბიძგიანი გადამრთველით ფუნქციების შერჩევისთვის. ისინი ყველა ფორმისა და ზომისაა, მაგრამ ყველაზე დაბალი ფასის დიაპაზონი რთულია, როგორც ქვემოთ არის განმარტებული.

არსებობს უამრავი სტატია როტარის დამშიფრებების მუშაობის დეტალებისა და გამოყენების რეჟიმების შესახებ და მრავალი ნიმუში კოდი და ბიბლიოთეკა მათი გამოყენების შესახებ. ერთადერთი პრობლემა ის არის, რომ არცერთი მათგანი არ მუშაობს 100% -ით ზუსტი ჩინური მბრუნავი მოდულებით ყველაზე დაბალი ფასის დიაპაზონში.

ნაბიჯი 1: მბრუნავი კოდირება შიგნით

მბრუნავი კოდირება შიგნით
მბრუნავი კოდირება შიგნით
მბრუნავი კოდირება შიგნით
მბრუნავი კოდირება შიგნით
მბრუნავი კოდირება შიგნით
მბრუნავი კოდირება შიგნით

კოდირების მბრუნავ ნაწილს აქვს სამი პინი (და კიდევ ორი სურვილისამებრ გადართვის ნაწილისთვის). ერთი არის საერთო საფუძველი (შავი GND), დანარჩენი ორი არის მიმართულების დასადგენად, როდესაც ღილაკი მოტრიალებულია (მათ ხშირად უწოდებენ ლურჯ CLK და წითელ DT). ორივე მათგანი მიმაგრებულია მიკროკონტროლერის PULLUP შეყვანის პინზე, რაც მაღალ დონეს მათი ნაგულისხმევი მნიშვნელობით ხდის. როდესაც ღილაკი გადატრიალებულია წინ (ან საათის ისრის მიმართულებით), ჯერ ლურჯი CLK ეცემა LOW დონეზე, შემდეგ კი წითელი DT მიჰყვება. შემობრუნების შემდეგ, ლურჯი CLK ბრუნდება HIGH- ზე, შემდეგ კი როდესაც საერთო GND პატჩი ტოვებს ორივე კავშირის ქინძისთავს, წითელი DT ასევე ბრუნდება HIGH- ზე. ამრიგად, შეავსეთ ერთი სრული მონიშვნა FWD (ან საათის ისრის მიმართულებით). იგივე ხდება მეორე მიმართულებით BWD (ან საათის ისრის საწინააღმდეგოდ), მაგრამ ახლა წითელი პირველად ეცემა, ხოლო ლურჯი ამოდის ბოლოს, როგორც ეს ნაჩვენებია ორ დონის სურათებში.

ნაბიჯი 2: უბედურება, რომელიც ბევრს იწვევს ნამდვილ ტკივილს

უბედურება, რომელიც ბევრს იწვევს ნამდვილ ტკივილს
უბედურება, რომელიც ბევრს იწვევს ნამდვილ ტკივილს
უბედურება, რომელიც ბევრს იწვევს ნამდვილ ტკივილს
უბედურება, რომელიც ბევრს იწვევს ნამდვილ ტკივილს
უბედურება, რომელიც ბევრს იწვევს ნამდვილ ტკივილს
უბედურება, რომელიც ბევრს იწვევს ნამდვილ ტკივილს

Arduino– ს მოყვარულთათვის საერთო პრობლემა ის არის, რომ იაფი Rotary კოდირების მოდულები ახორციელებენ დამატებით ცვლილებებს გამომავალ დონეზე, რაც იწვევს დამატებითი და არასწორი მიმართულების რაოდენობის კითხვას. ეს ხელს უშლის უნაკლო დათვლას და შეუძლებელს ხდის ამ მოდულების ინტეგრირებას ზუსტ მბრუნავ პროექტებში. ეს ზედმეტი გადახრები გამოწვეულია შემაერთებელი ქინძისთავების ლაქების მექანიკური მოძრაობით და დამატებითი კონდენსატორების გამოყენებაც კი არ შეუძლია მათ მთლიანად აღმოფხვრას. Bounces შეიძლება გამოჩნდეს ყველგან სრული ციკლის ციკლში და გამოსახულია რეალური ცხოვრების სცენარებით სურათებზე.

ნაბიჯი 3: სასრული მდგომარეობის აპარატის (FSM) გადაწყვეტა

სასრული მდგომარეობის მანქანა (FSM) გადაწყვეტა
სასრული მდგომარეობის მანქანა (FSM) გადაწყვეტა

სურათი გვიჩვენებს დონის სრული ცვლილების შესაძლებლობას ორი ქინძისთავისთვის (ლურჯი CLK და წითელი DT), როგორც სწორი, ასევე ცრუ აღსაკვეთად. ამ სახელმწიფო მანქანაზე დაყრდნობით შესაძლებელია დაისახოს სრული გადაწყვეტა, რომელიც ყოველთვის მუშაობს 100% სიზუსტით. იმის გამო, რომ ამ ხსნარში არ არის საჭირო ფილტრაციის შეფერხება, ის ასევე ყველაზე სწრაფია. ქინძისთავების მდგომარეობის სივრცის მუშაობის რეჟიმისგან გამოყოფის კიდევ ერთი სარგებელი არის ის, რომ თქვენ შეგიძლიათ გამოიყენოთ როგორც გამოკითხვა, ასევე შეწყვეტის რეჟიმი საკუთარი შეხედულებისამებრ. გამოკითხვას ან შეფერხებებს შეუძლია აღმოაჩინოს დონის ცვლილებები ქინძისთავებზე და ცალკეული რუტინა გამოითვლის ახალ მდგომარეობას არსებული მდგომარეობისა და დონის ცვლილების ფაქტობრივი მოვლენების საფუძველზე.

ნაბიჯი 4: Arduino კოდი

არდუინოს კოდი
არდუინოს კოდი

ქვემოთ მოყვანილი კოდი ითვლის FWD და BWD ტკიპებს სერიულ მონიტორზე და ასევე აერთიანებს სურვილისამებრ გადართვის ფუნქციას.

// პიტერ ცურგაი 2019-04-10

// არტუინოს პორტებზე გამოსახული მბრუნავი ქინძისთავები

#განსაზღვრეთ SW 21 #განსაზღვრეთ CLK 22 #განსაზღვრეთ DT 23

// ბრუნვის მიერ მორგებული მრიცხველის მიმდინარე და წინა მნიშვნელობა

int curVal = 0; int prevVal = 0;

// FSM– ის შვიდი მდგომარეობა (სასრული მდგომარეობის მანქანა)

#განსაზღვრეთ IDLE_11 0 #განსაზღვრეთ SCLK_01 1 #განსაზღვრეთ SCLK_00 2 #განსაზღვრეთ SCLK_10 3 #განსაზღვრეთ SDT_10 4 #განსაზღვრეთ SDT_00 5 #განსაზღვრეთ SDT_01 6 int state = IDLE_11;

void setup () {

სერიული.დაწყება (250000); Serial.println ("დაწყება …"); // დონე მაღალი იქნება ნაგულისხმევი ყველა pin pin PIN (SW, INPUT_PULLUP); pinMode (CLK, INPUT_PULLUP); pinMode (DT, INPUT_PULLUP); // ორივე CLK და DT ხელს უწყობს შეფერხებებს ყველა დონის ცვლილებისთვის attachInterrupt (digitalPinToInterrupt (CLK), rotaryCLK, CHANGE); attachInterrupt (digitalPinToInterrupt (DT), rotaryDT, CHANGE); }

ბათილი მარყუჟი () {

// სურვილისამებრ გადართვის გატარება ინტეგრირებული ზოგიერთ მბრუნავ კოდირებაში, თუ (digitalRead (SW) == LOW) {Serial.println ("დაჭერილი"); ხოლო (! digitalRead (SW)); } // მრიცხველის ღირებულების ნებისმიერი ცვლილება ნაჩვენებია სერიულ მონიტორში if (curVal! = PrevVal) {Serial.println (curVal); prevVal = curVal; }}

// სახელმწიფო მანქანების გადასვლები CLK დონის ცვლილებებისთვის

void rotaryCLK () {if (digitalRead (CLK) == LOW) {if (მდგომარეობა == IDLE_11) მდგომარეობა = SCLK_01; სხვა შემთხვევაში თუ (მდგომარეობა == SCLK_10) მდგომარეობა = SCLK_00; სხვა შემთხვევაში თუ (მდგომარეობა == SDT_10) მდგომარეობა = SDT_00; } else {if (მდგომარეობა == SCLK_01) მდგომარეობა = IDLE_11; სხვა შემთხვევაში თუ (მდგომარეობა == SCLK_00) მდგომარეობა = SCLK_10; სხვა შემთხვევაში თუ (მდგომარეობა == SDT_00) მდგომარეობა = SDT_10; else if (მდგომარეობა == SDT_01) {მდგომარეობა = IDLE_11; curVal--; }}}

// State Machine გადასვლები DT დონის ცვლილებებისთვის

void rotaryDT () {if (digitalRead (DT) == LOW) {if (state == IDLE_11) state = SDT_10; სხვა შემთხვევაში თუ (მდგომარეობა == SDT_01) მდგომარეობა = SDT_00; სხვა შემთხვევაში თუ (მდგომარეობა == SCLK_01) მდგომარეობა = SCLK_00; } else {if (მდგომარეობა == SDT_10) მდგომარეობა = IDLE_11; სხვა შემთხვევაში თუ (მდგომარეობა == SDT_00) მდგომარეობა = SDT_01; სხვა შემთხვევაში თუ (მდგომარეობა == SCLK_00) მდგომარეობა = SCLK_01; სხვა შემთხვევაში თუ (მდგომარეობა == SCLK_10) {მდგომარეობა = IDLE_11; curVal ++; }}}

ნაბიჯი 5: უნაკლო ინტეგრაცია

თქვენ შეგიძლიათ შეამოწმოთ თანდართულ ვიდეოში, რომ FSM გადაწყვეტა მუშაობს ზუსტად და სწრაფად, თუნდაც დაბალი დიაპაზონის მბრუნავი კოდირების შემთხვევაში, სხვადასხვა სპორადული გადახრის ეფექტებით.

გირჩევთ: