Soru:
Raspberry Pi'den Arduino'ya (Leonardo) gecikmeden kaçınma
eco_bach
2014-07-14 23:20:35 UTC
view on stackexchange narkive permalink

Raspberry Pi'de (TkInter) aracılığıyla fare hareketini ve olayları yakalamak için bir Python komut dosyası kullanıyorum. Amacım bu verileri gerçek zamanlı olarak başka bir bağlı Arduino cihazına (Leonardo) göndermek.

İlk kararım, bu verileri nasıl bağlayıp göndereceğim. Anladığım kadarıyla 3 ana seçenek var:

  1. USB yoluyla doğrudan
  2. I2C
  3. Seri GPIO

Her iki USB bağlantı noktası da kullanıldığından 3. yöntemi, seri GPIO'yu seçiyordum. Ancak, bir Python modülü RPi.GPIO 'dan bahsettiği için gecikme sorunlarıyla ilgileniyorum:

bu modül gerçek zamanlı veya zamanlama açısından kritik uygulamalar için uygun değil

Seri GPIO için, C dilinde yazıldığından ve Python sarmalayıcısına sahip olduğundan daha az gecikme sorunu yaşayabileceğini tahmin ettiğim WiringPI de var.

Herhangi bir Raspberry Pi / Python uzmanı devreye girebilir mi? Gecikmeyi en aza indirmek için bir USB çözümü kullansam daha iyi olur mu?

"Gerçek zamanı" nasıl tanımlarsınız? Ne kadar gecikmeyi kabul edebilirsiniz?
Manuel girişi kaydediyorsanız, insan yanıt süreleri ~ 200mS olduğundan gecikme konusunda endişelenmenize gerek yoktur.
Bunun gerçek zamanlı veya gecikmeyle pek bir ilgisi yok çünkü iyi tanımlanmış arayüzler kullanıyorsunuz. Bağlanmanın en kolay yolu, RaspberryPI'da "/ dev / ttyACM0" veya "/ dev / ttyUSB0" olarak görünen USB Seri hattıdır. [Bağlantı] 'ya bakın (http://playground.arduino.cc/Interfacing/LinuxTTY).
USB'nin kendisi şaşırtıcı derecede yüksek gecikme süresine sahiptir - birçok veriyi hızlı bir şekilde taşımak için iyidir, ancak başlaması nispeten yavaştır. Çok kısa mesajlar, yüksek baud hızı seri veya SPI kazançları için bakın.
Iki yanıtlar:
JRobert
2014-07-15 00:04:15 UTC
view on stackexchange narkive permalink

Düşük gecikmeli iletişime ihtiyacınız varsa, yorumlanan kodun her zaman nispeten yavaş olacağını bilin. C ve C ++ hemen hemen her zaman olduğu gibi, CPU-yerel talimatlarda derlenen kod, bazı durumlarda 50: 1 veya daha fazla olmak üzere çok daha hızlı çalışacaktır. Olağanüstü durumlar için, uygulamanız çalıştıktan sonra, kritik kodu yeniden ziyaret edin ve derleme dilinde elle yazarak veya kritik bir bölümünü elle yazarak iyileştirilip iyileştirilemeyeceğine bakın. Kesinti hizmeti rutinleri, yeterince sık aranırlarsa veya kendilerinin ya da sistemin gecikmesini etkileyecek kadar işlemeye sahip olurlarsa, genellikle bu şekilde elle optimize edilir.

Bence en büyük sorun, paralel çalışan diğer programlar. Mecliste yazmak bunu düzeltmez.
Düşük gecikmeli kod, rakiplerinden daha yüksek bir öncelikte (hızlı olmasının yanı sıra) çalıştırılmalıdır. Bu genellikle, bir ISR olarak veya bir ISR (alma ucunda) veya bir API çağrısı veya eşdeğeri (iletim ucunda) tarafından başlatılan bir yürütme seviyesi işlevi olarak çalıştırılması anlamına gelir.
adamlar gerçekçi olalım, OP iletişim ve "gecikme" sorunları için HERHANGİ bir kısıtlama belirtmedi. Ayrıca gönderdiği verinin HACMİNİ de bilmiyoruz. JRobert, OP'nin python kullanmaması gerektiğini, ancak uygulaması için en iyisinin bu olabileceğini savunuyor. @Gerben: haklısınız, ancak yalnızca bir noktaya kadar. 1 Ghz, mütevazı sayı hesaplama problemleri için çok hızlı bir hesaplamadır. Tek bir çekirdeğin onun için şişe boynu olduğunu düşünmeyin
OP, aslında, gecikme sorunları ile ilgili bir endişeyi belirtmiştir.
portforwardpodcast
2015-04-11 15:34:54 UTC
view on stackexchange narkive permalink

Raspberry Pi ve Arduino arasında, UART kullanmak en iyi seçenektir. Biliyorum çünkü bu benim 3. projem. (Ayrıca USB imkansızdır) UART'ı 1000000 baud'da çalıştırmalısınız. Varsayılan UART yapılandırması karakter başına 9 bittir. Bu, 1 / (1000000/9) veya 0.000009 aka 9 mikrosaniye'lik bir gecikme bırakır. Fare komutları gönderiyorsanız, güncelleme başına 2 bayt alacağını tahmin ediyorum, yani güncelleme başına 18 mikrosaniye. Karşılaştırma için, Wikipedia'ya göre Bluetooth 625 mikrosaniyenin mutlak en iyi gecikmesi.

Öyleyse sadece UART kullanın ve mutlu olun. Ayrıca, Raspberry Pi'nin RX'ine giden Arduino'nun TX pininde bir seviye değiştirici veya sadece düz bir direnç bölücü kullanmanız gerekir. Bunun nedeni Arduino'nun 5 V ve Raspberry Pi'nin 3,3 V olmasıdır. Bu konuda yardıma ihtiyacınız varsa bir yorum gönderin.

Son olarak: Pi üzerinde Python kullanmak iyidir. Python over C ile sisteminize gözle görülür bir gecikme eklemeyeceksiniz (yalnızca doğrudan veri aktarımı yaptığınızı varsayarak).



Bu Soru-Cevap, otomatik olarak İngilizce dilinden çevrilmiştir.Orijinal içerik, dağıtıldığı cc by-sa 3.0 lisansı için teşekkür ettiğimiz stackexchange'ta mevcuttur.
Loading...