El microbot BOT120

De El raconet d'en Jordi

Dreceres ràpides: navegació, cerca
Basat en el microcotrolador PICAXE-20X2, és molt fàcil de muntar i configurar.

Inicialment porta un sensor de xoci un seguidor de línia, a més a més d'un soport per a llapis (per que deixi marcat sobre la pista el seu recorregut) i un connector tipus servo. Per muntar aquesta configuració tots els components venen soldats. Gràcies al sistema microbric, només cal ensamblar-los amb una clau Allen subministrada.

Podem afegir-li mòduls LDR, receptor SIRC, emissor SIR, de mesura de distància per ultrasons o de control de servo. Aquests mòduls auxiliars cal soldar els components sobre plaques del sistema microbric.

Com porta un PICAXE-20X2 SMD, no podrem canviar el microcontrol·lador. Però aquest és força potent i permet l'ús del Scratch for Arduino, carregant en el PICAXE-20X2 microbot el següent codi. S'ha de carregar en els primers 5 segons després d'engegar l'alimentació del microbot, i es pot modificar en funció dels mòduls connectats. En aquest cas, recordeu que la freqüència de rellotge està configurada a 32MHz i això afecta als temps de diverses instruccions.


; 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 microbot BOT120
; Jordi Orts jordi@jorts.net http://www.jorts.net
; r1 September 2012

; S4A name	BOT120 function			PICAXE 20X2 Pin
; Analog1	Analogue Sensor LDR L   		C.1
; Analog2	Analogue Sensor LDR R      		C.3
; Analog3	Analogue Sensor			    counter C.6
; Analog4	Analogue sensor sniffer			C.2	 				
; Analog5	Analogue sensor SFR005		        B.0	 
; Analog6	Not Used	 
; Digital1	Digital input button			C.6
; Digital2	 Not Used
;  	 	 
; Digital10	Digital output LED	      		B.1
; Digital11	Digital output LED			B.3
; Digital13	 Not Used
; 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	 Not Used			    			
; Motor12	 Not Used	 			

#picaxe 20X2

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 lastC6 = 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
	lastC6=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.1, InAnalog1
		Readadc10 C.3, InAnalog2
		if pinC.6=0 and lastC6=1 then
			 inc InAnalog3
		endif
		lastC6 = pinC.6
		inAnalog3 = inAnalog3 & %1111111111 
		Readadc10 C.2, InAnalog4
		pause 10	
		pulsout B.0, 16
		pulsin B.0, 1, inAnalog5
		inAnalog5 = inAnalog5  / 46              ' convert to cm
		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 = 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.3
	else
		low B.3	        'digital out off
	endif

	return







Tornar a l'índex