Étape 3: L’Interface : apprendre Python
Après avoir terminé la partie matérielle de la build, je suis allé pour s’attaquer à la partie du logiciel. Le GUI pour le kiosque devra se conformer à quelques critères de base :Facile à naviguer
Capable d’enregistrer un formulaire dans un fichier
Difficile de sortie
Difficile de Hack (forme attaques par Injection, etc.)
Multi-plateforme (donc je peux mettre sur ma machine Windows)
J’avais besoin d’une langue ou un outil qui rendrait ce GUI (relativement) indolore à assembler. Je n’ai pas fait tout non-Arduino programmation depuis... euh... BASIC ? Alors il est grand temps que j’ai appris une nouvelle langue, et je savais exactement celui que j’avais besoin : Python.
Pourquoi Python ? Parce que Python peut faire n’importe quoi. Eh bien, bon, pas autre chose que c’est une très belle langue pour « taper » une application rapide. Il y a également une énorme collection de bibliothèques disponibles pour accrocher toutes sortes de choses de Python. Pour ne pas mentionner que c’est multi-plateforme donc je pouvais faire tout ce qui de la mise au point sur ma machine Windows et charger ce même script sur le pcDuino sans aucun problème.
Parfois, la meilleure façon d’apprendre un nouveau langage de programmation est de simplement sauter dans votre projet avec les deux pieds. Trouver des bibliothèques que vous pensez que vous aurez besoin, ouvrir à tous l’exemple de code et commencer à prendre à part. Si vous lisez un début de script à la fin, à l’aide de Google pour chercher quoi que ce soit que vous ne comprenez pas, vous aurez une bonne compréhension de la syntaxe et les méthodes de la fin. A partir de là, il est tout de même ancienne mouture : écrire, courir, faire erreur, déboguer. Bien que si vous déplacez juste à Python de C c’est plus comme : écrire, exécuter, « vraiment, cela a fonctionné, hein? »
J’ai commencé en saisissant easyGUI, une bibliothèque bien nommée pour Python qui se branche sur TkInter (une liaison python pour le kit d’interface graphique Tk) et le rend super simple afficher et parcourir les formes simples. Vous pouvez faire tout ce que j’ai fait sans easyGUI, mais il ne sera pas aussi facile... GUI... (Où suis-je?)
Il est également très facile de contrôler la pcDuino GPIO depuis Python. Essentiellement, vous ouvrez simplement un fichier et modification d’une valeur, c’est vraiment aussi simple que ça. J’ai copier/coller du code d’un exemple, qui met quelques définitions en haut du script vous permettant d’utiliser le HIGH, LOW, entrée, sortie, etc. sans avoir à mémoriser quelle valeur représente chacun.
Je vais aller de l’avant et afficher mon code ci-dessous en morceaux (pas nécessairement en ordre écrit mais en ordre fonctionnel), puis essayer d’expliquer chaque bit pour le bénéfice de toute personne qui n’est pas familier avec Python. Je dois avertir quiconque est familier que j’ai habituellement code en C pour mon Python n’est pas très... Pythonique ? Cela fonctionne, cependant.
Bon, alors nous devons faire tout d’abord un peu de configuration :
importation easygui comme par exemple
moment de l’importation, os
# correctif rootWindowPosition
eg.rootWindowPosition = « + 180 + 20 »
Bien que ne devrait pas être trop effrayant pour les programmeurs de l’Arduino. Juste importer quelques bibliothèques, la même manière que vous utiliseriez « include ». Je l’ai déjà expliqué la bibliothèque easyGUI, mais la bibliothèque me donne juste la possibilité de mettre des retards dans le code.
Le peu laid il un patch est quelque chose que j’ai volé un morceau de l’exemple de code pour définir la position de la fenêtre de ma GUI. J’ai eu des ennuis avec mon gestionnaire de fenêtres juste il plopping à partout où il le voulait, de savoir si tout était à l’écran ou non. Le # indique le début d’un commentaire en Python, soit dit en passant.
La prochaine chose à faire est de préparer le GPIO !
GPIO_MODE_PATH = os.path.normpath('/sys/devices/virtual/misc/gpio/mode/')
GPIO_PIN_PATH=OS.Path.Normpath('/sys/devices/Virtual/misc/GPIO/pin/')
GPIO_FILENAME = « gpio »
pinMode =]
pinData =]
ÉLEVÉ = « 1 »
FAIBLE = « 0 »
ENTRÉE = « 0 »
SORTIE = « 1 »
INPUT_PU = « 8 »
car moi dans range(0,18) :
pinMode.append (os.path.join (GPIO_MODE_PATH, ' gpio'+str(i)))
pinData.append (os.path.join (GPIO_PIN_PATH, ' gpio'+str(i)))
pour la broche en pinMode :
fichier = open (goupille, « r + ») ## ouvrir le fichier en mode r/w
file.Write(output) ## définir le mode de la broche
file.Close() ## IMPORTANT - doit fermer un fichier pour apporter des modifications !
pour la broche en pinData :
fichier = open (goupille, « r + »)
file.Write(Low)
file.Close()
Tout cela a été également volé à un exemple de script. Il raconte essentiellement Python où les fichiers de broche GPIO contrôle sont conservées sur la pcDuino. Puis il définit les termes comme haut et entrée, et ensuite elle utilise une série de « pour » les boucles pour définir les broches GPIO dans un état connu.
Si vous êtes un programmeur de l’Arduino, alors vous avez sans doute remarqué quelque chose de fou maintenant : il n’existe pas n’importe quel des points-virgules ! Ou accolades ! Si le monde est devenu fou?? Eh bien, oui, mais pas par manque de ponctuation. Python est dicté par la mise en retrait. Les blocs de code sont séparés par le niveau de leur mise en retrait.
Bon, nous sommes tous fait avec le programme d’installation. Nous allons obtenir quelque chose à l’écran :
while(1) :
mainTurk()
def mainTurk() :
x = str (eg.buttonbox ("", titre = « Chocolat Turk", image="screen1.jpg », choix = ["Gimme Candy!", "Pourquoi?"]))
Si x == « Pourquoi? » :
msg = "chocolat Turk est un solutionneur de Mechanical Turk qui récompense les gens avec du chocolat ! \n \n, il a été construit à l’aide de la pcDuino comme une démonstration des capacités de l’appareil. L’interface et le logiciel de contrôle ont été programmés en Python avec l’aide des bibliothèques EasyGUI et PIL. \n \n un tutoriel sur la façon dont ce projet a été achevé seront disponibles sur le site de SparkFun Learn. \n \n MarComm pourquoi ne pas donner un coup de main dans la publicité ? Il y a chocolat dedans pour vous;) \n \n imaginé et réalisé par : Nick P. \n \n "
titre = « Tout chocolat Turk »
choix = ["Return", « Tuer le programme »]
tueur = eg.buttonbox (msg, titre, choix = choix)
Si le tueur == « Tuer le programme » :
sys.Exit()
autre chose :
Pass
autre chose :
chocoturk()
"Whoa, whoa, whoa... quoi?" Je sais, si vous êtes un programmeur de l’Arduino, cela peut ressembler à un désordre dans un premier temps. Pas de soucis, nous allons faire défiler il. Tout d’abord, j’ai commencer while(1) boucle donc le programme kiosque continuera à fonctionner encore et encore. La ligne suivante est un appel à eg.buttonbox (si vous vous souviendrez que nous avons importé easyGUI comme « eg ») qui est une méthode easyGUI qui crée une boîte de dialogue avec des boutons. Il s’agit d’une ligne de code condensé, donc c’est un peu étrange à la recherche, mais une chose qui vous aidera à comprendre ce qui se passe est la suivante: x tiendra la valeur de la touche enfoncée. Si vous vous demandez où x provenait, il n’a pas ! Nous avons fait juste vers le haut ! C’est vrai, en Python, vous n’avez pas à déclarer une variable, vous pouvez juste commencer à l’utiliser et Python se chiffre à ce que vous voulez faire avec elle.
Dans l’ordre, ce qui se passe, c’est que je suis remplissage x avec la version de chaîne de la valeur de l’appel de la fonction « eg.buttonbox ». Que la fonction prend quelques arguments : le titre de la fenêtre, le nom de l’image que je veux afficher et les choix que j’ai envie disponible. Lorsque cette chaîne s’exécute, une fenêtre appelée « Chocolat Turk » apparaît avec une image Récupérée de screen1.jpg et deux boutons marqué « Gimme Candy! » et « Why? ». Après un des boutons est activé, la fonction renvoie ce choix à la str(), qui « stringifies » il et le fourre dans x.
La prochaine étape est de tester x. Si x est égal à « Pourquoi? » (En d’autres termes, si vous appuyez sur le bouton « Why? ») puis j’ai pop un écran expliquant le projet. Juste pour vous donner un exemple élargi, j’ai oublié d’écrire tout cela sur une seule ligne. Vous pouvez voir que j’ai réellement farci chaque variable avant l’appel à eg.buttonbox. J’ai appelé la variable de retour « killer » parce que c’est le seul endroit dans le programme pour le tuer. En cliquant sur le « x » sur la fenêtre ne sera pas même le faire, parce que je n’écrivais pas quoi que ce soit pour gérer cela. Il s’agit d’une bonne chose, je ne voulais pas les personnes sortant de l’interface graphique de mon kiosque.
Les instructions else gérer par la suite tout ce qui se passe que si vous appuyez sur « Gimme Candy! » qui est, bien sûr, il plonge dans la fonction suivante, qui ressemble à ceci :
def chocoturk() :
msg = "choisir un produit que vous vous sentez assez familier avec: »
titre = « Choisir une carte »
choix = [« pcDuino », « IOIO-OTG », « SparkFun inventeurs Kit pour Arduino avec détail Case », « Makey Makey – Standard Kit », « LilyPad Arduino Simple planche », « Raspberry Pi – modèle B », « 9 degrés de liberté - rasoir IMU », « RedBoard – programmer avec Arduino », « XBee Explorer USB », « EasyDriver Stepper Motor Driver »]
choic = eg.choicebox (msg, titre, choix)
Si choic == None :
retour
image = « % s.jpg » % choic
MSG = « voulez-vous écrire une annonce pour le %s »? % choic
choix = [« Let's Do it! », "attendez, revenir en arrière!"]
réponse = eg.buttonbox(msg,image=image,choices=choices)
Si réponse == "attendre, revenir en arrière!" :
retour
autre chose :
val=["","","",""]
compositeur (choic, val)
retour
La première chose que j’ai besoin de l’utilisateur de faire est d’en choisir un de nos produits les plus vendus, donc j’ai qu’elles soient alignées tout dans ce qu’easyGUI appelle une choicebox. J’ai la chance d’être un peu intelligent, après que l’utilisateur sélectionne un produit. J’ai sauvé une photo de chaque produit en utilisant le nom du produit sous le nom de fichier. Donc quand je suis allé pour récupérer l’image pour la fenêtre suivante, j’ai juste sauté « .jpg » sur la fin de la réponse de choicebox dans l’argument d’image pour buttonbox.
J’ai aussi donné à l’utilisateur une chance de changer d’avis s’ils voulaient en retournant sur la fonction. Si elles confirment qu’ils veulent continuer alors je laisse tomber dans la fonction suivante, la fonction de compositeur.
compositeur de DEF (produit, retainVal) :
msg = "écrire la copie AdWords pour la \n \n %s mise en forme : \n \n-Headline \n limitée à 25 caractères. Liens vers la page du produit. \n \n-description \n vous obtenez 2 lignes de 35 caractères chacune pour décrire un produit SparkFun à un client ciblé à l’aide de Google recherche \n \n-Mots-clés : \n ce que 5 mots ou phrases lorsque le texte tapé dans Google, doit retourner votre annonce ? (Comma-Separated) \n \n « % produit
titre = « Compositeur de AdWords »
fieldNames = ["Headline", « Description Line 1 », « Description Line 2 », « Mots clés »]
fieldValues peuvent uniquement être = [retainVal [1], retainVal [2], retainVal [0], retainVal [3]]
fieldValues peuvent uniquement être = à eg.multenterbox (msg, titre, noms des champs, fieldValues peuvent uniquement être)
Si fieldValues peuvent uniquement être == None :
retour
si len(fieldValues[0]) > 25 :
EG.MsgBox ("vous avez trop de caractères dans votre titre. Pare il vers le bas.")
compositeur (produit, fieldValues peuvent uniquement être)
si len(fieldValues[1]) > 35 :
EG.MsgBox ("vous avez trop de caractères dans votre Description (ligne 1). Pare il vers le bas.")
compositeur (produit, fieldValues peuvent uniquement être)
si len(fieldValues[2]) > 35 :
EG.MsgBox ("vous avez trop de caractères dans votre Description (ligne 2). Pare il vers le bas.")
compositeur (produit, fieldValues peuvent uniquement être)
composereview (fieldValues peuvent uniquement être, produit)
retour
La fonction de compositeur est assez simple. J’ai juste besoin de l’utilisateur d’entrer du texte, c’est la tâche à laquelle ils sont récompensés pour. Si vous n’aviez pas pensé à elle dehors maintenant, elle est précisée dans l’argument de msg: nous avons essayé d’obtenir des personnes extérieures à notre département marketing à écrire un texte d’annonce. Étant donné que ceux-ci allaient théoriquement apparaissent sous forme d’annonces AdWords, ils avaient besoin pour se conformer à un certain format. J’ai ajouté quelques cas énoncés qui vérifient la longueur de caractère de chaque champ avant de récompenser l’utilisateur. S’il y avait trop de caractères dans un champ, je laisserais l’utilisateur sais pas lequel et retourner à la forme. Enfin, si ils ont réussi à remplir le formulaire je leur ai donné une chance d’examiner ce qu’ils avaient écrit à côté d’une photo du produit :
def composereview(adcopy, prod) :
image = « % s.jpg » % prod
msg = "Voici ce que vous avez écrit sur le \n \n % s: \n \n %s \n %s \n %s avec les mots clés : \n \n %s" % (prod, adcopy [0], adcopy [1], adcopy [2], adcopy[3])
choix = ["Gimme chocolat NAO!", "laissez-moi essayer à nouveau..."]
réponse = eg.buttonbox(msg,image=image,choices=choices)
Si réponse == « Laissez-moi essayer à nouveau... » :
compositeur (prod, adcopy)
autre chose :
f = open ('AdWordsDump.txt', 'a')
f.Write(Prod)
f.Write('\n')
f.Write(adcopy[0])
f.Write('\n')
f.Write(adcopy[1])
f.Write('\n')
f.Write(adcopy[2])
f.Write('\n')
f.Write(adcopy[3])
f.Write('\n')
f.Write('\n')
f.Close()
givethemthechocolate()
La « revue de composer » est une forme simple qui je peuplent les réponses transmises du compositeur et une photo du produit en utilisant la même astuce nom qu’à la fenêtre de sélection de produit. Si l’utilisateur décide qu’ils aiment ce qu’ils ont écrit, je l’enregistrer dans un fichier .txt gros où je stocke toutes les informations collectées depuis le kiosque. Oh oui, et les décharger dans la fonction définitive :
def givethemthechocolate() :
fichier = open (pinData [6], « r + »)
file.Write(High)
Time.Sleep(1)
fichier = open (pinData [6], « r + »)
file.Write(Low)
file.Close()
image = « thanks.jpg »
msg = ""
choix = ["Finish"]
EG.buttonbox(MSG,image=image,Choices=Choices)
mainTurk()
Dans cette fonction, j’ai simplement envoyer le distributeur de bonbons un pouls élevé, remettre cette sucrerie doux, doux. J’ai aussi montrer à l’utilisateur une image Merci et revenir à l’écran d’accueil.