Python Kullanarak VEX Beyin ve Sensörlerle Veri Kaydı

giriiş

Bu yazımızda VEX Robotuna VEX Brain ile veri toplaması ve veri analizi için SD karttaki CSV dosyasına kaydetmesi talimatını veren bir veri kayıt projesinin nasıl oluşturulacağını tartışacağız.

Veri kaydı, bilimsel araştırmalara yardımcı olmak, kendi deneylerimizi yürütmek ve belirli sorunları çözmek için kullanabileceğimiz güçlü bir araçtır. Veri kaydıyla VEX Robotunu gerçekleştirmeye yönlendirebileceğimiz çeşitli eğlenceli ve heyecan verici görevler vardır. Aşağıda bazı örnekler verilmiştir:

  • Robotun hızını hesaplamak için Mesafe Sensörü ile veri toplanması.
  • Robotu sınıfta gezdirmek ve çeşitli konumlardaki ışık değişikliklerini gözlemlemek için Optik Sensör ile veri toplamak.
  • Robotu bir maceraya çıkarmak ve bir harita oluşturmak için GPS koordinat verilerini kaydetmek.

Veri Günlüğü Projesi geliştirmek için gereken kodlama becerileri

  • VEX Brain/Sensors ile veri toplamak ve bunu bir veri yapısına eklemek için çeşitli komutları kullanın.
  • Verileri SD karttaki Virgülle Ayrılmış Değerler (CSV) dosyasına yazın.

Veri Kaydı için Gerekli Donanım:

  • VEX Beyin (IQ, V5, EXP)
  • Bir SD kart
  • Bir Sensör veya birden fazla Sensör (Gerekli verilere göre isteğe bağlı)

Sensörden Veri Alma

VEX Robotunu (IQ, V5, EXP) aşağıdaki sensörlerden veri alacak şekilde programlayabiliriz:

  • Atalet Sensörü
  • Mesafe Sensörü
  • Optik sensör
  • Görüş Sensörü
  • Dönüş Sensörü (V5, EXP)
  • GPS Sensörü (V5)

Not: VEX IQ (2. nesil) Brain ve VEX EXP Brain'de yerleşik bir Atalet Sensörü bulunur. Atalet Sensörü verilerini bu VEX Beyinleri ile toplayabiliyoruz.

Bu yazımızda VEX IQ Brain (2. nesil) ile hızlanma verilerini toplayan ve bunları bir SD karta saklayan bir veri kayıt projesi geliştireceğiz. 

Öncelikle VEX IQ Brain'de (2. nesil) yerleşik Zamanlayıcı ve Atalet Sensöründen okumalar almak için kısa bir program yazmamız gerekiyor.

  • Bu programın başlangıcında VEX IQ Brain'i (2. nesil) kontrol etmek ve ondan verileri almak için Python modüllerini içe aktarmamız gerekecek. Bu nedenle, bu talimatları projeye ekleyerek başlayın.

    # Kütüphane içe aktarımları
    from vex import *
    
    # Beyin varsayılan olarak tanımlanmalıdır
    brain = Brain()
    brain_inertial = Inertial()
  • Daha sonra, kayıt için veri girişi sayısını depolamak üzere numOfDataEntries değişkenini bildirmek için kodu ekleyin, verileri okumak için zaman aralığı değerini depolamak için polling_delay_msec değişkenini bildirin ve depolamak için boş bir dize değişkeni data_buffer oluşturun. sensörden okunan veriler.

    numOfDataEntries = 100
    polling_delay_msec = 50
    data_buffer = ""
  • Zaman damgasını verilere eklemek için zamanlayıcının mevcut değerini kullanacağımızdan, veri toplamaya başlamadan önce zamanlayıcı değerini 0 saniyeye sıfırlamamız gerekiyor.

    # Zamanlayıcı başlatma kodu
    ekle brain.timer.clear()
  • VEX IQ Brain'den (2.) veriyi alıp tampon belleğe kaydeden komutu kullanmadan önce öncelikle onu anlamamız gerekiyor.
    Aşağıdaki talimat geçerli zamanlayıcı değerini data_buffer değişkenine belirli bir formatta ekler.

    Python kodunun bir satırı, ayrıntılı olarak açıklanması için parçalar halinde vurgulanmıştır. Kod satırı şu şekildedir: data_buffer += 1.3f % brain.timer.value() + comma. Öncelikle, += operatörü vurgulanır ve "data_buffer dizesine veri ekle" şeklinde etiketlenir. Ardından, 1.3f dizesi vurgulanır ve Biçim dizesi olarak etiketlenir. Ardından, yüzde işareti vurgulanır ve "Dize modül operatörü" olarak etiketlenir. Ardından, brain.timer.value() komutu vurgulanır ve "Zamanlayıcının mevcut değeri" olarak etiketlenir. Son olarak, sona virgül ekleme işlemi vurgulanır ve "Verileri ayırmak için sona virgül ekleyin" şeklinde okunur.

    Biçim dizesini “%1.3f”ayıralım: 

    • “%”: Dönüşüm belirtecini tanıtır.
    • “1”: String içerisinde bulunabilecek minimum rakam sayısını belirtir.
    • “.3”: Biçimlendirilmiş sayıya dahil edilecek ondalık basamak sayısını belirtir.
    • “f”: Formatlanacak değerin kayan noktalı sayı olduğunu belirtir.

    Böylece, minimum 1 basamak genişliğinde ve 3 ondalık basamak hassasiyetinde kayan noktalı bir sayıyı biçimlendirmek için “%1.3f” biçim dizesini kullanabiliriz.

  • Artık VEX IQ Brain'de (2. nesil) yerleşik olan Atalet Sensörünün Zamanlayıcısını ve hızlanma değerini okuyabilir ve ardından verileri belirtilen formatta data_buffer değişkenine ekleyebiliriz.

    # Verileri
    numaralı arabelleğe yazmak için komutlar data_buffer += "%1.3f" % brain.timer.value() + "\n"
    data_buffer += "%1.3f" % brain_inertial.acceleration(XAXIS) + ","
    data_buffer += "%1.3f" % brain_inertial.acceleration(YAXIS) + ","
    data_buffer += "%1.3f" % brain_inertial.acceleration(ZAXIS) + "\n"

    Önceki kod detaylı olarak açıklanmıştır. brain.timer.value() kullanan ilk data_buffer satırı "Arabelleğe Zaman Damgası Ekle" olarak etiketlenmiştir. Sonraki üç satırda "X, Y ve Z eksenleri boyunca ivme değerini tampona ekle" yazmaktadır.

    Not: “\n” Yeni Satır karakteridir. Satırın burada bittiğini ve yeni bir satırın başladığını belirtir.

  • Daha sonra, data_buffer değişkenine belirli sayıda veri girişini kaydetmek için, verileri getiren talimatları tekrar tekrar yürütmek ve verileri bir dizi yineleme için data_buffer değişkenine eklemek için döngü için kullanabiliriz. Stratejimiz yineleme sayısını belirlemek için numOfDataEntries değişkeninin değerini kullanmaktır.

    # Veri Üretimi
    for i in range(0, numOfDataEntries):
    
        # Verileri arabelleğe yazmak için komutlar
        data_buffer += "%1.3f" % brain.timer.value() + "\n"
        data_buffer += "%1.3f" % brain_inertial.acceleration(XAXIS) + ","
        data_buffer += "%1.3f" % brain_inertial.acceleration(YAXIS) + ","
        data_buffer += "%1.3f" % brain_inertial.acceleration(ZAXIS) + "\n"
  • Şu ana kadar programımız verileri olabildiğince hızlı kaydediyor. Ancak belirli zaman aralıklarında veri kaydetmek istiyoruz. Bu nedenle, iki okuma arasına belirli bir zaman aralığı eklemek amacıyla programı duraklatmak için for döngüsü wait() fonksiyonunu kullanabiliriz. Zaman aralığının değerini belirlemek için polling_delay_msec değişkeninin değerini kullanıyoruz.

    # Veri Üretimi
    for i in range(0, numOfDataEntries):
    
        # Verileri arabelleğe yazmak için komutlar
        data_buffer += "%1.3f" % brain.timer.value() + "\n"
        data_buffer += "%1.3f" % brain_inertial.acceleration(XAXIS) + ","
        data_buffer += "%1.3f" % brain_inertial.acceleration(YAXIS) + ","
        data_buffer += "%1.3f" % brain_inertial.acceleration(ZAXIS) + "\n"
    
        wait(polling_delay_msec, MSEC)

Tebrikler! VEX Brain'de yerleşik Atalet Sensöründen okumalar (hızlanma verileri) almak için programı tamamladık. Daha sonra, verileri SD karttaki bir CSV dosyasına nasıl yazacağımızı keşfedeceğiz.

# Kütüphane içe aktarmaları
from vex import *

# Beyin varsayılan olarak tanımlanmalıdır
brain = Brain()
brain_inertial = Inertial()

numOfDataEntries = 100
polling_delay_msec = 50
data_buffer = ""

# Zamanlayıcı başlatma kodunu ekle
brain.timer.clear()

# Veri Üretimi
for i in range(0, numOfDataEntries):

    # Veriyi arabelleğe yazmak için komutlar
    data_buffer += "%1.3f" % brain.timer.value() + "\n"
    data_buffer += "%1.3f" % brain_inertial.acceleration(XAXIS) + ","
    data_buffer += "%1.3f" % brain_inertial.acceleration(YAXIS) + ","
    data_buffer += "%1.3f" % beyin_atalet.ivme(ZAXIS) + "\n"

    bekle(sorgulama_gecikmesi_msec, MSEC)

SD Kartı VEX Brain'e Takma

Verileri SD kartındaki bir dosyaya yazmadan önce SD kartını VEX Brain'in SD kart yuvasına takın.

V5 Brain'in SD kart yuvası vurgulanmış şekilde gösterilmiştir. SD kart yuvası, işlemcinin yan tarafında, USB-C bağlantı noktasının sağında yer almaktadır.

Not: Veri yazmak için SD kartı FAT32 olarak biçimlendirin. Boyutu 32 GB veya daha küçük olan SD kartları kullanmanızı öneririz.

SD karttaki bir dosyaya veri yazmanın uygun koşullar altında gerçekleştirilebildiğinden emin olmak için SD kartın VEX IQ Brain'e (2. nesil) düzgün şekilde takılıp takılmadığını kontrol etmek üzere kod eklememiz gerekecek.

  • SD kartın takılı olup olmadığını kontrol etmek için brain.sdcard.is_inserted() işlevini kullanın. SD kart takılı değilse VEX IQ Brain Screen'de ilgili mesajı görüntüleyin ve programı basılı tutun.

    # SD kart takılı değilse programı beklet
    eğer brain.sdcard.is_inserted() değilse:
        brain.screen.set_cursor(1,1)
        brain.screen.print("SD Kart Eksik")
        while(True):
            wait(5, MSEC)


    Not: brain.sdcard.is_inserted() fonksiyonu, Brain'e bir SD kart takılıysa True değerini döndürür.

Verileri SD Karttaki bir CSV dosyasına yazma

Şu ana kadar programımız VEX IQ Brain (2. nesil) ile veri toplayabiliyor. Veri kaydı projesini tamamlamak için, gelecekte inceleme ve analiz amacıyla verileri SD karttaki Virgülle Ayrılmış Değerler (CSV) dosyasına yazmamız gerekir.

  • Bir CSV dosyasına farklı türde veriler yazarken, her sütunun hangi tür verileri içerdiğini bilmek isteriz. Bunu yapmak için, verileri kaydetmeden önce CSV başlık metnini data_buffer değişkenine ekleyebiliriz.
    Bu nedenle, CSV dosyasının sütun adlarını belirtmek için CSV başlık metnini saklamak üzere csvHeaderText değişkenini ve SD karta yazılacak CSV dosyasının adını tutmak üzere sd_file_name değişkenini tanımlayan kodu ekleyin.

    csvHeaderText = "zaman, x, y, z"
    sd_file_name = "myDataPY.csv"

Not: Başlıkların, data_buffer değişkeninde saklanan verilerle aynı sırada olduğundan emin olun.

  • Ardından, veri toplama için for döngüsünden önce CSV başlık metnini data_buffer dizesine ekleyin.

    # CSV Başlığını Oluştur
    data_buffer = csvHeaderText + "\n"
    
    # CSV Veri Üretimi
    for i in range(0, numOfDataEntries):
    
        # Verileri arabelleğe yazmak için komutlar
        data_buffer += "%1.3f" % brain.timer.value() + "\n"
        data_buffer += "%1.3f" % brain_inertial.acceleration(XAXIS) + ","
        data_buffer += "%1.3f" % brain_inertial.acceleration(YAXIS) + ","
        data_buffer += "%1.3f" % brain_inertial.acceleration(ZAXIS) + "\n"
    
        wait(polling_delay_msec, MSEC)
  • SD karttaki bir dosyaya veri yazmadan önce brain.sdcard.savefile() fonksiyonunun nasıl kullanılacağını öğrenelim.

    Python kodunun bir satırı, ayrıntılı olarak açıklanması için parçalar halinde vurgulanmıştır. Kod satırı şu şekildedir: brain.sdcard.savefile(sd_file_name, bytearray(data_buffer, 'utf-8')). Öncelikle, brain.sdcard.savefile bölümü vurgulanır ve "Bir bayt dizisini SD karttaki adlandırılmış bir dosyaya kaydet" şeklinde etiketlenir. Ardından, sd_file_name bölümü vurgulanır ve Dosya Adı olarak etiketlenir. Son olarak, sondaki bytearray(data_buffer, 'utf-8') vurgulanır ve Buffer olarak etiketlenir.


    Bu komut, data_buffer değişkeninde depolanan verileri SD karttaki adlandırılmış bir CSV dosyasına yazar.
    Bunu adım adım inceleyelim:

    • brain.sdcard.savefile(): İşlev, bir bayt dizisini SD karttaki adlandırılmış bir dosyaya kaydeder. İşlev, dosyaya yazılan bayt sayısını döndürür.
    • sd_file_name: Fonksiyonun ilk parametresi. Yazılacak dosyanın adını belirtir. Bu projede dosya adı sd_file_name değişkeninde saklanır.
    • bytearray(datat_buffer,'utf-8'): Fonksiyonun ikinci parametresi. Dosyaya yazılacak bayt dizisini temsil eder.
      •  
        • bytearray(): Yöntem, değiştirilebilir bir bytearray oluşturur. Bu talimatta, kodlamayı belirterek bir dizeyi bytearray'e dönüştürmek için bunu kullanıyoruz.
        • data_buffer: Yöntemin ilk parametresi. Bytearray'e dönüştürülecek kaynağı belirtir. Bu projede kaynak, data_buffer değişkeninde saklanan verilerdir. 
        • 'utf-8': Yöntemin ikinci parametresi. Dizeyi kodlamak için kullanılan belirtilen kodlamayı gösterir. Bu talimattaki kodlama 'utf-8'dir. 
  • Veri toplama için for döngüsü sonra, data_buffer değişkeninde saklanan verileri SD karttaki CSV dosyasına yazmak için brain.sdcard.savefile() işlevini kullanın. Ek olarak, verilerin dosyaya başarıyla yazılıp yazılmadığını doğrulamak için () dönüş değerini kontrol eden kodu ekleyin ve gerçek zamanlı geri bildirim almak için VEX IQ Beyin Ekranında ilgili mesajı görüntüleyin.

    # CSV Veri Oluşturma
    for i in range(0, numOfDataEntries):
    
        # Verileri arabelleğe yazmak için komutlar
        data_buffer += "%1.3f" % brain.timer.value() + "\n"
        data_buffer += "%1.3f" % brain_inertial.acceleration(XAXIS) + ","
        data_buffer += "%1.3f" % brain_inertial.acceleration(YAXIS) + ","
        data_buffer += "%1.3f" % brain_inertial.acceleration(ZAXIS) + "\n"
    
        wait(polling_delay_msec, MSEC)
    
    # Verileri SD karta yaz
    brain.screen.set_cursor(4,1)
    if brain.sdcard.savefile(sd_file_name, bytearray(data_buffer,'utf-8')) == 0:
        beyin.ekran.print("SD Yazma Hatası")
    aksi halde:
        beyin.ekran.print("Veri Yazıldı")


    Not: brain.sdcard.savefile() fonksiyonu dosyaya yazılan bayt sayısını döndürür. Bu projede, toplanan verileri bir CSV dosyasına yazmak için kullanıyoruz, bu nedenle dosyaya yazılan bayt sayısı sıfırdan büyük olmalıdır. Başka bir deyişle, eğer brain.sdcard.savefile() fonksiyonu
    döndürürse, verilerin dosyaya başarıyla yazılmadığı sonucuna varabiliriz. Aksi takdirde, veriler dosyaya yazılmıştır.

Tebrikler! VEX IQ Brain (2. nesil) ile hızlanma verilerini toplayan ve bunları SD karttaki bir CSV dosyasına saklayan bir veri kayıt projesi geliştirdik. Daha sonra, veri analizi için CSV dosyasının nasıl açılacağını keşfedeceğiz. 

# Kütüphane içe aktarımları
from vex import *

# Beyin varsayılan olarak tanımlanmalıdır
brain = Brain()
brain_inertial = Inertial()

csvHeaderText = "zaman, x, y, z"
sd_file_name = "myDataPY.csv"
polling_delay_msec = 50
numOfDataEntries = 100
data_buffer = ""

# SD kart takılı değilse programı beklet
if not brain.sdcard.is_inserted():
    brain.screen.set_cursor(1,1)
    brain.screen.print("SD Kart Eksik")
    while(True):
        wait(5, MSEC)

# Herhangi bir sensör ekleyin & zamanlayıcı başlatma kodu buraya
brain.timer.clear()

# CSV Başlığını Oluştur
data_buffer = csvHeaderText + "\n"

# CSV Veri Üretimi
for i in range(0, numOfDataEntries):

    # Verileri arabelleğe yazmak için komutlar
    data_buffer += "%1.3f" % brain.timer.value() + ","
    data_buffer += "%1.3f" % brain_inertial.acceleration(XAXIS) + ","
    data_buffer += "%1.3f" % brain_inertial.acceleration(YAXIS) + ","
    data_buffer += "%1.3f" % brain_inertial.acceleration(ZAXIS) + "\n"

    wait(polling_delay_msec, MSEC)

# Verileri SD karta yaz
brain.screen.set_cursor(4,1)
if brain.sdcard.savefile(sd_file_name, bytearray(data_buffer,'utf-8')) == 0:
    brain.screen.print("SD Yazma Hatası")
else:
    brain.screen.print("Veri Yazıldı")

 

Veri Analizi için CSV Dosyasını Açma

Veriler SD karttaki CSV dosyasına yazıldıktan sonra, verileri okumak ve analiz etmek amacıyla dosyayı açmak için bir elektronik tablo uygulaması kullanabiliriz. 

Not: En yaygın elektronik tablo uygulamalarından ikisi Google E-Tablolar ve Microsoft Excel'dir. Bu yazımızda SD karttaki CSV dosyasını açmak için Google E-Tablolar (Web Tabanlı) kullanacağız. Diğer uygulamaları kullanma süreci benzerdir.

  • SD kartı VEX IQ Brain'in SD kart yuvasından çıkarın. Eğer bilgisayarda yerleşik bir Micro SD kart yuvası varsa, SD kartı doğrudan o yuvaya takabiliriz. Aksi takdirde, SD kartını bir SD kart adaptörüne takın ve ardından adaptörü bilgisayara bağlayın. 
  • Google hesabımıza giriş yapın ve Google E-Tablolar'ı açın. Yeni bir e-tablo oluşturun.
  • Elektronik tabloda “Dosya” menüsünü açın, “İçe Aktar” -> “Yükle” -> “Gözat” düğmesini seçin, ardından bilgisayardaki CSV dosyasını seçin. CSV dosyasını yükledikten sonra “Verileri İçe Aktar” butonuna tıklayın. Verileri içe aktardıktan sonra, toplanan verileri CSV dosyasında görmek için “Şimdi aç” öğesine tıklayın.

    Projenin CSV verileri Google Sheets belgesinde açıldı. Burada Zaman, X, Y ve Z harflerini gösteren dört sütun bulunmaktadır. Her bir zaman dilimindeki ivmeyi belgeleyen birçok veri satırı mevcuttur.

  • (İsteğe bağlı) Verileri analiz etmenin kolay bir yolu, bir grafik çizip verilerdeki eğilimleri aramaktır. Elektronik tabloda “Ekle” menüsünü açın ve CSV dosyasındaki verileri kullanarak bir grafik çizmek için “Grafik” seçin. Aşağıdaki grafik, VEX IQ Brain (2. nesil) ile toplanan ivme verilerinin sonucudur.

    Verilerin grafiği Google Sheets'te açılmış olup, X, Y ve Z eksenlerindeki ivmenin zamana göre değişimini göstermektedir. Z değeri eksi bire yakın, X ve Y değerleri ise sıfıra yakın kalır.


    Not: Farklı bir Grafik Türü seçmek veya ihtiyaçlarımıza göre grafiği düzenlemek için Grafik düzenleyiciyi kullanabiliriz.

Bu noktaya kadar VEX IQ Brain (2. nesil) ile veri toplayan ve SD karttaki CSV dosyasına kaydeden veri kayıt projesini tamamladık. Ayrıca SD karttaki CSV dosyasını Google E-Tablolar'ı kullanarak nasıl okuyacağımızı ve hatta daha fazla analiz için bir grafik oluşturmayı da öğrendik. Sırada ne var? Veri kaydı için VEX Robotunu kullanarak daha heyecan verici deneyler planlamaya çalışalım, değişen çevresel faktörlerin çeşitli veri türlerini nasıl etkilediğini gözlemleyelim ve etrafımızdaki dünyayı daha derinlemesine anlayalım.

For more information, help, and tips, check out the many resources at VEX Professional Development Plus

Last Updated: