Introduction: Smart Lesson

O projeto Smart Lesson visa criar um produto no qual os professores possam utilizar como um conteúdo a mais para ensinar seus alunos os levando a um nível de aprendizado muito superior por conseguir mostrar os conteúdos de forma dinâmica e interativa, proporcionando experiencias não presenciadas em uma sala de aula convencional.

Step 1: Materiais

Para programar a Dragonboard 410c:

- Dragonboard 410c;

- Cabo HDMI;

- Teclado via USB -Mouse via USB -Monitor;

- Mezzanine 96boards;

Para executar o projeto:

- Dragonboard 410c;

- Mezzanine 96boards;

- Sensor Grove IMU 10DOF MPU - 9250 (não limitado ao uso de um único sensor);

- Fonte de alimentação externa 11.1V;

- Jumper fêmea-fêmea;

Step 2: Dragonboard 410c Com Mezzanine 96Boards: Configuração E Pinagem

O Shield Mezzanine deve ser acoplado à placa Dragonboard 410c, para que haja fornecimento de saída 3.3V / 5V (level shifter), pois a placa só fornece 1.8V de saída. O sensor utilizado foi um magnetômetro Sensor MPU – 9250 Grove -IMU 10DOF, especificações:

Tensão de Entrada: 5V / 3.3V;

Corrente de funcionamento: 6mA;

Comunicação Serial;

Pinos: VCC, GND, SDA e SCL;

I2C interface;

Para este exemplo foi utilizado um dos conectores Grove I2C0 (5V), que proporciona a comunicação Serial e a alimentação necessária para funcionamento do sensor. (ver imagem)

Step 3: Integração: Unity + Vuforia

1- Vá ao site da vuforia na área de desenvolvedor e crie uma chave.

2- Vá na tab Target Manager e adicione uma textura para fazer o Tracking (quanto mais complexa melhor).

3- Feito isso baixe a database para o Unity e importe.

4- No Unity configure um image target com a textura escolhida e dentro dele adicione os modelos 3D que deseja utilizar,os mesmos estarão ativos quando a imagem for localizada pelo app.

5- Adicione a chave de licença da vuforia nas configurações dentro do Unity.

6- Após isso modele os componentes da aula em algum programa 3D e prepare as aulas em cima do image target (pode ser uma aula de Biologia ou Física...).

Step 4: Unity: Configure O Android SDK

1- Baixe o SDK do Android, vá em Unity preferences e selecione o seu diretório.

2- Mude a build plataform do Unity para o android, assim conseguiremos gerar o APK.

3- Instale o apk em um dispositivo (não esqueça de permitir fontes desconhecidas nas configurações).

Step 5: Criando Servidor Local E Recebendo Informações Em Python

Concluídas as configurações apresentadas, podemos acessar o Sistema Linaro dentro da placa e utilizar várias linguagens como C++, Java, Python, etc., para criar o software que será executado. Este software é responsável por receber os dados lidos pelo sensor, processar e tratar estes dados conforme solicitado pelo programa. Depois carrega esses dados para o servidor alocado na própria placa para enviar os dados já tratados para a plataforma Unity. Os exemplos de código deste projeto estão em linguagem Phyton. Os dados são transferidos da Dragonboard 410c para o Unity e são apresentados em um app.

Seguem os códigos mag_python.py (leitor de dados do sensor), server2.py(Servidor local), Executável no Shell:


Código mag_python.py


#!/usr/bin/python

# Author: Jon Trulson

# Copyright (c) 2015 Intel Corporation.

#

# Permission is hereby granted, free of charge, to any person obtaining

# a copy of this software and associated documentation files (the

# "Software"), to deal in the Software without restriction, including

# without limitation the rights to use, copy, modify, merge, publish,

# distribute, sublicense, and/or sell copies of the Software, and to

# permit persons to whom the Software is furnished to do so, subject to

# the following conditions:

#

# The above copyright notice and this permission notice shall be

# included in all copies or substantial portions of the Software.

#

# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,

# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF

# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND

# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE

# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION

# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION

# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

from __future__ import print_function

import time, sys, signal, atexit, urllib, urllib2, math

from upm import pyupm_mpu9150 as sensorObj

def main():

# data = {}

# data['magnetrometro'] = raw_input(" Informe a temperatura")

# data = urlib.urlencode(data)

# post_request = urlib2.Request(post_url,data,headers)

# try:

# post_response = urlib2.urlopen(post_request)

# print post_response.read()

# except URLError as e:

# print "Error: ", e.reason

# Instantiate an MPU9250 on I2C bus 0

sensor = sensorObj.MPU9250()

## Exit handlers ##

# This function stops python from printing a stacktrace when you hit control-C

def SIGINTHandler(signum, frame):

raise SystemExit

# This function lets you run code on exit

def exitHandler():

print("Exiting")

sys.exit(0)

# Register exit handlers

atexit.register(exitHandler)

signal.signal(signal.SIGINT, SIGINTHandler)

sensor.init()

x = sensorObj.new_floatp()

y = sensorObj.new_floatp()

z = sensorObj.new_floatp()

while (1):

sensor.update()

sensor.getAccelerometer(x, y, z)

# print ("Accelerometer: ")

# print ("AX: %.4f" % sensorObj.floatp_value(x), end=' ')

# print (" AY: %.4f" % sensorObj.floatp_value(y), end=' ')

# print (" AZ: %.4f" % sensorObj.floatp_value(z))

modulo1 = (sensorObj.floatp_value(x)-0.005)**2+(sensorObj.floatp_value(y)-0.0150)**2+(sensorObj.floatp_value(z)-0.0450)**2

# print(modulo1)

modulo1 = ("%.1f" % abs(((modulo1**0.5)-1)*9.8))

# print (modulo1)

#

# sensor.getGyroscope(x, y, z)

# print("Gyroscope: GX: ", sensorObj.floatp_value(x), end=' ')

# print(" GY: ", sensorObj.floatp_value(y), end=' ')

# print(" GZ: ", sensorObj.floatp_value(z))

sensor.getMagnetometer(x, y, z)

# print("Magnetometer: MX: ", sensorObj.floatp_value(x), end=' ')

# print(" MY: ", sensorObj.floatp_value(y), end=' ')

# print(" MZ: ", sensorObj.floatp_value(z))

modulo2 = sensorObj.floatp_value(x)**2+sensorObj.floatp_value(y)**2+sensorObj.floatp_value(z)**2

# print(modulo2)

modulo2 = ("%.2f" % (modulo2**0.5))

# print (modulo2)

arq = open('/tmp/dados.txt', 'w')

texto = []

texto.append(str(modulo2)+","+str(modulo1))

arq.writelines(texto)

arq.close()

# link = ('http://data.sparkfun.com/input/0lwWlyRED5i7K0AZx4JO?private_key=D6v76yZrg9CM2DX8x97B&mag='+str(modulo2))

# print ('enviando dados')

# send = urllib2.urlopen(link)

# page = send.read()

# print (page)

# link = ('http://data.sparkfun.com/input/1noGndywdjuDGAGd6m5K?private_key=0mwnmR9YRgSxApAo0gDX&acel='+str(modulo1))

# print ('enviando dados')

# send = urllib2.urlopen(link)

# page = send.read()

# print (page)

# print("Temperature: ", sensor.getTemperature())

# print()

# time.sleep(.5)

if __name__ == '__main__':

main()

Código do Servidor Local


import time

import BaseHTTPServer

HOST_NAME = '172.17.56.9' # !!!REMEMBER TO CHANGE THIS!!!

PORT_NUMBER = 80 # Maybe set this to 9000.

a=0

class MyHandler(BaseHTTPServer.BaseHTTPRequestHandler):

def do_HEAD(s):

s.send_response(200)

s.send_header("Content-type", "text/html")

s.end_headers()

def do_GET(s):

dados = le_dados()

print (dados)

"""Respond to a GET request."""

if s.path=="/1":

s.send_response(200)

s.send_header("Content-type", "text/plain")

s.end_headers()

s.wfile.write(dados)

elif s.path=="/2":

s.send_response(200)

s.send_header("Content-type", "text/plain")

s.end_headers()

s.wfile.write("2")

else:

s.send_response(200)

s.send_header("Content-type", "text/plain")

s.end_headers()

s.wfile.write(dados)

#s.wfile.write("not found!!")

def le_dados():

arq = open('/tmp/dados.txt', 'r')

texto = arq.readline()

arq.close()

return texto

if __name__ == '__main__':

server_class = BaseHTTPServer.HTTPServer

httpd = server_class((HOST_NAME, PORT_NUMBER), MyHandler)

print time.asctime(), "Server Starts - %s:%s" % (HOST_NAME, PORT_NUMBER)

try:

a=a+2

httpd.serve_forever()

except KeyboardInterrupt:

pass

httpd.server_close()

print time.asctime(), "Server Stops - %s:%s" % (HOST_NAME, PORT_NUMBER)

Código de Execução dos Códigos anteriores no Shell


#!/bin/bash

echo "starting mag_python"

sudo python mag_python.py &

echo "start server"

sudo python server2.py

Step 6: Resultado Final

Feito isso as aulas poderão ser auxiliadas e incrementadas pelo projeto Smart Lesson desenvolvido com a Dragonboard 410c. Servindo de facilitador e proporcionando um maior aprendizado nos sistemas de ensino tanto público quanto privado.

LINK para app no Google Play: https://play.google.com/store/apps/details?id=com...

Link para códigos Py: https://github.com/FerNan0/python