From 27645656d9df57e8fbf15901690fb3e4b01942aa Mon Sep 17 00:00:00 2001 From: tpollina Date: Sun, 1 Dec 2019 20:59:41 -0800 Subject: [PATCH] Update Acquisition.rst --- docs/Acquisition.rst | 477 +++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 477 insertions(+) diff --git a/docs/Acquisition.rst b/docs/Acquisition.rst index 83e5041..6045e56 100644 --- a/docs/Acquisition.rst +++ b/docs/Acquisition.rst @@ -17,6 +17,481 @@ the system's package manager: apt. This will ensure that picamera is easy to keep up to date, and easy to remove should you wish to do so. It will also make picamera available for all users on the system. To install picamera using apt simply:: + +A) Import the librairies needed to execute the script +======================================================= + +If you are using the `Raspbian`_ distro, it is best to install picamera using +the system's package manager: apt. This will ensure that picamera is easy to +keep up to date, and easy to remove should you wish to do so. It will also make +picamera available for all users on the system. To install picamera using apt +simply:: + + from gpiozero import LED + import smbus2 as smbus + from time import sleep + from picamera import PiCamera + from datetime import datetime, timedelta + import os + + +B) Define the used pinout +========================= + + #Affiliate pin to var for the LEDs + GREEN = LED(16) + RED = LED(12) + BLUE = LED(26) + + #Affiliate pin to var for the RELAY + RELAY = LED(14) + + +C) Configuration file +===================== + + camera = PiCamera() + + camera.resolution = (2592, 1944) + camera.iso = 60 + camera.exposure_mode = 'off' + camera.shutter_speed = 100 + camera.awb_mode = 'off' + camera.awb_gains = (2,1) + + nb_frame=300 + + duration_loading=120 #(sec) + duration_flushing=20 #(sec) + duration_aeration=30 #(sec) + +D) Define simple sequence for I2C modules (Valves and pump) +=========================================================== + + def pump(state, verbose=True): + + sleep(0.2) + + if state is 'forward': + # Stop pumping + bus.write_byte(0x30, 1) + sleep(1) + feedback=bus.read_byte(0x30) + if feedback == 1: + if verbose is True: + print("Pumping : Forward") + + if state is 'backward': + # Stop pumping + bus.write_byte(0x30, 2) + sleep(1) + feedback=bus.read_byte(0x30) + if feedback == 2: + if verbose is True: + print("Pumping : Backward") + + if state is 'stop': + # Stop pumping + bus.write_byte(0x30, 0) + sleep(1) + feedback=bus.read_byte(0x30) + if feedback == 0: + if verbose is True: + print("Pumping : Stop") + + if state is 'slow': + # Start pumping + bus.write_byte(0x30, 3) + sleep(1) + feedback=bus.read_byte(0x30) + if feedback == 3: + if verbose is True: + print("Pumping : Slow") + + if state is 'medium': + # Start pumping + bus.write_byte(0x30, 5) + sleep(1) + feedback=bus.read_byte(0x30) + if feedback == 5: + if verbose is True: + print("Pumping : Medium") + + if state is 'fast': + # Start pumping + bus.write_byte(0x30, 9) + sleep(1) + feedback=bus.read_byte(0x30) + if feedback == 9: + if verbose is True: + print("Pumping : Fast") + + ################################################################################ + + + def valve(state, verbose=True): + + sleep(0.2) + + if state is 'open_all': + bus.write_byte(0x20, 1) + sleep(1) + feedback=bus.read_byte(0x20) + if feedback == 1: + if verbose: + print("Valve : All open") + + if state is 'close_all': + bus.write_byte(0x20, 0) + sleep(1) + feedback=bus.read_byte(0x20) + if feedback == 0: + if verbose: + print("Valve : All closed") + + + if state is 'open_in_sample': + bus.write_byte(0x20, 2) + sleep(1) + feedback=bus.read_byte(0x20) + if feedback == 2: + if verbose: + print("Valve : In sample open") + + if state is 'close_in_sample': + bus.write_byte(0x20, 3) + sleep(1) + feedback=bus.read_byte(0x20) + if feedback == 3: + if verbose: + print("Valve : In sample closed") + + if state is 'open_in_air': + bus.write_byte(0x20, 4) + sleep(1) + feedback=bus.read_byte(0x20) + if feedback == 4: + if verbose: + print("Valve : In air open") + + if state is 'close_in_air': + bus.write_byte(0x20, 5) + sleep(1) + feedback=bus.read_byte(0x20) + if feedback == 5: + if verbose: + print("Valve : In air closed") + + if state is 'open_in_bleach': + bus.write_byte(0x20, 6) + sleep(1) + feedback=bus.read_byte(0x20) + if feedback == 6: + if verbose: + print("Valve : In bleach open") + + if state is 'close_in_bleach': + bus.write_byte(0x20, 7) + sleep(1) + feedback=bus.read_byte(0x20) + if feedback == 7: + if verbose: + print("Valve : In bleach closed") + + if state is 'open_out_bleach': + bus.write_byte(0x20, 8) + sleep(1) + feedback=bus.read_byte(0x20) + if feedback == 8: + if verbose: + print("Valve : Out bleach open") + + if state is 'close_out_bleach': + bus.write_byte(0x20, 9) + sleep(1) + feedback=bus.read_byte(0x20) + if feedback == 9: + if verbose: + print("Valve : Out bleach closed") + + if state is 'open_out_sample': + bus.write_byte(0x20, 10) + sleep(1) + feedback=bus.read_byte(0x20) + if feedback == 10: + if verbose: + print("Valve : Out sample open") + + if state is 'close_out_sample': + bus.write_byte(0x20, 11) + sleep(1) + feedback=bus.read_byte(0x20) + if feedback == 11: + if verbose: + print("Valve : Out sample closed") + + + ################################################################################ + # E) Define simple functions making the whole sequence + ################################################################################ + + + #First function to run in order to turn on the blue LED as well as the relay to make the I2C operationnal + def start(): + + print("###############") + print("STARTING") + print("###############") + + #Inform on the statut of the operation + print("Starting : engaged") + + #turn the blue LED ON (even if it's written off here) + BLUE.off() + print("Led : Blue on") + #turn the circuit ON (even if it's written off here) + RELAY.off() + print("Relay : Activated") + + for i in range(3): + GREEN.off() + print("Led : Green on") + RED.off() + print("Led : Red on") + sleep(0.1) + + GREEN.on() + print("Led : Green off") + RED.on() + print("Led : Red off") + sleep(0.1) + + + directory="/pi/home/Desktop/PlanktonScope_acquisition/" + #create a directory if the directory doesn't exist yet + if not os.path.exists(directory): + os.makedirs(directory) + + GREEN.off() + + #Inform on the statut of the operation + print("Starting : done") + + + ################################################################################ + + #This function will prepare the pump and the valves to realize the loading operation + def init(): + + print("###############") + print("INITIALIZING") + print("###############") + + #Inform on the statut of the operation + print("Initializing : engaged") + + pump('forward', True) + + pump('stop', True) + + valve('open_in_sample', True) + valve('open_out_sample', True) + + valve('close_in_air', True) + + valve('close_in_bleach', True) + valve('close_out_bleach', True) + + #Inform on the statut of the operation + print("Initializing : done") + + + ################################################################################ + + #The load will simply load a sample by pumping fast during a long period + def load(): + + print("###############") + print("LOADING") + print("###############") + + #Inform on the statut of the operation + print("Loading : engaged") + + pump('fast', True) + + #wait to complete the loading process and print info on the terminal + for i in range(duration_loading): + print("Loading : "+str(i)+"/"+str(duration_loading)) + sleep(1) + + #Inform on the statut of the operation + print("Loading : done") + + + ################################################################################ + + #flush will create some valving sequence to remove potential air trapped in the tubes + def flush(): + + print("###############") + print("FLUSHING") + print("###############") + + #Inform on the statut of the operation + print("Flushing : engaged") + + valve('close_in_sample', True) + valve('open_in_sample', True) + + valve('close_in_sample', True) + valve('open_in_sample', True) + + pump('slow', True) + + #wait to complete the flushing process and print info on the terminal + for i in range(duration_flushing): + print("Flushing : "+str(i)+"/"+str(duration_flushing)) + sleep(1) + + #Inform on the statut of the operation + print("Flushing : done") + + + ################################################################################ + + #image is very a basci way to take images + def image(): + + print("###############") + print("IMAGING") + print("###############") + + #Inform on the statut of the operation + print("Imaging : engaged") + + #start the preview only during the acquisition + camera.start_preview(fullscreen=False, window = (160, 0, 640, 480)) + #allow the camera to warm up + sleep(2) + + for frame in range(nb_frame): + + #turn the green LED ON (even if it's written off here) + GREEN.off() + sleep(0.5) + + #get the actual date + date = datetime.now().strftime("%m_%d_%Y") + directory="/pi/home/Desktop/PlanktonScope_acquisition/"+str(date) + + #create a directory if the directory doesn't exist yet + if not os.path.exists(directory): + os.makedirs(directory) + + #get the time now + time = datetime.now().strftime("%H_%M_%S_%f") + #create a filename from the date and the time + filename="/pi/home/Desktop/PlanktonScope_acquisition/"+str(date)+"/"+str(time)+".jpg" + + #capture an image with the specified filename + camera.capture(filename) + + #wait to complete the imaging process and print info on the terminal + print("Imaging : "+str(frame)+"/"+str(nb_frame)) + + #turn the green LED OFF (even if it's written on here) + GREEN.on() + sleep(0.5) + + #stop the preview during the rest of the sequence + camera.stop_preview() + + GREEN.off() + pump('stop', True) + + #Inform on the statut of the operation + print("Imaging : done") + + + ################################################################################ + + #aeration will remove the liquid from the tube and replace it by air + def aeration(): + + print("###############") + print("AERATION") + print("###############") + + #Inform on the statut of the operation + print("Aeration : engaged") + + #remove liquid from tubes + pump('stop', True) + + valve('close_all', True) + + valve('open_in_air', True) + valve('open_out_sample', True) + + pump('medium', True) + + #wait to complete the aeration process and print info on the terminal + for i in range(duration_aeration): + print("Aerating : "+str(i)+"/"+str(duration_aeration)) + sleep(1) + + pump('stop', True) + + #Inform on the statut of the operation + print("Aeration : done") + + + ################################################################################ + + #wait will make the pi sleep until the next hour + def wait(): + + print("###############") + print("WAITING") + print("###############") + + #Inform on the statut of the operation + print("Waiting : engaged") + + # Calculate the delay to the start of the next hour + next_hour = (datetime.now() + timedelta(hour=1)).replace( + minute=0, second=0, microsecond=0) + delay = (next_hour - datetime.now()).seconds + + #wait to complete the waiting process and print info on the terminal + for i in range(delay): + print("Waiting : "+str(i)+"/"+str(delay)) + sleep(1) + + #Inform on the statut of the operation + print("Waiting : done") + + + ################################################################################ + + #stop will turn off the green LED and turn on the red one + def stop(): + + GREEN.on() + print("Led : Green off") + RED.off() + print("Led : Red on") + + #Inform on the statut of the operation + print("The sequence is done.") + + + ################################################################################ + # F) Execute the sequence + ################################################################################ + + start() while True: @@ -28,3 +503,5 @@ simply:: wait() stop() + +