Pixhawk yük bırakma servosu Python'dan neden dönmüyor
Yük bırakma mekanizmasını taktın, Raspberry Pi'deki Python kodundan servoyu açmaya çalışıyorsun. Kod hata vermeden bitiyor, telemetri akıyor, Mission Planner bağlı görünüyor. Servo ise yerinden oynamıyor. Bazen de bir an dönüp eski yerine geri geliyor.
Bunun üç olası sebebi var: otopilot komutu reddetmiş olabilir; kabul edip kontrolü kumandaya geri vermiş olabilir; ya da çıkış doğru ama servoya güç gitmiyor olabilir. Hangisi olduğunu tahmin etmek yerine otopilotun verdiği cevabı okumak gerekiyor.
Pixhawk komutuna ne cevap veriyor
Servo komutunu yolladığında Pixhawk bir onay paketi döner. Kodun bu paketi okumuyorsa komutun reddedildiğini hiçbir zaman öğrenemezsin.
Paket hiç gelmiyorsa Pi'den Pixhawk'a giden hat kopuktur; ilk bakılacak yer Pi'nin TX ucu. "Reddedildi" geliyorsa otopilot o kanalı başka bir işe ayırmıştır. "Kabul edildi" geldiği halde servo dönmüyorsa sorun kabloda ya da güçtedir.
Kanalın görevi başka bir işse komut reddedilir
ArduPilot her çıkış kanalına bir görev atar ve servo komutunu yalnızca bazı görevlerdeki kanallara uygular: görevi boş olanlar, kumandayı aynen geçirenler, ilaçlama pompası ve gripper. Motor kanalına ya da röleye ayrılmış bir pine giden komut reddedilir.
Aşağıdaki şekilde kırmızı çerçeveye bak: quad'da ilk dört ana çıkış motordur, onlara servo komutu gitmez. Servoyu AUX OUT 1'e taktıysan komutta yazacağın kanal numarası, sütunun üstündeki mavi 9'dur; kartın üstündeki "1" baskısı değil.
Sarı kesikli çerçeve AUX 5 ve 6. ArduPilot belgelerine göre bazı kartlarda bu iki pin varsayılan olarak röleye ayrılır; servoyu ilk dört AUX çıkışından birine takmak daha az sürprizli. Taktığın kanalın görevini de 0 yap; AUX OUT 1 için bu SERVO9_FUNCTION = 0 demek.
Servo bir an dönüp geri geliyorsa
Takımların en çok takıldığı yer burası. Servoyu kumandadan da açabilmek için kanalı "kumandayı geçir" görevine alıyorsun. Otopilot Python komutunu kabul ediyor, servo dönüyor. Kumandadaki düğme ya da kol biraz oynadığı anda çıkış yeniden kumandanın değerine dönüyor.
Otopilot burada o kanalın ölü bölgesine (RCn_DZ) bakar. Grafikteki taralı bant bu bölge: komut geldiği andaki kumanda değerinin iki yanı. Kumanda bandın içinde kaldıkça servo komuttaki 1900'de durur; bandın kenarını geçtiği anda çıkış kumandanın değerine atlar ve yeni bir komut gelene kadar orada kalır.
Ölü bölgenin varsayılanı 0, yani bant hiç yok: alıcıdaki bir mikrosaniyelik oynama bile servoyu geri çeker. Yük servosunu yalnızca Python'dan sürüyorsan görevi 0 yap. Kumandadan da sürmen gerekiyorsa o kumanda kanalının ölü bölgesini büyüt; RC10_DZ = 30 girersen ±30 µs içindeki oynamalar servoyu yerinden oynatmaz.
Kumanda girişini ölçekleyerek geçiren görevlerde (140-155) istediğin değer olduğu gibi çıkmaz. Varsayılan SERVOn_MIN/MAX (1100/1900) ile 1900 istersen çıkışta 1820 görürsün.
Örnek: Teknofest yük bırakma mekanizması
Yük bırakma görevlerinde en yaygın düzen şöyle: servo gövdenin altına vidalanır, kolunun ucuna yükün halkası geçirilir. Kol yatayken halka üstünde asılı kalır, kol aşağı döndüğünde halka kolun ucundan kayar ve yük düşer.
Bu düzende Python'dan iki komut yeter. Kalkıştan önce kanalı 1100'e yollayıp kolu kilitli konuma alırsın, hedefin üstüne gelince 1900 yollarsın. Aşağıdaki şekilde iki konuma bak. Kanal yukarıda anlatılan ölü bölge yüzünden kumandaya geri dönüyorsa kol komuttaki konumda değil kumandanın değerinde durur; yük ya erken düşer ya hiç düşmez.
Kolun hangi yöne ve ne kadar döneceği mekanizmana bağlı. Önce yerde, yük takılı değilken iki komutu sırayla yolla ve kolun halkayı gerçekten bırakıp bırakmadığını gör; gerekirse komuttaki 1100 ve 1900 değerlerini mekanizmana göre değiştir.
Komutu yollayan ve cevabı okuyan kod
Aşağıdaki kod komutu gönderir, otopilotun cevabını ve varsa açıklama metnini basar, sonra servo çıkışının değerini okur. Raspberry Pi'de bağlantı satırını seri porta çevir.
Görevi 0 olan AUX OUT 1'e (kanal 9) yollarsan şunu görürsün:
Sonuc: MAV_RESULT_ACCEPTED
Servo 9 cikisi: 1900 usKanalı 1 yaparsan, yani komutu bir motor kanalına yollarsan şunu görürsün:
Sonuc: MAV_RESULT_FAILED
Otopilot: ServoRelayEvent: Channel 1 is already in use
Servo 1 cikisi: 1000 usKabul geldi, servo hâlâ ölüyse
ArduPilot belgeleri açık: Pixhawk servo rayına güç vermez. İlk şekilde UBEC'in takıldığı yere bak; ray ayrı bir 5V kaynağıyla beslenmiyorsa servo sinyali alır ama dönmez. AUX rayında + ile − arasında multimetreyle 5V ölç.
Rayı beslemek için ESC'nin 5V çıkışı yerine ayrı bir UBEC kullanmak daha güvenli. ESC'lerin içindeki BEC çoğu zaman lineer regülatördür ve servo yük altında akım çektikçe ısınır; anahtarlamalı UBEC aynı akımı çok daha az ısınarak verir. UBEC'in çıkışını boş bir sütunun + ve − pinine tak; sinyal pini boş kalır.
İkinci aday güvenlik anahtarı. Anahtara basılmadıysa çıkışların PWM'i kapalı kalır; belirli kanalları açık bırakmak için BRD_SAFETY_MASK parametresi var. Mission Planner'ın Servo Output ekranında değer değişiyor ama servo kıpırdamıyorsa sorun güçte, güvenlik anahtarında ya da kablodadır.
Hata Mesajları
ServoRelayEvent: Channel 1 is already in use
Komut yolladığın kanalın görevi servo komutuna izin vermiyor: motor, GPIO, röle ya da başka bir özellik. Komutu boş bir kanala yolla ya da o kanalın SERVOx_FUNCTION değerini 0 yap.
MAV_RESULT_FAILED
Yanında açıklama metni yoksa kanal numarası geçersizdir. En sık görülen hali kanalı 0 yollamak: kanallar 1'den başlar.
Bu konu hangi eğitimde var
Yardımcı bilgisayardan Pixhawk'a komut yollamayı ve cevabı okumayı baştan öğrenmek istiyorsan Python ile Sıfırdan İHA Kontrolü eğitimine bak. Ders sürümünde otopilotun karar sırası ve uçuş kaydında arızayı bulma adım adım var.
İNDİRİM KUPONU
Kupon kodu: SOFTIVATION15
Eğitimi alırken ödeme ekranındaki "Kupon kodu" kutusuna bu kodu yaz, %15 iner.




Yorumlar