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.
Olá possuo um Arduino Uno em que o Atmega é soldado na placa, quais mudanças devo fazer para consegui upar codigos para o Pro Mini
ResponderExcluirsegui o passo a passo mas num adiantou não! usava um conversor usb ttl mas do nada ele parece que parou de comunicar, quando vi esse post achei que iria resolver o problema mas pelo geito tbm não! se alguem conseguir favor postar, desde já agradeço
ResponderExcluirAqui la solución amigos,funcionó correctamente. Probé de muchas otras formas y esta me funcionó ok. https://frechako.blogspot.com/2016/12/programar-arduino-pro-mini-con-arduino.html
Excluir