Wednesday, July 13, 2016

De volta após um longo período - Vamos falar de Arduino Nano e como carregar um bootloader


Fala Pessoal,

Estou de volta depois de um longo hiato por aqui. Muitas coisas mudaram acá e depois de participar de um sensacional e inspirador TDC, resolvi remexer as coisas por aqui.

Lá ouvi falar sobre o protocolo Firmata e decidi experimentar com ele e meu Arduino Nano. A ideia é que o protocolo transforme o arduiíno em um slave the uma aplicação que irá contolar seus inputs e outputs além de conter toda a lógica.

De acordo com o palestrante - Marco Diniz Garcia Gomes- uma das vantagens é embarcar o mínimo de software possível e usar todo o poder de processamento de uma máquina desktop. Claro que como desvantagem está o fato de que se houver perda de conexão o dispositivo não funciona.

Isso será tópico de outra conversa. Por enquanto, só quero falar da dor de cabeça que tive para começar a brincadeira. Preparei pra começar, li um pouco sobre o Firmata e na hora de fazer o download do sketch para o Nano, nada de funcionar: eu não conseguia carregar os sketches

Depois de atualizar os drivers FTDI sem sucesso, comecei a desconfiar que meu Nano estava sem Booloader. O Bootloader é um firmware que permite que outros Firmwares sejam carregados usando um programador externo.

A melhor indicação que o meu Nano estava sem Bootloader foi que o Led ligado ao D13 não piscava ao resetar a placa e ao tentar fazer o download para a placa.

Li um pouco sobre o bootloader para tentar não transformar minha placa em peso para papel e decidi seguir em frente.

Acabei descobrindo que o processo para carregar o Bootloader é simples, Tudo o que precisei foi de um outro Arduíno e alguns cabos para conexão

Abaixo os passos que segui:

:


1 - Carregar o sketch ArduinoISP no Arduíno que está funcionando (figura 1)

Figura 1
2 - Conectar o Arduino Nano ao outro Arduíno - no meu caso o UNO (figura 2). Obviamente manter os 2 Arduinos desconectados da USB

PS. Acabei de descobrir que a imagem que usei de referência não era do UNO, mas funcionou do mesmo jeito


Figura 2

3 - Ligar o Arduino que funciona na USB e na IDE do Arduino selecionar Tools ->Programmer -> Arduino as ISP (figura 3)
Figura 3

4 - Aqui foi onde fiquei na dúvida: algumas referências pediram para selecionar o Arduino defeituoso como Board. Outros o Arduino que funciona. Acabei selecionando o que funciona (figura 4)
Figura 4
5 - Selecionar a Porta
6 - Selecionar Burn Bootloader (figura 5)

Figura 5

Pronto! Depois disso,  desconectar os cabos e ligar o Arduíno Nano na USB.  Se tudo deu certo você irá perceber que o LED que mencionei lá no começo irá piscar.

Para testar faça o upload de um código simples (como o Blink) para testar.

O que percebi no meu caso e não sei se foi por causa da minha dúvida no passo 4 é que preciso selecionar Arduino UNO na IDE para fazer o upload. Não consigo fazer quando deixo Nano selecionado. Vamos ver se isso será um problema no futuro!

Como referência para esses passos eu usei os seguintes sites:

Para os passos: http://www.instructables.com/id/How-To-Burn-a-Bootloader-to-Clone-Arduino-Nano-30/

Para as conexões (a imagem está lá em cima) : http://forum.arduino.cc/index.php?topic=88081.15

Era isso Pessoal. Depois eu volto com novidades sobre Firmata no Arduino.

Keep it Up!
Ewerton












Tuesday, January 12, 2016

Pausa na aplicação - Controlando versões de código: conheci o BitBucket!

Fala Pessoal, tudo bem?

Enquanto estou travado no desenvolvimento da minha aplicação por um problema que irei descrever assim que resolvê-lo, quero compartilhar mais uma que aprendi nessa nova empreitada de criar código. :)

Sempre escrevi minhas macros, alguns códigos, etc, mas nunca me preocupei em ser organizado, guardar versões antigas do que eu já tinha feito, etc. Eu ia fazendo, aprendendo, errando e acertando e uma hora o código funcionava e eu ficava satisfeito.

Com o desenvolvimento dessa aplicação estou indo mais a fundo em me organizar como "desenvolvedor". Tenho arrancado os cabelos por alterar um código que funcionava e que depois de algumas alterações parou de funcionar e eu não consigo voltar ao que era antes. Isso até descobrir o BitBucket, que é uma plataforma para controle de revisões de projeto.

Soube do BitBucket por acaso, conversando com uma pessoa lá no SJC Hacker Clube. Estava pedindo umas dicas na minha aplicação e ele pedu para compartilhar o código. Me explicou como funcionava e pronto... Criei uma conta, configurei o repositório e a mágica se fez!!

Claro que para qualquer desenvolvedor que ler isso vai saber disso desde o primeiro dia em que se entitulou desenvolvedor, é arroz com feijão. Mas para desenvolvedores eventuais como eu, esse conceito não é tão intrínseco. Eu sabia do conceito, já tinha interagido com SVN aqui na empresa mas não conhecia uma plataforma free para criar times e não fazer o código 100%  público (como é o GitHub).

Além de manter um histórico das versões, dá pra fazer uma comparação do que mudou, como no exemplo abaixo:


Volto a dizer: não é a descoberta da roda aqui, mas vai ser uma coisa que me ajudará muito. A plataforma é free até certo ponto e fácil de usar.

Agora posso alterar o código à vontade.. Estou protegido!

Era isso.. só queria compartilhar.

Cheers.. Keep it up!
Ewerton


Tuesday, January 5, 2016

Alterando uma extensão do ThingWorx - Update I

Fala Pessoal,

Continuo minha luta para fazer uma extensão para o ThingWorx. Tem sido uma experiência bacana: quanto mais eu penso em adicionar funcionalidades, as dificuldades vão aparecendo e eu vou descobrindo melhor como o mecanismo de extensões funciona.

Meu último post antes de falar de autenticação foi sobre a alteração do código de runtime para que a extensão funcionasse. E funcionou só que com um porém: não consegui fazer com que a atualização fosse dinâmica, ou seja, a possibilidade de escolher campos diferentes a serem plotados no mapa.

Minha versão anterior dependia de que o a propriedade fosse definida na criação do Mashup e não em tempo de execução.

Bom, depois de uma pergunta aqui e outra ali e alguns fios de cabelo a menos cheguei em uma versão de código que faz o que quero.

A API (se é que posso chamá-la assim) possui um método chamado updatePropertyInfo.Esse método captura as mudanças de valor na propriedade. Eu já tinha usado antes sem saber para que serve (resultado de CRTL+C, CTRL+V), mas aos poucos vou entendendo.

Também tive que declarar algumas variáveis como globais, fora do bloco if, ou seja, se uma variável não estiver declarada no bloco abaixo ela foi declarada globalmente.

O código ficou assim.

if (updatePropertyInfo.TargetProperty === 'CustomLayerDataField'){
    customLayerDataField = updatePropertyInfo.ActualDataRows;
    return;
}
if (updatePropertyInfo.TargetProperty === 'CustomLayerData'){
    customLayerDataRows = updatePropertyInfo.ActualDataRows;
    var nRows = customLayerDataRows.length;
    var heatmapData=[];
    for (var rowNumber = 0; rowNumber < nRows; rowNumber++) {
        var row = customLayerDataRows[rowNumber];
        heatmapData[rowNumber] = 
{location: new google.maps.LatLng(parseFloat(row[this.getProperty('CustomLayerLocationField')].latitude) , parseFloat(row[this.getProperty('CustomLayerLocationField')].longitude)), weight: parseFloat(row[customLayerDataField[0].SelectedValue])};
    }  
    var heatMapDissipating = this.getProperty('heatMapDissipating');
    var heatMapGradient = this.getProperty('heatMapGradient');
    var heatMapOpacity= this.getProperty('heatMapOpacity')
    var heatMapRadius=this.getProperty('heatMapRadius')
    var heatmap = new google.maps.visualization.HeatmapLayer({
            data: heatmapData,
            dissipating: heatMapDissipating,
            opacity: heatMapOpacity,
            radius: heatMapRadius
        });
    heatmap.setMap(this.map); 
    return;
}

E o resultado:
Mapa para Temperatura
Mapa para Chuvas
 Ainda são apenas testes preliminares e não a aplicação final mas vou atualizando vocês conforme eu evoluir!

Keep it Up!
Ewerton