Clone Wars: Papa quiero un robot: CachaTuga

From RepRap
Revision as of 07:24, 2 November 2012 by JmartinCW (talk | contribs) (Modificación del código S4A)
Jump to: navigation, search
CachaTuga.jpg

Objetivo

El objetivo es hacer un cacharro tipo tortuga de logo con las siguientes características:

  • Que se pueda programar fácilmente con herramientas de programación gráfica
  • Barato
  • Reproducible y modificable
  • Que cumpla el principio de <math>Hardware Libre^2</math> (by Obijuan)

Idea inicial

  • Herramienta de programación gráfica: S4A
  • Cerebro del cacharro: Arduino Uno
  • Conexión arduino/S4A: módulo bluetooth HC05
  • Ruedas: dos servos de rotación continua
  • Accionador del lápiz: servo normal
  • Retroalimentación: ¿ratón óptico?

Fuentes

Las fuentes que voy generando se pueden encontrar en el repositorio de bitbucket

Iteración 0

Objetivos

  1. Conectar S4A con Arduino a través del módulo bluetooth HC05
  2. Crear un prototipo físico funcional
  3. Crear las siguientes primitivas en S4A para mover el cacharro:
    • Mover tortuga n pasos hacia:
      • adelante
      • atrás
    • Girar tortuga n grados a la:
      • izquierda
      • derecha
    • Lápiz de tortuga arriba
    • Lápiz de tortuga abajo

Implementación

La conexión Arduino-Scratch ya lo tienen solucionada la gente de S4A. Para utilizar S4A con CachaTuga hay que solucionar un par de temas:

  • Hacer funcionar S4A con un módulo bluetooth HC05:
    • Solucionado en WIN 7. "Sólo" hay que cambiarle al módulo la velocidad de operación a 38.400 bps
    • En Ubuntu 12.01 no soy capaz de hacerlo funcionar. He hecho un enlace simbólico de /dev/ttyACM1 a /dev/rfcomm0 (parece que Scratch sólo lee ttyUSBX en el caso de que sea una versión anterior a las Uno o ttyACMX si es posterior). Al arrancar S4A salta la ventana que pide la contraseña para emparejar el módulo, pero después lo "desempareja"... Supongo que pasará algo parecido a lo que cuentan en este artículo de LMR...
  • Retroalimentación: Toda la lógica se hace en el PC, en el arduino "sólo" hay un sketch que escucha y envía información. Esto habría que cambiarlo para que el μC haga el trabajo de calcular cuando el robot ha avanzado "un paso" o detecte un borde y en squeak se haga la programación tipo logo (andar 4 pasos, girar 30 grados...). Este tema se intentará resolver en otra iteración.

Prototipo físico

Para conectar el módulo HC05 al Arduino he utilizado el PaperBluetooth: Bluetooth Shield para Arduino de Txapuzas.

He utilizado cartón-pluma como base para todo.

De un Dagu Adventure Robo Kit he canibalizado los servos y la estructura donde va montado el bolígrafo.

Modificación del código S4A

Más detalles en Clone_Wars:_Papa_quiero_un_robot:_CachaTuga:_S4A#Iteracion 0

Nuevos Bloques añadidos

En la clase ArduinoScratchSpriteMorph bajo el protocolo cachatuga commands he creado las nueva variables turtleBotDirections

turtleBotDirections

	^ #(
		  'forward'
		  'backward'
	)

y turtleBotDirections

turtleBotTurnDirections

	^ #(
		  'right'
		  'left'	
	)

Para que se pueda utilizar hay que añadirla en el método uncoloredargMorphFor de la clase CommandBlockMorph de la categoría Scratch-Blocks

	$j = t2 ifTrue: [^ ChoiceArgMorph new getOptionsSelector: #turtleBotDirections].
	$J = t2 ifTrue: [^ ChoiceArgMorph new getOptionsSelector: #turtleBotTurnDirections].

En la categoría de sistema S4A en la clase ArduinoScratchSpriteMorph en el método blockSpecs he añadido los siguientes bloques:

	-
	('turtle move %n steps'			-	turtleGo: 4 )
	('turtle turn %n grades %j'		-	turtleTurn:direction: 90 'right')
	('turtle pen up'			-	turtlePenUp)
	('turtle pen down'			-	turtlePenDown)

Nuevos Métodos añadidos

En la categoría de sistema S4A en la clase ArduinoScratchSpriteMorph en el protocolo cachatuga commands he añadido los siguientes métodos:

  • turtleGo: steps direction: direction

turtleGo: steps direction: direction 
	'backward' = direction
		ifTrue: 
			[self arduinoBoard servomotor: 4 direction: 'anticlockwise'.
			self arduinoBoard servomotor: 7 direction: 'clockwise'].
	'forward' = direction
		ifTrue: 
			[self arduinoBoard servomotor: 4 direction: 'clockwise'.
			self arduinoBoard servomotor: 7 direction: 'anticlockwise']

  • turtlePenDown
  • turtlePenUp
  • turtleTurn: grades direction: direction

Resultado

Prototipo funcional. Desde S4A se le puede decir que vaya hacia adelante, hacia atrás, que gire a izquierda o derecha o que levante y baje el boli. Seguirá avanzando en la dirección indicada hasta que no se le diga lo contrario. Al no estar calibrados los servos, hacia adelante una rueda va más rápida que otra.

  • Foto del prototipo CachaTuga v0:
CachaTugaProtov0.jpg


  • Vídeo del prototipo:

<videoflash type="youtube">2K-ITuanrCo|320|240</videoflash>


  • Pantalla de S4A con las nuevas primitivas (a medio traducir):
S4Amod.JPG


Proyectos

Papaquierounrobot.jpg

¡Papá quiero un robot!

Clone-Wars-logo.png

Proyecto Clone Wars