Yazılımda hangi arduino kartını (veya hangi denetleyiciyi) nasıl tespit edebilirim?


14

Bir Uno veya Mega (hatta Due) üzerinde çalışmak istediğim bir projem var ve yazılımın iki sürümüne ihtiyacım olmasa iyi olur. Örneğin, bir Mega'da SoftwareSerial'ı kullanmak için, bir Uno'dakinden farklı pinler kullanmanız gerekir. Software Serial üzerindeki belgelere bakın . Her neyse, bir Uno kullandığımı tespit etmek güzel olurdu, bu yüzden sadece TX / RX için 4 ve 5 pinlerini kullanabilirim ve bir Mega kullanıyorsanız, yazılım 10 ve 11 pinlerini tespit edip kullanacaktır (ve Elbette, farklı bir şekilde kablolamak zorunda kalacağım, ancak en azından yazılım aynı olacak).

Yanıtlar:


16

Çalışma süresi

Bildiğim kadarıyla kart tipini tespit edemezsiniz, ancak ATmega cihaz kimliğini okuyabilirsiniz. Bu sorunun nasıl yapılabileceğini kontrol edin: Çalışırken bir ATmega veya ATtiny cihaz imzası okunabilir mi? Bu yöntemi kullanırken, sadece pinout'u değil, birkaç kayıt atamasının da değişeceğine dikkat edin. Bu nedenle kodunuz daha karmaşık hale gelebilir. Avantaj olduğunu eğer tüm değişen kayıt atamaları ve diğer donanım bağımlılıklarını geçici yönetmek, doğrudan 'dan cihazlarınızı programlamak için tek bir Hex dosyası kullanabilirsiniz avrdude.

Derleme zamanı

Kart / denetleyici türünü anlamanın başka bir yolu derleme zamanıdır. Temelde, kodun parçalarını derler veya Arduino IDE'de yapılandırılan cihaz türüne bağlı olarak makrolar ayarlarsınız. Örnek olarak bu kod sniplet'ini kontrol edin:

#if defined(__AVR_ATmega1280__) || defined(__AVR_ATmega2560__)
#define DEBUG_CAPTURE_SIZE 7168
#define CAPTURE_SIZE 7168
#elif defined(__AVR_ATmega328P__)
#define DEBUG_CAPTURE_SIZE 1024
#define CAPTURE_SIZE 1024
#else
#define DEBUG_CAPTURE_SIZE 532
#define CAPTURE_SIZE 532
#endif

Kod pasajı utanmadan https://github.com/gillham/logic_analyzer/wiki adresinden kopyalandı . Cihaza özgü bazı daha fazla hile için bu kodu kontrol edin.

Ana makinenizin işletim sistemine bağlı olarak, desteklenen denetleyici türleri aşağıdaki dosyada bulunabilir:

  • Linux: /usr/lib/avr/include/avr/io.h
  • Pencereler: ...\Arduino\hardware\tools\avr\avr\include\avr\io.h

C-önişlemcisinin kullanımı (yukarıdaki kodun işlendiği) muhtemelen bu site için kapsam dışıdır. Ayrıntılı sorular için http://stackoverflow.com daha iyi bir yer olacaktır.

Linux'taysanız, desteklenen tüm denetleyici türlerini yazarak kolayca bulabilirsiniz:

grep 'defined (__AVR' /usr/lib/avr/include/avr/io.h | sed 's/^[^(]*(\([^)]*\))/\1/'

.. \ Arduino \ donanım \ araçlar \ avr \ avr \ include \ avr \ io.h windows için
mpflaga

@mpflaga Cevabı güncelledim. Girişiniz için teşekkürler.
jippie

AVR'ye özgü önceden tanımlanmış tüm makrolar avr-libc belgelerinde listelenir .
Ignacio Vazquez-Abrams

Peki nasıl Arduino IDE yönetim kurulu bilgi alır? ( Tools > Get Board Info) Ben seri bir bağlantıdan bir dize denetimi yapmak umuyordum, böylece benim uygulama başladığında doğru COM bağlantı noktası otomatik olarak seçilebilir. Açıkçası, IDE yukarıdaki yöntemleri kullanırlarsa herhangi bir fikir, bunu yapabilir?
n00dles

@ n00dles Yukarıda açıklanan yöntemler istediğinizden farklıdır. Muhtemelen Arduino'da kendi sorusuna değer. Pano Bilgisini Al'ı kontrol edemiyorum, mevcut Arduino sürümünde değil.
jippie

6

Arduino donanım spesifikasyonunda belirtildiği gibi , Arduino IDE artık boards.txt build.boardözelliğinde tanımlandığı gibi her anakart için bir makro tanımlamaktadır . Bu değere eklenir ARDUINO_, örneğin, ilgilendiğiniz panoların makroları şunlardır:

  • Uno: ARDUINO_AVR_UNO
  • Mega 2560: ARDUINO_AVR_MEGA2560
  • Teslim Tarihi: ARDUINO_SAM_DUE

Kodunuzda bu makroları nasıl kullanabileceğinize örnek:

#if defined(ARDUINO_AVR_UNO)
//Uno specific code
#elif defined(ARDUINO_AVR_MEGA2560)
//Mega 2560 specific code
#elif defined(ARDUINO_SAM_DUE)
//Due specific code
#else
#error Unsupported hardware
#endif

Bunun sorunun en basit ve en basit yanıtı olduğunu söyleyebilirim. Keşke kabul edildi.
Erutan409

4

Tahta koklama yapmanın kolay bir yolu, ArduinoManager gibi bir kütüphane kullanmaktır. Bununla tahta adını ve özelliklerini kolayca alabilirsiniz https://github.com/backupbrain/ArduinoBoardManager

Hemen hemen her Arduino kartı hakkında birçok bilgiyi ortaya çıkarmak için yukarıda açıklanan tekniği kullanır, bu nedenle çok farklı ortamlarda dağıtılabilecek projeler yapmak için harikadır.

Sadece indirin ve Arduino projenize dahil edin.

#include "ArduinoBoardManager.h"

ArduinoBoardManager arduino = ArduinoBoardManager(); // required if you want to know the board name and specific features

void setup() {
  Serial.begin(9600);

  Serial.print("Board is compatible with Arduino ");
  Serial.println(arduino.BOARD_NAME);

  Serial.println("Speed/SRAM/Flash: ");
  Serial.print(ArduinoBoardManager::MAX_MHZ);
  Serial.println(ArduinoBoardManager::SRAM_SIZE);
  Serial.println(ArduinoBoardManager::FLASH_SIZE);

  // Board features (multiple serial ports on Mega, for example)
  if (arduino.featureExists(ArduinoBoardManager::FEATURE_MULTIPLE_SERIAL)) {
    Serial.println("Your board supports multiple serial connections");
  }

}

void loop() {
}

Arduino Uno'da elde edilen sonuç:

Board is compatible with Arduino UNO

Speed/SRAM/Flash: 
16000000
2048
33554432

Arduino board modelini ve versiyonunu belirlemek için bu kütüphaneyi (örnek kod dahil) yapma süreci blogumda ayrıntılı olarak açıklanmaktadır.


Your Arduino Due tanıma ArduinoBoardManager.h yanlış olabilir, bunu görmek yayını .
Ulrich Stern

Lütfen projenizde bir lisans
belirtin

2

Arduio Due ile uyumlu tüm kartlar için

#if defined (__arm__) && defined (__SAM3X8E__) // Arduino Due compatible
// your Arduino Due compatible code here
#endif

(Daha fazla bilgi için sam3.h dosyasına bakın .)

Arduino Due'ı (uyumlu panoları dışarıda bırakarak) hedeflemek istiyorsanız,

#if defined (_VARIANT_ARDUINO_DUE_X_)
// your Arduino Due code here
#endif

(Bu, Arduino Due'nun variant.h dosyasında tanımlanmıştır.)

Adam F'ye kredi /programming//a/21058963/354144


1

Arduino Due, AVR'lerden farklı bir işlemci ailesi (ARM) olduğundan, üçü için de aynı yürütülebilir dosyayı kullanamazsınız . Ancak aynı kaynak koduna (bir bağlantı noktasını okumak için sözdiziminin hem AVR hem de ARM parçaları arasında aynı olduğunu varsayarak) ve yalnızca iki yürütülebilir dosyaya sahip olabilirsiniz (çünkü aynı kod , yeniden derlemeden hem Uno hem de Mega'da çalışacaktır).

Herhangi bir anakartta programınız tarafından kullanılmayan iki dijital pim seçerek anakartın derlemesini yapmak zorunda kalmadan anakart türünü belirleyebilir ve bunları anakart kimliğini yüksek veya düşük olarak bağlayabilirsiniz. Örneğin, seçtiğiniz pimler PC1 ve PC3 ise:

 PC1   PC3   Board ID
  0     0      Uno
  0     1      Mega
  1     0      Due
  1     1      spare

Ardından, açılıştaki bağlantı noktasını okuyun ve programınızda bir değişken ayarlayın.

Yalnızca bir pimi bağlayan kullanılabilen bir başka şema, analog giriş pimi kullanmak ve bir direnç bölücü kullanmak, örneğin 0.25V artışlarla farklı voltajlar elde edeceğiniz dirençleri seçmek. Bu tekniği sadece bir tahta tipi değil aynı zamanda bir tahta revizyonu (bir anlamda yeni bir tahta tipidir) belirtmek için kullandım.

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.