Tiempo de ejecución
Que yo sepa, no puede detectar el tipo de placa, pero puede leer la identificación del dispositivo ATmega. Compruebe esta pregunta cómo se puede hacer: ¿Se puede leer la firma de un dispositivo ATmega o ATtiny mientras se ejecuta? Sin embargo, tenga en cuenta que al usar este método, varias asignaciones de registro cambiarán, no solo el pinout. Por lo tanto, su código puede ser significativamente más complejo. La ventaja es que si logra evitar todas las asignaciones de registros cambiantes y otras dependencias de hardware, puede usar un solo archivo .hex para programar sus dispositivos directamente avrdude
.
Tiempo de compilación
Otra forma de averiguar el tipo de placa / controlador es en tiempo de compilación. Básicamente, compila partes del código o establece macros dependiendo del tipo de dispositivo configurado en el IDE de Arduino. Consulte este fragmento de código para ver un ejemplo:
#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
El fragmento de código se copió descaradamente de https://github.com/gillham/logic_analyzer/wiki. Consulte ese código para ver algunos trucos más específicos del dispositivo.
Dependiendo del sistema operativo de su host, los tipos de controladores compatibles se pueden encontrar en el siguiente archivo:
- Linux:
/usr/lib/avr/include/avr/io.h
- Ventanas:
...\Arduino\hardware\tools\avr\avr\include\avr\io.h
El uso del preprocesador C (por el cual se maneja el código anterior) probablemente esté fuera del alcance de este sitio. http://stackoverflow.com sería el mejor lugar para preguntas detalladas.
Si está en Linux, puede encontrar fácilmente todos los tipos de controladores compatibles escribiendo:
grep 'defined (__AVR' /usr/lib/avr/include/avr/io.h | sed 's/^[^(]*(\([^)]*\))/\1/'
Tools > Get Board Info
) Esperaba hacer una comprobación de cadena desde una conexión en serie, para que el puerto COM correcto se pueda seleccionar automáticamente cuando se inicia mi aplicación. Porque, obviamente, el IDE puede hacer esto, ¿alguna idea si usan los métodos anteriores?Como se indica en la especificación de hardware de Arduino , el IDE de Arduino ahora define una macro para cada placa, como se define en la
build.board
propiedad boards.txt . Ese valor se agrega aARDUINO_
, por ejemplo, las macros para los tableros que le interesan son:ARDUINO_AVR_UNO
ARDUINO_AVR_MEGA2560
ARDUINO_SAM_DUE
Ejemplo de cómo puede usar estas macros en su código:
fuente
Una manera fácil de rastrear tableros es usar una biblioteca como ArduinoManager. Con esto, puede obtener fácilmente el nombre y las características de la placa https://github.com/backupbrain/ArduinoBoardManager
Utiliza la técnica descrita anteriormente para revelar mucha información sobre casi todas las placas Arduino, por lo que es ideal para hacer proyectos que podrían implementarse en entornos muy diferentes.
Simplemente descargue e incluya en su proyecto Arduino.
La salida resultante en Arduino Uno es:
El proceso para hacer esta biblioteca (incluido el código de ejemplo) para determinar un modelo y versión de placa Arduino se describe en detalle en mi blog.
fuente
Para todas las placas compatibles con Arduio Due
(Ver el archivo sam3.h para obtener más información).
Si solo desea apuntar al Arduino Due (sin incluir placas compatibles), puede usar
(Esto se define en el Arduino Due's archivo variant.h de ).
Crédito a Adam F /programming//a/21058963/354144
fuente
Dado que Arduino Due es una familia de procesadores (ARM) diferente a la de los AVR, no podrá utilizar el mismo ejecutable para los tres. Pero puedes tener lo mismo código fuente (suponiendo que la sintaxis para leer un puerto sea la misma en las partes AVR y ARM), y solo dos ejecutables (ya que el mismo se ejecutará en Uno y Mega sin recompilar).
Puede determinar el tipo de placa en tiempo de ejecución sin tener que volver a compilar, eligiendo dos pines digitales que su programa aún no esté utilizando en ninguna de las placas y vincularlos alto o bajo como ID de placa. Por ejemplo, si los pines que elige son PC1 y PC3:
Luego, simplemente lea el puerto al encender y configure una variable en su programa.
Otro esquema que se puede usar, que ata solo un pin, es usar un pin de entrada analógica y usar un divisor de resistencia, eligiendo resistencias de manera que obtenga diferentes voltajes en incrementos de 0.25V. He usado esa técnica para especificar no solo un tipo de placa, sino también una revisión de placa para la misma placa (que en cierto sentido es un nuevo tipo de placa).
fuente