Softivation

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ığı.

Furkan IŞIKAY 9 dk okuma

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

Raspberry Pi pin 8 TXD TELEM2 pin 3 RX'e, pin 10 RXD TELEM2 pin 2 TX'e, pin 6 GND TELEM2 pin 6 GND'ye bağlanır; TELEM2 pin 1 +5 V kullanılmaz
Nereye bak: kırmızı ve mavi tellerin çaprazlandığı yer. TELEM2'nin 1. pini (+5 V) Pi'yi beslemek için kullanılmaz; Pi ayrı kaynaktan beslenir, yalnızca GND ortaktır.

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

Hiçbir istek yokken MAVLink trafiği 96 B/s, tipik yer istasyonu isteğinde 3.152 B/s, 50 Hz istekte 49.841 B/s; 57600 baud tavanı yaklaşık 5.760 B/s, 921600 baud tavanı yaklaşık 92.160 B/s
Nereye bak: kırmızı çubuğun 57600 çizgisini geçtiği yer. 50 Hz istek bu tavanı 8,7 kat aşar; aynı istek 921600'de sığar.

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.

Python
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:

Kod
HEARTBEAT VAR  sysid=1 compid=0
firmware 4.7.0
  SERIAL2_BAUD      57
  SERIAL2_PROTOCOL  2
  SERIAL2_OPTIONS   0

Hat 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ı.

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 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ı?

Ücretsiz kaynakPixhawk ve ArduPilot hata mesajları sözlüğüBu yazıdaki 5 mesaj ve benzerleri sözlükte: ne demek, neden çıkar, ilk neye bakılır.