Artigos sobre

SOPA - o que é e por que você deve se preocupar

Internet

Mundo

por erikaheidi em 18/01/2012 10:43:50



stop SOPA stop PIPA

Quarta feira, 19 de janeiro de 2012. Essa data pode representar um marco negativo na história da internet. E o dia já começou com várias manifestações, inclusive da Wikipédia, que tirou do ar sua página (versão inglesa) em protesto contra o SOPA.

A essa altura, muitos ainda devem estar se perguntando o que é o SOPA e como isso pode afetar a internet de um modo geral e nós, brasileiros. Neste post você vai entender melhor do que se trata.

A sigla significa "Stop Online Piracy Act" (Lei de Combate à Pirataria Online), e é um projeto de lei americano criado por  Lamar Smith e um grupo de outros representantes do Congresso Americano. Esse projeto visa aumentar o poder de ação contra a pirataria online, em favor dos detentores de propriedade intelectual, e está sendo votado exatamente hoje. Outro projeto de lei similar que está para ser votado é o PIPA (Protect IP Act).

Se você parasse de ler por aqui, poderia até achar que está tudo bem. Porém, o meio principal de retaliação que a lei prevê é jogar a culpa sobre a pirataria nas empresas que prestam serviços de internet, e também em sites onde se pode compartilhar conteúdo - redes sociais, wikis, fóruns, qualquer blog onde se possa comentar... enfim, querem instituir um tipo de censura na internet, com poderes para tirar do ar qualquer site ou serviço que seja "considerado suspeito".

Quem se beneficia dessa lei? Claro que não somos nem eu nem você, nem os cidadãos americanos. As principais beneficiadas serão as grandes gravadoras e produtoras como Time Warner, Sony, CBS dentre outras, que são as maiores apoiadoras da lei.

E como isso afeta a nós, brasileiros?

Primeiramente, mais de metade da infraestrutura da web está em território americano. Inclusive este site, que é hospedado em um servidor de lá. 

Além de uma enorme parcela dos sites brasileiros estar hospedada lá fora (custos muito menores, a maioria das empresas de hospedagem brasileiras alugam infraestrutura de fora), a lei prevê o direito de tirar do ar sites estrangeiros, sem a necessidade de uma ordem judicial para tanto. Basta ser considerado suspeito de pirataria. Ou seja, você tem o maior zelo pelo seu blog, mas de repente alguém deixa um comentário com um link que pode ser considerado pirataria - eles poderão tirar o seu site do ar, inteirinho. 

Ok, você não tem um site. Mas com certeza você utiliza redes sociais (Facebook e cia). Também aposto que você já usou a Wikipedia para fazer pesquisas importantes. Ou tirou dúvidas em fóruns especializados sobre algum assunto. Já pensou como seria a internet sem estes sites? E sem um monte de outros sites, que poderiam ser tirados do ar por censura e/ou interesses de terceiros?

Estaríamos retrocedendo aos tempos em que o usuário não tem o direito de se manifestar, compartilhar, participar - afinal, que site deixaria espaço comunitário sob o risco de sair do ar caso algo fosse considerado "suspeito" pelos reguladores do SOPA? Quem vai ter coragem de expor sua opinião, compartilhar conteúdo, e sofrer retaliação? Seria o fim de comunidades e fóruns. 

Para entender melhor tudo o que a lei prevê, vale a pena ler este artigo da Eletronic Frontier Foundation - How PIPA and SOPA Violate White House Principles Supporting Free Speech and Innovation e também o "learn more" da Wikipedia sobre o assunto: http://en.wikipedia.org/wiki/Wikipedia:SOPA_initiative/Learn_more (ambos em inglês).

Abaixo, alguns trechos relevantes da carta aberta que a Wikimedia (fundação que mantém a Wikipedia) aos seus leitores e comunidade explicando sua posição e a razão do "blackout" de hoje. 

"Nós dependemos de uma infra-estrutura legal que nos torna possível operar. E nós dependemos de uma infra-estrutura legal que também permite que outros sites hospedem conteúdo de contribuição de usuários(...) Esse conhecimento precisa ser publicado em algum lugar para que qualquer pessoa possa encontrá-lo e usá-lo. Quando ele pode ser censurado sem um devido processo, é uma agressão ao autor, ao público e à Wikimedia."

"Além disso, SOPA e PIPA são apenas indicadores de um problema muito mais amplo. Em todo o mundo, estamos vendo o desenvolvimento de legislação destinada a combater a pirataria online, e regular a Internet de outras maneiras, que ferem as liberdades online. Nossa preocupação se estende para além de SOPA e PIPA: eles são apenas parte do problemaQueremos que a Internet permaneça livre e aberta, em todos os lugares, para todos."

Update 1: apenas alguns sites que protestaram contra o SOPA / PIPA hoje. Só pra você ter noção que a bronca é grande mesmo.

http://php.net 

stop sopa php.net

http://en.wikipedia.org

stop sopa - wikipedia

http://wordpress.org  e http://www.wordpress.com 

stop sopa wordpress.org

stop sopa wordpress.com

O Google colocou um link em sua página principal que dá nessa página especial abaixo. "End Piracy, Not Liberty". 

stop sopa google

Fora inúmeros outros sites conhecidos (9gag, 4chan, gizmodo, wired) que protestaram com banners, tarjas pretas e coisas do tipo. 

Por enquanto, a melhor coisa que podemos fazer é nos manter informados, e informar outras pessoas sobre o assunto. A coisa é séria e não pode ser relegada a segundo plano. Nossa liberdade está em jogo.

Update 2: o SOPA voltará a ser debatido daqui a duas semanas (em fevereiro). Durante esse período, o projeto será avaliado pelos partidos Democrata e Republicano.


Tags: internet, sopa, pipa, censura, protesto


Passando slides com um controle remoto de TV

Desenvolvimento

Embarcados

por hugo em 07/01/2012 20:12:08



No mês passado tive a oportunidade de palestrar no IV Encontro de Comunicação Digital, realizado no IFPB. O tema da palestra foi uma introdução sobre a plataforma Arduino e entre outras coisas, falei um pouco sobre computação física, sistemas embarcados e microcontroladores. No final da palestra apresentei um protótipo, feito especialmente para o evento, para passar slides utilizando um controle remoto comum. Se trata de um projeto introdutório, mas que pode ser utilizado para simular eventos em um computador através de um controle.

O projeto foi desenvolvido em duas partes, onde a primeira parte é responsável por receber os dados enviados pelo controle remoto e transmiti-los via USB(RS232), e a segunda parte é responsável por receber os dados via USB, interpreta-los e realizar alguma ação de acordo com o dado recebido. Para compor a primeira parte do projeto foi utilizado um Arduino UNO e um receptor infravermelho, retirado de um aparelho de DVD antigo. A segunda parte, que recebe os dados do Arduino, foi desenvolvida em Python e utilizando o comando xdotool, já apresentado aqui em outro post. Apesar do projeto ter sido testado apenas no Linux, ele pode ser facilmente adptado para funcionar em outros sistemas operacionais.

A ligação do receptor infravermelho ao Arduino é bastante simples, pois dispensa a utilização de componentes extras (resistores, capacitores etc), bastando apenas conectá-lo aos pinos corretos. Na foto abaixo podemos ver a ligação entre o Arduino e o receptor infravermelho, neste caso conectado aos pinos D11, GND e VCC(5V) do Arduino.

Arduino IR Receiver

 

Para receber os dados enviados pelo controle remoto foi utilizada a biblioteca e o código de exemplo disponível em http://www.arcfn.com/2009/08/multi-protocol-infrared-remote-library.html, que copio logo abaixo.

Com esse código, o Arduino consegue receber os sinais infravermelhos enviados pelo controle remoto, convertê-los em uma sequência hexadecimal e enviá-los pela porta serial. Dessa forma, quando o Arduino estiver ligado e um botão do controle remoto for pressionado, um código hexadecimal, correspondente ao botão pressionado, será enviado pela porta serial que está conectada ao PC.

Para receber os dados enviados pelo Arduino, interpretá-los e simular ações de teclado, foi desenvolvido um simples código Python. A ferramenta xdotool é utilizada pelo código para simular ações de teclado e mouse, portanto é indispensável para o correto funcionamento da aplicação. Abaixo segue o código desenvolvido:

 

Após executar o código Python, serão exibidas mensagens na tela solicitando o pressionamento dos botões do controle remoto que serão associados as teclas de navegação do teclado do computador (Left, Right, Down e Up). Depois de associar o botões corretamente, basta pressionar o botão do controle associado a tecla que se deseja.  O projeto completo pode ser visto em funcionamento no video abaixo:

Passando slides com controle remoto from entrebits on Vimeo.


Tags: Arduino, Linux, xdotool, Controle Remoto


Controlando servo motores no Arduino Nano (parte 2)

Desenvolvimento

Embarcados

por eduardo em 02/01/2012 22:52:49



Continuando minhas aventuras com o Arduino Nano (veja o post anterior clicando aqui), resolvi explorar um pouco mais a API para controle de motores servos, movimentando minha engenhoca com a ajuda de um joystick que eu tinha encostado em algum lugar aqui de casa. Esta etapa irá me ajudar no futuro a movimentar uma câmera remotamente em um projeto que estou trabalhando, mas por ora meu objetivo é controlar os dois motores servos através de um joystick tendo o meu notebook como "meio de campo" entre o Arduino e o controle.

Do primeiro post eu aproveitei as conexões na protoboard dos motores com o Arduino. Nesta etapa precisei implementar um aplicação em Python para capturar os eventos do joystick e enviar as coordenadas ao Arduino, que teve seu firmware alterado para receber as informações e movimentar os servos de acordo com as mesmas. O joystick que utilizei foi um Leadership Pilot Pro, mas você pode usar qualquer outro que tenha interface de comunicação com seu computador.

*Meu ambiente de desenvolvimento roda em cima do Ubuntu, então este post pode ser direcionado em alguns momentos para o sistema operacional Linux.

A aplicação em Python

Meu primeiro desafio foi encontrar a forma mais fácil de capturar as coordenadas dos eixos do meu joystick. Escolhi desenvolver uma aplicação em Python por conhecer a existência de uma biblioteca de nome pygame que abstrai muito do trabalho que eu teria se fosse utilizar uma linguagem de mais baixo nível. Caso você esteja em um Ubuntu, basta executar a seguinte linha no shell para instalar a biblioteca:

sudo apt-get install python-pygame

Além disso, esbarrei na internet com um código em Python no Principia Labs com o propósito bem semelhante ao proposto neste post e que eu acabei utilizando como referência. Você pode acessá-lo clicando aqui. Após algumas alterações para adequar o código ao uso de dois motores servos, tenho o seguinte programa:

#!/usr/bin/env python
#coding: utf-8

import serial, pygame, struct

joy = []
usbport = "/dev/ttyUSB0"
arduino = serial.Serial(usbport, 9600)

def handleJoyEvent(e):
    if e.type == pygame.JOYAXISMOTION:
        axis = "unknown"
        if (e.dict['axis'] == 0):
            axis = "X"

        if (e.dict['axis'] == 1):
            axis = "Y"

        if (e.dict['axis'] == 2):
            axis = "Throttle"

        if (e.dict['axis'] == 3):
            axis = "Z"

        if (axis == "X") or (axis == "Y"):
            pos = e.dict['value']
            move = round(pos * 90, 0)
            if (move < 0):
              servo = int(90 + abs(move))
            else:
              servo = int(90 - move)
            toSend = struct.pack("BB", ord(axis), servo)
            arduino.write(toSend)
            print axis, servo

    elif e.type == pygame.JOYBUTTONDOWN:
        if (e.dict['button'] == 0):
            arduino.close()
            quit()
    else:
        pass

def joystickControl():
    while True:
        e = pygame.event.wait()
        if (e.type == pygame.JOYAXISMOTION or e.type == pygame.JOYBUTTONDOWN):
            handleJoyEvent(e)

def main():
    pygame.joystick.init()
    pygame.display.init()
    if not pygame.joystick.get_count():
        print "Por favor, conecte um joystick e tente novamente."
        quit()
    print "%d joystick(s) detectado(s)." % pygame.joystick.get_count()
    for i in range(pygame.joystick.get_count()):
        myjoy = pygame.joystick.Joystick(i)
        myjoy.init()
        joy.append(myjoy)
        print "Joystick %d: " % (i) + joy[i].get_name()  
    print "Pressione o gatilho (botão 0) para sair."

    joystickControl()

if __name__ == "__main__":
    main()  

 Este código inicia e monitora as ações de todos os joysticks conectados ao computador e configura a porta /dev/ttyUSB0 para comunicação serial 8N1 a 9600bps. Esta é a porta que será utilizada para enviar dados ao Arduino (mais a frente explicarei como esta comunicação serial ocorre).

Quando um evento é detectado no joystick que tenho conectado ao notebook, a função handleJoyEvent é chamada para tratá-lo e uma verificação de qual eixo ou botão disparou o evento é realizada. Quando os eixos X e Y são alterados, dois bytes são enviados ao Arduino. O primeiro byte representa o eixo movimentado (caractere 'X' ou caractere 'Y') e o segundo byte representa a posição do eixo já convertida para um ângulo entre 0 e 180. Quando o botão 0 é pressionado (o gatilho no caso do meu controle), a aplicação é encerrada.

O firmware do Arduino

Por último precisei escrever um programa para que o Arduino recebesse através de comunicação serial as coordenadas X e Y para movimentação dos servos. Antes de continuar, preciso dizer que o cabo USB do Arduino comporta-se como um adaptador serial, disponibilizando em minha máquina o dispositivo /dev/ttyUSB0, já mencionado. O código ficou assim:

#include <Servo.h> 

Servo servoX;
Servo servoY;

void setup() 
{
  servoX.attach(3);
  servoY.attach(2);
  
  Serial.begin(9600);
} 
 
void loop() 
{
  if (Serial.available() >= 2)
  {
             char axis = Serial.read();
    unsigned char grau = Serial.read();
    
    if (axis == 'X')
    {
      servoX.write(grau);
    }
    else if (axis == 'Y')
    {
      if (grau > 170)
        grau = 170;
      if (grau < 20)
        grau = 20;
      servoY.write(grau);
    }
  }
}

 A utilização da biblioteca Servo já foi explicada no post anterior. O que temos de novidade no setup é a configuração da comunicação serial com a velocidade 9600bps. No loop temos a verificação da disponibilidade de dois bytes ou mais para leitura na serial e quando esta condição for verdadeira é realizada a captura do nome do eixo a ser movimentado (variável axis) e seu ângulo (variável grau). Perceba que coloquei uma limitação para a movimentação do servo responsável pelo eixo Y. Acontece que eu devo ter cometido algum erro na montagem do pan tilt (componente mecânico com dois servos instalados e que pode ser visto no meu post anterior), por isso tem um parafuso impedindo que o servo se posicione em ângulos muito abertos (menores que 20 e maiores que 170 graus). Problema "contornado", segue abaixo o vídeo que gravei com os dois programas rodando (perdoem a qualidade, estou providenciando outra câmera):

 


Na próxima etapa conectarei o Arduino a um NAS modificado para que seja possível movimentar os servos de forma remota. Nos próximos dias postarei alguns conteúdos relacionados ao NAS, preparando-o para a conexão com o Arduino.

Um abraço.


Tags: arduino, embedded, microcontroladores, joystick, python


Login de usuários via Facebook + upload de imagens direto na timeline do usuário (php)

Desenvolvimento

Web

por erikaheidi em 28/12/2011 11:28:08



Há poucos dias precisei de uma solução que compartilhasse imagens diretamente no facebook do usuário, e descobri que é bastante fácil implementar essa funcionalidade em php. A maior dificuldade que enfrentei foi com relação ao meu servidor, que apesar de ter a lib Curl já instalada e em funcionamento (as aplicações para o Twitter que eu criei já se utilizam dela há tempos), para usar a biblioteca php que o Facebook disponibiliza era preciso que a lib Curl estivesse compilada com suporte a SSL. Tive que pedir um help a Hugo Reinaldo que resolveu rapidinho o problema pra mim ;)

Com esse problema resolvido, parti para o código php. Usei um exemplo que encontrei no Google, mas ele não estava funcionando corretamente. Dei uma pesquisada na documentação da API do Facebook e consegui corrigir os erros e colocar o código pra funcionar. Então, vou disponibilizar o passo a passo pra vocês. Estou levando em consideração que você já tem um servidor pronto (com a lib Curl + SSL devidamente compilada).

Pra ficar mais "fancy", coloquei um formulário onde você envia uma imagem e escolhe um efeito para aplicar nela antes de publicar no seu Facebook.

Você pode testar o demo desse script aqui: http://entrebits.com.br/labs/facebookshare

1. Criar uma aplicação no Facebook

Acesse http://developers.facebook.com e crie uma aplicação. São necessárias apenas duas informações: o nome da aplicação e o "namespace", que é como uma espécie de login, deve ser sem caracteres especiais ou espaços.

criando uma app no facebook 

Agora é preciso informar ao Facebook o que a sua aplicação vai fazer. No nosso caso iremos apenas utilizar o login de usuário, ou seja, vamos autenticar o usuário pela nossa página e fazer operações na conta do usuário através desta página, fora do Facebook. Marque a opção "Website" e informe a url do site que irá autenticar o usuário (não é uma url de callback, é apenas a url geral do site mesmo. o callback é definido pelo código).

app

2. Código

Agora que a aplicação está criada, vamos ao código. Antes de mais nada, é preciso fazer download da sdk oficial do Facebook para php. Depois de baixar o zip, coloque os arquivos que estão no diretório SRC (você só vai precisar deles - base_facebook.php, facebook.php e fb_ca_chain_bundle.crt) em uma pasta no seu site (vamos usar uma pasta "facebook" na raiz do site para os exemplos) para podermos incluir no código.

A primeira coisa que você precisa fazer é incluir a lib facebook.php e definir os dados de configuração da sua aplicação, passando o app id e o app secret que você obtém ao registrá-la. Fica logo no início da tela de informações sobre a aplicação.

require_once('facebook/facebook.php');
$facebook = new Facebook(array(
  'appId'  => "SEU_APP_ID",
  'secret' => "SEU_APP_SECRET",
  'cookie' => true,
  'fileUpload' => true
));

Depois de configurar o objeto facebook, você deve verificar se o usuário já está logado, e, caso ainda não esteja, obter o link para que ele faça login no facebook. Repare que ao solicitar o link de autenticação ao Facebook, eu passei o parâmetro "scope", com as permissões que vou precisar do usuário (user_status, publish_stream, user_photos) - pois vamos precisar dessas permissões para publicar em sua timeline.

$user = $facebook->getUser();

if ($user) {
  try {
    // Proceed knowing you have a logged in user who's authenticated.
    $user_profile = $facebook->api('/me');
  } catch (FacebookApiException $e) {
    error_log($e);
    $user = null;
  }
}

if($user)
	$logoutUrl = $facebook->getLogoutUrl();
else 
{
	$params = array("scope"=> 'user_status, publish_stream, user_photos');
	$loginUrl = $facebook->getLoginUrl($params);
}

if($loginUrl)
{
	echo '<p>Você ainda não está logado. Clique no botão abaixo para logar com seu Facebook.</p>';
	echo '<p><a href="'.$loginUrl.'" title="login with your facebook account"><img src="facebook-connect-button.png" /></a></p>';
}
else
{

	echo '<p>Você está logado como <a href="'.$user_profile['link'].'">'.$user_profile['name']. '</a>. <a href="'.$logoutUrl.'">Clique aqui para fazer logout</a>.</p>';

	//usuário está logado. exibir formulário
}

A parte da publicação no Facebook é bastante simples. Ao receber a imagem por upload, passamos diretamente o seu caminho tmp e postamos:

        $filepath = realpath($_FILES['foto']['tmp_name']);
	$photo = $facebook->api('/me/photos', 'POST', 
		array(
			'source' => '@' . $filepath,
			'message' => $_POST['legenda']
		)
	);

	echo '<p>Montagem publicada com sucesso no seu Facebook :). <a href="http://www.facebook.com/photo.php?fbid='.$photo['id'].'" target="_blank">Clique aqui para visualizar</a>.</p>';

Agora o código completo, com a parte de efeitos usando a lib GD e os detalhes restantes - formulário, etc...

<?php
session_start(); //essencial
?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
	<meta http-equiv="content-language" content="pt" />
	<meta http-equiv="pragma" content="no-cache" />
	<meta http-equiv="reply-to" content="erika@entrebits.com.br" />
	<meta name="robots" content="index,follow" />
	<meta name="revisit-after" content="1" />
	<meta name="classification" content="entretenimento" />
	<meta name="distribution" content="global" />
	<meta name="rating" content="general" />
	<meta name="language" content="pt-br" />
	<meta name="title" content="SharetoFace" />
	<meta name="description" content="Facebook php share example" />
	<meta name="keywords" content="facebook, share, example, php, app" />
	<meta name="author" content="Erika"/>
	<meta name="copyright" content="ErikaHeidi" />
    

<title>FaceShare - entrebits labs</title>
<style>
body {
	background-color: #E5E5E5;
	text-align: center;
	font-family: Verdana, Arial, Helvetica, sans-serif;
	font-size: 12px;
}

form {
	padding: 10px;
	text-align: left;
	margin: 0 auto;
	border: 1px solid #CCC;
}

small {
	font-size: 10px;
}

</style>


<?php

require_once('facebook/facebook.php');
$facebook = new Facebook(array(
  'appId'  => "SEU_APP_ID",
  'secret' => "SEU_APP_SECRET",
  'cookie' => true,
  'fileUpload' => true
));
     
$user = $facebook->getUser();

if ($user) {
  try {
    // Proceed knowing you have a logged in user who's authenticated.
    $user_profile = $facebook->api('/me');
  } catch (FacebookApiException $e) {
    error_log($e);
    $user = null;
  }
}

if($user)
	$logoutUrl = $facebook->getLogoutUrl();
else 
{
	$params = array("scope"=> 'user_status, publish_stream, user_photos');
	$loginUrl = $facebook->getLoginUrl($params);
}

if($loginUrl)
{
	echo '<p>Você ainda não está logado. Clique no botão abaixo para logar com seu Facebook.</p>';
	echo '<p><a href="'.$loginUrl.'" title="login with your facebook account"><img src="facebook-connect-button.png" /></a></p>';
}
else
{

	echo '<p>Você está logado como <a href="'.$user_profile['link'].'">'.$user_profile['name']. '</a>. <a href="'.$logoutUrl.'">Clique aqui para fazer logout</a>.</p>';

	//usuário está logado. exibir formulário
?>

	<form method="post" enctype="multipart/form-data">
	<input type="hidden" name="submitted" value="1" />
	<p>Foto (jpg): <input type="file" name="foto" /></p>
	<p>Aplicar efeito: 
	<select name="efeito">
	<option value="col">Estou com Sorte</option>	
	<option value="pb">Preto e Branco</option>
	<option value="sep">Sépia</option>
	<option value="0">Nenhum</option>
	</select>
	</p>
	<p>Legenda: <input type="text" name="legenda" /></p>
	<p><input type="submit" value="Postar no Facebook" />
	</form>
<?

}

if($_POST['submitted'])
{

	//compartilhar imagem
	$filepath = realpath($_FILES['foto']['tmp_name']);
	
	if($_POST['efeito'])
	{
		$im = imagecreatefromjpeg($filepath);
		
		switch($_POST['efeito'])
		{
			case "pb":
				imagefilter($im, IMG_FILTER_GRAYSCALE);
				break;
			
			case "sepia":
				imagefilter($im, IMG_FILTER_COLORIZE, 90, 60, 40);
				imagefilter($im, IMG_FILTER_CONTRAST, 10);
				break;
			
			case "col":
				imagefilter($im, IMG_FILTER_COLORIZE, rand(0,255), rand(0,255), rand(0,255));
				break;
		}
		
		imagejpeg($im,$filepath,95);
	}

	// add a status message
	$photo = $facebook->api('/me/photos', 'POST', 
		array(
			'source' => '@' . $filepath,
			'message' => $_POST['legenda']
		)
	);

	echo '<p>Montagem publicada com sucesso no seu Facebook :). <a href="http://www.facebook.com/photo.php?fbid='.$photo['id'].'" target="_blank">Clique aqui para visualizar</a>.</p>';
}


?>

Tags: php, facebook, tutorial, imagens, upload, login


Papertoys - sua versão em papel

Mundo Geek

Cultura e Diversão

por erikaheidi em 26/12/2011 16:32:35



Final de ano chegando, e nem todo mundo tem como passar a "virada" com a família, não é verdade? E mesmo passando com a família, sempre tem pessoas com as quais gostaríamos de confraternizar, mas elas não estão por perto. 

Infelizmente, o teletransporte ainda não é possível. Gareth Branwyn, editor da Makezine, teve uma idéia para resolver o problema: criar "avatares" de papel para representá-lo na ceia de Natal, já que não poderia estar presente com a família. Eu sei, é meio nerd demais, mas não é que fica engraçadinho?

O site PaperToy Adventures disponibiliza um monte de modelos que você pode baixar e personalizar pra deixar com a sua cara (ou a de um amigo, o que pode ser mais divertido né!). Além dos modelos em branco, tem também vários modelos prontos de super heróis, personagens de games e filmes e outros temas nerds.

Abaixo alguns deles (clique para abrir o modelo).

Modelos em branco

papertoy em branco

papertoy modelo basico

Modelos prontos

wolverine paper toy

spider man paper toy

sucker punck paperdoll

bruce lee papertoy

Para ver mais modelos: http://papertoyadventures.com/downloads-2

 
 

Tags: papertoy, diy, modelos, download


Controlando servo motores no Arduino Nano

Desenvolvimento

Embarcados

por eduardo em 24/12/2011 18:40:51



Estava aguardando a chegada de alguns componentes eletrônicos que comprei na DealExtreme e na Sparkfun para iniciar uma série de posts relacionados a Arduino e ao NAS que adquiri no início do ano. Enfim, chegaram esta semana, dentre outras "bugigangas", um Arduino Nano e dois servos motores. Como este é meu primeiro post aqui no entrebits e eu ainda estou engatinhando no SDK do Arduino, vou começar devagar escrevendo sobre uma comunicação simples com os servos. O objetivo é entender o funcionamento da biblioteca de comunicação com servos para que, em um projeto que apresentarei a vocês nos próximos dias, possamos controlar remotamente os motores.

O material que utilizei para desenvolver o projeto descrito aqui foi este:

- Arduino Nano (comprado na DealExtreme - veja aqui)
- 2 motores servos (comprado na DealExtreme - veja aqui)
- Pan/Tilt Bracket (comprado na Sparkfun - veja aqui)
- 1 barra de pinos
- 1 protoboard
- Alguns cabinhos para conexão na protoboard (comprado na DealExtreme - veja aqui

*Meu ambiente de desenvolvimento roda em cima do Ubuntu, então este post pode ser direcionado em alguns momentos para o sistema operacional Linux.

Não abordarei a instalação e configuração do ambiente de desenvolvimento para o Arduino, mas você pode obter suporte clicando aqui.

A primeira informação útil que precisamos saber sobre os motores é que a alimentação deles é de 5V e que, devido à corrente consumida pelos mesmos, não é indicado alimentá-los diretamente pelo Arduino quando utilizarmos mais de dois servos ao mesmo tempo, sendo necessário uma fonte externa. Como vou usar dois e meu propósito não é de um projeto final e sim de um protótipo, utilizarei a saída de 5V do Arduino para alimentá-los. Os servos que comprei possuem três fios sendo um marrom, um vermelho e um laranja. O marrom é o terra, o vermelho é o 5V e o laranja é o fio de controle que deverá ser ligado a uma saída digital do Arduino.

O código que desenvolvi para controlar os motores foi este:

#include <Servo.h> 

typedef struct
{
  Servo servo;
  int   pos;
  int   dir;
} st_servo;

st_servo servoX;
st_servo servoY;

#define INCREMENTO 20
 
void setup() 
{
  servoX.pos = servoY.pos = 0;
  servoX.dir = servoY.dir = 1;
  servoX.servo.attach(3);
  servoY.servo.attach(2);
} 
 
void loop() 
{ 
  servoX.pos += (INCREMENTO * servoX.dir);
  servoX.servo.write(servoX.pos);
  
  if ((servoX.pos == 180) || (servoX.pos == 0))
    servoX.dir *= -1;
  
  servoY.pos += (INCREMENTO * servoY.dir);
  servoY.servo.write(servoY.pos);
  
  if ((servoY.pos == 180) || (servoY.pos == 0))
    servoY.dir *= -1;
  
  delay(50);
}

Deixei o mais simples, inclusive com repetição de código, para facilitar o entendimento. Este programa vai movimentar os dois motores, do ângulo 0 até o 180, movendo de 20 em 20 graus a cada 50ms e depois vai movimentar do 180 até 0 da mesma forma. A estrutura definida st_servo contém o campo servo do tipo Servo que faz parte da biblioteca de controle dos motores e é quem faz a comunicação acontecer. Os outros dois campos da estrutura são apenas para controlar o ângulo atual do motor (campo pos) e se o ângulo está sendo incrementado ou decrementado (campo dir). No setup o que acontece de mais importante é a associação dos campos servos dos motores X e Y aos pinos 3 (D3) e 2 (D2) respectivamente. Para que os motores sejam movidos mais devagar, é necessário modificar o delay de 50ms para um valor mais alto. Também pode ser ajustado o incremento do ângulo para um valor menor, modificando a definição INCREMENTO, tornando assim a movimentação mais suave.

Na imagem abaixo é possível verificar como eu montei o Arduino e os motores na protoboard:

 Protoboard

Gravei um vídeo do código rodando no Arduino com os motores conectados para que vocês possam ter uma idéia de como ficou:


O próximo passo é movimentar os motores com a ajuda de um joystick conectado ao notebook, utilizando comunicação serial com o Arduino. Nos próximos dias posto aqui o resultado para vocês.

Um abraço.


Tags: arduino, motores, nas, protótipo


« Atualizações mais recentes

Atualizações mais antigas »