Mudanças entre as edições de "Grupo2-PJI2-2018-1"
Linha 457: | Linha 457: | ||
==Diagrama de Sequência== | ==Diagrama de Sequência== | ||
[[Arquivo:ModoManualDiaSeq.jpg|850px]] | [[Arquivo:ModoManualDiaSeq.jpg|850px]] | ||
+ | |||
+ | ==Códigos== | ||
+ | <code> from ev3dev.ev3 import * | ||
+ | from time import sleep | ||
+ | |||
+ | class movimento(object): | ||
+ | |||
+ | def __init__(self, direcao, passos): | ||
+ | self.dir = direcao | ||
+ | self.steps = passos | ||
+ | self.gy= GyroSensor() | ||
+ | self.ts = TouchSensor() | ||
+ | self.mA = LargeMotor('outA') | ||
+ | self.mD = LargeMotor('outD') | ||
+ | assert self.gy.connected | ||
+ | self.gy.mode = 'GYRO-ANG' | ||
+ | self.units = self.gy.units | ||
+ | |||
+ | def norte(self): | ||
+ | self.andar() | ||
+ | |||
+ | def oeste(self): | ||
+ | while not self.ts.value(): | ||
+ | angle = self.gy.value() | ||
+ | print(str(angle) + " " + self.units) | ||
+ | self.mA.run_timed(time_sp = 500, speed_sp = 80) | ||
+ | if angle >= 85: | ||
+ | self.mA.stop(stop_action = "brake") | ||
+ | break | ||
+ | sleep(0.25) | ||
+ | |||
+ | def sul(self): | ||
+ | while not self.ts.value(): | ||
+ | angle = self.gy.value() | ||
+ | print(str(angle) + " " + self.units) | ||
+ | self.mA.run_timed(time_sp = 500, speed_sp = 80) | ||
+ | if angle >= 174: | ||
+ | self.mA.stop(stop_action = "brake") | ||
+ | break | ||
+ | sleep(0.25) | ||
+ | |||
+ | def leste(self): | ||
+ | while not self.ts.value(): | ||
+ | print("Virou para o leste") | ||
+ | angle = self.gy.value() | ||
+ | print(str(angle) + " " + self.units) | ||
+ | self.mD.run_timed(time_sp = 500, speed_sp = 80) | ||
+ | if angle <= -85: | ||
+ | self.mD.stop(stop_action = "brake") | ||
+ | break | ||
+ | |||
+ | def andar(self): | ||
+ | for x in range(0, self.steps): | ||
+ | print ("1 passo") | ||
+ | self.mA.run_timed(time_sp = 2000, speed_sp = 200) | ||
+ | self.mD.run_timed(time_sp = 2000, speed_sp = 200) | ||
+ | sleep(2) | ||
+ | |||
+ | def alinhar(self): | ||
+ | if self.dir== 2: | ||
+ | while not self.ts.value(): | ||
+ | print("Virou para o leste") | ||
+ | angle = self.gy.value() | ||
+ | print(str(angle) + " " + self.units) | ||
+ | self.mD.run_timed(time_sp = 500, speed_sp = 80) | ||
+ | if angle <= 1: | ||
+ | self.mD.stop(stop_action = "brake") | ||
+ | break | ||
+ | elif self.dir== 4: | ||
+ | while not self.ts.value(): | ||
+ | angle = self.gy.value() | ||
+ | print(str(angle) + " " + self.units) | ||
+ | self.mA.run_timed(time_sp = 500, speed_sp = 80) | ||
+ | if angle >= 360: | ||
+ | self.mA.stop(stop_action = "brake") | ||
+ | break | ||
+ | elif self.dir==3: | ||
+ | while not self.ts.value(): | ||
+ | angle = self.gy.value() | ||
+ | print(str(angle) + " " + self.units) | ||
+ | self.mA.run_timed(time_sp = 500, speed_sp = 80) | ||
+ | if angle >= -1: | ||
+ | self.mA.stop(stop_action = "brake") | ||
+ | break | ||
+ | else: | ||
+ | pass </syntaxhighlight> | ||
=Modo Manual com Sistema de Auditoria= | =Modo Manual com Sistema de Auditoria= | ||
=Links Auxiliares= | =Links Auxiliares= |
Edição das 21h36min de 7 de maio de 2018
Equipe
Luísa Machado
Marina Souza
Natália Miranda
Cronograma de Atividades
Atividades | 26/02 - 03/03 | 03/03 - 10/03 | 10/03- 17/03 | 17/03 - 24/03 | 24/03 - 31/03 | 31/03 - 07/04 | 10/04 - 17/04 | 17/04 - 24/04 | 24/04 - 01/05 - 08/05 |
---|---|---|---|---|---|---|---|---|---|
Estrutura do EV3 | OK | ||||||||
SD Card com sistema operacional embarcado | OK | ||||||||
Acesso via WiFI | OK | ||||||||
Execução de programas na linguagem Python | OK | ||||||||
Teste de sensores e motor | parcial | ||||||||
Estudo do artigo do Borenstein e pesquisas sobre métodos de localização | OK | ||||||||
Definir método para localização | OK | ||||||||
Definir regras do jogo | OK | ||||||||
Entrega do sumário executivo | OK | ||||||||
Casos de uso e requisitos | parcial |
Estrutura do EV3
Inicialmente, na primeira versão do robô, utilizamos um modelo adaptado do Gyro Boy LEGO® MINDSTORMS® Education EV3. Porém por questões de desempenho optamos por montar de uma forma diferente, este novo formato foi criado pela equipe.
As interfaces de entrada e saída utilizadas no controle do robô seguem a nomenclatura tabela:
Interfaces | |||
---|---|---|---|
Input | Output | ||
1 | Sensor de Toque | A | Motor Direita |
2 | Sensor Ultrassônico | B | |
3 | Sensor de Giro | C | |
4 | Sensor de Cor | D | Motor Esquerda |
Acesso via WiFI
Para acessar o robô via rede Wi-Fi utilizamos um dispositivo Wi-Fi (TP-Link N500) conectado à porta USB do EV3 e acessamos as configurações de rede na tela do EV3 para obter o endereço IP.
A partir de um computador conectado na mesma rede local que o robô, configuramos o software Moba para gerar uma interface gráfica de programação e permitir o envio de arquivos via SSH ao software do EV3.
O tutorial completo pode acessado neste link.
Execução de programas na linguagem Python
O primeiro código em Python enviado ao EV3 foi um teste no sensor de toque. O objetivo do programa é acionar o led verde do EV3 quando o sensor de toque for pressionado.
Teste do Sensor de Toque |
---|
Teste de sensores e motor
Teste dos Motores |
---|
Teste do Sensor de Cor |
---|
Teste do Sensor de Giro |
---|
Teste do Sensor de Ultrassônico |
---|
Estudo do artigo do Borenstein e pesquisas sobre métodos de localização
Review Técnicas de Indoor Positioning
Implementação e Teste de Soluções de Navegação de Robôs Móveis com Base no Sistema NXT/EV3 da LEGO®
Mobile Robot Positioning & Sensors and Techniques
Sumário Executivo
Levantamento de Requisitos
Requisitos Funcionais |
---|
RF01 O robô entra em funcionamento a partir de instruções originadas no sistema de auditoria. |
Requisitos Não Funcionais |
---|
RNF01 O sistema de auditoria deve ser compartilhado entre os robôs. |
Restrições |
---|
As limitações encontradas pela equipe para o desenvolvimento do projeto envolvem:
|
Casos de uso
Atores |
---|
Casos de Uso do Sistema de Auditoria:
Casos de Uso do Sistema Supervisor:
Casos de Uso do Sistema do Robô:
|
Diagramas de Casos de Uso | ||||||
---|---|---|---|---|---|---|
|
Regras de Negócio | ||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
|
Etapa 1
Nesta etapa foram feitos os diagramas e implementações do modo manual sem o Sistema de Auditoria.
Diagrama de Classe
Diagrama de Sequência
Códigos
from ev3dev.ev3 import *
from time import sleep
class movimento(object):
def __init__(self, direcao, passos):
self.dir = direcao
self.steps = passos
self.gy= GyroSensor()
self.ts = TouchSensor()
self.mA = LargeMotor('outA')
self.mD = LargeMotor('outD')
assert self.gy.connected
self.gy.mode = 'GYRO-ANG'
self.units = self.gy.units
def norte(self):
self.andar()
def oeste(self):
while not self.ts.value():
angle = self.gy.value()
print(str(angle) + " " + self.units)
self.mA.run_timed(time_sp = 500, speed_sp = 80)
if angle >= 85:
self.mA.stop(stop_action = "brake")
break
sleep(0.25)
def sul(self):
while not self.ts.value():
angle = self.gy.value()
print(str(angle) + " " + self.units)
self.mA.run_timed(time_sp = 500, speed_sp = 80)
if angle >= 174:
self.mA.stop(stop_action = "brake")
break
sleep(0.25)
def leste(self):
while not self.ts.value():
print("Virou para o leste")
angle = self.gy.value()
print(str(angle) + " " + self.units)
self.mD.run_timed(time_sp = 500, speed_sp = 80)
if angle <= -85:
self.mD.stop(stop_action = "brake")
break
def andar(self):
for x in range(0, self.steps):
print ("1 passo")
self.mA.run_timed(time_sp = 2000, speed_sp = 200)
self.mD.run_timed(time_sp = 2000, speed_sp = 200)
sleep(2)
def alinhar(self):
if self.dir== 2:
while not self.ts.value():
print("Virou para o leste")
angle = self.gy.value()
print(str(angle) + " " + self.units)
self.mD.run_timed(time_sp = 500, speed_sp = 80)
if angle <= 1:
self.mD.stop(stop_action = "brake")
break
elif self.dir== 4:
while not self.ts.value():
angle = self.gy.value()
print(str(angle) + " " + self.units)
self.mA.run_timed(time_sp = 500, speed_sp = 80)
if angle >= 360:
self.mA.stop(stop_action = "brake")
break
elif self.dir==3:
while not self.ts.value():
angle = self.gy.value()
print(str(angle) + " " + self.units)
self.mA.run_timed(time_sp = 500, speed_sp = 80)
if angle >= -1:
self.mA.stop(stop_action = "brake")
break
else:
pass </syntaxhighlight>
Modo Manual com Sistema de Auditoria
Links Auxiliares