Mudanças entre as edições de "Encerrado - Elaboração de plataforma para projeto de programação"
m (moveu Elaboração de plataforma para projeto de programação para Encerrado - Elaboração de plataforma para projeto de programação) |
|||
(74 revisões intermediárias pelo mesmo usuário não estão sendo mostradas) | |||
Linha 1: | Linha 1: | ||
+ | {{collapse top|desenvolvimento da bolsa}} | ||
{{collapse top|Estudos USB}} | {{collapse top|Estudos USB}} | ||
Linha 149: | Linha 150: | ||
− | 7 - Crie um documento com o código C | + | 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 164: | ||
sudo ./prog | sudo ./prog | ||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
{{collapse bottom}} | {{collapse bottom}} | ||
Linha 368: | Linha 266: | ||
*estudar como construir uma biblioteca no Linux (lib ver [http://www.vivaolinux.com.br/artigo/Bibliotecas-estaticas-c-c++/?pagina=2]); | *estudar como construir uma biblioteca no Linux (lib ver [http://www.vivaolinux.com.br/artigo/Bibliotecas-estaticas-c-c++/?pagina=2]); | ||
*testes de desempenho | *testes de desempenho | ||
+ | |||
+ | *Biblioteca em C e Código .sh para conectar corretamente a plaquinha ao driver | ||
+ | |||
+ | {{collapse top|Biblioteca em C para programção}} | ||
+ | Todos os arquivos utilizados neste tópico podem ser baixados [https://drive.google.com/#folders/0B9B1PtWR62blYVFBQnpBNkNITms aqui (LINK1)]: | ||
+ | |||
+ | Os passos para criar esta biblioteca estão melhores explicados neste [http://www.delorie.com/djgpp/doc/ug/larger/archives.html link]. Para esta biblioteca em particular, foram utilizados 3 arquivos.o (que podem ser baixados no LINK1), são eles: | ||
+ | |||
+ | prog.o (contém as funções da biblioteca feita para a disciplina de programação e também a biblioteca Hidapi; | ||
+ | |||
+ | hid-libusb.o (contém a biblioteca hid-libusb); | ||
+ | |||
+ | libusb.o (contém a biblioteca libusb); | ||
+ | |||
+ | Estes arquivos foram então colocados dentro do arquivo "bibprg.a" | ||
+ | |||
+ | Para utilizar a plaquinha então, é necessário ter o arquivo bibprg.a, e do arquivo bibprg.h que terá que ser utilizado como cabeçalho em todos os códigos que usem a biblioteca bibprg | ||
+ | |||
+ | {{collapse bottom}} | ||
+ | =Rodando programas em C= | ||
+ | |||
+ | 1: fazer o download da biblioteca: (upar no google docs | ||
+ | |||
+ | |||
+ | Passo 1a: | ||
+ | Versões em que o driver sendo utilizado pelo pc é o usbhid: | ||
+ | OBS: O driver pode ser visto com o comando usb-devices (procurando pelo device com nome: Cerne Tec) | ||
+ | com o comando dmesg é possivel ver outro "erro", a saída correta para este comando deve ser "input: Cerne..." e nao "Generic-USB..." | ||
+ | |||
+ | Se o driver sendo utilizado é o usbhid (generic-usb), siga os passos abaixo: | ||
+ | - Descompacte a pasta biblioteca; | ||
+ | - Entre no diretório biblioteca; | ||
+ | - Como root, execute o arquivo .sh (MELHORAR para nao precisar ser root) | ||
+ | |||
+ | ATENÇÃO: não adianta seguir em frente se o driver ainda nao foi reconhecido corretamente, confirme isso conectando | ||
+ | (ou tirando e reconectando a placa) e entao com o comando dmesg: veja se existe esta linha: | ||
+ | input: Cerne Tec... | ||
+ | se nao, repita o passo 1a. | ||
+ | |||
+ | Passo2: | ||
+ | |||
+ | 2 - Instale o pacote Libusb 1.0 | ||
+ | |||
+ | #sudo apt-get install libusb-1.0-0-dev | ||
+ | |||
+ | 3 - Instale o pacote Libudev (cabeçalho e biblioteca) | ||
+ | |||
+ | #sudo apt-get install libudev-dev | ||
+ | |||
+ | 4 - Existem 2 programas para testes, eles podem ser compilados: | ||
+ | |||
+ | gcc ptest.c libprg.a -lusb-1.0 -o teste | ||
+ | |||
+ | e | ||
+ | |||
+ | gcc analo.c libprg.a -lusb-1.0 -o analogic | ||
+ | |||
+ | OBS: Caso o seu sistema seja 64bits, utilize no lugar de libprg.a a bibprg.a | ||
+ | |||
+ | |||
+ | Botar o script shell pra rodar ja no boot; (Feito no meu PC pessoal, testarei no IFSC); | ||
+ | |||
+ | Mudar a permissão de acesso a plaquinha (feito com chmod); construir uma regra udev; | ||
+ | |||
+ | "Mais uma dica é que, normalmente, novos dispositivos são criados com permissão de escrita somente para o root, até que você as modifique manualmente, usando o comando "chmod". O udev permite ajustar as permissões, modificando o dono, grupo e permissões de acesso do dispositivo. Isso pode ser usado para que scanners e outros dispositivos fiquem automaticamente acessíveis para todos os usuários do sistema, evitando dores de cabeça em geral, ou fazer com que um pendrive ou outro dispositivo em particular fique disponível apenas para um determinado usuário, mas não para os demais."[http://www.hardware.com.br/guias/programando-shell-script/criando-regras-udev.html] | ||
+ | |||
+ | =metas -semana= | ||
+ | Termometro digital: | ||
+ | http://www.arnerobotics.com.br/eletronica/termometro_digital_w_PIC_DS1620.htm | ||
+ | |||
+ | |||
+ | Estudo Blutooth no linux; | ||
+ | socket e funções; | ||
+ | |||
+ | http://www-usr.inf.ufsm.br/~giovani/sockets/sockets.txt | ||
+ | |||
+ | http://www-usr.inf.ufsm.br/~giovani/sockets/sockets1.pdf | ||
+ | |||
+ | =Criando biblioteca em C= | ||
+ | |||
+ | utilizando as informaçoes deste [http://www.delorie.com/djgpp/doc/ug/larger/archives.html site], criei a bilibioteca com as funções do projeto | ||
+ | |||
+ | tendo os arquivos ".o", hid-libusb.o, libusb.o, e prog.o criei a bilbioteca libprg.a: | ||
+ | |||
+ | ar rvs libprg.a hid-libusb.o, libusb.o, e prog.o | ||
+ | |||
+ | e utilizando o arquivo libprg.h ja foi possível rodar os programas, apenas lembrando de compilar o programa da seguinte forma | ||
+ | |||
+ | gcc programa.c libprg.a -lusb-1.0 -o programa | ||
+ | |||
+ | para que a biblioteca possa ser utilizada como uma padrao do sistem (-l...), basta copiar o arquivo "libprg.a" e entao compilar o programa utilizando "-lprg" | ||
+ | |||
+ | =Sensor de temperatura LM35= | ||
+ | |||
+ | O LM35 é um sensor de temperatura linear que fornece 10mV para cada grau celcius que ele medir. Ou seja, se ele fornecer 100mV, significa que ele está medindo 10ºC.[http://blog.webtronico.com/?p=57] | ||
+ | |||
+ | <center>{{#ev:youtube|l9n-8wzex7I#!}} </center> | ||
+ | |||
+ | Por retornar um tensão e ser ligado em 5V, acredito que seja uma boa opção para trabalharmos com medidas de temperaturas. | ||
+ | |||
+ | |||
+ | ---- | ||
+ | =Comunicação bluetooth (Appinventor e C)= | ||
+ | Fonte: [http://wiki.sj.ifsc.edu.br/index.php/Uso_do_Bluetooth_com_App_Inventor_e_programa_C Uso do Bluetooth com App Inventor e programa C] | ||
+ | |||
+ | [http://www.jstuber.net/lego/nxt-programming/bluetooth-linux.html How to play with Bluetooth under Linux] | ||
+ | |||
+ | Comandos iniciais: | ||
+ | |||
+ | instalar ferramentas e bibliotecas | ||
+ | |||
+ | sudo apt-get install bluez-utils | ||
+ | sudo apt-get install libbluetooth3-dev | ||
+ | |||
+ | Configurar a porta serial (SP), neste exemplo o canal 3 : | ||
+ | |||
+ | sdptool add --channel=3 SP | ||
+ | |||
+ | Código C, funcionando, (com o canal 3, pode ser mudado, se necessário, na linha 33) | ||
+ | <syntaxhighlight lang=c> | ||
+ | #include <stdio.h> | ||
+ | #include <unistd.h> | ||
+ | #include <stdlib.h> | ||
+ | #include <string.h> | ||
+ | #include <sys/socket.h> | ||
+ | #include <bluetooth/bluetooth.h> | ||
+ | #include <bluetooth/rfcomm.h> | ||
+ | #include <errno.h> | ||
+ | #include <sys/types.h> | ||
+ | #include <netinet/in.h> | ||
+ | |||
+ | |||
+ | int main(int argc, char **argv) | ||
+ | { | ||
+ | struct sockaddr_rc loc_addr = { 0 } , rem_addr = { 0 }; | ||
+ | char buf[1024] = { 0 }; | ||
+ | int s, client, bytes_read; | ||
+ | socklen_t opt = sizeof(rem_addr); | ||
+ | |||
+ | // allocate socket http://www.br-c.org/doku.php?id=socket | ||
+ | if ((s = socket(AF_BLUETOOTH, SOCK_STREAM, BTPROTO_RFCOMM))==-1){ | ||
+ | printf("Problemas na criação do socket\n"); | ||
+ | exit(-1); | ||
+ | } | ||
+ | |||
+ | // bind socket to port 1 of the first available | ||
+ | // local bluetooth adapter | ||
+ | //http://www.br-c.org/doku.php?id=bind | ||
+ | |||
+ | loc_addr.rc_family = AF_BLUETOOTH; | ||
+ | loc_addr.rc_bdaddr = *BDADDR_ANY; | ||
+ | //str2ba( endereco, &loc_addr.rc_bdaddr ); | ||
+ | loc_addr.rc_channel = (uint8_t) 3; | ||
+ | if (bind(s, (struct sockaddr *)&loc_addr, sizeof(loc_addr))==-1){ | ||
+ | printf("Problemas no bind\n"); | ||
+ | exit(-1); | ||
+ | } | ||
+ | |||
+ | |||
+ | //listen http://www.br-c.org/doku.php?id=listen | ||
+ | printf("Preparando para listen..\n"); | ||
+ | // put socket into listening mode | ||
+ | if (listen(s, 1)<0) | ||
+ | printf("Problemas de listen...\n"); | ||
+ | |||
+ | //http://www.br-c.org/doku.php?id=accept | ||
+ | printf("Preparando para accept..\n"); | ||
+ | // accept one connection | ||
+ | |||
+ | if ((client = accept(s, (struct sockaddr *)&rem_addr, &opt))<0){ | ||
+ | perror("accept: "); | ||
+ | exit(1); | ||
+ | } | ||
+ | |||
+ | printf("Preparando para leitura..\n"); | ||
+ | // ba2str( &rem_addr.rc_bdaddr, buf ); | ||
+ | fprintf(stderr, "accepted connection from %s\n", buf); | ||
+ | memset(buf, 0, sizeof(buf)); | ||
+ | |||
+ | // read data from the client | ||
+ | bytes_read = read(client, buf, sizeof(buf)+1); | ||
+ | if( bytes_read > 0 ) { | ||
+ | printf("received [%s]\n", buf); | ||
+ | } | ||
+ | |||
+ | //envia uma resposta | ||
+ | strcpy(buf,"ALO CELULAR!"); | ||
+ | write (client, buf, sizeof(buf)); | ||
+ | sleep(10); | ||
+ | // close connection | ||
+ | close(client); | ||
+ | close(s); | ||
+ | return 0; | ||
+ | } | ||
+ | |||
+ | </syntaxhighlight> | ||
+ | |||
+ | Para compilar o programa: | ||
+ | gcc rcomm-server.c -lbluetooth -o rcomm-server | ||
+ | |||
+ | |||
+ | |||
+ | APPINVENTOR: | ||
+ | |||
+ | [http://db.tt/WuJAUEbD Dowload do .apk (primeira versão funcional)] | ||
+ | Note que a variável MAC deverá conter o endereço MAC do computador em uso. | ||
+ | |||
+ | [[Arquivo:MACappinventor.jpg|300px]] | ||
+ | |||
+ | Para saber o seu endereço MAC: | ||
+ | hcitool dev | ||
+ | |||
+ | {{collapse bottom}} | ||
+ | {{collapse top| Ao usuário}} | ||
+ | |||
+ | =Placa de aquisição de dados= | ||
+ | |||
+ | *Saídas digitais | ||
+ | |||
+ | Existem 3 saídas digitais na placa, e essas são chamadas de OUT1, OUT2 e OUT3. | ||
+ | |||
+ | [[Arquivo:saida_digital.jpg|600px]] | ||
+ | |||
+ | Essas saídas são energizadas, e quando estão ligadas enviam 5V a saída escolhida. | ||
+ | |||
+ | |||
+ | |||
+ | *Entradas digitais | ||
+ | |||
+ | Existem, também, 3 entradas digitais, que são nomeadas INP1, INP2 e INP3. | ||
+ | |||
+ | [[Arquivo:entrada_digital.jpg|600px]] | ||
+ | |||
+ | Essas entradas são do tipo seco, o que significa que elas ficam ativas quando aterradas(GND). | ||
+ | |||
+ | |||
+ | |||
+ | *Saídas analógicas | ||
+ | |||
+ | Existem 2 saídas analógicas, e essas nomeadas DA1 e DA2. | ||
+ | |||
+ | [[Arquivo:saida_analogica.jpg|500px]] | ||
+ | |||
+ | Essas saídas podem ser ajustadas para mandar tensões entre 0V e 5V. | ||
+ | |||
+ | |||
+ | |||
+ | *Entradas analógicas | ||
+ | |||
+ | As 8 entradas analógicas existentes na placa são nomeadas como AD1, AD2, AD3...AD8 | ||
+ | |||
+ | [[Arquivo:entrada_analogica.jpg|500px]] | ||
+ | |||
+ | Estas entradas suportam tensões de até 10V | ||
+ | |||
+ | =Instalação= | ||
+ | |||
+ | Fazer o dowload do arquivo bibprg neste link: [http://db.tt/17JRNYpK Download] | ||
+ | |||
+ | Intruções para instalação: | ||
+ | |||
+ | Na pasta make: | ||
+ | |||
+ | -Dentro do arquivo shell.sh, no campo "SENHA". Botar senha de root do PC em uso; | ||
+ | |||
+ | -Dentro do arquivo Perm-Cerne.rules, na segunda linha, no campo OWNER="Aluno". Mudar "Aluno" para o nome do usuário do computador. | ||
+ | |||
+ | feito isso, basta que, a partir do terminal, seja feito o comando make dentro da pasta make. | ||
+ | |||
+ | =Criando programas em C utilizando a biblioteca prg= | ||
+ | |||
+ | As seguintes funções estão disponíveis nesta biblioteca: | ||
+ | |||
+ | *função conectar: | ||
+ | esta função conecta a plaquinha ao host PC | ||
+ | |||
+ | Parâmetros: não possui | ||
+ | |||
+ | como utilizar: | ||
+ | conectar (); | ||
+ | |||
+ | |||
+ | *Função "info" | ||
+ | esta função retorna informações da placa. Pode retornar o nome do fabricante e o string do produto. | ||
+ | Parâmetros: não possui | ||
+ | |||
+ | como utilizar: | ||
+ | info (); | ||
+ | |||
+ | |||
+ | *Função "enviar_digital" | ||
+ | Envia um sinal para uma das 3 saídas digitais da placa de aquisição | ||
+ | |||
+ | como utilizar: | ||
+ | |||
+ | Parâmetros: 2 parâmetros do tipo char, onde o primeiro representa uma saída digital (1, 2 ou 3) e o segundo representa o estado da saída, podendo ser 1(nível alto) ou 0(nível baixo). | ||
+ | |||
+ | enviar_digital (saída, estado); | ||
+ | |||
+ | /*IMPORTANTE: as varíaveis saída e estado, sao do tipo CHAR*/ | ||
+ | ou | ||
+ | |||
+ | enviar_digital (‘1’, ‘1’) | ||
+ | |||
+ | /*saída 1 é colocada em nivel alto(5V)*/ | ||
+ | |||
+ | |||
+ | *Função "enviar_analogica" | ||
+ | função utilizada para enviar um sinal para uma das 2 saídas analógicas da placa de aquisição | ||
+ | |||
+ | como utilizar: | ||
+ | Parâmetros: 2 parâmetros do tipo char, onde o primeiro representa uma saída analógica (1 ou 2) e o segundo é uma string que representa o estado da saída, podendo esta variar de “000” a “255”. Onde “000” é 0V e 255 é 5V. | ||
+ | Outras tensões podem ser encontradas através de calculos simples, como 2,5V “127” | ||
+ | |||
+ | enviar_analogica (saida, estado); | ||
+ | |||
+ | /*Onde a variavel saida e estado sao do tipo CHAR*/ | ||
+ | |||
+ | ou | ||
+ | |||
+ | enviar_analogica (‘1’, “127”); | ||
+ | |||
+ | /*onde a saída analógica 1 está sendo energizada com aproximadamente 2.5V*/ | ||
+ | |||
+ | |||
+ | *Função "receber_digital" | ||
+ | |||
+ | Função utilizada para receber infotrmações das entradas analógicas; | ||
+ | A entrada digital desta placa é do tipo seco. Ela retornará 0 caso a entrada NÃO estiver aterrada, e 1 se estiver. | ||
+ | |||
+ | |||
+ | como utilizar: | ||
+ | |||
+ | Parâmetros: receber(nº da saída); | ||
+ | Retorno: o retorno desta função é um inteiro (int) | ||
+ | |||
+ | receber_digital (char saida) ; | ||
+ | |||
+ | ou | ||
+ | |||
+ | receber_digital (‘1’) ; | ||
+ | |||
+ | /*onde a função retornará 0 ou 1 da entrada 1 */ | ||
+ | /*Existem 3 entradas digitais, portanto a variavel saída pode ser 1, 2 ou 3*/ | ||
+ | |||
+ | |||
+ | *Função "receber_analogica" | ||
+ | Função utilizada para receber infotrmações das entradas analógicas; | ||
+ | As entradas analógicas retornam valores de 0,00V a 9,99V; | ||
+ | |||
+ | como utilizar: | ||
+ | |||
+ | Parâmetros: receber(nº da saída); | ||
+ | Retorno: o retorno desta função é um número real (float) | ||
+ | |||
+ | receber_analogica (char saida) ; | ||
+ | |||
+ | ou | ||
+ | |||
+ | receber_analogica (‘1’) ; | ||
+ | |||
+ | /*onde a função retornará retornará um valor entre 0,00 e 9,99 */ | ||
+ | /*Existem 8 entradas analogicas, portanto a variavel saída pode ser 1, 2, 3, 4, 5, 6, 7 ou 8*/ | ||
+ | |||
+ | |||
+ | *Função "print_display" | ||
+ | /*Função utilizada para imprimir um mensagem no display lcd*/ | ||
+ | |||
+ | como utilizar: | ||
+ | |||
+ | //Parâmetros: print_display(linha,"mensagem"); | ||
+ | |||
+ | print_display (int linha, char mensagem[]); | ||
+ | |||
+ | |||
+ | *Função "limpar_display" limpa o display | ||
+ | /*Função utilizada para limpar o display*/ | ||
+ | |||
+ | como utilizar: | ||
+ | |||
+ | //Parâmetros: não possui | ||
+ | |||
+ | limpar_display(); | ||
+ | |||
+ | =Exemplos= | ||
+ | |||
+ | Sempre lembrando do arquivo de cabeçalho "bibprg.h" que está dentro da pasta que foi baixada | ||
+ | |||
+ | Saída digital | ||
+ | <syntaxhighlight lang=c> | ||
+ | #include <stdio.h> | ||
+ | #include "bibprg.h" | ||
+ | |||
+ | main (){ | ||
+ | |||
+ | char saida='1', estado='0'; | ||
+ | |||
+ | conectar (); | ||
+ | |||
+ | enviar_digital ('1','1'); | ||
+ | sleep (1); | ||
+ | enviar_digital (saida,estado); | ||
+ | } | ||
+ | </syntaxhighlight> | ||
+ | Lembrando que o dois parâmetros são do tipo CHAR | ||
+ | |||
+ | |||
+ | Saída analógica | ||
+ | <syntaxhighlight lang=c> | ||
+ | #include <stdio.h> | ||
+ | #include "bibprg.h" | ||
+ | |||
+ | main (){ | ||
+ | |||
+ | char saida='1', estado[3]="000"; | ||
+ | |||
+ | conectar (); | ||
+ | |||
+ | enviar_analogica('1', "130"); | ||
+ | sleep(2); | ||
+ | enviar_analogica(saida, estado); | ||
+ | } | ||
+ | </syntaxhighlight> | ||
+ | Os dois parâmetros são do tipo CHAR, sendo o segundo uma cadeia de caracteres que varia de 000 á 255 | ||
+ | |||
+ | |||
+ | Entrada digital | ||
+ | <syntaxhighlight lang=c> | ||
+ | #include <stdio.h> | ||
+ | #include "bibprg.h" | ||
+ | |||
+ | main (){ | ||
+ | |||
+ | char saida='1'; | ||
+ | |||
+ | conectar (); | ||
+ | |||
+ | printf ("%d\n", receber_digital ('1')); | ||
+ | sleep (3); | ||
+ | printf ("%d\n", receber_digital (saida)); | ||
+ | } | ||
+ | </syntaxhighlight> | ||
+ | Parâmetro do tipo CHAR | ||
+ | |||
+ | |||
+ | Entrada analógica | ||
+ | <syntaxhighlight lang=c> | ||
+ | |||
+ | #include <stdio.h> | ||
+ | #include "bibprg.h" | ||
+ | |||
+ | main (){ | ||
+ | |||
+ | conectar (); | ||
+ | |||
+ | printf("%f\n",receber_analogica('1')); | ||
+ | sleep (2); | ||
+ | printf("%f\n",receber_analogica('1')); | ||
+ | } | ||
+ | </syntaxhighlight> | ||
+ | Parâmetro do tipo CHAR | ||
+ | |||
+ | Display | ||
+ | |||
+ | <syntaxhighlight lang=c> | ||
+ | #include <stdio.h> | ||
+ | #include "bibprg.h" | ||
+ | |||
+ | main(){ | ||
+ | |||
+ | int i=12; | ||
+ | char mensagem[50]="Fim"; | ||
+ | |||
+ | conectar(); | ||
+ | |||
+ | for(;;){ | ||
+ | print_display (1,"Linha 1 display LCD"); | ||
+ | sleep(1); | ||
+ | |||
+ | print_display (2,"Linha 2 display LCD"); | ||
+ | sleep(1); | ||
+ | |||
+ | print_display (12,"Linhas 1 e 2 display LCD"); | ||
+ | sleep(1); | ||
+ | |||
+ | print_display (i, mensagem); | ||
+ | sleep(1); | ||
+ | |||
+ | } | ||
+ | } | ||
+ | </syntaxhighlight> | ||
+ | Onde a variável "i" é do tipo inteiro e a "mensagem" é uma cadeia de caracteres | ||
+ | |||
+ | Ao fim, basta compilar da seguinte forma: | ||
+ | |||
+ | gcc arquivo.c -lprg -lusb-1.0 -o arquivo | ||
+ | |||
+ | =Comunicação bluetooth (Appinventor e C)= | ||
+ | Fonte: [http://wiki.sj.ifsc.edu.br/index.php/Uso_do_Bluetooth_com_App_Inventor_e_programa_C Uso do Bluetooth com App Inventor e programa C] | ||
+ | |||
+ | [http://www.jstuber.net/lego/nxt-programming/bluetooth-linux.html How to play with Bluetooth under Linux] | ||
+ | |||
+ | Comandos iniciais: | ||
+ | |||
+ | instalar ferramentas e bibliotecas | ||
+ | |||
+ | sudo apt-get install bluez-utils | ||
+ | sudo apt-get install libbluetooth3-dev | ||
+ | |||
+ | Configurar a porta serial (SP), neste exemplo o canal 3 : | ||
+ | |||
+ | sdptool add --channel=3 SP | ||
+ | |||
+ | Código C, funcionando, (com o canal 3, pode ser mudado, se necessário, na linha 33) | ||
+ | <syntaxhighlight lang=c> | ||
+ | #include <stdio.h> | ||
+ | #include <unistd.h> | ||
+ | #include <stdlib.h> | ||
+ | #include <string.h> | ||
+ | #include <sys/socket.h> | ||
+ | #include <bluetooth/bluetooth.h> | ||
+ | #include <bluetooth/rfcomm.h> | ||
+ | #include <errno.h> | ||
+ | #include <sys/types.h> | ||
+ | #include <netinet/in.h> | ||
+ | |||
+ | |||
+ | int main(int argc, char **argv) | ||
+ | { | ||
+ | struct sockaddr_rc loc_addr = { 0 } , rem_addr = { 0 }; | ||
+ | char buf[1024] = { 0 }; | ||
+ | int s, client, bytes_read; | ||
+ | socklen_t opt = sizeof(rem_addr); | ||
+ | |||
+ | // allocate socket http://www.br-c.org/doku.php?id=socket | ||
+ | if ((s = socket(AF_BLUETOOTH, SOCK_STREAM, BTPROTO_RFCOMM))==-1){ | ||
+ | printf("Problemas na criação do socket\n"); | ||
+ | exit(-1); | ||
+ | } | ||
+ | |||
+ | // bind socket to port 1 of the first available | ||
+ | // local bluetooth adapter | ||
+ | //http://www.br-c.org/doku.php?id=bind | ||
+ | |||
+ | loc_addr.rc_family = AF_BLUETOOTH; | ||
+ | loc_addr.rc_bdaddr = *BDADDR_ANY; | ||
+ | //str2ba( endereco, &loc_addr.rc_bdaddr ); | ||
+ | loc_addr.rc_channel = (uint8_t) 3; | ||
+ | if (bind(s, (struct sockaddr *)&loc_addr, sizeof(loc_addr))==-1){ | ||
+ | printf("Problemas no bind\n"); | ||
+ | exit(-1); | ||
+ | } | ||
+ | |||
+ | |||
+ | //listen http://www.br-c.org/doku.php?id=listen | ||
+ | printf("Preparando para listen..\n"); | ||
+ | // put socket into listening mode | ||
+ | if (listen(s, 1)<0) | ||
+ | printf("Problemas de listen...\n"); | ||
+ | |||
+ | //http://www.br-c.org/doku.php?id=accept | ||
+ | printf("Preparando para accept..\n"); | ||
+ | // accept one connection | ||
+ | |||
+ | if ((client = accept(s, (struct sockaddr *)&rem_addr, &opt))<0){ | ||
+ | perror("accept: "); | ||
+ | exit(1); | ||
+ | } | ||
+ | |||
+ | printf("Preparando para leitura..\n"); | ||
+ | // ba2str( &rem_addr.rc_bdaddr, buf ); | ||
+ | fprintf(stderr, "accepted connection from %s\n", buf); | ||
+ | memset(buf, 0, sizeof(buf)); | ||
+ | |||
+ | // read data from the client | ||
+ | bytes_read = read(client, buf, sizeof(buf)+1); | ||
+ | if( bytes_read > 0 ) { | ||
+ | printf("received [%s]\n", buf); | ||
+ | } | ||
+ | |||
+ | //envia uma resposta | ||
+ | strcpy(buf,"ALO CELULAR!"); | ||
+ | write (client, buf, sizeof(buf)); | ||
+ | sleep(10); | ||
+ | // close connection | ||
+ | close(client); | ||
+ | close(s); | ||
+ | return 0; | ||
+ | } | ||
+ | |||
+ | </syntaxhighlight> | ||
+ | |||
+ | Para compilar o programa: | ||
+ | gcc rcomm-server.c -lbluetooth -o rcomm-server | ||
+ | |||
+ | |||
+ | |||
+ | APPINVENTOR: | ||
+ | |||
+ | [http://db.tt/WuJAUEbD Dowload do .apk (primeira versão funcional)] | ||
+ | Note que a variável MAC deverá conter o endereço MAC do computador em uso. | ||
+ | |||
+ | [[Arquivo:MACappinventor.jpg|300px]] | ||
+ | |||
+ | Para saber o seu endereço MAC: | ||
+ | hcitool dev | ||
+ | |||
+ | {{collapse bottom}} |
Edição atual tal como às 07h59min de 19 de junho de 2017
desenvolvimento da bolsa | ||||||||
---|---|---|---|---|---|---|---|---|
Pontos a serem verificados
modinfo usbtouchscreen > usbtouchscreen modinfo input >
Saída: modificar a função enviar():
buf[1] = '1'; buf[2] = '2'; buf[3] = '5'; buf[4] = '5'; res = hid_write(handle, &buf[0], 5);
Rodando programas em C1: fazer o download da biblioteca: (upar no google docs
Se o driver sendo utilizado é o usbhid (generic-usb), siga os passos abaixo: - Descompacte a pasta biblioteca; - Entre no diretório biblioteca; - Como root, execute o arquivo .sh (MELHORAR para nao precisar ser root) ATENÇÃO: não adianta seguir em frente se o driver ainda nao foi reconhecido corretamente, confirme isso conectando (ou tirando e reconectando a placa) e entao com o comando dmesg: veja se existe esta linha: input: Cerne Tec... se nao, repita o passo 1a. Passo2: 2 - Instale o pacote Libusb 1.0
3 - Instale o pacote Libudev (cabeçalho e biblioteca)
4 - Existem 2 programas para testes, eles podem ser compilados: gcc ptest.c libprg.a -lusb-1.0 -o teste e gcc analo.c libprg.a -lusb-1.0 -o analogic OBS: Caso o seu sistema seja 64bits, utilize no lugar de libprg.a a bibprg.a
Mudar a permissão de acesso a plaquinha (feito com chmod); construir uma regra udev; "Mais uma dica é que, normalmente, novos dispositivos são criados com permissão de escrita somente para o root, até que você as modifique manualmente, usando o comando "chmod". O udev permite ajustar as permissões, modificando o dono, grupo e permissões de acesso do dispositivo. Isso pode ser usado para que scanners e outros dispositivos fiquem automaticamente acessíveis para todos os usuários do sistema, evitando dores de cabeça em geral, ou fazer com que um pendrive ou outro dispositivo em particular fique disponível apenas para um determinado usuário, mas não para os demais."[2] metas -semanaTermometro digital: http://www.arnerobotics.com.br/eletronica/termometro_digital_w_PIC_DS1620.htm
http://www-usr.inf.ufsm.br/~giovani/sockets/sockets.txt http://www-usr.inf.ufsm.br/~giovani/sockets/sockets1.pdf Criando biblioteca em Cutilizando as informaçoes deste site, criei a bilibioteca com as funções do projeto tendo os arquivos ".o", hid-libusb.o, libusb.o, e prog.o criei a bilbioteca libprg.a: ar rvs libprg.a hid-libusb.o, libusb.o, e prog.o e utilizando o arquivo libprg.h ja foi possível rodar os programas, apenas lembrando de compilar o programa da seguinte forma gcc programa.c libprg.a -lusb-1.0 -o programa para que a biblioteca possa ser utilizada como uma padrao do sistem (-l...), basta copiar o arquivo "libprg.a" e entao compilar o programa utilizando "-lprg" Sensor de temperatura LM35O LM35 é um sensor de temperatura linear que fornece 10mV para cada grau celcius que ele medir. Ou seja, se ele fornecer 100mV, significa que ele está medindo 10ºC.[3] EmbedVideo received the bad id "l9n-8wzex7I#!" for the service "youtube". Por retornar um tensão e ser ligado em 5V, acredito que seja uma boa opção para trabalharmos com medidas de temperaturas.
Comunicação bluetooth (Appinventor e C)Fonte: Uso do Bluetooth com App Inventor e programa C How to play with Bluetooth under Linux Comandos iniciais: instalar ferramentas e bibliotecas sudo apt-get install bluez-utils sudo apt-get install libbluetooth3-dev Configurar a porta serial (SP), neste exemplo o canal 3 : sdptool add --channel=3 SP Código C, funcionando, (com o canal 3, pode ser mudado, se necessário, na linha 33) #include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <string.h>
#include <sys/socket.h>
#include <bluetooth/bluetooth.h>
#include <bluetooth/rfcomm.h>
#include <errno.h>
#include <sys/types.h>
#include <netinet/in.h>
int main(int argc, char **argv)
{
struct sockaddr_rc loc_addr = { 0 } , rem_addr = { 0 };
char buf[1024] = { 0 };
int s, client, bytes_read;
socklen_t opt = sizeof(rem_addr);
// allocate socket http://www.br-c.org/doku.php?id=socket
if ((s = socket(AF_BLUETOOTH, SOCK_STREAM, BTPROTO_RFCOMM))==-1){
printf("Problemas na criação do socket\n");
exit(-1);
}
// bind socket to port 1 of the first available
// local bluetooth adapter
//http://www.br-c.org/doku.php?id=bind
loc_addr.rc_family = AF_BLUETOOTH;
loc_addr.rc_bdaddr = *BDADDR_ANY;
//str2ba( endereco, &loc_addr.rc_bdaddr );
loc_addr.rc_channel = (uint8_t) 3;
if (bind(s, (struct sockaddr *)&loc_addr, sizeof(loc_addr))==-1){
printf("Problemas no bind\n");
exit(-1);
}
//listen http://www.br-c.org/doku.php?id=listen
printf("Preparando para listen..\n");
// put socket into listening mode
if (listen(s, 1)<0)
printf("Problemas de listen...\n");
//http://www.br-c.org/doku.php?id=accept
printf("Preparando para accept..\n");
// accept one connection
if ((client = accept(s, (struct sockaddr *)&rem_addr, &opt))<0){
perror("accept: ");
exit(1);
}
printf("Preparando para leitura..\n");
// ba2str( &rem_addr.rc_bdaddr, buf );
fprintf(stderr, "accepted connection from %s\n", buf);
memset(buf, 0, sizeof(buf));
// read data from the client
bytes_read = read(client, buf, sizeof(buf)+1);
if( bytes_read > 0 ) {
printf("received [%s]\n", buf);
}
//envia uma resposta
strcpy(buf,"ALO CELULAR!");
write (client, buf, sizeof(buf));
sleep(10);
// close connection
close(client);
close(s);
return 0;
}
Para compilar o programa: gcc rcomm-server.c -lbluetooth -o rcomm-server
APPINVENTOR: Dowload do .apk (primeira versão funcional) Note que a variável MAC deverá conter o endereço MAC do computador em uso. Para saber o seu endereço MAC: hcitool dev |
Ao usuário |
---|
Placa de aquisição de dados
Existem 3 saídas digitais na placa, e essas são chamadas de OUT1, OUT2 e OUT3. Essas saídas são energizadas, e quando estão ligadas enviam 5V a saída escolhida.
Existem, também, 3 entradas digitais, que são nomeadas INP1, INP2 e INP3. Essas entradas são do tipo seco, o que significa que elas ficam ativas quando aterradas(GND).
Existem 2 saídas analógicas, e essas nomeadas DA1 e DA2. Essas saídas podem ser ajustadas para mandar tensões entre 0V e 5V.
As 8 entradas analógicas existentes na placa são nomeadas como AD1, AD2, AD3...AD8 Estas entradas suportam tensões de até 10V InstalaçãoFazer o dowload do arquivo bibprg neste link: Download Intruções para instalação: Na pasta make: -Dentro do arquivo shell.sh, no campo "SENHA". Botar senha de root do PC em uso; -Dentro do arquivo Perm-Cerne.rules, na segunda linha, no campo OWNER="Aluno". Mudar "Aluno" para o nome do usuário do computador. feito isso, basta que, a partir do terminal, seja feito o comando make dentro da pasta make. Criando programas em C utilizando a biblioteca prgAs seguintes funções estão disponíveis nesta biblioteca:
esta função conecta a plaquinha ao host PC Parâmetros: não possui como utilizar: conectar ();
esta função retorna informações da placa. Pode retornar o nome do fabricante e o string do produto. Parâmetros: não possui como utilizar: info ();
Envia um sinal para uma das 3 saídas digitais da placa de aquisição como utilizar: Parâmetros: 2 parâmetros do tipo char, onde o primeiro representa uma saída digital (1, 2 ou 3) e o segundo representa o estado da saída, podendo ser 1(nível alto) ou 0(nível baixo). enviar_digital (saída, estado); /*IMPORTANTE: as varíaveis saída e estado, sao do tipo CHAR*/ ou enviar_digital (‘1’, ‘1’) /*saída 1 é colocada em nivel alto(5V)*/
função utilizada para enviar um sinal para uma das 2 saídas analógicas da placa de aquisição como utilizar: Parâmetros: 2 parâmetros do tipo char, onde o primeiro representa uma saída analógica (1 ou 2) e o segundo é uma string que representa o estado da saída, podendo esta variar de “000” a “255”. Onde “000” é 0V e 255 é 5V. Outras tensões podem ser encontradas através de calculos simples, como 2,5V “127” enviar_analogica (saida, estado); /*Onde a variavel saida e estado sao do tipo CHAR*/ ou enviar_analogica (‘1’, “127”); /*onde a saída analógica 1 está sendo energizada com aproximadamente 2.5V*/
Função utilizada para receber infotrmações das entradas analógicas; A entrada digital desta placa é do tipo seco. Ela retornará 0 caso a entrada NÃO estiver aterrada, e 1 se estiver.
Parâmetros: receber(nº da saída); Retorno: o retorno desta função é um inteiro (int) receber_digital (char saida) ; ou receber_digital (‘1’) ; /*onde a função retornará 0 ou 1 da entrada 1 */ /*Existem 3 entradas digitais, portanto a variavel saída pode ser 1, 2 ou 3*/
Função utilizada para receber infotrmações das entradas analógicas; As entradas analógicas retornam valores de 0,00V a 9,99V; como utilizar: Parâmetros: receber(nº da saída); Retorno: o retorno desta função é um número real (float) receber_analogica (char saida) ; ou receber_analogica (‘1’) ; /*onde a função retornará retornará um valor entre 0,00 e 9,99 */ /*Existem 8 entradas analogicas, portanto a variavel saída pode ser 1, 2, 3, 4, 5, 6, 7 ou 8*/
/*Função utilizada para imprimir um mensagem no display lcd*/ como utilizar: //Parâmetros: print_display(linha,"mensagem"); print_display (int linha, char mensagem[]);
/*Função utilizada para limpar o display*/ como utilizar: //Parâmetros: não possui limpar_display(); ExemplosSempre lembrando do arquivo de cabeçalho "bibprg.h" que está dentro da pasta que foi baixada Saída digital #include <stdio.h>
#include "bibprg.h"
main (){
char saida='1', estado='0';
conectar ();
enviar_digital ('1','1');
sleep (1);
enviar_digital (saida,estado);
}
Lembrando que o dois parâmetros são do tipo CHAR
#include <stdio.h>
#include "bibprg.h"
main (){
char saida='1', estado[3]="000";
conectar ();
enviar_analogica('1', "130");
sleep(2);
enviar_analogica(saida, estado);
}
Os dois parâmetros são do tipo CHAR, sendo o segundo uma cadeia de caracteres que varia de 000 á 255
#include <stdio.h>
#include "bibprg.h"
main (){
char saida='1';
conectar ();
printf ("%d\n", receber_digital ('1'));
sleep (3);
printf ("%d\n", receber_digital (saida));
}
Parâmetro do tipo CHAR
#include <stdio.h>
#include "bibprg.h"
main (){
conectar ();
printf("%f\n",receber_analogica('1'));
sleep (2);
printf("%f\n",receber_analogica('1'));
}
Parâmetro do tipo CHAR Display #include <stdio.h>
#include "bibprg.h"
main(){
int i=12;
char mensagem[50]="Fim";
conectar();
for(;;){
print_display (1,"Linha 1 display LCD");
sleep(1);
print_display (2,"Linha 2 display LCD");
sleep(1);
print_display (12,"Linhas 1 e 2 display LCD");
sleep(1);
print_display (i, mensagem);
sleep(1);
}
}
Onde a variável "i" é do tipo inteiro e a "mensagem" é uma cadeia de caracteres Ao fim, basta compilar da seguinte forma: gcc arquivo.c -lprg -lusb-1.0 -o arquivo Comunicação bluetooth (Appinventor e C)Fonte: Uso do Bluetooth com App Inventor e programa C How to play with Bluetooth under Linux Comandos iniciais: instalar ferramentas e bibliotecas sudo apt-get install bluez-utils sudo apt-get install libbluetooth3-dev Configurar a porta serial (SP), neste exemplo o canal 3 : sdptool add --channel=3 SP Código C, funcionando, (com o canal 3, pode ser mudado, se necessário, na linha 33) #include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <string.h>
#include <sys/socket.h>
#include <bluetooth/bluetooth.h>
#include <bluetooth/rfcomm.h>
#include <errno.h>
#include <sys/types.h>
#include <netinet/in.h>
int main(int argc, char **argv)
{
struct sockaddr_rc loc_addr = { 0 } , rem_addr = { 0 };
char buf[1024] = { 0 };
int s, client, bytes_read;
socklen_t opt = sizeof(rem_addr);
// allocate socket http://www.br-c.org/doku.php?id=socket
if ((s = socket(AF_BLUETOOTH, SOCK_STREAM, BTPROTO_RFCOMM))==-1){
printf("Problemas na criação do socket\n");
exit(-1);
}
// bind socket to port 1 of the first available
// local bluetooth adapter
//http://www.br-c.org/doku.php?id=bind
loc_addr.rc_family = AF_BLUETOOTH;
loc_addr.rc_bdaddr = *BDADDR_ANY;
//str2ba( endereco, &loc_addr.rc_bdaddr );
loc_addr.rc_channel = (uint8_t) 3;
if (bind(s, (struct sockaddr *)&loc_addr, sizeof(loc_addr))==-1){
printf("Problemas no bind\n");
exit(-1);
}
//listen http://www.br-c.org/doku.php?id=listen
printf("Preparando para listen..\n");
// put socket into listening mode
if (listen(s, 1)<0)
printf("Problemas de listen...\n");
//http://www.br-c.org/doku.php?id=accept
printf("Preparando para accept..\n");
// accept one connection
if ((client = accept(s, (struct sockaddr *)&rem_addr, &opt))<0){
perror("accept: ");
exit(1);
}
printf("Preparando para leitura..\n");
// ba2str( &rem_addr.rc_bdaddr, buf );
fprintf(stderr, "accepted connection from %s\n", buf);
memset(buf, 0, sizeof(buf));
// read data from the client
bytes_read = read(client, buf, sizeof(buf)+1);
if( bytes_read > 0 ) {
printf("received [%s]\n", buf);
}
//envia uma resposta
strcpy(buf,"ALO CELULAR!");
write (client, buf, sizeof(buf));
sleep(10);
// close connection
close(client);
close(s);
return 0;
}
Para compilar o programa: gcc rcomm-server.c -lbluetooth -o rcomm-server
APPINVENTOR: Dowload do .apk (primeira versão funcional) Note que a variável MAC deverá conter o endereço MAC do computador em uso. Para saber o seu endereço MAC: hcitool dev |