domingo, 16 de fevereiro de 2020

Robótica - Sensores 2 de 37

No artigo anterior falamos sobre o módulo Joystick, nesse vamos para o nosso segundo módulo denominado KY-019 5V relay, um nome bem complicado para este interessante e útil módulo.

ATENÇÃO - Usaremos uma corrente de 110/220 Voltz todo cuidado é pouco - De maneira alguma isso deve ser usado por crianças (com ou sem supervisão de adultos).

02. Módulo Relé

Segundo a eletrônica sabemos que um Relé (ou Relê) é um interruptor eletromecânico que é acionado quando uma corrente elétrica passa por suas bobinas, isso cria um campo magnético, o resultado e a atração (ou repulção) de uma alavanca.

Traduzindo isso para o bom português quer dizer que podemos ligar ou desligar determinado componente elétrico (lâmpadas, alarme anti-roubo, controlar a abertura/fechamento de uma torneira, brinquedos ou uma tranca elétrica de porta) através do Arduino. Comumente isso é muito usado em circuitos de controle de automação, ou seja, uma pequena corrente para controlar uma grande operação através de um "interruptor automático".

Observe que o módulo possui 2 partes: um circuito de entrada (do lado esquerdo da figura) que permite uma corrente de 30V a 250V e 10A e um circuito de saída (que é ligado ao Arduino) com 3 pinos.

O esquema de ligação é o seguinte:



São três conectores de ligação de entrada do Relé, porém somente os dois primeiros são utilizados, um dos fios da tomada segue para essa entrada e outro fio vai para o dispositivo (que nesse caso é uma lâmpada de bancada). Do outro lado a entrada para o Arduíno é bem simples (boa parte dos outros sensores seguirá o mesmo padrão):
  • - para o GND (ou terra)
  • + para a 5V
  • S para a digital (que iremos ligar no pino 10)
 Feita as ligações vamos para o programa:

#define RELAY 10

void setup() {   
  pinMode(RELAY,OUTPUT);
} 

void loop() {   
  digitalWrite(RELAY,HIGH);
  delay(5000);      
  digitalWrite(RELAY,LOW);
  delay(5000); 
} 

Se alguma vez já viu um programa para acender e apagar um LED verá que não existe a menor diferença. Estabelecemos uma constante RELAY com o valor 10 (isso é realizado somente para dar melhor clareza ao código), no método inicial (setup) definimos a pino 10 como saída. Durante o tempo de vida do programa (loop) ligamos o pino 10, esperamos 5 segundos, desligamos o pino 10 e esperamos mais 5 segundos.

Ou seja, se tudo estiver correto a lâmpada será ligada por 5 segundos e ficará apagada por 5 segundos, e essa ação será repetida. Esse é um componente muito utilizado (pessoalmente tenho mais alguns) principalmente em projetos que necessitam trabalhar com correntes bem mais altas que 5V (que é o padrão do Arduino).

Obrigado e até o próximo sensor.
Fernando Anselmo

Dica: Se possui uma impressora 3D existe uma caixinha bem interessante para este módulo disponível gratuitamente na Thingverse.

sábado, 8 de fevereiro de 2020

Robótica - Sensores 1 de 37

Essa semana chegou pelo correio um pequeno pacote que tinha comprado mês passado da Ali Express, veio um Kit com 37 Sensores. O único problema básico quando se compra esse tipo de produto é que pode esquecer a documentação (é muito raro que exista alguma e se existir estará em Mandarim.

Então tive que correr atrás e localizar um jeito de fazer cada um dos meus novos bebês funcionar e pretendo compartilhar aqui como consegui com cada um deles (incluindo todo o código do Arduíno).


01. Módulo Joystick

O primeiro da lista é esse módulo Joystick com 2 eixos e 1 botão. Este é um sensor analógico que pode ser usado para controlar qualquer coisa que se mova como um carrinho ou um robô articulado. O joystick é uma combinação de 2 potenciômetros analógicos e um interruptor digital.

Sua conexão com o Arduíno conta com 5 entradas:
  • GND - Esse é o fio negativo
  • +5V - Fonte de alimentação até 5 volts
  • URx - Pino analógico para o eixo X (ligamos no pino A0)
  • URy - Pino analógico para o eixo Y (ligamos no pino A1)
  • SW - Switch, quando se presiona o botão (ligamos no pino 2)
Feita as ligações a programação é bem simples:

const int URx = 0;
const int URy = 1;
const int pres = 2;
 
void setup() {
  pinMode(pres, INPUT);
  digitalWrite(pres, HIGH);
  Serial.begin(9600);
}
 
void loop() {
  Serial.print("Pressionado: ");
  Serial.print(digitalRead(pres));
  Serial.print("\n");
  Serial.print("Eixo X: ");
  Serial.print(analogRead(URx));
  Serial.print("\n");
  Serial.print("Eixo Y: ");
  Serial.println(analogRead(URy));
  Serial.print("\n\n");
  delay(500);
}

JoySticks analógicos basicamente são potenciômetros, portanto retornam os valores que podem ser visualizados no Serial Monitor. Os valores de X e Y vão de 0 a 1.023 (sendo o meio 503) e o pino Switch trará 1 ou 0 (quando pressionado).

Ao clicar no monitor serial, veremos os valores. Ao mover o JoyStick ou pressiná-lo, verá os valores sendo alterados.

Obrigado e até o próximo sensor.
Fernando Anselmo

terça-feira, 15 de outubro de 2019

Ciência de Dados - Python e não Python

Com o advento da Ciência de Dados o mundo agora está redescobrindo a linguagem Python, e isso pode ser bem caótico para ela (assim como foi a explosão de Java). Calma que explico, existem muitas pessoas que fazem aqueles cursos de 6 hrs ou leem livros tipo "Python Fluente" e já se acham os donos da linguagem e que conseguem fazer relativamente TUDO. Isso é bem verdade pois o Google, fóruns e livros tipo "Cookbook" ajudam muito.


Com Java acontece muito disso (o mesmo ocorre com JavaScript), basta ver os modelos propostos e os que sumiram com uma velocidade assustadora, um pseudo Arquiteto leu uma trabalho de Pós Graduação, achou interessante e resolveu implantar isso sem fazer um estudo de caso, uma análise de impacto ou nada do gênero e pronto está criado aquele sistema com Wicket + Vue.js + MongoDB.

Em Ciência de Dados e Python penso que a coisa irá acontecer a nível de Modelos Implementados, veremos modelos que irão demorar horas (ou dias) para serem executados e ninguém se incomodará pois o "Cientista" falou que isso se deve por causa da quantidade de dados analisados que são enormes (pelo menos dessa vez ninguém culpará a linguagem, mas sim os dados ou as máquinas).

Falar Pythonico ou Não

Se Python é uma linguagem então devemos falar Pythonico, normalmente para aprendermos algo usamos a "Comparação", fazia assim, agora faço assim. A língua inglesa é difícil de aprender (para os brasileiros) pois sua estrutura gramatical muda. Em linguagens de programação isso também acontece (não, não existe uma Gramática de Python), calma não estou falando de tempos verbais, mas sim de formas no modo de programar.

Vamos falar do método zip() por exemplo, esse é quase exclusivo de Python, Java não isso (e se tem serve para aquilo que provavelmente você deve ter imaginado). Este método serve para iterar duas ou mais listas ao mesmo tempo, como por exemplo:
first = [1, 3, 5, 7, 9]
second = [2, 4, 6, 8, 10]
for x, y in zip(first, se0cond):
  print(x + y)
Ou seja, em a cada iteração um valor de cada uma das listas é puxado, outro método pouco conhecido é o map(), que serve para iterar métodos e listas, vamos imaginar que exista um método criado para calcular a Raiz Quadrada de um número (ou outro mais complexo que deseje):
def raiz(x): 
    return x**0.5
Simples assim, e se vem de outras linguagens provavelmente escreverá algo assim para iterar esse método com elementos de uma lista e colocá-los em outra lista:
raizes = []
nums = [4,9,27,32,78,98,45,22]
for num in nums:
    raizes.append(raiz(num))
Quando na verdade isso deveria ser escrito da seguinte forma:
nums = [4,9,27,32,78,98,45,22]
raizes = map(raiz, nums)

Não estou aqui para condenar ninguém ou qualquer curso ou livro, estou apenas chamando a atenção para um fato que vai ocorrer (sim, rodei um Modelo Preditivo para descobrí-lo) muito em breve, se já não está ocorrendo. Ou seja, não é necessário diminuir sua amostra, não é necessário aumentar seu cluster de máquinas apenas melhorar um pouco seu código. Não Fernando, você está falando besteira e sou EXCELENTE. Muito bem, vamos a um pequeno desafio, veja esse código:
nums = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]

def pares(x):
    return x % 2 == 0

numsPares = []
for num in nums:
    if even(num):
        numsPares.append(num)
Como conhece bem a linguagem sabe que esse código está pegando somente os pares da lista de nums e jogando-os na lista numsPares. Suas opções são:
  1. O código está bom do jeito que está.
  2. Deve ser reescrito para ...
  3. Esse corpo não me pertence.
Como disse não quero condenar ninguém, só quero apenas alertar para um fato e isso pode causar a decadência da linguagem em relação a outras que se mostram mais performáticas (mesmo usadas errôneamente).

Obrigado pela atenção
Fernando Anselmo

Spoiler.

O código em questão deveria ser reescrito usando o método filter(), da seguinte forma:
numPares = filter(pares, nums)

domingo, 6 de outubro de 2019

Ciência de Dados - Matematicamente Falando

Quando comecei a estudar as matérias de "Ciência de Dados" percebi algo bem simples e ao mesmo tempo bem complexo. A cadeira envolve 3 áreas de conhecimento:


Ciência da Computação, Conhecimento de Negócios e Matemática (e Estatística). Possuia as duas primeiras porém me faltava a terceira. E minha pergunta era: Como obter o conhecimento matemático necessário que me falta?

Existem milhares de respostas válidas bem como:
  1. Estudar por conta própria.
  2. Achar um bom curso (tipo Udemy).
  3. Fazer uma Pós em Estatística. 
Optei pela terceira, já tinha feito vários cursos mas nenhum deles me trouxe um conhecimento muito profundo e apenas arranhavam a superfície do que planejava. Antes de continuar devo dizer que a segunda área do conhecimento cristalizei ela através de uma Pós em "Gestão Empresarial Avançada" que é totalmente voltada a problemas de negócio. Então nada mais lógico que procurar uma Pós que fosse totalmente prática e aplicada a problemas do dia a dia através de resoluções matemáticas.

Não pretendo fazer propagando de cursos, não é esse meu objetivo. Meu objetivo é que compreenda que para adquirir determinado conhecimento não basta apenas estudar por conta própria (pois o mercado infelizmente não reconhece esse tipo de ação e exige diplomas de formação acadêmica) ou realizar simples cursos de arranham a superfície (quando o que o mercado exige é que o profissional consiga se virar nas 11, ser o técnico e de preferência o Juiz).

Minha recomendação para essa terceira área do conhecimento é, comece com bons livros e ferramentas, três são essenciais para quem gosta do mundo livre:

PSPP

É uma alternativa ao IBM SPSS, pessoalmente diria uma cópia tipo Ctrl+C e Ctrl+V, tanto que houve a brincadeira das letras, para se ter uma ideia do que estou falando não existem muitos livros de PSPP então utilizo os livros de SPSS para estudar, a sintaxe é exatamente a mesma. Na essência é um software para Análise de Dados que permite análises descritivas e o uso de inferência.

Scilab

Esse é uma alternativa para o famoso Matlab e basicamente trata-se de um ambiente computacional para aplicações científicas totalmente orientado a análise numérica.

Octave

Esse é outra alternativa para o Matlab. Dos três é o mais conhecido e usado por quem conhece matemática, basicamente é quase uma linguagem tanto que é possível usar o Jupyter Notebook para executar seus comandos que podem envolver soluções lineares e não-lineares.

Dica: Se usa o Ubuntu o primeiro e o terceiro vem instalado por padrão (se não estiver procure na Loja com o nome GNU PSPP e GNU Octave - Isso mesmo ambos fazem parte do Projeto GNU) e quanto ao segundo utilize uma AppImage (que facilita muito o processo) através de dois comando no terminal:

$ wget https://github.com/davidcl/Scilab.AppDir/releases/download/6.0.2-1/Scilab-x86_64.AppImage
$ chmod +x Scilab-x86_64.AppImage

Ou baixe a imagem no endereço indicado e forneça permissão de execução no Nautilus.

Esses são apenas 3 dos vários softwares que passei a utilizar quando ingressei nesse mundo de ciência de dados, são gratuitos, leves e qualquer um pode ter no computador. E mais uma dica comece adquirindo um bom livro de Matemática:


E lembre-se que conhecimento nunca é demais.

Obrigado e até a próxima
Fernando Anselmo


sábado, 31 de agosto de 2019

Ciência de Dados - Fatos e Verdades da Tecnologia

Nesses anos todos que estou na área de Informática ouço muitas opiniões pessoais, que não passam disso: "opiniões pessoais". Por exemplo: "A linguagem  Java não é usada para Data Science", só que a verdade é que pode-se dizer que a linguagem não é usada pelos profissionais de Data Science, mas é fortemente usada na construção das ferramentas de Data Science, tais como, Weka, Hadoop e Pentaho.

Outra opinião: "Python está subindo muito, logo, será a linguagem mais usada no mundo", verdade o Python já atingiu a 3ª Posição no Ranking do TIOBE porém a anos fica bringando para se manter nessa posição (que foi a mais alta que conseguiu atingir) nunca chegando nem perto das linguagens Java e C que lideram o ranking. Não se iluda, Python é uma linguagem de Script, não é compilada e sim interpretada e não possui capacidade nem corpo para ser performática, porém é muito fácil de aprender, por esse motivo é usada por Cientistas de Dados, que só precisam de uma linguagem para simular seus modelos.


Outra opinião: "Bancos não relacionais estão tomando a preferência do mercado", sim os bancos não relacionais estão se tornando bem populares porém não chegam nem perto dos grandes líderes como Oracle, MySQL, MS-SQL e Postgres. O mais bem colocado no ranking do DB-Engines é o MongoDB na 5ª Posicão.

Mais uma opinião: "O Cassandra, em breve, deve dominar o mercado", bem como disse anteriormente a preferência continua com os bancos relacionais e acredito que por muitos anos veremos algo híbrido surgir, o Apache Cassandra é um excelente banco, livre e já possui uma excelente maturidade, mas para que isso aconteça terá de vencer bancos como MongoDB, Postgres ou Oracle e mostrar para que veio.

Continuando com outra opinião: "Ferramentas de Análise de Dados deveriam ser feitas somente no Excel", se estamos falando realmente de "Análise de Dados" isso envolve o processamento de muitas informações e não uma simples amostra. Além disso, não se engane, o Excel (ou o Calc - do LibreOffice) são excelentes ferramentas mas de longe conseguem se manter com grandes cargas de dados, inclusive uma boa alternativa a ambos é o Open Refine que possui filtros para limpeza dos dados.

Por favor, não interprete que estou recriminando essas pessoas ou suas opiniões, como disse no começo são "opiniões pessoais" e acredito que cada um tem direito a sua. Porém, devemos sempre saber discernir o que é verdadeiro ou não atrás dessas opiniões.

Obrigado e até a próxima
Fernando Anselmo

quarta-feira, 7 de agosto de 2019

Ciência de Dados - Pacote Inicial

Vamos começar uma nova trilha aqui no blog com o foco totalmente voltado para Ciência de Dados, bom se viveu em Marte nos últimos 4 anos provavelmente não deve ter ouvido nada sobre o que é Ciência de Dados, Big Data, Aprendizado de Máquina, Deep Learning, Internet das Coisas, Estatística Aplicada e Análise Aplicada. Caso contrário notou que esses temas abarrotam a média escrita, falada e solidificada (como diria Odorico Paraguassú).

Por Onde Começo?

Essa é a principal pergunta que todos me fazem, Neste caso mostrarei o ferramental básico para se usar o Aprendizado de Máquina (Machine Learning) com Python. Consideremos o Python 3.6 que é o mais utilizado então já vai de pré-requisito, porém existem outras bibliotecas para se intalar. Considere que o software principal é o Anaconda, que além de empacotar tudo de uma maneira muito funcional, ainda tem um painel de controle para instalações de outras bibliotecas: https://www.anaconda.com/download/.

Se desejar uma IDE (além do Jupyter que já vem com o Anaconda), atualmente usa-se muito o Visual Studio Code, recomendo: https://code.visualstudio.com/. Não sabe Python? Siga o tutorial básico desse site: https://www.tutorialspoint.com/python/index.htm.

Algumas bibliotecas podem ser adicionadas de acordo com a necessidade. Lembrando que é sempre preferível verificar se a biblioteca já não está disponível no Anaconda, para evitar maiores dores de cabeça. As básicas e já instaladas são:
Essas são as básicas e não é apenas necessário conhecê-las deve-se comê-las com farinha (ou açaí), temos mais três softwares para formar um bom conjunto:

Para quem pretende lidar com Redes Neurais e Deep Learning, existem quatro grandes frameworks: TensorFlow, Keras, PyTorch e Theano. Mas antes é bom ler um material introdutório sobre Redes Neurais. Na disciplina de Psicologia Conexionista e Psicobiologia do professor Antônio Carlos Roque: http://sisne.org/Disciplinas/PosGrad/PsicoConex/. Deseja entender como essas redes funcionam através uma explicação visual? Enão visite o "parquinho" do TensorFlow em: http://playground.tensorflow.org.

Depois de ler agora é hora de instalar o TensorFlow. A instalação é um pouco enjoada, então todo cuidado é pouco. Siga os seguintes passos:
  • Instalar o CUDA Toolkit, e cheque se as variáveis do sistema estão corretas (cheque mesmo, existe chances de não terem sido colocadas corretamente pela instalação)
  • Instalar os drivers do CUDA Toolkit
  • Instalar o cuDNN
  • Instalar o TensorFlow, versão CPU ou GPU (de preferência tenha só uma instalação)

É sempre recomendável seguir o passo-a-passo do próprio TensorFlow. Até o link do Stack Overflow dos erros mais comuns tem lá: https://www.tensorflow.org/install/. Ou use o Docker que é bem mais tranquilo. Veja mais em https://www.tensorflow.org/install/docker.

Instalou? Testou? Rodou? Agora não sabe pode onde começar? O próprio TensorFlow tem bons tutoriais para começar a lidar com ele. Recomendo dois tutoriais:

Quer mais tutoriais? Tem também: https://www.tensorflow.org/tutorials/. Nos tutoriais isso fica claro: aprenda a usar o TensorBoard, gerenciador e visualizador das redes neurais do TensorFlow. Até salvar o estado atual da rede para recarregar depois é possível: https://www.tensorflow.org/learn ou quer sentir alguns exemplos na prática? Visite o GitHub do Imanol Schlag em
http://ischlag.github.io e clone alguns projetos. Outras opções?


Achou uma base que deseja trabalhar? Quer sabe como o pessoal anda resolvendo um determinado problema? Então prepare-se para ler artigos, prepare-se para ler MUITOS ARTIGOS e que provavelmente estarão postados aqui: https://arxiv.org/.

Não gosta de ler é prefere vídeos? Vamos a eles, ficou com alguma dúvida em relação a como alguma rede funciona? Provável que o Siraj Raval já tenha explicado: https://www.youtube.com/channel/UCWN3xxRkmTPmbKwht9FuE5A. Quer alguma inspiração de que problema atacar? Deseja saber o que está sendo feito academicamente e comercialmente na atualidade da área? O canal do Deep Learning Brasil, produziu uma playlist com aulas do curso de Deep Learning, com listas de exercícios e até arquiteturas avançadas já implementadas: https://www.youtube.com/channel/UCWg0CObS-JnEtjW69eGh89A. Por fim, na UFG temos a matéria Redes Neurais Profundas, incluídas semestralmente na pós-graduação do Instituto de Informática, onde você pode acompanhar tanto presencialmente quanto remotamente, pois todas as aulas são gravadas. Acompanhe o cronograma da próxima turma pelo site: http://www.inf.ufg.br/mestrado/

Deseja mais alguns sites confiáveis para explicações sobre qualquer problema, O'Reilly Media (https://www.oreilly.com/) e o Medium (https://medium.com/). Não gostou dessa lista e quer um curso próprio para a área? Tem lista disso também:

Esse é apenas uma recomendação básica para ferramentas iniciais na área (existem muitas dessas listas por aí). Usando isso você poderá dar o pontapé inicial e começar a experimentar o que Ciência de Dados pode trazer de novidade.

Obrigado e até a próxima
Fernando Anselmo

quinta-feira, 9 de agosto de 2018

Empregabilidade - Big Data e eu com isso

Até 2003 conseguimos em toda a história da humanidade produzir 5 Exabytes de informação, exatamente apenas 5 (ou alguns podem pensar tudo isso?). Pois saiba que atualmente produzimos isso a cada 2 horas. Antigamente lotar um disco de 1 Terabyte de dado era uma coisa imaginável, hoje compramos um HD com essa quantidade e achamos pouco. O processamento usado na Apolo 11 poderia rodar facilmente em 2 Nitendos.


Isso quer dizer que estamos crescendo exponencialmente nossa capacidade e em breve como daremos conta de tudo isso? A resposta é simples "Novas Tecnologias de Base". Para quem não é da área quando um site Web demora mais de 5 segundos para ser carregado o site é rotulado como lento. 5 segundos (basta contar de 1 a 5 devagar). O maior culpado dessa "demora" está em sua base HTML, JavaScript e CSS.

Com o tempo vimos que surgiram HTML 5 e CSS 3. O JavaScript começa a sofrer mudanças agora com a chegada (em 2017) com o WebAssembly. Linguagens como Java, C++, Python e Assembly ganham cada vez mais espaço pois se mostraram eficientes no tratamento de dados, outras como C# e PHP vem continuamente caindo nas pesquisas. Sinto muito aos fãs mas não sou eu que estou falando isso, basta uma consulta em listas em institutos como Tiobe para verificar a veracidade dessas informações.

Estamos, graças a quantidade de dados que produzimos chegando em um novo patamar porém serão necessários profissionais que lidem com isso. Novos bancos que manipulam Exabytes de informação precisam ser gerenciados e manipulados para que se extraia conteúdo útil disso e pessoas precisam estar dispostas a entender todo esse novo conceito (e não se agarrar aos antigos).

O maior problema como sempre são as pessoas que não desejam a mudança (mesmo ela estando na porta) e acham que o velho SQL conseguirá manipular toda a carga de informação existente. Não vai. Novas máquinas tem surgido a cada dia, mais rápidas, mais eficazes. Novos softwares tem surgido para acompanhá-las basta ver a evolução de sistemas como o Android 9 (que emprega Inteligência Artificial para melhor gerenciar a bateria) ou das distribuições Linux (que abandonaram totalmente o conceito de tela preta e se tornaram páreo para o Windows e o MacOs).

Facebook já possui o reconhecimento automático de fotos e pode prever com 70% de acerto quem é a pessoa, o Google e a IBM investem pesado em AI. Faça uma pesquisa no Mercado Livre sobre algum produto que este aparecerá como destaque em muitos outros sites.

As minhas questões para uma reflexão são: O que estou aprendendo agora que pode me ajudar a entender esse panorama? Fico me amarrando a velhos conhecimentos aprendidos ou pretendo aprender novos? Consigo jogar na lixeira todos os anos de conhecimento para criar novos? Ou vou ficar dizendo para mim mesmo: Isso não vai afetar nada, vai apenas agregar.

A empregabilidade tem a ver com essas coisas, tem a ver o quão rápido você consegue se adaptar a novas tecnologias e não tentar bater de frente a elas simplesmente porque a linguagem que você amava está morrendo. Quer saber o que penso se Java morrer? Foi bom enquanto durou, o que tenho que estudar agora? Xiblots? O Rei está morto, vida longa ao Rei.

Bem vindo a nova Era da Informação.

Obrigado e até a próxima
Fernando Anselmo