Mudanças entre as edições de "Encerrado - Elaboração de plataforma para projeto de programação"

De MediaWiki do Campus São José
Ir para navegação Ir para pesquisar
Linha 149: Linha 149:
  
  
7 - Crie um documento com o código C mais abaixo nesta página e salve-o dentro do diretório linux  
+
7 - Crie um documento com o código C abaixo salve-o dentro do diretório linux:
 +
 
 +
[https://docs.google.com/document/d/1EC6Tnj6bTUSp5110ig48DXAmd-g0GoO7bIZ92P_Tf-o/edit Código]
  
 
~/Downloads/hidapi-0.7.0/linux):
 
~/Downloads/hidapi-0.7.0/linux):
Linha 161: Linha 163:
 
sudo ./prog
 
sudo ./prog
  
 
 
 
{{collapse top|Código separado em funções}}
 
#include <stdio.h>
 
#include <stdlib.h>
 
#include "hidapi.h"
 
 
/*===================================Váriaveis globais=======================================*/
 
int res;
 
unsigned char buf[65];
 
#define MAX_STR 255
 
wchar_t wstr[MAX_STR];
 
hid_device *handle;
 
int i;
 
char io, v;
 
 
/*======Função "conectar" utilizada para o programa reconhecer e acessar a placa=============*/
 
 
conectar ()
 
{
 
struct hid_device_info *devs, *cur_dev;
 
 
devs = hid_enumerate(0x0, 0x0);
 
cur_dev = devs;
 
while (cur_dev) {
 
cur_dev = cur_dev->next;
 
}
 
hid_free_enumeration(devs);
 
 
// acessa a placa pelo VID, PID, e opcinalmente com o serial number
 
 
handle = hid_open(0x1234, 0x0001, NULL);
 
}
 
 
/*==========================Função "info" mostra as informações da placa=========================*/
 
 
info ()
 
{
 
// Lê o nome do fabricante
 
res = hid_get_manufacturer_string(handle, wstr, MAX_STR);
 
printf("\nFabricante: %ls\n", wstr);
 
 
// Lê a string do produto
 
res = hid_get_product_string(handle, wstr, MAX_STR);
 
printf("Produto: %ls\n", wstr);
 
 
// Lê o serial number
 
res = hid_get_serial_number_string(handle, wstr, MAX_STR);
 
printf("Serial Number: %ls\n", wstr);
 
 
}
 
 
/*=============Função "enviar" envia um sinal para uma das saídas da placa==========================*/
 
//Parâmetros: enviar(nº da saída); 
 
 
enviar (char saida)
 
{
 
 
printf ("\nmude estado para 1 ou para 0.\n");
 
scanf (" %c", &v);
 
getchar();
 
 
buf[0] = 'O';
 
buf[1] = saida;
 
buf[2] = v;   
 
res = hid_write(handle, &buf[0], 3);
 
 
}
 
 
/*==================Função "receber" envia um sinal para uma das saídas da placa======================*/
 
//Parâmetros: receber(nº da saída);
 
 
receber (char saida)
 
{
 
buf[0] = 'I';
 
buf[1] = saida; 
 
res = hid_write(handle, &buf[0], 2);
 
 
res = hid_read(handle, buf, 1);
 
if (res < 0)
 
printf("Erro na leitura\n");
 
 
// Imprime o buffer retornado.
 
for (i = 0; i < res; i++)
 
printf("\nValor lido = %d \n", buf[i]);
 
}
 
 
 
 
main (/*int argc, char* argv[]*/) {
 
 
/*não é preciso passar parâmetros*/conectar();
 
 
  for (;;) {
 
printf ("Escolha a saída\n");
 
scanf ("%c", &io);
 
 
/*io é uma variavel do tipo CHAR*/enviar(io);
 
// /*io é uma variavel do tipo CHAR*/receber (io);
 
// /*não é necessário passar parâmetros*/info();
 
 
  }
 
}
 
{{collapse bottom}}
 
  
 
{{collapse bottom}}
 
{{collapse bottom}}

Edição das 08h05min de 27 de maio de 2013

Estudos USB

Quarta-feira - 17/04/2013

-Tentativas de enviar sinal pra a porta através do código C da biblioteca "hidapi.h"

-Git - http://fabio-fernandes.com/blog/instalando-e-usando-o-git-no-ubuntu/

-Instalei o programa VB (cedido pela Cerne) no linux(Ubuntu 12.04), através do Wine, porém ele nao funcionou como ja tinha funcionado no Windows. (Estive pensando se o problema seria no linux ou no Wine, pois talvez o wine nao ofereça a comunicaçao necessária ao programa, ou até nao sei se a instalaçao no Wine é 100% equivalente a instalaçao diretamente no Windows)

-Leitura de documentos sobre o Pic 18F2550 (18f2550.h) OBS: Fiquei com dúvida se isso pode servir nesse projeto, pois muitos falam em gravação do microcontrolador. E nao sei se a gravaçao nos interessa.

http://www.vivaolinux.com.br/artigo/Gravacao-de-microcontroladores-PIC-via-USB-pelo-terminal-do-Linux

"Para que os programas em C possam ser gravados no microcontrolador via USB, é necessário compilá-los, ou seja, transformá-los em linguagem de máquina hexadecimal. 

Existem diversos compiladores que podem ser utilizados por esta ferramenta, entre eles o SDCC, o C18, o Hi-Tech e o CCS"

http://www.cerne-tec.com.br/artigousbparte2.pdf

http://burningsmell.org/pic18f2550/

http://www.eletrica.ufpr.br/ufpr2/tccs/150.pdf


Sexta-feira 19/04/2013

Leituras sobre USB Links interessantes: http://www.infowester.com/usb.php

http://www.infowester.com/usb30.php

http://computer.howstuffworks.com/usb1.htm



Segunda-feira 22/04/2013 e terça-feira

Leituras USB:

Capitulo 13 do livro "linux device drivers"

http://bbs.dianyuan.com/bbs/u/34/1129334558.pdf

http://www.beyondlogic.org/usbnutshell/usb1.shtml

http://www.freebsd.org/doc/en/books/arch-handbook/usb-dev.html

citações interessantes:

"Endpoints are the unidirectional access points for communicating with a device. They provide buffers to temporarily store incoming or outgoing data from the device."

Endpoint do tipo interrupt :"Interrupt endpoints transfer small amounts of data at a fixed rate every time the USB host asks the device for data. These endpoints are the primary transport method for USB keyboards and mice. They are also commonly used to send data to USB devices to control the device, but are not generally used to transfer large amounts of data. These transfers are guaranteed by the USB protocol to always have enough reserved bandwidth to make it through."

http://www.beyondlogic.org/usbnutshell/usb4.shtml#Interrupt

"A device interface is a collection of endpoints. For example USB speakers can have an interface for the audio data (Audio Class) and an interface for the knobs, dials and buttons (HID Class). All interfaces in a configuration are active at the same time and can be attached to by different drivers."

"USB interfaces are themselves bundled up into configurations [...]So to summarize, USB devices are quite complex and are made up of lots of different logical units. The relationships among these units can be simply described as follows: • Devices usually have one or more configurations. • Configurations often have one or more interfaces. • Interfaces usually have one or more settings. • Interfaces have zero or more endpoints."


prints do software, para windows, que analiza a comunicaçao USB

https://lh6.googleusercontent.com/epD232KXyedfyV2r_7LLZRQ70bn9gEWPXBxrKLuuMv2gZoexTtcoc_bstDvj-Jg-VA=w1600

https://lh4.googleusercontent.com/f1GPV21XYjF0ZOaL4gIda5OK2CZGP9H1ifx9bDMBSMv-Yrnbybi7YZmMalHCmVRW6Q=w1600

https://lh4.googleusercontent.com/eC1tw7vsLzk0OYylqKx1iYxqdE6O86c-IleXmCCqpbiwDn34FylNniG_Pw9K67wG7g=w1600

documentos com algumas informaçoes que estão auxiliando no estudo da comunicaçao entre host e o device USB:



https://docs.google.com/document/d/1-y3Ze_V60gTRnhb7FxVc1gmjkX2RaLGmtfopfyV2-d0/edit (ultima atualizaçao no dia 05/05/2013)

leitura complementar sobre URBs http://www.makelinux.net/ldd3/chp-13-sect-3


Domingo 5/5/2013 instalaçõ do GCC no windows

http://www.franciscosouza.com.br/2009/04/07/instalando-um-compilador-cc-no-windows/

Comunicão em C com a placa de aquisição de dados

Primeira comunicação feita com sucesso utilizando a linguagem C

Para rodar o programa leia otutorial

Tutorial de conexão e comunicação com a placa de aquisição de dados

O primeiro passo para conseguir se conectar à placa de aquisição de dados, utilizando a liguagem C é fazer todas a configurações necessárias para conseguir compilar o programa utilizando a biblioteca HID.

Links úteis:

Link principal para a biblioteca: http://www.signal11.us/oss/hidapi/
Read-me com explicações mais detalhadas sobre as configurações abaixo: https://docs.google.com/document/d/1LsqJdvBf6gg5KQLJULJwQus9NVtZsaCNOQudspGmFLs/edit

Página de downloads: https://github.com/signal11/hidapi/downloads

1 - Baixe o pacote com os arquivos necessários:

https://github.com/downloads/signal11/hidapi/hidapi-0.7.0.zip

2 - Instale o pacote Libusb 1.0

  1. sudo apt-get install libusb-1.0-0-dev

3 - Instale o pacote Libudev (cabeçalho e biblioteca)

  1. sudo apt-get install libudev-dev

4 - Descompacte o arquivo .zip hidapi-0.7.0.zip baixado no passo 1. Você pode fazer isso manualmente, ou no terminal: No meu caso o arquivo está na pasta Downloads:

  1. cd ~/Downloads

E então:

  1. unzip -a hidapi-0.7.0.zip

5 - entre em hidapi-0.7.0 hidapi-0.7.0/hidapi/ e copie ou mova o arquivo hidapi.h para a pasta linux: (manualmente, ou pelo terminal)

#cd hidapi-0.7.0/hidapi/

E então

  1. mv hidapi.h ../linux/



6 - após descompactar, entre na pasta hidapi-0.7.0/linux e faça o comando make

  1. cd hidapi-0.7.0/linux/
  1. make


7 - Crie um documento com o código C abaixo salve-o dentro do diretório linux:

Código

~/Downloads/hidapi-0.7.0/linux):

8 - Compile o programa: (certifique-se que você esta dentro do diretório “linux” (~/Downloads/hidapi-0.7.0/linux))

gcc prog.c hid-libusb.o `pkg-config libusb-1.0 libudev --libs` -o prog

9 - Rode o programa:

sudo ./prog


Configuração em versões anteriores a 12.04

- Ao entrar no diretório drivers (/sys/bus/usb/drivers) é possível ver todos os driver que estão sendo utilizados no momento no PC;

- para a plaquinha, o objetivo é usar o driver usbtouchscreen. Para ver se este driver existe na versão do ubuntu sendo utilizada:

modinfo usbtouchscreen

- Para ver todos os driver instalados no PC basta acessar /lib/modules/3.0.0-12-generic/kernel/drivers/ (OBS: pode ser que tenha que mudar a versão ali onde no meu ubuntu (11.10) mostra 3.0.0-12-generic, mas como só existe um diretório dentro do modules, fica fácil)

- Quando conectado, automaticamente o PC bota o driver USBHID, temos que tirar ele, com o unbind:

echo -n "1-4.4:1.0" > /sys/bus/usb/drivers/usbhid/unbind

OBS: achei o endereço "1-4.4:1.0" dentro do diretório usbhid com o comando ls (esse endereço talvez varie de PC para PC)

e para botar a plaquinha no usbtouchscreen temos que levantar o driver usbtouchscreen:

modprobe usbtouchscreen

e entao:

echo -n "1-4.4:1.0" > /sys/bus/usb/drivers/usbtouchscreen/bind

- Após fazer isso, verifique se funcionou, desconectando e conectando a plaquinha do PC e utilizando o comando dmesg; pode ser que não funcione de primeira, acredito que os drivers fiquem ``brigando``, então eu fiz a seguinte ordem de comandos:

​​rmmod usbhid modprobe usbtouchscreen echo -n "1-4.4:1.0" > /sys/bus/usb/drivers/usbhid/unbind modprobe usbhid echo -n "1-4.4:1.0" > /sys/bus/usb/drivers/usbtouchscreen/bind modprobe usbhid

ATENÇÃO: tive que fazer o comando rmmod USBHID para que a plaquinha nao tivesse nenhuma chance de conectar nesse driver, porem isso fez com que meu mouse USB parasse de funcionar, para ele voltar a funcionar tive que fazer modprobe USBHID no final, resolvendo meu problema. Mas isso é um problema nos computadores que usam mouse e teclado usb, pois quando o comando rmmode for dado, eles serão desconectados, a soluçao é escrever esses comandos, em lista, como fiz acima, e colá-los todos juntos no terminal, fazendo com que o terminal execute todos de uma vez, ou criar um arquivo .sh

Após essas configurações,desconectando e conectando a plaquinha e utilizando o comando dmesg,ja deve ser possível ver que ela esta utilizando "input..." e nao mais "generic-usb..."


link interessante:Adding new vendor and product IDs to an existing USB driver on Linux

  1. su
  1. modprobe usbtouchscreen echo 1234 0001 > /sys/bus/usb/drivers/usbtouchscreen/new_id


Pontos a serem verificados

  • Versão e drivers do linux que estão sendo usados;

modinfo usbtouchscreen > usbtouchscreen

usbtouchscreen

modinfo input >

input



  • Fazer um teste no Redes II e Inf para verificar se placa funciona (falar com Ricardo - ricardo.ifsc@gmail.com );



  • Documentar o driver da usb que está sendo usado (input) e verificar como trocar o driver dinamicamente para testar em outros PC;
  • Testar as entradas e saídas analógicas;

Saída: modificar a função enviar():


buf[0] = 'D';

buf[1] = '1';

buf[2] = '2';

buf[3] = '5';

buf[4] = '5';

res = hid_write(handle, &buf[0], 5);


Onde 1 é o numero da saída e 255 representa 5V 127 = 2,5V 0 = 0V e assim por diante.

  • Especificar a "biblioteca" a ser disponibilizada para os alunos;
  • estudar como construir uma biblioteca no Linux (lib ver [1]);
  • testes de desempenho