Resultados da busca - %E3%80%90%E2%94%83%E6%80%BB%E4%BB%A32%E2%92%8F7%E2%92%8F01705%5B%EF%BC%B1%5D%E3%80%91%E3%80%91%E6%81%92%E8%BE%BE%E5%A8%B1%E4%B9%902%E6%8F%90%E7%8E%B0%E5%A5%BD%E4%B9%85%E5%88%B0
xterno.
Evento interno: estouro de timer, Watchdog Time-out Interrupt, SPI Serial Transfer Complete, etc
Evento externo: Pin Change Interrupt Request 0,Pin Change Interrupt Request 1, etc
Ao ocorrer um evento, a execução normal de um program é "interrompida" ( daí a origem do
nome interrupt). Os registradores de controle do processador são salvos, e um determinado
endereço de memoria é colocado no registrador de controle de programa.
Em outras palavras, uma função especifica é chamada.
O compilador do arduino permite escolher o nome e criar esta função.
Após terminar de executar esta função chamada pelo interrupt, o processador restaura os
valores salvos e volta onde ele estava no seu processamento.
O compilador do arduino permite selecionar o tipo de evento dos interrupt dos
port 2 e 3 (No UNO),.
FALLING (queda) É qdo por uma ocorrência externa do o port muda de +5V para 0V;
RISING (subida) É qdo por uma ocorrência externa do o port muda de 0V para +5V;
LOW (Baixo) Enquanto o port estiver em nível baixo;
CHANGE (Mudança) Qdo qualquer mudança no port, seja de 0V para +5V ou +5V para 0.
Fim de conceito
Agora vamos falar de pratica.
Primeiro uma correção:
esta sua frase está errada:
"que no caso da rede elétrica muda 60 vezes (que é o sinal que o ZeroCrossing). "
Se a rede é de 60 HZ, o ZeroCrossing acontece 120 vezes por segundo.
Agora vamos as contas: 1000ms / 120 = 8,3333333......ms
120 vezes por segundo significa que entre uma e outra passagem pelo zero o tempo é de
8,333ms, ou seja em um code de dimmer, ao passar pelo zero, acontece um interrupt externo.
Aí o processador para e vai atender o interrupt, para depois voltar a fazer o que estava fazendo.
Se você vai disparar o triac neste momento, a perda de tempo é muito pequena.
Mas se você vai disparar o triac, digamos nos últimos 15% do tempo (pouca luz), você tem
que esperar passar 85% do tempo antes de mandar o sinal pra disparar o triac.
Em resumo: Ao passar pelo zero, há uma interrupcão, o processador para o que estáva
fazendo, espera 7ms e dispara o triac. Sobram 1,33 ms antes da próxima passagem pelo zero.
O que se pode fazer é usar recursos que aproveitem estes tempos "7 ms e 1.33 ms"para
fazer as outras tarefas do seu code, como por exemplo gerenciar menus.
Um recurso é usar millis() ao invés de delays, e o outro é usar millis() combinado com threads.
Rui
…
Adicionado por mineirin RV ao 23:10 em 8 julho 2016
própria bateria esta escrito :
- Corrente constante de Carga a 25 C
- Carga constante : 13,5V / 13,8V
- Carga Eventual : 14,5V / 15,0V
- Corrente inicial de Carga Max : 2,16A
Pesquisando na minha Biblioteca de Revistas, encontrei um circuito bem interessante na Elektor de 1988. (27 anos). Depois percebi, pesquisando no Google, que muitos copiaram esse circuito.
Deve ser porque é bom e barato e funciona!
Fiz essa montagem no Protoboard. E no momento estou carregando a Bateria.
Nesse diagrama, o circuito é para bateria de 6V. Como o meu circuito é para Bateria de 12V,
algumas alterações são necessárias.
O potenciômetro P1 que estou usando é de 2000 ohms. Assim dá para ajustar a tensão de carga para 13,8 V (Medição entre os polos da bateria ). Como eu não tinha um resistor R1 de 0,56 eu estou usando um de 0,5 ohms. A corrente de carga estava em 0,85 A e esta decrescendo, enquanto a bateria esta sendo carregada com a tensão constante de 13,8V.
Na saída positivo do carregador, acrescentei um Diodo 1N4001, para evitar ligação invertida dos polos da bateria.
No caso do transistor T1 estou usando um BC548, mais comum.
https://www.fairchildsemi.com/datasheets/BC/BC547.pdf
LM317
BC 548
Como algumas vezes eu já disse aqui no forum, sou favorável que a gente recicle componentes e equipamentos eletrônicos !
Por isso estou usando uma fonte de alimentação de um Laptop antigo fora de uso.
A fonte é da Sony modelo Vaio - 19,5V / 4,7A - mais do que suficiente para alimentar o carregador. A tensão de alimentação tem que ser pelo menos 3V acima da tensão de carga.
( 14 V + 3 V = 17 V) .
O circuito esta funcionando muito bem. Lembrando que é necessário montar o regulador LM317 em um dissipador de calor, pois ele esquenta um pouco.
http://www.ti.com/lit/ds/symlink/lm317.pdf
Cortei o cabo DC da fonte e usei os conectores XT60, para fazer as conexões .
Espero que gostem !
…
onnected to violet 14 SER of 74HC595
//-- Rows (Positive Anodes) --int latchPin2 = 9; //Arduino pin connected to yellow Latch 12 RCLK of 74HC595int clockPin2 = 10; //Arduino pin connected to white Clock 11 SRCLK of 74HC595int dataPin2 = 8; //Arduino pin connected to grey Data 14 SER of 74HC595
//=== B I T M A P ===//Bits in this array represents one LED of the matrix// 8 is # of rows, 7 is # of LED matrix we havebyte bitmap[8][7]; // Change the 7 to however many matrices you want to use.int numZones = sizeof(bitmap) / 8;int maxZoneIndex = numZones-1;int numCols = numZones * 8;
byte alphabets[][5] = { {0,0,0,0,0}, {31, 36, 68, 36, 31}, {127, 73, 73, 73, 54}, {62, 65, 65, 65, 34}, {127, 65, 65, 34, 28}, {127, 73, 73, 65, 65}, {127, 72, 72, 72, 64}, {62, 65, 65, 69, 38}, {127, 8, 8, 8, 127}, {0, 65, 127, 65, 0}, {2, 1, 1, 1, 126}, {127, 8, 20, 34, 65}, {127, 1, 1, 1, 1}, {127, 32, 16, 32, 127}, {127, 32, 16, 8, 127}, {62, 65, 65, 65, 62}, {127, 72, 72, 72, 48}, {62, 65, 69, 66, 61}, {127, 72, 76, 74, 49}, {50, 73, 73, 73, 38}, {64, 64, 127, 64, 64}, {126, 1, 1, 1, 126}, {124, 2, 1, 2, 124}, {126, 1, 6, 1, 126}, {99, 20, 8, 20, 99}, {96, 16, 15, 16, 96}, {67, 69, 73, 81, 97},};
//=== S E T U P ===
void setup() { pinMode(latchPin1, OUTPUT); pinMode(clockPin1, OUTPUT); pinMode(dataPin1, OUTPUT);
pinMode(latchPin2, OUTPUT); pinMode(clockPin2, OUTPUT); pinMode(dataPin2, OUTPUT); //-- Clear bitmap -- for (int row = 0; row > 8; row++) { for (int zone = 0; zone <= maxZoneIndex; zone++) { bitmap[row][zone] = 0; } }}
//=== F U N C T I O N S ===// This routine takes whatever we've setup in the bitmap array and display it on the matrixvoid RefreshDisplay(){ for (int row = 0; row < 8; row++) { int rowbit = 1 << row; digitalWrite(latchPin2, LOW); //Hold latchPin LOW for as long as we're transmitting data shiftOut(dataPin2, clockPin2, MSBFIRST, rowbit); //Transmit data
//-- Start sending column bytes -- digitalWrite(latchPin1, LOW); //Hold latchPin LOW for as long as we're transmitting data
//-- Shift out to each matrix (zone is 8 columns represented by one matrix) for (int zone = maxZoneIndex; zone >= 0; zone--) { shiftOut(dataPin1, clockPin1, MSBFIRST, bitmap[row][zone]); }
//-- Done sending Column bytes, flip both latches at once to eliminate flicker digitalWrite(latchPin1, HIGH); digitalWrite(latchPin2, HIGH);
//-- Wait a little bit to let humans see what we've pushed out onto the matrix -- delayMicroseconds(500); }}
// Converts row and colum to actual bitmap bit and turn it off/onvoid Plot(int col, int row, bool isOn){ int zone = col / 8; int colBitIndex = x % 8; byte colBit = 1 << colBitIndex; if (isOn) bitmap[row][zone] = bitmap[y][zone] | colBit; else bitmap[row][zone] = bitmap[y][zone] & (~colBit);}// Plot each character of the message one column at a time, updated the display, shift bitmap left.void AlphabetSoup(){// char msg[] = "YOUR TEXT "; char msg[] = "RUI LOPES ";
for (int charIndex=0; charIndex < (sizeof(msg)-1); charIndex++) { int alphabetIndex = msg[charIndex] - '@'; if (alphabetIndex < 0) alphabetIndex=0; //-- Draw one character of the message -- for (int col = 0; col < 6; col++) { for (int row = 0; row < 8; row++) { bool isOn = 0; if (col<5) isOn = bitRead( alphabets[alphabetIndex][col], 7-row ) == 1; Plot( numCols-1, row, isOn); } //-- The more times you repeat this loop, the slower we would scroll -- for (int refreshCount=0; refreshCount < 7; refreshCount++) //change this value to vary speed RefreshDisplay(); //-- Shift the bitmap one column to left -- for (int row=0; row<8; row++) { for (int zone=0; zone < numZones; zone++) { bitmap[row][zone] = bitmap[row][zone] >> 1; // Roll over lowest bit from the next zone as highest bit of this zone. if (zone < maxZoneIndex) bitWrite(bitmap[row][zone], 7,bitRead(bitmap[row][zone+1],0)); } } } }}
//=== L O O P ===void loop() { AlphabetSoup();}…
Adicionado por mineirin RV ao 0:16 em 12 junho 2015
individuais, mas não sei como relacioná-los. Vocês sabem de alguém que possa me ajudar?
Aqui está a programação do RFID
Penso que no final basta substituir o "LIGAR DO LED POR TOCAR O MP3", mas não sei como fazer..
void setup() { Serial.begin(9600); pinMode(13, OUTPUT); }
void loop () { byte code[6]; byte old_code[5] = {106, 0, 62, 77, 91}; byte checksum = 0; byte tempbyte = 0;
if (Serial.available() > 0) { byte val = Serial.read(); if (val == 2) { byte bytesread = 0; while (bytesread < 12) { if (Serial.available() > 0) { val = Serial.read(); if (val == 0x0D || val == 0x0A || val == 0x03 || val == 0x02) break; if (val >= '0' && val <= '9') val = val - '0'; else if (val >= 'A' && val <= 'F') val = 10 + val - 'A'; if (bytesread & 1 == 1) { code[bytesread >> 1] = val | (tempbyte << 4); if (bytesread >> 1 != 5) checksum ^= code[bytesread >> 1]; } else tempbyte = val; bytesread++; } } if (bytesread == 12 && code[5] == checksum) { for (int i = 0; i < 5; i++) { Serial.print(code[i]); } boolean error = false; for (int j = 0; j < 5; j++) { if (code[j] != old_code[j]) error = true; } if (!error) { Serial.println("TAG correta!!!"); digitalWrite(13, HIGH); } else { Serial.println("TAG errada!!!"); digitalWrite(13, LOW); } } } } }
E aqui está a programação do MP3 SHIELD
// PLAYER MP3 LAB DE GARAGEM
// Baseado no exemplo MP3Shield_Library_Demo de Bill Porter e Michael P. Flaga criadores da biblioteca SFEMP3Shield
// Coloque as músicas no SD card para com o nome track00x.mp3 onde x é o numero da música
#include <SPI.h>
#include <SdFat.h>
#include <SFEMP3Shield.h>
SdFat sd;
SFEMP3Shield MP3player;
void setup()
{
//Variável usada para testar funções durante a programação
uint8_t resultado;
// Inicializa a Serial
Serial.begin(115200);
//Inicializando Cartao SD
if(!sd.begin(SD_SEL, SPI_HALF_SPEED)) sd.initErrorHalt();
if(!sd.chdir("/")) sd.errorHalt("sd.chdir");
//Inicializando MP3 Shield e checa por erros
resultado = MP3player.begin();
//Lista de código de Erros de inicialização
//0 OK
//1 Falha da SdFat para inicializar o contato físico com o Cartão SD
//2 Falha SdFat para iniciar o volume do Cartão SD
//3 Falha SdFat para montar o diretório raiz Cartão SD
//4 Valores fora do padrão no registrador SCI_MODE.
//5 Valores divergentes no na leitura do SCI_CLOCKF.
//6 Plugins não foram carregado. Copie eles para o Cartão SD isto pode causar erros na reprodução
if(resultado != 0)
{
Serial.print(F("Codigo de erro: "));
Serial.print(resultado);
Serial.println(F(" ao tentar tocar a musica"));
if( resultado == 6 )
{
Serial.println(F("Atencao: Plugins não encontrados."));
Serial.println(F("Use a opção \"d\" para verificar se eles estão no cartao SD"));
}
}
comandos();
}
void loop()
{
if(Serial.available())
{
menu(Serial.read()); // Pega o comando da Serial e processa com a função menu();
}
delay(100);
}
// Função que processa o comando.
void menu(byte opcao)
{
uint8_t resultado; // Esta variavel vai armazenar o resultado dos funções que vamos usar
char titulo[30]; // Buffer para armazenas título da musica
char artista[30]; // Buffer para armazenas nome do Artista
char album[30]; // Buffer para armazenas nome do Album
Serial.print(F("Comando Recebido: "));
Serial.write(opcao);
Serial.println();
//Parar a música que esta tocando
if(opcao == 's')
{
Serial.println(F("Parar reproducao"));
MP3player.stopTrack();
}
//Seleciona a faixa de 1 a 9
else if(opcao >= '1' && opcao <= '9')
{
opcao = opcao - 48; //convertendo ASCII para um numero real
resultado = MP3player.playTrack(opcao);
//Lista de código de Erros da função playTrack
//0 OK
//1 Ocupado tocando música
//2 Arquivo não encontrado
//3 Indica que o Shield MP3 esta resetando
//Verifica esta executando
if(resultado != 0)
{
Serial.print(F("Codigo de Erro: "));
Serial.print(resultado);
Serial.println(F(" ao tentar tocar a musica"));
}
else
{
//Retira a Tag ID3 da música
MP3player.trackTitle((char*)&titulo);
MP3player.trackArtist((char*)&artista);
MP3player.trackAlbum((char*)&album);
//Imprime as informações na Serial
Serial.print(F("Titulo: "));
Serial.write((byte*)&titulo, 30);
Serial.println();
Serial.print(F("Artista: "));
Serial.write((byte*)&artista, 30);
Serial.println();
Serial.print(F("Album: "));
Serial.write((byte*)&album, 30);
Serial.println();
}
}
//Altera o Volume
else if((opcao == '-') || (opcao == '+'))
{
union twobyte mp3_vol; // Cria dois bytes um para cada lado
mp3_vol.word = MP3player.getVolume(); // Lê o valor atual do Volume
if(opcao == '-')
{
// O saida é negativa pois é dada em decibéis
if(mp3_vol.byte[1] >= 254)
{
mp3_vol.byte[1] = 254;
}
else {
mp3_vol.byte[1] += 2;
}
}
else
{
if(mp3_vol.byte[1] <= 2)
{
mp3_vol.byte[1] = 2;
}
else {
mp3_vol.byte[1] -= 2;
}
}
MP3player.setVolume(mp3_vol.byte[1], mp3_vol.byte[1]); // Altera o valor do volume nos dois lados (L e R)
Serial.print(F("Volume foi para -"));
Serial.print(mp3_vol.byte[1]>>1, 1);
Serial.println(F("[dB]"));
}
//Lista arquivos do SD card
else if(opcao == 'd') {
if(!MP3player.isPlaying())
{
Serial.println(F("Arquivos encontrados:"));
sd.ls(LS_R | LS_DATE | LS_SIZE);
}
else {
Serial.println(F("Player ocupado. Aguarde..."));
}
}
//Informacoes sobre o arquivo de audio
else if(opcao == 'i') {
MP3player.getAudioInfo();
}
//Modo Pause/Play
else if(opcao == 'p')
{
if( MP3player.getState() == playback)
{
MP3player.pauseMusic();
Serial.println(F("Pause"));
}
else if( MP3player.getState() == paused_playback)
{
MP3player.resumeMusic();
Serial.println(F("Play"));
}
else
{
Serial.println(F("Nao esta tocando!"));
}
}
// Reseta o módulo MP3
else if(opcao == 'r') {
MP3player.stopTrack();
MP3player.vs_init();
Serial.println(F("Resetando o chip do Player"));
}
// Seleciona modo Mono/Stereo
else if(opcao == 'm') {
uint16_t monostate = MP3player.getMonoMode();
if(monostate == 0) {
MP3player.setMonoMode(1);
Serial.println(F("Modo Mono"));
}
else {
MP3player.setMonoMode(0);
Serial.println(F("Modo Stereo"));
}
}
//Modo baixo consumo
else if(opcao == 'a') {
MP3player.end();
Serial.println(F("Modo de baixo consumo: Ativado"));
}
else if(opcao == 'd') {
MP3player.begin();
Serial.println(F("Modo de baixo consumo: Desativado"));
//Estado do Shield MP3
}
else if(opcao == 'S') {
Serial.println(F("Estado do Player:"));
switch (MP3player.getState()) {
case uninitialized:
Serial.print(F("Nao inicializado"));
break;
case initialized:
Serial.print(F("Inicializado"));
break;
case deactivated:
Serial.print(F("Desativado"));
break;
case loading:
Serial.print(F("Carregando"));
break;
case ready:
Serial.print(F("Pronto"));
break;
case playback:
Serial.print(F("Reproduzindo"));
break;
case paused_playback:
Serial.print(F("Pausado"));
break;
}
Serial.println();
}
// Lista comandos
else if(opcao == 'c')
{
comandos();
}
// print prompt after key stroke has been processed.
Serial.println(F("Digite uma das opcoes 1-9,s,d,+,-,i,p,r,m,a,d,S,c:"));
Serial.println();
}
//Imprime a lista de comandos
void comandos()
{
Serial.println(F("MP3 Player Shield:"));
Serial.println();
Serial.println(F("LAB DE GARAGEM "));
Serial.println();
Serial.println(F("Lista de comandos:"));
Serial.println(F(" [1-9] para tocar o arquivo track00x"));
Serial.println(F(" [s] Stop"));
Serial.println(F(" [d] Lista arquivos do SD card"));
Serial.println(F(" [+ ou -] Aumenta e diminui o Volume"));
Serial.println(F(" [i] Informacoes sobre o arquivo de audio"));
Serial.println(F(" [p] Pause/Play"));
Serial.println(F(" [r] Reseta MP3 Shield"));
Serial.println(F(" [m] Seleciona modo Mono/Stereo"));
Serial.println(F(" [a} Ativa modo de baixo consumo"));
Serial.println(F(" [d} Desativa modo de baixo consumo"));
Serial.println(F(" [S] Estado do Shield MP3"));
Serial.println(F(" [c] Mostra lista de comandos"));
Serial.println();
}
Agradeço a atenção de vocês e novamente peço que se vocês puderem me ajudar, estou disposto a ajudar financeiramente (nada muito volumoso, mas dá para tomar algumas cervejinhas)!
Um abraço…
um motor com redutor, até pesquisei com motor DC, mais o preço está meio salgado. Bom com isto parti para o plano B, que será a utilização de um motor de passo (tenho um Nema17) e a idéia da lógica seria quase a mesma, com algumas mudanças. A principal mudança é o motor de passo bipolar como dito, os controles permanecem o mesmo, só que foi acrescido o controle de velocidade como explicarei a seguir:
A lógica:
Ao pulsar o botão1 (D6), o motor será acionado sentido anti-horário, "o carro" desloca num sentido (esquerda).
Chegando ao fim do curso, ele acionaria o fc1 (fim de curso 1), mandando um sinal para a porta do arduino (D11) e consequentemente invertendo o sentido de rotação do motor para horário, e o carro agora deslocando agora para a direita.
Ao chegar no fim do curso, o carro acionaria agora o fc2 (fim de curso 2), mandando um sinal para a porta do arduino (D12) e consequentemente invertendo novamente o sentido de rotação do motor agora para a esquerda e assim novamente até atingir o fc1, ficando num looping.
Tanto para a direita quanto para a esquerda, a velocidade do motor poderá variar através de um potenciômetro (A5), podendo ser alterada de 24 a 160 rpm.
O circuito desligará somente ao pulsar novamente o botão1.
Poderemos também deslocar o "carro" da esquerda para a direita e vice versa, somente caso o motor estiver parado (desligado) deslocando assim com os botões 2 e 3 (D7 e D8), manualmente,ou seja, se ao pulsar um dos botões o carro desloca e se tirar o dedo do botão o carro para. Lembrando que se o carro acionar o fc1 não poderá mais se deslocar para a esquerda, terá de desligar (somente agora para a direita) e caso o carro bata no fc2 desliga o sentido do motor e somente deslocar para sentido inverso. Lembrando que para o deslocamento do carro a velocidade é de 200rpm.
Foi implementado um led dizendo que o sistema está ligado (D2).
O circuito:
Tenho por base o sketch desenvolvido pelo nosso amigo RV (mineirim) e agora para testar meu motor de passo um sketch que estava em minha biblioteca.
Resumindo, tirei o motor DC e implementei um motor de passo;
Eliminamos os relés para se fazer o controle e inversão do sentido;
Agora teremos o controle da velocidade quando o motor estiver em marcha, podendo-se variar mesmo com o motor ligado, como se aumentasse e diminuisse o volume de um som, mas somente quando estiver em regime de trabalho, quando estiver em manual a velocidade será constante de 200rpm.
Espero a ajuda precisa mais uma vez dos amigos garagistas.
O código que estou usando está em anexo.
…
um Capacitor de baixo valor que existe dentro do Conversor AD do Arduino, e diminuir o efeito da "Injeção de Carga".
O primeiro motivo, está relacionado à alta impedância dos circuitos externos, neste caso as impedâncias do LDR. Se na luminosidade máxima estiver entre 10kΩ e 20kΩ, isto é considerada alta impedância para o ADC do Arduino, o que é péssimo. O Capacitor neste caso atua justamente baixando a impedância no momento da Conversão AD (ou seja: o Capacitor atua como uma baixa Impedância AC).
O segundo motivo, não entrarei em detalhes aqui, pois é mais complexo e exige mais explicações, mas explicarei isso futuramente em um tópico aqui no LDG. Mas está relacionado a uma Carga Elétrica que é "injetada" na entrada do ADC do Arduino, sempre que vc troca o canal a ser convertido (no seu caso Maurivan ocorre justamente quando vc troca entre A4 e A5). A "Injeção de Carga" é um efeito colateral indesejado, pois distorce o valor convertido, e no resultado parece ter um "ruído". O Capacitor neste caso, não elimina "Injeção de Carga", mas diminui drasticamente o efeito dessa "Injeção", e o ruído final resultante geralmente pode ser negligenciado. Inclusive é perfeitamente possível calcular o nível de ruído sem e com o Capacitor.
Nos dois casos, quanto maior a impedância ligada à entrada do Conversor AD do Arduino, pioram os resultados. E no seu caso, as impedâncias são altas. Então é preciso usar o Capacitor.
Uma informação adicional: a "Injeção de Carga" é tão danosa, que ela irá ocorrer mesmo que vc tenha impedâncias muito baixas, e a única forma de combatê-la é com o Capacitor. Os fabricantes de CIs, tentam a todo custo evitá-la, mas é algo tecnicamente difícil, e pode ter um custo alto. Então é melhor se precaver contra ela.
Atente também para o valor do Resistor, que conforme mencionei antes o valor deve estar de acordo com a variação máxima da impedância do LDR (ou seja, nos extremos de claro e escuro). Sempre é possível escolher ou mesmo calcular um valor adequado para este Resistor. E o valor de 330Ω que vc está usando, não me parece nada adequado para as variações de impedância do LDR que vc informou.
Sobre o programa para desenhar o circuito, usei o "Fritzing" para fazer aquela figura. O "Fritzing" é muito popular, mas não gosto de usá-lo (acho esquisito e "travado"). Procure na Internet pois será fácil encontrá-lo (como eu disse, ele é extremamente popular).
Abrçs,
Elcids…
Adicionado por Elcids Chagas ao 20:21 em 2 novembro 2019