Extraescolar Robòtica 2016-2017
Salta a la navegació
Salta a la cerca
Contingut
Introducció. Joc del SIMON
Video:
Jugar online (Javascript):
Solucions purament electrònica:
- http://www.waitingforfriday.com/index.php/Reverse_engineering_an_MB_Electronic_Simon_game
- https://www.sparkfun.com/products/retired/7947
Codi Python del Simon. Punt de partida:
Objectiu
L'objectiu és construir 4 prototips de Simon amb la Raspberry Pi, i un Simon finalitzat del tot.
Resultat final (juny 2017)
Youtube:
Article al blog:
Requisits
- Llums de colors
- So i notes musicals
- portable. Tamany petit.
Resum Sessions
13 sessions:
- Sessió 1: 2 març. Introducció al moviment Maker. Primers passos amb la Raspberry Pi. Introducció al projecte SIMON
- Sessió 2: 9 març. Mirem el codi original del Simon en el qual ens basem, i n'identifiquem les parts. Executem parts per separat, no cal que sigui a la Rpi, es pot executar directament a Linux/Ubuntu.
- Sessió 3: 16 març. Per fer un prototipus del joc del Simon necessitarem com a mínim poder apretar uns botons i que s'iluminin unes llumetes. En aquesta sessió començarem a treballar amb els pins GPIO per fer entrades i sortides. És la manera com la RPi es pot comunicar amb el món físic.
- Sessió 4: 23 març. En la sessió anterior vam fer les primeres proves per llegir i escriure en els pins GPIO. En aquesta sessió aprofundirem més en la programació de LEDs des de la Raspberry Pi.
- Sessió 5: 30 març. Volem que els botons del Simon siguin ben lluminosos. En la pràctica anterior encenies un LED controlat per un pin GPIO, però aquests pins només donen 3,3V. Està clar que si volem més llum necessitarem més tensió elèctrica. L'objectiu serà encendre 6 LEDs blancs (que fan força llum), controlats per un pin GPIO de la Raspberry Pi.
- Sessió 6: 6 abril. Avui fem una classe més tranquil.la. Discutim sobre la construcció del prototipus. Materials, dimensions,... Fem pluja d'idees i els alumnes aporten reflexions interessants.
- Sessió 7: 20 abril. Hem d'anar definit aspectes tècnics del nostre joc del Simon. Parlarem de com alimentem el nostre joc del Simon, i de com produirem el so.
- Sessió 8: 27 abril. En la sessió 6 vam estar discutint sobre el disseny industrial del Simon. En especial ens preocupa el disseny dels botons grossos i el sistema de molla/retorn del botó. Avui treballarem amb LibreCAD el disseny dels botons per tal de mecanitzar-ho amb una màquina CNC. Estudiarem el flux de treball que es fa servir: disseny CAD > Generació del G-Code > Fresat CNC. És un procés similar al que utilitzaem per a imprimir amb 3D.
- Sessió 9: 4 maig. Anem a construir ja els prototipus dels alumnes. Aquesta setmana ens centrarem en la construcció, la setmana vinent ens centrarem ja en el codi. Els alumnes disposen de la RPi, 4 botons, 4 LEDs de colors, resistències, cables, grimpadora,...
- Començar a posar-ho tot junt.
- Sessió 10: 11 maig. Ara que ja tenim construït el nostre prototip, anem ja a fer funcionar el Simon a partir d'un codi original de què disposem. Avui ja hem de jugar amb el Simon! Més endavant podrem fer modificacions i millores...
- Sessió 11: 18 maig. En aquesta sessió treballem el software, fins arribar a la versió que serà definitiva, i presentem l'estat del prototipus.
- Sessió 12: 25 maig. Versió en principi definitiva del software, simon_v6.py. Implementem el reset i altres millores. Discutim l'estat actual del prototipus. Discutim possibles i futures millores, com ficar una pantalleta.
- Sessió 13: 1 juny. Presentem el moble acabat. Mirem com han quedat connectats i soldats tots els components, i n'identifiquem totes les parts. Així mateix, hi ha un últim canvi en el software. I juguem!
Codi original. Llibreries necessàries
fitxer simon_original.py:
##!/usr/bin/env python #______________________________ # #Simon Game prototype #Piers Kennedy #12-07-2012 (update 27-02-2013) # #______________________________ import RPi.GPIO as GPIO import random import time import numpy import wave import pygame import subprocess GPIO.setmode(GPIO.BOARD) GPIO.setwarnings(False) #Set up sounds #This avoids any delay before sound starts pygame.mixer.pre_init(44100,-16,2,2048) #Initialise mixer pygame.mixer.init() subprocess.Popen('amixer cset numid=3 1',shell=True) SAMPLERATE = 44100 def createSignal(frequency, duration): samples = int(duration*SAMPLERATE) period = SAMPLERATE / frequency omega = numpy.pi * 2 / period xaxis = numpy.arange(samples, dtype=numpy.float) * omega yaxis = 32800 * numpy.sin(xaxis) return yaxis.astype('int16').tostring() def createWAVFile(filename, signal): file = wave.open(filename, 'wb') file.setparams((1, 2, SAMPLERATE, len(signal), 'NONE', 'noncompressed')) file.writeframes(signal) file.close() def playWAVFile(filename): sound = pygame.mixer.Sound(filename) sound.play() #blue sound 209Hz bluesound = '/tmp/blue.wav' signal = createSignal(frequency=209, duration=.4) createWAVFile(bluesound, signal) #yellow sound 252Hz yellowsound = '/tmp/yellow.wav' signal = createSignal(frequency=252, duration=.4) createWAVFile(yellowsound, signal) #red sound 310Hz redsound = '/tmp/red.wav' signal = createSignal(frequency=310, duration=.4) createWAVFile(redsound, signal) #green sound 415Hz greensound = '/tmp/green.wav' signal = createSignal(frequency=415, duration=.4) createWAVFile(greensound, signal) #losing tone 42 Hz losingtone = '/tmp/losingtone.wav' signal = createSignal(frequency=42, duration=3) createWAVFile(losingtone, signal) #Variables max = 100 #No. of rounds in game RoundNo = 1 RED = 1 GREEN = 2 YELLOW = 3 BLUE = 4 correct = True #Setup GPIO switches GPIOSwitch=[0,7,11,13,15] GPIO.setup(7, GPIO.IN) #red GPIO 7 GPIO.setup(11, GPIO.IN) #green GPIO 0 GPIO.setup(13, GPIO.IN) #yellow GPIO 2 GPIO.setup(15, GPIO.IN) #blue GPIO 3 #Setup GPIO LEDs GPIOLED=[0,12,16,18,22] GPIO.setup(12, GPIO.OUT) #red GPIO 1 GPIO.setup(16, GPIO.OUT) #green GPIO 4 GPIO.setup(18, GPIO.OUT) #yellow GPIO 5 GPIO.setup(22, GPIO.OUT) #blue GPIO 6 #Connect the ground to pin 6 and the positive to pin 1 (3V3) #Generate a random list of LED outputs colour=[] for n in range(1,max+2): colour.append(random.choice([RED,GREEN,YELLOW,BLUE])) #Function to switch LEDs on then off def LEDout(val): if (val==1): playWAVFile(redsound) elif (val==2): playWAVFile(greensound) elif (val==3): playWAVFile(yellowsound) elif (val==4): playWAVFile(bluesound) while pygame.mixer.get_busy(): GPIO.output(GPIOLED[val], True) GPIO.output(GPIOLED[val],False) time.sleep(0.15) return[] #Function to check when switch is pressed def SwitchChosen(): while True: if (GPIO.input(GPIOSwitch[RED])): return RED if (GPIO.input(GPIOSwitch[GREEN])): return GREEN if (GPIO.input(GPIOSwitch[YELLOW])): return YELLOW if (GPIO.input(GPIOSwitch[BLUE])): return BLUE #Function to flash LEDs after mistake def LoserLights(): playWAVFile(losingtone) for cycle1 in range(0,6): for cycle2 in range(1,5): GPIO.output(GPIOLED[cycle2], True) time.sleep(0.5) for cycle2 in range(1,5): GPIO.output(GPIOLED[cycle2], False) time.sleep(0.2) return[] #Main routine while correct: print("Round %i" %RoundNo) #LED cycle for mout in range(1,RoundNo+1): LEDout(colour[mout]) #Response for ans in range(1,RoundNo+1): push=SwitchChosen() LEDout(push) if(push!=colour[ans]): LoserLights() correct = False print("Unlucky!") print("You made it to round %i" %RoundNo) break RoundNo+=1 if (RoundNo==max+1): print("WOW!! You Rock dude") break time.sleep(0.5)
Anem a executar aquest codi en una Raspberry Pi 3 on hem instal.lat 2017-02-16-raspbian-jessie-lite.img, acabada d'instal.lar.
Executem el codi i solucionem els errors que ens dóna, degut a què ens manquen certes llibreries.
$ python simon_original.py Traceback (most recent call last): File "simon_original.py", line 13, in <module> import numpy ImportError: No module named numpy
NumPy is the fundamental package for scientific computing with Python
Hem d'instal.lar la llibreria numpy:
$ pip install numpy
per instal.lar pip,
$ sudo apt-get install python-pip
o millor:
$ sudo apt-get install python-numpy
Tornem a executar el nostre fitxer:
$ python simon_original.py Traceback (most recent call last): File "simon_original.py", line 15, in <module> import pygame ImportError: No module named pygame
python-pygame - SDL bindings for games development in Python (Python 2) $ sudo apt-get install python-pygame
i ara ja funciona:
$ python simon_original.py numid=3,iface=MIXER,name='PCM Playback Route' ; type=INTEGER,access=rw------,values=1,min=0,max=2,step=0 : values=1 Round 1
creat per Joan Quintana Compte, desembre 2016