Durée
À ma connaissance, vous ne pouvez pas détecter le type de carte, mais vous pouvez lire l'ID de l'appareil ATmega. Vérifiez cette question comment cela peut être fait: une signature d'appareil ATmega ou ATtiny peut-elle être lue pendant l'exécution? Notez cependant que lorsque vous utilisez cette méthode, plusieurs affectations de registre changeront, pas seulement le brochage. Par conséquent, votre code peut devenir beaucoup plus complexe. L'avantage est que si vous parvenez à contourner toutes les affectations de registre changeantes et autres dépendances matérielles, vous pouvez utiliser un seul fichier .hex pour programmer vos périphériques directement à partir de avrdude
.
Compiler le temps
Une autre façon de déterminer le type de carte / contrôleur est au moment de la compilation. Fondamentalement, vous compilez des parties du code ou définissez des macros en fonction du type de périphérique configuré dans l'IDE Arduino. Consultez cet exemple de code pour un exemple:
#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
Le fragment de code a été copié sans vergogne à partir de https://github.com/gillham/logic_analyzer/wiki Vérifiez ce code pour une astuce plus spécifique à l'appareil.
Selon le système d'exploitation de votre hôte, les types de contrôleurs pris en charge se trouvent dans le fichier suivant:
- Linux:
/usr/lib/avr/include/avr/io.h
- Les fenêtres:
...\Arduino\hardware\tools\avr\avr\include\avr\io.h
L'utilisation du préprocesseur C (par lequel le code ci-dessus est géré) est probablement hors de portée pour ce site. http://stackoverflow.com serait le meilleur endroit pour des questions détaillées.
Si vous êtes sous Linux, vous pouvez facilement trouver tous les types de contrôleurs pris en charge en tapant:
grep 'defined (__AVR' /usr/lib/avr/include/avr/io.h | sed 's/^[^(]*(\([^)]*\))/\1/'
Tools > Get Board Info
) J'espérais faire une vérification de la chaîne à partir d' une connexion série, de sorte que le port COM peut être sélectionné automatiquement au démarrage de l' application. Parce qu'évidemment, l'EDI peut le faire, une idée s'ils utilisent les méthodes ci-dessus?Comme indiqué dans la spécification matérielle Arduino , l'IDE Arduino définit désormais une macro pour chaque carte, comme défini dans la
build.board
propriété boards.txt . Cette valeur est ajoutée àARDUINO_
, par exemple, les macros des cartes qui vous intéressent sont:ARDUINO_AVR_UNO
ARDUINO_AVR_MEGA2560
ARDUINO_SAM_DUE
Exemple d'utilisation de ces macros dans votre code:
la source
Un moyen simple de renifler des cartes consiste à utiliser une bibliothèque telle que ArduinoManager. Avec cela, vous pouvez très facilement obtenir le nom et les fonctionnalités de la carte https://github.com/backupbrain/ArduinoBoardManager
Il utilise la technique décrite ci-dessus pour révéler de nombreuses informations sur presque toutes les cartes Arduino, il est donc idéal pour créer des projets qui pourraient être déployés dans des environnements très différents.
Téléchargez et incluez simplement dans votre projet Arduino.
La sortie résultante sur Arduino Uno est:
Le processus de création de cette bibliothèque (y compris un exemple de code) pour déterminer un modèle et une version de carte Arduino est décrit en détail sur mon blog.
la source
Pour toutes les cartes compatibles avec Arduio Due
(Voir le fichier sam3.h pour plus d'informations.)
Si vous souhaitez simplement cibler l'Arduino Due (en laissant de côté les cartes compatibles), vous pouvez utiliser
(Ceci est défini dans le fichier variant.h d' Arduino Due .)
Crédit à Adam F /programming//a/21058963/354144
la source
Étant donné que l'Arduino Due est une famille de processeurs (ARM) différente de celle des AVR, vous ne pourrez pas utiliser le même exécutable pour les trois. Mais vous pouvez avoir le même code source (en supposant que la syntaxe de lecture d'un port est la même sur les parties AVR et ARM), et seulement deux exécutables (car le même s'exécutera sur Uno et Mega sans recompilation).
Vous pouvez déterminer le type de carte au moment de l'exécution sans avoir à recompiler, en choisissant deux broches numériques qui ne sont déjà utilisées par votre programme sur aucune des cartes et en les liant haut ou bas comme ID de carte. Par exemple, si les broches que vous choisissez sont PC1 et PC3:
Ensuite, lisez simplement le port à la mise sous tension et définissez une variable dans votre programme.
Un autre schéma qui peut être utilisé, qui n'attache qu'une seule broche, consiste à utiliser une broche d'entrée analogique et à utiliser un diviseur de résistance, en choisissant des résistances telles que vous obtenez des tensions différentes, par exemple, des incréments de 0,25 V. J'ai utilisé cette technique pour spécifier non seulement un type de carte, mais aussi une révision de carte pour la même carte (qui, dans un sens, est un nouveau type de carte).
la source