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