Raspberry Pi Pixhawk'a bağlanmıyor, kablo doğru
Raspberry Pi Pixhawk'a bağlanmıyor ve heartbeat gelmiyorsa sorun çoğu kez kabloda değildir. UART'ı tutan süreç, yanlış cihaz düğümü ve baud uyuşmazlığı.
Raspberry Pi'yi Pixhawk'ın TELEM2 portuna bağladın, kabloyu üç kez kontrol ettin, kodu çalıştırdın. Ekranda tek satır var ve orada duruyor: bağlantı bekleniyor. Kablo yerinde, kart açık, ışıklar yanıyor.
Bu noktada çoğu kişi kabloyu söküp yeniden takar. Nadiren işe yarar, çünkü sorun genelde telin kendisinde değil, o teli kimin dinlediğinde ve iki tarafın aynı hızda konuşup konuşmadığındadır. Aşağıda hattı sırayla eleyeceğiz.
Kablo doğruysa bile üç tel yanlış olabilir
Pixhawk'ın TELEM2'sinde altı pin var ama Raspberry Pi'ye giden sadece üçü: gönderme, alma ve toprak. Gönderme ile alma çapraz bağlanır. Aynı isimli pinleri karşı karşıya getirirsen iki taraf da dinlemeye geçer ve kimse konuşmaz.
Toprak hattı en sık atlanan tel. Pi'yi ayrı bir kaynaktan besliyorsan iki kartın arasında ortak bir referans kalmaz; hat ya hiç kurulmaz ya da rastgele bozuk paket üretir.
Şekilde kırmızı ve mavi tellerin ortada çaprazlandığına bak: Pi'nin gönderme pini Pixhawk'ın alma pinine gider, tersi de aynı.
Raspberry Pi ile Pixhawk TELEM2 arasındaki üç tel
Portu senden önce başka biri açmış olabilir
Raspberry Pi'de seri port varsayılan olarak boş değildir. Linux'un kendi konsolu o hattı oturum açmak için kullanır. Bluetooth donanımı Pi 3 ve 4'te iyi UART'ı kendine alır. ModemManager yeni bir seri cihaz gördüğünde onu saniyelerce yoklar.
Bunların hepsi portu açar. Senin kodun da açar ama baytı önce alan kim varsa MAVLink akışı ona gider ve sana bir şey kalmaz.
- Linux seri konsolu: raspi-config içinde oturum kabuğunu kapat, donanımı açık bırak.
- Bluetooth: config dosyasına disable-bt satırını ekle, kartı yeniden başlat.
- ModemManager: kurulu ise servisi durdur.
- Kapanmamış eski süreç: bir önceki denemenden kalan kod hâlâ portu tutuyor olabilir.
Örnek: Bir gün önce MAVProxy ile hattı denediğin SSH oturumu açık kalmış olsun. Bugün kendi kodunu başlattığında port açılır, 15 saniye bekler ve heartbeat gelmeden çıkar; kablo dünkü kablodur, kart aynı karttır. Kabloya dokunmadan önce portu kimin tuttuğuna bak, eski süreci kapat, sonra kodunu yeniden başlat.
Pi 5'te düğüm adı değişti
Yıllardır dolaşan talimatlar /dev/serial0'ı işaret eder ve Pi 3 ile Pi 4'te doğrudur. Pi 5'te aynı ad kart üzerindeki hata ayıklama soketine bağlıdır; GPIO pinlerine giden düğüm /dev/ttyAMA0'dır. Aynı kabloyla, aynı ayarla, sırf düğüm adı yüzünden hiçbir şey gelmez.
Önce hangi Pi'de olduğuna bak, düğümü ona göre seç. Eski bir forum cevabını Pi 5'e birebir uygulamak, bu konuda en çok zaman kaybettiren hata.
İki taraf aynı hızda mı konuşuyor
Otopilot tarafında hız bir parametreyle belirlenir ve oraya yazdığın sayı doğrudan baud değildir; firmware onu bir tablodan çevirir. 57 yazarsan 57600 olur, 921 yazarsan 921600. Sıfır ya da negatif yazarsan port kapanmaz, sessizce 57600'e döner.
Kodundaki hız da aynı olmalı. Farklıysa hat kurulur ama ekrana anlamsız karakterler dökülür. Bu, hiç veri gelmemesinden farklı bir durumdur ve farklı yere bakmanı gerektirir.
Bir de tersi var: hız uyuşuyor, hat kuruluyor, sonra kopup duruyor. Genelde sebep, istediğin telemetri akışının o hıza sığmamasıdır.
ArduCopter 4.7.0'da hiçbir şey istemezsen hatta neredeyse trafik yoktur; akışı senin kodun açar. Şekildeki kırmızı çubuğa bak: 50 Hz gibi bir hız isteyip 57600'de kalırsan otopilotun ürettiği veri hattın taşıyabileceğinin katlarına çıkar ve paketler düşmeye başlar.
MAVLink akışı ne kadar bant istiyor
Hattı tek programla sırayla ele
Aşağıdaki kod yukarıdaki adımları sırayla uygular. Bağlanamazsa hangi katmanda durduğunu söyler; bağlanırsa heartbeat'in geldiğini, firmware sürümünü ve seri parametrelerini basar. Kodu Raspberry Pi üzerinde çalıştır.
import sys, time
from pymavlink import mavutil
BAGLANTI = sys.argv[1] if len(sys.argv) > 1 else "/dev/serial0"
BAUD = int(sys.argv[2]) if len(sys.argv) > 2 else 57600
def teshis(sebep):
print("HAT KURULMADI ->", sebep)
print(" 1. port bos mu : sudo fuser -v", BAGLANTI)
print(" 2. dogru dugum mu: ls -l /dev/serial0 (Pi 5 ise /dev/ttyAMA0)")
print(" 3. izin var mi : id -nG | grep dialout")
print(" 4. hiz uyusuyor : SERIALx_BAUD =", BAUD // 1000, "olmali")
sys.exit(1)
print("baglaniyor:", BAGLANTI, BAUD)
try:
efendi = mavutil.mavlink_connection(BAGLANTI, baud=BAUD, source_system=250)
except Exception as hata:
teshis("port acilamadi (%s)" % hata.__class__.__name__)
if efendi.wait_heartbeat(timeout=15) is None:
teshis("port acildi ama 15 sn icinde HEARTBEAT gelmedi")
print("HEARTBEAT VAR sysid=%d compid=%d" % (efendi.target_system, efendi.target_component))
efendi.mav.command_long_send(efendi.target_system, efendi.target_component,
mavutil.mavlink.MAV_CMD_REQUEST_MESSAGE, 0, 148, 0, 0, 0, 0, 0, 0)
bitis = time.time() + 5
while time.time() < bitis:
s = efendi.recv_match(type='AUTOPILOT_VERSION', blocking=True, timeout=1)
if s:
v = s.flight_sw_version
print("firmware %d.%d.%d" % ((v >> 24) & 255, (v >> 16) & 255, (v >> 8) & 255))
break
for ad in ("SERIAL2_BAUD", "SERIAL2_PROTOCOL", "SERIAL2_OPTIONS"):
efendi.mav.param_request_read_send(efendi.target_system, efendi.target_component, ad.encode(), -1)
p = efendi.recv_match(type='PARAM_VALUE', blocking=True, timeout=3)
print(" %-17s %s" % (ad, "okunamadi" if p is None else "%g" % p.param_value))Çalıştırırken bağlantı adresini ve hızı argüman olarak verebilirsin. Pi 5 kullanıyorsan ilk argümanı /dev/ttyAMA0 yap.
Hat kurulduğunda ne görürsün
Hat sağlıklıysa kodu çalıştırdığında şunu görürsün. Sürüm satırı ve parametre değerleri senin kartında farklı olabilir:
HEARTBEAT VAR sysid=1 compid=0
firmware 4.7.0
SERIAL2_BAUD 57
SERIAL2_PROTOCOL 2
SERIAL2_OPTIONS 0Hat kurulmadığında ise kod sana dört komut bırakır ve çıkar. Sırayı bozmadan yukarıdan aşağı uygula.
Hata Mesajları ve Anlamları
Aşağıdaki metinler MAVProxy, DroneKit ve pyserial'ın gerçekten bastığı satırlar. Hangisini gördüğün, hangi katmanda takıldığını söyler.
Waiting for heartbeat from /dev/serial0
MAVProxy portu açabildi ama karşıdan MAVLink çözülmedi. Port açıldığına göre düğüm adı ve izin sorunu geride kaldı. Sıradaki adaylar: gönderme ve alma hattının çapraz olmaması, ortak toprak bulunmaması, iki tarafın hızının farklı olması ya da o portun otopilotta MAVLink'e ayarlı olmaması.
link 1 down
Bir süre paket geldi, sonra kesildi. Karakterler okunabiliyorsa hız doğru, ama hat taşıyamıyor ya da fiziksel bağlantı kararsız. Ekranda okunamayan karakterler görüyorsan tablo başkadır: bu, iki tarafın hızının farklı olması demektir.
dronekit:Link timeout, no heartbeat in last 5 seconds
DroneKit portu açtı, beş saniye bekledi, heartbeat gelmedi. Aynı adresle MAVProxy çalışıyorsa sorun DroneKit'te değil, zaman aşımı süresinde ya da o an portun başka bir süreç tarafından tutuluyor olmasındadır.
could not open port /dev/serial0: [Errno 2] No such file or directory
Port hiç yok. Ya seri donanım açılmamış ya da bu Pi'de o ad başka bir şeye karşılık geliyor. Cihaz listesine bak ve düğümün gerçekten var olduğunu gör.
could not open port /dev/serial0: [Errno 13] Permission denied
Düğüm var, kullanıcının erişim hakkı yok. Kullanıcıyı seri port grubuna ekle ve oturumu kapatıp aç. Kodu yetkili kullanıcıyla çalıştırmak bunu çözer gibi görünür ama Python ortamını değiştirdiği için başka hatalara yol açar.
Sahada ne değişir
Buradaki adımların çoğuna yalnızca kartın başında bakabilirsin: portu kimin tuttuğu, düğüm adının hangi cihaza gittiği, kablonun çapraz olup olmadığı.
Kodun mantığını ve akışın bant ihtiyacını bilgisayarda da sınayabilirsin. Kabloyu, portu ve izinleri ise kendi kartında kontrol edeceksin.
En sık yapılan hata: bir ayarı değiştirip kartı yeniden başlatmadan sonuca bakmak. Seri hız ve akış kontrolü ayarları açılışta okunur; kartı yeniden başlatmadan yaptığın değişiklik hattı etkilemez ve doğru düzeltmeyi yanlışlıkla elemiş olursun.
Bu yazıyı okuyanlara
Buradaki sıra hattı ayağa kaldırmak için yeterli. Kararın firmware içinde hangi satırdan geldiğini, parametrelerin kaynak koddaki gerçek varsayılanlarını ve saha vakalarını görmek istiyorsan eğitimde bunları tek tek açıyoruz.
Eğitimi incele: İHA Haberleşme Teknolojileri
Bu yazı işinize yaradı mı?
Bu konuyu baştan sona öğrenin
Sezon: altı eğitimin hepsi 9 ay, ayda ₺790. Lise ve üniversite öğrencisine ayda ₺390, üye kodunuzla ilk ay ₺351. İstediğiniz ay bırakırsınız. Sezon'a başlayın · Öğrenciyim