Სარჩევი:

მარტივი მბრუნავი დეკოდერი: 4 ნაბიჯი
მარტივი მბრუნავი დეკოდერი: 4 ნაბიჯი

ვიდეო: მარტივი მბრუნავი დეკოდერი: 4 ნაბიჯი

ვიდეო: მარტივი მბრუნავი დეკოდერი: 4 ნაბიჯი
ვიდეო: პირველი კვირის ვარჯიში 2024, ნოემბერი
Anonim
Image
Image
მარტივი მბრუნავი დეკოდირება
მარტივი მბრუნავი დეკოდირება

ეს ინსტრუქცია აღწერს რიგითი მბრუნავი კოდირების დეკოდირების მარტივ მეთოდს Arduino Uno R3 გამოყენებით.

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

მოწოდებულია კოდის შეწყვეტილი და შეუფერხებელი ვერსიები.

კოდის შეწყვეტის ვერსია მოითხოვს მხოლოდ ერთ შეწყვეტის პინს.

სურათები:

  • გახსნის ფოტო გვიჩვენებს აწყობილი კოდირებას.
  • ეკრანის კადრი აჩვენებს შეწყვეტის ვერსიის კოდს და ითვლის, როდესაც კოდირების ლილვი ბრუნავს საათის ისრის მიმართულებით და საათის ისრის საწინააღმდეგოდ.
  • ვიდეო გვიჩვენებს რაოდენობას სწრაფი ბრუნვის დროს.

ნაბიჯი 1: წრიული დიაგრამა

Წრიული დიაგრამა
Წრიული დიაგრამა

კოდირების გაყვანილობის დიაგრამა ნაჩვენებია ნახ.1 -ში.

ჯუმბერის მავთულები მიმაგრებულია პირდაპირ კოდირების ქინძისთავებზე.

შეცვალეთ ორი ცისფერი მავთული, თუ დათვლის მიმართულება შეიცვალა.

ნაბიჯი 2: ნაწილების სია

შემდეგი ნაწილები მოპოვებულია

  • მხოლოდ 1 Arduino UNO R3 USB კაბელით.
  • მხოლოდ 1 თანმიმდევრული მბრუნავი კოდირება (EC11 ან ექვივალენტი) გადამრთველით.
  • 1 ღილაკი, რომელიც შესაფერისია ლილვისთვის.
  • 3 მხოლოდ Arduino მამაკაცი-მამაკაცი მხტუნავი მავთული.

ნაბიჯი 3: თეორია

თეორია
თეორია

თანმიმდევრული მბრუნავი კოდირება წარმოქმნის ორ კვადრატულ ტალღას, რომელთაგან თითოეული გადაადგილებულია 90 გრადუსით, როგორც ეს ნაჩვენებია ნახ. 1-ში.

კონტაქტი A და B კონტაქტების ლოგიკური ნიმუშები განსხვავებულია, როდესაც ლილვი ბრუნავს საათის ისრის მიმართულებით (CW) და საათის ისრის საწინააღმდეგოდ (CCW) 1 -დან 6 პოზიციამდე.

ბრუნვის მიმართულების განსაზღვრის საერთო მეთოდები მოიცავს:

  • ტექნიკა
  • ტყუპი წყვეტს
  • ნიმუშების საძიებელი ცხრილები

ეს პროექტი იყენებს პროგრამულ მეთოდს, რომელიც არ საჭიროებს საძიებო ცხრილებს. [1]

მიმართულება

იმის ნაცვლად, რომ შევხედოთ A და B კონტაქტებიდან გამომავალ შაბლონებს, ყურადღება გავამახვილოთ კონტაქტზე A.

თუ ჩვენ ვიღებთ კონტაქტს B კონტაქტის ყოველი გადასვლის შემდეგ, ჩვენ აღვნიშნავთ, რომ:

  • კონტაქტს A და B აქვს საპირისპირო ლოგიკური მდგომარეობა, როდესაც კოდირება ბრუნავს CW
  • კონტაქტს A და კონტაქტს B აქვს ერთი და იგივე ლოგიკური მდგომარეობა, როდესაც კოდირება ბრუნავს CCW

ფაქტობრივი კოდი:

// ----- ითვლი გადასვლებს

CurrentStateA = stateContactA (); if (CurrentStateA! = LastStateA) {CurrentStateB = digitalRead (ContactB); თუ (CurrentStateA == CurrentStateB) რაოდენობა ++; თუ (CurrentStateA! = CurrentStateB) რაოდენობა--; LastStateA = CurrentStateA; }

ეს მეთოდი გთავაზობთ შემდეგ უპირატესობებს:

  • საძიებელი მაგიდები არ არის საჭირო
  • საჭიროა მხოლოდ ერთი შეწყვეტის ხაზი

დებიუცია

ყველა მექანიკური კოდირება განიცდის "კონტაქტური გადახტომა".

თუ გადართვის კონტაქტი არ ხდება/სუფთად იშლება, მისი ლოგიკური მდგომარეობა სწრაფად იცვლება მაღალიდან დაბალამდე, სანამ გადამრთველის კონტაქტი არ მოგვარდება. ეს იწვევს ცრუ დათვლას.

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

ამ მიდგომის მინუსი ის არის, რომ გადასვლები შეიძლება გამოტოვდეს, თუ კოდირების ლილვი სწრაფად ბრუნავს.

პროგრამული უზრუნველყოფის დებონუსი

ეს მეთოდი იყენებს ორ მრიცხველს (ღია, დახურული), რომლებიც ნულოვანია. [2]

მას შემდეგ რაც გამოვლინდება გადასვლა კონტაქტზე A:

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

ფაქტობრივი კოდი:

// ----- დებიუნით კონტაქტი A

while (1) {if (digitalRead (ContactA)) {// ----- ContactA ღიაა დახურულია = 0; // ცარიელი საპირისპირო ინტეგრატორი Open ++; // ინტეგრირება if (Open> MaxCount) return HIGH; } else {// ----- ContactA დახურულია ღია = 0; // ცარიელი საპირისპირო ინტეგრატორი დახურულია ++; // ინტეგრაცია if (დახურული> MaxCount) დაბრუნება LOW; }}

არ არის საჭირო კონტაქტის B დენონსირება, რადგან კონტაქტები A და კონტაქტები B არ ემთხვევა.

ითვლიან

მექანიკური "დამამცირებელი" ეფექტურად აორმაგებს თქვენს რაოდენობას, რადგან ორი რაოდენობა რეგისტრირებულია დაწკაპუნებებს შორის (იხ. სურათი 1).

"დაკავებულთა" რაოდენობა შეიძლება განისაზღვროს modulo 2 არითმეტიკით, როგორც ნაჩვენებია ქვემოთ.

ფაქტობრივი კოდი:

// ----- ითვლი "დაკავებულებს"

if (რაოდენობა % 2 == 0) {Serial.print ("დათვლა:"); Serial.println (რაოდენობა / 2); }

ცნობები

დამატებითი ინფორმაცია შეგიძლიათ იხილოთ აქ:

[1]

howtomechatronics.com/tutorials/arduino/ro…

[2]

newbiehack.com/ButtonorSwitchDebounceinSof…

ნაბიჯი 4: პროგრამული უზრუნველყოფა

ეს პროექტი მოითხოვს Ardino Uno R3 IDE (ინტეგრირებული განვითარების გარემოს) უახლეს ვერსიას, რომელიც ხელმისაწვდომია

ჩამოტვირთეთ Arduino– ს შემდეგი ორი ესკიზიდან თითოეული (მიმაგრებულია)

  • rotary_encoder_1.ino (გამოკითხვის ვერსია)
  • rotary_encoder_2.no (შეწყვეტის ვერსია)

ორჯერ დააწკაპუნეთ თქვენთვის სასურველ ვერსიაზე და მიჰყევით ეკრანზე მითითებებს.

ისიამოვნეთ…

დააწკაპუნეთ აქ, რომ ნახოთ ჩემი სხვა ინსტრუქციები.

გირჩევთ: