Escolar Documentos
Profissional Documentos
Cultura Documentos
!
! Universidade de So Paulo
!
! Escola de Engenharia de So Carlos
!
!
!
!
!
!
!
Relatrio de Iniciao Cientfica:
!
So Carlos
2013
!
!
!
!
Pgina 1
ndice
Introduo! 3!
Objetivos! 3!
Metodologia e materiais utilizados! 4!
Cronograma! 5!
Resultados! 6!
Concluso! 12!
Bibliografia! 13!
!
!
Pgina 2
Introduo
Sobre a arquitetura ARM
A arquitetura ARM (Advanced RISC Machines) trouxe um grande avano na soluo de
problemas em sistemas embarcados. Ela traz como caractersticas bsicas a simplicidade
e o baixo consumo de energia. Isso causou a popularidade e expanso dessa arquitetura,
hoje usada em diversos gadgets, como dispositivos portteis e celulares e at meios de
transporte, a exemplo de computadores de bordo em automveis. Assim, utilizando os
conceitos adquiridos nos projetos e trabalhos executados anteriormente no laboratrio,
esse projeto teve como objetivo continuar o desenvolvimento de sistemas Linux
embarcados, aplicando e desenvolvendo sistemas de streaming de vdeo embarcado,
utilizao de sada GPIO e controle de uma IPCam. O sistema operacional escolhido foi o
Linux devido ao fato de ser gratuito, opensource e estvel.
!
Objetivos
Sobre os objetivos do projeto
Desenvolver habilidades na utilizao do sistema operacional GNU/Linux em sistemas
embarcados
Conhecer os procedimentos necessrios para usar sadas GPIO para emitir sinais de
sada
Desenvolver um sistema web seguro para exibir imagens e controlar uma IPCam
Pgina 3
Metodologia e materiais utilizados
Procedimentos adotados no projeto
Para a parte inicial, foi utilizado o kit SAM9-L9260 da Olimex, que possui como atributos
um microcontrolador ARM9 de 32 bits, 64MB de memria RAM e 512MB de memria
flash.
Para tanto, foi compilado e desenvolvido um Kernel Linux para a o kit inicial e utilizado
um fornecido pelo fabricante para o segundo.
Alm disso, foi utilizado uma webcam wireless com movimento integrado para a parte
final do projeto.
!
!
Pgina 4
Cronograma
Resumo do calendrio adotado no programa
!
!
!
Pgina 5
Resultados
Resultados obtidos durante o programa
Inicialmente, o projeto focou-se no aperfeioamento no uso de sistemas embarcados e
numa melhor compreenso de seu funcionamento. Para tal, foi aperfeioado o uso do
terminal e das ferramentas UNIX, o que apresentou grande relevncia para o projeto em
geral.
Em seguida, iniciou-se o trabalho com o Kernel do Linux. Para isso, foi efetuado o
download da verso do Kernel Linux mais atual disponvel no momento do projeto1. Para
Com os devidos mdulos escolhidos, o comando make era utilizado para efetuar a
compilao do kernel, gerando um arquivo denominado uImage. Esse arquivo era
transferido utilizando a entrada serial da placa, conectada a um computador, e o
software Tera Term era executado para monitoramento, o que permitia visualizar
eventuais erros para futuras correes.
Por fim, alcanou-se o objetivo esperado nessa etapa e foi compilado um kernel
otimizado e funcional para o sistema embarcado.
1 https://www.kernel.org
2 http://opencore.eesc.usp.br
3 http://sft.if.usp.br/debian/
Pgina 6
mkdir Debootstrap
cd Debootstrap
apt-get install binfmt-support qemu qemu-user-static debootstrap
sudo debootstrap --foreign --arch armel wheezy debian_armel_wheezy http://sft.if.usp.br/
debian/
sudo cp /usr/bin/qemu-arm-static debian_armel_wheezy/usr/bin
sudo chroot debian_armel_wheezy/
dpkg --force-all -i /var/cache/apt/archives/*.deb
aptitude install locales
dpkg configure -a
nano /etc/hostname
!
Nesse processo, utilizou-se o Kernel fornecido pelo fabricante, visto que essa verso
atendia a todos os requisitos necessrios para a aplicao.
Alm disso, foi instalada uma verso do Xubuntu no dispositivo, devido ao fato de essa
distribuio ter uma verso otimizada e configurada pelo fabricante para a placa. Para
tal procedimento, utilizou-se a memria flash fornecida com o kit, e, na chave seletora
do dispositivo, foi escolhida a opo de instalao, conforme instruo do fabricante4.
4 http://www.friendlyarm.net/downloads#manuals
Pgina 7
Com o trmino da instalao do sistema operacional, procedeu-se com a configurao da
rede. Para isso, foram editados os IPs na interface da rede, o script 70-persistent-
net.rules e a inicializao do Xubuntu, conforme quadros 3, 4 e 5.
#include <stdlib.h>
#include <stdio.h>
#include <stdint.h>
#include <sys/mman.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
!
#include <unistd.h>
while (opcao!=4){
printf("-------------------\n\nSelecione uma opcao: \n\n1- Ligar LED\n2- Desligar LED\n3- Piscar 20 vezes\n4- Sair \n\n>
Opcao:");
scanf("%d",&opcao);
if (opcao==2)
{
// acende PIOA6
*(unsigned int*)(a+0x430)=0x40;
}
if (opcao==1)
{
// apaga PIOA6
*(unsigned int*)(a+0x434)=0x40;
}
if (opcao==3)
{
for (i=0;i<10;i++)
{
*(unsigned int*)(a+0x430)=0x40;
usleep(500000);
*(unsigned int*)(a+0x434)=0x40;
usleep(500000);
}
}
}
// output disable no PIOA, pino 6
*(unsigned int*)(a+0x414)=0x40;
// disable no PIOA, pino 6
*(unsigned int*)(a+0x404)=0x40;
// Fecha a memoria
close(memfd);
return 0;
}
!
auto lo
iface lo inet loopback
iface eth0 inet static
address 10.235.0.142
netmask 255.255.252.0
network 10.235.3.0
gateway 10.235.0.1
pre-up ifconfig eth0 hw ether 00:01:02:03:05:14
dns-nameservers 143.107.225.6 143.107.182.2 8.8.8.8
!
Quadro 3 - /etc/network/interfaces
!
Quadro 4 - /etc/udev/rules.d/70-persistent-net.rules
!
cp /etc/udev/rules.d/70-persistent-net.rules-backup /etc/udev/rules.d/70-persistent-
net.rules
/etc/init.d/networking restart
ifup eth0
/etc/init.d/ssh restart
!
Quadro 5 - /etc/init.d/rc - Antes do exit 0!
!
!
Para tal transmisso, inicialmente, utilizou-se o ffmpeg6 . Houve sucesso para a
5 http://www.apache.org
6 http://www.ffmpeg.org
7 http://sourceforge.net/projects/mjpg-streamer/
Pgina 9
export LD_LIBRARY_PATH=.!
./mjpg_streamer -i "input_uvc.so -y -d /dev/video2" -o "output_http.so -w /var/www/" !
!
Com o fim dessa transmisso, o trabalho voltou-se para o uso de uma cmera IPCam, que
j inclui um sistema de transmisso bsico e um motor para movimento.
#include <stdio.h>
#include <sys/socket.h>
#include <sys/types.h>
#include <netinet/in.h>
#include <netdb.h>
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <unistd.h>
#include <errno.h>
#include <arpa/inet.h>
#include <curl/curl.h>
#define IP "143.107.235.59"
!
#define PORT 8085
!
// gcc -lcurl main.c -o test
!
}
Pgina 10
char *downloadBuffer = malloc((strlen(IP) + strlen(command) + 4 + 9)*sizeof(char));
sprintf(downloadBuffer, "http://%s:%d/%s",IP,PORT,command);
curl = curl_easy_init();
if (curl) {
fp = fopen(outputData,"wb");
curl_easy_setopt(curl, CURLOPT_URL, downloadBuffer);
curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, write_data);
curl_easy_setopt(curl, CURLOPT_USERNAME, "admin");
curl_easy_setopt(curl, CURLOPT_PASSWORD, "lavisim");
curl_easy_setopt(curl, CURLOPT_WRITEDATA, fp);
res = curl_easy_perform(curl);
curl_easy_cleanup(curl);
fclose(fp);
}
}
char *sendCommand(char *command, int printRequest, int printReturn) {
int sockfd = 0, n = 0, count = 0;
char *recvBuff = NULL, *sendBuff;
struct sockaddr_in serv_addr;
if((sockfd = socket(AF_INET, SOCK_STREAM, 0)) < 0)
{
printf("\n Error : Could not create socket \n");
return NULL;
}
memset(&serv_addr, '0', sizeof(serv_addr));
serv_addr.sin_family = AF_INET;
serv_addr.sin_port = htons(PORT);
if(inet_pton(AF_INET, IP, &serv_addr.sin_addr)<=0)
{
printf("\n inet_pton error occured\n");
return NULL;
}
if( connect(sockfd, (struct sockaddr *)&serv_addr, sizeof(serv_addr)) < 0)
{
printf("\n Error : Connect Failed \n");
return NULL;
}
// cria um GET, que faz login com a senha e acessa a pagina recebida por parametro
sendBuff = (char *) malloc(sizeof(char) * (strlen(command) + 64));
snprintf(sendBuff, sizeof(char) * (strlen(command) + 64), "GET /%s HTTP/1.0\r\nAuthorization: Basic YWRtaW46bGF2aXNpbQ==
\r\n\r\n ", command);
// se solicitado, imprime o pedido a ser enviado
if (printRequest)
printf(%s",sendBuff);
count = 1;
recvBuff = (char *) realloc(recvBuff, sizeof(char));
// le a resposta do servidor
while ( (n = read(sockfd, &recvBuff[count-1], 1)) > 0)
{
recvBuff = (char *) realloc(recvBuff, sizeof(char) * (count+1));
count++;
}
recvBuff[count-1] = '\0';
free(sendBuff);
// se solicitado, imprime a resposta do servidor
if(printReturn)
printf(%s",recvBuff);
// retorna a reposta do servidor
return (recvBuff);
}
int main(int argc, const char * argv[])
{
sendCommand("decoder_control.cgi?command=6&onestep=1", 0, 0);
getFile("snapshot.cgi","test1.jpg");
return 0;
}
!
Quadro 7 - Aplicativo para controlar a cmera e exemplo de uso (movimento da cmera e foto)!
!
Pgina 11
Concluso
O que se conclui com o projeto
A proposta inicial de automatizar um porteiro eletrnico utilizando um dispositivo
embarcado se mostrou vivel. Entretanto, foi possvel observar que o sistema embarcado
a ser utilizado deve ser escolhido com cautela, visando a satisfazer as necessidades de
processamento e/ou entrada e sada.
Por fim, foi aperfeioado o uso dos mtodos POST e GET, com o estudo e implementao
de um aplicativo em C para envio de pacotes. Isso permitir que trabalhos futuros no
laboratrio utilizem funes j prontas para controle de cmeras.
Pgina 12
Bibliografia
Fontes de consulta utilizadas no projeto
[1] BLUM, Richard - Linux Command Line and Shell Scripting
Pgina 13