Posts tagged with: Lego Mindstorms

Dica: Tenda Digital – Blog muito bom sobre Lego NXT e Robótica

Estava olhando por ae nos blogs de tecnologia e robótica e vi um vídeo no blog THENXTSTEP explicando o algoritmo PID e fiquei impressionado por 2 coisas: Vídeo muito bem feito e também porque foi feito por um garoto brasileiro, fiquei curioso e visitei o seu blog, muito bom, ganhou vários campeonatos de robótica, CLIQUE AQUI e visite, vale a pena.
E para provar que é bom, segue o vídeo sobre o algoritmo PID que falei.

http://www.techlego.blogspot.com/

Aproveitando , outro blog bacana de um amigo dele:

http://nossosrobos.blogspot.com/

Share

Lejos – classe RConsole – Ferramenta para Debug

Nesse vídeo demonstro a utilização da classe RConsole do Lejos, ela cria uma conexão entre o Lego e o computador, enviando mensagens para serem mostradas em um console no computador, facilitando muito a visualização de dados para debug.

Abaixo um comparativo entre algumas formas de exibir dados em texto:

1 – Utilizando a classe LCD:


 
import lejos.nxt.*;
.
.
.
LCD.drawString(String,coluna,linha);

Com ela você tem uma área de 22 colunas e 7 linhas.
Passa-se a string que quer exibir, coluna e linha inicial para o texto.
O texto fica sempre fixo nessa posição.
A classe LCD tem ainda os metodos drawInt, drawChar… para maiores detalhes acesse o LINK.
 
2 – Utilizando a classe System


import lejos.nxt.*;
.
.
.
 System.out.println("Valor de i= " + i);

Com ela você tem uma área de 22 colunas e 7 linhas.  
Passa-se a string que quer exibir e as linhas vão sendo preenchidas, acabando as 7 linhas vai sumindo as primeiras e aparecendo as novas no fim.

3 – Utilizando a classe RConsole

 

import lejos.nxt.*;
import lejos.nxt.comm.RConsole;
.
.
.
 RConsole.openBluetooth(40000);
 RConsole.println("Valor de i= " + i );
 RConsole.close();

Para utilizar a classe RConsole primeiro deve abrir a conexão entre o lego e o computador. Passando o tempo que o programa deve esperar para aceitar uma conexão (no caso 40 segundos), isso serve para dar tempo de abrir o programa de visualização no computador.
RConsole.openBluetooth(milisegundos para iniciar);
Quando o programa iniciar vá até a pasta “caminho da instalação do lejos/bin/nxjconsoleviewer.bat” , escolha o tipo de conexão e mande conectar.
Veja as demais formas de conexões no LINK.
Depois basta ir mandando as mensagens para serem mostradas e no final feche a conexão.

Share

Dica – Livro grátis de idéias para o Lego Mindstorms

Sempre que brinco com o meu lego eu penso se aquele encaixe que acabei de fazer está bom , se o esquema de eixos ficou o melhor possível , etc…
Gosto sempre de fazer seguindo a minha cabeça, mas as vezes eu apelo e dou uma olhada em um pdf muito bom de idéias chamado Tora no Maki criado por um japonês chamado ISOGAWA Yoshihito.
O negócio é show de bola, tem de tudo e te mostra várias possibilidades que nunca passou pela sua cabeça, vale a pena conferir.

Link para o DOWNLOAD:
Tora no Maki

Share

Volante bluetooth – lego nxt + unity3d

Ter idéias boas para desenvolver coisas com o lego nxt é muito difícil, um dia jogando Dirt 2 no Xbox com o volante wireless tive a idéia de fazer um volante desse com o lego, isso ficou na minha cabeça por um tempo, com esse feriado de páscoa, resolvi por em prática já que não tinha nada para fazer mesmo.
O negócio funciona assim, o lego manda para um servidor socket escrito em java os dados de rotação e de dois botões(acelerador e freio, os dois juntos da a marcha ré), esse servidor manda para o unity3D uma string com as informações concatenadas, o unity processa a string e separa as informações.
Utilizei um jogo de carro de corrida já pronto, disponível em : JCar Demo , Todos os créditos para o autor, apenas modifiquei um script que controla o carro para adaptar na minha lógica.

O vídeo abaixo demonstra o funcionamento.


Para essa brincadeira foi desenvolvido 3 códigos.
O primeiro é para o cérebro do Lego, que apenas pega os dados de rotação de um motor e os estados de 2 sensores do toque, concatena em uma string separando por “/” as informações, exemplo:
“-20/true/false”, que seria -20 graus , acelerador apertado e freio não apertado.

import lejos.nxt.*;
import lejos.nxt.comm.*;
import java.io.*;

public class VolanteLego {

	public static void main(String [] args)  throws Exception 
	{
		String connected = "Conectando";
        String waiting = "Aguardando...";
        String closing = "Fechando...";
        String texto;
        //Tira a força do Motor para poder girar manualmente
        Motor.A.setPower(0);
        //Pega os sensores
        TouchSensor acelerador = new TouchSensor(SensorPort.S1);
        TouchSensor freio = new TouchSensor(SensorPort.S2);
		
			LCD.drawString(waiting,0,0);
			LCD.refresh();
			//fica aguardando o pc conectar
	        BTConnection btc = Bluetooth.waitForConnection();
	        
			LCD.clear();
			LCD.drawString(connected,0,0);
			LCD.refresh();	
			//cria o canal de saida
			DataOutputStream dos = btc.openDataOutputStream();
			
			while (!Button.ENTER.isPressed()) {
				LCD.clear();
				//monta uma string com os dados, eles serão filtrados no unity
				texto = Motor.A.getTachoCount() + "/" + acelerador.isPressed() + "/" + freio.isPressed();
				//apenas para Debug
				LCD.drawString(texto, 0, 0);
				LCD.refresh();
				//envia os daos e atualiza o canal
				// \n necessario para falar que acabou a string
				dos.writeBytes(texto + "\n");
				dos.flush();				
			}	
			//fecha e limpa tudo depois que terminou
			dos.close();
			Thread.sleep(100); 
			LCD.clear();
			LCD.drawString(closing,0,0);
			LCD.refresh();
			btc.close();
			LCD.clear();		
	}
}



O segundo código é um servidor em java, ele se conecta com o lego, pega os dados e transmite via socket, para ser capturado no unity3D.

import lejos.pc.comm.*;
import java.io.*;
import java.net.*;


public class VolantePC {	
	// variaveis para UDP socket
	static DatagramSocket udpSocket;
	static int porta = 23175;
	static InetAddress localhost;	
	static DataOutputStream dos ;
	static DataInputStream dis ;
	//string que será compartilhada
	static String bufferStr="";
	
	public static void main(String[] args) {
		// Conecta o nxt
		NXTConnector conn = new NXTConnector();				
		boolean connected = conn.connectTo("btspp://");
		
		if (!connected) {
			System.err.println("Falhou a conexao com o NXT");
			System.exit(1);
		}
		
		//canais de entrada e saida
		 dos = conn.getDataOut();
		 dis = conn.getDataIn();
		
		// cria o socket para enviar
		try
		{
			localhost = InetAddress.getLocalHost();
			udpSocket = new DatagramSocket();
		}
		catch(SocketException e)
		{
			System.out.println("Não abriu o socket");
		}
		catch(UnknownHostException e)
		{
			System.out.println("Não achou o localhost!");
		}
		
		// Inicia uma nova thread para enviar os dados para o pc
		System.out.println("Transmitindo dados UDP na porta "+porta);
		(new Thread(new EnviarDados(udpSocket))).start();
		
		//loop de leitura dos dados do lego
		while(true)
		{			
			try {
				bufferStr = dis.readLine() + "\n";				
			} catch (IOException ioe) {
				System.out.println("IO Exception lendo os bytes:");
				System.out.println(ioe.getMessage());
				break;
			}
		}
		
	}
//  thread para enviar os dados
	public static class EnviarDados implements Runnable
	{
				DatagramSocket datagrama;
		
		public EnviarDados(DatagramSocket datagrama)
		{
			this.datagrama = datagrama;
		}
		
		public void run()
		{			
			// buffer para os dados de saida
			DatagramPacket pacote;
			byte[] pacoteBuffer;
						
			try
			{
				// le os dados para o buffer
				while(true)
				{				
					// converte para byte array para enviar o pacote
					pacoteBuffer = stringToByteArray(bufferStr);
					pacote = new DatagramPacket(pacoteBuffer, pacoteBuffer.length, VolantePC.localhost, VolantePC.porta);
					datagrama.send(pacote);		
					System.out.println(bufferStr);					
					Thread.sleep(33);
				}				
			}catch(IOException e){
				System.out.println("erro");
			}catch(InterruptedException e) {				
				e.printStackTrace();
			}
		}		
		//le a string e converte para um array de bytes
		byte[] stringToByteArray(String str)
		{
			int length = str.length();
			byte[] byteArray = new byte[length];
			for(int i=0; i<length; i = i + 1)
			{
				byteArray[i] = (byte)(str.charAt(i) & 0xff);
			}
			return byteArray;
		}
	}
}

O terceiro é um javascript que se conecta com o servidor socket, filtra a string com os dados e fornece funções para passar os dados para o jogo.

#pragma strict

import System.Net.Sockets;
import System.Net;
import System.Text;

// qual porta o socket usará
var porta:int = 23175;
//string recebida no socket
private var dados:String = "";
// buffer dos dados pegos
private var buffer:byte[];
// Referencia para o socket UDP
private var cliente:UdpClient;
private var source:IPEndPoint;
private var rotacao:String;
private var aceleracao:String;
private var freio:String;

//inicia o socket
function Awake()
{
	IniciarSocket();
}
//le os dados
function Update()
{
	buffer = cliente.Receive(source);
	dados = Encoding.ASCII.GetString(buffer);
	dados = dados.Replace("\n", "");//limpa o finalizador da string
	//filtra os dados
	rotacao = dados.Substring(0,dados.IndexOf("/"));
	dados = dados.Substring(dados.IndexOf("/")+1);
	aceleracao = dados.Substring(0,dados.IndexOf("/"));
	freio = dados.Substring(dados.IndexOf("/")+1);
}
public function getRotation():float{
	//transforma os dados em um range de -1 até 1, depois inverte o sinal 
	return parseFloat(Mathf.Clamp(parseInt(rotacao), -90, 90)/100.0f)*-1.0f;
}
function getAcceleration():float{
	//se só acelerar vai para frente, se aceletar e freiar da ré , ou desacelera
	return aceleracao=="true"?(freio=="true"?-1:1):0;
}
function getBrake():boolean{
	//só freiará se apenas o freio estiver apertado
return (freio=="true" && aceleracao=="false");
}

/**
* Inicia a comunicação com o servidor
*/
function IniciarSocket()
{
	try
	{
		cliente = new UdpClient(porta);		
		source = new IPEndPoint(IPAddress.Any, 0);
	}
	catch(e:System.Exception)
	{
		Debug.Log(e.ToString());
	}
}

Mais um código em C# foi modificado no JCar, para ler as informações desse último código, ele apenas pega os dados e utiliza no jogo.
Para você refazer esse negócio na sua casa, coloquei os códigos para download, apenas tenho umas observações.
O código javascript deve ficar dentro da pasta plugin, pois o unity tem uma frescura no compilador que atrapalha a referência na chamada de um código javascript por um script em c#, colocando dentro da pasta chamada plugins ele é compilado antes, não causando mais problemas.
Passos para refazer:
- Baixar o demo do JCar que está no link acima e substituir o arquivo JControlledCar.cs.
- Copiar a pasta Plugins que contem o arquivo ClienteSocket.js na pasta Assets.
- Dentro do unity3D, colocar o ClienteSocket.js no gameobject Car.
- O JCar usa o torque do motor em 560, acho muito, então diminui para 400, para ficar mais fácil de controlar.

Depois disso é só executar os programas na sequência – Lego , servidor , jogo no Unity e pronto.

PS: Se alguém tiver uma idéia boa de algum projeto bacana que seria legal desenvolver com o lego e quiser compartilhar, posta nos comentários.

DOWNLOADS:
Código fonte

Share

Kit para programar o Lego NXT com JAVA

Essa semana tomei um baile dos drivers de Bluetooth e USB para utilizar o lego, e decidi escrever esse post.

Instalei no meu notebook o Windows 7 64 bits e inventei de instalar tudo 64 bits também (eclipse , Java , drivers, etc…),  resumindo, nada funcionou em relação ao Lejos achar o NXT, tanto via USB ou Bluetooth.

Depois de algumas horas de pesquisa vi que não tinha solução, voltei tudo para 32 bits.

Vou colocar uma lista das coisas que instalei e documentos que me ajudaram.

Programas

Eclipse – Versão 32 bits.

Download

Java JDK – Versão 32 bits.

Download

Lejos 0.85 e plugin para eclipse – Instruções no site

Site para downloads

NXT Drivers – Tem que ter instalado, é uma alternativa para não instalar o programa do lego completo, escolha a versão do seu sistema operacional.

Site para download

Lib USB – Drivers para a conversa via USB

Site para download

Widecomm Bluetooth Driver – Suporte para Bluetooth

Site para download

Agora os pdf para ajudar na instalação:

Como instalar e configurar o Java JDK

Download do site GUJ

Como instalar e configurar o Lejos no eclipse

Download

OBS: Se for usar Bluetooth , não esqueça de colocar a dependência para a biblioteca bluecove.jar no projeto, ela está na pasta de instalação do lejos.

É só seguir os passos explicados nos arquivos que não tem erro.

Share

Impressora Bluetooth feita com LEGO

Esse foi um projeto que fiz para um concurso no site Klocki , para melhorias para a casa, mas o projeto foi desclassificado pois julgaram que uma impressora não é uma melhoria para a casa  (mas tudo bem, não queria ganhar mesmo :-) ).

O resultado foi esse:

Explicação:

A impressora é dividida em 2 partes:

1 – Programa java no PC

Abre a imagem , transforma em branco e preto e converte em uma tabela de bits 0 e 1.

Envia os dados via bluetooth para o cerebro do NXT.

2 – Programa no NXT

Recebe essa tabela e analisa intervalos repetidos,  faz outra tabela de quantos graus o motor deve rodar antes de trocar de estado (caneta baixo / caneta alto) e quando pular de linha.

O código fonte da impressora estou disponibilizando abaixo.

Código Fonte – Download

Share