00 ARINC 429 nedir?
ARINC 429, Airlines Electronic Engineering Committee (AEEC) tarafından 1977'de yayımlanan sivil havacılık avioniği için standart bir veri bus'ıdır. "ARINC Mark 33 Digital Information Transfer System (DITS)" olarak da bilinir.
ARINC 429, tek yönlü (simplex) iletişim prensibine dayanır: bir transmitter aynı anda en fazla 20 receiver'a veri gönderebilir. Bu tasarım kararı, güvenilirliği maksimize eder — bir receiver arızası diğer receiver'ları veya transmitter'ı etkilemez.
| Platform | Aviyonik sistem | Label örneği |
|---|---|---|
| Airbus A320 | ADIRU (Air Data/Inertial Reference Unit) | Label 203: Baro Altitude |
| Boeing 737 NG | FMC (Flight Management Computer) | Label 101: GMT Hours |
| Boeing 777 | AIMS (Airplane Information Management System) | Label 311: True Heading |
| Airbus A380 | TCAS (Traffic Collision Avoidance System) | Label 130: Selected Altitude |
| Airbus A350 | IRS (Inertial Reference System) | Label 324: Ground Speed |
| Bombardier CRJ | EFIS (Electronic Flight Instrument System) | Label 206: Computed Airspeed |
| Embraer E-Jet | ADC (Air Data Computer) | Label 210: Mach Number |
Tarihsel bağlam
ARINC 429'dan önce her uçak üreticisi kendi tescilli veri bus'ını kullanıyordu; bu durum bakım karmaşıklığını ve maliyeti artırıyordu. AEEC'nin 1977'de yayımladığı bu standart, sivil havacılıkta birlikte çalışabilirliği (interoperability) garanti altına aldı. Bugün dünyada hizmet veren binlerce ticari uçak ARINC 429 kullanmaktadır.
ARINC (Aeronautical Radio, Incorporated), havacılık elektroniği standartlarını yayımlayan kuruluştur. 429 numarası, standardın ARINC belge kataloğundaki numarasıdır. Standardın tam adı "ARINC Specification 429: Digital Information Transfer System" olup Supplement 17 ile hâlâ güncellenmektedir.
01 Fiziksel katman
ARINC 429 diferansiyel twisted pair kablo kullanır. RS-485'e benzer görünse de gerilim seviyeleri, kodlama ve hız seçenekleri belirgin biçimde farklıdır.
Sinyal seviyeleri (Return-to-Zero)
Wire A (pozitif): ─────┐ ┌────┐ ┌────
│ │ │ │
Wire B (negatif): ─────┘ └────┘ └────
HIGH : Wire A = +10V, Wire B = -10V (diferansiyel: +20V)
NULL : Wire A = 0V, Wire B = 0V (diferansiyel: 0V)
LOW : Wire A = -10V, Wire B = +10V (diferansiyel: -20V)
Her bit NULL ile başlar ve biter (Return-to-Zero modülasyonu).
Logic 1 = HIGH-to-NULL geçiş
Logic 0 = LOW-to-NULL geçiş
| Parametre | Değer | Açıklama |
|---|---|---|
| Sinyal seviyesi | ±10 V (±1V tolerans) | Diferansiyel, return-to-zero |
| High Speed | 100 kbps ± 1% | Uçuş kontrol, ADC, IRS |
| Low Speed | 12,5 kbps ± 1% | Yakıt yönetimi, kabin ekipmanları |
| Kablo empedansı | 78 Ω (54–86 Ω arası) | Shielded twisted pair |
| Maks. kablo uzunluğu | Tasarıma bağlı (tipik <100 m) | Attenüasyon ve kapasitans sınırlar |
| Transmitter sayısı | 1 (simplex) | Yayın hattı: sadece bir transmitter |
| Receiver sayısı | Maks. 20 | Hat üzerinde eş zamanlı dinleyici |
| Word aralığı | Min. 4 bit süresi boşluk | Mesajlar arası NULL süresi |
RS-485'ten farkı
ARINC 429 hat seviyeleri ±10V'tur. Standart 3,3V veya 5V mantık devrelerini doğrudan bu hatta bağlamak kalıcı hasar verir. ARINC 429 alıcı/verici çipleri (örn. Holt HI-3593, HI-8596) mutlaka gereklidir.
02 32-bit word yapısı
Her ARINC 429 word 32 bittir ve her zaman LSB (bit 1) önce iletilir. 5 alan içerir: Label, SDI, Data, SSM ve Parity.
İletim sırası (bit 1 önce, bit 32 son):
Bit: 1 ... 8 9 10 11 ......... 29 30 31 32
┌─────────┬────┬───────────────┬────┬───┐
│ LABEL │SDI │ DATA │SSM │ P │
│ (8 bit) │(2b)│ (19 bit) │(2b)│1b │
└─────────┴────┴───────────────┴────┴───┘
octal ile src/dst BNR/BCD/ status parity
tanımlanır tanımı Discrete
Wire üzerinde: Bit 1 ilk iletilir (Label LSB önce = bit-reversal!)
Label (Bits 1–8)
Label, iletilen parametreyi tanımlar. ARINC 429'da label değerleri octal (sekizlik) sayı sistemi ile ifade edilir ve bit-reversed (ters sıralı) olarak iletilir.
| Label (octal) | Label (decimal) | Parametre | Format |
|---|---|---|---|
| 203 | 131 | Baro Corrected Altitude | BNR, feet |
| 206 | 134 | Computed Airspeed | BNR, knots |
| 210 | 136 | Mach Number | BNR, Mach |
| 311 | 201 | True Heading | BNR, degrees |
| 324 | 212 | Ground Speed | BNR, knots |
| 101 | 65 | UTC Hours | BCD |
| 104 | 68 | Date (Day) | BCD |
| 130 | 88 | Selected Altitude (MCP) | BNR, feet |
| 270 | 184 | Discrete Word 1 | Discrete |
SDI (Bits 9–10)
SDI (Source/Destination Identifier), aynı label'ı gönderen birden fazla sistem arasında ayrım yapılmasını sağlar. Örneğin üç ADC olduğunda SDI = 01 (Left), 10 (Right), 11 (Centre) anlamına gelebilir. SDI = 00 genellikle "tüm alıcılar" veya "kullanılmıyor" anlamındadır.
SSM (Bits 30–31) — Sign/Status Matrix
| SSM | BNR/BCD veri için | Discrete veri için |
|---|---|---|
| 00 | Failure Warning — veri geçersiz | Verified data, normal operation |
| 01 | No Computed Data — hesaplanamadı | Normal operation |
| 10 | Functional Test — test modu | No Computed Data |
| 11 | Normal Operation — veri geçerli | Failure Warning |
Bir aviyonik sistemi ARINC 429 verisi alırken her zaman SSM kontrolü yapmalıdır. SSM = Normal Operation olmayan verileri kullanmak hatalı hesaplamalara yol açabilir. Airbus A320 ADIRU çıkışlarında, sensör arızası durumunda SSM = Failure Warning set edilir ve FMS bu veriyi reddeder.
Parity (Bit 32)
ARINC 429 odd parity kullanır: bit 1–32'nin toplamındaki 1'lerin sayısı daima tek olmalıdır. Tek bit hataları bu yöntemle tespit edilir.
03 Veri kodlama formatları
ARINC 429'da veri alanı (bits 11–29) üç temel formatla kodlanabilir: BNR (Binary), BCD (Binary Coded Decimal) ve Discrete. Hangi format kullanıldığı, label numarasıyla belirlenir.
BNR (Binary Number Representation)
BNR, en yaygın ARINC 429 formatıdır. Analog ölçüm değerlerini (yükseklik, hız, açı) ikili sayı sistemiyle ifade eder.
Bit 29 = İşaret biti (Sign): 0 = pozitif, 1 = negatif
Bit 28 = MSB (en yüksek değerlikli bit)
...
Bit 11 = LSB (en düşük değerlikli bit)
Örnek: Label 203 (Baro Corrected Altitude)
Range: -1280 to +131071.75 feet
Resolution: 0.25 feet / LSB
Bits 29-11: 19 bit sign-magnitude
def bnr_encode(value: float, resolution: float,
n_data_bits: int = 18) -> int:
"""
ARINC 429 BNR encode: float deger -> data field bitleri (bits 11-29)
n_data_bits: isaret biti haric veri bit sayisi (tipik 18)
resolution: 1 LSB gercek degeri (ornek: 0.25 feet icin)
Donus: bits 11-29 (19 bit) olarak ham integer
"""
sign = 1 if value < 0 else 0
magnitude = int(abs(value) / resolution) & ((1 << n_data_bits) - 1)
return (sign << n_data_bits) | magnitude
def bnr_decode(raw_field: int, resolution: float,
n_data_bits: int = 18) -> float:
"""ARINC 429 BNR decode: data field bitleri -> float deger"""
sign = (raw_field >> n_data_bits) & 1
magnitude = (raw_field & ((1 << n_data_bits) - 1)) * resolution
return -magnitude if sign else magnitude
def calc_odd_parity(word: int) -> int:
"""Bit 32 parity hesapla (odd): 1-31 bitlerin 1 sayisi cift ise 1 don"""
ones = bin(word & 0x7FFFFFFF).count('1')
return 0 if ones % 2 != 0 else 1
# Label 203: Baro Corrected Altitude = 35000 ft
LABEL_203_OCT = 0o203
LABEL_WIRE = int(f"{LABEL_203_OCT:08b}"[::-1], 2) # bit-reversed
data_field = bnr_encode(35000.0, resolution=0.25)
sdi = 0b01 # Left ADC
ssm = 0b11 # Normal Operation
word32 = LABEL_WIRE
word32 |= (sdi << 8)
word32 |= (data_field << 10)
word32 |= (ssm << 29)
word32 |= (calc_odd_parity(word32) << 31)
print(f"Label 203 | 35000 ft: 0x{word32:08X}")
# Decode: gelen word'den altitude oku
rx_word = word32
rx_label = rx_word & 0xFF
rx_ssm = (rx_word >> 29) & 0x3
rx_data = (rx_word >> 10) & 0x7FFFF
if rx_ssm == 0b11: # Normal Operation
altitude = bnr_decode(rx_data, resolution=0.25)
print(f"Altitude: {altitude:.2f} ft")
else:
print(f"Veri gecersiz! SSM={rx_ssm:02b}")
BCD (Binary Coded Decimal)
BCD formatı, zaman bilgisi (saat, dakika), tarih ve benzeri sayısal değerler için kullanılır. Her 4 bit bir BCD basamağını temsil eder.
def decode_bcd_time(word32: int) -> int:
"""Label 101 (UTC Hours): BCD decode"""
data = (word32 >> 10) & 0x7FFFF
tens = (data >> 14) & 0xF # bits 24-27
units = (data >> 10) & 0xF # bits 20-23
return tens * 10 + units
# Saat 14 -> BCD tens=1, units=4
# word32 ornegi (Label 101, saat 14):
label101_word = (0b10000000) | (0b11 << 29) # sadelestirilmis
label101_word |= (0x1 << 24) | (0x4 << 20) # tens=1, units=4
print(f"UTC Hours: {decode_bcd_time(label101_word)}")
04 Önemli label'lar
ARINC 429'da 256 olası label değeri (octal 000–377) vardır. Standart, her label için parametre adı, veri formatı, çözünürlük ve güncelleme hızını tanımlar.
Hava verisi (Air Data) label'ları
| Label (oct) | Parametre | Format | Range | Resolution | Güncelleme |
|---|---|---|---|---|---|
| 203 | Baro Corrected Altitude | BNR | -1280 to +131072 ft | 0,25 ft | 50 ms |
| 204 | Baro Alt (coarse) | BNR | -1280 to +131072 ft | 4 ft | 50 ms |
| 206 | Computed Airspeed (CAS) | BNR | 0–512 kt | 0,25 kt | 50 ms |
| 210 | Mach Number | BNR | 0–4 Mach | 0,001 Mach | 50 ms |
| 213 | True Airspeed (TAS) | BNR | 0–1024 kt | 0,5 kt | 50 ms |
| 221 | Static Pressure | BNR | 0–32 PSI | 0,125 PSI | 50 ms |
| 234 | Total Air Temperature | BNR | -128 to +128 °C | 0,25 °C | 250 ms |
Navigasyon label'ları
| Label (oct) | Parametre | Format | Range | Resolution |
|---|---|---|---|---|
| 310 | Magnetic Heading | BNR | 0–360° | 0,0055° |
| 311 | True Heading | BNR | 0–360° | 0,0055° |
| 312 | Wind Speed | BNR | 0–512 kt | 0,5 kt |
| 313 | Wind Direction (True) | BNR | 0–360° | 0,0055° |
| 324 | Ground Speed | BNR | 0–4096 kt | 1 kt |
| 361 | Latitude | BNR | ±90° | 0,0000021° |
| 362 | Longitude | BNR | ±180° | 0,0000021° |
Label octal / decimal dönüşümü
def oct_to_wire_byte(octal_str: str) -> int:
"""Octal label string -> wire byte (bit-reversed)"""
dec = int(octal_str, 8)
bits = f"{dec:08b}"
return int(bits[::-1], 2)
def wire_byte_to_oct(byte_val: int) -> str:
"""Wire byte -> octal label string"""
bits = f"{byte_val:08b}"
dec = int(bits[::-1], 2)
return oct(dec).replace('0o', '').zfill(3)
# Ornekler:
for lbl in ["203", "206", "311", "101"]:
wire = oct_to_wire_byte(lbl)
back = wire_byte_to_oct(wire)
print(f"Label {lbl}oct ({int(lbl,8)}dec) -> wire: 0x{wire:02X} -> back: {back}oct")
05 Linux ARINC 429 sürücüleri
Linux altında ARINC 429 donanımı SPI çipleri, PCI kartlar veya USB arayüzleri üzerinden erişilebilir.
Holt HI-3593 SPI Çipi
Holt Integrated Circuits'ın HI-3593 çipi, 2 alıcı (receiver) + 1 verici (transmitter) içeren bir ARINC 429 SPI arayüz çipidir. Raspberry Pi veya BeagleBone ile doğrudan entegre edilebilir.
# SPI arayüzü etkinleştir (Raspberry Pi):
sudo raspi-config
# Interface Options -> SPI -> Enable
# SPI kernel modülünü yükle:
sudo modprobe spi-bcm2835
# HI-3593 ornek surucu:
git clone https://github.com/avionics/hi3593-linux-driver.git
cd hi3593-linux-driver
make && sudo make install
# Device tree overlay ekle:
sudo nano /boot/config.txt
# dtoverlay=hi3593,speed=12500000
# Cihaz dosyaları:
ls /dev/arinc429_*
# /dev/arinc429_0 (TX) /dev/arinc429_1 (RX1) /dev/arinc429_2 (RX2)
#include <fcntl.h>
#include <unistd.h>
#include <stdint.h>
#include <stdio.h>
static uint32_t calc_odd_parity(uint32_t w) {
int ones = __builtin_popcount(w & 0x7FFFFFFF);
return (ones % 2 == 0) ? (1u << 31) : 0;
}
int main(void) {
int fd = open("/dev/arinc429_0", O_WRONLY);
if (fd < 0) { perror("open"); return 1; }
/* Label 203 (oct) bit-reversed: 0b11000100 = 0xC4 */
uint32_t word = 0xC4;
/* SDI = 01 (Left ADC), bits 9-10 */
word |= (0x1u << 8);
/* BNR: 35000 ft, resolution=0.25 -> 140000 = 0x22360, bits 11-28 */
word |= ((uint32_t)140000 << 10);
/* SSM = 11 (Normal Op), bits 30-31 */
word |= (0x3u << 29);
/* Parity bit 32 */
word |= calc_odd_parity(word);
write(fd, &word, sizeof(uint32_t));
printf("Gonderildi: 0x%08X\n", word);
close(fd);
return 0;
}
AIM GmbH ARINC 429 PCI Kartı
# AIM kart tespiti:
lspci | grep -i aim
# 04:00.0 Signal processing controller: AIM GmbH ARINC429 PCIe
# AIM Linux surucusu:
sudo modprobe aim_arinc429
# Kanal yapılandırma:
aim_config --card 0 --ch 1 --mode TX --speed high
aim_config --card 0 --ch 2 --mode RX --speed high --filter 203,206,311
06 Python simülasyonu
Gerçek donanım olmadan ARINC 429 word'lerini encode/decode etmek ve veri akışını simüle etmek için saf Python yeterlidir.
import struct
class Arinc429Word:
"""32-bit ARINC 429 word encode / decode yardimci sinifi"""
SSM_FAILURE = 0b00
SSM_NO_COMPUTED = 0b01
SSM_FUNC_TEST = 0b10
SSM_NORMAL = 0b11
def __init__(self, label_oct: int, sdi: int = 0,
ssm: int = 0b11):
self.label_oct = label_oct # octal integer, orn. 0o203
self.sdi = sdi & 0x3
self.ssm = ssm & 0x3
self._data_bits = 0
def _label_wire(self) -> int:
"""Label byte bit-reversed"""
bits = f"{self.label_oct:08b}"
return int(bits[::-1], 2)
def set_bnr(self, value: float, resolution: float) -> None:
sign = 1 if value < 0 else 0
mag = int(abs(value) / resolution) & 0x3FFFF # 18 bit
self._data_bits = (sign << 18) | mag
def get_bnr(self, resolution: float) -> float:
sign = (self._data_bits >> 18) & 1
mag = (self._data_bits & 0x3FFFF) * resolution
return -mag if sign else mag
def to_uint32(self) -> int:
w = self._label_wire()
w |= (self.sdi << 8)
w |= (self._data_bits << 10)
w |= (self.ssm << 29)
ones = bin(w & 0x7FFFFFFF).count('1')
if ones % 2 == 0:
w |= (1 << 31)
return w
@classmethod
def from_uint32(cls, raw: int) -> 'Arinc429Word':
label_wire = raw & 0xFF
label_oct = int(f"{label_wire:08b}"[::-1], 2)
sdi = (raw >> 8) & 0x3
ssm = (raw >> 29) & 0x3
obj = cls(label_oct, sdi, ssm)
obj._data_bits = (raw >> 10) & 0x7FFFF
return obj
# Kullanim ornekleri:
w = Arinc429Word(0o203, sdi=1, ssm=Arinc429Word.SSM_NORMAL)
w.set_bnr(35000.0, resolution=0.25)
raw = w.to_uint32()
print(f"Altitude 35000 ft : 0x{raw:08X}")
w2 = Arinc429Word(0o311, sdi=0, ssm=Arinc429Word.SSM_NORMAL)
w2.set_bnr(274.5, resolution=0.0055)
print(f"Heading 274.5 deg : 0x{w2.to_uint32():08X}")
# Decode:
received = Arinc429Word.from_uint32(raw)
print(f"Decoded altitude : {received.get_bnr(resolution=0.25):.2f} ft")
print(f"SSM : {received.ssm:02b}")
07 ARINC 629 ve modern alternatifler
ARINC 429'un tek yönlü sınırlaması ve düşük hızı, modern uçaklar için daha kapasiteli alternatiflerin geliştirilmesini zorunlu kıldı.
ARINC 629 (Boeing 777)
ARINC 629, Boeing ve Honeywell'in B777 için geliştirdiği iki yönlü (bi-directional) havacılık veri bus'ıdır. 2 Mbps hız, maks. 120 LRU (Line Replaceable Unit) desteği ve CSDB (Current Source Data Bus) fiziksel katmanıyla 429'un önemli bir evrimi oldu.
| Özellik | ARINC 429 | ARINC 629 | AFDX (ARINC 664) |
|---|---|---|---|
| Hız | 100 kbps | 2 Mbps | 100 Mbps |
| Topoloji | Point-to-point simplex bus | Çok noktalı çift yönlü | Star (switch tabanlı) |
| Max. cihaz | 20 receiver / hat | 120 LRU | Teorik sınırsız |
| Determinizm | Yüksek (sabit rate) | Yüksek (TDMA) | Orta (BAG garanti) |
| Uygulama | Tüm ticari uçaklar | Sadece B777 | A380, A350, B787 |
| Standart | ARINC Spec 429 | ARINC Spec 629 | ARINC Spec 664 Part 7 |
AFDX — Avionics Full-Duplex Switched Ethernet
Airbus A380 2005'te hizmete girdiğinde AFDX dünya havacılığında devrim yarattı. 100 Mbps Ethernet altyapısı üzerine inşa edilen bu sistem, sanal bağlantılar (Virtual Links) ve bant genişliği tahsisi (BAG — Bandwidth Allocation Gap) ile deterministik iletim garantisi sağlar. Boeing 787 Dreamliner de aynı teknolojiyi benimsedi.
08 Test ekipmanları ve geliştirme
ARINC 429 sistemlerinin doğrulanması için özelleşmiş test ekipmanları ve geliştirme kartları mevcuttur.
Astronics AltaView ARINC 429 Analyzer
# Kanal 1'de 100 kbps RX, label 203 ve 206'yı izle (30 sn):
altaview_429 --card 0 --ch 1 --mode RX --speed high \
--filter-labels 203,206,311 --duration 30 \
--output adc_capture.a429
# Kaydı CSV'ye çevir:
altaview_decode --input adc_capture.a429 --format csv \
--output adc_data.csv
# Hata raporu:
altaview_stats --input adc_capture.a429
# Total words: 12450
# Parity errors: 0
# Bit format errors: 2
# Label 203 count: 3780 (19.1 ms rate)
# Label 206 count: 3780 (19.1 ms rate)
# Label 311 count: 1890 (38.2 ms rate)
Geliştirme kartları
| Kart | Üretici | Arayüz | TX/RX | Kullanım |
|---|---|---|---|---|
| HI-3593 Eval Kit | Holt IC | SPI | 1TX / 2RX | Prototip, Raspberry Pi entegrasyon |
| AIT-429 PCI | Avionics Interface Technologies | PCIe | 4TX / 8RX | Lab testi, simülasyon |
| AIM-429 USB | AIM GmbH | USB 2.0 | 2TX / 4RX | Saha testi, laptop bağlantısı |
| DDC BU-67118 | Data Device Corp | PMC/XMC | 8TX / 16RX | Uçuş test donanımı |
ARINC 429 alıcı/verici devrelerinin havacılık sertifikasyonu DO-254 (Design Assurance Guidance for Airborne Electronic Hardware) kapsamında yapılır. DAL-A veya DAL-B seviyesi için gereksinimler şunlardır: donanım plan dökümanı, şema incelemesi, FMEA (Failure Modes and Effects Analysis), test prosedürleri ve DER onayı. HI-3593 gibi ticari çipler COTS olarak kullanılırken ek yeterlilik belgelendirmesi gerekebilir.
09 Pratik: ADC simülasyonu ve baro altitude encoding
Raspberry Pi + Holt HI-3593 SPI kartı kullanarak basit bir Air Data Computer (ADC) simülatörü oluşturuyoruz. Bu simülatör, atmosferik basınç sensöründen okuduğu veriyi ARINC 429 Label 203 formatında yayınlar.
Donanım bağlantısı
Raspberry Pi 4B HI-3593 Eval Board
───────────────── ──────────────────
SPI0 MOSI (GPIO 10) ──→ SDI
SPI0 MISO (GPIO 9) ←── SDO
SPI0 SCLK (GPIO 11) ──→ SCLK
CE0 (GPIO 8) ──→ /CS
GPIO 25 ←── /ARINC_INT (alici kesme)
3.3V ──→ VCC (3.3V besleme)
GND ──→ GND
HI-3593 ARINC TX1 OUT A/B ──→ 429 bus (differansiyel, +-10V)
HI-3593 ARINC RX1 IN A/B ←── 429 bus alici
import spidev, time, struct
import smbus2 # BMP280 basinc sensörü için
# ─── ARINC 429 word yardımcıları ──────────────────────────────
def label_wire(octal: int) -> int:
return int(f"{octal:08b}"[::-1], 2)
def bnr_data(value: float, resolution: float) -> int:
sign = 1 if value < 0 else 0
mag = int(abs(value) / resolution) & 0x3FFFF
return (sign << 18) | mag
def build_word(label_oct: int, sdi: int, ssm: int,
data_19: int) -> int:
w = label_wire(label_oct)
w |= (sdi << 8)
w |= (data_19 << 10)
w |= (ssm << 29)
ones = bin(w & 0x7FFFFFFF).count('1')
if ones % 2 == 0:
w |= (1 << 31)
return w
# ─── HI-3593 SPI TX fonksiyonu ────────────────────────────────
def hi3593_transmit(spi: spidev.SpiDev, word32: int) -> None:
"""HI-3593 TX1: 32-bit ARINC word SPI ile gönder (MSB first)"""
# HI-3593 TX komutu: 0xA0 + 4 byte data
cmd = [0xA0]
cmd += list(struct.pack(">I", word32)) # big-endian
spi.xfer2(cmd)
# ─── BMP280 basınçtan irtifa hesabı ───────────────────────────
def pressure_to_altitude_ft(pressure_pa: float,
baro_setting_pa: float = 101325.0) -> float:
"""ISA modeli: basınçtan irtifa (feet)"""
ratio = pressure_pa / baro_setting_pa
alt_m = 44330.0 * (1.0 - ratio ** 0.1903)
return alt_m * 3.28084 # metre -> feet
# ─── Ana döngü ────────────────────────────────────────────────
spi = spidev.SpiDev()
spi.open(0, 0) # SPI0, CE0
spi.max_speed_hz = 1_000_000
spi.mode = 0
i2c = smbus2.SMBus(1) # BMP280 I2C bus
print("ADC simülasyonu başlıyor — ARINC 429 Label 203 yayını...")
try:
while True:
# BMP280'den ham basıncı oku (sadelestirilmis)
raw_p = i2c.read_i2c_block_data(0x77, 0xF7, 3)
p_pa = ((raw_p[0] << 12) | (raw_p[1] << 4) | (raw_p[2] >> 4)) * 0.25
# Basınçtan irtifa (feet, ISA)
alt_ft = pressure_to_altitude_ft(p_pa)
# Label 203: Baro Corrected Altitude
data = bnr_data(alt_ft, resolution=0.25)
word = build_word(label_oct=0o203, sdi=1, ssm=0b11,
data_19=data)
hi3593_transmit(spi, word)
print(f"TX Label 203: {alt_ft:.1f} ft | 0x{word:08X}")
time.sleep(0.05) # 50 ms = 20 Hz
except KeyboardInterrupt:
spi.close()
print("Durduruldu.")
Airbus A320'de üç ayrı ADC (Air Data Computer) bulunur: Left, Right ve Standby. Her ADC, pitot tüpü ve statik port verilerinden baro basıncını, hava hızını ve mach sayısını hesaplar; sonuçları ARINC 429 üzerinden FMGC (Flight Management and Guidance Computer), EFIS ve otopilot bilgisayarlarına gönderir. Üç ADC'nin SDI değerleri birbirinden farklıdır, böylece alıcı sistemler hangi ADC'den veri geldiğini anlayabilir ve çapraz karşılaştırma (ECAM monitörü) yapabilir.