Post de minha autoria, originalmente publicado no Embarcados.
No Brasil uma das linhas de microcontroladores mais utilizada é a PIC, da Microchip, ensinada em cursos técnicos, profissionalizantes e de graduação nas áreas de eletrônica e automação. Um de seus maiores representantes é o modelo PIC18F4550, caracterizado por uma arquitetura RISC de 8 bits com USB integrado, dentre muitas coisas mais.
Porém, programar código para PIC não é uma coisa das mais triviais, e algumas plataformas como MikroC tentam tornar o desenvolvimento mais fácil e intuitivo, com código mais enxuto e bibliotecas a tira gosto. Programar então usando as famosas plataformas como CCS e MPLAB, é para o espartanos de plantão.
Juntando o útil ao agradável, muitos dos entusiastas que lidam com PIC também gostam de Arduino (lá vem as pedras!!!). Então…Que tal unir as duas coisas? Não seria muito interessante e prático ter uma ferramenta que permitisse programar PIC com a mesma abordagem com que o Arduino é programado? Desta forma surgiu o Pinguino!
O projeto Pinguino é OpenSoftware e OpenHardware, ou seja, todo o software desenvolvido e esquemáticos de placas utilizados são disponibilizados abertamente. E para atender os objetivos de praticidade, o Pinguino faz uso de alguns modelos PIC18F e PIC32, que possuem USB integrado, de modo a permitir o desenvolvimento de código para PIC com a mesma facilidade com que a ferramenta Arduino IDE permite para seus correlatos. Ou seja, com a placa em mãos, cabo USB plugado e ferramenta aberta no computador, basta alguns cliques e o código já está carregado e em execução. Sem gravador, sem muitos fios. Rápido e prático.
Figura 1 – Logo do Pinguino e lema
Apenas para elucidar melhor, seguem as famílias de PIC suportadas pela ferramenta:
8 bits : PIC18Fx550, PIC18Fx5K50, PIC18Fx6J50 e PIC18Fx7J53 (x: indica qualquer variante numérica);
32 bits: PIC32MX.
Além disso, o projeto fornece esquemáticos de placa e vende também kits compatíveis.
O Pinguino é composto por uma IDE, onde estão todos os artefatos necessários ao desenvolvimento, como editor de código, comandos para compilação e gravação de código no PIC, além de depuração via USB. E para usufruir da plenitude da ferramenta, é bom que o PIC utilizado também esteja com o firmware Pinguino gravado, de modo que o programa possa ser diretamente gravado pela IDE via USB.
Gravação do Firmware Pinguino
Antes de começar, o primeiro passo é gravar o firmware Pinguino em um PIC compatível com a ferramenta. Para este exemplo irei utilizar o PIC18F4550, juntamente com a placa PROTO'n PIC18F4550, da SmartRadio. Eu possuo em mãos um gravador PicKit2, e fazendo as devidas conexões de pinagem, fiz a gravação do firmware Bootloader_v4.13_18f4550_X20MHz.hex, para PICs compatíveis de 8 bits.
Figura 2 – Plata PROTO'n PIC
Em seguida, é necessário ter em mãos um gravador ICD2, PicKit2, PicKit3 ou compatíveis, de modo a gravar o bootloader no PIC.
Para quem ainda não é muito familiarizado com as ligações e procedimentos, apenas mostrarei um breve descritivo de como fazer essa parte, sem demais delongas. Na Figura 3 é mostrado o esquema de ligações do PicKit2/PicKit3 para gravação do microcontrolador PIC18F4550.
Figura 3 – Esquema de pinagem do PicKit2 para gravar PIC18F4550
E na Figura 4, mostro como ficaram as conexões na placa PROTO'n PIC18F4550, conforme mostrado na Figura 3. Não ficou diferente, exatamente pelo fato de que a placa PROTO'n PIC basicamente espelha os pinos laterais do PIC. O único "porém" é a necessidade de possuir fios (ou "jumpers") com ponta fêmea, de modo a ter acesso e conexão aos terminais da placa.
Quando conectado ao PicKit2 ou PicKit3, o microcontrolador PIC é energizado pelos sinais VCC e GND do PicKit. Todavia, mantenho a placa PROTO'n PIC conectada via USB.
Figura 4 – PROTO'n PIC conectada para gravação com PicKit2
Com o PICKit 2 devidamente conectado ao dispositivo PIC 18F4550, e com o programa PICkit 2 aberto, selecionado o arquivo *.hex correspondente ao bootloader Pinguino, basta então proceder com a gravação do firmware no microcontrolador, clicando no botão "Write" do PICkit 2, tal como mostrado na Figura 5.
Figura 5 – Imagem com destaque para o PicKit2 para gravar
O firmware Pinguino gravado possui as seguintes características:
A aplicação do usuário inicia sem delay algum em Power-on Reset;
O bootloader só será iniciado se o botão de Reset for pressionado!
O modo de bootloader ficará ativo até que um programa seja carregado, sem tempo limite;
Um LED ficará piscando com período T=2*43ms.
Após ter gravado o firmware do bootloader Pinguino no microcontrolador PIC18F4550, agora é a hora de instalar o Pinguino IDE e demais componentes correlacionados. Entretanto, o processo envolve também a instalação de drivers não assinados digitalmente, principalmente os drivers do Bootloader e de CDC do Pinguino.
De modo mais direto, veja no Escreve Assim o guia para reiniciar o Windows 8.1 desativando a assinatura de drivers. Após isso, proceda então com os tópicos adiante 🙂
Para instalar o Pinguino IDE, basta acessar o link de download e baixar o Pinguino para o seu correspondente sistema operacional, seja Windows, Linux ou Mac. Caso escolha Windows, você será direcionado para este link de download, e como referência para o presente artigo foi utilizado o Pinguino v1.1.0-beta3 release. Um pouco mais abaixo na página está o link de download para o arquivo "pinguino-11.2015.02.02-setup.exe". Clique nesse link para iniciar o download.
Completado o download, inicie o programa executável de instalação, e será aberta uma janela para escolha de idioma tal como mostrado na figura 6. É possível escolher o idioma Português Brasileiro na instalação.
Figura 6 – Início da instalação do Pinguino – Escolha do idioma
Depois de selecionar o idioma, o processo de instalação então segue com uma janela de boas-vindas, em português do Brasil, por exemplo, como mostrado na Figura 7. Clique em "Instalar" para continuar com o processo.
Figura 7 – Janela do guia de instalação em português brasileiro.
Após isso, é aquele "procedimento padrão", clique em "Instalar", concorde com demais contratos e "próximo", "próximo", etc, até que o programa inicie sua instalação, propriamente. Nesta versão do Pinguino o instalador está bem versátil pelo seguinte aspecto: Ele basicamente faz o download e a instalação de todos os componentes necessários para a execução do Pinguino, tais como Python2.7, PySide, PyUSB, libusb, compilador sdcc, e demais. Esse processo pode demorar em decorrência do download dos componentes, então, paciência! Para se ter uma noção do processo, segue a janela mostrada pela Figura 8, destacando o download e instalação dos componentes.
Figura 8 – Exemplo de andamento de instalação
Durante o processo, você também será questionado se deseja instalar os drivers para a placa do Pinguino. Clique em "Yes" (Sim), conforme mostrado na Figura 9, e prossiga com os passos mostrados, inclusive com a instalação do LibUSB Win32 (procedimento padrão, próximo, próximo, etc! 🙂
Figura 9 – Janela para instalar ou não drivers da placa Pinguino
Não sei se com vocês o processo será diferente, mas comigo não deu muito certo esta parte! Ele irá instalar os drivers, e no final será aberta uma janela para você configurar a libUSB, de modo a criar um "filtro" para o Pinguino via USB. Entretanto, ela não irá aparecer para você selecionar nesta etapa! Então é normal, não se preocupe. A finalização deste processo fica para mais adiante. Após essa última parte dos drivers, a instalação é concluída, e você poderá abrir a IDE do Pinguino, que é desenvolvida em Python.
A IDE é bem direta e objetiva, possuindo botões para criar, abrir e salvar programas, fazer setup de projeto, compilar e gravar o código na parte de cima da IDE, e de modo sobremaneira interessante, possui uma janela lateral com destaque para exemplos de código, tais como os presentes no Arduino IDE, por exemplo. Na parte de baixo da IDE está presente um console para o terminal Python. Um panorama geral da IDE é mostrado na Figura 10.
Figura 10 – Panorama geral da IDE Pinguino
Como mencionado, faço um destaque para a presença da janela lateral de "Tools" (Ferramentas), que permite acessar exemplos de códigos, navegar por sobre a estrutura de projeto e realizar pesquisa sobre o projeto também, tal como mostrado na Figura 11.
Figura 11 – Destaque para a janela com exemplos da IDE
Outro aspecto interessante da interface da Pinguino IDE é o botão presente na parte superior direita, chamado de "Graphical Mode", que muda a forma de programação do Pinguino IDE para diagrama de blocos, conforme mostrado na parte esquerda da janela do programa, como mostrado na Figura 12.
Figura 12 – Indicativo do modo "Blocos" do Pinguino.
Bom, até aqui já fizemos a gravação do bootloader, já instalamos a Pinguino IDE. Agora… Falta mandar bala nesse bendito driver!
Um libUSB para o Pinguino!
Antes de começar, é necessário firmar uma base forte para um elemento primordial para toda a ação do Pinguino: A USB. A plataforma é baseada em Python e faz uso do PyUSB, e, consequentemente, da biblioteca libUSB para lidar com a comunicação USB com os microcontroladores PIC suportados.
Infelizmente, a instalação do Pinguino não cobre 100% dos detalhes necessários para fazer a biblioteca e os drivers operarem no Windows 8.1 x64, por exemplo, que é o sistema que eu utilizo e usarei como base. Semelhantemente, acredito que as rotinas aqui também sirvam para Windows 7 x64 e o 8 x64 também.
A biblioteca libUSB é a que fará o registro do driver do bootloader Pinguino para o seu devido funcionamento em ambiente Windows. Para isso, é preciso baixar a libUSB por completo (a que vem no Pinguino parece ser mais "enxugada"…), e fazer a instalação. Lembrando que é preciso estar rodando o Windows com a assinatura de drivers desativada!!!
Para instalar a biblioteca libUSB nativa, é necessário fazer o download do seu instalador na página SourceForge do projeto. A biblioteca não é instalada, ela é fornecida em formato zip. Eu recomendo você descompactar o diretório libUSB dentro do diretório da Pinguino IDE, ou seja, descompacte em C:\pinguino-11\, de modo que o diretório da biblioteca baixado fique como "C:\pinguino-11\libusb-win32-bin-1.2.6.0".
No diretório descompactado da libUSB, acesse o diretório "bin", e abra o executável inf-wizard.exe como administrador, tal como mostrado na Figura 13.
Figura 13 – Indicativo do executável inf-wizard.exe
Durante o processo, será necessário clicar o botão reset da placa PROTO'n PIC diversas vezes, pelo fato de que enquanto o driver não estiver devidamente instalado, o bootloader mais recente fica ativo por apenas 10 segundos, e depois será desativado, de modo que para o Windows será como se o dispositivo tivesse sido desconectado. Então, quando precisar, pressione o reset para "forçar" esse dispositivo "desconhecido" aparecer, e logo fazer ele ser reconhecido 😉
Ao abrir o programa inf-wizard.exe, a janela de informação irá mostrar que este programa trata de criar um arquivo *.inf para instalar o driver USB do dispositivo, como mostrado na Figura 14. Antes de clicar em Next, tenha a PROTO'n PIC18F4550 (por exemplo) conectado via USB no seu computador, e pressione o botão "reset" para fazer o microcontrolador entrar em modo de bootloader, e assim imediatamente clique no botão Next.
Figura 14 – Primeira janela do Inf-Wizard da libusb para Windows
Na próxima janela, mostrada na Figura 15, será mostrada uma lista de dispositivos USB conectados à máquina. Selecione o dispositivo com nome igual a "P8", ou, se preferir, Vendor ID igual a 0x04D8 e Product ID igual a 0xFEAA. Pressione novamente o botão de reset da placa PROTO'n PIC e clique no botão Next.
Figura 15 – Seleção do componente adequado – Selecione P8!!!
Na próxima janela, como mostrado na Figura 16, é a parte de Configuração do Dispositivo (Device Configuration). Aqui você poderá mudar, por exemplo, o nome do dispositivo. Eu deixei tudo como está. Clique novamente no botão reset da PROTO'n PIC e clique no botão Next.
Figura 16 – Modificação ou não de parâmetros do driver
Ao clicar em "Next", será aberta uma janela para você selecionar onde quer deixar o arquivo inf a ser gerado para o dispositivo em questão. Selecione um diretório fácil para ser encontrado (como por exemplo o próprio Desktop), deixe o nome como está (no meu caso, o nome do arquivo ficou como P8.inf), clique em "Salvar".
Na próxima janela, como mostrado na Figura 17, é exibido um resumo das informações agregadas do dispositivo USB selecionado, as quais serão usadas para fazer um arquivo *.inf do driver a ser instalado. Pressione o botão reset da PROTO'n PIC e clique no botão Install Now… e o processo para instalar o driver será iniciado.
Figura 17 – Instalação do driver USB parametrizado
Caso questionado pelo Windows, autorize o programa a fazer modificações no sistema, e como você está no Windows com assinatura de drivers desativada, será mostrada uma janela lhe questionando se deseja ou não instalar este driver, tal como mostrado na Figura 18. Selecione a opção "Instalar este software de driver mesmo assim", e o driver será instalado devidamente. UFA!
Figura 18 – Janela de segurança do Windows para instalação de driver não assinado
Pronto, driver instalado! Vamos só rever alguns detalhes importantes sobre a referência de pinos para programação no Pinguino!
Referência de Pinos no Programa
De acordo com a Wiki do Pinguino, temos a Tabela 1, mostrada adiante, com a referência numérica dada por "Pin on chip" (desconsidere "Pin name"). Esta é a principal forma de acessar um dado pino no Pinguino. Ou seja, se você quiser que o sinal RB1, ou seja, o bit 1 do PORTB seja colocado como saída, a forma correta é:
pinMode(34,OUTPUT); //define sinal 34 - RB1 como saída.
digitalWrite(34,HIGH); //coloca sinal 34 - RB1, em nível alto
Adiante, segue a Tabela 1 com as referências citadas.
Tabela 1 – Referência de pinos no programa Pinguino – Wiki Pinguino
D0 Yes Yes SDA / SDI 33 RB0/AN12/INT0/FLT0/SDI/SDA
D1 Yes Yes SCL / SCK 34 RB1/AN10/INT1/SCK/SCL
D3 Yes Yes 36 RB3/AN9/CCP2(1)/VPO
D5 Yes Yes 38 RB5/KBI1/PGM
D8 Yes Yes Serial TX 25 RC6/TX/CK
D9 Yes Yes Serial RX / SDO 26 RC7/RX/DT/SDO
D10 Yes Yes 15 RC0/T1OSO/T13CKI
D11 Yes Yes PWM 16 RC1/T1OSI/CCP2(1)/UOE
D12 Yes Yes PWM 17 RC2/CCP1/P1A
D13 / A0 Yes Yes Yes 2 RA0/AN0
D14 / A1 Yes Yes Yes 3 RA1/AN1
D15 / A2 Yes Yes Yes 4 RA2/AN2/VREF-/CVREF
D16 / A3 Yes Yes Yes 5 RA3/AN3/VREF+
D17 / A4 Yes Yes Yes 7 RA5/AN4/SS/HLVDIN/C2OUT
D18 / A5 Yes Yes Yes 8 RE0/AN5/CK1SPP
D19 / A6 Yes Yes Yes 9 RE1/AN6/CK2SPP
D20 / A7 Yes Yes Yes 10 RE2/AN7/OESPP
D21 Yes Yes 19 RD0/SPP0
D22 Yes Yes 20 RD1/SPP1
D23 Yes Yes 21 RD2/SPP2
D24 Yes Yes 22 RD3/SPP3
D25 Yes Yes 27 RD4/SPP4
D26 Yes Yes 28 RD5/SPP5/P1B
D27 Yes Yes 29 RD6/SPP6/P1C
D28 Yes Yes 30 RD7/SPP7/P1D
D29 Yes Yes RUN LED / USERLED 6 RA4/T0CKI/C1OUT/RCV
Configurando Pinguino para PIC18F4550
Agora sim, é hora de colocar as mãos em código! Mas antes disso, parecidamente ao que é feito na Arduino IDE, é preciso definir na ferramenta Pinguino IDE qual o PIC utilizado. Para isso, clique no botão "Board Configuration" na Pinguino IDE, conforme mostrado na Figura 19.
Figura 19 – Indicativo do botão de menu de Configuração de Placa
Com isso, será aberta a janela "Board Configuration", e nesta janela deixe marcadas as opções 8-bit em "Architecture", Bootloader em "Programming mode", v4.x em "Bootloader", Pinguino 4550 em "Devices", e depois clique em Accept", tal como mostrado na Figura 20.
Figura 20 – Indicativo de elementos a serem marcados para configuração do PIC 18F4550 no Pinguino
Pronto, Pinguino IDE pronto para a brincadeira.
Primeiro programa com Pinguino
Ufa! Configurado tudo quanto tinha direito, agora vamos colocar finalmente a mão em código? Então, clique no botão de "Novo" (New) no Pinguino para criar um novo arquivo de programa em branco, tal como indicado na Figura 21.
Figura 21 – Botão de new (Novo) no Pinguino
Com isso, aparecerá uma tela em branco no Pinguino IDE, onde você poderá digitar o código de programa. Nesta janela, coloque o seguinte código para piscar o primeiro LED com Pinguino! 🙂
USERLED no programa é referência ao LED conectado em PA4 ok?
No programa ele pode ser referenciado por USERLED, A4 ou 17!
// Inicia o sinal como saida.
digitalWrite(17, HIGH); //sinal PA4 em ALTO
digitalWrite(17, LOW); //sinal PA4 em BAIXO
E antes de tudo e mais nada, lembre-se sempre de salvar o código/projeto. Para isso, clique no botão "Salvar" (Save) para salvar o código escrito, tal como mostrado na Figura 22, e escolha um nome para o projeto na janela que abrirá para escolher onde salvar e qual nome usar. Eu escolhi "piscaLed" para o meu, e isso resultará no arquivo piscaLed.pde.
Figura 22 – Botão de salvar do Pinguino
Agora, antes de salvar é importante um detalhe: Colocar o PIC em modo bootloader. Para isso, basta pressionar o botão "reset" da placa, que no caso estou usando a PROTO'n PIC, e o PIC entrará no modo bootloader, agora com os drivers instalados e configurados. Com o Pinguino IDE aberto, o modo bootloader ficará ativo até que um programa seja carregado no PIC, e no modo bootloader o LED conectado no sinal PA4 na PROTO'n PIC ficará piscando aceleradamente. Isso é normal, é apenas a indicação de que ele está em modo bootloader. Não adianta desplugar a placa da USB e replugar. É preciso pressionar o botão reset, com a placa conectada via USB, para que o bootloader Pinguino entre em ação.
Depois de salvo o programa, é hora de compilar o mesmo. Clique no botão "Compile" (Compilar), tal como mostrado na Figura 23, para iniciar o processo de compilação, que, por curiosidade, é feito com sdcc para o PIC18.
Figura 23 – Botão de compilar do Pinguino
Terminado o processo, aparecerá uma janela informando que a compilação foi terminada com sucesso, e você pode simplesmente clicar em "Upload Now" para iniciar o processo de subir o código para o microcontrolador PIC com bootloader Pinguino, tal como mostrado na Figura 24. Caso você clique em OK, essa janela será fechada, e posteriormente você terá que ir na devida opção para fazer o upload do código para o PIC.
Figura 24 – Botão de upload pós-compilação do Pinguino
Caso tudo tenha corrido com sucesso, sem demais problemas, outra janela irá aprecer informando que o arquivo foi carregado no PIC com sucesso, tal como mostrado na Figura 25. Basta clicar em OK para essa janela fechar, e você já poderá observar que o LED conectado em PA4 (ou saída de número 17) ficará piscando com frequência de 1 segundo!
Figura 25 – Caso bem sucedido
Caso não tenha um PIC com bootloader pinguino ativo conectado ao computador via USB, será mostrada uma janela tal como a vista na Figura 26. Caso você tenha esquecido de colocar o PIC em modo bootloader, basta pressionar o botão reset da placa, e clique no botão "Try Again!", que o programa tentará novamente fazer upload do código compilado para o PIC.
Figura 26 – Problema ao localizar Pinguino
Feito isso, tudo pronto para você começar a brincar com PIC "à lá Arduino" com Pinguino! Brinque com a ferramenta, veja os exemplos de códigos disponibilizados. E, como desafio, veja como comunicar via USB com o PIC usando a USB ou CDC 😉
PROTO'n PIC18F4550
Pinguino – Placas vendidas
Installing Pinguino Drivers on Windows 7
MLAB C Tutorial V3
Pinout PIC18F4550
Pinguino Wiki – Basics
Embarcados, PIC 18F, 18F4550, Arduino, Desenvolvimento, Eletrônica, Embarcado, Fácil, Open, OpenHardware, OpenSoftware, PIC, Pinguino, Placa, Python, USB