Scratch: Programació pels més petits

De El raconet d'en Jordi

Dreceres ràpides: navegació, cerca

SCRATCH és un entorn d'aprenentatge creat pel MIT amb un sistema de programació gràfic molt senzill, basat en blocs, que el fa molt interessant per treballar amb alumnes de primària.

Es tracta de programari lliure, amb versions per Windows, Mac i GNU/Linux. El podeu descarregar de la web original, i trobareu molta informació a la web del citilab, on es desenvolupen molts projectes al nostre país. La velocitat superior dels PICAXE M2 i X2 permet la comunicació amb aquest entorn, emulant la interfície picoboard original. Ara mateix els esforços es centren en el PICAXE-18M2. Trobareu més informació a la web de PICAXE.

Una de les limitacions de l'Scratch és la manca de sortides digitals. El projecte desenvolupat gràcies a Citlilab Scratch for Arduino (S4A) permet controlar aquestes sortides, i és compatible amb els PICAXE M2.

La placa BOT115, amb un PICAXE-18M2 permet el control de sortides digitals, motors bidireccionals i servo amb aquest entorn.

També podem utilitzar els sensors d'un mòbil o tablet android com a sensors remots.

A la pàgina SCRATCH & PICAXE trobareu el codi a carregar per a diferents plaques: Imagina, AXE092, CHI035, CHI030

També el podeu utilitzar amb el microbot BOT120, per al que us he deixat el codi del firmware necessari.


La placa d'entrenament T4 (AXE055)

Aquesta placa porta un regulador de tensió incorporat que permet alimentar-la amb qualsevol font d'alimentació (7,5-9V) i tot un seguit d'entrades i sortides integrades en la placa:

Entrades

  • LDR
  • Potenciòmetre
  • sensor de temperatura DS18B20
  • 2 entrades digitals per polsador

Sortides

  • LEDs per a totes les sortides (L)
  • Display de 7 segments (7)
  • Brunzidor piezoelèctric (P)
  • Connector per a servo (S) + regletes
  • Connector per a motor pas a pas unipolar (driver ULN2003A) + regletes
  • Regletes per a 2 motors bidireccionals CC (driver L293D)

Porta un DIP switch per desconnectar sortides específiques (L 7 P S).

També es pot controlar aquesta placa amb S4A si utilitzem un PICAXE-18M2 i carreguem el següent programa, que actualment no permet el control de totes les possibilitats d'entrades i sortides:

; PICAXE-18M2 firmware to emulate a picoboard for use with S4A
; Could be modified for use with any M2 or X2 part

; Version 0.01 (beta)

; Note that you will need a power-up hard-reset to reprogram the 18M2
; chip after this firmware has been programmed into the 18M2 chip

; Adapted to T4 training board with PICAXE-18M2
; Jordi Orts jordi@jorts.net http://www.jorts.net
; r1 September 2012

; S4A name	T4 function			PICAXE 18M2 Pin
; Analog1	Analogue Sensor e.g.LDR		    C.0
; Analog2	Analogue Sensor				 C.1
; Analog3	Analogue Sensor			    counter C.5
; Analog4	Not Used	 				
; Analog5	Not Used	 
; Analog6	Not Used	 

; Digital1	Digital input e.g. button			C.6
; Digital2	Digital input					  C.7
;  	 	 
; Digital10	Digital output e.g. LED		B.1
; Digital11	Digital output			      B.2
; Digital13	Digital output			      B.3

; Analog5	Not Used	
; Analog6	Not Used	 
; Analog9	Not Used	 
; Motor4	DC Motor output (L293D)		B.4 and B.5
; Motor7	DC Motor output (L293D)		B.6 and B.7
; Motor8	Servo (not tested)			   B.0 			
; Motor12	Not Used	 			

#picaxe 18m2

setfreq m32

Symbols:
Symbol Ch0 = %1000000000000000
Symbol Ch1 = %1000100000000000
Symbol Ch2 = %1001000000000000
Symbol Ch3 = %1001100000000000
Symbol Ch4 = %1010000000000000
Symbol Ch5 = %1010100000000000
Symbol Ch6 = %1011000000000000
Symbol Ch7 = %1011100000000000

Symbol lastC5 = bit0
Symbol InAnalog1 = w1
Symbol InAnalog2 = w2
Symbol InAnalog3 = w3
Symbol InAnalog4 = w4
Symbol InAnalog5 = w5
Symbol InAnalog6 = w6
Symbol InDigital1 = w7
Symbol InDigital2 = w8

Symbol Out = w9
Symbol LB = b18 ; low byte of out
Symbol HB = b19 ; high byte of out
Symbol shiftbits = w10
Symbol servo_pulse = w11

init:
	wait 5					; wait helps with new program download
	disconnect					; before the disconnect (after power-up)
	InAnalog3 = 0
	lastC5=1
main:
	do
		; Test
		;InAnalog1 = 100			'gather data about the sensors in this section
		;InAnalog2 = 200
		;InAnalog3 = 300			'the maximum time this section can take to run
		;InAnalog4 = 400
		;InAnalog5 = 500			'is about 58mS.  Sensor readings should be in
		;InAnalog6 = 600
		;InDigital1 = 0			'10 bit resolution - ie a 0 to 1023 scale.
		;InDigital2 = 1023
							'Digital sensors should be 0 or 1023.
		; End of test					
							
		Readadc10 C.0, InAnalog1
		Readadc10 C.1, InAnalog2
		if pinC.5=0 and lastC5=1 then
			 inc InAnalog3
		endif
		lastC5 = pinC.5
		inAnalog3 = inAnalog3 & %1111111111 
		InAnalog4 = 0
		InAnalog5 = 0
		InAnalog6 = 0
		InDigital1 = pinC.6 * 1023
		InDigital2 = pinC.7 * 1023

		pause 20

		gosub transmit_sensors

		gosub read_outputs

		gosub update_outputs
	loop

transmit_sensors:
	Out = InAnalog1  | Ch0
	gosub transmit
	Out = InAnalog2  | Ch1
	gosub transmit
	Out = InAnalog3  | Ch2
	gosub transmit
	Out = InAnalog4  | Ch3
	gosub transmit
	Out = InAnalog5  | Ch4
	gosub transmit
	Out = InAnalog6  | Ch5
	gosub transmit
	Out = InDigital1 | Ch6
	gosub transmit
	Out = InDigital2 | Ch7
	gosub transmit
	return

transmit:
	shiftbits = Out & %0000001110000000 * 2
	Out = Out & %1111100001111111 | shiftbits
	sertxd(HB)
	sertxd(LB)
	return

read_outputs:
	bptr = 100
	serrxd [3000,main],@bptrinc,@bptrinc,@bptrinc,@bptrinc,@bptrinc,@bptrinc,@bptrinc,@bptrinc,@bptrinc,@bptrinc,@bptrinc,@bptrinc,@bptrinc,@bptrinc,@bptrinc,@bptrinc,@bptrinc,@bptrinc,@bptrinc,@bptrinc
	return

update_outputs:

	#rem
	location 101: channel 4 data
	location 103: channel 5 data
	location 105: channel 6 data
	location 107: channel 7 data
	location 109: channel 8 data
	location 111: channel 9 data
	location 113: channel 10 data
	location 115: channel 11 data			
	location 117: channel 12 data
	location 119: channel 13 data
	#endrem

	bptr = 101
	if @bptr = 1 then	'motor 4 clockwise
		high B.4
		low B.5
	else if @bptr = 2 then	'motor 4 anticlockwise
		low B.4
		high B.5
	else			'motor 4 off
		low B.4
		low B.5
	endif
	
	bptr = 107
	if @bptr = 1 then	'motor 7 clockwise
		high B.6
		low B.7
	else if @bptr = 2 then	'motor 7 anticlockwise
		low B.6
		high B.7
	else			'motor 7 off
		low B.6
		low B.7
	endif

	bptr = 108
	' get servo value in degrees, valid 90 to 270
	' then convert them to servo pulse, range 75 to 225 
	servo_pulse = @bptrinc & %00000111 * 128
	servo_pulse = @bptr & %01111111 + servo_pulse MAX 270 MIN 90 - 90 * 5 / 6 + 75 * 8 
	pulsout B.0, servo_pulse

	bptr = 113
	if @bptr = 1 then	'digital out on
		high B.1
	else
		low B.1	'digital out off
	endif

	bptr = 115
	if @bptr = 1 then	'digital out on
		high B.2
	else
		low B.2	'digital out off
	endif

	bptr = 119
	if @bptr = 1 then	'digital out on
		high B.3
	else
		low B.3	'digital out off
	endif

	return