Tempo de execução
Que eu saiba, você não pode detectar o tipo de placa, mas pode ler o ID do dispositivo ATmega. Verifique esta pergunta como isso pode ser feito: Uma assinatura de dispositivo ATmega ou ATtiny pode ser lida durante a execução? Observe que, ao usar esse método, várias atribuições de registro serão alteradas, não apenas a pinagem. Portanto, seu código pode ficar significativamente mais complexo. A vantagem é que, se você conseguir solucionar todas as atribuições de registro alteradas e outras dependências de hardware, poderá usar um único arquivo .hex para programar seus dispositivos diretamente avrdude
.
Tempo de compilação
Outra maneira de descobrir o tipo de placa / controlador é em tempo de compilação. Basicamente, você compila partes do código ou define macros, dependendo do tipo de dispositivo configurado no IDE do Arduino. Verifique este sniplet de código para obter um exemplo:
#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
O sniplet de código foi copiado descaradamente em https://github.com/gillham/logic_analyzer/wiki Verifique esse código para mais alguns truques específicos do dispositivo.
Dependendo do sistema operacional do host, os tipos de controladores suportados podem ser encontrados no seguinte arquivo:
- Linux:
/usr/lib/avr/include/avr/io.h
- Janelas:
...\Arduino\hardware\tools\avr\avr\include\avr\io.h
O uso do pré-processador C (pelo qual o código acima é tratado) provavelmente está fora do escopo deste site. http://stackoverflow.com seria o melhor lugar para perguntas detalhadas.
Se você estiver no Linux, poderá encontrar facilmente todos os tipos de controladores suportados digitando:
grep 'defined (__AVR' /usr/lib/avr/include/avr/io.h | sed 's/^[^(]*(\([^)]*\))/\1/'
Tools > Get Board Info
) Eu esperava fazer uma verificação de cadeia de caracteres de uma conexão serial, para que a porta COM correta possa ser selecionada automaticamente quando meu aplicativo iniciar. Porque, obviamente, o IDE pode fazer isso, alguma idéia se eles usarem os métodos acima?Conforme declarado na especificação de hardware do Arduino , o Arduino IDE agora define uma macro para cada placa, conforme definido na
build.board
propriedade boards.txt . Esse valor é anexado aARDUINO_
, portanto, por exemplo, as macros para os painéis nos quais você está interessado são:ARDUINO_AVR_UNO
ARDUINO_AVR_MEGA2560
ARDUINO_SAM_DUE
Exemplo de como você pode usar essas macros no seu código:
fonte
Uma maneira fácil de farejar placas é usar uma biblioteca como o ArduinoManager. Com isso, você pode facilmente obter o nome do painel e os recursos https://github.com/backupbrain/ArduinoBoardManager
Ele usa a técnica descrita acima para revelar muitas informações sobre quase todas as placas do Arduino, por isso é excelente para fazer projetos que podem ser implantados em ambientes muito diferentes.
Basta baixar e incluir no seu projeto do Arduino.
A saída resultante no Arduino Uno é:
O processo para fazer esta biblioteca (incluindo exemplo de código) para determinar um modelo de placa Arduino e versão é descrito em detalhes no meu blog.
fonte
Para todas as placas compatíveis com Arduio Due
(Veja o arquivo sam3.h para obter mais informações.)
Se você deseja apenas segmentar o Arduino Due (excluindo placas compatíveis), pode usar
(Isso é definido no arquivo variant.h do Arduino Due .)
Crédito para Adam F /programming//a/21058963/354144
fonte
Como o Arduino Due é uma família de processadores (ARM) diferente dos AVRs, você não poderá usar o mesmo executável para todos os três. Mas você pode ter o mesmo código fonte (assumindo que a sintaxe para ler uma porta seja a mesma nas partes AVR e ARM) e apenas dois executáveis (já que o mesmo será executado no Uno e no Mega sem recompilar).
Você pode determinar o tipo de placa em tempo de execução sem precisar recompilar, escolhendo dois pinos digitais que ainda não estão sendo utilizados pelo seu programa em nenhuma das placas e amarrá-los alto ou baixo como um ID da placa. Por exemplo, se os pinos que você escolher forem PC1 e PC3:
Em seguida, basta ler a porta na inicialização e definir uma variável no seu programa.
Outro esquema que pode ser usado, que une apenas um pino, é usar um pino de entrada analógica e usar um divisor de resistor, escolhendo resistores de modo a obter tensões diferentes, por exemplo, incrementos de 0,25V. Eu usei essa técnica para especificar não apenas um tipo de placa, mas também uma revisão da mesma placa (que em certo sentido é um novo tipo de placa).
fonte