Podoscan 3D
Open design, hardware, software, source
Hardware client Serveur, Software Lubuntu Python, Algorythme, Code


Page en cours de réalisation...

Design

PDF
DXF
PDF
DXF
PDF
DXF

Hardware

Client, le meilleur des deux mondes : Linux + Arduino = PcDuino

Le pcDuino, dans la lignée du raspberryPi, est un mini-PC qui tient sur une mini-carte électronique grande comme 2 cartes de crédits. Rapide comparatif du pcDuino avec le Raspberry Pi Un mini-PC de plus me direz-vous... ?! Entre-nous, la tendance lourde est là, et ce n'est qu'un début... Bref, qu'est-ce que le pcduino a-t-il de plus qu'un RaspberryPi, la référence en ce domaine ? Et bien plusieurs caractéristiques sont intéressantes qui en font probablement une solution à regarder de très près pour vos futurs projets : côté «pc» : le processeur ARM est plus puissant, cadencé à 1Ghz directement compatible avec une distribution Ubuntu, dispose d'une mémoire flash NAND de 2 Go disposant déjà d'un système Lubuntu installé 1 Go de RAM connecteur de carte micro-SD connecteur réseau éthernet, connecteur HDMI, connecteur USB côté «arduino» : dispose d'un connecteur d'entrée-sorties numériques qui a le même brochage qu'une carte Arduino : on retombe donc sur ses pieds si l'on connaît bien Arduino (les broches E/S sont numérotées de 0 à 13, le port UART est sur les broches 0 et 1, comme sur la carte Arduino). dispose également de 6 broches de mesures analogiques (!!), le véritable «manque» du Raspberry-Pi.

Serveur : La brique Internet

Extrait du site : https://labriqueinter.net/ Comment ça marche ? La Brique Internet, [utilisé dans le cadre de l’exposition] est un simple boîtier VPN couplé à un serveur. [pour les plus curieux, vous le verrez branché au plafond, au dessus de l’installation] Un VPN sert à relier un ordinateur à un autre, [dans notre cas, il relie le podoscan par WIFI à l’internet] de façon sécurisée [cela garantit une confidentialité sans faille pour les photos prises par le podoscan], de façon à ce qu'aucun intermédiaire sur Internet ne puisse lire le contenu des communications qui transitent. Pour que la Brique fonctionne, il faut lui configurer un accès VPN, qui lui permettra de créer un tunnel jusqu'à un autre ordinateur sur Internet [nous utilisons cette fonction pour diagnostiquer si le podoscan fonctionne correctement, sans bouger de chez nous]. En vous connectant simplement en WiFi sur la Brique, vous pourrez aller sur Internet, en passant automatiquement au travers de ce tunnel chiffré [le podoscan ne va pas sur internet, il se contente de sauvegarder les photos sur la brique]. De cette façon, votre Fournisseur d'Accès à Internet (FAI) ne peut plus ni vous espionner, ni vous brider ni vous filtrer . C'est le même mécanisme qui permet à la Brique d'être un serveur nomade. [c’est sur ce mini serveur qu’est auto-hébergé le site http://podoscan.formmaker.org et de ce fait l’installation peut être déplacé n’importe où] Les avantages que nous avons retenu pour notre utilisation : S'auto-héberger : grâce au logiciel YunoHost, la Brique vous permet de conserver vos emails et autres données personnelles chez vous plutôt que sur l'ordinateur d'un inconnu (ce qu'on appelle le cloud) ; YunoHost permet à quelqu'un qui s'intéresse à l'informatique, sans en être expert, d'auto-héberger plein de services différents (mail, partage de fichiers, blog, agenda en ligne, etc.) ; PS : vous pouvez utilisez une même Brique, à la fois pour nettoyer votre accès à Internet grâce à son réseau WiFi, et héberger vos services Internet. Economique, écologique : avec une consommation de 2W maximum avec le WiFi actif, vous pouvez alimenter la Brique avec une batterie ou un petit panneau solaire (une batterie à 12€ permet de tenir 13h) ; le boîtier est open-hardware et les logiciels sont libres ;

Software

Lubuntu

Lubuntu est un projet de distribution GNU/Linux visant à produire une version dérivée d'Ubuntu, plus légère, plus économe en ressources matérielles, et moins consommatrice en énergie. Pour y parvenir, Lubuntu utilise l'environnement de bureau LXDE. Source : https://fr.wikipedia.org/wiki/Lubuntu Sur le PC duino : La version 12.04 d'Ubuntu est en Anglais. On peut programmer en C, C++, Java et Python. Des API sont disponibles pour programmer ses interfaces. Xbmc est installé en version 12.0.

Python :

Extrait de : http://www.mon-club-elec.fr/mes_downloads/doc_pcduino/5b.pcduino_intro_programmer_python.pdf le langage Python est probablement la meilleure solution pour plusieurs raisons : langage interprété ne nécessitant pas de chaîne de compilation et pouvant notamment être testé ligne à ligne dans l'interpréteur Python il existe un éditeur léger à coloration syntaxique et auto-complétion automatique, permettant d'exécuter immédiatement le code avec affichage des messages dans la console : j'ai nommé Geany... déjà installé si vous avez suivi mes instructions précédentes... sinon, çà se fait en 1 ligne de commande ! langage peu gourmand en ressources (les paquets du langage Python ne prennent que quelques dizaines de Mo au plus à comparer au 200 Mo de Java + IDE Arduino...) langage permettant assez simplement la mise en place d'interfaces graphiques GUI «comme les pro » de toute sorte, dans lesquelles il sera facile d'intégrer les données issues des broches E/S, des mesures analogiques, etc... syntaxe simplifiée comparativement au C/C++ (pas de poin; de fin de ligne, pas d'accolades... utilise indentation pour structurer le code..) grande puissance de codage , notamment pour la gestion de tableaux, des types, etc... Il faut l'avoir testé pour comprendre de quoi on parle. Par exemple, en C, passer un tableau à une fonction est assez complexe... en Python, il n'y a aucun problème... çà se fait simplement. et surtout gestion relativement simple du réseau éthernet, de la communication avec le système, de l'utilisation du port série... etc... le tout dans un même programme qui pourra gérer également les broches E/S du pcDuino. Ceci ne sera pas aussi facilement possible (pour ne pas dire impossible) avec l'IDE Arduino seul... ce qui fait perdre une bonne partie de l'intérêt de la plateforme pcDuino

Electronique

Le premier brouillon du circuit :

Algorythme

Ce qui fait le lien entre le hardware, le software « prêts  à l’emploi » et l’électronique composé à façon, c’est le programme :


appui bouton

        LED s'allument

        prend photo

        affiche photo

                pendant 5 secondes

        ferme photo

        Terminal demande

        Etes-vous satisfait de la photo

                oui ou non

                o pour sauvegarde photo (si rien pendant 30 secondes, recommence)

                        demande mail

                                vérif si mail est corecte

                                        transfère photo        

                                                Si transfère OK "votre photo a bien été transférée"

                                                Si non "la photo n'a pas pu être transférée, prévenez un admin"

                                si non redemande mail

                                si pas de mail annul au bou d'un certain temps et dossier poubelle        

                n pour recommencer

                        réappuyer sur le bouton pour prendre une photo

                        dossier poubelle


Code

#Programme pour faire fonctionner le podoscan

#par Irina Lambla et Frédéric Franken



# Inspiré des exemple pyDUino - par X. HINAULT - www.mon-club-elec.fr

# Tous droits réservés - GPLv3

# voir : https://github.com/sensor56/pyDuino



#from pyduino import * # importe les fonctions Arduino pour Python

from pyduino_multimedia_pcduino import * # importe les fonctions Arduino pour $



# entete declarative

noLoop=True



BP=2 # declare la broche a utiliser pour le bouton

APPUI=LOW # valeur broche lors appui

BOUTON_LED=3 # declare broche utilise pour la led du BOUTON

LED=4 # declare broche utilise pour la LED





filepath=""

save=""

poubelle=""



#--- setup ---

def setup():

pinMode(BP,PULLUP) # met la broche en entree avec rappel au plus actif

# Serial.println("La broche " + str(+BP)+" est en entree avec rappel au plus actif !")



pinMode(BOUTON_LED,OUTPUT) # broche en sortie

#Serial.println("La broche " + str(BOUTON_LED)+" est en sortie. ")



pinMode(LED,OUTPUT) # broche en sortie

#Serial.println("La broche " + str(LED)+" est en sortie. ")

Serial.println("LE PODOSCAN va prendre votre Selfeet, appuyez sur le bouton rouge lorsque vos pieds seront posés sur la vitre")



digitalWrite(LED,HIGH) # eteint les LED (inversion à cause du relais)

#digitalWrite(BOUTON_LED,LOW) # allume le BOUTON (inversion à cause du relais)

#m chemin





global filepath



# initialisation chemin

filepath=homePath()+dataPath(IMAGE) # no

# initialisation dossier des fichiers transférés

save=filepath+ "save/"

if not exists(save):

mkdir(save) # creation repertoire

print ("Creation repertoire fichiers transférés OK")



# initialisation poubelle

poubelle=filepath+ "poubelle/"

if not exists(poubelle):

mkdir(poubelle) # creation repertoire

print ("Creation repertoire poubelle OK")



# initialisation webcam

initWebcam(0,640,480) # la resolution doit etre supportee par la webcam !



loop() # premier appel loop()



# -- fin setup --



# -- loop --

def loop():



global filepath, save, poubelle



digitalWrite(LED,HIGH) # eteint les LED

digitalWrite(BOUTON_LED,LOW) # allume le BOUTON



if(digitalRead(BP)==APPUI): # si appui

Serial.println("3....2....1.... souriez :)")

digitalWrite(LED,LOW) # allume le BOUTON

delay(400)

digitalWrite(LED,HIGH) # éteint le BOUTON

delay(200)

digitalWrite(LED,LOW) # allume le BOUTON

delay(400)

digitalWrite(LED,HIGH) # éteint le BOUTON

delay(200)

digitalWrite(LED,LOW) # allume le BOUTON

delay(400)

digitalWrite(LED,HIGH) # éteint le BOUTON

delay(200)

digitalWrite(LED,LOW) # éteint le BOUTON

delay(1000)

#digitalWrite(LED,LOW) # allume la Led

#Serial.println("le BOUTON est éteint, la LED allumée !")

# nom de l'image avec l'heure actuelle

dateheur="Selfeet"+today("",-1)+"-"+nowtime("_")

filenameImage=dateheur+".jpg" # nom image horodate

print filenameImage

# capture image

captureImage(filepath+filenameImage) # charge une image dans le buffer a partir webcam

digitalWrite(LED,HIGH) # eteint les LED

Serial.println("le Selfeet horodaté est dans la boite !")

#addTextOnImage(today("/")+"@"+nowtime(":"), 10,height()-30, green) # ajoute texte sur image

addTextOnImage(nowdatetime(), 10,height()-20, blue,1) # ajoute texte sur image

saveImage(filepath+filenameImage) # enregistre l'image

showImage(filepath+filenameImage) # affiche l'image

delay(5000)

closeImage() # ferme visionneur image

ok = raw_input("Etes-vous satisfait de la photo ? (réponses O + Entrée ou N + Entrée)\n")

if ok in ('o', 'O', 'oui', ''):

mail = ""

mail_OK = False

while mail_OK == False:

mail = raw_input("Pour recevoir votre Selfeet, entrez votre adresse e-mail (facultatif) \n")

if mail == "":

ok = 'n'

break

arobase = False

for c in mail:

if arobase == False and c == '@' and mail[0] != '@' and mail[0] != '.':

arobase = True

if arobase == True and c == '.' and mail[-1] != '.' and c != '@':

mail_OK = True

if mail_OK:

filenameMail=dateheur+".txt" # nom qui correspond à l'image horodate

print filepath+filenameMail

appendDataLine(filepath+filenameMail, mail)

appendDataLine(save+"list_mails.txt", mail)

Serial.println("Lance le script bash qui se connect en sftp" )

executeCmd("~/python_code/sftp.sh") # execute le script bash

if ok in ('n', 'N', 'non'):

executeCmd("mv "+ filepath+filenameImage+ " "+ poubelle) # execute la commande de déplacement du fichier

#print ("réappuyer sur le bouton pour prendre une photo")

delay(250) # anti-rebond

Serial.println("Pour prendre votre Selfeet, appuyez sur le bonton rouge !")



timer(200, loop) # relance timer - la fonction loop s'auto-appelle

# -- fin loop --



#--- obligatoire pour lancement du code --

if __name__=="__main__": # pour rendre le code executable

setup() # appelle la fonction main

while not noLoop: loop() # appelle fonction loop sans fin

n'hésitez pas à nous contacter (podoscan@formmaker.org)