Para terminar a apresentação do AD4M4ST0R faltava apenas o código.
O programa principal é um script escrito em python ‘joy.py’ que lida com o gamepad e os motores. O controlo da webcam e do buzzer é delegado em dois bash scripts (‘saycheese.sh’ e ‘beep.sh’).
O programa principal, “joy.py’:
import sys, traceback, os os.environ['SDL_VIDEODRIVER'] = 'dummy' # from math import sqrt from math import log10 from subprocess import call from time import sleep from pygame import joystick, event, display ### botoes ### B_TRIANG = 0 B_CIRC = 1 B_CROSS = 2 B_SQUARE = 3 B_LTRIG2 = 4 B_RTRIG2 = 5 B_LTRIG = 6 B_RTRIG = 7 B_SELECT = 8 B_LJOY = 10 B_RJOY = 11 B_START = 9 def main(): try: display.init(); joystick.init(); js=joystick.Joystick(0); js.init(); ### arranca em modo Joystick ### control_by_JOY=True; num_axes=js.get_numaxes(); num_buttons=js.get_numbuttons(); num_hats=js.get_numhats(); ### sabemos a priori que tem 4 axes, 13 buttons e 1 hat ### inicializa motores com Duty Cycle=0 call("echo 0 > /sys/class/tacho-motor/tacho-motor0/duty_cycle_sp", shell=True); call("echo 0 > /sys/class/tacho-motor/tacho-motor1/duty_cycle_sp", shell=True); call("echo 1 > /sys/class/tacho-motor/tacho-motor0/run", shell=True); call("echo 1 > /sys/class/tacho-motor/tacho-motor1/run", shell=True); flag=False; while True: x=y=motor_direito=motor_esquerdo=0.0; event.pump(); button_mode=js.get_button(B_SELECT); button_shot=js.get_button(B_SQUARE); if button_mode ==1: call("./beep.sh" , shell=True); if control_by_JOY==True: control_by_JOY=False; print 'Control Mode=HAT'; else: control_by_JOY=True; print 'Control Mode=JOYSTICK'; if button_shot==1: print 'Cheese!!!'; call("/root/saycheese.sh", shell=True); ### eixo dos joysticks entre -1 e +1 ### x=axis2 , y=-axis3 ### ignorar valores abaixo de 0.1 (dead zone) ### aplicar log10(100x) aos restantes (para dar enfase aos mais baixos) ### o resultado e' 0 ou 1 a 2 por isso ### multiplicar por 25 da' valores Duty Cycle nulos ou entre 25 e 50 if control_by_JOY==True: # Control by Right Joystick, Axis 2 e 3 axis2=js.get_axis(2); axis3=js.get_axis(3); if axis2>0: if axis2<0.1: x=0; else: x=log10(axis2*100); elif axis2<0: if axis2>-0.1: x=0; else: x=-log10(-axis2*100); if axis3>0: if axis3<0.1: y=0; else: y=-log10(axis3*100); elif axis3<0: if axis3>-0.1: y=0; else: y=log10(-axis3*100); else: y=0; if y<>0: if x<0: motor_direito=50*y/2; # rodar para a esquerda => reduzir motor esquerdo motor_esquerdo=motor_direito*(1+x/3); else: motor_esquerdo=50*y/2; # rodar para a direita => reduzir motor direito motor_direito=motor_esquerdo*(1-x/3); elif x<>0: # y=0, apenas roda motor_esquerdo=25*x; motor_direito=-motor_esquerdo; else: # Control by HAT keys hat=js.get_hat(0); if hat==(0,1): ### anda em frente ### motor_direito=50; motor_esquerdo=50; elif hat==(1,0): ### roda para a direita ### motor_esquerdo=50; motor_direito=-50; elif hat==(0,-1): ### recua ### motor_direito=-50; motor_esquerdo=-50; elif hat==(-1,0): ### roda para a esquerda ### motor_esquerdo=-50; motor_direito=50; elif hat==(1,1): ### frente e roda para a direita ### motor_esquerdo=50; motor_direito=25; elif hat==(-1,1): ### frente e roda para a esquerda ### motor_esquerdo=25; motor_direito=50; elif hat==(-1,-1): ### recua e roda para a esquerda ### motor_esquerdo=-50; motor_direito=-25; elif hat==(1,-1): ### recua e roda para a direita ### motor_esquerdo=-25; motor_direito=-50; comando_motordir = "echo " + repr(motor_direito) + " > /sys/class/tacho-motor/tacho-motor0/duty_cycle_sp"; comando_motoresq = "echo " + repr(motor_esquerdo) + " > /sys/class/tacho-motor/tacho-motor1/duty_cycle_sp"; call(comando_motordir, shell=True); call(comando_motoresq, shell=True); # end while except (KeyboardInterrupt, SystemExit): print "Exiting..."; except Exception: traceback.print_exc(file=sys.stdout); call("echo 0 > /sys/class/tacho-motor/tacho-motor0/duty_cycle_sp", shell=True); call("echo 0 > /sys/class/tacho-motor/tacho-motor1/duty_cycle_sp", shell=True); call("echo 0 > /sys/class/tacho-motor/tacho-motor0/run", shell=True); call("echo 0 > /sys/class/tacho-motor/tacho-motor1/run", shell=True); js.quit(); joystick.quit(); display.quit(); sys.exit(0); if __name__ == "__main__": main()
O controlo da webcam, ‘saycheese.sh’:
#!/bin/sh filename=$(date +"%d-%m-%y_%Hh%Mm%Ss") fswebcam -d /dev/video0 -p MJPEG -r 640x480 -q -D 1 -S 3 -s brightness=10 -s contrast=20 $filename.jpg
O controlo do buzzer, ‘beep.sh’:
#!/bin/bash echo -en " 07" > /dev/tty1
A quem o considerar útil, esteja à vontade para utilizar / feel free to use as you wish.