-
Posts
2.891 -
Cadastrado em
-
Última visita
Tipo de conteúdo
Artigos
Selos
Livros
Cursos
Análises
Fórum
Tudo que MatheusLPS postou
-
Projeto organizador fila único com: PIC + PC + Controles RF
MatheusLPS respondeu ao tópico de robertnem em Microcontroladores
Os controles já estão prontos ou você irá fazer do Zero também? Pois se os controles já estiverem pontos, será um pouco mais difícil pois terá q decifrar o protocolo de envio do mesmo. Caso você decida fazer os controles também, pode faezr do seu jeito o protocolo. Mas esse projeto não é estão simples de fazer nao. É bem interessante até. Qual a linguagem de programação usada? Falou -
Transformar um PIC em um HT12E e HT12D
MatheusLPS respondeu ao tópico de pauleiras em Microcontroladores
Veja se ajuda: Acionar rele a distancia com PIC e RF 433mhz Falou -
Controlando motor de passo com potenciometro
MatheusLPS respondeu ao tópico de Evertton Laddaga em Microcontroladores
uhauhauhauha pois é, quando comecei a estudar programação na faculdade, os dois professores começaram pelo Pascal e sempre diziam vetor isso, vetor aquilo. Eu sempre associei também com força. Lá da física. Custei associar com matriz. Mas aí lendo aqui e ali cheguei ao seguinte: "Vetores nada mais são que matrizes unidimensionais." Vem assim é um monte de apostila que li. Sua ideia é interessante com relação à aceleração. Pois percebi que se o potenciômetro tem um giro rápido, pode demorar para chegar até o ponto desejado. Então, você deve saber que o canal AD no modo 10 bits vai de 0 a 1023. Certo? Considerei um motor de passo de 1.8º por passo, ou seja, o mesmo precisa dar 200 passos para dar uma volta completa. Como escolhi criar 1 vetor de 4 posições (cada posição 1 passo), pois o motor tem 4 bobinas, percebi que o meu programa teria q chamar a rotina de "passos" umas 50 vezes para dar 1 giro completo. Ora, 50 x4 = 200. Sendo esse o número necessário para dar 1 volta. Dessa forma, montei uma equação que relaciona o valor do AD com a quantidade de passos necessários (num total de 50, variávei J no código). Veja como fiz a equação: Fui no excel e o mesmo traçou o gráfico com a equação. Imagine que seu potenciômetro está em fim de curso e o canal AD lê 0. OK. Aí você gira o potenciometro até uns 60% do giro dele. O AD vai lá e lê 700. Ora, meu AD inicial era 0, agora é 700. Então minha diferença é de 700. Indo até o gráfico, vemos que se olharmos o eixo X, vamos ver que o número 700 se encontra mais ou menos relacionado como número 30 no eixo Y. Conclui-se que o motor terá que girar 30 * 4 = 120 vezes para chegar no lugar onde queremos. Sendo o número 30 repassado a nossa variável J e o número 4 é o nosso vetor de 4 posições. Isso funciona se fosse ao contrário também. Veja que não montei o circuito. Tenho uns 8 motores de passo aqui e posso ver isso depois. Apesar que meu tempo está meio corrido. Falou -
Controlando motor de passo com potenciometro
MatheusLPS respondeu ao tópico de Evertton Laddaga em Microcontroladores
Bom fiz um exemplo aqui. Sério que me deu mais trabalho que podia imaginar. Demorei um bocado. Não foi tão simples como imaginei. Bom, na simulação está funcionando. O código ficou meio bagunçado. Pois eu testava de uma forma, depois de outra...... Circuito: Código: Tenta compreender ele. Caso tenha dúvidas, vou tirando. Veja que essa forma não é a única que pode ser feita. Para falar a verdade não gostei muito. Mas funciona. #include <16F877A.h> #device adc=10 #FUSES NOWDT //No Watch Dog Timer #FUSES XT //Crystal osc <= 4mhz #FUSES PUT //Power Up Timer #FUSES NOPROTECT //Code not protected from reading #FUSES NODEBUG //No Debug mode for ICD #FUSES BROWNOUT //Reset when brownout detected #FUSES NOLVP //No low voltage prgming, B3(PIC16) or B5(PIC18) used for I/O #FUSES NOCPD //No EE protection #use delay(clock=4000000) #include <LCD.C> #define frame_time 75 //Velocidade do motor int8 i = 3, i_1 = 0,j; int16 ad_antigo, ad_atual; int8 y; int8 inicio = 1; signed int16 distancia; char sentido_motor[4]= { 0b0001, //PASSO1 0b0010, //PASSO2 0b0100, //PASSO3 0b1000, //PASSO4 }; void main () { lcd_init(); delay_ms (100); SETUP_ADC_PORTS(AN0); SETUP_ADC(ADC_CLOCK_DIV_8); set_adc_channel(0); delay_us (20); while(true) { ad_atual = read_adc(); if (inicio) { ad_antigo = ad_atual; inicio = 0; } distancia = ad_atual - ad_antigo; printf(lcd_putc,"\fnow:%lu d:%ld\nold:%lu",ad_atual,distancia, ad_antigo); if (distancia != 0) { if (distancia > 0) { y = 0.195 * distancia; for (j=0;j<y;j++) { output_b(sentido_motor[i_1]); i_1++; if (i_1 > 3) { i_1 = 0; } delay_ms(frame_time); } } else if (distancia < 0) { y = 0.195 * distancia * -1; for (j=0;j<y;j++) { output_b(sentido_motor[i]); i--; if (i == 255) { i = 3; } delay_ms(frame_time); } } } ad_antigo = ad_atual; delay_ms (200); } } Falou -
Controlando motor de passo com potenciometro
MatheusLPS respondeu ao tópico de Evertton Laddaga em Microcontroladores
Estou no estágio. Mais tarde posto um exemplo para você poder estudar. Vou postar circuito, simulação e código. Falou -
Controlando motor de passo com potenciometro
MatheusLPS respondeu ao tópico de Evertton Laddaga em Microcontroladores
Bom, é um projeto interessante. Veja que com o motor segue o giro do potenciômetro. Vamos supor o seguinte cenário: +5V | | |-----AN0 | | 0V Temos duas divisões, 2,5V para cima e 2,5V para baixo. Em um primeiro momento, pensei o seguinte: No código, ficamos lendo o canal AD o tempo todo. Se a leitura atual for maior que a anterior, o motor gira no sentido do relógio. Se a leitura atual for menor que a anterior, o motor gira para no sentido anti-relógio. Como é um motor de passo, podemos dimensionar o tamanho do giro no código com a quantidade de passos. Eu criaria dois vetores de 4 posições com os valores dos passos. Em um motor de passo de 5 fios, sendo 1 fio o VCC, me resta 4 fios de passos. Um vetor seria o sentido do giro do relógio e o outro vetor seria no sentido anti-relógio. Cada vez q eu ler o canal AD e verificar uma variação na leitura para mais ou para menos, chamaria uma rotina para "dar 1 passo" ou "2 passos" ou "quantos passos eu quiser". Seria algo mais ou menos do tipo. Falou -
Controlando motor de passo com potenciometro
MatheusLPS respondeu ao tópico de Evertton Laddaga em Microcontroladores
Sabe programar? Tem conhecimento em microcontroladores? Você quer o projeto pronto ou já tem alguma ideia.... Falou -
Medidor de duty cycle e frequência com pic 16f877a
MatheusLPS respondeu ao tópico de pit.du em Microcontroladores
Mais de 1 ano que fiz esse código..... Mas já lembrei o raciocínio. Veja: -----|____________|-----|____________|-----|____________|-----| --> Sinal PWM ON OFF ^ ON ^ OFF ^ ON OFF ON | | | | | | | T_descida_1 | T_subida_1 T_subida_2 Veja acima um esboço de um sinal PWM. Nele nos temos o tempo ON (tracejado) e o OFF (underline). Certo? O período é a soma do tempo ON + tempo OFF. Lá no meu programa, meu TIMER1 corre com o relógio interno (INTERNAL), dessa forma irá me retornar o tempo em uS (microsegundos). Criei uma interrupção onde a mesma, logo no início, espera por uma subida de nível, ou seja, de 0V para 5V. Quando isso ocorre a seguinte linha é executada: T_subida_1=CCP_1; A variável acima pega o valor do CCP_1 que depende do TIMER1. Logo em seguida o programa é reconfigurado para esperar uma descida de nível, ou seja, de 5V para 0V. Nesse momento, o tempo é armazenado novamente pela linha: T_descida_1=CCP_1; Ora, se pegarmos o tempo de subida e o tempo de descida e subtraírmos os dois, teremos o tempo ON. O código faz isso no loop infinito, de acordo com a linha: T_ON=(T_descida_1-T_subida_1); Depois de pegar a borda de descida, o código espera novamente por uma borda de subida. O mesmo é pego com essa linha: T_subida_2=CCP_1; Dessa forma, olhando o desenho acima é possível verificar que pegamos: Tempo de subida; Tempo de descida; Tempo de subida novamente. Agora vem a matemática: T_ON=(T_descida_1-T_subida_1); --> Calculamos o tempo ON. T_total = (T_subida_2-T_subida_1); --> Calculamos o tempo Total ou chamado também de período. AP = (float)T_total/3.0; --> Dividimos por 3 pois o PIC está com clock de 12Mhz e o clock "padrão" é 4Mhz. Digo padrão, pois em 4Mhz cada incremento do TIMER1 é de 1 uS. freq=(float)1/(AP)*1000000; --> Ora, frequência é o inverso do tempo, certo? Então estou fazendo o inverso da variável AP para obter a frequência. MAS AP é em uS (micro segundos). Dessa forma, multiplico por 1000000 (1 milhao) para transformar os uS em segundos. d = (float)T_ON*100/T_total; --> O que é o duty cicle? É a fração do T_ON por T_total. No final multiplico por 100 para que tenho em porcentagem. Veja que esse código trabalha com muitas variáveis do tipo float, faz muitas divisões e multiplicações. Isso deixa o código "lento". Fiz dessa forma de propósito para ser um código didático. Numa aplicação real, você pode juntar todas as contas e ir simplificando para no final dar somente 1 multiplicação ou divisão. E pode também evitar os float, trabalhando somente com ints e deixando para dividir somente no final. Isso deixará o código mais rápido. Claro que se a função do PIC for somente calcular frequencia e duty cicle, ele fará isso com os pés e mãos nas costas. Dúvidas? Pergunte. Falou -
Problemas com display LCD (WH1602A)
MatheusLPS respondeu ao tópico de Bobelicious em Microcontroladores
Bobelicious, está usando o potenciometro de 10k no pino de contraste do LCD? Falou -
Poste o circuito montado. Sua fonte está bem estabilizada? Como está tocando o buzzer? Direto com o PIC? Tente no lugar do Buzzer, um LED com resistor. Falou
-
Com o seu trafo, não será possível extrair 1.2A. O mesmo só dispões ee 600mA na saída. Solução: Arrume outro trafo. Falou
-
Já vi em posts do Faller que os 10% é uma medida que ele toma para uso próprio. Provavelmente de tantas fontes já montadas acabou chegando a esse valor. Falou
-
Bom, essa fonte que você deseja já tem pronta: http://produto.mercadolivre.com.br/MLB-431216466-fonte-9v-2a-1a-cftv-p-cmeras-cabo-p4-bivolt-modem-_JM Veja que a foto do anúncio é de uma fonte de 12V por 2A e no seu caso, não serveria. Fiz uma pergunta ao vendedor questionando essa incoerência. Mas se você realmente deseja construir essa fonte, para aprendizado ou hobby mesmo, ajudaremos. Primeiro você precisa realizar o procedimento descrito pelo Faller: Pega seu transformador, liga em 110V (caso o mesmo seja para 110V), coloque uma resistência de chuveiro no secundário e meça a tensão na saída. Sem a resistência você já mediu e disse que é 14.5V. Com a ajuda de uma garrinha jacaré, vá diminuindo a pegada da resistência para aumentar o consumo de corrente e ccontinue medindo a tensão de saída. Quando a mesma baixar 10%, ou seja, cair para 13.05V, quer dizer que seu transformador está no limite. Vamos supor que você mediu 1.2A depois dos 10% de queda. Grande chance do transformador ser de 1A. Falou
-
Bem, depois de você realizar o experimento que o colega Faller te indicou para saber a máxima corrente do seu transformador, você precisa dizer qual seria a tensão e corrente da fonte original. Dessa forma poderemos te indicar uma solução mais completa. Falou
-
Problemas com Potenciometros e Amperagens.
MatheusLPS respondeu ao tópico de Giovanny dos Santos em Eletrônica
O faller, mas porq se eu uso a carga entre emissor e terra o potenciômetro não torra e se eu colocar entre VCC e coletor ele torra? Normalmente vejo cargas sendo colocadas entre VCC e coletor, por isso minha dúvida nesse aspecto. Falou -
Primeiramente desculpe demora na resposta. Estava de viagem. O código do DS1307.C está lá no outro tópico. Mas reposto para você: /// DS1307.C /// /// Driver for Real Time Clock /// /// /// /// ds1307_init() - Enable oscillator without clearing the seconds register -/// /// used when PIC loses power and DS1307 run from 3V BAT /// /// - Disable squarewave output /// /// /// /// ds1307_set_date_time(day,mth,year,dow,hour,mim,sec) Set the date/time /// /// /// /// ds1307_get_date(day,mth,year,dow) Get the date /// /// /// /// ds1307_get_time(hr,mim,sec) Get the time /// /// /// //////////////////////////////////////////////////////////////////////////////// #define RTC_SDA PIN_C4 #define RTC_SCL PIN_C3 #use i2c(master, sda=RTC_SDA, scl=RTC_SCL) #use i2c(sda=PIN_C4, scl=PIN_C3, stream=I2C_HW) BYTE bin2bcd(BYTE binary_value); BYTE bcd2bin(BYTE bcd_value); void ds1307_init(void) { BYTE seconds = 0; i2c_start(); i2c_write(0xD0); // WR to RTC i2c_write(0x00); // REG 0 i2c_start(); i2c_write(0xD1); // RD from RTC seconds = bcd2bin(i2c_read(0)); // Read current "seconds" in DS1307 i2c_stop(); seconds &= 0x7F; delay_us(3); i2c_start(); i2c_write(0xD0); // WR to RTC i2c_write(0x00); // REG 0 i2c_write(bin2bcd(seconds)); // Start oscillator with current "seconds value i2c_start(); i2c_write(0xD0); // WR to RTC i2c_write(0x07); // Control Register i2c_write(0x10); // Disable squarewave output pin i2c_stop(); } void ds1307_set_date_time(BYTE day, BYTE mth, BYTE year, BYTE dow, BYTE hr, BYTE mim, BYTE sec) { sec &= 0x7F; hr &= 0x3F; i2c_start(); i2c_write(0xD0); // I2C write address i2c_write(0x00); // Start at REG 0 - Seconds i2c_write(bin2bcd(sec)); // REG 0 i2c_write(bin2bcd(mim)); // REG 1 i2c_write(bin2bcd(hr)); // REG 2 i2c_write(bin2bcd(dow)); // REG 3 i2c_write(bin2bcd(day)); // REG 4 i2c_write(bin2bcd(mth)); // REG 5 i2c_write(bin2bcd(year)); // REG 6 i2c_write(0x10); // REG 7 - Disable squarewave output pin i2c_stop(); } void ds1307_get_date(BYTE &day, BYTE &mth, BYTE &year, BYTE &dow) { i2c_start(); i2c_write(0xD0); i2c_write(0x03); // Start at REG 3 - Day of week i2c_start(); i2c_write(0xD1); dow = bcd2bin(i2c_read() & 0x7f); // REG 3 day = bcd2bin(i2c_read() & 0x3f); // REG 4 mth = bcd2bin(i2c_read() & 0x1f); // REG 5 year = bcd2bin(i2c_read(0)); // REG 6 i2c_stop(); } void ds1307_get_time(BYTE &hr, BYTE &mim, BYTE &sec) { i2c_start(); i2c_write(0xD0); i2c_write(0x00); // Start at REG 0 - Seconds i2c_start(); i2c_write(0xD1); sec = bcd2bin(i2c_read() & 0x7f); mim = bcd2bin(i2c_read() & 0x7f); hr = bcd2bin(i2c_read() & 0x3f); i2c_stop(); } BYTE bin2bcd(BYTE binary_value) { BYTE temp; BYTE retval; temp = binary_value; retval = 0; while(1) { // Get the tens digit by doing multiple subtraction // of 10 from the binary value. if(temp >= 10) { temp -= 10; retval += 0x10; } else // Get the ones digit by adding the remainder. { retval += temp; break; } } return(retval); } // Input range - 00 to 99. BYTE bcd2bin(BYTE bcd_value) { BYTE temp; temp = bcd_value; // Shifting upper digit right by 1 is same as multiplying by 8. temp >>= 1; // Isolate the bits for the upper digit. temp &= 0x78; // Now return: (Tens * 8) + (Tens * 2) + Ones return(temp + (temp >> 2) + (bcd_value & 0x0f)); } //////////////////////////////////////////////////////////////////////////////// Para mudar para o 18F2550, apenas mude a primeira linha do código. Está para o 16F877A. Coloque 18F2550. Veja que os pinos do 18F2550 são diferentes. Apenas mude de acordo com os que você tem sobrando. EDIT: Tenho o costume de entrar no fórum e abrir todas as postagens não lidas de uma vez. São muitas abas ao mesmo tempo! . Acaba que levo umas 2 horas para ler todas.. aí não vi sua última acima. Acabei de ver sua postagem acima. Vou dar uma olhada no código que você postou. Falou
-
Veja: Relogio com ds1307, termometro com lm35, display lcd, e pic 16f877a Falou
-
Gerador de Pusos com Pic Utilizando Timer1
MatheusLPS respondeu ao tópico de Rodrigo Xsara em Microcontroladores
Veja se é esse o resultado que espera: /*===================== Inicialização do PIC =======================*/ #include <16F877A.h> #FUSES NOWDT //No Watch Dog Timer #FUSES HS //Crystal osc > 4mhz #FUSES PUT //Power Up Timer #FUSES NOPROTECT //Code not protected from reading #FUSES NODEBUG //No Debug mode for ICD #FUSES BROWNOUT //Reset when brownout detected #FUSES NOLVP //No low voltage prgming, B3(PIC16) or B5(PIC18) used for I/O #FUSES NOCPD //No EE protection #use delay(clock=20000000) //meu clock /*===================== Minhas variáveis: =======================*/ int8 periodo=0; int8 ciclo1=0; int8 p1 = 1; int16 delay = 65478; //65478 = 4960Hz e 60000 = 57Hz int1 aux; /*===================== A interrupção: =======================*/ #int_timer1 void TIMER1_isr (void) { p1++; aux++; set_timer1(delay); } /*============================== Rotina Principal: ================================*/ void main() { output_low (PIN_B7); SETUP_TIMER_1 (T1_INTERNAL|T1_DIV_BY_8); //Configurar timer1 para clock iterno/8 enable_interrupts (INT_TIMER1); //Habilitar Interrupções enable_interrupts (global); set_timer1(delay); //Preload do timer1 while (TRUE) { if (aux) { if (p1 < 118) { output_toggle (PIN_B7); } else { output_high (PIN_B7); } if (p1 == 120) { p1 = 0; } aux++; } } } -
Gerador de Pusos com Pic Utilizando Timer1
MatheusLPS respondeu ao tópico de Rodrigo Xsara em Microcontroladores
Editado. Motivo: falei abobrinha. Volto depois com um teste para você. Falou -
Bom, leds de 1W costumam ter corrente de 350mA. Veja se o LED que deseja é esse: Led 1W Branco Frio YT-WC05QM-1H-B Leds brancos costumam ter tensão de 3.2V@350mA. De acordo com o datasheet do LM317, você pode fazer uma fonte de 1A aasim: Acredito que a forma mais fácil de ligar seja assim: O resistor de 1.2 ohms e 2W configura a corrente de saída. você teria 3 pares de leds. Os resistores de 0.1 ohms servem para equilibrar a corrente em cada ramo. Aguade mais opiniões pois não tenho certeza desse esquema. você precisará de uma fonte de [email protected] tipo essa: http://www.nodaji.com.br/produto/fonte-para-c-acirc-mera-cftv-12-vdc-1-5-a-.html Falou
-
Jhonatann Silva, favor colocar os dados dos leds, como tensão de trabalho e corrente consumida. Falou
-
Pelo visto terei que tirar o over também. Mesmo em 4.0 com WC e nao passando de 46º o núcleo e 35º os cores, sempre ta travando os processos do folding..... Até tinha dado uma pausa esses 2 dias... Falou
-
Pessoal, estou experimentando o F@H partir de hoje. Estou nas minhas 1ªs WU. Segui o tutorial do cliente V7 certinho e peguei 2 WU. Quero só tirar algumas dúvidas: 1ª: Li em alguns dos tópicos sobre o assunto que seria interessante alterar a afinidade do processador para se adequar à SMP à VGA... dessa forma fiz assim: O processo chamado Fah_core_3.exe setei para ficar com afinidade aos 5 núcleos do X6. E o processo Fah_core_15.exe setei para a afinidade como o último core, nesse caso o 6. Seria o correto? Veja na imagem abaixo como fica os núceos. O X6 ta rodando a 4.0Ghz para não forçar muito e a GTX460 está em 850/1700/2100. Veja as 2 WU abaixo e a temperatura do sistema. Tá legal? Ahh fiz issO "Bom não custa nada relembrar; aos que usam o cliente V7, não se esqueçam de colocar na aba superior esquerda em advanced, depois vá em configure, advanced, e coloque a primeira opção em slightly higher, checkpoint frequence para 3 minutos e finalmente verbosity para 5. Explicando, a primeira opção vai fazer com que a prioridade do FAHCore seja alta e vai processar mais rápido, a segunda opção faz o FAH salvar o trabalho a cada 3 minutos ao invés de 15, se tiver um problema ele vai ter um status salvo mais recente e finalmente o verbosity 5 vai colocar mais opções no log do FAH. Note isso para mim é obrigatório, tanto no V7 como no V6, muito mais do que -advmethods, ao menos no meu caso, espero ter ajudado amigos, um abraço e keep folding." Falou
-
TUTORIAL: Projeto PicUSB quase pronto PIC<-->RF<-->PIC<-->USB<-->PC
MatheusLPS respondeu ao tópico de MatheusLPS em Microcontroladores
Obrigado colega tsantann. Qualquer dúvida posta aí. Falou -
TUTORIAL: Projeto PicUSB quase pronto PIC<-->RF<-->PIC<-->USB<-->PC
MatheusLPS respondeu ao tópico de MatheusLPS em Microcontroladores
Poxa PVC, desculpa cara. Não tinha visto sua última postagem do dia 20/03... Passou batido aqui no fórum... Seguinte, o projeto feito pelo JYM: http://www.4shared.com/rar/f9I1HXNe/picwinusb.html Consegui brincar muito com ele. Consegui ler dois LDR e enviar a tensão sobre eles para o PC e mostrar em um gráfico; Consegui controlar 3 barras de led via PWM através do PC, eviando os valores dos duty-cicles.. Consegui ler a cor predominante no desktop e enviar essa informação para as 3 barras de led. O efeito parece com o ambilight da philips, mas bem mais fraquinho uhahuahuaahuahu Consegui ler a informação de um player de MP3 como o winamp e enviar o nome da música e do artista ao PIC e mostrar em um LCD. Vou ver seu arquivo depois. Falou
Sobre o Clube do Hardware
No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas comunidades sobre tecnologia do Brasil. Leia mais
Direitos autorais
Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais