Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
eVOLVER was initially developed by the Khalil Lab at Boston University. The software and hardware designs are available under an open-source license on GitHub. There are users around the world using and developing eVOLVER for a wide range of scientific interests.
If you would like to be listed here as an eVOLVER community member and user, please reach out to us!
The Khalil lab uses eVOLVER to enable fundamental eco-evolutionary studies of cellular systems, and to evolve proteins with new and biomedically-useful functions at scale.
Brandon Wong
Zachary Heins
Daniel Hart
Ezira Wolle
Nathaniel Borders
Chris Mancuso
If you wish to purchase an eVOLVER, email account@fynchbio.com for a quote.
There is one essential upgrade to the Fynch Bio eVOLVER (as of April 2024).
The eVOLVER community follows the CNCF Code of Conduct.
Instances of abusive, harassing, or otherwise unacceptable behavior may be reported by contacting heinsz@bu.edu and ccing evolvercommunity@gmail.com
New to eVOLVER, or have any questions about how something works or how to do something? Head over to our Discourse forum! We have many guides and resources available and are happy to start a conversation about your eVOLVER and science! https://evolver.bio
For questions, discussion, and knowledge building
Should users find a problem, they should characterize it and submit it to group discussion on the forum
For tracking and distributing code and hardware development.
Not for discussion
Basic information about the eVOLVER (about the project, contributing, where to buy)
Guides
In-depth hardware / software documentation
Background, final data and experiments
Extensive documentation in the supplements, meant for reference
Welcome to the eVOLVER documentation wiki! This aims to be a resource for all things eVOLVER, covering how to set up, use, modify, and troubleshoot hardware, software, and wetware on the platform.
If you have any suggestions or feedback on the wiki, documentation, or eVOLVER, please let us know on the forum!
Please also note that we are still working on this wiki! There are many incomplete pages/stubs that we will fill out as we continue to build out documentation.
Forum for asking questions, posting guides, and discussing eVOLVER related topics.
Nature Biotechnology Supplement
JoVE Paper - Visual protocol for running an eVOLVER continuous culture experiment.
Data Processing Unit (DPU) Code Repository
Electron GUI Code Repository - Graphical UI for interacting with the eVOLVER platform
eVOLVER Hardware Repository - eVOLVER Hardware (PCB, 3D printed parts)
How to set up your computer to communicate with and run eVOLVER software.
Log in to router and make it have a static IP
otherwise IP will change each time it's power cycled
Then when connecting via ssh it will warn you and you need to change the file
You can then change the name, MAC address, and IP of the evolver in the evolver-config.json file
Router IP: 192.168.1.1
Login: admin
pw: password
Process for installation of the Data Processing Unit (DPU)
You can run eVOLVER experiment culture routines directly on the command line, or through the Electron graphical interface. This page documents how to install the DPU for use on the command line.
We recommend running the DPU through the GUI for most use cases. Please see the Electron App (GUI) Installation documentation and the GUI Start Guide for more information.
Even if you plan to use the GUI to run your experiments, you still need to go through these steps!
If you are unfamiliar with working on a command line terminal or cannot use the Electron GUI for your application, check out the Command Line / Terminal Usage guide!
In Terminal, install homebrew:
Afterwards, run the two following commands:
brew install openssl
brew install sqlite
Python 3.9 is required for dpu operation
Mac:
Windows
1. Go to the official python website to download python 3.9.
2. Follow these instructions to install python on your machine.
3. If you have multiple versions of python3 on your machine, you can set up an alias to manage the usage between the different versions.
1. Navigate to the DPU Github page
2. Click Releases
on the right side of the page
3. Click the Source Code link (zip) to download the latest release.
The release name/number will be different from the screenshot below! You will typically want the latest release, which should be at the top of the page.
4. Move the downloaded .zip file (which should be in your Downloads
directory for your browser) to the location where you want your experiments to run. Documents
or Desktop
are good locations. This is also where your data will be saved.
Do not leave the DPU zip file in your Downloads directory. Please move to appropriate location.
5. Unzip the file.
6. Open a terminal. On Mac, you can use the built in Terminal
application (press CMD + Space then type terminal to find it). I recommend iTerm2 if you want a terminal with some quality of life enhancements. On Windows, you can use PowerShell.
7. We use poetry to manage our python dependencies. Go to their website to download and install it on your machine.
If you are using a Mac and have installed homebrew (described above) you can run the following command: brew install poetry
Windows Powershell:
If you have installed Python through the Microsoft Store, replace py
with python
in the command above.
8. Navigate to the DPU directory you just downloaded and unzipped:
Use this command: cd <path_to_dpu>
Replace the <path_to_dpu>
with the location you put your dpu
9. Create a new virtual environment then activate it with the following command:
Mac:
python3.9 -m venv venv
source venv/bin/activate
Windows PowerShell:
py -3.9 -m venv venv
venv\Scripts\Activate.ps1
10. Use poetry to install all necessary dependencies.
If you can't find poetry on Windows "poetry : The term 'poetry' is not recognized as the name of a cmdlet
" and it is installed, use the following command (replace <Your_User_Name>
with your user name)
C:\Users\<Your_User_Name>\AppData\Roaming\Python\Scripts\poetry.exe install
You must activate the virtual environment when running DPU scripts from the command line. If you close a terminal or re-open it, you'll need to run . venv/bin/activate
(Mac) or venv\Scripts\Activate.ps1
(Powershell) again while in the dpu directory.
You can activate the dpu environment automatically on a Mac or Linux machine by adding a line in your shell run commands (rc) file typically located in your home directory located at ~/.zhrc
(Mac) or ~/.bashrc
(Linux):
source <path to dpu>/venv/bin/activate
swapping out <path to dpu>
with the actual path on your machine to the dpu.
If you have issues with the dpu setup, reach out to us on the forum!
Turbidostats are automated culturing systems used to maintain a constant cell density in microbial cultures.
OD is constantly monitored
When OD goes above the an upper OD threshold
A dilution is calculated to bring OD to the lower threshold
Dilutions are capped at 20 seconds to avoid vial overflow
Both influx and efflux pumps are run simultaneously for the calculated length
Efflux pumps are run extra to make sure volume stays constant
The efflux straw sets volume
Influx and efflux are both run at the same time
Like chemostat, vial volume is set by efflux straw height
Efflux is run extra time to make sure that enough volume is removed
Pumps run at roughly 0.75mL/second
Pump calibration is important for turbidostat otherwise dilutions will not hit the lower OD threshold accurately
time_in = -(np.log(lower_thresh[x]/average_OD) *VOLUME)/flow_rate[x]
However, the mox dilution is 20 seconds to avoid overflow.
Check the upgrades guide here.
Use the below Google Sheet to source parts for each of the eVOLVER subsystems (click on the tabs for different parts of the eVOLVER)
Parts may not be available due to backorder, discontinuation, or regional differences
If you are able to find an alternative vendor for a part, please post to the forum so it can be added to the spreadsheet
Should you not be able to order a part, post to the forum
Many eVOLVER parts must be 3D printed or are custom PCBs made to control eVOLVER hardware. For these, please see the hardware GitHub for CAD files and electronics parts lists for eVOLVER PCBs.
3D printed nylon caps are currently preferred for their defined influx angles and ease of setting efflux height.
Nylon Caps should be 3D printed from the hardware GitHub or ordered from Fynch Bio
Once nylon caps arrive, clean excess nylon powder out of the tubes with a drill bit or small pipe cleaner
Old caps: Making vial caps w/ laser cutter and pipette tip
Note that the eVOLVER Consumables form post calls for 5/32" barbed connectors and 1/8" tubing. This is no longer recommended; refer to the "Fluidics tab" on the google sheet above and media bottle and splitter guide.
If you have any questions about this process, feel free to reach out on the forum!
Congrats on getting your eVOLVER and supporting our open-sourced community. We rely on support from you guys to help sustain this ecosystem so we can let everyone do the experiments that they want to! In this tutorial, we are going to teach you how to put this system together:
If you ordered the standard kit, this is the tutorial for you! The kit contains the following major components:
Vial Platform
16 Smart Sleeves
2x Pump Arrays (total 32 pumps)
Fluidic Box to for control of 32 Pumps (can expand to 48 w/ additional hardware)
There are several components with protective foam. Insure all the components were delivered intact.
If your smart sleeves were delivered unassembled use this assembly guide.
16 Smart Sleeves and a Box of Accessories
Pump Array and Fluidics Box
Vial Platform
The Vial Platform is the unit on which all the Smart Sleeves will be screwed onto. This system contains the eVOLVER Motherboard, Raspberry Pi, and Power Modules that control the Smart Sleeves. Parts used to setup the Vial Platform should be labeled with a black dot.
Contents of the Vial Platform Components Bag:
First, plug in Power and the Ethernet Connection to the system and ensure all the components turn ON properly (e.g. the touch screen turns ON). For more information on how to configure the router, please read the tutorial on router setup.
The Ethernet should plug into your router, more information about assigning a static IP in this tutorial.
If the system turns ON properly, turn off the eVOLVER and start fastening the Smart Sleeves. Use the 4-40 screws to fasten down each Smart Sleeve (2 screws/ sleeve). Vial 0 is in the front left (closest to the touch screen) with vials 1, 2, and 3 on the right of vial 0, in that order. Vial 15 is in the back right (farthest from the touch screen).
The Fluidics Platform is a separate module than the Vial Platform, typically is placed next to the Vial Platform. For this next part, we are setting up a pump rack that goes on top of the Fluidics Platform.
First we want to set up the components for the pump rack. The parts for this is located in the Fluidic Box Components Bag (Red Dot).
We want to fasten (w/ M6 screws) in aluminum extrusion into 3D printed part for the front pieces first. The front piece are the ones with the longer feet. See below:
Next, insert back piece. Make sure the two feet are offset in the same direction. Do not screw the screws in yet. We will screw those in when we mount everything together with the acrylic piece.
Repeat for the other side.
Next, line up the acrylic piece to the back holes and fasten together with M6 screws.
Screw in 10-32 screws to the feet of the mounts to fasten the pump rack on top of the Fluidics Box. Repeat to fasten all four mounts
Next, let’s setup the fluidics box. The fluidic box requires several connections:
Two Power Entry Cables (one for 12V Power, other for 5V)
Serial Communication Cable (To communicate with Raspberry Pi in Vial Platform)
Power the 5V power in the Fluidic Box from the USB port of the Raspberry Pi.
Connect Serial Communication Cable between the Vial Platform and the Fluidics Platform.
The fluidic box is meant to be flexible, to power whatever fluidic components you want. The standard setup assumes the following setup (back of fluidics box):
Attach ribbon cables to the appropriate slots on the PCB the pumps are mounted on.
Top down view of ribbon cable connections.
Finally, attach the tubing to the appropriate pumps.
Labeling the vials with the appropriate color coded labels help minimize human error (I just print it and tape it on the vial). You can download a PDF of the file here 17. The front left position (row closest to touchscreen) is vial 0.
List of things to do to setup and run an eVOLVER experiment.
For a video guide and full written protocol for setting up an eVOLVER experiment, check out the 2019 JoVE . Note that some information there, such as using the GUI, is out of date.
Before starting experiment prep:
Finished Getting Started Page
Calibrations
Temperature (must be first, affects OD cals)
OD
Pump calibrations
Should things not be as expected
Starting eVOLVER experiments takes hours and it is important to supervise your experiment for the first few hours. Therefore, front-loading as much prep work as possible to the days before the experiment is strongly recommended.
Consider running a test experiment with just water or the wild type strain before you devote time to making everything perfect. If you are running an experiment with modified code this is especially essential.
Make sure vials / pumps are behaving as expected
Are all vials stirring, getting up to temperature, all pumps pumping, etc?
Especially check that efflux is running long enough to remove enough culture from vials
Start overnight cultures
Inoculate cultures into vials
Monitor experiment for correct behavior (over several hours)
Are the cells growing?
Is the experiment diluting as expected?
Are all pumps working?
Monitor media levels - make sure that there is more than enough media to make it to the next time you check the experiment
Monitor biofilming on the vials - this can cause increased OD over time
vials caps before starting this protocol
Make 1-2 extra vials, in case you find an issue after autoclaving. If using septa, it may be best to make 4-5 extra as many septa will be pulled inside of vial by autoclave pressures.
Rinse vial lids by running DI water from sink through influx and efflux straws (2-3 seconds). Alternatively fill a large beaker with DI water, dump vial lids in and stir.
Shake vials caps to remove excess water and set aside on a clean surface
Get out enough dishwashed vials (stored upside down), place in white rack
Place a small stirbar in each vial
If using septa, place a septa on each
Screw on rinsed vial lids
If vials will be used within 24 hours of prepping, then place white rack in small autoclave bin, cover entire bin with foil (reuse foil if possible), and autoclave on vacuum cycle for 10 minutes
Keep foil on bin until right before loading vials into eVOLVER to maintain sterility
If vials are being prepped in advance, screw a white or black mini-cap onto every straw, then autoclave in bin without foil
Keep mini-caps on until right before loading vials into eVOLVER to maintain sterility
Considerations while preparing large volumes of media for continuous culture in 20L carboys.
A primary consideration when running eVOLVER experiments is predicting the media consumption rate, which is typically orders of magnitude higher than in typical batch experiments. The required media for continuous culture can be estimated using the following equation: 𝑀𝑒𝑑𝑖𝑎 𝑅𝑒𝑞𝑢𝑖𝑟𝑒𝑑 [𝑚𝐿] = 𝐶𝑢𝑙𝑡𝑢𝑟𝑒 𝑉𝑜𝑙𝑢𝑚𝑒 [𝑚𝐿] / 𝐴𝑣𝑔. 𝐷𝑜𝑢𝑏𝑙𝑖𝑛𝑔 𝑇𝑖𝑚𝑒 [ℎ] ∗ 𝑁𝑢𝑚𝑏𝑒𝑟 𝑜𝑓𝐶𝑢𝑙𝑡𝑢𝑟𝑒𝑠 ∗ 𝐷𝑢𝑟𝑎𝑡𝑖𝑜𝑛 [ℎ] (1) It should be noted that additional media (~20mL) is needed during device setup to flush media input lines.
20L of media will take a significant amount of time to cool. It's best to autoclave your media the day before you want to use it for an experiment.
Before preparing media, steam clean the carboy by filling with ~2L of water and autoclaving on the liquids cycle for at least 45 minutes. Be sure to keep the lid loose to prevent the carboy from collapsing. Pour out the water.
If the carboy does collapse, you can take the lid off and place it back into the autoclave for 30m-1h. The residual heat should allow it to pop back.
2. If you are able to prepare a concentrate of your media, you can do so as a 10x 2L solution (or whatever makes sense for your media) in a beaker with a stir bar. It is also possible to mix everything directly in the carboy. Add your media components in small batches and try to mix as you go.
3. Fill the carboy up to 20L - volume of media components that will be supplied after the autoclave step. For example, if you need your media to be 2% glucose, you should fill the carboy to 18L and then add 1L of filter sterilized 40% glucose after autoclaving.
4. Place a male Luer cap on the outlet of the carboy lid. Place a filter on the inlet, and cover it with foil. Loosen the entire lid.
You do not necessarily need a filter on the inlet - this depends on the context of your experiment. For most applications, capping the inlet and keeping the lid loose for the duration of the experiment is sufficient - the media should not become contaminated.
5. Place the carboy into an autoclave bin, then place into an autoclave. Autoclave on the liquids cycle for 2 hours.
6. Take the carboy out of the autoclave.
WARNING: The carboy and media will be extremely hot, and there will be ~1L of hot media in the autoclave bin. Ask someone for help removing from the autoclave!
Media will take a significant amount of time to cool (overnight) - be sure to take this into account before running an experiment with the media.
7. If media components need to be added after autoclave (glucose, antibiotics, supplements, etc.) place the carboy on a cart and move next to a bench flame. Sterilize the area thoroughly with ethanol before quickly unscrewing the lid to make the additions. Mix by placing the carboy on a cart and moving the cart in a circular motion, or by placing on the floor, tilting ~30 degrees, and moving the top in a circular motion.
8. You can place the autoclave on the floor next to your experiment. Be sure to keep the lid loose to prevent negative pressure buildup in the carboy which could prevent media from going into the culture vessels.
9. After the carboy is empty, rinse thoroughly with water, being sure to run water through all of the tubing. Steam clean as described in step 1, then pour out the remaining liquid.
It is helpful to have a dedicated eVOLVER computer (not a personal computer) as eVOLVER experiments take multiple days. We recommend a Mac for their high reliability and native Python, however users have reported Windows works as well.
eVOLVER software does not take very much computational power or memory so an older computer should be fine.
Search on the if you have issues with installation.
Process for installing the Electron App (GUI) for eVOLVER.
For all operating systems, navigate to the section of the Electron App GitHub page.
For instructions on updating the GUI on the RPi, see .
1. Download the evolver-electron-X.X.X.dmg
file, where X denotes the version number in the latest release. The latest release should be the first one you see at the top of the page.
2. When the download finishes, open the file (it should be in your Downloads
directory) and drag the eVOLVER app into your Applications
directory.
FIRST TIME INSTALLATION - DO THE FOLLOWING NEXT STEPS!
3. Open the eVOLVER app from the Applications
directory.
4. Using an editor of your choice (TextEdit, Nano, Vim, TextWrangler, etc.) open the file config.json
located at /Users/<your username>/Library/Application Support/eVOLVER/config.json
You may need to enable the ability to view hidden files if you are trying to find this file in a Finder window. With a Finder window open, press Command + Shift + . (period) to make hidden files appear. You can press the keys again afterwards to make them disappear.
If you are attempting to modify this file via a terminal, be sure to escape the space character in Application Support
with a \
. It should look like this: /Users/<your username>/Library/Application\ Support/eVOLVER/config.json
5. Add a line in this file between the braces: "dpu-env": "/Users/<your username>/Document/dpu/venv"
If you add this line to the beginning of the block, be sure to add a comma at the end! If you add it to the end, put a comma on the line before it.
If you installed the DPU in a different location, be sure to reflect that in this line. The electron app uses this to find the correct python binary/venv to run the DPU
6. Save the file and you're done!
1. Download the evolver-electron-X.X.X.exe
file, where X denotes the version number in the latest release. The latest release should be the first one you see at the top of the page.
2. Open the .exe file.
FIRST TIME INSTALLATION - DO THE FOLLOWING NEXT STEPS!
3. Using an editor of your choice open the file config.json
located at C:\Users\<Your-UserName>\AppData\Roaming\eVOLVER\
4. Add a line in this file between the braces: "dpu-env": "C:\\Users\\<Your-UserName>\\Desktop\\dpu\\venv"
Note the escaped \
, be sure to put double \\
throughout the path.
If you add this line to the beginning of the block, be sure to add a comma at the end! If you add it to the end, put a comma on the line before it.
If you installed the DPU in a different location, be sure to reflect that in this line. The electron app uses this to find the correct python binary/venv to run the DPU.
5. Save the file and you're done!
1. Download the evolver-electron-X.X.X.AppImage
or evolver-electron-X.X.X.deb
file, where X.X.X denotes the version number in the latest release. The latest release should be the first one you see at the top of the page.
Selection of either .deb or .AppImage is largely based on personal preference and computer environment, each presenting slight pros and cons. If you are unfamiliar with installing Linux packaged software, use this link to learn more about what is applicable to you. Briefly, .deb files are natively designed for Ubuntu and will compile the entire application, along with necessary dependecies, onto the local machine. An AppImage file contains everything necessary to run the program, requiring you to execute the file when you want to run program.
2. If downloading evolver-electron-X.X.X.deb,
open your Downloads
directory and right-click evolver-electron-X.X.X.deb
to open the file with Software Install
.
3. A new window should open, allowing you to install the eVOLVER GUI. Click Install
and follow the onscreen instructions to install the eVOLVER GUI.
FIRST TIME INSTALLATION - DO THE FOLLOWING NEXT STEPS!
4. Open the eVOLVER app by either clicking Show Applications
from the home screen or through the command line. To open via command line, open Terminal and enter to access installed applications:
Run the eVOLVER GUI by entering:
5. Using an editor of your choice, open the file ~/.config/eVOLVER/config.json
.
6. Add a line in this file between the braces to denote the location of the installed DPU virtual environment:
"dpu-env": <path_to_dpu>
If you add this line to the beginning of the block, be sure to add a comma at the end! If you add this line to the end, put a comma on the line before it.
7. Save the file and you're done!
Before beginning calibrations all and should be complete.
In order to appropriately interpret data from and actuate physical elements connected to the eVOLVER framework, a relationship must be established between the electrical signals generated by attached sensors and the physical phenomenon they are measuring. This is done by manually measuring values on a controlled set of data via some gold-standard assay or measurement device and comparing these data to the eVOLVER generated data. By doing this across a range of different values, a function can be fit to this relationship to allow eVOLVER to interpret data accurately.
For more information see .
Calibrations should proceed in the following order:
If the GUI fails to calibrate you can try to use manually.
Place waste lines into carboy
We use a small stand to bring the carboy closer to the eVOLVER
Have an extra carboy ready to swap in when the first gets full
(Optional) You can fill 10% of the carboy with bleach
Or bleach after depending on whether you hate the smell bleach or your culture more
(Optional) Shrink onto the waste lines to make them easier to deal with
(Optional) Drill a hole through the carboy cap to make the opening to the carboy smaller (less smelly)
(Optional) Parafilm the opening to the carboy to make it less smelly
If you intend to leave overnight or for a weekend, make sure that the carboy has more than enough room in it for the maximum volume you will efflux. Consider using two carboys.
Guide for using the eVOLVER GUI to start and manage an experiment
You should be able to follow the 2019 JoVE for most of the process. Differences will be highlighted here.
If you would like your data to be automatically backed up on Dropbox or Google Drive, first install the desktop applications. This will enable any computer with Dropbox/Google Drive and access to the directory to monitor the experiment using the eVOLVER GUI in real-time, while providing all the benefits of using these services (automatic backup of data, ease of data sharing, etc).
We recommend saving your experiments through Dropbox or Google Drive, but you do not have to - it's fine to have everything run locally on your lab computer. Both options will be detailed in the section below.
Select the eVOLVER you wish to run an experiment on in the dropdown on the top right, then click the SETUP
button.
On left side of the screen, ensure the correct calibrations are selected for Temp, OD, and the pumps. Click the box to bring up a list of available calibrations for each parameter.
Once you have selected the calibrations, you can set the initial stir and temperatures, and sterilize the fluidics as described in the JoVE paper.
The JoVE paper is out of date with regards to using the GUI for running and managing an experiment, from 3) Configuring eVOLVER Software and Programming Algorithmic Culture Routines on.
Open the experiment manager on the Home screen of the GUI. You should see something that looks like this if this is the first time you have used the application:
In the top center the Expt Directory
is listed out. You can click the pen icon to change this location to be anywhere you like.
If you have Dropbox or Google Drive installed, you can select a location on the cloud to save your experiments. This will enable you to view your data from any computer that has permissions and the Dropbox/Google Drive application installed!
You do not need to make a new folder called experiments
as shown below - the GUI will automatically create this directory.
If you'd like your data to be backed up on Dropbox or Google Drive, set this location BEFORE starting the experiment. Otherwise you will have to manually move it later to view the data in the GUI remotely. You can always click the Default Expt Dir button to reset the location back, or set your own personal location.
Click the New Experiment
button to open a prompt to name your experiment. Type a name then click Submit.
Click the Pen button on the row of the new experiment to bring up with experiment editor page.
By default, the Turbidostat editor will appear when you come to the editor page.
The name of the experiment. You can click the pen icon to change the experiment name.
The parameter selector. The name of the currently selected parameter is listed at the top. You can click the -/+ buttons to change the value (or use the slider), and then click the box in the middle to apply this value to the selected vials.
Experiment control panel. From left to right: Start/Stop experiment, View Data, Save Files (Only for File Editor), Copy Experiment, View Files in File browser, Delete experiment.
eVOLVER Selector. Select the eVOLVER to run the experiment on.
Experiment type. Default will bring up the Turbidostat editor. Chemostat and growth rate editors are also available. You can also bring up the file editor to directly modify the python files within the GUI.
Vial selector - select the vials and then apply desired experimental parameters from the buttons on the parameter selector. Values display the currently set parameters.
Vial selector control buttons - flip the orientation on the display or select all of the vials.
Reset - goes back to default. Save Experiment - saves the parameters for all vials.
You MUST click Save Expt. to apply all the changes you made to the experiment!
The chemostat and growth rate modules function similarly to the turbidostat one.
Clicking File Editor in the experiment type dropdown will allow you to directly modify the python files.
Do not change the EXP_NAME
variable if you wish to use the GUI based graphing features! We keep this variable here for backwards compatibility with the previous graphing app. They will be normalized in a future version.
You can select the file you would like to edit on the left, edit it on the right, and save by clicking the Save icon on the bottom left. For most cases you will not need to use this! If you change the files, you will not be able to use the t-stat/c-stat/growth rate modules, and you will need to modify the EVOLVER_IP
, OPERATION_MODE
, and other variables throughout the code.
You can also click the folder icon on the bottom left to view the files in a file browser and edit them using an editor of your choice.
When you're ready to start the experiment, click the Play button either on the Experiment Manager page or the Experiment Editor page. Then you can click the graphs icon to go watch your experiment running in real-time.
When you navigate to the graphs page, the graphs will look fairly empty to start. After a minute or so, data will start to appear as it is collected. You can also click the VIEW LOGS
button to see how the experiment is running.
On the left, you can modify how the graphs are displayed by clicking the appropriate radio buttons. You can also look close up at an individual vial and use the data slider at the bottom of the graph to zoom in on an area of interest.
When you click ALL
to go back to seeing all vials, the range set on a single vial will be applied to all vials. You can click the radio buttons to set it back to the latest data.
To end the experiment, click the STOP
square button on the device running the experiment.
If you are looking at the data on a different device than the experiment is being run on, you cannot control the experiment through the app! Do not click the play button!
In three large beakers, prepare 500 mL of 10% bleach, 200 mL of 10% bleach and 300 mL 70% ethanol.
Using the switches on the eVOLVER device, turn on the 5 V power supply on the eVOLVER, wait for >3 seconds, then turn on the 12 V power supply.
If running several vials from the same media bottle, connect multiple media input lines with tubing splitters. Custom tubing splitters can be with Luer components.
Submerge the media input lines (clear, media in) in the first bleach beaker, and the media efflux lines (blue) in the second bleach beaker. Place the downstream end of the media input lines (clear, to vial) in the second beaker with the efflux lines. Since the lines may be different lengths, a hairclip is useful to keep the ends of each lines close to eachother in order to ensure all remain submerged.
Add 1 L bleach into large empty waste carboy, which will sterilize waste generated during experiment. Consult with a safety coordinator to ensure proper disposal of waste.
Using the switches on the eVOLVER device, turn on the 5 V power supply on the eVOLVER, wait for 5 seconds, then turn on the 12 V power supply.
If running several vials from the same media bottle, connect multiple media input lines with tubing splitters (drawer under eVOLVER computer) before sterilizing. Custom sizes can be made if necessary.
Submerge the media input lines in the first bleach beaker, and the media efflux lines in the second bleach beaker.
Place the downstream end of the media input lines in the second beaker with the efflux lines. Place waste lines into waste carboy.
Open the eVOLVER electron app, select the appropriate eVOLVER from the dropdown menu.
Navigate to setup, then fluidics. Highlight the appropriate vials, select the influx and the efflux pumps, and run pumps for 20 seconds to fill lines with 10% bleach.
While running, ensure by visual inspection that all lines have been filled and that pumps are operating normally. Allow bleach to sit in the lines for at least 30 minutes to sterilize. This is a good pause point, can wait up to overnight. This is a good time to make code edits if necessary.
Run pumps again using the touchscreen app until lines are no longer submerged, pushing air through the lines to get as much of the bleach out as possible.
Place media input lines in the ethanol beaker (or pour ethanol into the first beaker) and repeat as in above, filling the lines with ethanol and flushing with air. Note: ethanol sterilizes quickly, so no need to wait 30 mins here.
It is also recommended to dip the downstream ends of the influx lines in ethanol to rinse off residual bleach, then drape on side of beaker rather than resubmerging in the remaining bleach. Residual bleach can affect culture viability, though washing with ethanol and media should be sufficient.
Attach media input lines to the media bottles with the Luer connectors and run the pumps until the media fully runs through the lines (10-20 seconds, depending on tubing), flushing out any residual ethanol.
Process and considerations for running a chemostat.
This section is assuming you already have gone through the , which outlines basic parts of the script, and lets one run an initial pilot experiment.
Here, I will explain chemostat functionality. This is the segment where the chemostat function begins on
OD_data: The OD_data
variable saved from the transformed values from the input_data variable. The data is transformed via calibration scripts called from eVOLVER.py
.
start_OD: This variable determines if you want the culture to be above a certain OD before starting dilutions
start_time: This variable determines when the dilutions should start. If set to 0, the dilutions start immediately
OD_values_to_average: The script will average N recorded OD values before it triggers the dilution via the start_OD
variable.
chemostat_vials: Modify this script to to turn off vials (e.g. pumps). There is a known bug on the rate definition that might not turn off the pumps there (see below).
No, with the eVOLVER setup, we approximate continuous perfusion by frequent small boluses of media. By doing this, a faster pump can achieve tunable, slower net flow rates. In our experience, this compromise does not significantly impact the culture conditions of common laboratory microbes.
Here is an example calculation one would make:
The culture volume is 30 mL/ vial.
The typical pumps eVOLVER comes with have a fixed flow rate of 0.5 - 1.0 mL/s. We typically recommend a minimum bolus of 0.5 mL per dilution, meaning 60 boluses would turnover the culture once.
FynchBio also sells slower pumps that flow at ~1 mL/ min
If we want our culture to double every 3 hours, the pumps will fire every 3 minutes (180 min/ 60 boluses). In a chemostat, nutrient is limiting thus growth rate == dilution rate.
A doubling time of 3hr has a growth rate of 0.231/hr via the following equation:
Below, we set the script such that the cultures will all have a 3 hour doubling:
If one wanted to set the V0-3 at a doubling time of 3 hours but the rest of the 14 vials with a doubling time of 6 hours, the rate_config would be set as the following:
NOTE (5/12/2023): There is a bug that does not turn OFF pumps if defined to 0 on rate_config variable.
Below is code that grabs values from the GUI and populates it in the code. If you aren't using the GUI, please ignore this portion of the code:
The following parameters initialize variables that will calculate how much time to turn the pumps ON to maintain the flow rate set in rate_config
flow_rate: get the calibrated flow rates for each pump
period_config: how often to pump (seconds)
bolus_in_s: how long to pump during a given pump event (seconds)
When we set vials to a new flow rate in the chemostat function, we see the experiment script send a comma separated pump command. Each pump assigned to the a chemostat gets a command that looks like this:
1.18|144
Which is in the format of:
bolus_in_s|period_config
If the above pump was influx, its corresponding efflux pump would be 2.36|144
because we pump out double the time to avoid overflows.
Bleach (sodium hypochlorite) may create a small amount of chloroform when mixed with ethanol. In addition, many EHS policies prohibit mixing of ethanol and bleach waste streams. Considering this, you may want to move your efflux lines to a separate waste container when sterilizing tubing with ethanol, and move them back to your normal waste container when starting your experiment. Also consider using alternative sterilization agents such as and detergent.
In the GUI electron app or command line, click to stop your experiment.
In large beakers, prepare 500mL of 10% bleach and 200 mL of 10% bleach.
Disconnect media bottles and place lines into 10% bleach solution
To use pumps to bleach the cultures, keep tubing connected, but move vials to a white eVOLVER rack. Prepare an additional 1L of 10% bleach and add to the media input beaker.
Run 10% bleach through vials until final concentration in the vials reaches ~10% bleach (~60 seconds for 25mL volume). Disconnect influx and efflux lines from vials, set vials aside for 30 mins.
To manually clean vials, disconnect influx and efflux lines and skip steps 39 and 40
Submerge the disconnected influx and efflux lines in the 200mL bleach beaker, then run all pumps for 20 seconds to fill all lines with 10% bleach. Let sit for no less than 30 minutes, no more than 48 hours.
Remove media input lines from bleach, and run air though the lines to remove bleach. If not planning on using the device again right away, run diH2O through all lines for 20 seconds to remove residual bleach from the lines. Dried bleach can form salt crystals and clog the lines. If this happens, break up the crystals manually using pliers to squeeze the line.
Turn off the 12V power, then the 5V power.
Proceed to vial & bottle cleaning protocol.
Prepare a beaker ~50% full of 10% bleach
Remove vial lids and place in 10% bleach solution
Using the magnetic stir bar grabber, remove the stir bars from each vial, place in the 10% bleach solution
Let vial caps and stir bars sit for 30 minutes-overnight in the 10% bleach solution
Meanwhile, dump bleached culture down the drain, rinse with diH2O
Use a test tube brush to scrub inside of vial, particularly important if you grew bacterial cultures
Place bleached/scrubbed vials right-side-up in the vial racks to indicate they have not yet been dishwashed
Once vial lids/stir bars have been soaked for sufficient time, carefully pour out the 10% bleach solution, and replace with diH2O
Let vial lids and stir bars soak for another 30 mins-overnight.
Once vial lids/stir bars have been soaked for sufficient time, carefully pour out the diH2O.
Run diH2O through influx and efflux straws for 2-3 seconds at the sink to remove any residual bleach
Place stir bars in the stir bar tray.
Once 60+ vials have accumulated, vials should be dishwashed.
Place vials open side up in 3 white eVOLVER racks.
Take one rack, cover the vials using the wire mesh from the bottom rack of the dishwasher, then flip upside down. Repeat for the other two racks.
Add any other glassware or eVOLVER bottles to the top rack as desired, then run on cycle 3.
Store vials upside down in vial boxes to indicate that they have been dishwashed.
Dilution is calculated in the code and is modeled as a mass balance equation
See and the for information.
Prepare media - especially if using a so it can cool overnight
Start experiment via or
If something goes wrong, check the pages
Finally, end the experiment and
Chrome may flag the download, just select "Keep".
In Windows 10, Microsoft Defender prevents the app from starting immediately. Simply click "More info" and then "Run Anyway" to get around this.
You may need to the ability to view hidden files if you are trying to find this file in a File Explorer window.
If GUI graphing is not working, use graphing tool.
Bolus Size: The minimum volume that the pumps are allowed to turn on. Please take great caution in tuning this parameter. For example, the ~1 mL/s pumps are sensitive to the bolus size since 0.5 mL would mean the pumps are turning ON for only 0.5 seconds. Lower values could induce variability to the amount pumped. Note: Fynch Bio provides that would require this bolus size to be tuned.
Q: Can the eVOLVER do very long-term growth experiments?
A: Yes. Experiments with over a month of growth have been done. An example of a 250h experiment was reported in Supplemental Figure 14 of the 2018 NBT paper.
For the next few steps, it is recommended to spray your gloves with 70% ethanol.
Partially insert autoclaved vials into the eVOLVER Smart Sleeves such that efflux straw is entirely visible, if possible.
Start by attaching input lines (clear) to the short influx straw, avoid touching the tips of the lines to avoid contaminating the inside.
Next, attach efflux lines (blue) to the long efflux straw. It is critical to check for loose connections or incorrectly routed lines. Failure to do so will cause overflows and potentially damage the Smart Sleeve.
In the setup menu in the electron app, run all pumps in 10 second intervals to fill the vials with media. Run enough media so that the efflux pumps start removing media through the efflux straws.
Visually inspect the culture volumes at this point. If the efflux straws do not appear to be functioning efficiently (media levels rise above the efflux straw), inspect the fluidic line connections and the peristaltic pump. Correct or replace parts as needed to prevent overflows.
Push vials down until fully encased by the Smart Sleeve. If aluminum sleeves are cut to different lengths, vials may appear to be covered in different amounts.
Be sure that the desired calibration files have been selected from the dropdown menu in the setup panel. These files are stored on the device itself, and will default to the most recently used calibration. Temperature and OD calibrations must be repeated if vials are replaced, and OD calibrations are recommended if switching to a new organism (i.e. bacteria vs yeast). Otherwise, calibrations can be used over and over again.
Set the initial conditions for experimental parameters using the eVOLVER electron app. This will be overwritten once the experiment code starts running, but can be helpful for preheating media or trying out different stir rates.
If stir bars are jumping around (audibly) then the stir rate may be too high for the volume of culture you are using. Commonly used values are between 8 and 12.
Recommendations for Septas and Needles?
If you are new to command line / bash, you can start here!
Reasons you might use command line experiment start:
Doing a custom experiment
Unable to install GUI or getting errors you aren't able to fix easily (post on the forum first)
Set your computer to never fall asleep to prevent experiments from being halted.
In a command line window, enter the dpu virtual environment.
Navigate to the DPU directory
Use this command: cd <path_to_dpu>
Enter the command:
On Mac OS:
source dpu-env/bin/activate
On Windows PowerShell:
dpu-env\Scripts\Activate.ps1
Navigate to your experiment folder
This should be in dpu/experiment
Copy the template folder and rename it for each experiment
Navigate into your new experiment folder
Alter settings in custom_script.py
EVOLVER_PORT
= set correct IP of the eVOLVER
Set initial temp and stir settings
custom_script.py
has basic settings for running chemostat and turbidostat experiments, but you can also customize. To learn more click here.
Start the experiment using the command:
python3 eVOLVER.py -i <your_evolver's_IP_address>
python3 eVOLVER.py -i 192.168.1.9
Temperature should be fully equilibrated before this
DO NOT add cells before blanking, whatever OD value the cells + media have will be subtracted from future measurements
Stop the experiment using the keyboard shortcut control+C
One control+C
pauses the experiment from recording data
Two control+C
stops the experiment
To change parameters mid-experiment or restart from blank data files:
Stop the experiment fully
Change parameters in custom_script.py
Restart the experiment
Continue to keep your data
Overwrite to make new blank data files and throw away your old experiment. NOTE: you will lose your OD blank and will need to make a new one (a hassle if you have already inoculated with cells)
You can run experiments on more than one eVOLVER at a time
Create a new experiment folder (different custom_script.py
) and change IP
Follow this procedure in an additional command line window
You can graph your experiment using the graphing tool here.
Clean up the experiment
Data is in the data files
When we start an experiment, the script asks us whether we want to calibrate to blank.
OD is dependent on vial position, vial opacity, media, environmental light conditions, temperature, and more.
Therefore, we take the first OD measurement as a zero and subtract that out from every subsequent measurement.
Temperature should be fully equilibrated before this
DO NOT add cells before blanking, whatever OD value the cells + media have will be subtracted from future OD measurements
OD blank is only applied to the calculated OD from calibration, not the raw OD data. The blank is applied for each vial, it just subtracts it out from subsequent measurements for that vial
https://www.evolver.bio/t/where-or-how-is-od-blank-info-stored/182
Advanced Users Only:
Currently called by the GUI
Use GUI for calibrations in most cases
The GUI will run calibrations automatically upon completion of the calibration protocols. However, you can still manually run a calibration if you would like to change calibration settings. Can be useful if your GUI calibration fails for some reason.
Located in /dpu/calibration/.
You have run calibration and logged raw values already
You are in your DPU virtual environment in command line. This is set up when you install the DPU.
Mac
For Windows, use py instead of python for all commands.
OD135
OD90 (Check to ensure mode is configured properly)
3D FIT (Check to ensure mode is configured properly)
Eagle
Using Eagle to drag and drop elements + make layers
Problem with Eagle
Only outputs dxf
We then have to trace as a png in illustrator
This creates a double line
Less accurate + goes over each area twice
Zack defines width of the pumps, but doesn't worry about depth
Width of channel / valves
Too small = hard to align + valves will no longer stay closed
Larger is more robust
Barb spacing
Want enough space between each barb for tool
Far enough from the edge
Prevent leaking from the port
We use supervisor
to run and manage the logs for the eVOLVER server. eVOLVERs should come pre-configured with this.
We also provide a utility monitoring and restart script, evolvercron
and server_monitor.sh
. To use, add the crontab job line in evolvercron
into your cron installation.
To understand what you see in the server log, take a look at the information here.
Connect to your server via the following command (replace <eVOLVER_IP>
with your eVOLVER's IP)
ssh pi@<eVOLVER_IP>
Enter the eVOLVER server's password
Enter the supervisor environment via the following command:
sudo supervisorctl
Use the following command to follow the eVOLVER server log:
tail -f evolver
Ctrl+C
to exit
The server monitor stores the log file here: /var/log/supervisor/
You can either view there or move it to your computer for more analysis
If you are currently following the eVOLVER server in supervisorctl
, use ctrl+C
to exit. Otherwise, follow steps to view server log.
Enter the following command:
restart evolver
If you quickly follow the server via tail -f evolver
you should see it restart
We have monitored the lifetime of eVOLVER components since the invention of the device (~3 years). As in most systems, mechanical parts have the highest possibility of wear and thus need replacement most frequently. Likewise, in eVOLVER, the peristaltic pumps used have a lifetime of 6 months of typical use during continuous culture. Specifically, the silicone tubing within the head of the pump is frequently compressed when actuating peristaltic pumps and will tear over time. The head can easily and inexpensively be replaced ($4/ pump). The computer fan used for stirring has robustly operated continuously for > 3 years, whereas the magnetic stir bars are rated for a limited number of autoclave cycles and need eventual replacement. All other components (e.g. heaters, thermistors, LEDs, diodes, PCB, power sources) have been stably operating for > 3 years.
https://www.evolver.bio/t/replacing-photodiodes-led-on-smart-sleeve/155
The eVOLVER system is highly complex and it is easy to feel lost about what happened when something went wrong.
For example, the behavior of optical density readings can vary widely and the underlying cause can be complex.
Please look through these troubleshooting guides and the relevant documentation before posting to the forum about your problem. It could also be the case that your problem is a bug.
Physically Check the connections
Logs - errors
Cut outlines first
0.1pt
3 copies
Keep full stock in place + outline on computer
Acts as a frame for the device
Remove board from stock with tweezers
Add adhesive
Put adhesive covered outline back in place on stock
On the computer
Align control vector cuts (ports) to the outlines
Delete outlines
Print (3 copies for 1/4")
Keep board in place
Rastering control channel
Undo deletion of outline, delete previous vector cuts
Align raster outline to old outline + delete outline
Load control_channel 2 in advanced settings
1200 dpi
Deep to get through adhesive
1 copy => print
Remove board + stock from laser cutter
Cut adhesive sheet
Copy/paste in design with scooped out region around bridge
Cut adhesive out first
This way we don't have to move the acrylic stock later to put adhesive on the laser cutter
Check adhesive stickiness
Remove corner from adhesive
One side will stay attached to adhesive, one will remove cleanly
Put adhesive sheet on laser cutter, with side that easily removes down
Focus to adhesive
Vector cut Full speed + 80 - 90% power
Cutting acrylic
Delete scoops, we just want the outlines
Print vector cut for outline
Refocus laser cutter to 1/8th inch + cut
Plasma clean acrylic
Put adhesive on
Rastering acrylic
Place device back in stock on laser cutter
Copy/paste raster of flow route
Remove outline
Raster cut
While rastering, start tapping control board
Tap control board
2 turns one way, little turn the other way
Use a countersink to remove burrs around the holes
A couple of turns
Both sides of board
Allows silicone to sit flush + barbs to insert easily
Blow out small bits of acrylic from threading using air before plasma treating
Remove backing from all acrylic (helps with alignment later)
Silicone
Sam from Densmore lab bought a big roll
Some in drawer under cutting station
Cut larger size than device
Peal one side of silicone
Plasma treat 30 seconds
Apply silicone to control board
Align and press onto control board
Take off plastic from other side of silicone
Wrap in paper towel
Put between aluminum plates in vice
Turn tight + one small more turn
Wait 10 minutes
Punch holes in silicone
Use biopsy punch (green on shelf above 3D printers) to make holes silicone for flow
Don't need to do the control
Put pressure and turn
Clean silicone + adhere to flow layer
Use piece of packing tape to remove dust
Plasma clean silicone 30 seconds
Align flow and control
Take special care to align IPP flow and control
Easier to align flow layer on top
Clamp full device in paper towel for 10 minutes
Avoid over tightening - this can overstretch the silicone layer
Put loctite on barbs + screw in to board
Barbs are in Dan's drawer
Different colors of line produce different depth / intensity of cut
Use black for everything
Make all lines hairline outline
Otherwise it won't cut!
Open up a new page
Paste whatever you're cutting into this
This will be the correct size of bed
USB Bullshit
Open up printers / devices
Have to reconnect USB multiple times for it to be recognized
Open up print
Select correct printer you figured out
Load the correct settings
Set the correct copy number
For millifluidics this is 2 for vector cutting (we have the double line problem)
1 for raster probably
Press print
Make sure it's on / connected
Focus first using metal thing attached to laser
Run the job with lid open to double check it's doing what you hope
Run the job
Plasma treat surfaces (except adhesive)
Take off one side of acrylic backing
Vacuum knob arrow left
Metal valve tight, then quarter turn loose
Pump on + power on to remove air 1 minute
Then switch on upper right knob to high
Acrylic = 1 minute treatment
Silicone = 30 seconds treatment
Turn off pump and power
Slowly open black knob and let vacuum fill
Adhesive is in a box above 3D printers
Cut adhesive to larger size than acrylic
Remove adhesive backing and place face up on surface
Remove acrylic from plasma cleaner and firmly press clean side onto adhesive
Squeegee the bubbles out as much as you can (and away from where the channels will be)
Cut excess adhesive off with razor blade
Vial overflow is one of the most common problems to plague eVOLVER experiments. Overflow events can cause damage to internal components such as the PCB motherboard, sensor actuator (SA) boards, power supplies, etc. If you experience overflow during an experiment, it is important to immediately stop the eVOLVER and evaluate potential causes of overflow, as well as any damage that the overflow may have caused.
If you catch an overflow that happened recently (i.e. an overflow that happened overnight), the best thing you can do after stopping the experiment is turn off and unplug the eVOLVER, determine the extent of overflow spilling, and wash any components that have media on them. There are no components on the vial board or motherboard that retain significant charge (i.e. no batteries or large capacitors), so they are safe to wash gently in soap and water. Once clean, they should be dried quickly with a paper towel.
The main reason for electronics failure after an overflow is current shorting through media (most microbial media is salty and conductive), or connections and copper corroding from media that has been left to dry. If you can clean off all the media immediately after an overflow, you will have a much better chance of saving electrical components, and saving yourself many headaches down the road.
If you did not catch an overflow quickly, or a large amount of media spilled, follow the workflow below.
Overflowed media can enter into the vial platform through the ports that connect the Smart Vials to the motherboard. This can cause damage to the internal circuitry, which is should first be evaluated by visually inspecting the motherboard, SA boards, power supplies, and Raspberry Pi. Damage to any of these components can look like burned or melted spots or loose/broken connections. If you see visible damage to any of these parts, they will need to be fully replaced. See pages below for specific instructions on how to replace these various parts.
Motherboard Troubleshooting/Replacement
12V Power Supply Troubleshooting/Replacement
Pump is not actuating / spinning
While batch culture techniques often utilize biosafety hoods or flame convection currents to keep workspaces sterile, these are rarely amenable for automated cell culture devices. Prevention of contamination in eVOLVER is achieved at three levels: 1) sterilization of media, culture vessels, and fluidic lines, 2) attention to sterile technique, and 3) physical and chemical barriers to contaminants. First, all media bottles and their adapters, and all components of the culture vessel (e.g. borosilicate glass vial, magnetic stir bar, cap with fluidic adapters) are designed to be autoclaved before each use. Fluidic lines on the device are sterilized before and after each experiment using bleach and ethanol (see Online Methods). Second, following sterilization, sterile technique should be practiced when attaching media lines to culture vials by working quickly, avoiding physical contact with the ends of fluidics lines, and taking care to spray gloves with ethanol. Finally, additional physical and chemical measures may be taken depending on the organism and experiment. For example, the sampling port may be covered by a sterile membrane for long-term culture. For slow-growing eukaryotic cultures, antibiotics can be added to the media to exclude bacterial contaminants. UV sterilization of components or surfaces is another preventative measure to consider.
Described initially in Huang, Heins et al. 2022 Nature Biotech
As IPP devices are sensitive to changes in pressure at valves and in connected media bottles, we developed an 8-channel pressure regulator that can be used to regulate these pressures through the eVOLVER framework. The device consists of sets of two proportional valves that can limit air flow from a high-pressure source and a vent at atmospheric pressure. By connecting an electronic pressure gauge to the output of this valve configuration, it is possible to implement proportional-integral-derivative (PID) control over the valves in order to set the output pressure to any desired level between the input and atmospheric pressure. We validated the functionality of this device by regulating pressure at 1.5 psi over 24 hours, and compared the performance of our device with that of a fixed, manually set regulator (PARKER-WATTS R25-02A) connected to the benchtop air supply (Supplementary Figure 3). The average pressure with PID control was 1.498 psi with an RMS error of 0.0086 psi, while the fixed regulator had an average pressure of 1.706 psi with an RMS error of 0.2220 psi. Large pressure deviations (>0.5 psi) that can affect the performance of the devices were observed with the fixed regulator, but were successfully eliminated with our automated pressure regulator scheme. We further characterized the effects of pressure changes at various locations in the system in order to optimize performance of the IPP devices for the course of a PACE experiment (Supplementary Figure 3).
Warning: you will need to recalibrate both OD and temperature after swapping in the new part
If your eVOLVER is stock from Fynch, then you do not have the upgraded part (as of April 2024).
Download the latest version here. Compare to the version online here to determine which version you have.
[Versions >= 5.1.1] More consistent OD calibration
You can tell if you have this part by pulling out the OD LED or photodiode from your vial holder and seeing if there is a smaller circle of plastic inside the hole
If there is simply a flat area on the bottom of the hole, you have an older version
Because of variation in depth of photodiode and OD LED. See here
Otherwise you will have vials with poor calibrations
[Versions >= 5.2] More resistant to overflow
You can tell if you have this part because there are triangle-shapes around the screws holding the Smart Sleeve together.
On the old 3D printed part (v5.1.1 and below), overflows could easily short the heating resistors
The latest version has cutaways to prevent this
Print out your vial holder by downloading the latest version here
Send the .stl file to a manufacturer (such as hubs.com) and choose FDM printing
Choose black plastic (optics change otherwise)
Remove any extra plastic in the photodiode and LED holes
Use this guide to help you rebuild your Smart Sleeve with the new vial holder
Make sure to firmly push the OD LED and photodiodes all the way in (see figure below)
Recalibrate temperature and OD
More stirring leads to better aeration and thus better growth in many cases. Try this stir bar for more vigorous stirring: Length 20 mm, Diameter 3 mm (# SBM-2003-MIC).
Try different stir speeds to see if you can get stable and intense stirring.
A guide for building Smart Sleeves on eVOLVER
If you need additional aid or have questions about this process, feel free to ask on the forum!
eVOLVER hardware is primarily divided between the Smart Sleeves and Motherboard. The Motherboard is where all the sensitive control hardware is, whereas the Smart Sleeve is nice modular way of integrating all the sensors to control your culture conditions.
The goal of this tutorial is to show how one can build an eVOLVER Smart Sleeve using commonly found tools and easily customizable parts.
In this post, we are describing the Smart Sleeve built for continuous culture documented in our Nature Biotechnology paper. It typically takes 10 to 15 minutes for construction of this version of the Smart Sleeve with all the appropriate parts (e.g. soldered PCB, constructed aluminum tube). Raw materials cost roughly $40/ vial however cost for 3D printing, machining, and coloring (spray painting/ anodizing) parts vary due to accessibility to appropriate tools.
Here is a great introductory tutorial on soldering from our friends at Sparkfun. Also, you can easily outsource your 3D printed parts to be produced by folks at 3DHubs by uploading the appropriate STL file (if you’re a student, don’t forget the student discount!). Generally, building a Smart Sleeve is simple because we only use through hole components and screw terminals, so it is much easier to make than surface mount designs.
How can I modify or change the design?
We built our PCB designs on KiCAD, an open-sourced software for circuit board design, and our 3D models on Solidworks. Here is a schematic of the PCB here and the Solidworks part here. There are many other programs for vial board design, including a bunch of tutorials on Eagle from Sparkfun, another popular CAD tool for the open-source community.
No. This tutorial only provides instructions on how to build a Smart Sleeve.
1. Order all of the necessary parts and tools.
List of supplies needed ( displayed in photograph above ):
Laser Cut 1/4" Acrylic Base
2 pieces of laser cut 1/8" Acrylic Fan Spacers
5/64" Hex Key
IR LED
IR Photodiode
Thermistor
2x Socket head screw
12 V DC Computer Fan with Magnets Glued
Vial Board
Lab Tape
3D Printed Part
Aluminum Tube
Soldering Iron + Solder
2x Stainless Steel Screws, 2.5" 4-40 threading (Not Shown)
2. Familiarize yourself with how the Vial Board, 3D printed part, and aluminum tube should be assembled.
Take notice if all the components line up properly:
Tapped 2-56 holes on the Aluminum Tube lines up with holes on heating resistors (2 black rectangular components soldered on vial board)
The heating resistors should sit on two rectangular holes on the 3D printed part
Green screw terminals line up with the LED holes on the 3D printed part
Take note of where the two holes labeled “thermistor” are on the PCB.
3. Tape thermistor on the aluminum tube near where the two vias were located on the PCB.
When taping the thermistor, ensure the writing on the thermistor is facing away from the aluminum tube. Tape the thermistor parallel to the length of the tube about .5 cm away from the bottom of the tube. The leads should be exposed when slotted into the 3D printed part.
4. Slot the aluminum tube into the 3D printed part. Verify that the holes for the LEDs on both the aluminum tube and 3D printed part are properly aligned.
Make sure 3D printed part is slotted tightly. Add additional pieces of tape if is loose. Avoid damaging the thermistor by twisting or rotating the parts.
5. Align the PCB over the 3D printed part, with the two thermistor leads threading through the vias on the PCB.
Also verify that the two small 2-56 holes on the aluminum sleeve align with the holes on the heating resistor.
6. Use the 2x Socket head screws to fasten the heating resistors to the aluminum sleeve.
Aligning the hole with the heating resistor makes screwing the socket cap in much easier. Thermal paste can also be applied before this step to form better contact between the heaters and aluminum tube.
7. Place the 1/8" laser cut acrylic pieces onto of the fan to act as spacers between the magnets and glass vessel.
8. Use the two 4-40 stainless steel screws to fasten the assembled 3D printed part and the computer fan with spacers. Fasten both screws onto the 1/4" acrylic piece.
9. Coil the wires from the computer fan around the Smart Sleeve and connect to appropriate ports on the screw terminal labeled “fan”.
The red wire should go into PWR and the black wire should go into the GND ports.
10. Attach the LED (clear packaging) and photodiode (dark packaging) for OD measurement to the appropriately labeled slots.
Both the photodiode and LED should have a short and a long lead. This corresponds to the polarity of components. Make sure for both components, the longer lead is connected to PWR . If this is done improperly, you will not get a reliable signal.
11. Bend the LED and diode into the corresponding slots.
12. Finally, solder the thermistor onto the PCB.
That’s it! You’re done.
Following a similar framework for building the Smart Sleeves enables adding different parameters, adaptation to different vial sizes, and other creative eVOLVER applications! Have fun! Let me know if anything is unclear on the forum.
A guide to basic command line terminal usage on a UNIX based machine.
UNIX is an operating system originally developed in the 1960s that is the base for modern operating systems such as macOS X, GNU/Linux, Sun Solaris, and many more. While modern UNIX systems usually have a graphical user interface (GUI) that you can use to interact with the system and run programs, the most direct and powerful way to interact with the kernel (operating system core) is through the shell (command line).
Pretty much everything in UNIX is either a file or a process. Files are simply collections of data – they can be plain text, programs, binary machine code, or even directories. A process is a program that is being executed by the kernel.
The file-system on UNIX is very simple – it’s a tree that starts at root, which is written as /. Everything then branches off of the root with a location specified by a path from the root to the file. For example, if there were a user on a UNIX system with the username unixuser1, the home directory would typically be located at /home/unixuser1. If this user had written a hello world program in c and put it in a directory called myprograms in their home directory, that path would look like /home/unixuser1/myprograms/hello.c. It’s useful to think of the file-system as a tree that you navigate up and down through, and create routes from one spot to another. More on this later!
The shell is the interface between the user and the kernel – it is a command line interpreter (CLI) which takes commands that the user types in and sends them off to the kernel to be carried out. Commands in UNIX are actually programs, which means that they are files on the system. When a user enters a command, the shell goes and finds that program and arranges for it to be executed by the kernel. The shell is configured through some other files that it looks at when it starts up to know where these programs are located so that the user doesn’t have to type out the path each time they want to use them.
When you open your command line terminal, you should see something like this:
This line is called the prompt – it is the shell waiting for the user to enter a command to run. Typically, the prompt will end with a $, meaning the shell is ready to accept a command.
Your prompt will probably look a little bit different, as this system has some customization and configurations set that print some extra information and changes the colors. This will be explained at the end! Just make sure you see a $ at the end of the line.
To execute a command, simply type it out on the command line after the prompt and press enter! Some commands can accept additional arguments or flags that will change the way they print things out or how they execute. Arguments are passed to a command as space separated strings of text. Because they are space separated, you cannot include spaces in your arguments - they will be interpreted as separate arguments. To pass in a string with spaces, you must either escape the space character by placing a \ in front of the space, or put the entire string in double quotes ("). Be careful though, as not all commands behave the same! It is best practice to not use spaces and other special characters in filenames if it can be helped. More on passing arguments will be shown in the following examples.
The shell has a concept of a current working directory, which can be thought of as the location in the file-system that the shell is currently “looking” at. When you start a terminal, usually the current working directory is the home directory of the user, typically at /home/username, or /Users/username on mac.
As stated earlier, a path is a string that tells the shell where to look for a specified file. There are two types of paths, absolute paths and relative paths. An absolute path starts at root (/) and lists out the entire file-system route to a file. For example:
/home/unixuser1/myprograms/hello.c
A relative path is the route through the file-system from one location to another. These are useful as they require fewer characters, less typing, and allow programs to be written that interact with the file-system that can run from anywhere and not have to worry about where the current working directory was when it was called.
When writing out paths on the shell, if you do not write an absolute path, the shell will interpret the path as relative starting from the current working directory. For example, let’s say a user wants to do something with the hello.c file in their /home/unixuser1/myprograms directory, and their current working directory is their home directory (/home/unixuser1), as in this figure:
The relative path to their c file would be the following:
myprograms/hello.c
This would be interpreted the same as the absolute path /home/unixuser1/myprograms/hello.c, but it requires less typing!
It is also possible to write relative paths to things further up or in a different branch of the file-system. For example, if the current working directory is /home/unixuser1/Desktop, and the user wants to reference the same c file as above, visually it would look like this:
and the relative path would be:
../myprograms/hello.c
The double dot (..) means up one level in the file-system. You can go up more than one level by stringing them together. For example, given a current working directory of /home/unixuser1/Desktop/another_directory, to reference the same file the relative path would be
../../myprograms/hello.c
Double dot .. means the directory above the current one. A single dot . means this current location.
Tab can be to autocomplete a path or filename. Start typing the first letters, then hit Tab. USE THIS! It will prevent you from making typos or looking for something that doesn’t exist, and saves time overall.
Hitting Tab twice in quick succession will print out all files matching up to the point typed, then allows you to keep typing.
The star character * matches 0 or more characters in a filename. For example, *.txt would match all files ending in .txt.
The tilde character ~ stands for the home directory of a user.
Ctrl + C: kills the current foreground running process in the terminal and returns control back to the user (prints a new prompt).
Ctrl + L: Clear the screen. Alternatively, use the clear command.
Ctrl + A or Home: Moves the cursor to the end of the line.
Ctrl + E or End: Moves the cursor to the end of the line.
Ctrl + K: Deletes from the current cursor position to the end of the line. String this together with Ctrl + A to delete everything on the line!
The up arrow and down arrow on your keyboard will let you scroll through your recent commands so you don’t have to retype them.
Ctrl + R: Recall the last command matching the characters you provide. Press repeatedly to search past the last matching to previously matching commands.
command > file redirects the output of a command to a file, overwriting existing content.
command >> file redirects and appends output of command into a file (does not overwrite).
first_command | second_command is a pipeline, (the | character is called a pipe). This will send the output of the first command as input to the second command.
Here are a few useful commands for navigation, inspection, and basic file manipulation on the command line. This is by far from being exhaustive! Most operating systems will have documentation listing out available commands and how to use them. You can also use the command man <command> to bring up the documentation (or manual) for a command within the shell. Press q to quit the manual after running. You can type /<search_string>
to search through the manual.
Displays the username of the current user.
Notice that after executing the command, the shell will print a new prompt for the user to enter another command.
Identifies the location of an executable. Use this to determine if a command or program is installed on your system, and also to see where it actually resides on the file-system. If the program cannot be found, nothing will be returned.
Stands for Print Working Directory. It prints the absolute path of the current working directory from root. The current working directory is the location on the file-system where the shell is currently focused.
Stands for list. This command will list out all files in a given directory.
You can provide a path to ls to list files not in the current working directory. Some useful flags are -l (long listing format), which can show you file permissions, owner, size, and last modified date, and -a (shows all files, including hidden files).
Stands for Change Directory. Moves the current working directory to the path specified as an argument to the command. The syntax is cd <path>
, where <path> can be any relative or absolute path on the file-system. If the path is invalid, the current working directory will stay the same.
Stands for make directory. Creates a directory at the stated path if it does not already exist.
Stands for copy. Copies file at one path to another specified path. If the path to be copied to is a directory, cp will copy the file and keep the same filename. You can also specify a new filename. The syntax is cp <file_to_copy> <new_location>
If you want to copy an entire directory, pass the -r flag.
Stands for move. Works exactly like cp, but will remove (rename) the file from the original location.
Notice in this example that the directory went from having two files to only having one! Be very careful with cp and mv – these commands will overwrite any existing files, and there is no undo or recycle bin!
Stands for remove. Delete a file at a given path. To delete an entire directory, pass the -r flag. You can also pass the -f flag which will not prompt for confirmation regardless of the files permissions. Remember, there is no undo when using this command. The syntax is rm <filename>
Updates file timestamp information. Can be used to create an empty file.
Outputs the strings being passed to it as arguments. You would usually pipe this command into other commands or use it to write data into a file through a single command. If you pass the -e flag, you can parse escaped characters. You can use this to print out Unicode symbols or different colors.
To append a line into a file:
echo "This is a string I want to append" >> myfile.txt
Stands for concatenate. Displays the contents of a file. You can use it to concatenate by passing it multiple files, and it will print them to some output location.
Displays the first 10 lines of a file. Pass the -n argument to specify how many lines to display.
Displays the last 10 lines of a file. Pass the -n argument to specify how many lines to display. Pass the -f flag to follow, or to not stop when end of file is reached, but rather to wait for additional data to be appended to the input. Press Ctrl + C to quit afterwards. Useful for watching log files in real time.
Like cat, but only displays contents from the beginning up to what will fit on the screen. Use the arrow keys (or j and k) to move the display through the file. Press q to quit.
Searches a file or files for lines that match a regular expression or string. There are lots of flags and options for this command depending on what you’re trying to do, run man grep to see everything it can do.
For example, say you have a complicated project with many directories and want to find where a specific variable name or library is used. You could use grep to recursively look through all directories and look for that variable name. Grep will print the filename and contents of the line it found it on. In this example, the -r flag means to look recursively through any directory it finds, the -I means to ignore binary files, the -n will make it also print the line number, and the . means to start the search at this current location (the current working directory).
Finds files with properties that match a specified pattern. To find a file with a specific name from the current working directory, type the following:
find . -name "myfilename.txt "
You can also pass regex patterns to find multiple files that match a certain pattern. To find all c files, try the following:
find . -name "*.c"
Stands for Stream Editor. Useful for searching, finding and replacing, inserting, or deleting things in files. As an example, maybe you want to replace all the tabs in every file within a directory to four spaces. You could do this all at once with one command:
sed -i .bak $'s/\t/ /g' *.c
The -i means to edit the files in-place, and backs up the files with an extension .bak. The characters within the quotes are what we are searching and replacing (basic regular expression), with / as a delimiter between what we are searching for, replacing, and any other options in the regex. So in this case, we are searching for \t (tab), and replacing it with four spaces. The g signifies to do this globally across the entire file and not just on the first occurrence. You can combine commands like find with sed to modify files across your file-system or in specific projects all at once.
If you really want to do some interesting command line text processing, check out the awk command!
If you want the same coloring scheme I have in my terminal, edit the file ~/.bash_profile using a simple text editor. If you want to do it in the terminal, try using nano (a very simple text editor) or vim (an extremely powerful editor with a learning curve). Look up the usage of these on google before you open them! If you want to learn vim, you can use the built-in program vimtutor that will guide you through the basics.
To turn on some basic coloring, add this line anywhere in the file:
export CLICOLOR=1
The export command is setting the value of the environment variable CLICOLOR to 1, turning on colors. You can change how these colors look by changing some other environment variables. For example:
export LSCOLORS=GxFxCxDxBxegedabagaced
This setting makes the ls command print in a different color scheme. You can look up how to customize this on your own.
Lastly, to make your username/hostname on the prompt have different colors or display different things, you can modify the PS1 environment variable, which contains the value of the default prompt:
export PS1='\[\033[01;32m\]\u@\h\[\033[00m\]:\[\033[01;34m\]\w\[\033[00m\]\$ '
This makes my username (the \u) bold and green, prints an @, then the host name (\h) and a colon, then prints the current working directory in blue (\w) followed by a $ in white.
You can modify the .bash_profile file to do lots of other useful things as well, such as making aliases for different commands, modifying or appending to environment variables, or setting up other things. Do your own research to see what kinds of things you can do!
Some terminals also have some color settings applied by default, or the ability to load up different profiles. Keep this in mind when trying to modify the appearance of your terminal.
Process for updating code on the eVOLVER Server (Raspberry Pi)
If you have any questions or concerns not addressed here, reach out on this forum post.
You can download the latest version of the code on our GitHub release page. If you do, skip step 3 below.
On Mac: scp evolver-electron-2.0.0.AppImage pi@<your_evolver_ip>:.
On Windows, use WinSCP or Filezilla to drag the file to /users/pi/home/
First, ssh to the Pi:
ssh pi@<your_evolver_ip>
Next, make the file executable using chmod:
chmod +x evolver-electron-2.0.0.AppImage
sudo nano /etc/xdg/openbox/autostart
Scroll down and change the following line to correspond with the version you are using.
You can either power cycle (turn off the eVOLVER completely, wait a few seconds, then turn it back on) or you can use the following command:
sudo reboot now
Open up a terminal of your choice (I use iTerm2).
Use the cd
command to navigate to the eVOLVER server software.
3. Use git
to pull the latest version of the code. I have my own fork, so I need to pull the code from an upstream master branch. git pull origin master
should work for most setups.
4. I like to use the scp
command to transfer the files over to the eVOLVER. scp
stands for secure copy - it usesssh
to transfer files between computers on a network. You can also use any GUI based tool - Filezilla is a popular one. I also normally only transfer the python files, and not the entire evolver directory. The server saves calibration files and other configurations which we don't want to modify by accident. To transfer only the relevant python files, run the following command:
Replace the <eVOLVER_IP> text below with the actual eVOLVER IP.
scp evolver/evolver/*.py pi@<eVOLVER_IP>:/home/pi/evolver/evolver
5. Now that the files have been updated, the last step is to restart the server so the changes will take effect. ssh
over to the evolver and run sudo supervisorctl
. Then enter restart evolver
, and you're done!
Follow steps 1-3 as described above.
4. Use WinSCP or Filezilla to drag the .py files into the correct locations. Be careful not to overwrite other types of files.
5. Most Windows 10 computers have a Windows 10 SSH client (such as OpenSSH Client) so you can log into the Raspberry Pi from Command Prompt in order to restart the server. Simply type ssh pi@<eVOLVER_IP>
(replace <eVOLVER_IP> with your actual eVOLVER IP) and log in. From here you can run sudo supervisorctl
as normal.
For routing media from standard lab glassware
Note: The original forum post calls for 5/32" barbs and 1/8" inner diameter tubing for use with media bottles and splitters. While this will work (with some effort) for soft silicone tubing, it does not work for more firm tubing or some barb styles. We advise that you always match the barb size rating to the tubing inner diameter; i.e. always use 1/8" barbs for 1/8" ID tubing, and 5/32" barbs for 5/32" ID tubing.
While large carboys (autoclavable plastic jugs >10L) are useful for long-term experiments or particularly fast-growing bugs, the best typical media storage is standard Pyrex/Corning bottles, which range from 100 mL to 10 L. The 1-2L bottles are the most convenient size for media prep, short experiments, and experiments with many media types, so we'll be sharing the process for those bottles here.
Per media bottle, you will need (see parts list, fluidics page):
1 ft of 1/8" ID silicone tubing 2 Female luer-lock connector with 1/8" barb, polypropylene 1 Male luer-lock connector with 1/8" barb, polypropylene 1 Male luer cap Tools: Scissors/razor Drill gun 3/16" drill bit
First, drill a hole directly down through the cap. Be sure to have something safe to drill into on the other side. If having trouble with the 3/16 bit catching on the plastic, drill a pilot hole with a smaller bit.
Next, push one of the barbed female luer connectors through the top of the cap, so the luer side is facing up.
Next, cut two pieces of tubing. One is for the cap above, and can be as short as 3". Put the two remaining luer adapters (one male, one female) on this piece. This flexible piece makes it a little easier to connect lines to bottles. The other should be at least 9" so that it makes it from the barb on the cap all the way to the bottom of the bottle (for 1L bottles). Connect the longer piece of tubing to the barb poking through the bottom of the lid.
The long straw should reach the bottom of the bottle and bend slightly. If it’s too long it will be annoying to screw the bottle cap on, and might get stuck against the wall. If it's too short, it won’t be able to reach media at the bottom of the bottle. Your bottles may vary: for 2L bottles, you need a 13" straw.
Rinse out the straw with diH2O, and add a male luer cap to the top of the straw before autoclaving, and you’re good to go!
You can also make splitters with the same 1/8" tubing and corresponding luer-barb connectors and barbed T-connectors, allowing you to split one media bottle to multiple input lines. We usually sterilize the splitters using 10% bleach and ethanol (by connecting them before sterilizing all the lines when beginning an eVOLVER experiment), but everything shown here is autoclavable as well.
A guide for usage of the eVOLVER GUI to set parameters
Before doing using the GUI, all Software Installation and Network Configuration should be complete.
Also, make sure to calibrate parameters before using them.
Turn on the eVOLVER 5V
power supply by flipping the associated switch. IMPORTANT: Wait for 5 seconds before turning on the 12V
power supply.
Ensure the correct eVOLVER is selected by consulting the upper right hand corner of the GUI. It will display the eVOLVER name (default is evolver-darwin), followed by the IP address in parentheses. This will be the IP address you assigned it when setting up the router connecting the DPU to the vial platform.
If connected, the indicator dot next to the name should be green. If this dot is red, you may need to troubleshoot the eVOLVER vial platform connection to the DPU. Consult the eVOLVER DPU Installation and Networking Setup for details on setting up and troubleshooting this connection. Otherwise consult the forum or post a question.
In the PARAMETER
box, ensure the correct calibrations are selected for Temp, OD, and the pumps. Click the box for each to bring up a list of available calibrations for that parameter.
Select all vials by tapping Select All
in the bottom right corner of the screen. The vial circles on the right side of the display should become orange.
You can also click and drag to select as many vials as you want.
Tap the NEXT →
on the box that says parameter to get to the Stir
tab. Tap the -
button or drag the slider to a Stir of 8. Press the Stir: 8
button to alter the stirring of all vials.
Tap the NEXT →
on the box that says parameter to get to theTemperature
tab. Tap the -
button or drag the slider until the middle button says 37.0 °C
and tap the button. The EXECUTED COMMANDS
box should state that a stir and then temp command was sent to all vials.
Refer to the JoVE video for how to use pumps and sterilize fluidic lines
Process for installing the Arduino IDE and necessary eVOLVER Arduino libraries.
If you have any questions or hit a roadblock, check this post on the forum.
Their website should be fairly easy to navigate.
The Sparkfun website has a very good blog on this. For more details, please refer to that link. The following is information copied from there.
Navigate to your board manager ( Tools > Board > Boards Manager… ), then find an entry for Arduino SAMD Boards (32-bits ARM Cortex-M0+) . Select it, and install the latest version.
First, open your Arduino preferences ( File > Preferences ). Then find the Additional Board Manager URLs text box, and paste the below link in
Then hit “OK”, and travel back to the Board Manager menu. You should (but probably won’t) be able to find a new entry for SparkFun SAMD Boards . If you don’t see it, close the board manager and open it again.
Plug the SAMD21 into your computer via a data transfer micro-USB cable.
The boards used in eVOLVER are the SAMD21 Mini boards.
The port changes based on which USB the Arduino is connected to. The wrong port is typically the most common reason why the Arduino won’t upload.
If you are unsure which port is the correct one, plug and unplug the SAMD21 board and see which port appears and disappears.
Choosing the board:
Choosing the port:
Download the scripts from our Github Page
Download by clicking "Code" and downloading as a zip file
Extract the files from the zipped file
Copy the libraries folder into your local Arduino libraries folder
For example, on my computer, it is under Documents > Arduino > libraries
This should be all. Open up the files and upload your scripts to the microcontroller via microUSB! The program should tell you that it has uploaded successfully.
A quick tip: there are many poorly designed microUSB cables out there (e.g. just for charging). Be careful to use one that you know works. If you can’t upload, try another cable. If it still fails, take a look at this guide.
Process for configuring a Raspberry Pi for eVOLVER
Please see the Raspberry Pi infrastructure page for additional information on the RPi we use for the eVOLVER.
Be sure to update the server code on the RPi after following this guide, or you will have issues communicating with the server through the DPU or with actuating/sensing connected components!
RPi Imager Guide - Recommended
Command Line Guide (Mac/UNIX only)
1. Download the pre-configured eVOLVER RPi image here.
2. Download and install the Rapberry Pi Imager Tool.
3. Plug an 8GB micro-SD for the RPi into an adapter, then into a the computer.
4. Click the Choose OS
button, then scroll to the bottom and click Use Custom
.
5. In the popup at the dropdown at the bottom of the window, select All files(*.*)
. Then select the image file downloaded in Step 1.
6. Click the Choose Storage
button and select the SD Card.
7. Click the Write
button. A notification might appear warning about erasing all existing data on the card. Click Yes
. If it asks for your computer password afterwards, enter it. It might take a while to finish (~40m).
8. When it completes, you can plug the SD card into the RPi. You will need to update the server code and potentially the conf.yml
with the latest code from GitHub.
1. Download the pre-configured eVOLVER RPi image here.
2. Plug the SD card into the computer.
3. Open a terminal of your choice (I recommend iTerm2).
4. Run the following command:
diskutil list
Identify the SD card name from this (it should be obvious). Next run:
diskutil unmountdisk <diskname>
where <diskname> is the name you identified from the previous command - it should look like
/dev/disk3/
or something similar.
5. Use the dd
command to copy the image onto the SD card:
sudo dd bs=4m if=<diskimage.img> of=<diskname>
Be sure to change the two arguments above! if
should point to the image you downloaded from step 1, and of
should be the diskname.
This command can take a while, and it doesn't show any status or progress updates - be patient. If it fails, try decreasing the bs
argument to 1m
instead of 4m
- this will slow things down but will decrease the chance of failure. If you still have issues reach out on the forum.
6. When it completes, you can plug the SD card into the RPi. You will need to update the server code and potentially the conf.yml
with the latest code from GitHub.
Writing an image to save your full Raspberry Pi configuration.
Useful to save time when reimaging your Raspberry Pi if you want to go back to your custom Python code and calibrations as quickly as possible.
Follow this guide: https://www.tomshardware.com/how-to/back-up-raspberry-pi-as-disk-image
This is a page collecting guides for millifluidics. These do not come with the base eVOLVER and thus should done only by advanced users.
For documentation and information about millifluidics see the hardware page.
When there is an obstruction in the line, from dried media or biofilm, the peristaltic pumps can produce up to 45 psi of pressure, which is enough to exceed the barbed connector tolerance and burst barb connections. This is clearly undesirable, so if you find that one of your barb connections has burst, check the length of the line for obstructions. If it's an efflux line to the waste container (opaque), assume it has an obstruction.
For the pumps that we typically use for eVOLVER, 1/16" ID tubing does not resist flow in any appreciable amount. If a pump is not pulling liquid, it is likely blocked or obstructed.
Biofilm obstructions can happen during long experiments with a biofilm-forming organism like E. coli - your best bet is to pause the experiment and bleach sterilize all lines before restarting. If your line is completely blocked, either replace the line or clear the obstruction by pushing water through the line with a 50 mL syringe (shown below).
If the syringe method does not immediately work to clear the blockage, the blocked lines can be soaked in water for a few days to help rehydrate the dried media/biomass - the silicone tubing is quite permeable, so water can slowly enter the tubing and help loosen any dried blockage so that it can be flushed out with a syringe.
Residual or leaked media on the ends of luer-lok connectors can dry and leave the connectors stuck. Rather than reach for a pair of plyers, soak the connection in hot water to dissolve the media. This can also help for any stubborn fluidic connection, and make tubing much more pliable.
Always use less than 10 psi inputs into the millifluidics and pressure regulator to avoid breaking them
Never use ethanol to sterilize millifluidics as it breaks them. Use bleach to sterilize and flush it with sterile water.
Plug in 5V power supply and 5V fan
Option 1: Manually change via Arduino (hard coded)
Follow the Arduino Software Installation
Unplug the SAMD21 from the pressure regulator before uploading code (otherwise there might not be enough power to the SAMD21 from the USB)
Upload modified pressure code to SAMD21
Option 2: Add a 'pres' command to the evolver conf.yml and modify conf.yml
Connect a 8-10 psi air input into the input port (only port on its own in 1.0 design)
Connect regulated line to both sensor (below) and controlled output (white, above) as shown below:
Solenoid Bank Diagram (facing holes)
The solenoids should be normally open and connected to the 8 psi air source. ie Vacuum when closed
Left = 8 psi
Right = Vacuum
Middle = 8 different solenoids, groups of 3 are IPP controls
Connect solenoid ribbon cable to slot 5 on the fluidics box
Turn on eVOLVER server and fluidics box
Run ipp_cal.py on the server:
Use command:
python3 ipp_cal.py <frequency (hz)> <seconds to run>
For example: python3 ipp_cal.py 1 100
It is recommended to calibrate using a pressurized input line (ie a 1.5 psi bottle). Always use that same pressure on the fluidic input.
Hook IPPs up to a pressurized input bottle for consistency
Make sure that IPPs are operating as expected and producing the expected flow rate
If running a trial experiment with just water, you can put food dye in to the inducer to visualize how much is injected into vials
Optical density (OD) is one of the most integral parts of continuous culture. While chemostats do not innately rely on OD, it is still a useful metric for your evolution. Meanwhile, turbidostats and growth curves heavily rely on OD to function.
However, OD is the most easily disrupted parts of eVOLVER hardware. This guide serves as an initial list of things to check when troubleshooting OD.
Disclaimer: You may find that you are still not getting "good" OD readings after trying solutions in this guide. We hope that you will search the because others may have had your same issue.
After trying a fix, before attempting a whole new calibration, prepare a couple of standards in the OD range that you care about and check if you see a difference between them in the raw OD values (in the GUI Setup page or by starting an experiment and going to the data folder).
For more in-depth information about the OD hardware see .
If you already have a version of the 3D printed tube holder with defined OD LED and photodiode distances:
Try different ADC resistor packs
eVOLVERs come with a variety of these
Ask on the forum for help
Check that your vial construction is not variable
Stir bars jumping around during OD readings
Decrease stir speed
You are near the edge of your calibrated OD range
ie eVOLVER OD is offset from the cuvette or plate reader measured value.
Especially because you did not wait for temperatures of the vials to equilibriate
Poor quality OD calibration
Different temperatures require different OD calibrations
Photodiode or IR LED not working
A failed photodiode will show a raw OD value close to 64,000
A failed IR LED will most likely show a raw OD value much closer to your other vials
Check that they have the long (positive) lead in the correct positive terminal
ADC board or motherboard broken
Can happen after vial overflow
Pre-Calibration Considerations
od_led value in conf.yml file (PWM value)
Use the splash guard that comes with your eVOLVER
You may need to recalibrate if you calibrated with ambient light
Experiment Considerations
Photodiode Temperature - make sure temperature is equilibrated before calibration and before start of experiment
eVOLVER recently turned on - causes rapid change in values
Needles or other structures coming below 10mL line (close to OD PD etc)
Vial volume - a volume of 10mL will totally change OD compared to 30
Stirring with low vial volume - this will give noisy readings as the funnel created by stirring fluctuates and is more and less reflective
Non-standard changes
Vial holder reflectiveness - ie white vs black vs metallic
Stir Bar Jumping
by increasing space between fan and vial
The is the main printed circuit board (PCB) of the eVOLVER. It houses the PWM boards, ADC boards, and SAMD21 mini breakout boards. In the event that the motherboard is damaged, it will need to be replaced. Some damage to the motherboard will be immediately obvious.
In the example below, overflow events during an experiment caused media to leak through the Smart Vial ribbon cable ports into the vial platform, which houses all of the eVOLVER circuitry. This resulted in visible damage to the motherboard, which can be seen below.
Before getting started with disassembly, be sure to unplug the eVOLVER from the wall outlet.
The motherboard is fastened to the eVOLVER platform and other internal components in several ways (numbers correspond to image below):
Ribbon cables connecting the motherboard to the Smart Sleeves (not shown)
Screws in gold holes
6 screws that fasten wiring from the power supplies to the motherboard
Cable connecting motherboard to Raspberry Pi (fastened to base of platform)
Cable connecting motherboard to display screen (fastened to lid of platform, obstructed by ribbon cable in image)
Unplug the cables connecting the motherboard to the Raspberry Pi and display screen.
Remove the screws in the gold holes using a Phillips screwdriver.
Remove the screws holding the wiring in place using a flathead screwdriver.
Close the eVOLVER chassis lid half way, making sure to hold the motherboard with one hand. Unplug the ribbon cables that connect the Smart Sleeves to the motherboard, starting from the last row of vials and moving towards the first row of vials.
Maneuver the motherboard around the 3D printed part housing the display screen.
The PWM boards, ADC boards, SAMD21 mini breakout boards and jumpers need to be transferred to the new motherboard.
Be sure to take note of where each board is on the old motherboard before removing them. An image of the configuration can be seen in the images above.
Remove the ADC boards, PWM boards, and SAMD21 mini breakout boards from their slots using an Integrated Circuit (IC) puller, as seen in the image below. Pull the IC puller perpendicular to the motherboard to prevent bending or breaking the SA boards’ pins.
If pins are bent in the process of removing the boards, they can be straightened using tweezers. Avoid bending the pins too much; excess bending can cause the pins to snap off.
If pins are snapped off during this process:
Alternatively, the pins can be soldered back into place onto the board, but this is much trickier to do.
The board should be replaced with a new board if other options do not work
Optional: If your motherboard includes a variable resistance board, proceed to steps 3 and 4. If not, skip to step 5.
Remove the variable resistance board from the motherboard. The ADC boards on this board can be removed first, or the variable resistance board and ADC boards can be removed as a single part.
Remove the headers under the variable resistor board and transfer to the new motherboard. These can be removed with pliers.
Remove the yellow resistor arrays (see below). An IC puller or pliers may be helpful here. Transfer the resistor arrays to the new motherboard, making sure to insert them in the proper orientation.
On the side of the resistor array, there is a description of the part and a black dot, seen in the image below. This black dot indicates the ground pin of the resistor array, and should go into the slot towards the top of the motherboard.
Remove the jumpers to the old motherboard by pulling them straight up. Transfer the jumpers to the new motherboard, recreating the same configuration as shown below.
Before transferring the SA boards to the new motherboard, they should be evaluated for damage. Damage to SA boards will look like burns, melted parts, etc. Damaged SA components should be replaced.
After checking for damage, transfer the variable resistance board (if applicable) and SA boards to the new motherboard (it is easiest to move these boards after transferring the resistor arrays and jumpers). Be sure to align the boards’ pins with the slots on the motherboard before pushing the boards into place.
You may need to apply some force to get the SA boards into their slots. HOWEVER, make sure you are not bending the pins further as you push them in
Adding the SA parts to their slots on the motherboard can be quite tricky, especially if their pins were bent during the removal process. Some tips for this step:
Inspect boards and use tweezers to carefully straighten pins that have been bent out of place. Bending the pins back and forth too much can cause them to break off the board, so this should be kept to a minimum.
If pins break off an SA board, they can be soldered back into place, or the entire board can be swapped out.
Place the SA board over its slots and check for pin alignment. Try to wedge the bent pins into place first, before pressing the board into place.
Make sure ALL PINS enter their respective slots before pressing the SA board into place.
The SA boards can withstand some force when being pushed into the motherboard. Press the SA boards into their slots until the boards lay flush with the slots on the motherboard.
Unscrew the 3D printed corners from the old motherboard and fasten them to the new motherboard. These parts act as spacers to prevent the backside of the motherboard from touching the eVOLVER platform.
Use electrical tape to cover all exposed elements on the back of the motherboard. There are exposed pins on both the top and bottom of the motherboard.
The new motherboard is now ready to be fastened to the vial platform!
Align the motherboard correctly by lining up the ribbon cable ports with the openings in the platform.
Fasten the motherboard to the platform using the screws and a Phillips screwdriver.
Fasten the wiring from the power supplies to the motherboard. The new motherboard will have screws in place for where the wires should go, so those should be removed and then used to fasten the wires to the motherboard.
Plug in the cables to the Raspberry Pi and display screen.
Plug in the Smart Vial ribbon cables to the motherboard from the top of the eVOLVER.
You are now ready to power up your eVOLVER!
The first time you turn on the eVOLVER after replacing the motherboard, we recommend opening the platform and keeping an eye out for a few things:
Be sure to turn on the 5V power supply first, wait 10 seconds, then turn on the 12V power supply.
If you notice smoke or the smell of something burning, immediately turn off both power supplies. If this occurs, inspect the motherboard and the SA boards for melting or burn spots.
The red light on the Controls Raspberry Pi should turn on steady, and the green light should blink on and off.
The red and blue lights on the SAMD21 mini breakout boards should turn on steady.
The 12V power supply powers the heating and stirring elements in the Smart Vials. If both of these elements are not properly functioning and you have inspected the internal circuitry for damage (see for more information), the next element to check is the 12V power supply.
measuring w multimeter?
If you have found that the 12V power supply is not functioning, you can replace it following the steps below.
Before getting started, be sure to unplug the eVOLVER from the wall outlet.
The 12V power supply is fastened to the bottom of the vial platform with 4 hexagonal bolts. Use an Allen wrench to remove these bolts.
Unscrew the wiring that connects the motherboard to the 12V power supply using a flathead screwdriver. This is easiest to do when the power supply has been unfastened from the case so that it can be turned on its side.
Attach the wiring to the replacement 12V power supply, making sure that the wires are in the correct configuration, as shown below.
Separating fluidic control from the motherboard
The fluidics box can be opened by removing the 8 phillips head screws on the sides. Inside the box is the fluidics board (with a SAMD21 and three PWM boards) with RS485 and 5V connections for the SAMD21, and a 12V power supply beneath the board. Should the need arise to update the arduino code on the SAMD21, you'll need to open the box to get to it.
The connections to the pumps are numbered according to their address, i.e. cable 1 connects to pumps 1-8, cable 2 connects to pumps 9-16, etc.
Not many things can go wrong inside the box, but we have dealt with a situation where the 5V power connection was faulty and led to malfunction. This part can be replaced by opening the box and replacing the faulty connector.
The existing pump pox can control up to 16 additional pumps (or any other 12V valve, actuator, etc) with no modifications. Typically this would mean using connections 5 and 6 on the back of the box, which correspond to indices 33-48.
Two RS485 ports (the telephone jack-looking ports) are available on the back of the fluidics box so that multiple boxes can be linked together on the same RS485 "line". All SAMD21 microcontrollers are receiving the same serial data from the Raspberry Pi, and only responding to commands when the appropriate address for that SAMD21 is in the command, like "temp" or "stir". Additional fluidics boxes can have the same "pump" address with higher pump indices (i.e. pumps 49-96 for a second box), so long as you change the number of expected pump values on the conf.yml file. You will also need to modify the SAMD21 arduino code accordingly. You can also have a different address for the other fluidics box, by adding another parameter in the conf.yml and modifying the arduino code accordingly.
Check the server software for more information
Monitor the server log file
Guide
Any time you are troubleshooting the server, make sure to save your calibrations.json file in a secure location before going further
If the log file is not updating (via evolver tail -f
)
If you have manually edited the conf.yml file, most likely you have made an error somewhere there
This could be formatting or a typo
Copy a conf.yml that you know works (for example to )
Using the server update as a reference
ONLY copy the conf.yml to home/pi/evolver/evolver/
Otherwise you will overwrite your calibration files
Restart the server
Stop following the server using ctrl+C
Type restart evolver
evolver tail -f
The server log should now be updating each cycle
If not, and you have not recently updated the evolver.py or other python files,
High-level description of hardware architecture
Smart Sleeve
Motherboard
SAMD21 Arduino Microcontrollers
Characterized SA Boards
PWM Board
ADC Board
Auxiliary Board
The eVOLVER hardware framework contains three levels of organization: (1) programmable sensors and actuators (e.g. Smart Sleeve components, pumps/fluidic control elements) (2) a Motherboard and microcontrollers, and (3) a Raspberry Pi. At the level of individual culture vessels, Smart Sleeves enable individual control over several experimental parameters in the culture.
Specifically, each sleeve contains sensors and actuators (e.g. heaters, LEDs, thermometer/thermistor) that measure and adjust aspects of the culture environment of a glass vial housed within. At the next level of organization, the Motherboard, Arduino microcontrollers, and other core electronic boards form a robust hardware infrastructure that communicates internally and coordinates activity of each individual Smart Sleeve to control each experimental parameter.
At the final level of organization, a Raspberry Pi forms a link to the outside world by relaying information and commands to and from a computer/server, permitting the same computer/server to run many eVOLVER devices across a network. Layered on top of the hardware framework, control software enables programmable feedback between parameters and orchestrates experiments at an abstract level, providing an easy method of customization that is shareable with other users. Below we present the core hardware framework as well as the particular configuration enabling the experiments described in this study.
The Smart Sleeve houses each culture vial and contains all the necessary sensors and actuators to regulate desired culture parameters. An aluminum sleeve surrounds the vial, which is mounted into a 3D printed part that houses a printed circuit board (PCB) called the Component Mount Board (CMB). The CMB contains a variety of different sensors and actuators needed to regulate culture conditions. As the most flexible component in the eVOLVER Framework, the Smart Sleeve can be re-designed to regulate other culture conditions based on the user's end application.
The Motherboard is responsible for housing custom PCBs and Arduino microcontollers that control user defined culture conditions by routing signals to and from an array of Smart Sleeves. Custom PCBs are plugged into SA (sensor/actuator) slots, of which there are 8. Using the routing system, these custom PCBs can collect data from CMB sensors or deliver power to CMB actuators. For example, in the base eVOLVER setup, there is a SA slot dedicated to individually powering heaters across all 16 Smart Sleeves.
On the Motherboard are 4 SAMD21 Arduinos, each of which is responsible for regulating a single culture parameter. To do so, each SAMD21 board is electrically connected to 2 SA slots since many culture conditions require both a sensor and actuator. To regulate temperature, for example, a single SAMD21 will leverage its SA slot pair to sense the temperature for each Smart Sleeve and provide the necessary power to each Smart Sleeve heater to maintain the user-defined temperature for each culture vial. This modular design enables functional parallelization of culture parameters, providing a high degree of flexibility to users when designing hardware for experiments.
FynchBio has designed and characterized the PWM Board and ADC Board, two PCBs that plug into Motherboard's SA slots. These boards are designed to power actuators and collect sensor data for existing CMB components and should be sufficient to handle custom reconfigurations.
The PWM Board is designed to power 16 actuators, in parallel, by amplifying the SAMD21 voltage ouptut using the Motherboard's voltage source. The PWM Board leverages pulse-width modulation (PWM) signals to power actuators, allowing digital signals to better approximate analog signals. This is essential because analog signals provide precise control of actuators, rather than simple ON/OFF dynamics with digital signals.
ADC Board
The ADC board is a 16-1 de-multiplexer that collects data from 16 sensors and filters it before sending it to its cognate SAMD21 Arduino. Specifically, the ADC Board reads the output voltage from a basic voltage divider circuit integrated with the sensor on the CMB. After analog signals are collected, they are filtered to remove noise, sent to the SAMD21 Arduino through an input pin, and finally converted to a digital signal for downstream data processing.
Akin to the Motherboard, the Auxillary Board is a custom PCB designed to control a peristalitc pump array to handle fluidic functions. This includes removing waste and adding nutrients/chemicals to cultures. The Auxillary Board contains a single SAMD21 Arduino, which connects to 3 PWM Boards to actuate 48 peristaltic
The programmable Smart Sleeve is the foundational unit on which the eVOLVER is built (Fig. 2 and Supplementary Fig. 1). The Smart Sleeve is comprised of all the sensors and actuators required to control the culture conditions inside a 40 mL borosilicate glass vial. At the core is an aluminum sleeve, which surrounds the vial and is used to control temperature via two resistive heaters and a thermistor integrated within. Near the base of the vial sits a 3D printed part that houses and aligns the optical density LED and photodiode. Below that sits a fan motor equipped with magnets to rotate a stir bar within the vial. The Smart Sleeve represents one of the most easily customized features of the eVOLVER: by changing which sensors and actuators are used and their layout, the user may develop culture vessels that fit their experimental needs. For a detailed description of the sensors and actuators used to control stirring, temperature, and optical density in Smart Sleeves featured in this study, as well as strategies for modifying the Smart Sleeve to fit experimental needs, refer to Supplementary Note 4. Liquid handling is also controlled at the level of the individual culture vessel, yet these components are housed in a separate fluidic module, described in Supplementary Note 5.
The sensors and actuators on each sleeve are integrated in a small printed circuit board (PCB), termed the Vial Board (VB). We designed the VB such that we can easily solder electrical connections and efficiently manage/package wiring from the sensors. The VB is a very simple PCB, containing only a few resistors, and is straightforward to redesign and inexpensive to manufacture, if needed. The simplicity in the VB leads to robustness in the system. For example, any accidental overflow and spillage from the vials (e.g. from clogged fluid lines or user error) should minimally impact the rest of the system, as critical components are located at the Motherboard rather than the sleeve itself. Ribbon cables provide a modular way to connect the integrated Smart Sleeves to the Motherboard.
The VB is designed to rest atop a 3D printed piece, which houses optical density and temperature components (see Supplementary Note 4). The printed part can be fabricated with Nature Biotechnology: doi:10.1038/nbt.4151 5 any commercial or DIY 3D printer, readily available at almost any university or hacker space, and customized to the requirements of the user. For example, if a user wanted to change the mode of optical density detection between scattering and absorption, they could redesign the 3D printed part housing the LED-diode pair such that it would have the correct offset angle for the desired mode of measurement.
Vial
Vial Holder
Vial Sleeve
Vial Cap
Vial Board
Also known as plumbing
For reference: Inner diameter = ID, Outer diameter = OD. Quotation marks (") indicate inches, single apostrophe (') indicates feet. Most eVOLVER hardware is in US customary units (i.e. not metric) due to wider availability of parts.
The standard eVOLVER package includes 1/16" ID (1/8" OD) soft silicone tubing for all fluid handling operations. For exact specifications, see the , "Fluidics" tab.
Silicone is the tubing of choice for eVOLVER because of its flexibility, durability, cost, and resistance to beach and ethanol. It is also autoclavable, although 30 minutes of 10% bleach sterilization is sufficient to completely sterilize the lines.
Silicone tubing is highly permeable to gasses, including water vapor. If you leave media in the tubing for >1 week, it will likely dry out and cause an obstruction (see ).
The standard eVOLVER package includes 1/16" barb to luer-lok connectors for all pump-to-vial connections. For exact specifications, see the , "Fluidics" tab.
The barb side of the connector is rated for the ID of tubing it is mean to be used with, i.e. 1/16" barb for 1/16" ID tubing, 1/8" barb for 1/8" ID tubing, etc. Barbs are designed to get a tight seal around their widest diameter, with the max pressure and resistance to slippage depending on the softness of the tubing and style of barb (40 psi for standard eVOLVER connectors).
Luer connectors work by pressing a "male" plug into a "female" socket, both tapered at 6%. Because of the smooth surfaces and large contact area, this creates an effective seal without tools, held in place by friction. Syringes and medical equipment commonly make use of luer connections.
To hold luer connections in place more securely, luer-lok connectors use a screw-like "skirt" to prevent luer connectors from simply being pulled apart. eVOLVER tubing connections are luer-lok, allowing for easy but relatively secure connections between most components.
However, luer-lok connections have some common failure modes. Because the threads of the skirt are so coarse, it only takes a 1/4 turn to break the seal at the plug-socket interface, leading to a leak (if positive pressure) or air bubble source (if negative pressure). Loose luer connections easily become disconnected, leading to spills (the major source of electronics failure) and of course, failed experiments. One should always ensure luer connections are snug (hand tight), and tubing free from torsion that might unscrew the luer-lok.
Additionally, because the male connector comes in direct contact with fluid, it becomes your most likely contamination source. Be careful not to bump the tips of the male connectors against contaminated surfaces when setting up your experiment. Doing a final wash with 70% ethanol after bleach sterilizing can prevent some contamination from this route, depending on your media and organism.
Any soft tubing (durometer 40-70A) works well with the barbed connectors. Vinyl (PVC) or tygon tubing might be a suitable alternative for decreased permeability. Opaque tubing may make sense for light-sensitive media or antibiotic feeds that have extended time exposed to light in the tubing due to low flow rates, at the cost of not being able to observe media in your line. Remember that 1/16" ID tubing contains about 0.75 mL per foot.
Making culture continuous
For eVOLVER to be more than a 16-well plate reader, there needs to be control of liquid flow through each vial. The most common hardware for this application is the peristaltic pump, used in continuous culture for almost a century. Novel aspects of eVOLVER include the automated, individual control of these pumps, and modularity for different types and numbers of pumps. This is enabled by an auxiliary fluidic board, separate from the motherboard, that controls up to 48 fluidic actuators. For typical eVOLVER use, this is coupled with 32 pumps (16 for influx, 16 for efflux), 64 lines of tubing (to and from each pump), and 128 barbed connectors (for both ends of each line of tubing). This section of the Wiki will go into detail of how each component works, and options for repair, troubleshooting, swapping, and modifying them in the eVOLVER fluidic hardware framework.
Differences to Version C bolded
Fan
Unused; linked to fan for future fan tachometer
Heating resistor
Thermistor
OD IR LED
OD 135 photodiode
OD 90 photodiode / Spare A
Spare B
Differences to Version D bolded
Fan
Unused; linked to fan for future fan tachometer
Heating resistor
Thermistor
OD IR LED
OD 90 photodiode
OD 135 photodiode / Spare A
Spare B
Just like the digestive system!
The standard eVOLVER peristaltic pumps (since ~2020) sourced by Fynch Bio are selected specifically to eVOLVER use. Previous pumps used with eVOLVER during its early development tended to wear out quickly and have variable flow rates, primarily due to the mechanism for rotating the rollers against the tubing to drive pump flow. The motor shaft directly turned the rollers through friction, which led to slippage and abrasion over time. The current pumps do not have drirect contact between the motor shaft and rollers, instead driving roller rotation through a gear reduction system.
This gear system drives a roller casing with fixed roller axles contained in the pump head. In this way, the pump action does not rely on friction and thus much more accurate and durable than previous pumps.
Because the current pump style has been introduced so recently, very few of them have failed from wear and tear. Based on our experience with other pump styles, the most likely failure mode will be collapse or tear of the tubing inside the pump head, or shearing of the tubing on the barb outside the head. This can be solved by replacing the pump head (contact Fynch Bio) or replacing the tubing.
The induction motor inside the pump is very unlikely to fail through normal use. If there is a liquid spill on the pump array and some pumps are not spinning, the most likely cause is corroded contacts with the pump array PCB. While the pumps themselves will be fine, they should be removed and replaced to a new PCB, ordered from Fynch or PCBWay. This will require removing solder, which can be tricky.
The pump heads can be rotated 90 degrees in any direction, should your bench setup require changing the direction your pumps face.
The low-flow pumps available through Fynch use an additional gear reduction box to reduce the speed of pump action by a factor of 45. This is useful for addition of inducers, antibiotics, or other media feeds that require a small and precise bolus.
Plenty of other peristaltic pumps are suitable for eVOLVER, so long as they operate at 12V.
The flow rate of eVOLVER pumps (and any pump with an induction motor) is somewhat modifiable through PWM modulation. This effectively reduces the voltage going to the pump, which will slow its rotation, down to the point where the coils can't generate enough torque to consistently turn the shaft. This happens about halfway through the PWM range (around 2000), where you can get the pumps to run at about 1/3 speed. This is rarely necessary for experiments, so it has not been optimized, but is a potential feature for users to explore.
The eVOLVER platform features tunable and independent stir rate control across culture vials. Stirring in eVOLVER is actuated by 12V brushless DC motors with attached neodymium magnets. The fastened magnets spin a stir bar (20 mm x 3 mm, PTFE coated) within an autoclaved glass vial (28 mm x 95 mm, borosilicate). The stirring module utilizes a single SA slot on the Motherboard; in the particular configuration described in this study, we utilized SA slot 1 (Supplementary Fig. 4). The two leads of the motor (12V & GND) are connected to a screw terminal on the component mount board, from which a ribbon cable connects the smart sleeve to the Motherboard. The PWM board (plugged into the SA slot) can control each motor independently to achieve different stir rates across eVOLVER vials. Briefly, the 16-channel PWM board amplifies a 3.3V signal from the Arduino microcontroller to a 12V signal to actuate Nature Biotechnology: doi:10.1038/nbt.4151 12 the motor. Arduino 1, which manages SA slot 1, was programmed to take in serial inputs from the Raspberry Pi and translate the serial values to different stir rates, determined by pulsing the motor ON and OFF at different ratios (Supplementary Fig. 4).
In contrast to current approaches in which all culture vessels are housed in a single incubator7,26, we developed a module for individually controlling the temperature of each Smart Sleeve in the eVOLVER. This not only allows the cultures to be maintained at distinct temperatures, but also reduces thermal mass, permitting dynamic temperature profiles. For the configuration described in this study, the temperature module utilizes SA slots 2 and 3 on the Motherboard (Supplementary Fig. 5). Typically, there are three main components to temperature control: (1) a thermometer, (2) a heater, and (3) a feedback controller. In our setup, the thermometer and the heater are integrated in the Smart Sleeve while the feedback controller is located on the Motherboard. Specifically, the temperature is measured by a 500 μm thick temperature-sensitive resistor, or thermistor (Semitec, 103JT-025). The sensor is integrated into the sleeve between the 3D printed part and the aluminum tube, and the thermistor is soldered onto the component mount board (CMB) after assembly. The aluminum tube enables even heat distribution/dissipation and shields the culture from ambient light (important for other measurements/parameters). Two heating resistors (20 Ohm 15 W, thick film) are screwed onto the aluminum tube for better contact and connected to the CMB via soldering. In our setup, the four leads, 2 from heating resistors and 2 from thermistor, are connected via a ribbon cable to the Motherboard and routed to SA slots 2 and 3, respectively. In slot 2, a 16-channel PWM board amplifies a 3.3V signal from the Arduino microcontroller to a 12V signal to actuate the heating resistors. Slot 3 contains a 16-channel ADC board, which reads the voltage difference across a 10 kilo Ohm resistor, and is responsible for analog filtering and demultiplexing the signal from the thermistor. These slots are connected to and are programmatically controlled by Arduino. Briefly, the Arduino code interprets serial inputs from the Raspberry Pi, updates the set point on the PID controller, and responds with the current measured temperature. Temperature settings can be updated as frequently as every 30 seconds. To determine how much to turn the resistive heaters on, the Arduino is programmed with a simple PID control algorithm. The PID controller can be easily tuned via software to obtain the desired overshoot and time delays. The Arduino then controls a PWM board (on SA slot 3) to interface with the resistive heaters and get the desired heat output. Calibration of the temperature measurement in the sleeve was performed by comparing the temperature of water measured in the vial using a thermocouple to the values returned by the thermistor (Supplementary Fig. 6). The dynamics of heating were determined by tracking temperature during a programmed step function, again comparing thermocouple and thermistor readings; the thermistor measures the temperature of the sleeve, while the thermocouple measured the actual water temperature. At room temperature (23°C for this experiment), a single culture (20 mL) can reach a temperature of 42°C in roughly half an hour with the current hardware setup (Supplementary Fig. 6). During an experiment, the transient offset between the recorded temperature and actual temperature may vary due to ambient temperature and volume of liquid. At steady state, the temperature can be maintained to +/- 0.1°C, with properly tuned PID constants. Max temperature and rate of temperature ramp can be changed with different power sources (e.g. 24V power source could reach temperatures >55°C). It should also be noted that at different temperatures, the optical density readings are affected accordingly. This effect was measured in both yeast cultures and evaporated milk (Supplementary Fig. 6). See the next supplementary note for more detail.
Resources related to using and programming arduinos for eVOLVER.
The eVOLVER uses SAMD21 mini breakout boards that can be programmed using the Arduino IDE. These microcontroller breakout boards allow the eVOLVER to read analog signals from sensors (OD, temperature, etc.) and actuate pumps, stir, LEDs, and any other culture component that is needed.
This page aims to go more in depth into the Motherboard's circuitry to assist users in making the necessary modifications to add/subtract new experimental parameters or tune existing ones.
As a quick recap, the Motherboard is designed to collect and send data/power to all 16 Smart Sleeves. The Motherboard is essentially a large PCB used to route signals via a network of electrical traces. Each SA slot (8 total) posses two electrical connections (positive and negative leads) to each Smart Sleeve CMB (8*2=16 connections per CMB). These two leads per SA slot are then used to make the physical connections to a sensor/actuator. In total, this results in 2 (leads per sensor/actuator) * 8 (SA slots) * 16 (number of Smart Sleeves) = 256 total traces. This is important to keep in mind when modifying the Smart Sleeve or troubleshooting when problems arise.
Lastly, each SA slot acts as a de-multiplexer/multiplexer for bidirectional relay of signals with its cognate SAMD21 Arduino.
TODO: Include a figure to highight transfer of data including voltage divider
As mentioned earlier, the Motherboard makes use of voltage divider circuits to acquire sensory data on cultures. Briefly, a voltage divider circuit works by connecting two resistors in series with Vin, a voltage source, to produce Vout, a set fraction of Vin (Fig 1.). The value of Vout is based on the the resistance values of the two resitors and the value of Vin, which can be modeled as:
This principle is used by the Motherboard to implement sensory circuits with components that transduce environmental signals into electrical signals (i.e. thermistors, photodiode, phototransistors, etc). This signal is read via Vout, the voltage across the resistor, which is proportional to the sensor's electrical readout (Fig 2.).
Based on experimental conditions, it may be of interest to tune how these sensory circuits behave to acquire optimal data. The Motherboard offers two primary ways to modify sensory circuits: 1) swap R1 to alter sensor sensitivity and 2) swap Vin to alter the circuit's dynamic range.
To streamline sensitivity tuning, the Motherboard uses 9-pin resistor packs (one is reserved for ground), which connect to the left-and-right to each SA slots (8*2=16 parallel resistors). As a user, all you need to do is remove the two current resistor packs and replace them with packs with desired resitance values. By taking a look at the raw sensory data coming off the eVOLVER, you can assess if the sensitivity modifications are adequate or not.
Resitor packs are polarized electrical components so ensure that the ground pin (with dot) is properly put into the female ground connector on the Motherboard.
Avoid bending or breaking pins when removing/placing resistor packs. Use pliers to gently pull up on both ends to nudge the resistor pack out
See the for all practical construction and operation.
A key development in microfluidics was the design and fabrication of devices containing integrated (pneumatic) valves that could allow for complex fluidic manipulations with minimal number of control elements27–29. Here, we describe (1) why adapting this technology for the macro scale is valuable for automated cell culture, (2) challenges faced when scaling to larger flow rates, and (3) a new framework for fabrication and bonding of millifluidic devices featuring integrated pneumatic valves. These devices offer a scalable solution to challenges faced by traditional fluidics.
The ability to program complex fluidic tasks could enable entirely new manipulations in automated cell culture applications (see Fig. 5, Supplementary Notes 15 - 17). For example, when growing undomesticated microbes, biofilm may form in the efflux fluidic lines and vials in as little as in 12 hours (e.g. see Fig. 5). The ability to programmatically bypass the vial in order to clean the fluidic lines with a bleach solution, and passage the culture from one vial to the next as a preventative measure, would be critical for long-term continuous growth of these microbes. However, complex fluidic tasks like vial-to-vial transfer, cleaning protocols, and mixed media inputs are extremely difficult with traditional fluidic systems used by current devices. In electronics, custom circuits can be readily created by breadboarding; however, this approach scales poorly to larger, more complex circuits because it relies on tedious manual assembly and leads to limited durability. Similarly, fluidic systems consisting of flexible tubing connecting separate control elements, like pumps and valves, can solve simple fluidic tasks. However, the number of necessary fluidic connections scales with the complexity of the desired task. For example, even with an optimal valving scheme, the ability to perform automated large volume transfers between any two culture vials in a 16-vial eVOLVER unit would require almost 300 fluidic connections and over 20 control elements. As in breadboarding, each connection would need to be routed individually by fluidic tubing and often by hand, a tedious task. Additionally, the tubing is usually fairly long, and each connection introduces dead volume, making the system less robust and impractical. Instead, by creating integrated (pneumatically valved) schematics, we sought to make a millifluidic equivalent of a printed circuit board; the complex fluidic connections are now integrated in a small device that is computer designed, manufacturable, and much easier to reproduce. With the flexibility of CAD, one would be able to customize a fluidic device to fit their particular experimental needs.
The cost of control elements and assembly time of bioreactor units can prove to be a significant burden as one scales fluidic inputs and outputs for high-throughput operations. As previously described, most designs rely on a pinch valve or a peristaltic pump to separately control each of the media sources and another to control waste. For example, a single vial turbidostat unit with 4 different media inputs would require 5 pumps. A hypothetical 48-vial unit with the same capabilities would therefore require 240 pumps, at a cost of $7,000 to $10,000. The key problem is that the number of control elements increases linearly with the number of vials. Our pneumatically-valved devices can leverage concepts developed in microfluidics in order to scale throughput by multiplexing and demultiplexing inputs and outputs27,30. In this scheme, the number of controllable vials scales exponentially to the number of control 23 elements, needing only 30 elements to route up to 16 different fluidic inputs to 48 vials. We project the costs of this new hypothetical 48 vial fluidic schematic to be $1,000 to $2,000, roughly a 90% decrease in cost in comparison to current systems.
Though inspired by microfluidic technologies, integrated millifluidic devices for continuous culture have drastically different design requirements. The following is a list of critical requirements for this technology in the context of continuous culture:
Devices need to be on the decimeter scale. Indicated in the nomenclature, microfluidic devices operate on the nano to micro liter per second flow rate. In contrast, continuous culture in eVOLVER requires flow rates of roughly ~1 mL per second, a 1000-fold increase. As such, in order to increase flow rate with an appropriate safety factor, the flow channels and device needs to be at least 10-fold larger than typical microfluidic devices.
New prototyping framework is necessary for larger devices. Traditional microfluidic prototyping techniques rely on standards from the microelectronics industry, namely patterning photoresist on silicon wafers29,51. Typically, 100 mm (4 inch) circular wafers are the largest size the machinery can pattern designs on, which is still too small for complex millifluidic devices. New fabrication framework is necessary to prototype devices for continuous culture.
Design cycle must be fast and repeatable. The success of microfluidics in the laboratory is, in large part, attributed to rapid and reliable design cycles enabling iteration and testing of prototypes. New design frameworks for millifluidic devices must be equally rapid and reliable.
Device must be transparent. Fluidic systems designed for long-term continuous culture of microbes will be prone to biofilm formation. The ability to monitor flow through the device is critical for debugging experimental issues.
Device needs to interface with pumps, filters, and tubing. Fluidics for laboratory continuous culture typically interface with syringe pumps, pressurized fluids, sterile filters and peristaltic pumps. A robust way to interface dozens of connections between the device and other fluidic elements (e.g. vials, filters) is critical and nontrivial.
Device must be resistant to 10% bleach and 70% ethanol. Sterilization of the device is necessary prior to any experimentation. Fluidic materials and fabrication must be resilient to these chemicals for weeks of continuous usage.
Our pneumatically-valved millifluidic devices enable customizable, programmable routing of liquid at volumetric flow rates of ~ 1 mL/sec. The valves pinch off fluid flow on the flow layer when 10 psi is applied to the control layer and enable flow when vacuum is applied (Supplementary Fig. 11). Improvement of device bonding will enable application of pressures above 10 psi, necessary with higher flow rates.
Fluidic tasks in eVOLVER are enabled by the sequential actuation of valves in a specific fluidic network encoded in the integrated millifluidic device. We demonstrate these fluidic manipulations in a series of experiments (see Fig. 5, Supplementary Notes 15-17). Each experiment utilizes different devices as required to meet the experimental needs. The architectures for most functions are modular (e.g. multiplexer, vial-to-vial router) and can be combined in order to achieve more complex functionalities (Supplementary Fig. 11). For example, simple single media input turbidostat function utilizes multiplexer and demultiplexer modules. The demultiplexer routes the media source to the correct vial and the multiplexer routes the efflux from vial to waste. The same multiplexer and demultiplexer modules are Nature Biotechnology: doi:10.1038/nbt.4151 25 reused in all Fig. 5 applications, but different multiplexed media selectors and vial-to-vial routers are included as needed in different experiments. Software routines to control the control elements (valves and pumps) are also divided into commonly repeated functions, usually in a similar manner to how fluidic modules were divided. The code for each fluidic function is preloaded into the Arduino to coordinate tasks between each fluidic module. For example, a simple dilution event would first actuate valves in the media multiplexer to select media, then actuate a syringe pump for metering the desired volume, followed by valves in the vial demultiplexer and multiplexer to route media into the vial and remove efflux. By loading the routine for abstract functions (e.g. dilute, clean, vial-to-vial transfer) into the Arduino, robust communication can be ensured, with rapid transition between sub-tasks and no skipped steps (which could cause incorrect media routing, mis-priming of the syringe pump, or leaks and other device failures).
IPPs need to be and before use.
Use the upgrade to double check your photodiodes and LEDs are correctly placed!
Sometimes a given OD photodiode or LED can be variable as they are cheap parts. Swap both out for new ones. Part numbers .
Try
is off enough to make your calibration fail
Bad
You can check your OD calibration using the script
Replacement
See motherboard and
Or using black acrylic
-
Not all pins are needed. You can check the hardware KiCad for whether the pin you snapped is necessary
Adding another pump array will of course require changes to custom_script.py, because pump indices 33-48 are not being sent commands during normal eVOLVER operation. The MESSAGE variable holds all information on how long to run each pump, and this is where you should implement your commands in custom_script. See the section of the custom_script page for more information.
For more information on luer connections (and credit for the above images), see here:
Inside the pump head, the pump tubing can be removed and inspected. The tubing is 2x4mm Pharmed BPT, which has similar chemical compatibility as the silicone tubing for the rest of eVOLVER fluidics, and is rated to over 1000 hours of operating life. Learn more here:
Pharmed BPT can be purchased from Saint-Gobain suppliers. However, the tubing should be 2mm ID and 4mm OD, and there is not enough tolerance to allow for similar non-metric sizes (like 1/16"x1/8"). 2x4mm Pharmed tubing is difficult to find in the US, and we are working on finding a reputable supplier for it. In the meantime, these alternatives from McMaster-Carr have been tested to seal and pump properly: and
Resources for setting up and interacting with the Raspberry Pi for use in the eVOLVER platform.
eVOLVER uses Raspberry Pi for interfacing with the Arduino microcontrollers and for processing user and experimental commands. Hardware and software configurations and calibrations are saved on the RPi.
We provide a pre-configured RPi image that is configured to run all eVOLVER software.
Raspberry Pi Imager - Use this to upload the disk image linked above to the RPi SD card. We have a guide for this process here.
Guide for uploading a disk image to the RPi SD card via command line - Only use this if you are comfortable working on a terminal and the upload tool above isn't working for you.
If you need to setup a new RPi, download the image linked above and install the Raspberry Pi Imager tool on your personal laptop or computer. Plug in the SD card from the RPi and upload them image onto it (this process might take a while). Afterwards, you can plug the card back into the RPi and update the server code.
Keeps liquid spills away from electronics
Protects OD readings from environmental light interference
If you have calibrated without the light blocker / splash guard you will likely need to recalibrate
1/8" acrylic sheet
Laser cut or get laser cut by a vendor
Find vector cutting files for this here
Acrylic solvent cement (Weld-On 4)
Remove backing, if any, from acrylic sheets
Hold pieces in place using tape or clamping
Follow solvent cement directions for assembly
Description of how the DPU (Data Processing Unit) code functions.
This page aims to explain how the server on the Data Processing Unit (DPU) functions. The repository can be found on Github.
The DPU is where actual experiment logic and data collection occurs. DPU code is typically ran on a lab computer or laptop connected to the the same router as the eVOLVER. Setpoints for experimental parameters, deciding when to actuate fluidics, and deciding how to vary experimental parameters as a function of time or based on feedback from experimental data is programmed in the DPU.
Within the DPU are 3 main components, the experimental code for running experiments, the calibration code for making fits relating sensor measurements to what they physically are measuring, and the graphing code for the deprecated experiment viewing web app.
There are two main files in the experiment DPU code, eVOLVER.py
, which is the file that is run to execute an experiment, and custom_script.py
which is where experimental logic goes.
This file handles all of the initialization (creating data directories and initializing files), communications with the server, and lower level details of sending commands and receiving data. Additionally, it handles data transformations based on the calibrations whenever data is received. It then makes a call to custom_script.py
to carry out the user-desired experiment routine based on the received data.
The DPU uses websockets via socketio to communicate with the eVOLVER server. It functions as a client, connecting to the server when the experiment is running, receiving data periodically, and sending commands to the server based on the experimental design. The EvolverNamespace
class (which is the socketio client class) has functions which are called when the corresponding event occurs over the websockets connection. For example, the function on_broadcast
is called when a broadcast
event occurs from the server.
This file is where the experimental culture routine is located. At the top of the file is commented code directing the user to modify constant variables to configure the experiment (experiment name, eVOLVER to run on, etc.) Then there are two default experiment functions for running either a turbidostat or a chemostat. It is also possible to write your own custom function to run by changing the OPERATION_MODE
variable to your custom function name.
This is the deprecated Django based web-app for viewing experiment data in real-time. To run it, open a terminal and cd
to /graphing/src/
. Then execute the following:
python3 manage.py runserver 0.0.0.0:8080
You should then be able to open a web browser and navigate to localhost:8080
to see the application. The app should also be accessible via the internet if the computer is connected to the internet by navigating to <ip_of_computer>:8080
.
The GUI now allows viewing of the data in real-time - you should not need to use this unless.
The two photodiodes on the eVOLVER are at 90 degrees and 135 degrees from the IR LED.
Try OD135 for OD600 < 0.5
There will likely be vials that max out between OD600 0.5 and 1.0
Try OD90 for OD600 > 0.5
Some eVOLVER systems are able to read OD90 up to OD600 of 4 or 5
This may require optimization of the internal resistor pack
Switching between currently requires manual OD calibration (can be applied to an existing GUI calibration you have on your eVOLVER)
See this forum post for an example
Detailed description of the custom_script.py file.
This file contains all experimental design parameters and logic. It is commented to help guide users in customizing their experiment with minimal actual programming required beyond setting some variable values.
The logic of running a continuous culture experiment should be structured such that any actions are based on the elapsed_time
of the experiment and on the latest received data. The functions are not called continuously in a loop - they are only called when new data is received from the server, which is set by the broadcast_timing
on the RPi (default is every 20s).
For example, if a sinusoidal temperature profile is desired, the custom_function
should check the elapsed_time
, use that time to calculate the appropriate temp, then send that command via the update_temperature
function in the eVOLVER
object that is passed to the function.
It is possible to change this file mid experiment! Simply stop the eVOLVER script (press ctrl + c twice on the terminal running the experiment or stop the experiment in the GUI) and restart it. The experiment will continue where it left off with any changes you made to the script now being implemented.
It is best practice to calculate the values desired for all vials before sending the command so they can all be updated at once as opposed to one at a time. This minimizes the number of messages sent to the server and how many commands the server has to send via serial to the Arduiono microcontrollers. Serial communications are shared between all the parameters and are relatively slow, so best to be efficient with the commands!
At the top of the file are a block of variables, which includes the name of the experiment, and the port (not necessary for most users to modify unless you have a more complicated setup or IT needs). eVOLVER IP is specified on the command line (or experimental params if running through the GUI).
Be sure to set the VOLUME
variable! It is needed to accurately calculate the appropriate amount of time to run the pumps to hit a desired OD wiht a dilution in the t-stat and to hit a desired rate (volumes / hour) in the c-stat.
The next block of variables are where the user should set any initial values such as STIR
, TEMP
, and any other parameters. This is also where the OPERATION_MODE
is set. This value should match the name of another function within the file, which will be called every broadcast
event from the server, i.e. it should notate the name of the users desired experimental routine.
One of the default custom_functions
provided, this function executes logic to perform a turbidostat on the eVOLVER.
time_out
refers to the amount of time to run the efflux pump extra - this prevents overflows by ensuring the efflux pump runs at least a few seconds longer than the influx. If you have a large turbidostat window (i.e. big dilutions > 10ml) you could consider increasing this value for extra safety.
pump_wait
is the minimum amount of time to wait between pump events. This is to allow enough time for averaging of the OD to occur to determine if the OD dropped below the necessary threshold for the t-stat window, preventing over-dilutions.
MESSAGE
holds the fluidic message that will be sent to the server. The default length should be 48, only change this if you also change the value in conf.yml
on the server. By default, positions 0 - 15 correspond to the influx pump array, 16 - 31 to the efflux pump array, and 32-47 are for a third array if you have one installed or for any other connected fluidic devices (like solenoids for millifluidics).
ODSet
is the variable keeping track of what OD the algorithm should currently be targeting. Once the OD reaches the upper range, ODSet will be set to the lower range, which will trigger subsequent logic to dilute the vial to hit that lower target. Upon the OD reaching this target, it will set the OD to the upper limit again. See this forum post for more information.
One of the default custom_functions
provided, this function executes logic to perform a chemostat on the eVOLVER.
rate_config
refers to the flow rate for each vial, in volumes per hour. It should be a list of length equal to the number of vials (default 16).
start_OD
refers to the minimum OD required before starting the chemostat algorithm. Set to 0 to start at any positive OD.
start_time
refers to the minimum amount of time that needs to pass before starting the chemostat. Set to 0 to start immediately.
bolus
refers to the amount of liquid that will pump every pump event in mL. For example, a bolus of 0.5 means that eVOLVER will dilute 0.5 mL every pump event, evenly dispersed throughout the hour at a period that hits the desired V/h set by the rate_config
variable.
eVOLVER does not send a command every time one of the pumps needs to actuate for the c-stat! Instead, we send a single command that contains the periodicity and amount of time to run for each vial. This information is handled by the microcontroller. This minimzes the communications between the DPU, server, and microcontrollers and ensures accurate pump timings for each vial.
If you want to make your own custom function, write it in this file and set the OPERATION_MODE
variable at the top of the file to match your function name. Your function will be called every broadcast
by the EvolverNamespace
class in eVOLVER.py
.
Another customizable control board, the ADC board is designed to plug into the Motherboard and measure the signal from dozens of sensors in the system. The sensors currently integrated in each sleeve are simple and can be measured with basic voltage divider circuits. The sensor and resistor are placed in series, and the voltage across a resistor changes when the measurement from the sensor changes. The board reads this voltage and has two main roles: (1) remove noise from the signal through a low pass filter and (2) multiplex the signal from all 16 channels to one analog input pin on the Arduino. When the signal arrives at the input pin, the Arduino changes the analog signal to a digital signal via its own 12-bit ADC. Nature Biotechnology:
Please report any issues you come across in the appropriate Github repository and consider making a post on the forum!
OD is dependent on depth of LED in vial
Characterized on this forum post
Needs to be pushed to users
OD is dependent on vial position
Notched vial caps help align
Brandon has designed vial aligners
It is generally an unwritten rule to not move vials after experiment start, but this is sometimes impossible
Stirring affects OD
Tuning stirring too high can cause stir bars to chitter (stop turning and move around)
Because the stirred media forms a spout in the middle
Therefore inconsistent stirring can means more noise in OD reading
Also, less stirring = less optimal growth
Pump heads stop working
Causes overflows, poor reliability
Fixed by new pumps
Almost all evolvers have old pumps
New eVOLVER base susceptible to fluid damage
Vial overflows or spills get into chassis via ribbon cable ports, then short motherboard
Drainage system drips down the back of the eV and into chassis
Overflows finally leak onto bench and floor requiring serious cleanup
Old eVOLVER base susceptible to fluid damage
Fluids from vials drip onto pumps, destroying them
Description of how the Raspberry Pi eVOLVER server code functions.
This page aims to explain how the server on the Raspberry Pi functions. The repository can be found on Github.
The server acts as the brain for the physical eVOLVER unit - it manages all of the SAMD21 Arduino microcontrollers and communications from the user via the DPU or GUI interface.
In addition to managing communications between connected components and the user, it also stores and manages configuration and calibration data for a given eVOLVER. The RPi also can have other utilities run on it such as this monitor script, which can detect if the server gets hung up and restart it.
The two main python scripts for the server are evolver.py
and evolver_server.py
. The first, evolver.py
sets up the websockets server and get it running in it's own background thread so that in the main thread the server can communicate with the SAMD21 micro controllers continuously and send off data as needed. The main logic of the server lives in evolver_server.py
.
The timing of broadcasts is handled in evolver.py
, while all subsequent logic is handled in evolver_server.py
.
The server uses this file to notate what kinds of experimental parameters are connected, how they should be used, and configurations for running the server itself.
Read more about this file here.
You can modify this file manually (it is meant to be human readable), but be careful not to break the structure or the server will not run.
This file contains all calibrations for the eVOLVER. Calibrations have a generalized format, so theoretically you can calibrate any number or types of parameters and have the downstream DPU or GUI be able to fetch and use them.
The file is a list of dictionaries. Each item has a name, measured data (the values collected from a platereader or thermometer for example), the calibration type, and a key-value pair for raw and fits. Raw and fits both contain lists of raw data collection and fits, respectively. Fits has an element called coefficients which contains the fit parameters for whatever function was used, as well as the params that it needs.
The schema can be found on Github. To read more about the file, read here.
Don't confuse this file with calibration.json
- this is a legacy file that will be phased out soon.
Check this guide to view the serial communications in real time. This is a useful troubleshooting tool.
The RPi communicates to and from the SAMD21 microcontrollers via serial. The structure of the message :
<ADDRESS><MESSAGE_TYPE>,<VALUES>,<END_CHARACTER>
<ADDRESS>
is the address or name of the SAMD21. It allows all of the connected microcontrollers to decide if the message is for them.
<MESSAGE_TYPE>
is typically a single character designating how the message should be handled.
r: recurring message - sent every broadcast iteration on the RPi to ensure that the correct values are being maintained by the SAMD21 microcontrollers.
i: immediate command - sent when a one-off command is to be executed. Functionally handled the same on the SAMD21 microcontrollers. The server will not re-send these commands in a recurring manner (useful for something like a pump event).
e: echo response - Sent from the SAMD21 to the RPi as a way to acknowledge receipt of a command or message. The values should match what the server sent.
b: data response for broadcast - Sent from thhe SAMD21 to the RPi as a response to getting a recurring or immediate command if the SAMD21 has data to report (temp, OD). Values will contain raw ADC values typically.
a: acknowledge response - Sent from the RPi to the SAMD21, signalling that it has registered success of serial communications and signalling whatever previous command was sent to be executed.
<VALUES>
is a comma separated list of values either being sent to the SAMD21 as inputs to set an experimental condition level, or as raw ADC values from the SAMD21 to the RPi.
<END_CHARACTER>
is a way to denote the end of the message. For messages going to the SAMD21 from the RPi, this will be _!
. For messages going to the RPi from the SAMD21, this will be end
.
We use a communication structure similar to the TCP 3-way handshake.
The RPi will first send a message to the SAMD21 containing the desired values to be set (<MESSAGE_TYPE>
of i, or r).
The SAMD21 then needs to respond with a <MESSAGE_TYPE>
or b or e.
The RPi will respond with a <MESSAGE_TYPE>
of a (for acknowledge). When the SAMD21 receives this message it will execute the command from step 1.
This process is used in order for the server to have a way to know if commands are successfully being sent to the desired SAMD21. For each response from the SAMD21, the lengths of the <VALUES>
is checked to be consistent with what is in the server configuration file. The server also checks that messages it sends out conform to the proper length. If any anomalies or problems are detected, an EvolverSerialError
is thrown.
Failed commands will be communicated back to the DPU via websockets in a future version.
The eVOLVER server uses websockets via socketio to communicate with the DPU and GUI interfaces. Please see their documentation for more information on how websockets work. In brief, functions in the server are decorated with
to indicate that the function should be run when a given event occurs over the websocket. The function definition itself also needs the async
keyword in front of it (asyncronous).
To send out messages to connected clients (DPU/GUI), the server uses a socketio.AsyncServer
object sio
. For example, to send data to the clients:
where data is a dictionary (json) containing the data to send. Note that any function that calls the emit
function needs to have the keyword async
in it's definition. This also propogates up to all functions that call that function as well.
Be careful with the async/await keywords - read up on the socketio documentation if you want to write your own custom communication events. Improper usage of these keywords and functions can cause the server to hang up or not run at all.
From the forum:
In each experiment folder, you’ll find a number of different sub-folders and files. Here, I’ll describe the folders and files as of the dpu 1.0.1 version. If you are using a different version, your files and folders may be slightly different.
One important note is that not all folders are used in all experiment types. You can also create new folders to record other types of data for custom types of experiments (more on that in another post). These folders are created in initialize_exp() in evolver.py, if you want to see how that works.
Common Folders:
OD: contains .txt files where each row is [ timepoint (h) , OD ] using the calibration to transform photodiode readings to OD600 equivalents. It is updated every loop through the software (~20 secs).
OD90 (or OD135): contains .txt files where each row is [ timepoint (h) , raw photodiode value ] without transforming the data. This could be used to apply a different calibration after the experiment (e.g. if you started the experiment with the wrong calibration selected). It is updated every loop through the software (~20 secs).
temp: contains .txt files where each row is [ timepoint (h) , temperature ] using the calibration to transform thermistor readings to Celsius equivalents. It is updated every loop through the software (~20 secs).
temp_config: contains .txt files where each row is [ timepoint (h) , temperature target ] in Celsius. It is only updated when a new temperature command is sent from the custom_script, so it won’t have very many lines for most experiments.
Tubidostat Related Folders: These folders are only updated in turbidostat mode, and are not used for chemostat mode.
ODset: contains .txt files where each row is [ timepoint (h) , target OD ]. It is updated once when the upper OD threshold is reached (changes target to lower threshold), and once when the lower density threshold is reached (changes target to upper threshold). This makes it a good choice for segmenting turbidostat data into growth curves.
pump_log: contains .txt files where each row is [ timepoint (h) , pump time(s) ]. It is updated at every pump event, and generally records the amount of time the influx pump was turned on for, though in some older versions a bug caused the efflux pump time to be recorded instead.
Since it records when a pump event is sent to eVOLVER, the dilution won’t show up in the OD data right away, making it a poor choice to use to segment OD data into growth curves. Furthermore, if two dilutions are needed to reach a lower threshold (i.e. you switched out a bottle and there’s some air in the lines) pump log will be updated twice in short succession, complicating the process further.
Chemostat pump events do not get listed here, as they use a recurring function on the Arduino, to reduce the load of commands sent to eVOLVER. Pump commands sent from outside the DPU (i.e. from the Electron app or MATLAB script) also do not get recorded in pump_log files.
growthrate: contains .txt files where each row is [ timepoint (h) , growth rate (h^-1) ] using ODset to segment data and a linear fit to log transformed OD data. It is updated every time the upper OD threshold is reached.
The first growth rate measurement is fit on the data from the first timepoint to the first dilution, which means inoculation and lag phase can throw off this value.
You may want to calculate growth rate offline after the expt. The growth rate calculated here has been optimized for robustness over accuracy, in order to enable feedback control.
Chemostat Related Folders: These folders are only updated in chemostat mode, and are not used for turbidostat mode.
chemo_config: contains .txt files where each row is [ timepoint (h) , chemo_phase, period (s) ]. It is updated every time the chemostat dilution rates are changed. The second value can be used to keep track of updates if designing a custom chemostat experiment that changes or fluctuates between dilution rates. The third value is the period of time, in seconds, between pump events. Note that these pump events do not get recorded in pump_log.
Other Files: evolver.log: some versions of the DPU will store a log of things that happen during the experiment, like errors or verbal descriptions of certain commands (i.e. changes to chemostat rates). XX_cal.txt : some versions of the DPU will store .txt versions of the calibrations locally on your computer. EXP_NAME_DATE_TIME.txt: this is a .txt record of your custom script, created each time you restart an experiment. This way if you change the code partway through, you have a record of each iteration of the code.
This page aims to explain the general code structure for the Arduinos (SAMD21 mini-breakout boards) used in the eVOLVER. The repository can be found here.
Arduino provides guides about how to use their products - if you're new to Arduino programming we recommend starting there!
Three main libraries are used throughout the Arduino files to simplify the code structure and usability.
The evolver_si
(eVOLVER serial input) library handles parsing the serial information that comes from the RPi.
The PID_v1
library contains all the logic and calculations for PID control.
See the server code structure page for information on serial communications structure.
The Arduino code structure can be thought of in 3 sections: pre-setup, setup, and loop. The fluidics script is slightly different and will be explained separately, but it has the same basic structure.
This is everything before the setup
function. This is where we import header files and setup any global variables/constants.
Variables indicating the pins for controlling the 4-bit multiplexer for selecting which Smart Sleeve to communicate with, s0
, s1
, s2
, s3
, and SIG_PIN
. S0-3 are for selecting the channel, and SIG_PIN
is output of the mux. We use the ADC on the SAMD21 on pin 0.
inputString
holds incoming serial data from the RPi.
stringComplete
boolean stating if the string is "complete", meaning that a "!" character has been detected in the incoming serial data.
end_mark
is what the SAMD21 uses to denote the end of it's messages going out to the RPi - it is not what the SAMD21 is looking for as the end of an incoming message.
Serial communication variables notating what strings are used as commas, and the address
variable which is the identifier of the SAMD21 - ie, the SAMD21 will only act on data addressed to what is in this variable.
We initialize an evolver_si
object called in
which handles all serial input.
Three very important variables if PID is being used are Setpoint
, Output
, and Input
- these three double
arrays hold what value the PID should be trying to hit, what value is sent out to the actuation element (like a resistive heater), and what the current value being read from the ADC of that element is, respectively. These will be talked about more later.
After these variables are initialized, 16 PID objects are initialized (one for each Smart Sleeve) and put into an array.
The setup code runs one time when the system is turned on.
In this block we generally initialize the various pins of the SAMD21 for INPUT or OUTPUT and set pins to be digital LOW or HIGH. We also initialize the PWM if applicable and turn on the Serial
communications modules on the microcontroller. If PID is being used, we also set those for the proper range and modes.
This is the section of the script that is run continuously (on loop) over and over. The general logic is to read from the serial line, see if there are any messages to act on, read data from the Smart Sleeves if applicable, then update any elements that are being controlled for each Smart Sleeve.
If a message on serial is found, the script will save those values, send a message back to the RPi, and continue looping until it receives an ACK from the RPi addressed to it to act on the previously sent values. See the server code structure for more information on serial messages between the RPi and SAMD21s.
TODO: normalize the naming of functions.
This function reads from Serial1
and constructs a string in inputString
containing the data. When it detects the end of the message ("!") it will return. This string is then checked by the evolver_si
object in
to determine if the message is formatted appropriately and if the SAMD21 should act on it (ie addressed to it.)
This function sends out data via serial to the RPi.
It sets pin 12 to a digital HIGH first, which tells the RS-485 that it will be communicating out, then formats the output string containing all the data from the Smart Sleeves.
Then it will delay for 100 ms in order to allow enough time for pin 12 to actually flip and for the RS-485 chip to react before outputting serial data over Serial1
(the default Tx pin). Lastly it will flip pin 12 back to LOW, indicating it is done using the Serial bus.
This function updates the Setpoint
variable to the values from commands sent from the Rpi.
This function reads data from the Smart Sleeves through the multiplexer. It also handles any averaging for that data and updates the PID based on the readings.
It first creates an array for holding data from the vials, then calls a helper function readMux
passing the vial it wishes to get data from. Then it calculates the average for each vial, and sets the Input
for each accordingly. It will then call the Compute
function of the PIDs with the updated data and make a call to the Tlc
PWM chip to set the new value as decided by the PID controller.
the Tlc.update
function should only be called 1 time within a single loop
of the Arduino!! More information can be found in the Tlc datasheet.
Gets data from the multiplexer for a given channel and returns the value that is read off of the ADC.
First, it loops through each control pin (S0-3) and sets them appropriately to select the desired channel. Then, it reads off of the SIG_PIN
and returns that value.
The fluidics script follows the same basic structure as above, but has some special code for handling peristaltic pumps and IPP millifluidics.
In the pre-setup, there is an int
array called speedset
which contains two values for PWM OFF and ON, which are 4095 and 0 respectively by default.
The pump class is an object for keeping track of a single peristaltic pump. They get initialized with the address they are controlling, and have local variables keeping track of whether or not it is current running, how long it needs to pump, and chemostat periodicity information.
This function checks whether the pump needs to be turned on or off by checking the timing based on milliseconds since it began pumping. If it needs to turn off it sets the Tlc for it's given address and updates local variables.
If it is off and is in chemostat mode (pumpInterval
> 0), it checks wheter it is time to turn on and sets the Tlc appropriately.
Turns on a pump based on a passed command.
Sets the timeToPump
and pumpInterval
variables, then sets the Tlc accordingly.
IPPs pump by sequentially activating pneumatic valves, where the flow rate of the pump is correlated to the frequency at which the valves are actuated. Each IPP object keeps track of the 3 solenoids it needs to actuate to pump, as well as whether or not the pump is currently running.
Example of commands to use these:
IPP Usage: pumpi,<Hz>|<Pump number>|<IPP index>,...
To run 2 IPPs on address (0, 1, 2) and (3, 4, 5) after the normal 32 influx/efflux pumps:
Then acknowledge like normal.
To turn off IPPs, a command with 0 as Hz to the desired pump number. It can be in any address slot. You do not need to have an entry for each individual solenoid channel - just specificy the high level IPP pump index (the second value in the set of three between the pipes).
The initialization simply sets addresses of the solenoids.
This function is overloaded (ie two function stubs). If a long
holdTime is passed, it will change the frequency of the IPP without having to turn it off completely and reset it, useful for very slow pumps. If the pump is off, it will also turn it on. Otherwise, it will check the timing and state of the solenoids and update them accordingly.
For an IPP, sets up a given address to be solenoid 1, 2, or 3 of an IPP. The valves do not necessarily need to be sequential addresses, although it is normal to set things up this way (see example above).
In the setup, the pump objects are initialized. There are two potential layouts on the PCB, one where each address is just sequential, and another where the pump PCB has the pumps layed out a little differently and as such the address for Vial2 is not address 2. The initialization code should be commented out or modified for the given physical setup of the pump arrays.
In the loop, the way the serial commands are parsed is a little bit different from normal as chemostats and IPP commands use the pipe "|" character to denote more information for a given address.
As an example, in the command:
Addresses 0 and 16 are set as chemostats. The time to pump is the first number, and the pumping interval is the second. So address 0 will run for 2 seconds every 4 seconds, and address 16 will run for 3 seconds every 4 seconds.
Addresses 1 and 17 are set to run for 10 seconds and 15 seconds one time, respectively.
The Tlc.update()
function is only called a single time at the end of the loop! Do not call this function multiple times, it will cause things to not work.
Detailed description of the eVOLVER.py file.
This file is where the main
function resides for the experimental DPU code, ie it is the script that is run to carry out an experiment on eVOVLER.
To start an experiment on the command line, run the following command:
If you would like to see the help menu:
Which will bring up something similar to the following:
If an eVOLVER_parameters.json
file is present, eVOLVER will use this file for all t-stat/c-stat paremeters, including temp and stir. If not, it will default to the variable inside the script that the user can specify manually.
This file contains the lower level functions that deal with communications and carrying out commands that the user specifies in the custom_script
. Additionally, this file handles experiment initialization and data collection, setting up data directories, and doing data transformations based on calibrations.
When the script is ran, a connection is first established with the server, then the initialize_exp
function is run which creates all data directories and requests the active calibrations from the server. Active calibrations are calibrations with the active
field set to true
. There should be only 1 active calibration of a given type. Active calibrations are set via the GUI, but they can be set programatically (see the setactivecal event on the server).
The eVOLVER code then enters a infinite loop which does nothing except reset the socketio conection occasionally to prevent buildup of broadcast messages. Because the custom_functions
are tied to the broadcast
even to the server, the main thread does not need to do anything besides wait for server websocket events.
This is a socketio class responsible for handling communications with the server on the RPi. Each function beginning with on_
is called when the corresponding event occurs on the websocket connection. For example, if the connect
event occurs, the on_connect
function will run.
This class is also being used as the eVOLVER experiment class. TODO: Ideally this would be a second class and not be tacked onto the socketio class - it will be updated in a future version.
The start time and OD blank information is stored as a class variable. Additionally, all low level functions for interacting with the eVOLVER RPi are located here.
Upon receipt of a broadcast event and new data from the eVOLVER RPi, the on_broadcast
function is called. This will log the experiment time, do data transformations based on calibration data, save the resulting data, and then call the custom_functions
in custom_script.py
. This function is set within custom_script.py
.
Based on previous work26, optical density measurements in a bioreactor can be measured with a simple 900 nm infrared (IR) LED and photodiode pair. There are two practical benefits of using 900 nm scattered light instead of the classic OD600. First, at 900 nm, turbidity/optical density measurements are less dependent on the absorbance spectrum of the media, meaning calibration is required less frequently before each experiment. Second, wavelengths in the visible range are preserved for light induction and colorimetric assays. To maximize scattering, the LED-diode pair is offset at a 135° angle. The 3D printed part is designed to house the LEDNature Biotechnology: doi:10.1038/nbt.4151 16 diode pair slightly above the height of the stir bar, at the correct angular offset. The part can be easily customized and printed to the users required specifications with any 3D printer. In the eVOLVER configuration used in this study, the IR LED and photodiode pair (4 leads) are each connected to the CMB via screw terminals in SA slots 4 and 5, respectively (Supplementary Fig. 7). In SA slot 4, a 16-channel PWM board amplifies a 3.3V signal from the Arduino microcontroller to a 5V signal to power the IR LED. A resistor is placed on the CMB to limit current and prevent the LED from burning out. SA slot 5 contains the 16-channel ADC board, responsible for analog filtering and demultiplexing the signal from the photodiodes. The ADC board reads the sensor by measuring the voltage difference across a 1M Ohm resistor, located on the Motherboard. Both slots are managed by Arduino 3 in the system developed in this manuscript. Briefly, the Arduino code interprets serial inputs from the Raspberry Pi, flashes ON the IR LEDs to measure turbidity, and responds with the current measurements. In the present system, optical density can be measured every 30 seconds, limited by the time taken for the Arduino to average diode readings (to minimize noise). For convenience, density readings from the 900 nm LED-diode pair were calibrated to OD600 measurements from a spectrophotometer, and the calibration curve fit with a sigmoidal function (Supplementary Fig. 8). Spectrophotometer readings were performed on a Spectramax M5 using 300 uL of media in a 96-well flat bottom plate; users may substitute density calibration data from measurements used in their labs. The optical density measurements in all experiments are calculated based on the calibration curve fit for each Smart Sleeve (Supplementary Fig. 8). For our experiments, calibration was performed using a dilution series of yeast cells suspended in distilled water, but in theory any cell type and/or solution of interest (such as evaporated milk) could be used. A custom MATLAB script was developed to facilitate the density calibration process, particularly important for bringing new eVOLVER units on line. Following calibration, the system was used to compare growth of S. cerevisiae (FL100) cells in eVOLVER vials to that in 250 mL flasks with 50 mL of media shaken at 300 rpm (Supplementary Fig. 8). Finally, to quantify the variance in growth across eVOLVER vials, 96 cultures across six 16-vial eVOLVER units were grown in parallel and aligned (Supplementary Fig. 8). These results demonstrate that eVOLVER cultures are repeatable, and exhibit comparable growth rates to cultures in shaken flasks. As previously mentioned, varying temperature induces a shift in the optical density readings (Supplementary Fig. 6). In measurements performed on yeast cells, we observed the largest shift near the center of the optical density calibration curve, while at low or high OD, the shift due to temperature was minimized. This information was used to select a density range for experiments in which temperature was controlled dynamically (see Fig. 4). As cells may shift in size in response to heating, we also quantified temperature-induced offset in optical density readings using evaporated milk.
An overview of what happens in the software during a calibration
For GUI calibration guides see here.
Communication between the computer and the server is done via websockets.
For more about commands and microcontroller - server communication via serial see here.
GUI connects to the server via websockets
The user has the GUI sends a temperature off command: tempi,4095,4095,4095,4095,4095,4095,4095,4095,4095,4095,4095,4095,4095,4095,4095,4095,_!
The server passes this to the Arduinos and the temperature Arduino enacts that command
The server receives temperature data broadcast from the server
The user waits for temperatures to equilibrate in the vials
The user measures values from an independent temperature probe for each vial and records these in the GUI
The user has the GUI record 3 values at this temperature from the server
Steps 2 - 7 are repeated for two higher temperature values
When 3 values for 3 different temperatures have been collected, the GUI saves the raw sensor data and the temperature probe data on the server in calibrations.json
The GUI uses calibrate.py (guide here) to fit raw sensor data from the eVOLVER to experimental temperature probe values (in this case a linear regression)
calibrate.py uses websockets to fetch the sensor and experimental data from the server for a previously run calibration, then does the fit according to the users specifications
The GUI will automatically run this script upon completion of a calibration, but it is also possible to run manually via the command line to fetch .png files for the calibrations if desired.
The GUI adds the calibration fit values to calibrations.json
The user can now select this calibration as the active one via the GUI Setup page
High-level description of software architecture
All code is located in our Github Repositories:
eVOLVER Code (Raspberry Pi, Python)
Arduino/Microcontroller Code (C/C++)
Data Processing Unit (Python)
eVOLVER GUI (Node, JS, Electron, React)
Responsible for collecting data from sensors and actuating culture vial components. A single SAMD21 mini-breakout board is typically responsible for a single culture parameter. All of the SAMD21 boards are connected in parallel to a Serial RS-485 bus. They listen for commands from the Raspberry Pi and communicate only when the RPi asks them specifically for information.
All code is in C/C++.
The Raspberry Pi orchestrates the control of all connected components, keeps track of calibration data for those components, and serves as the interface between the hardware and any lab computers or users wanting to interact with the eVOLVER. It can communicate via a network and also interface with low-level hardware. It communicates with the connected Arduino's via Serial RS-485, and with users via a lab computer with websockets, typically over a local network (router).
The server is written in python.
This is where the logic for experiments happens. Users can program culture routines in python (DPU) that are carried out as commands sent to the RPi via websockets typically over a local network (router).
Additionally, users can use the electron GUI interface to send immediate one-off commands and see the current data being collected on the eVOLVER. The GUI is also used to carry out calibrations of connected components, mapping the currents and voltages that the sensors generate to real-world representation of what they are measuring like OD or temperature.
Lastly, the GUI is also capable of customizing and managing eVOLVER culture routine experiments, and can be used to view the data from current and past experiments.
The DPU code is all in python, and the GUI is written in Javascript using Electron and React.
The goal of this tutorial is to learn how to calibrate the temperature settings for each Smart Sleeve in a 16 vial eVOLVER setup
You must complete temperature calibrations before doing OD calibrations. Temperature affects OD and if there are big differences between vials, you will need to recalibrate all vials once you do a temperature calibration.
Why are temperature calibrations important?
Each microorganism has its own culture temperature requirement. Temperature may affect the successful cultivation and growth characteristics of the culture. By using a simple thermistor and heating resistor pair, we can track and change the culture temperature over time.
Why is calibration necessary?
Readings sent from the Raspberry Pi to the computer/server are the raw thermistor values measured by the Arduino. To make sense of the readings in terms of values we understand, we need a calibration file that converts this to degrees (celsius).
Do I need to redo temperature calibration if I switch out a thermistor/resistor pair?
Yes. Variability exists across the individual thermistor and heating resistor elements, necessitating a new temperature calibration anytime one of these parts are replaced. This is why the calibration curve is unique to each smart sleeve.
16 eVOLVER vials filled with 15mL water
Glass vials - 40mL (Chemglass, CG-4902-08)
Thermometer with probes
Do not use a thermocouple-based thermometer, as the magnetic field from the stir components can interfere with measurements
eVOLVER Electron GUI
This tutorial is for the newest version of the eVOLVER Electron App (Release 2.0.1), which enables both data visualization between each temperature calibration step (RT -> +10C -> +20C), as well as GUI-enabled calibration (without use of the command line).
For older versions of the Electron GUI (Release v1.2.1 and earlier), additional notes are provided at the bottom to successfully complete the calibration - the process remains largely the same, apart from the use of the command line to complete the calibration.
eVOLVER
Temperature Equilibrium
Generally, there are two independent methods to determine if the vial water has reached temperature equilibrium.
Place the thermometer probes into the water, clear the "Min/Max" readings, and wait until the reads no longer fluctuates within ~2min of monitoring.
The eVOLVER Electron GUI has an in-built function that displays the change in thermistor value from the last read, shown as a (+/-) value in brackets next to the current thermistor value being read. The GUI uses this information to determine whether the vials have equilibrated across time, shown as an orange circle indicator around each vial circle on the GUI that should turn fully orange upon equilibration.
Importantly, sometimes the vials will not display the achievement of equilibrium correctly. Please use your discretion with respect to the time elapsed under heat, lack of temperature fluctuations, similarity of temperature measured by thermometer across vials, and the GUI equilibrium function to determine when equilibrium has been reached.
Turn on the eVOLVER 5V power supply. Wait 5 seconds. Turn on the eVOLVER 12V power supply.
Open up the eVOLVER Electron GUI app, and ensure you are connected to the correct eVOLVER you wish to calibrate in the upper-right hand corner of the "Home Screen". The circle should be solid green, indicating that the eVOLVER is connected.
Tap "Setup" in the GUI home screen, select all vials by tapping "Select All" in the bottom right corner. The vial circles should highlight orange. Tap the "Next ->" button in the upper right-hand box (which includes all the control parameters) until you reach the "Temperature" tab. Drag the slider all the way down to "20C". Tap the button, and the "Executed Commands" box in the lower right should indicate that a temp command was sent to all vials.
Place all the eVOLVER vials, pre-filled with 15mL of water, into the Smart Sleeves.
Go back to the "Home Screen", click "Calibrations" and then "Temp" in the eVOLVER Electron App.
Name the calibration, hit enter, and then click "Start Temperature Calibration". A prompt will read "Heaters turned off. Let equilibrate, then enter values."
Room Temperature: Wait ~30 minutes for the temperature of the water to equilibrate to ambient room temperature (and heat generated by the eVOLVER).
Once equilibrated, measure the temperature of each vial with the thermometer probe and log the temperature measurements in Celsius in the Electron GUI.
The newest version of the eVOLVER Electron App (Release 2.0.1) enables data visualization between each temperature calibration step (RT -> +10C -> +20C). This is especially useful when verifying that the thermistor reads are as expected, and follows an inverse linear relationship between thermistor value and temperature.
Wait 60-120 minutes for the temperature of the water to equilibrate. Use the system outlined in the section "Temperature Equilibrium" to establish when the temperature has equilibrated.
Wait ~2-3hrs, or leave overnight.
Calibrate: An edit icon button should appear once all 3 measurements have been made. Click on the button, and a graph of the linear calibration curves for all thermistors across the smart sleeves should appear. Please confirm that the curves look linear. If everything looks good, please exit out of the graph (press the backwards arrow twice), and voila! You have completed your Temperature Calibration! Please be sure to change the temperature calibration file to the most recent in the eVOLVER set-up menu (click on the temperature calibration button).
IF In-GUI Calibration Fails (Unexpected Javascript/Python Error)
If after clicking on the "Edit" button upon completion of all 3 measurements, the eVOLVER GUI encounters an unexpected Javascript/Python error, do not fret! The raw calibration data is now saved on the Raspberry Pi, so you just need to continue along to the info note below to run the calibration through the command line. Feel free to exit the calibration at this point - your collected data is safe.
For older versions of the eVOLVER electron GUI (Release v1.2.1 and earlier)
If you are using an older version of the eVOLVER electron GUI (< v2.0.0), an additional step on the command line/terminal is required to linearly fit the acquired calibration data and set-up the temperature calibration. Additionally, there have been instances where unexpected code errors arise, necessitating calibration through command line. You can also still manually run a calibration if you would like to change calibration settings.
Open up a terminal, and navigate to the eVOLVER dpu folder (github link for download). List the raw calibration files on the eVOLVER Pi using:
For Windows, use py instead of python for all commands.
Now that you have the name of the temperature calibration file, manually run the calibration file:
A figure will pop up displaying the linear temperature calibration curves for each vial. If all looks good (inverse linear relationship between thermistor and temperature values - please see above figure for an example of a successful temperature calibration), then exit out of the figure. A prompt on the command line will ask if you would like to update the eVOLVER to the new temperature calibration. Press and enter "y", and voila, you are all done with temperature calibration.
The goal of this tutorial is to learn how to efficiently generate OD calibration curves for each Smart Sleeve in a 16 vial eVOLVER setup.
You must complete temperature calibrations before doing OD. Temperature effects OD and if there are big differences between vials, you will need to recalibrate all vials once you do a temperature calibration.
Why are OD measurements important?
The turbidity (cloudiness) of the culture typically correlates to how many cells are in a culture. By using a simple LED and photodiode pair, we can quantify how many cells are in the population, track how the culture is growing over time, and observe the culture changing over the course of the experiment.
Why is calibration necessary?
Readings sent from the Raspberry Pi to the computer/server are the raw voltage values measured by the Arduino in the Motherboard. In other words, to make sense of what these readings are, we need a calibration file that converts this to a useable optical density measurement.
Is calibration different between different organisms?
Yes. Cells with different size and shapes scatter differently and would result in unique calibration curves. eVOLVER is set up such that one could easily use the appropriate calibration files for each experiment/organism.
Is calibration different between different temperatures?
Yes. Temperature effects the photodiode sensors that we use to measure OD. If you plan to use different temperatures we suggest doing a new calibration for each one.
Always calibrate OD with the light blocker / splash guard on to block ambient light. Recommendation: check the OD troubleshooting page for other things that can effect OD readings.
16 assembled glass vials:
Glass vials (Chemglass, CG-4902-08)
Vial screw caps
Octagon magnetic stir bars (Fisher, 14-513-57)
300 mL of saturated culture of desired organism
If calibrating to ODs above 1.5, you may need more cells
300 mL of 1X PBS (Phosphage Buffered Saline)
Check your Smart Sleeves with a vial containing water vs a culture of an arbitrary OD to make sure that you see some change in the Setup page of the GUI. Otherwise you will need to change the photodiode or OD LED.
Before preparing standards, turn eVOLVER on and set all vials to the temperature you will use this calibration at (ie 37C for E coli and 30C for yeast) and set stirring to 8.
Wash cells and resuspend in 1X PBS to avoid cell growth
Spin down saturated cultures in 50mL or 250mL centrifuge tubes.
2500 rcf for 5 minutes should be fine for bacteria or yeast
Pour off media and resuspend cells in 50mL 1X PBS
Spin down cells in a 50mL conical tube
Resuspend well in 50mL 1X PBS
Find OD of Concentrated Cell Stock and Make Standards
The cell stock will likely be much too dense to measure undiluted. For example, OD600 absorbance values on our plate reader above about 0.5 are inaccurate and we can expect this stock to be above an OD of 4.
Measure the OD of cell stock using a dilution series
Dilute 200uL of cells into 1800uL of 1X PBS (1:10)
Dilute the 1mL of the 1:10 dilution into 1mL 1X PBS (1:20)
Make 1:40 and 1:80 dilutions
Measure OD of dilutions and a 1X PBS blank
It is recommended to use 300uL of dilution if using plate reader to provide a similar read length to the cuvette
Use absorbance at 600nm for most bacteria and yeast
If the measured OD of the lowest dilution is above 0.5, make further dilutions to bring it below 0.5
Use this spreadsheet to make calculations. Make a copy on your own Google Drive or download for use in Excel.
Calculate OD of concentrated cell stock
Input ODs for dilution and 1X PBS blank into the spreadsheet
Enter calculated OD into 'OD of Cell Stock'
Use a dilution that is roughly between 0.1 and 0.5
Calculate and make OD standards
Optional: alter the series of standards to include more ODs in the range you care about
Get 16 vials and add a stir bar to each
Add calculated amount of 1X PBS and cell stock to each vial
Mix by swirling or putting in eVOLVER with stirring on
Measure OD of Standards
Make dilutions for standards above 0.5 OD
Use a 96-well plate to ease dilutions and transfer to plate reader
Measure ODs and calculate original OD from dilution OD
An example calculation, including the 1X PBS blank is included at the bottom of the spreadsheet
Adjust standards if necessary
Cap vials containing standards and place in eVOLVER to equilibrate to temperature while stirring
Keep track of which vial is which OD
This may take >30 minutes
Each vial is labelled with its latest temperature in the SETUP
page of the GUI
Don't immediately throw out your standards after finishing calibration! You could need to make another calibration should one or more vials be off.
On the eVOLVER app home screen, make sure you are connected to your eVOLVER (green symbol next to active eVOLVER), then choose CALIBRATIONS
and then O.D.
Give the calibration a name (a standard suggestion is YYMMDD_YourInitials_od
) and click enter.
Click on the white box by the S0
. The display should now have an overlay with Sample 0
on top of a box with a keypad. Input the OD values of each sample.
You can input the OD values using the keyboard, then hit enter to increase the vial selected.
Click Start OD Calibration ▷
.
Press ▷
. After the eVOLVER has logged the vials in one configuration, click the forward arrow. Move vials into their new positions, as seen on the right side of the GUI.
Click VIEW COLLECTED DATA
to monitor the smoothness of the curves as you calibrate. If a particular value is a big outlier, consider rewinding to that vial position and doing it again. Don't worry your other work will be saved!
Continue until all sixteen sets of values have been saved for each standard in each vial.
Click the pen button to submit and save the calibration. Then click Exit
after the calibration is logged.
To validate the calibration was logged on the eVOLVER, from the touch screen home tap Setup
and then tap the box next to OD:
and a list of calibrations should come up. Select your recent one from the list. If not present, it was not logged to the eVOLVER.
Before doing an experiment it is recommended to further validate your calibration (after you have selected it on the SETUP
page) by starting an experiment and logging a few values for each vial at a known OD.
Fill a large beaker with water and submerge all of the pump lines (inputs and outputs of the pumps), ensuring all of the ends are below the surface of the water.
2. Run the pumps on the Setup page to completely fill the lines with water (about 20s)
3. Place 16 vials into a rack and place the output ends of the pumps to be calibrated into the vials.
It's best practice to not put the vials into the eVOLVER platform in case you make a mistake and overflow the vials. Keep the rack to the side.
4. Select the eVOLVER on the top of the GUI home page to be calibrated
5. Navigate to the Pump Calibration page
6. Enter a name for the pump calibration
7. Select the pump configuration for the eVOLVER. In a standard setup, IN1
are the media in pumps, and E
refers to the efflux pumps. If you have another pump array (for a second media input source), it is typically going to be in IN2
. Click Start Pump Calibration
. The standard pumps are the FAST
pumps (~1 mL/s, black pump heads). If you have the slow flow rate pumps (~ 1 ml/m, pink pump heads), select the SLOW
radio button for that array.
IN1
refers to address 0-15, E
refers to addresses 16-31, and IN2
refers to addresses 32-47. If you have a different pump array setup you can either calibrate manually by putting a json fit object into the calibrations.json
file on the RPi server, or reach out on the forum to ask for assistance.
8. Select all of the vials either by clicking the button on the bottom right or clicking and dragging across the vials on the selector. Click PUMP IN
(or whatever the pump array you are calibrating) to run the pumps for 10s if the FAST
radio button was selected or 100s if the SLOW
radio button was selected.
The time the pumps will run will be noted in the bottom right of the screen. If you need to stop the pumps early, click FORCE STOP ALL
.
9. After the pumps finish pumping, measure how much water was pumped by pouring out the water from each vial into a 25 mL graduated cylinder (or something similar). Enter this number into the box for each vial. The flow rate will appear on the vial selector on the right side of the screen.
Round to the nearest half graduation. The minimum resolution cylinder we recommend for typical eVOLVER pumps should have 0.5 mL graduations.
10. Repeat this process for each pump array you have selected for calibration.
11. Click the pen button to submit and save the calibration. Then click Exit
after the calibration is logged.
12. Verify the calibration appears on the setup page.
Press the "RT " button and wait for the eVOLVER to measure the thermistor values (the eVOLVER measures the thermistor values continuously for a minute, with an orange ring appearing around the button. Once complete, the GUI should display "1/3 Measurements made"
Room Temperature +10C: Once complete, click the " +10C ->" button, and then click the "RT +10C ". The GUI should display "Temperature set. Let equilibrate, then enter values."
Once equilibrated, measure the temperature of each vial with the thermometer probe and log the temperature measurements in Celsius in the Electron GUI. Press the "RT +10C " button and wait for the eVOLVER to measure the thermistor values. Once complete, the GUI should display "2/3 measurements made"
Room Temperature +20C: Once complete, click the " +20C ->" button, and then click the "RT +20C ". The GUI should display "Temperature set. Let equilibrate, then enter values."
Once equilibrated, measure the temperature of each vial with the thermometer probe and log the temperature measurements in Celsius in the Electron GUI. Press the "RT +20C " button and wait for the eVOLVER to measure the thermistor values. Once complete, the GUI should display "3/3 measurements made"
Additional tip: if you see strange raw OD values after swapping out LEDs or photodiodes, it's possible you have the positive and negative ends switched.
Process and considerations for running a growth curve.
When setting up eVOLVER for the first time, we recommend performing a simple growth curve as a starting experiment. The growth curve algorithm functions similar to the turbidostat algorithm, except the feedback between any experimental parameters are turned OFF (or deleted in the code). That way, you won't have to worry about any leaks or overflow issues from pumps misbehaving while testing the system.
The growth curve algorithm tests the following before running a more intensive experiment:
Continuous communication from the eVOLVER to the DPU (lab computer)
Power settings appropriately set on the lab computer (e.g. sleep settings)
OD calibration during an actively growing culture
Stirring stability
Detection of any noisy from ambient light
Temperature stability
What the growth curve experiment does NOT test:
Pump actuation and calibrations
Media line setup and sterility
There are just two scripts that you need to run eVOLVER (eVOLVER.py
and custom_script.py
).
eVOLVER.py
generally contains most of the infrastructural code to communicate with eVOLVER and interpret raw data coming from the system. Basic users should not need to modify this file.
custom_script.py
includes several basic functions (growth curve, chemostat, and turbidostat) but is where the user should customize/ write their own scripts.
For those of you familiar with Python, I highly encourage reading through the scripts (>1000 lines of code) after this tutorial. Let's quickly walk through custom_script.py before we talk about any of the experimental setup.
For those familiar with coding and Python, the first few lines in the script is for importing libraries and logging files.
The next part of the code goes through inital settings one would want the eVOLVER to start at. These are sent at the start of the experiment when the script is initiated. Please refer to our API for examples on how to modulate the settings mid experiment.
There are initial three parameters in this eVOLVER script that defined: temperature, stir, and what mode this script will run.
Each position in the array corresponds to the vial it is updating (e.g. first position is typically called via an index of 0 in Python and thus is updating vial 0). For example, if one would want to set the temperature for Vials 0 - 3 to 37C but the rest to 30C, the array would look like the following:
If one wanted to run a turbidostat script instead of the growth curve script, one would replace the OPERATION_MODE variable:
If you wrote a custom modality named "new_super_cool_script", you would define it as a function and call it in a similar way. For example:
You would define it as the following:
Let's skip the turbidostat and chemostat scripts for now (for another lesson) and jump straight till the end of the script. The following is just to indicate that the user should not be running this script from the command line
That's all the code you need to run the growth curve!
For this experiment, we will need:
Autoclaved vials (with stir bar and caps)
Sterile growth media
Fill autoclaved vials with 30 mL of sterile media and place in eVOLVER Smart Sleeves.
Set the desired temperature for the eVOLVER (using the GUI) to preheat the vials
Wait for ~30 minutes
Start experiment using the Command Line Start Guide or GUI Start Guide
Spike in cells (1 mL of saturated culture) and watch the OD spike on the traces.
Let the cells grow until saturated.
OD traces are noisy in bursts of ~10 - 12 hours:
This is most likely noise from light during the working hours of the day. Try placing a box over the system to block out ambient light. If works better, than try making a shield for the eVOLVER
OD readings are really noisy/ don't make much sense:
Verify that the stir vortex is not interferring with the OD sensors. This might happen if low volume is used (~20 mL) or stir settings are too high. A good way to debug this is to turn off stirring manually (via 12 V switch) and see if the measurement is better. NOTE: Toggling 12V switch will turn off STIR and TEMP.
Switch out the LED and or photodiode
All measurements stop after a few hours:
Check computer power saving settings. Make sure the system does not go to sleep.