domingo, 25 de março de 2012

PinMux na Beaglebone

Dando sequencia no estudo da BeagleBone hoje com o PinMux. PinMux que quer dizer Pino Multiplexador. Primeiro entender o conceito de multiplexação e demultiplexação de sinais. O multiplexador é um dispositivo que garante o envio de dados em um único canal. Na demultiplexação o processo é inverso, o sinal chega em um único canal e é separado em rotas diferentes. Segue a imagem:


Os conceitos do post de hoje são complexos e é necessário um conhecimento aprofundado para o entendimento desses dispositivos eletrônicos.

Na BeagleBone o uso do PinMux é atrelado ao GPIO que faz o controle de sinais PWM e do I2C que é uma forma de envio dados pela serial que utiliza um sistema mestre-escravo.

Agora vamos às ferramentas da BeagleBone. Com a BeagleBone PinMux Tool é possível fazer o controle PinMux das I/O`s da placa utilizando simples formatos de texto em Python, Shell ou Ruby.

A documentação da ferramenta está disponível na pasta doc.
https://github.com/piranha32/beaglebone-pinmux-tool

Para saber mais sobre PinMux na BeagleBone
http://elinux.org/BeagleBoardPinMux

As ferramentas de PinMux são disponíveis para vários tipos de processadores da Texas Instruments
http://www.ti.com/tool/pinmuxtool

Segue um manual PinMux Utility da Texas Instruments onde é possível uma visualização em modo gráfico dos status das portas I/O`s dos processadores. É possível verificar os vários níveis de tensão e a indicação das portas SDA e SDL da interface I2C.
http://processors.wiki.ti.com/index.php/Pin_Mux_Utility_for_ARM_MPU_Processors#Introduction


terça-feira, 20 de março de 2012

SPI Interfaces na Beagleboard

A maioria dos desenvolvedores que está trabalhando com a Beagleboard está tendo um bocado de trabalho. Isso porque a maioria dos dispositivos para estas placas estão sendo desenvolvidos nesse momento. Os desenvolvedores compilam e recompilam e chegam a instalar o Kernel 6, 9, 10 vezes até conseguirem uma solução que nem sempre aparece. Mas certo, é falar do que funciona. A interface SPI na Beagleboard pode ser acessa não apenas através do formato tradicional de programação de microcontroladores (C e Assembly), e sim por sistema de arquivos. O Blog do Brian Hensley está sendo muito bem comentado nesse momento por ele ter conseguido fazer essa proeza e descrever o processo em tutorial. É possível fazer a SPI funcionar através de sistema de arquivos seguindo os passos descritos no blog Brian's Life:

http://www.brianhensley.net/2012/02/spi-working-on-beagleboard-xm-rev-c.html

Para essa compilação é necessário o Kernel do Ubuntu abaixo:

http://waxpraxis.tumblr.com/post/19277633509/ubuntu-on-the-beaglebone-with-userland-spi

Beagleboard e Beaglebone Kernel

Conforme comentei no último post aqui seguem algumas considerações sobre o básico da Beagleboard e da Beaglebone Kernel. Para ambas é possível utilizar a mesma distro. O pessoal tem instalado diversos tipos sistemas operacionais *nix (Linux) na placa. Desde Ubuntu (versões 8,9,10, e 11), sendo que as últimas versões não são muito aconselháveis podendo o processamento ficar lento, até algumas pessoas tentando instalar o BackTrack.
No caso a versão mais aconselhável seria o Kernel feito especificamente para sistemas embarcados. O Kernel está nesse momento na versão 3.2.

Segue um guia quick start da Baglebone:
http://beagleboard.org/static/beaglebone/latest/README.htm

Gerador de imagem da Angstrom
http://narcissus.angstrom-distribution.org/

Como a maioria do pessoal que trabalha com Open Source gosta de mexer no Kernel então algumas versões estão espalhadas em servidores Git de SVN onde os projetos são compartilhados, modificados e compartilhados novamente. Segue mais algumas fontes de Kernel:

https://github.com/koenkooi/linux/tree/beaglebone-3.2

https://github.com/RobertCNelson/linux-dev/commits/am33x-v3.2/


Agora o mais importante, os manuais das placas podem ser encontrados aqui:
http://www.rcn-ee.com/


Manual da BeagleBoard
http://elinux.org/BeagleBoardUbuntu#Demo_Image

Manual da BeagleBone
http://www.circuitco.com/support/index.php?title=BeagleBone


Em posts futuros tentarei abordar um pouco sobre outras potencialidades dessas placas.

segunda-feira, 19 de março de 2012

Beaglebone - Piscando Led

Já fazem alguns meses que eu venho monitorando a evolução dos projetos com a Beaglebone, na verdade desde seu lançamento no ano passado (31 de outubro de 2011). Essa placa vai fazer um estrago no mercado e a maioria das pessoas ainda não sabe o que ela significa.




Beaglebone é uma placa microcontroladora de alta capacidade com um numero de portas I/O elevado. Utiliza o Kernel do Linux embarcado e o pessoal chega a instalar Ubuntu 11. Além do fato de se usar o kernel é possível instalar os programas normais para servidores como Apache, Python, Java, Ruby, PHP. Os controles de onda PWM utilizam um sistema GPIO. Falarei mais a respeito do GPIO e de outros itens de funcionamento da placa além do seu sistema operacional em posts futuros.

Segue o código para o Blink


var ledPin = bone.P8_3;
var ledPin2 = bone.USR3;

setup = function() {
    pinMode(ledPin, OUTPUT);
    pinMode(ledPin2, OUTPUT);
};

loop = function() {
    digitalWrite(ledPin, HIGH);
    digitalWrite(ledPin2, HIGH);
    delay(1000);
    digitalWrite(ledPin, LOW);
    digitalWrite(ledPin2, LOW);
    delay(1000);
};


Segue fonte para maior compreensão do processo:
http://www.gigamegablog.com/2012/01/05/beaglebone-coding-101-blinking-an-led/

Outra fonte para Python
http://blog.makezine.com/2012/03/14/how-to-get-started-with-the-beaglebone/

domingo, 18 de março de 2012

Acesso ao Banco de Dados com MySQLdb em Python

Depois de uma breve pesquisa foi possível entender rapidamente o funcionamento do acesso ao banco de dados em Python através de linha de comando.


  1. import MySQLdb
  2.  
  3. conexao = MySQLdb.connect('host', 'usuario', 'senha', 'banco')
  4. cursor = conexao.cursor()
  5.  
  6. cursor.execute("SELECT * FROM table")
  7.  
  8. with conexao:
  9.     rows = cursor.fetchall()
  10.  
  11.     for row in rows:
  12.         print row
  13.        
  14. cursor.close()
  15. conexao.close()



C API_mysql
mysql_affected_rows()conn.affected_rows()
mysql_autocommit()conn.autocommit()
mysql_character_set_name()conn.character_set_name()
mysql_close()conn.close()
mysql_commit()conn.commit()
mysql_connect()_mysql.connect()
mysql_data_seek()result.data_seek()
mysql_debug()_mysql.debug()
mysql_dump_debug_infoconn.dump_debug_info()
mysql_escape_string()_mysql.escape_string()
mysql_fetch_row()result.fetch_row()
mysql_get_character_set_info()conn.get_character_set_info()
mysql_get_client_info()_mysql.get_client_info()
mysql_get_host_info()conn.get_host_info()
mysql_get_proto_info()conn.get_proto_info()
mysql_get_server_info()conn.get_server_info()
mysql_info()conn.info()
mysql_insert_id()conn.insert_id()
mysql_num_fields()result.num_fields()
mysql_num_rows()result.num_rows()
mysql_options()various options to _mysql.connect()
mysql_ping()conn.ping()
mysql_query()conn.query()
mysql_real_connect()_mysql.connect()
mysql_real_query()conn.query()
mysql_real_escape_string()conn.escape_string()
mysql_rollback()conn.rollback()
mysql_row_seek()result.row_seek()
mysql_row_tell()result.row_tell()
mysql_select_db()conn.select_db()
mysql_set_character_set()conn.set_character_set()
mysql_ssl_set()ssl option to _mysql.connect()
mysql_stat()conn.stat()
mysql_store_result()conn.store_result()
mysql_thread_id()conn.thread_id()
mysql_thread_safe_client()conn.thread_safe_client()
mysql_use_result()conn.use_result()
mysql_warning_count()conn.warning_count()
CLIENT_*MySQLdb.constants.CLIENT.*
CR_*MySQLdb.constants.CR.*
ER_*MySQLdb.constants.ER.*
FIELD_TYPE_*MySQLdb.constants.FIELD_TYPE.*
FLAG_*MySQLdb.constants.FLAG.*


Segue também uma lista de comandos do pacote MySQLdb
http://mysql-python.sourceforge.net/MySQLdb.html

Alguns tipos de Update
http://stackoverflow.com/questions/1307378/python-mysql-update-statement

Mais alguns sites sobre acesso em Python
http://www.htmlstaff.org/ver.php?id=3964

http://defpython.blogspot.com.br/2007/07/python-e-mysql.html

http://zetcode.com/databases/mysqlpythontutorial/ 

sábado, 17 de março de 2012

Radiuino - Radius - Internet of Things

Um novo protocolo de transmissão de dados via radio foi desenvolvido e agora as comunidades ao redor do globo envolvidas com a Internet das Coisas (IoT) estão conversando sobre como fazer expandir essa rede. E no Brasil não é diferente. Esse tipo de transmissão de dados via radio não é autorizado pela Anatel que rege as normas de transmissão de sinais no Brasil. Apesar disso, vários dispositivos começam a surgir em várias partes do mundo acompanhando o Arduino. O Radius é uma dessas plataformas open source. Seguem os links no final da página.



Radiuino - Protocolo de Transmissão
http://radiuino.cc/node/8
Manual
http://radiuino.cc/sites/default/files/Plataforma%20Radiuino%20v16_0.pdf

Radius
http://www.kickstarter.com/projects/443556734/radius-wireless-easy-and-arduino-compatible?ref=search

Normas da Anatel para Transmissão de Ondas
http://www.anatel.gov.br/Portal/verificaDocumentos/documento.asp?numeroPublicacao=252315&assuntoPublicacao=null&caminhoRel=Cidadao-Biblioteca-Acervo%20Documental&filtro=1&documentoPath=252315.pdf


ARM e IoT - Internet of Things

A ARM também está acelerada na corrida provocada pelo Arduino, hoje conhecida como a Internet das Coisas (IoT). O chip em questão é o M0.

Segue link da materia na Info.
http://info.abril.com.br/noticias/tecnologia-pessoal/arm-revela-projeto-de-chip-para-internet-das-coisas-13032012-37.shl

Pra quem não faz nem ideia do que seja a IoT sugiro a leitura:
http://imasters.com.br/artigo/23630/gerencia-de-ti/como-a-internet-das-coisas-vai-influenciar-a-gestao-de-ti 

ChipKit Compatível Arduino Microchip

Parece que a Microchip ficou meio desesperada com o sucesso do Arduino e resolveou lançar uma linha com microcontroladores Arduino compatíveis. Esse brinquedinhos estão já se tornaram febre e provavelmente o mercado de TI seja inundado por esses equipamentos em pouco tempo.


ChipKit Compativel Arduino Uno 32 bits
http://www.digilentinc.com/Products/Detail.cfm?NavPath=2,892,893&Prod=CHIPKIT-UNO32


Para conhecer a linha ChipKit
http://www.digilentinc.com/Products/Catalog.cfm?NavPath=2,892&Cat=18


Integração Arduino + Gmail

O pessoal entrou numa onda de integrar o Arduino com o Gmail. Segue um post do Fernando Pinheiro sobre o assunto.
http://ferpinheiro.wordpress.com/2011/12/06/arduino-notificando-a-chegada-de-novos-emails/

E o pessoal da Hack a Day postou um projeto do Hackerspace Mother onde o lixo é monitorado bloqueando o Google caso ninguém recolha.
http://hackaday.com/2012/02/20/robot-overlords-require-chores-in-return-for-technological-access/ 

ZK Framework + Java + iReport

O post que segue é uma forma padrão de se fazer uma chamada para relatórios do tipo Jasper Reports dentro do framework ZK utilizando o Java. A sacada para uma chamada de Jasper é seguir todos os passos e sempre enviar um objeto para ser aberto dentro do relatório. Objeto vazio não permite a abertura do relatório. O objeto com o conteúdo do relatório pode ser enviado dentro de uma lista. Dentro dessa lista é possível enviar outras listas com o conteúdo de subrelatorios. Ao invés de mandar um objeto também é possível enviar uma conexão e criar o SQL dentro do Jasper. Outra sacada é na configuração, as libs do projeto em Java devem conter a mesma versão do jar utilizado no iReport. Outros exemplos podem ser retirados de dentro do fórum do ZK.

RelatorialComposer.java 


  
  1. import java.io.File;
  2. import java.text.SimpleDateFormat;
  3. import java.util.ArrayList;
  4. import java.util.Calendar;
  5. import java.util.HashMap;
  6. import java.util.Iterator;
  7. import java.util.List;
  8. import java.util.Map;
  9. import model.Chaves;
  10. import net.sf.jasperreports.engine.JRDataSource;
  11. import net.sf.jasperreports.engine.JRException;
  12. import net.sf.jasperreports.engine.JasperExportManager;
  13. import net.sf.jasperreports.engine.JasperFillManager;
  14. import net.sf.jasperreports.engine.JasperPrint;
  15. import net.sf.jasperreports.engine.JasperReport;
  16. import net.sf.jasperreports.engine.data.JRBeanCollectionDataSource;
  17. import net.sf.jasperreports.engine.util.JRLoader;
  18. import net.sf.jasperreports.view.JasperViewer;
  19. import org.zkoss.util.media.AMedia;
  20. import org.zkoss.zk.ui.Component;
  21. import org.zkoss.zk.ui.Executions;
  22. import org.zkoss.zk.ui.WrongValueException;
  23. import org.zkoss.zk.ui.util.GenericForwardComposer;
  24. import org.zkoss.zul.Filedownload;
  25. import org.zkoss.zul.Iframe;
  26. import org.zkoss.zul.Label;
  27. import org.zkoss.zul.Timebox;
  28. import org.zkoss.zul.Window;
  29. public class RelatorialComposer extends GenericForwardComposer {
  30.     Window calendarWin;
  31.     Calendar calendarioInicio;
  32.     Calendar calendarioFim;
  33.     Label msgInicio;
  34.     Label msgFim;
  35.     Label lblDtInicio;
  36.     Label lblDtFim;
  37.     List<String> reportObject;
  38.     public static final SimpleDateFormat dateHourFormat = new SimpleDateFormat(
  39.             "HH:mm");
  40.     public static final SimpleDateFormat dateAndHourFormat = new SimpleDateFormat(
  41.             "dd/MM/yyyy HH:mm");
  42.     private Timebox hrSunInitS1;
  43.     private Timebox hrSunFinalS1;
  44.     private Iframe report;
  45.     List<Chaves>listChaves;
  46.     Chaves chaves = new Chaves();
  47.     Chaves chavesDois = new Chaves();
  48.     /**
  49.      *
  50.      */
  51.     private static final long serialVersionUID = 1L;
  52.     @Override
  53.     public void doAfterCompose(Component comp) throws Exception {
  54.         // TODO Auto-generated method stub
  55.         super.doAfterCompose(comp);
  56.        
  57.        
  58.     }
  59.     public void onClick$createReport() throws JRException {
  60.         // validaData();
  61.         listChaves=new ArrayList<Chaves>();
  62.         // Objeto do dataset
  63.         for (int i = 1; i < 10; i++) {
  64.             chaves.setChave0(i);
  65.             chaves.setChave1(i);
  66.             chaves.setChave2(i);
  67.             chaves.setChave3(i);
  68.             chaves.setChave4(i);
  69.             chaves.setChave5(i);
  70.             chavesDois.setChave0(i);
  71.             chavesDois.setChave1(i);
  72.             chavesDois.setChave2(i);
  73.             chavesDois.setChave3(i);
  74.             chavesDois.setChave4(i);
  75.             chavesDois.setChave5(i);
  76.            
  77.             listChaves.add(chaves);
  78.             listChaves.add(chavesDois);
  79.         }
  80.        
  81.        
  82.        
  83.        
  84.        
  85.         String sourceFileName = "reports/reportTra.jasper";
  86.         String reportSrc = Executions.getCurrent().getDesktop().getWebApp().getRealPath(sourceFileName);
  87.         // Cria o DataSource
  88.         JRBeanCollectionDataSource jrb = new JRBeanCollectionDataSource(listChaves);
  89.         File reportFile = new File(reportSrc);
  90.         JasperReport relatorioJasper = (JasperReport) JRLoader.loadObject(reportFile);
  91.         // Parametros fixo de relatorio
  92.         Map<String, Object> parameters = new HashMap<String, Object>();
  93.         parameters.put("tituloRelat""Relatório por Intervalo Diário");
  94.         JasperPrint print = JasperFillManager.fillReport(relatorioJasper, parameters, jrb);
  95.         final AMedia amedia = new AMedia("reportManagementKey.pdf""pdf","application/pdf", JasperExportManager.exportReportToPdf(print));
  96.         //report.setContent(amedia);
  97.         if(amedia != null){
  98.             Filedownload.save(amedia);
  99.         }
  100.        
  101.        
  102.     }
  103.    
  104. }




relatorial.zul


  
  1. <?page title="" contentType="text/html;charset=UTF-8"?>
  2. <zk>
  3. <window id="calendarWin" title="Relatório Mensal" border="normal" position="middle" width="100%" apply="composition.RelatorialComposer" closable="true">
  4.         <grid id="gridHoliday" style="border:none">
  5.                 <columns>
  6.                     <column align="right"/>
  7.                     <column align="left"/>
  8.                 </columns>
  9.                 <rows>
  10.                     <row>
  11.                         <label value="Relatório:" />
  12.                         <button label="Gerar Relatório" id="createReport" />
  13.                     </row>
  14.                 </rows>
  15.         </grid>
  16.         <hlayout>
  17.             <iframe id="report" />
  18.         </hlayout>    
  19. </window>
  20. </zk>




Outra fonte boa para relatório usando envio de conexão em Java.
http://www.dsc.ufcg.edu.br/~jacques/cursos/daca/html/documentviews/relatorios.htm

Utilizando PHP
http://cachina.wordpress.com/2010/01/29/usando-o-ireport-como-gerador-de-relatorios-para-php/

Libs Jasper Reports
http://sourceforge.net/projects/jasperreports/files/jasperreports/