Arduino: Kodda tahta türü nasıl alınır


13

Farklı Arduino tahtalarında derlenebilecek bir taslak yazmak istiyorum. Şu anda bağlı olan PC'de görüntülemek istiyorum.

Bu, kullanıcının USB kablosu ile PC'yi çizimimi çalıştıran Arduino / Teensy kartına bağladığı ve çizimimin PC'ye hangi kartın bağlı olduğunu söylemesi anlamına gelir. PC'de bu verileri alan ve görüntüleyen C # uygulamam çalışır.

Bu nedenle taslak derlendiğinde seçilen tahtaya ihtiyacım var:

Arduino Board seçici

Kodu https://github.com/backupbrain/ArduinoBoardManager üzerinde buldum ama doğru sonuçlar vermiyor (birkaç pano eksik olması dışında).

İşte koddan bir snippet:

static const uint8_t BOARD_MICRO= 0x04;

....
#elif defined(__AVR_Atmega32U4__) // Yun 16Mhz, Micro, Leonardo, Esplora
  static const uint8_t BOARD = 0x04;
  static const uint8_t NUM_BITS = 8;
  static const uint16_t CPU = __AVR_Atmega32U4__;
  static const unsigned long SRAM_SIZE = 2500;
  static const unsigned long EEPROM_SIZE = 1000;
  static const unsigned long FLASH_SIZE = 32000;
#elif defined(.....

Dolayısıyla bu kod Yun 16MHz, Micro, Leonardo y Esplora için aynı sonucu verir (BOARD = 0x04 = Mikro).

Benim C kodu tam Arduino derleyici menüsünde kullanıcının selecetd sahip dize almak için herhangi bir yolu var mı?


2
Ürün yazılımını oluşturmak için arduino IDE kullanıyorsanız, F_CPU ARDUINO ve AVR_whatever dışında, derleyici için proje düzeyinde bir #define iletme hükmü yoktur . Arduinio IDE yerine bir makefile kullanarak sınıflandırma yapmanız gerekebilir. Arduino'yu kontrol edin.SE, Nick ve Ignatio'nun bazı iyi örnekleri var.
MarkU

Arduino.SE'de ilginç bir şey bulamıyorum. (İsveçli mi?)
Elmue

@Elmue arduino.StackExchange.com Arduino SE'dir.
Avamander

Ahhhh. TAMAM. Ama arduino.se var!
Elmue

“Şu anda bağlı olan PC'de görüntülemek istiyorum” derken, derlenmiş ve yüklenmiş bir çizim çalıştığında görüntülemek veya bir çizim derlenirken veya IDE sadece belirli bir yerde otururken göstermek mi istiyorsunuz? tahta takılı mı? (Son iki durumda, kart seçimi 1.6.3 IDE'nin en alt satırında görünür, ancak daha eski veya farklı bir IDE'niz varsa olmayabilir.) (İlk durumda geçerliyse, seri monitörde görünmesini istersiniz? -)
James Waldby - jwpat7

Yanıtlar:


17

Charlie Hanson ve jantje'nin yardımı sayesinde evrensel çözümü buldum!

Her Arduino programcısının tahta ismini nasıl alacağını anlamak için aynı acıdan geçmesi üzücü olduğundan, herkesin kopyalayıp yapıştırabilmesi için kodumu halka sunacağım.

İşte burada:

#if defined(TEENSYDUINO) 

    //  --------------- Teensy -----------------

    #if defined(__AVR_ATmega32U4__)
        #define BOARD "Teensy 2.0"
    #elif defined(__AVR_AT90USB1286__)       
        #define BOARD "Teensy++ 2.0"
    #elif defined(__MK20DX128__)       
        #define BOARD "Teensy 3.0"
    #elif defined(__MK20DX256__)       
        #define BOARD "Teensy 3.2" // and Teensy 3.1 (obsolete)
    #elif defined(__MKL26Z64__)       
        #define BOARD "Teensy LC"
    #elif defined(__MK64FX512__)
        #define BOARD "Teensy 3.5"
    #elif defined(__MK66FX1M0__)
        #define BOARD "Teensy 3.6"
    #else
       #error "Unknown board"
    #endif

#else // --------------- Arduino ------------------

    #if   defined(ARDUINO_AVR_ADK)       
        #define BOARD "Mega Adk"
    #elif defined(ARDUINO_AVR_BT)    // Bluetooth
        #define BOARD "Bt"
    #elif defined(ARDUINO_AVR_DUEMILANOVE)       
        #define BOARD "Duemilanove"
    #elif defined(ARDUINO_AVR_ESPLORA)       
        #define BOARD "Esplora"
    #elif defined(ARDUINO_AVR_ETHERNET)       
        #define BOARD "Ethernet"
    #elif defined(ARDUINO_AVR_FIO)       
        #define BOARD "Fio"
    #elif defined(ARDUINO_AVR_GEMMA)
        #define BOARD "Gemma"
    #elif defined(ARDUINO_AVR_LEONARDO)       
        #define BOARD "Leonardo"
    #elif defined(ARDUINO_AVR_LILYPAD)
        #define BOARD "Lilypad"
    #elif defined(ARDUINO_AVR_LILYPAD_USB)
        #define BOARD "Lilypad Usb"
    #elif defined(ARDUINO_AVR_MEGA)       
        #define BOARD "Mega"
    #elif defined(ARDUINO_AVR_MEGA2560)       
        #define BOARD "Mega 2560"
    #elif defined(ARDUINO_AVR_MICRO)       
        #define BOARD "Micro"
    #elif defined(ARDUINO_AVR_MINI)       
        #define BOARD "Mini"
    #elif defined(ARDUINO_AVR_NANO)       
        #define BOARD "Nano"
    #elif defined(ARDUINO_AVR_NG)       
        #define BOARD "NG"
    #elif defined(ARDUINO_AVR_PRO)       
        #define BOARD "Pro"
    #elif defined(ARDUINO_AVR_ROBOT_CONTROL)       
        #define BOARD "Robot Ctrl"
    #elif defined(ARDUINO_AVR_ROBOT_MOTOR)       
        #define BOARD "Robot Motor"
    #elif defined(ARDUINO_AVR_UNO)       
        #define BOARD "Uno"
    #elif defined(ARDUINO_AVR_YUN)       
        #define BOARD "Yun"

    // These boards must be installed separately:
    #elif defined(ARDUINO_SAM_DUE)       
        #define BOARD "Due"
    #elif defined(ARDUINO_SAMD_ZERO)       
        #define BOARD "Zero"
    #elif defined(ARDUINO_ARC32_TOOLS)       
        #define BOARD "101"
    #else
       #error "Unknown board"
    #endif

#endif

Hatta bu kodu yeni bir başlık dosyasına koyabilir ve # projenize dahil edebilirsiniz.

PD Anakarta ek olarak CPU modelini öğrenmek istiyorsanız, avr_cpunames.h dosyasını arayın.


başka bir şey. "return"? ";" bilmediğinizde #pragma uyarı panosu adı bilinmemektedir
jantje

1.) "?" #error ile. 2.) Dizelerin gerçekten bir sorun olduğunu düşünmüyorum. Sonunda sadece BİR dize derleneceğini anladınız mı? Bunu yukarıda açıklayan güncellememe bakın. En uzun dize 11 bayttır. Kodunuzu 11 bayt önemsediğiniz kadar optimize etmeniz gerekiyorsa, bir numaralandırma tanımlamanızı ve dize yerine geri döndürmenizi öneririm. Ardından fonksiyonunuz 11 yerine bir bayt döndürecektir.
Elmue

3.) Ve sürdürülebilirliği ilgilendiren şey: Böyle bir işlev yazmak zorunda olduğum üzücü. Bu, derleyici ile birlikte yüklenen başlık dosyalarının bir parçası olmalı ve geliştiriciler tarafından korunmalı ve her yeni sürümle güncellenmelidir.
Elmue

2) Boyut üzerine açıklama yazarken bir hata yaptım. Bu konuyu 5 saat önce açıkladım. Bunun için özür dilerim. 3) Sürdürülebilirlik bir sorundur. Geçmişte çok benzer bir kod yazmıştım. Eminim ki birçokları da vardır. "Daha iyi IDE çözümünü" tercih etmemin nedeni budur. Eminim ki tüm "daha iyi IDE'ler" cevabımda bahsettiğimle benzer bir çözüme sahip olacak. Bunu bir tamamlayıcı olarak görün: Arduino IDE'den daha fazla büyüyorsunuz.
jantje

Yanlış bir yorum yazdıysanız, en iyisi onu silmek olacaktır.
Elmue

2

Bu windows mod benzer linux üzerinde olması gereken bir şey olduğunu unutmayın.

İlki hızlı ve kolaydır. Nelow açıklandığı gibi kullandığınız platform.txt dosyalarını değiştirmeniz yeterlidir. Bunun dezavantajı, platform.txt dosyalarını her sürümde değiştirmeniz gerektiğidir.

-DBOARD = \ "$ {build.board} \" tarifine ekleyin. Bu izin verecek

   const char boardName[]=BOARD;

Bu da boardName içinde "ARDUINO_AVR_LEONARDO" (leonardo için) dizesini verir.

İkinci yol daha iyi bir IDE'ye geçmektir (başkaları tarafından önerildiği gibi). Arduino eclipse eklentisinin yaratıcısı olarak arduino eclipse eklentisini kullanmanızı tavsiye ederim. Arduino eclipse eklentisinde bunu şu şekilde yapabilirsiniz: Project-> properties-> arduino-> sekmesi "derleme seçenekleri" koymak sağ tıklayın

-DBOARD=\"${A.BUILD.BOARD}\" 

C ve C ++ alanına ekleyin.

Bu, yukarıdaki kodu derlemek için yapar

Adendum

"Güzel isim" istediğinizi bilmiyordum. Bunun arduino IDE'deki platform.txt dosyasında düzeltilebileceğinden emin değilim. Arduino eclipse eklentisinde yukarıdaki düzeltmeyi

-DBOARD=\"${A.NAME}\"

tanımlamak Kurulu güzel isim (leonardo "Arduino Leonardo" için) almak.


Downvoter veya başka biri lütfen bunun neden cevabın downvoting gerektirdiğini belirleyecek kadar nazik olur mu?
jantje

1.) Evet, StackExchange oy kullanan herkesi bir açıklama yazmaya zorlamalıdır. (Bu benim düşüşüm değildi) 2.) Bu sorunu çözmek için Eclipse kullanmaya gerek yok. 3.) Cevabımı burada görebilirsiniz.
Elmue

Elmue, 1) kabul ettiğin için teşekkürler :-). 2) Katılıyorum. Cevabın ilk kısmı, platform txt'sini değiştirerek Arduino IDE'de çalışmasını nasıl düzeltebileceğinizdir. Cevabınız bunun nasıl düzeltileceği konusunda daha ayrıntılı olarak ele alınmaktadır. Bunun için tutulma veya daha iyi bir IDE'ye gerek yoktur. Daha iyi ide çözümünden bahsedilmektedir, çünkü Arduino ide'nin boards.txt dosyasını ayrıştırması gerekir, böylece muhtemelen bu bilgilere bir yerde sahip olur ve platform.txt dosyasını değiştirmeye gerek kalmadan çalışma imkanı vardır. Arduino eclipse eklentisini çok iyi bildiğim için, bu araçla bunu nasıl yapacağım konusunda bir örnek verdim. 3) Benim düzenlememi görün
jantje

Eclise Teensy ile de çalışır mı? Exclipse'in başka avantajları nelerdir?
Elmue

Evet teensy arduino eclipse eklentisi tarafından destekleniyor, ancak platform.txt'yi değiştirmeniz gerekiyor (teensyduino 1.28'de düzeltilmelidir)
jantje

0

Menüdeki tam adlar Arduino IDE'nizdeki (Arduino \ hardware \ arduino \ avr \ boards.txt) boards.txt dosyasından gelir. Dosyayı kendiniz ayrıştırmanız ve algılanan kartı orada bulmanız gerektiğini düşünüyorum.


Dosya ayrıştırılsın mı ?? Ve menüde hangisinin seçildiğini nasıl bilebilirim?
Elmue

0

Bir süre önce ilgili bir soru sordum .

IDE tarafından oluşturulan ve içinde seçilen pano türünü içeren bir dahili * .h dosyası vardır. Olası seçeneklerin listesi bağlantılı soruda verilir, ancak sadece AVR panoları için. AVR dışı listelerin çok daha kısa olduğuna inanıyorum.

Bu, bilgisayara doğru bilgileri göndermek için bazı koşullu ifadelerin eklenmesi meselesidir. Basit bir örnek:

//...within your code, perhaps during setup()...
#ifdef ARDUINO_AVR_UNO
    serial.println("UNO");
#endif
#ifdef ARDUINO_AVR_LEONARDO
    serial.println("LEONARDO");
#endif
// etc...

Çizimde pano türüne birden çok kez başvurmanız gerekiyorsa, aşağıdaki biçimi kullanın:

//...BEFORE setup(), or otherwise in the global namespace...
#ifdef ARDUINO_AVR_UNO
    #define __BOARD_TYPE "UNO"
#endif
#ifdef ARDUINO_AVR_LEONARDO
    #define __BOARD_TYPE "LEONARDO"
#endif
// etc...

// within your code, wherever necessary:
serial.println(__BOARD_TYPE);

İkincisi çok daha düzenli, sadece bir __BOARD_TYPEkez ihtiyacınız olsa bile , hantal #ifdefyığınları işlevlerinizden kaldırır .

Elbette, son kullanıcınızın sahip olabileceğini düşündüğünüz her pano için bir tane yazmanız gerekecektir ve muhtemelen yeni modeller göründüğünde bu listeyi güncellemeniz gerekecektir.


Cevabınız için teşekkürler. Bana çok yardımcı oldu. (Cevabımı buradan görebilirsiniz) Ancak kodunuzda bir hata var. AVR_UNO yerine ARDUINO_AVR_UNO olmalıdır.
Elmue

#Defines öğenizin sonundaki noktalı virgülleri kaldırmak isteyebilirsiniz; bunlar C ifadeleri değildir ve ayırıcılara ihtiyaç duymazlar; aslında ayırıcılar makroların kullanıldığı yere eklenir, println () fonksiyonunun parensinin içine bağlanır. (Noktalı virgüller kaldırılırsa, bu yorum daha sonraki okuyucular için anlamlı olmaz).
Zeph

0

Yeni kartlar eklendikçe orijinal yanıt eski. Temel test doğrudur, ancak kart listesinin nereden geldiği açık değildir.

boards.txtDosyayı bulup gözden geçirirseniz (örneğin ~\Library\Arduino\hardware\arduino\avr\boards.txtbir Mac'te), her kartın satırları boyunca bir girişi olacaktır <BOARD>.build.board=<NAME>, bu nedenle örneğin MKR1000'in bir satırı olacaktır:

mkr1000.build.board=SAMD_MKR1000

İlgili #define, bu örnekte <NAME>ile önek ARDUINO_eklenerek oluşturulabilir, aşağıdaki kod bir MKR1000 kartı için hata verecektir ...

#if defined(ARDUINO_SAMD_MKR1000) #error


Bu cevap sadece bla bla. Neden tüm tanımları olan tüm yeni panoların tam bir listesini göndermiyorsunuz?
Elmue
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.