Transferir imagens (tiradas com a camera do PI) usando Xbee e as funções serie do Python

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 !