İçindekiler:

Bölüm 3: GPIO: ARM Montajı: Çizgi Takipçisi: TI-RSLK: 6 Adım
Bölüm 3: GPIO: ARM Montajı: Çizgi Takipçisi: TI-RSLK: 6 Adım

Video: Bölüm 3: GPIO: ARM Montajı: Çizgi Takipçisi: TI-RSLK: 6 Adım

Video: Bölüm 3: GPIO: ARM Montajı: Çizgi Takipçisi: TI-RSLK: 6 Adım
Video: SKR V1.4 - Additional Servos 2024, Mayıs
Anonim
Image
Image
Donanım
Donanım

Merhaba. Bu, ARM derlemesini kullanmaya devam ettiğimiz bir sonraki taksittir (daha yüksek seviyeli bir dil yerine). Bu Eğitilebilir Yazının ilham kaynağı, Texas Instruments Robotics System Learning Kit'in Lab 6'sı veya TI-RSLK'dır.

Kitteki mikro denetleyiciyi, MSP432 LaunchPad geliştirme kartını kullanacağız, ancak belki de LaunchPad'i kullanmasanız veya T. I. Müfredat.

ARM Assembly'yi, geliştirme ortamını ve nasıl proje yapılacağını tanıtan bir Instructable ile başladık.

Bir sonraki ARM Meclisi Eğitilebilirliği, giriş/çıkış (GPIO) ile nasıl etkileşime girileceğini tanıttı.

Ardından bilgimizi genişlettik ve LED'leri ve anahtarları kontrol eden işlevleri tanıttık.

Şimdi bu Eğitilebilir Tablo ile öğrendiklerimizi daha eğlenceli, daha kullanışlı bir şey yapmak için kullanabiliriz: bir çizgiyi tespit etmek.

Bu, daha sonra bir çizgi izleyen robot yaptığımızda bize yardımcı olabilir.

Müfredatta, programlamanın çoğu C veya C++ ile yapılır, ancak daha yüksek seviyeli dillere ve kütüphanelere bağlı olarak başlamadan önce Assembly'ye aşina olmak yardımcı olur.

Adım 1: Donanım

Donanım
Donanım
Donanım
Donanım
Donanım
Donanım

Zaten kaynaklar olduğu için donanımı ayrıntılı olarak yeniden düzenlemek istemiyorum, ancak gerektiğinde açıklamalar ekleyeceğiz.

Bu Eğitilebilir Tablo için, TI-RSLK'nın (robot kiti) bir parçası olarak geldiği için Pololu'dan Yansıma Sensörü Dizisini kullanacağız. Derste ve müfredatın Lab 6'sında kullanılandır.

Eğer buna sahip değilseniz, varlık ve yokluk için YÜKSEK veya DÜŞÜK dijital sinyal veren herhangi bir IR dedektörünü (veya bir dizisini) kullanabilirsiniz.

Dizi sensörü en iyisidir çünkü çizginin tam ortasında mı yoksa bir tarafta mı olduğumuzu algılamaya yardımcı olabilir. Ayrıca, daha sonra göreceğimiz gibi, robotun çizgiye göre açısını tespit etmemize yardımcı olabilir.

Yansıtma dizisinde birbirine çok yakın dedektörler bulunur. Bu, elbette hattın kalınlığına bağlı olarak birden fazla algılama sinyali almamız gerektiği anlamına gelir.

Eğer öyleyse, robot doğrudan çizgiyle aynı hizada değilse, çizginin olması gerekenden daha geniş olduğu bir çıktı vermelidir (çünkü bir açıdayız).

Yukarıdakilerin daha iyi bir açıklaması için Lab 6 belgesine bakın.

Sensörü MSP432 LaunchPad geliştirme kartına kablolama/bağlama konusunda yardım için, burada bazı yararlı talimatlar bulunmaktadır.

Bu Adıma aynı(benzer?) pdf talimatlarını da ekledim.

Pololu belgelerini dikkatlice okursanız, 5V yerine 3.3V kullanıyorsanız "3.3V bypass"ın nedenini açıklarlar.

Henüz robotu inşa etmiyoruz, bunun yerine sadece ARM montajını ve ayrıca robotun parçaları (alt sistemleri) ile nasıl etkileşime gireceğimizi öğreniyoruz, yukarıdaki talimatları harfi harfine takip etmek zorunda değiliz.

Şimdilik, hat sensörü dizisini bağlamak sadece aşağıdakilere kadar kaynar/azaltır:

  • MSP432 kartından 3.3V ve GND'yi sensör dizisine bağlayın.
  • MSP432'den bir bağlantı noktası pimini (P5.3'ü öneririm) hat sensörü dizisindeki LED etkinleştirme pimine bağlayın. Sensördeki bu pin 3.3V ile GND arasındadır.
  • tek bir portun tüm sekiz pinini/bitini (P7.0 ila P7.7 öneririm) sensör dizisinin "1" ila "8" etiketli sekiz pinine bağlayın. Bunlar, hissettiklerine bağlı olarak YÜKSEK veya DÜŞÜK gidecek çizgilerdir.

Bu adımın görsellerinde ve videoda da görebileceğiniz gibi, programlama, hata ayıklama, test etme, öğrenme kolaylığı istediğim için sensörü robot şasesine takmadım.

Yani her şey bağlıyken, yazılıma girmeye hazırız.

Adım 2: Satır İzleme

Satır Takip
Satır Takip
Satır Takip
Satır Takip

Yansıtma dizisi sensörü oldukça şık çünkü en az iki şekilde yardımcı olabilir.

  • Robotun çizgi üzerinde mi yoksa bir tarafa doğru mu sürüklendiğini belirleyin.
  • Robot çizgi yönünde mi hizalanmış, yoksa bir açıda mı?

Dizinin dedektörlerinin her biri esasen YÜKSEK veya DÜŞÜK olmak üzere bir bit bilgi sağlar.

Buradaki fikir, tüm bu bitleri tek bir sayı veya tek bit deseninde birleştirmek ve bu kalıbı kararlar vermek için (doğru hareket etmek için) kullanmaktır.

Adım 3: Gerçekten Başlamadan Önce…

.. ARM montaj programlama hakkında yeni bir şeyler öğrenmemiz gerekiyor. Ve sadece başka bir talimattan bahsetmiyorum. Bunlar küçük olma eğilimindedir.

Şimdiye kadar programlarımızda "yığın" kullanmadık.

Farklı alt rutinlerde küresel olarak çekirdek işlemci kayıtlarının çoğunu kullanmaya güvendik.

Yaptığımız tek şey, bir işlev için LR (bağlantı kaydı) adresini kaydetmek ve geri yüklemekti - diğer birkaç işlevi çağıran. (Burada "işlev" ve "altyordamı" birbirinin yerine kullanıyorum).

Yaptığımız şey iyi değil. Diğer işlevleri iç içe yerleştirmek istersek ne olur? Ya birden fazla yuvalama seviyemiz varsa?

Önceki örneklerde, LR veya dönüş adresi için depolama alanı olarak R6 kaydını kullanmayı seçtik. Ancak daha ileri/daha derin yuvalama yapmak istersek R6'nın değerini değiştirmeye devam edemeyiz. Başka bir kayıt daha seçmemiz gerekecekti. Ve başka. Ardından, hangi çekirdek işlemci kaydının hangi LR'nin hangi işleve geri yükleneceğini tuttuğunu takip etmek külfetli hale gelir.

Şimdi "yığına" bir göz atacağız.

4. Adım: Yığın

İşte yığını açıklayan bazı okuma materyalleri.

Birkaç fikrin daha büyük bir savunucusuyum:

  • sadece gerektiği kadar teori, çabucak uygulamaya geçin
  • gerektiği gibi öğrenin, sadece amaçsız alıştırmalar veya örnekler değil, gerçekten bir şeyler yapmaya odaklanın.

Yığın hakkında konuşan çevrimiçi birçok ARM ve MSP432 belgesi var, bu yüzden tüm bunları yeniden yazmayacağız. Ayrıca burada yığının kullanımını minimumda tutacağım - dönüş adresini (Bağlantı Kaydı) kaydedeceğim.

Esasen, sadece talimatlara ihtiyacımız var:

PUSH {kayıt listesi}

POP{kayıt listesi}

Veya bizim durumumuzda, özellikle:

BASIN {LR}

POP {LR}

Böylece, bir derleme işlevi/altyordamı şöyle görünür:

funcEtiket:.asmfunc

PUSH{LR};bu muhtemelen girişteki ilk talimatlardan biri olmalıdır.; burada daha fazla kod yapın..; falan.. falan… falan…; tamam, işlevle işimiz bitti, POP{LR} işlevini çağırmaya geri dönmeye hazırız; bu, doğru dönüş adresini aramaya geri döndürür; işlev. BX LR; dönüş.endasmfunc

Video, iç içe geçmiş birkaç işlevin canlı örneğinden geçer.

Adım 5: Yazılım

Ekli "MSP432_Chapter…" etiketli dosya, MSP432'nin bağlantı noktaları hakkında birçok iyi bilgiye sahiptir ve bu belgeden aşağıdaki bağlantı noktalarını, kayıtları, adresleri vb. alıyoruz. Ancak biraz eski. Ancak, Port 5 ve üstü için listelenen ayrıntılı adresleri görmedim. (yalnızca "alternatif işlevler"). Ama yine de kullanışlı.

İki Port kullanacağız. P5, P7, P1 ve P2.

P5.3 (tek bit) çıkışı, sensör üzerindeki IR LED-etkinliğini kontrol etmek için olacaktır. P5.3'ü kullanıyoruz çünkü bu, sensör dizisine giden diğer MSP432 bağlantılarıyla aynı başlıkta açıkta kalan bir pin.

P7.0 ila P7.7, sensörden veri toplayan sekiz giriş olacaktır; ne "gördüğü".

P1.0 tek kırmızı LED'dir ve bunu bize verilerin bazı göstergelerini vermek için kullanabiliriz.

P2.0, P2.1, P2.2 RGB LED'dir ve bunu, farklı renk olasılıklarıyla birlikte, bize sensör verilerinin göstergesini vermek için kullanabiliriz.

Tüm bunlarla ilgili önceki Talimatları incelediyseniz, programı nasıl kuracağınızı zaten biliyorsunuzdur.

Bağlantı noktaları ve bitler vb. için bildirim bölümüne sahip olmanız yeterlidir.

Bir "ana" bölümünüz olacak.

P7'den gelen verileri sürekli okuyacağımız, bu verilere karar verdiğimiz ve buna göre iki LED'i yaktığımız bir döngü olmalı.

İşte yine Port Register adresleri:

  • GPIO P1: 0x4000 4C00 + 0 (çift adresler)
  • GPIO P2: 0x4000 4C00 + 1 (tek adresler)
  • GPIO P3: 0x4000 4C00 + 20 (çift adresler)
  • GPIO P4: 0x4000 4C00 + 21 (tek adresler)
  • GPIO P5: 0x4000 4C00 + 40 (çift adresler)
  • GPIO P6: 0x4000 4C00 + 41 (tek adresler)
  • GPIO P7: 0x4000 4C00 + 60 (çift adresler)
  • GPIO P8: 0x4000 4C00 + 61 (tek adresler)
  • GPIO P9: 0x4000 4C00 + 80 (eş adresler)
  • GPIO P10: 0x4000 4C00 + 81 (tek adresler)

Kalın yazılanlar, bu Eğitilebilir Tablo için kullanacağımız şeydir.

IR Dedektörlerini Okumak İçin Program Adımları

Aşağıdaki, programı C'de yazmak için kullanılan psuedo kodudur, ancak yine de yararlıdır ve programın derleme sürümünde bunu oldukça yakından takip edeceğiz.

ana program0) Başlatma //portlar while(1) { 1) P5.3'ü yüksek olarak ayarlayın (IR LED'i açın) 2) P7.0'ı bir çıkış yapın ve yüksek olarak ayarlayın (kondansatörü şarj ediyor) 3) 10 bizi bekleyin, Clock_Delay1us (10); 4) P7.0'ı bir giriş yapın 5) Bu döngüyü 10.000 kez çalıştırın a) P7.0'ı okuyun (P7.0'daki voltajı ikiliye dönüştürür) b) İkili çıktıyı P1.0'a (ikiliği gerçek zamanlı olarak görmenizi sağlar)) 6) P5.3'ü düşük olarak ayarlayın (IR LED'i kapatın, güç tasarrufu yapın) 7) 10 ms bekleyin, Clock_Delay1ms(10); } // tekrarla (while()'a geri dön)

Adım 6: Kodu İyileştirelim

Pololu IR LED dizisinin amacı veya kullanımı, bir çizgiyi tespit etmek ve robotun (geleceğin) doğrudan hat üzerinde mi yoksa bir tarafta mı merkezlendiğini bilmektir. Ayrıca, çizgi belirli bir kalınlığa sahip olduğundan, sensör dizisi doğrudan çizgiye dik ise, N sayıda sensör diğerlerinden farklı bir okuma yapacaktır, oysa IR LED dizisi belirli bir açıdaysa (dik değil), o zaman N+1 veya N+2 IR LED/dedektör çiftleri artık farklı bir okuma vermelidir.

Bu nedenle, hattın varlığını gösteren sensör sayısına bağlı olarak, merkezde olup olmadığımızı ve açılı olup olmadığımızı bilmeliyiz.

Bu son deney için, sensör dizisinin bize ne söylediği hakkında bize daha fazla bilgi vermesi için kırmızı LED ve RGB LED'i alıp alamayacağımıza bakalım.

Video tüm ayrıntılara giriyor. Son kod da ektedir.

Bu, GPIO ile ilgili ARM Meclisi serisini tamamlar. Daha sonra daha fazla ARM Assembly ile geri dönmeyi umuyoruz.

Teşekkürler.

Önerilen: