Agora que já sabemos como programar os XBees em Python, vamos subir um pouco e em vez de passar caracteres pelos XBee, vamos passar dados, neste caso uma imagem.

Vamos usar a camera do PI para tirar a foto e posteriormente enviar para outro computador.

Cliente para tirar a fotografia e enviar a imagem. Colocar no RPi com a maquina fotografica ativa.

import os
import sys
import time
import fcntl
import serial
import picamera
from PIL import Image

serial = serial.Serial()
serial.port = '/dev/ttyUSB0'
serial.baudrate = 9600
serial.timeout = 1
serial.writeTimeout = 1
serial.open()

'''
	Leituras I/O em Linux bloqueiam  se nao houver
	caracteres para ler.
	Necessario desligar o bloqueio.
	Retirado de: 
	The Simplest XBee Network
'''
#non-blocking
fcntl.fcntl(sys.stdin, fcntl.F_SETFL, os.O_NONBLOCK)

serial.writelines("RPi is up and running.\r\n");

try:
	print 'Taking a shot'
	with picamera.PiCamera() as camera:
		# Alterar a resolucao se desejado
		camera.resolution = (320, 240)
		camera.start_preview()
		time.sleep(2)
		'''
			Onde guardar as imagems
			Criar diretoria se necessario
			ou remover se nao interessar
		'''
		camera.capture('imagens/shot.jpg')
		camera.stop_preview()
	print 'Shot taken'
	# Indica ao servidor que vamos comecar a enviar a imagem
	serial.writelines ("<FILE>\r\n")
	print 'Sending file..'
	with open ('imagens/shot.jpg','r') as imgfile:
		for line in imgfile:
			serial.flushInput()
			serial.flushOutput()
			serial.writelines(line)
	# Indicar o final do envio
	# serial.writelines("<<EOF>>\r\n")
	print 'File sent'	

except KeyboardInterrupt:
	print 'CTRL+C pressionado! Terminar'

serial.close()

Algumas configurações a efetuar.

Na linha 32 está a definição da resolução que vai ser usada para tirar as fotografias. Neste caso está 320×240.

As linhas 33 e 34 permitem que a camera arranque como deve ser.

A linha 40 indica onde guardar a foto tirada, bem como o nome. O nome tem que ser consistente com a linha 46.

Assim que terminar de enviar o ficheiro, o script simplesmente termina.

Script para receber imagem tirada

import os
import sys
import time
import fcntl
import serial

serial = serial.Serial()
serial.port = '/dev/ttyUSB0'
serial.baudrate = 9600
serial.timeout = 1
serial.writeTimeout = 1
serial.open()

#non-blocking
fcntl.fcntl(sys.stdin, fcntl.F_SETFL, os.O_NONBLOCK)

# Criar ficheiro de imagem a receber
# Poderia ser usado a linha de comandos
# para determinar o nome
# proxima versao
newfile = open ('NewImg.jpg','w');

print 'Pronto para receber...'

try:
	while True:
		line = serial.readline()
		if '<FILE>' in line:
			print 'Getting image'
			line = serial.readline()
                        while line:
                            serial.flush()
			    newfile.write(line)
			    print ('.'),
			    line = serial.readline()

			newfile.close()
	                print 'Image received...'
			break
except KeyboardInterrupt:
    print 'CTRL+C pressionado! Terminar'

serial.close()

Este script, colocar no computador a receber e executar.

A linha 21 abre um novo ficheiro de imagem, chamado ‘NewImg.jpg’.

 

Assim que receber a string ‘<FILE>’, (linha 28) começa a receber a imagem.

Enquanto estiver a receber informação, guarda as linhas no ficheiro aberto

Assim que line já não receber nada, fechamos o ficheiro.

O script termina assim que receber a imagem.

Naturalmente que há lugar para melhoramentos ! Python não é o meu forte.

Deixem comentários !