FAÇA UM PEQUENO CONTROLE REMOTO PWM DE 2 CANAIS (1MS A 2MS) – COM PIC 12F675 (REF113)

2

Gostaria de fazer um controle remoto compacto para sua diversão? Com apenas 2 canais PWM (1MS a 2MS)? Com opção de acionar mais 3 funções do tipo ‘on/off’? Então você vai querer ler mais…

Recentemente, foi publicado neste blog o artigo ‘FAÇA UM CONTROLE REMOTO PWM 8 CANAIS (1MS A 2MS) – COM PIC 16F628A’ com 8 canais PWM e 5 acionamentos do tipo ‘on/off’.
Mas para alguns hobistas, isto acaba sendo um exagero, sendo que alguns canais não são usados. Pensando naqueles que usam no máximo 2 canais PWM, e que querem uma montagem mais compacta, foi feita esta versão com PIC 12F675, de apenas 8 pinos, sendo ele pequeno e barato.
O padrão de muito servos se baseia no uso de um pulso entre 1ms a 2 ms . Quando ele recebe um pulso de 1ms corresponderá a posição inicial do servo. Se for colocado 1,5 ms de pulso, o servo se deslocará para a posição central e com 2ms irá para o extremo oposto. Valores intermediários irão resultar em posições proporcionais. Isto facilita o controle, por exemplo, da direção de um carrinho elétrico.

Veja o esquema abaixo do par transmissor/receptor:

O ‘TX’ é um módulo comercial de transmissão, cuja frequência deverá ser escolhida para a aplicação desejada (27mhz, 49mhz, 72mhz, etc). Para meus testes, usei um tx de 433mhz do tipo parecido com controle remoto de portão. Os 3 interruptores em modo on/off foram ligados aos pinos 4,6 e 7. Para obter o valor do PWM foram usados 2 potenciômetros de 4k7, sendo um ligado no pino 5 e outro no pino 3. Visto que o PIC12f675 tem internamente 4 canais de conversão analógica/digital, ficou mais fácil obter os valores proporcionais. O código ASM é bem simples e o HEX resultante da compilação é pequeno.

Na parte de recepção, foi usado outro PIC12f675, sendo que o receptor comercial entrega o sinal para o pino 4 e as outros pinos são unicamente saídas (excetuando a VCC e o GND).
O receptor tem que ser na mesma frequencia do transmissor. No teste, usei um receptor de 433mhz (comercial), mas, em uso, deverá ser usada as faixas legais permitidas para isto (consulte a legislação do seu país, quanto a potências e frequências, bem como de licenças de uso).
Em uma recepção completa são recebidos 5 bytes na sequência: byte de conferência (valida a transmissão), byte dos botões, byte pwm canal 2, byte do canal 1 e byte do serial number (sempre recebe o bit LSB de cada byte primeiro). Somando-se todos os bytes de dados tem que ter o mesmo valor do byte de conferência. Isto assegura a qualidade da transmissão. Quando ocorre um interrupção de sinal, o receptor mantém os valores anteriores nas saídas (tanto proporcionais como botões).
As saídas são PWM são acionadas sequencialmente, usando a rotina de interrupção do timer1 e timer 0 para controlar cada etapa.
O protocolo de transmissão de bits é o adotado nos receptores de HT6p20B, por já estar disponível com mais facilidade nos projetos deste blog.
Atenção: É importante separar a alimentação do PIC e também do receptor 433 mhz da alimentação dos servos controles. Estes, ao acionarem, geram picos de corrente que podem ‘resetar’ o PIC, ou mesmo, atrapalhar a recepção do sinal momentaneamente.
Obs. Esta montagem foi montada e testada em placa de protoboard apenas, sujeito a bugs ainda não identificados. Esta sendo fornecido o arquivo ASM e HEX que poderão ser alterados segundo as necessidades do hobista.

Segue o arquivo ASM do TX:

CR_TX_2PWM_3B_ASM

Segue o arquivo HEX do TX:

CR_TX_2PWM_3B_HEX

Segue o novo arquivo ASM do RX:

CR_RX_2PWM_3B_ASM

Segue o novo arquivo HEX do RX:

CR_RX_2PWM_3B_HEX

Também para os que desejam fazer esta montagem usando um compilador ‘C’, segue os arquivos do TX e RX , bem como a pasta zipada com todos os arquivos originais:

cr_tx_pwm2c_3b_c (transmissor)

cr_rx_pwm2c_3b_c (receptor)

projeto_cremoto_pwm_tx_rx (ambos, em pasta zipada)

Também, segue pasta zipada com uma versão de receptor com pulso de 750 a 2800 useg, ao invés de 1000 a 2000 useg. Isto produz um curso maior no servo controle:

cr_pwm_rx_2ch_extendida

Manuais:
PIC12F675
Servo-motor
Outros esquemas curiosos

Curiosidades:
Por que o mar é salgado?
O que aprendemos dos projetos da natureza
Impressionantes “aspiradores” do mar
Um mar extraordinário — mas morto!
Uma batalha contínua contra as águas
Fantásticas dunas do litoral polonês
Barcelona — galeria ao ar livre de cores e estilos
O passado e o presente dos brinquedos
Alguns mitos a respeito da morte examinados mais de perto
Como estimular o desejo de aprender
O abuso do álcool e a saúde
Projetado com a capacidade de aprender sempre
Sono: supérfluo ou necessário?
Os custos das minas terrestres
Um universo cheio de surpresas
O som da neve
O que estamos fazendo com nosso alimento?
Mestres medievais da astonomia

Outros assuntos:
Fortaleça seu casamento por meio de boa comunicação
Os desafios de uma família com enteados
Como ser feliz no casamento?
Como se sair bem na escola — seja organizado
Como conversar com seu filho sobre sexting
Aprenda a perdoar
Como criar filhos responsáveis
Como administrar o seu dinheiro
Ensine valores morais a seus filhos
Ensine seus filhos bons principios com atividades de colorir
Como posso ter ânimo para exercitar
Como posso controlar meu peso?
Entrevista com um bioquímico
Adolescentes- O que fazer se estou sofrendo bullying?
Como evitar ferir com palavras?
Como tratar seu cônjuge com respeito?
Perguntas bíblicas respondidas

Até o próximo artigo!!!

2

43 comments

  1. 0

    Cláudio, boa noite, seus projetos continuam sendo meu norte nos estudos com pic, atualmente estou estudando sobre o sleep e interrupção externa e tive uma idéia de implementar isso neste projeto já que esqueci várias vezes o Tx ligado detonando as baterias, então como eu faria para que o pic saia do estado de repouso caso eu apertar um dos botões ou girar o potenciômetro, seria possível?

    1. 0

      Olá Fernando!
      No caso, acredito que teria que ‘bolar’ algum tipo de temporizador com registradores, para determinar quanto tempo desligaria após o ‘não’ uso dos comandos. Quando completasse este tempo, entraria em modo ‘sleep’ sendo acordado, por talvez, alguma mudança de estado dos pinos.
      Cláudio

      1. 0

        Olá Cláudio, está correto e já fiz isso, no timer0 coloquei um contador que zera sempre que houver uma mudança de no vetor ou quando algum botão for acionado, consegui fazer com que ele fique em repouso caso fique inativo em alguns segundos, já para ativar novamente só consegui através do mcrl o que seria ruim já que eu teria que fazer outra placa ou soldar fios no controle, meu conhecimento ficou até aí já que nos livros que tenho não contempla a possibilidade de ativados por interrupção externa em outros pinos.

        1. 0

          Olá Fernando!
          Eu aprendi muita coisa lendo os datasheet dos microcontroladores. Mas infelizmente, a maioria deles estão em inglês. Neles temos os ‘detalhes’ de como tirar o microcontrolador do ‘sleep’ nas usas várias formas. E para cada modelo, geralmente tem algumas diferenças a ser levado em consideração, principalmente quando migramos de um tipo de pic para outro diferente (ex. 12c509 para 12f675).
          Cláudio

          1. 0

            Olá Cláudio, achei no 12f675 a porta correta para acorda-lo porém não sei se seria possível fazer isso de outra forma (read adc ou outros pinos) sabe dizer se isso é possível já que no datasheet a interrupção funciona no GP02 ? Outra pergunta, quando você estará lançando o seu livro, já estou na fila para compra-lo. Mesmo se você pegasse alguns dos projetos e comentasse passando por todos os métodos possíveis provavelmente seria um sucesso de venda.

          2. 0

            Olá Fernando!
            Segundo o datasheet do pic 12f675, podemos ‘acordar’ o pic que

            sofreu uma instrução ‘sleep’ por 3 modos:
            1) Por um reset (mas o programa volta ao início, o que não é

            conveniente em muitos casos).
            2) Por estouro do Watch-Dog (quando habilitado na palavra de

            configuração)
            3) Pela ocorrência de uma interrupção externa (gp2/int) , ou por

            mudança de estado dos pinos associados a esta função, e também

            alguma interrupção de periféricos (adc,timers,comparadores,etc).

            Acredito que o melhor caminho (suponho eu e posso estar errado) seja o de usar a interrupção por mudança de estado dos pinos da porta. Poderá setar os bits que acionarão, no registrador IOC (96h). No registrador INTCON (0bh/8bh) bit 0 (gpif) é o flag que indica esta ocorrência e tem de ser resetado manualmente após sair do ‘sleep’. Mas somente conseguirá reseta-lo se ler a Gpio antes de apagar o flag gpif (requisito da máquina). Terá que fazer testes para ver se funciona a contento.
            Cláudio

          3. 0

            olar claudio tem certesa que esse controle funciona tentei de tudo copilei os arquivos c com o mplab e ccs mais na platica nunca funciona verifiquei o byte de calibraçao ta tudo ok

            obs;estou usando o pickt3 para gravar o arquivo hex nao to tendo sussesso

          4. 0

            Olá José Carlos!
            Sim, com certeza funciona. Porque você está compilando de novo? Já tem os arquivos .hex que podem ser usados para gravar os pic’s. Use eles! Ou você fez alguma alteração para necessitar recompilar?
            Cláudio

        2. 0

          olar claudio estou copiando os arquivos asm e colando no mplab mais ta senpre dando Illegal character (/)
          posso apagar esses caracter

          1. 0

            Olá José Carlos!
            Por favor, veja se não está tentando abrir um arquivo para compilador C com o Mplab compilando em assembly. Se for não irá funcionar. Os arquivos asm que podem ser compilados são:

            CR_TX_2PWM_3B_ASM, CR_RX_2PWM_3B_ASM

            Os arquivos abaixo devem ser usado o compilador C da CCS ( não dá para compilar com o Mplab em assembly):
            cr_tx_pwm2c_3b_c (transmissor), cr_rx_pwm2c_3b_c (receptor), projeto_cremoto_pwm_tx_rx (ambos, em pasta zipada)

            Mas se estiver usando um arquivo asm e deu esta mensagem, verifique onde ela ocorre. Pode ser apenas uma linha de comentário que ficou fora de formatação. Neste caso substitua o / (barra inclinada ou slash) por ; (ponto-virgula ou semicolon) .

            Cláudio

      2. 0

        olar claudio preciso muito fazer esse controle mais nao to conseguindo copio o arquivo hex com pickt3 tudo normal mais na platica nao funciona me dar uma força ai cara

        1. 0

          Olá José Carlos!
          As vezes acontece de carregarmos um arquivo .hex em um pic 12f675 e aparentemente foi tudo bem sucedido. Mas nada funciona. Isto acontece, porque em alguns programas se pede para calibrar o oscilador interno com o valor gravado na ultima posição de flash. Mas alguns programadores não salvam este valor ao apagar a flash. Quando carregamos o programa novo, ele não consegue encontrar o valor e entra em loop nas primeiras linhas de programa. Resultado: Nada funciona. Para saber se perdeu o byte de calibração do oscilador basta ler com o programador a ultima posição de memória flash. Tem que ter o valor 0x34vv , onde vv é o valor do oscilador (ex. 3440, 3480, 34fc, etc.). Caso ao ler esteja 0x3ff, com certeza foi perdido. Poderá abrir o seu arquivo hex na tela do programador e digitar manualmente um valor como 0x3440 na ultima posição da flash e daí então gravar novamente. Adicionalmente, verifique no manual do seu programador se ele salva de forma automática o valor de calibração do oscilador interno antes de apagar a flash.
          Cláudio

  2. 0

    Olá Claudio obrigado por sua resposta mas tipo assim nw seria quanto eu quero de angulo mas sim o correto nw seria o servo ir até o final para a direita e até o final para a esquerda ? .Agora eu te enviei o link do video pq seria interessante o projeto de um um veiculo robotico que ao invez de servo para a direção usasse o mesmo sistema do (recon scout xl o veiculo do video).nw sei se vc ja viu mas é bem legal o funcionamento Obrigado e parabens pois seus projetos de controles remoto são excelentes ideias. agora verifica o video quando der e add esta ideia ao seu caderninho .mais uma vez obrigado Edmilson LS

    1. 0

      Olá Edimilson!
      Os servos variam o curso de fabricante para fabricante . Eu não conheço as especificações do seu equipamento, por isso pedi para saber quantos graus você necessita a mais. Colocar um valor maior, sem conhecer estas especificações, poderia destruir seu servo quando acionar para os extremos direitos ou esquerdo. Para corrigir o curso , eles dispõem de furações adicionais em seus braços em que podemos mudar o ponto da alavanca resultando em movimentos maiores ou menores no dispositivo controlado (ex. direção).
      Cláudio

    2. 0

      Olá Edmilson! Coloquei uma versão com 750 a 2800 useg de pulso para o servo. Esta no final do artigo, em pasta zipada (C e hex). Creio que deverá atender a necessidade de mais curso.
      Cláudio

  3. 0

    Olá Claudio este problema relatado pelo Ronaldo eu tbm estou tendo no meu caso estou usando um servo futaba s3003 e o mesmo esta com pouco curso tanto para a direita quanto para a esquerda se vc puder me orientar em qual linha ou porção de codigo alterar ficarei grato.E me diz uma coisa qual compilador c vc esta usando nos outros projetos pois tenho tentado integar varios ao mplab e nw tive sucesso, agora vou te dar uma ideia para um proximo projeto igual ao seu ultimo que é o controleremoto para automodelo da uma olhada neste site http://www.reconrobotics.com/products/scout_IR.cfm ao invez de usar servo para a direção vc poderia usar este sistema se possivel http://www.youtube.com/watch?v=fCLy0gmeeu0.
    Obrigado e Parabens pelos projetos

    1. 0

      Olá Edmildon! Qual seria o angulo necessário para atender a sua montagem? Porque com 1-2 ms terá apenas 45° para esquerda e 45° para direita. Eu estou usando uma versão antiga do CCS C e não está integrada ao Mplab_ide. Quanto a sua ideia de projeto, em que aplicação você teria em mente?
      Cláudio

  4. 0

    por conta propria, vou arriscar dizer que este codigo em c tambem seja( flex) pelas multiplas funções existente,pois ja alterei com sucesso praticamente quase todos os recursos que este notavel firmwere nos oferece, agora o que está me enculcando é o fato de apenas um servo motor funcionar e o outro não.será que estou fazendos a montagem errada lario?help me!!

  5. 0

    lario cordialmete meu muitissimo obrigado por ter doado de seu precioso tempo,e escrevido este codigo pwm em c,visto que tem feito o maximo possivel para contribuir com os internautas que te solicita por ajuda.mas nao sei como está distribuido o seu tempo,se nao for exigir demais,na medida do possivel que voce dispuser um tempinho voce poderia modificar uma dessa saida para 0 a 5 volts?obs não estou exigindo.

    1. 0

      Hi Digit99! If I understanding well you need a 3ch ‘hold’ mode without PWM, is it? I’ll like to know where will be used, if you can answer me, please.
      Cláudio

      1. 0

        Yes Claudio I need 3ch ‘hold’mode WITH PWM.(3ch+2ch PWM)I need to control led lightening on the roof in my living room.I will control about 500 led.Sometime I need
        a lot of light sometime not.Also will control sun blind on the window.Many thanks for your fast answer. : 🙂

    2. 0

      Hi Digit99! Could you see the article again, please? Because I put a code using ‘c’ compiler that work with ‘hold’ mode 3 ch on/off and 2 ch PWM 1 to 2 mseg. Use the hex of the zipped folder.
      Cláudio

        1. 0

          Hi Digit99! I’m Sorry. It was my mistake. Really, you talked about using with leds control and not to control a motor. I’ll see what I must change in the code.
          Claudio

          1. 0

            Hello Claudio.I am so happy for this project!This is exactly what I have in mind.Many thanks for your project,and your waste time.I am follow all your project,they are so interesting for me.by from Prague

  6. 0

    boa tarde companheiros:rapazes concluir que seria facil moleza faser alteraçoes neste codigo, e o e negocio é como se fosse um labirinto quando voce mexe daqui ele entorta dali rsrsr,na verdade eu nao entendo se devo continuar no aprendizado da linguagem asm ou a do pic.por enquanto finalizo minhas tentativas por aqui em outra ocasião quem sabe.rsrsr preciso me ausentar por alguns dias.valeu abraços a todos seguidores desta fonte de informações que é o site do claudio larios

  7. 0

    rsrsr agora é que ficou pesado preciso alterar os dois codigos!!! alterei algumas declarações compilou mais não tenho certeza se está ok.vou continuar quem sabe… bom dia companheiros.

  8. 0

    com tanta materia em asm ja estou me acostumando com os codigos,melhor ainda é que o Lários comenta muito bem as linhas, dai facilita o nosso entendimento estou gostando novamente do asm.agora vou tentar malinar neste codigo,pois pretendo acrescentar mais uma entrada pwm de 1 a 2 miliamperes,e uma entrada pwm de 0 a 5 volts e deixar apenas uma entrada on/off. neste serão 3 entradas pwm de 1 a 2 miliamperes 1 de 0 a 5 volts e uma on/off
    para isto conto com as preciosas ajuda e comentarios dos companheiros.

  9. 0

    lario transfomando este notavel projeto em um sistema aerodimámico dar para controlar um pequeno aeromodelo não dar?
    ex tornando ele para 4 entradas pwm de 1 a 2 milisegundos para 4 servos,mais um canal pwm de 0 a 5 volts e um canal on/off parece dar para voar certo isto é possivel rsrsr? abraço.

  10. 0

    Ola cladio obrigado pela atenção o servo não vai continua ou seja do percurso ele anda um pouco volta e vai novamente e não para na posição correta como o outro.

    1. 0

      Olá Reinaldo! Testei o circuito no protoboard e funcionou ok. Mas tem um detalhe importante que quero que verifique: A alimentação dos servos deve ser separada da alimentação do receptor de 433mhz e do pic. Senão, os picos de corrente irão resetar o pic e também poderão causar má recepção do sinal.
      Claudio

  11. 0

    Ola claudio bom dia! montei este esquema funcionou so que a saida 1 o pwm nao esta dando o tempo o servo nao trabalha correto o que sera?
    Obrigado

    1. 0

      Olá Ronaldo! Poderia explicar com mais detalhes o que está acontecendo? O que você quer dizer com ‘não trabalha correto’? Aciona o servo? Aciona com pouco curso?
      Claudio

  12. 0

    Claudio: ‘congratulation’ por esta econômica e compacta montagem que vai atender a necessidade da grande maioria dos hobista assim como eu,obrigado.

Comments are closed.