Uma das coisas legais dos Arduinos, é que existem várias versões e cada versão com suas vantagens, seja em tamanho, custo, capacidade de processamento, etc.
Uma das versões que eu gosto é o Pro mini que consegue reunir quase todos os itens mencionados anteriormente, pequeno, barato e poderoso, tudo em uma pequena plaquinha de 3,4 x 1,9 cm, 8 pinos analógicos, 14 pinos digitais, sendo 6 pwm, botão de reset, led no pino 13 e outro led indicador de energizado e opera a velocidade de 16MHz. Quanto a memória, o Pro Mini disponibiliza 16Kb para memória flash, sendo 2Kb utilizados pelo bootloader, 1Kb de SRAM e 512 bytes de EEPROM. Sem dúvida é uma boa candidata para tirar do papel aquele projeto que você já vem querendo implementar há algum tempo.
Um detalhe importante é que os conectores não vêm soldados na placa, ficando a cargo de quem for utilizá-la escolher qual o melhor tipo de conector a ser utilizado, o que lhe dá a vantagem de poder soldar apenas os pinos que serão de fato necessários de acordo com o projeto a ser implementado. Uma dica quando for soldar os conectores, é usar um pouco de pasta de solda nos terminais, o que facilita bastante conseguir uma solda mais uniforme sem que sobre solda.
Na imagem acima pode-se notar que os 4 primeiros conectores ficaram com a solda "grossa". Como não gostei muito do resultado tentei passar um pouco de pasta de solda, e o resultado foi bem melhor como pode ser observado nos pinos mais à direita.
Em geral os conectores a serem soldados são aqueles que permitem conectar a placa na protoboard ou ainda usar jumper, mas caso vc tenha em mente utilizar alguma outro tipo de conector, tenha certeza que você conseguirá fazer o upload do código após a soldagem, pois dependendo do conector escolhido, o processo de upload pode ficar um pouco mais complicado. Se Notar que será complicado fazer o upload depois de conectar os fios, tente fazer o upload do programa antes de soldar os conectores.
Para mais detalhes sobre as funcionalidades da plaquinha, vale a pena uma boa olhada na imagem abaixo:
Ele não é necessariamente o candidato ideal pra prototipagem, já que nesse quesito o Arduino Uno e o Mega ou outros são os mais indicados, por isso na hora de programá-lo, você irá precisar contar com alguns itens adicionais.
Conversor FTDI
Uma das formas de programa-lo é utilizando um conversor FTDI, o qual possui um conector USB. Porém nesse artigo não irei abordar o seu uso (mas talvez futuramente eu inclua aqui explicações de como utilizá-lo).
Arduino Uno com o Atmega Desencaixado
Outra possibilidade é utilizar um Arduino Uno sem o Atmega conectado na placa. Para isso siga as conexões mostradas abaixo mas com o Atmega desconectado.
Montado na protoboard com os pinos já soldados e com o Atmega removido:
Depois de tudo conectado é hora de configurar a IDE do Arduino para enviar o código para o Pro Mini. Para isso selecione a placa, conforme imagem a baixo.
Feito isso, selecione então o ATmega utilizado, no caso, ATMega328 (5V, 16MHz), como na imagem abaixo:
Agora é só enviar o código. No Exemplo que utilizei, liguei um potenciômetro ao pino A1, um led no pino 13 e outro led no pino 5. O led no pino 13 irá ficar piscando enquanto que o led no pino pwm será controlado através da leitura do pino analógico A1.
O Código possui uma classe temporizadora, a qual ainda irei fazer um outro artigo explicando melhor os detalhes de como ela funciona, mas já fiz outro artigo que abordo sobre temporização, que vale a pena dar uma olhada: http://fabianoallex.blogspot.com.br/2015/09/arduino-como-substituir-delay-pelo.html
Mas o código aqui pode ser qualquer outro que esteja programado para o que você deseja executar.
Código Utilizado:
/*********************************************************************************************************
************************************CLASSE MYTIMER********************************************************
**********************************************************************************************************/
struct MyTimerSequence{
unsigned long * times;
unsigned int size;
unsigned int repeat;
};
class MyTimer{
private:
boolean _enable;
unsigned long _mref;
unsigned long _mref_disable;
unsigned long _time_disable;
MyTimerSequence *_sequences;
long _lag;
int _quantidade;
int _index_time;
int _last_index_time;
int _index_sequence;
int _last_index_sequence;
void (*_onChanging)( int index_sequence, int index_time ); //ponteiro para funcao do evento onChanging
void (*_onEnable)();
void (*_onDisable)();
public:
MyTimer(MyTimerSequence * sequences, int quantidade, long lag, unsigned long mref){
_lag = lag;
_mref = mref;
_sequences = sequences;
_quantidade = quantidade;
_time_disable = 0;
_enable = false;
_undetermine();
}
void _undetermine(){
_index_time = -1;
_last_index_time = -1;
_index_sequence = -1;
_last_index_sequence = -1;
update();
}
void setSequences(MyTimerSequence * sequences, int quantidade){
_sequences = sequences;
_quantidade = quantidade;
_undetermine();
update();
};
void setMillisRef(unsigned long mref) { _mref = mref; _undetermine(); }
void setLag(long lag) { _lag = lag; _undetermine(); }
boolean isChanging() { return (( _index_time != _last_index_time)||( _index_sequence != _last_index_sequence))&&(_enable); }
boolean isIndexTime(int index_sequence, int index_time){ return ( _index_time == index_time)&&(_index_sequence == index_sequence)&&(_enable); }
void setOnChanging( void (*onChanging)(int, int) ) { _onChanging = onChanging; }
void setOnEnable ( void (*onEnable)() ) { _onEnable = onEnable; }
void setOnDisable ( void (*onDisable)() ) { _onDisable = onDisable; }
void update();
void enable() { _enable = true; if ( _onEnable ) { (*_onEnable )( ); } }
void disable() { _enable = false; if ( _onDisable ) { (*_onDisable)( ); } }
void setTimeDisable(unsigned long time){ _time_disable = time; _mref_disable = millis(); }
};
void MyTimer::update(){
if ((millis() - _time_disable > _mref_disable) && (_time_disable > 0)) { disable(); } //verifica se está configurado pra desabilitar por time
if (!_enable) { return; }
unsigned long s = 0;
for (int i=0; i<_quantidade;i++){
for (int j=0; j<_sequences[i].repeat; j++){
for (int k=0; k<_sequences[i].size; k++){
s += _sequences[i].times[k];
}
}
}
long adjustment = _mref % s;
long rest = (millis() + s - adjustment - _lag) % s;
_last_index_time = _index_time;
_last_index_sequence = _index_sequence;
boolean ind_break = false;
s = 0;
for (int i=0; i<_quantidade;i++){
for (int j=0; j<_sequences[i].repeat; j++){
for (int k=0; k<_sequences[i].size; k++) {
s += _sequences[i].times[k];
if (rest < s) {
_index_time = k;
_index_sequence = i;
ind_break = true;
break;
}
}
if (ind_break) { break; }
}
if (ind_break) { break; }
}
if ( isChanging() && _onChanging ) { (*_onChanging)( _index_sequence, _index_time ); }
}
/*********************************************************************************************************
************************************FIM CLASSE MYTIMER****************************************************
**********************************************************************************************************/
unsigned long seq01[] = {750};
unsigned long seq02[] = {60, 60};
unsigned long seq03[] = {200};
MyTimerSequence sequences[] = {
{ seq01, sizeof(seq01)/sizeof(unsigned long), 1},
{ seq02, sizeof(seq02)/sizeof(unsigned long), 10},
{ seq03, sizeof(seq03)/sizeof(unsigned long), 1},
{ seq02, sizeof(seq02)/sizeof(unsigned long), 6},
{ seq03, sizeof(seq03)/sizeof(unsigned long), 1},
{ seq02, sizeof(seq02)/sizeof(unsigned long), 3}
} ;
MyTimer t1(sequences, sizeof(sequences)/sizeof(MyTimerSequence), 0, 0); //tem um atraso de 100 milissegundos em relação a referencia 0
void setup() {
Serial.begin(9600);
pinMode(13, OUTPUT);
pinMode(5, OUTPUT);
t1.setOnChanging( onChanging_t1 );
t1.enable();
}
void loop() {
t1.update();
analogWrite(5, analogRead(A1)/4);
}
void onChanging_t1(int sequence, int index ) {
digitalWrite(13, LOW);
if (index == 0 && (sequence == 1 || sequence == 3 || sequence == 5)){ digitalWrite(13, HIGH); }
}
Via ISP (Arduino Uno e Mega)Pra quem pretende utilizar o Arduino Pro Mini com uma certa frequencia, ter que retirar o ATMega do conector do Arduino Uno é um trabalho que pode se tornar um pouco chato, além de ter algum dos Arduinos Uno que não tem como desconectar o ATmega. Nesses casos, o mais recomendado é utilizar o a gravação através de ISP. Pra isso é necessário seguir alguns passos. Vou listá-los e mais abaixo demonstro como realizar cada um dos passos:
Obs.: Esses mesmos passos podem ser seguidos utilizando um Arduino Mega.
- 1º Passo: Fazer o upload do Sketch "ArduinoISP" para o Arduino Uno (ou Mega).
- 2º Passo: Conectar os Cabos entre o Arduino Uno (ou Mega) e o Pro Mini.
- 3º Passo: Mudar a Placa para Arduino Pro ou Pro mini.
- 4º Passo: Mudar o Programador para "Arduino as ISP".
- 5º Passo: Fazer Uploado via Programador (Ctrl+Shift+U).
- 6º Passo: Voltar as configurações iniciais. (Esse passo é só para não ter problemas ao voltar a programar o arduino UNO posteriormente).
1º Passo: Fazer o upload do Sketch "ArduinoISP" para o Arduino Uno (ou Mega).
A Sketch ArduinoISP está na própria IDE do Arduino, bastando entrar no menu Arquivo, Exemplos e Abrir "ArduinoISP", conforme imagem abaixo:
Com o Arquivo aberto, faça o upload do arquivo para o Arduino Uno (ou Mega).
2º Passo: Conectar os Cabos entre o Arduino Uno (ou Mega) e o Pro Mini.
Esquema Com o Arduino Uno:
Pro mini | Arduino Uno
13 | 13
12 | 12
11 | 11
RST | 10
Vcc | 5V
Gnd | Gnd
Ligar um capacitor de 10uF no Reset do arduino Uno e no Gnd.
Esquema Com o Arduino Mega:
Pro mini | Arduino Mega
13 | 52
12 | 50
11 | 51
RST | 53
Vcc | 5V
Gnd | Gnd
3º Passo: Mudar a Placa para Arduino Pro ou Pro Mini.
Menu Ferramentas --> Placa --> Arduino Pro ou Pro Mini
Escolher o processador:
Menu Ferramentas --> Processador --> ATMega328 (5V, 16MHz)
4º Passo: Mudar o Programador para "Arduino as ISP"
Menu Ferrramentas --> Programador --> Arduino as ISP
5º Passo: Fazer Upload via Programador (Ctrl+Shift+U)
Nesse ponto aqui, por falta de atenção tive alguns problemas, pois tentei fazer o upload via comando tradicional, clicando no botão. Até que percebi que o Correto é enviar através de uma outra função, que fica no Menu Arquivo:
Com o Sketch que se deseja upar aberto
vá até o Menu Arquivo --> Carregar Usando Programador
Feito Isso, o Programa deve ser enviado para o Pro Mini.
6º Passo: Voltar as configurações iniciais.
Como esse procedimento exige muitas mudanças de configurações da IDE do Arduino, é recomendável que as configurações oginais sejam restauradas, para evitar da próxima vez que a IDE seja usada, não cause outros problemas, principalmente se for um computador utilizado por outros programadores. Deixe sempre do jeito que estava quando iniciou.




















