From cfab292bfe1d73d092e652a3c8068ff39bec9142 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Mon, 25 Nov 2024 15:26:32 +0000 Subject: [PATCH] Deploy https://github.com/PlanktoScope/PlanktoScope/commit/e5776a1be994d44b4f71e27664898a45217935ec --- .../social/reference/software/changelog.png | Bin 41307 -> 0 bytes .../social/reference/software/product-specs.png | Bin 0 -> 51084 bytes site/search/search_index.json | 2 +- site/setup/hardware/v2.6/index.html | 2 +- site/sitemap.xml.gz | Bin 578 -> 578 bytes 5 files changed, 2 insertions(+), 2 deletions(-) diff --git a/site/assets/images/social/reference/software/changelog.png b/site/assets/images/social/reference/software/changelog.png index 99f3efa67bedf0d8fed37a3fcba01dd9cd269691..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 100644 GIT binary patch literal 0 HcmV?d00001 literal 41307 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

{v0ydmL5#5s%0p$r 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 J372m^_z%fQ3FH6( literal 0 HcmV?d00001 diff --git a/site/search/search_index.json b/site/search/search_index.json index a80e317..0a30bed 100644 --- a/site/search/search_index.json +++ b/site/search/search_index.json @@ -1 +1 @@ -{"config":{"lang":["en"],"separator":"[\\s\\-]+","pipeline":["stopWordFilter"]},"docs":[{"location":"","title":"PlanktoScope Documentation","text":"

Welcome to the documentation for the PlanktoScope project! Here are some quick links to help you navigate the documentation depending on what you what you want to do:

  1. \"I want to get a PlanktoScope!\"
  2. \"I want to learn how to operate a PlanktoScope!\"
  3. \"I want to fix something which isn't working on my PlanktoScope!\"
  4. \"I want to get involved in the PlanktoScope community!\"
  5. \"I want to study the design of the PlanktoScope!\"
"},{"location":"#what-is-planktoscope","title":"What is PlanktoScope?","text":"

Plankton are living things which drift with the water currents in our world's oceans, rivers, and lakes. Lots of plankton are very small - so small that we need tools called microscopes in order for us to see them. One type of plankton is phytoplankton: plant-like plankton which take a huge amount of carbon dioxide from the air and become the food for all other life in the water - like the grasses of the sea. Because of this, plankton are very important to the health of our planet.

But there\u2019s still a lot we don\u2019t know about what\u2019s happening with groups of plankton and how they\u2019re changing: most tools would be too hard and expensive for us to use to get much detail about how every group of plankton is changing across an entire ocean. If we can make tools which give detailed information and which everyone can use - everywhere, all the time - then we can learn more about how the oceans will change because of things people and companies are doing.

The PlanktoScope is a low-cost, open-source, and portable microscope designed to take detailed photos of tiny plankton from lots of water, so that we can count the different kinds of plankton in the water.

"},{"location":"#what-is-the-planktoscope-project","title":"What is the PlanktoScope project?","text":"

The PlanktoScope project is a community project to develop the PlanktoScope as a tool and to help people use it for a variety of purposes around the world. It is part of a broader movement toward making scientific tools more accessible and affordable, while also empowering citizen scientists, educators, and researchers to study and monitor aquatic ecosystems.

"},{"location":"#who-are-planktoscopes-for","title":"Who are PlanktoScopes for?","text":"

We want the PlanktoScope to be a tool which is easy to use for anyone who's interested in the tiny things which live in our oceans, and for anyone who cares about the health of our oceans - not just scientists, but also sailors, marine farmers, makers, fishing communities, and students. However, we still need to make many improvements to the PlanktoScope in order to reach this goal. Most of the people who currently enjoy using PlanktoScopes have some experience with using microscopes, a tolerance for handling software problems, and a sense of adventure for trying out new technologies which are still in development.

We also want PlanktoScopes to be easy to use for people around the world. Currently, the PlanktoScope software's user interface and documentation are all in English; we will need software and translation help to support other languages. The PlanktoScope community mainly works in English, though we also have active community members whose primary languages are French and Japanese.

We are excited about the possibility of using PlanktoScopes for measuring things besides plankton - for example, counting and identifying microplastics, or monitoring suspended cell cultures, or even detecting parasites in certain diseases. However, we have not yet developed or assessed the PlanktoScope as a tool which people could use for these other purposes.

If you want to help to improve the PlanktoScope, to build a PlanktoScope community in a non-English language, or to explore new uses for PlanktoScopes, please get involved in our global community!

"},{"location":"faq/","title":"Frequently Asked Questions","text":"

This FAQ has been compiled to answer common questions about the PlanktoScope project and how you can get involved. We hope you find it useful and we look forward to working with you to advance our knowledge of the oceans!

"},{"location":"faq/#can-i-purchase-a-planktoscope","title":"Can I purchase a PlanktoScope?","text":"

You can purchase a PlanktoScope - either as a kit of parts to assemble yourself or as a fully preassembled device - from a small business called FairScope, which was started by the inventor of the PlanktoScope in order to make PlanktoScopes easier to obtain. For more information, please refer to our page on how to obtain a PlanktoScope.

"},{"location":"faq/#where-do-i-get-support-or-find-the-necessary-tools-to-build-planktoscope","title":"Where do I get support or find the necessary tools to build PlanktoScope?","text":"

To find the necessary tools and knowledge to produce the PlanktoScope, consider visiting a Fablab or Hackspaces in your region. These organizations often have a culture of openness and may be willing to support you with your project.

And if you have specific questions or problems, you can always report them in the Slack Channel and in the best case you will find someone there who can support you.

"},{"location":"community/","title":"The PlanktoScope Community","text":"

PlanktoScope is a completely open platform. The core of the PlanktoScope project is a basis in an evolving network of designers and users collaborating to increase the impact and availability of the tools. Building a community of users will enable PlanktoScope to grow with capabilities not yet imagined.

For around $800, and with parts freely available in most parts of the globe, any person with the desire to engage can begin building a PlanktoScope. This website contains the information needed to assemble, test, and begin collecting data on your PlanktoScope.

"},{"location":"community/#engage-on-github","title":"Engage on GitHub","text":"

Feel free to visit the GitHub and engage if you want.

GitHub is a web-based platform that is widely used in the PlanktoScope Community for version control and collaboration. It allows members to easily share, track, and manage code and other project files. The platform is built around the Git version control system, which allows multiple contributors to work on the same codebase simultaneously while keeping a record of every change made.

In the PlanktoScope Community, members can use GitHub to collaborate on the development of the Planktoscope project. They created a central repository where they can share and track the code, documentation, and other project files.

"},{"location":"community/#chat-on-slack","title":"Chat on Slack","text":"

The community is using Slack to communicate.

Slack is a communication and collaboration tool that is widely used in the PlanktoScope Community. It allows members to communicate and work together in real-time, providing a central hub for all conversations related to Planktoscope project. The platform offers features such as direct messaging, group channels, video conferencing, and file sharing, making it easy for members to stay informed and on the same page.

The PlanktoScope community has created a dedicated Slack workspace for the community members to share their findings, ask for help, and discuss project-related topics.

"},{"location":"community/#classify-on-ecotaxa","title":"Classify on EcoTaxa","text":"

To join EcoTaxa, you just need to create an account.

EcoTaxa is a web-based platform that enables researchers, educators, and citizen scientists to identify, classify and share images of microorganisms. The platform is designed to support biodiversity research and education by providing a user-friendly interface for browsing and analyzing images of microorganisms, as well as a collaborative environment for sharing images and data. EcoTaxa allows users to upload their own images, and the platform's machine learning algorithms can automatically identify and classify the organisms in the images.

The platform also offers a variety of tools for analyzing and visualizing data, including image annotation, statistical analysis, and data export. Additionally, EcoTaxa has a community feature where researchers can share their findings, and have a discussion on the data, and contribute to the knowledge base. Overall, EcoTaxa is a valuable resource for anyone interested in microorganism biodiversity research and education.

"},{"location":"community/code-of-conduct/","title":"Contributor Covenant Code of Conduct","text":""},{"location":"community/code-of-conduct/#our-pledge","title":"Our Pledge","text":"

We as members, contributors, and leaders pledge to make participation in our community a harassment-free experience for everyone, regardless of age, body size, visible or invisible disability, ethnicity, sex characteristics, gender identity and expression, level of experience, education, socio-economic status, nationality, personal appearance, race, caste, color, religion, or sexual identity and orientation.

We pledge to act and interact in ways that contribute to an open, welcoming, diverse, inclusive, and healthy community.

"},{"location":"community/code-of-conduct/#our-standards","title":"Our Standards","text":"

Examples of behavior that contributes to a positive environment for our community include:

  • Demonstrating empathy and kindness toward other people
  • Being respectful of differing opinions, viewpoints, and experiences
  • Giving and gracefully accepting constructive feedback
  • Accepting responsibility and apologizing to those affected by our mistakes, and learning from the experience
  • Focusing on what is best not just for us as individuals, but for the overall community

Examples of unacceptable behavior include:

  • The use of sexualized language or imagery, and sexual attention or advances of any kind
  • Trolling, insulting or derogatory comments, and personal or political attacks
  • Public or private harassment
  • Publishing others' private information, such as a physical or email address, without their explicit permission
  • Other conduct which could reasonably be considered inappropriate in a professional setting
"},{"location":"community/code-of-conduct/#enforcement-responsibilities","title":"Enforcement Responsibilities","text":"

Community leaders are responsible for clarifying and enforcing our standards of acceptable behavior and will take appropriate and fair corrective action in response to any behavior that they deem inappropriate, threatening, offensive, or harmful.

Community leaders have the right and responsibility to remove, edit, or reject comments, commits, code, wiki edits, issues, and other contributions that are not aligned to this Code of Conduct, and will communicate reasons for moderation decisions when appropriate.

"},{"location":"community/code-of-conduct/#scope","title":"Scope","text":"

This Code of Conduct applies within all community spaces, and also applies when an individual is officially representing the community in public spaces. Examples of representing our community include using an official e-mail address, posting via an official social media account, or acting as an appointed representative at an online or offline event.

"},{"location":"community/code-of-conduct/#enforcement","title":"Enforcement","text":"

Instances of abusive, harassing, or otherwise unacceptable behavior may be reported to the community leaders responsible for enforcement at < thibaut at fairscope.com > . All complaints will be reviewed and investigated promptly and fairly.

All community leaders are obligated to respect the privacy and security of the reporter of any incident.

"},{"location":"community/code-of-conduct/#enforcement-guidelines","title":"Enforcement Guidelines","text":"

Community leaders will follow these Community Impact Guidelines in determining the consequences for any action they deem in violation of this Code of Conduct:

"},{"location":"community/code-of-conduct/#1-correction","title":"1. Correction","text":"

Community Impact: Use of inappropriate language or other behavior deemed unprofessional or unwelcome in the community.

Consequence: A private, written warning from community leaders, providing clarity around the nature of the violation and an explanation of why the behavior was inappropriate. A public apology may be requested.

"},{"location":"community/code-of-conduct/#2-warning","title":"2. Warning","text":"

Community Impact: A violation through a single incident or series of actions.

Consequence: A warning with consequences for continued behavior. No interaction with the people involved, including unsolicited interaction with those enforcing the Code of Conduct, for a specified period of time. This includes avoiding interactions in community spaces as well as external channels like social media. Violating these terms may lead to a temporary or permanent ban.

"},{"location":"community/code-of-conduct/#3-temporary-ban","title":"3. Temporary Ban","text":"

Community Impact: A serious violation of community standards, including sustained inappropriate behavior.

Consequence: A temporary ban from any sort of interaction or public communication with the community for a specified period of time. No public or private interaction with the people involved, including unsolicited interaction with those enforcing the Code of Conduct, is allowed during this period. Violating these terms may lead to a permanent ban.

"},{"location":"community/code-of-conduct/#4-permanent-ban","title":"4. Permanent Ban","text":"

Community Impact: Demonstrating a pattern of violation of community standards, including sustained inappropriate behavior, harassment of an individual, or aggression toward or disparagement of classes of individuals.

Consequence: A permanent ban from any sort of public interaction within the community.

"},{"location":"community/code-of-conduct/#attribution","title":"Attribution","text":"

This Code of Conduct is adapted from the Contributor Covenant, version 2.1, available at https://www.contributor-covenant.org/version/2/1/code_of_conduct.html.

Community Impact Guidelines were inspired by Mozilla's code of conduct enforcement ladder.

For answers to common questions about this code of conduct, see the FAQ at https://www.contributor-covenant.org/faq. Translations are available at https://www.contributor-covenant.org/translations.

"},{"location":"community/license/","title":"Our work is fully open source","text":"

That's the headline, yes.

"},{"location":"community/license/#hardware-files","title":"Hardware files","text":"

We released our hardware files (everything in the hardware directory) under a CERN OHL-S license.

"},{"location":"community/license/#software-source","title":"Software source","text":"

Our source code (everything in the directories flows and scripts) is released under a GPL-3.0 license.

"},{"location":"community/license/#everything-else-documentation-pictures-etc","title":"Everything else (documentation, pictures, etc...)","text":"

Everything else is released under a Creative Commons CC-BY-SA license.

"},{"location":"community/trainings/","title":"Trainings","text":"

The success of the PlanktoScope community depends on the people who generously share their knowledge and expertise about its production and use with others, helping to promote its widespread adoption and use. By actively participating in the community and sharing their insights and experiences, individuals can contribute to the growth and success of the PlanktoScope, ultimately benefiting not just the community but also the broader field of study.

"},{"location":"community/trainings/#the-train-the-trainer-program","title":"The Train the trainer program","text":"

The train the trainer program is a training program designed to equip individuals with the knowledge and skills needed to deliver training to others. The goal of a train the trainer program is to build capacity within the PlanktoScope community by volunteers to become trainers themselves.

This guide is intended to provide you with a solid foundation of knowledge and understanding about the PlanktoScope, enabling you to confidently develop and deliver your own training program for others. Whether you are an experienced user looking to share your expertise with others or a newcomer to the PlanktoScope looking to learn more about its capabilities and applications, this guide is designed to help you gain the necessary skills and knowledge to successfully teach others about this powerful tool.

"},{"location":"community/trainings/#event-types","title":"Event types","text":""},{"location":"community/trainings/#build-workshop","title":"Build workshop","text":"

Organizing a build workshop can be a challenging but rewarding experience. It requires careful planning and execution to ensure that the workshop is successful. This trainer manual is designed to guide you through the process of organizing a build workshop.

"},{"location":"community/trainings/#selecting-the-production-site","title":"Selecting the production site","text":"

Choosing the right production site for preparing and manufacturing the PlanktoScope Kits is an important step in the workshop planning process. The production site should have the necessary tools and equipment, as well as the knowledge and expertise to manufacture the PlanktoScope Kits. Here are a few things to consider when choosing a production site:

  1. Check the Manufacturing and Assembly Guides: Before choosing a production site, make sure to review the PlanktoScope Kit Manufacturing Guide and the Device Assembly Guide. These guides will provide detailed information on the necessary tools and equipment required for the production of the PlanktoScope Kits.
  2. Visit Fablab and Hackspaces: Consider visiting Fablabs or Hackspaces in your region. These organizations often have a culture of openness and may be willing to support you with your project. They may have the necessary tools and equipment to produce the PlanktoScope Kits, as well as the knowledge and expertise to guide you through the production process.
  3. Commercial Manufacturing: Look for a facility that has the capability to handle small scale production runs, a good quality control process and a logistic plan to ship the product to the final destination. Many

Tip

For the PlanktoScope case, for example, you can look for woodworking companies. They often have a CNC machine and are familiar with the process of ditigal production.

"},{"location":"community/trainings/#material-procurement","title":"Material procurement","text":"

Building a PlanktoScope requires a specific set of materials. In order to ensure that the workshop runs smoothly and that all attendees are able to successfully build their own PlanktoScope, it is important to properly plan and execute the procurement of materials. The following is a step-by-step guide on how to properly plan and execute the procurement of materials for a workshop:

  1. Prepare the order list: Use the bill of materials (BOM) as a starting point to create a comprehensive list of all materials needed for the workshop. Expand it with additional columns for suppliers, delivery dates, prices, shipping costs, and import taxes.
  2. Plan for packaging: Plan for extra packaging so you can assemble the parts as shown in the instructions. Try to minimize plastic as much as possible.
  3. Research suppliers: Research suppliers and see if there are local options, if you can consolidate orders to save costs and ensure timely delivery.
  4. Compare prices: Compare the prices of different suppliers to minimize the total cost.
  5. Plan for spare parts: Plan for spare parts in case something is broken or lost.
  6. Check your Budget: Check your budget and ensure that you have enough funds to cover the cost of all materials, shipping, and any additional expenses before placing your orders.
  7. Place orders: Once you have identified the best suppliers, place orders for all of the materials that you need. Be sure to factor in lead time when placing orders to ensure that the materials will arrive in time for the workshop.
  8. Track orders: Keep track of your orders and expected delivery dates, mark a component when it arrives. Contact suppliers if there are any delays or problems with delivery.
  9. Communicate: Communicate with participants if there are issues with timely delivery. It may make sense to postpone the workshop if there is not enough time to prepare and test everything. The participants will be grateful and will understand if it helps to ensure that everything runs smoothly.

By following this process, you can ensure that all materials are procured and organized well in advance of the workshop, to avoid any last-minute delays or complications.

Note

If you have difficulty finding the components you need, contact us and we will be happy to help you find the right alternative.

Warning

Have a backup plan and be prepared for unexpected events that may occur during the procurement process. Allow two months for delivery, as some specialty parts may travel a long way and require additional time for customs inspection.

Tip

Let us know your results, we would love to hear what solutions you found and how cost effective you were able to make the PlanktoScope.

"},{"location":"community/trainings/#prepare-the-kit","title":"Prepare the Kit","text":"

Kit preparation for the workshop is an important step in the preparation process. This ensures that participants have the materials and equipment they need to complete the workshop and build their own PlanktoScope. Here are a few things to keep in mind when preparing the kits:

  1. Review the Bill of Materials (BOM): Review the Bill of Materials (BOM) for the PlanktoScope to ensure that you have all the necessary parts and materials for the workshop. The parts list can be found in the Device Assembly Guide and lists all components and quantities needed to build a microscope.
  2. Divide the kit components according to the BOM: Once the materials have been received, divide the kit components from the orders according to the Bill of Materials (BOM) of the PlanktoScope. This will ensure that each participant receives the correct components and that there are no missing parts.
  3. Have extra components: Have extra components on hand in case of any missing or damaged parts during the workshop.
  4. Package the kits: Package the kits in a way that makes it easy for the participants to find and use the components during the workshop.
  5. Label materials: Label the packages as described in Device Assembly Guide so that they are easy to find and distribute during the workshop.
  6. Preparation of the housing parts: Prepare the housing parts by applying the surface sealant and insert the nuts to screw the housing as described in the Kit Manufacturing Guide.
  7. Cutting and soldering of electronic cables: Cut and solder the electronic cables for the PlanktoScope. This will save time during the workshop and ensure that the participants have all the necessary cables to complete the assembly.
  8. Setting up the embedded development environment: Set up the embedded development environment and flash the eeprom of the PlanktoScope hat. This will ensure that the PlanktoScope hat is ready to be used during the workshop.
  9. Download the Raspberry Pi image: Download the Raspberry Pi image and flash it to the SD card. This will ensure that the participants have a ready to use image for the PlanktoScope.
  10. Test the kits: Test the kits before the workshop to ensure that all components are working correctly and that the instructions are clear and easy to follow. This will help to ensure that the participants have a positive and productive experience during the workshop.

Tip

Identify any items that are time consuming during the workshop and not particularly important or complex to explain. These tasks can be completed in advance to save time during the workshop. This will make it easier for the participants to assemble the PlanktoScope during the workshop.

"},{"location":"community/trainings/#conducting-the-workshop","title":"Conducting the workshop","text":"

It's finally here! After all the planning, preparation, and anticipation, the build workshop is about to begin. Take a deep breath and let's go!

  1. Prepare the presentation: Prepare the presentation device and start your slides.
  2. Check-In: Once the Participants arrive, complete the check-in, share the agenda and set expectations for the workshop.
  3. Venue: Provide information about the venue, including where to find restrooms and where to buy food.
  4. Digital tools: Provide information about the digital tools that will be used during the workshop, such as the platform for collaboration, the survey tool and the chat channel, and how to access them.
  5. Data privacy: Inform about the privacy policy and the forms that need to be signed by the participants if you want to take photos.
  6. Introduction round: Begin with a round of introductions and give everyone a chance to introduce themselves, their background, and their interest in the project.
  7. Provide an overview: Provide details about the project, including the general mode of operation, the working materials such as the kit, the documentation and the git repository.
  8. Provide the Kits and Tools: Provide the Kit and Tools to each participant with a kit and the necessary tools.
  9. Follow the build instructions: Depending on the format you have chosen, start implementing by following the Kit Manufacturing guide or Device Assembly guide
  10. Follow the operation instructions: Now that you have successfully assembled the PlanktoScope, you can proceed to operation of the PlanktoScope by following the Getting started and User interface instructions.
  11. Final Test: For a final test you can use for example pure cultures or a sample taken with a Plankton net from a surrounding waters.
"},{"location":"community/trainings/#field-trip","title":"Field trip","text":"

Are you an expert in organizing field trips? Share your skills with the PlanktoScope community by documenting the process! By documenting how you organize a field trip, you can help others create successful events and bring more event options to the PlanktoScope community. Your documentation will be a valuable resource for anyone looking to plan a field trip, and it will also help to grow and strengthen the PlanktoScope community. Don't miss this opportunity to contribute to the community, start documenting your process today!

"},{"location":"community/trainings/#hackathon","title":"Hackathon","text":"

Are you a master at organizing Hackathons? Share your knowledge with the PlanktoScope community by documenting the process! By documenting how you organize a Hackathon, you can help others create successful events and bring more event options to the PlanktoScope community. Your documentation will be a valuable resource for anyone looking to host a Hackathon, and it will also help to grow and strengthen the PlanktoScope community. Don't miss this opportunity to contribute to the community, start documenting your process today!

"},{"location":"community/trainings/#general-planning-methods","title":"General planning methods","text":"

Organizing a workshop can be a challenging but rewarding experience. It requires careful planning and execution to ensure that the workshop is successful. This trainer module is designed to guide you through the process of organizing any type of event.

By following the guidelines, you will be able to plan a workshop that is engaging, productive, and successful. It will also help you to create a sense of community among participants and will help them continue their learning after the workshop.

"},{"location":"community/trainings/#building-a-team","title":"Building a team","text":"

Every project needs a team to support it. The team should be composed of individuals with a diverse set of skills and experiences to ensure all aspects of the workshop are effectively covered.

  1. Identify the roles and responsibilities: Determine the key areas that need to be covered during the workshop and assign specific roles to team members. For example, one team member may be responsible for organizing logistics, while another may be responsible for creating the agenda.
  2. Assemble the team: Once the roles and responsibilities have been identified, begin assembling the team. Consider individuals with relevant skills and experiences, as well as those who have a passion for the topic of the workshop. It is also important to have a mix of team members from different departments or backgrounds to bring a variety of perspectives to the planning process.
  3. Communicate effectively: Establish clear lines of communication within the team to ensure that everyone is on the same page. This can be done through regular meetings, email, or a team collaboration platform.
  4. Encourage participation: Encourage team members to actively participate in the planning process by sharing their ideas and feedback. This will help to ensure that everyone feels invested in the success of the workshop.
  5. Appoint a leader: Appoint a leader for the team who will be responsible for coordinating the planning process and ensuring that the team stays on track. The leader should be someone who is organized, a good communicator, and able to delegate tasks effectively.
"},{"location":"community/trainings/#communication-channels","title":"Communication channels","text":"

Choosing the right communication channels is an important step in the planning process for a workshop, as it is crucial not only for the organizing team but also for the participants during and after the workshop. The right communication channels can help to build a fluent community, improve collaboration and keep everyone informed and on the same page.

  1. Choose the right channels: Once the needs have been identified, choose the communication channels that will best serve those needs. Email, chat, and video conferencing are all popular options. If the group is small, a group chat or email chain may be sufficient. If the group is larger or more dispersed, a video conferencing platform may be more appropriate.
  2. Make sure they are accessible: Ensure that the communication channels you choose are accessible to all participants. This may include providing training or support for those who are less familiar with the tools you are using.
  3. Communicate expectations: Clearly communicate the expectations for using the communication channels to the participants. This includes guidelines for how often and when to check the channels, as well as how to respond to messages.
  4. Continuity: Make sure that you have continuity in the communication channels after the workshop. This will help to build a fluent community and to keep the participants connected and engaged. Use the same channels to share updates and resources, or to organize follow-up events or activities.

Note

Email is a reliable and widely-used communication channel that can be used for sending out workshop updates, sending materials, and answering questions. It is also a good option for sending out reminders and follow-up information after the workshop.

Note

Chat networks, such as Matrix, are a great option for secure, real-time and decentralized communication during the workshop. They allow participants to ask questions, share resources and collaborate on projects in real-time. They can also be used for group discussions and as a platform for sharing feedback. Additionally, chat platforms can be used as a platform for post-workshop communication and to build a fluent community.

Tip

If you need assistance with creating a Chat for your workshop, please let us know. We can easily set up new subchannels within our PlanktoScope Slack channel to support communication and collaboration during your workshop. This will also help facilitate the exchange of information within the community.

"},{"location":"community/trainings/#selecting-digital-tools","title":"Selecting digital tools","text":"

The right tools can help to facilitate communication, collaboration, and organization, making the workshop experience more productive and enjoyable for everyone.

  1. Use web-based tools: Whenever possible, use web-based tools that can be accessed from any device with an internet connection. This will make it easier for participants to access and use the tools, regardless of their location or device.
  2. Use collaborative note-taking tools: You might use web-based tools like HedgeDoc that allow participants to collaboratively collect notes during the workshop. This can help to ensure that everyone has access to the same information, and can help to make the workshop experience more productive and enjoyable for everyone.
  3. Use survey tools: You might use survey tools like LimeSurvey to gather information about the participants' needs and expectations for the workshop. This can help to ensure that the workshop is relevant, valuable, and effective for them.
  4. Use ticketing tools: You might use tools like Pretix to manage ticketing for the workshop. This can help to simplify the registration process, and can also provide valuable information about the attendees.
"},{"location":"community/trainings/#find-your-audience","title":"Find your audience","text":"

If you already have an audience for your workshop, that's fantastic. But it's also a good idea to let others know about your plans and potentially expand your audience. Contact nongovernmental organizations, universities, and research institutions in your area to see if they would be interested in participating in or even helping to organize the workshop.

Tip

One way to get in touch with others who are interested in PlanktoScope is to join our Slack Channel. We can support you by sharing contacts of individuals and organizations who have expressed an interest in PlanktoScope.

"},{"location":"community/trainings/#determining-the-need","title":"Determining the need","text":"

Understanding the needs of the participants will help to ensure that the workshop is relevant, valuable, and effective for them. Here are a few things to consider when determining the needs of the participants:

  1. Surveys and questionnaires: Use surveys and questionnaires to gather information about the participants' needs and expectations for the workshop. This can include their level of experience and knowledge, their specific interests and goals, and any challenges or concerns they may have.
  2. Pre-workshop consultation: Schedule pre-workshop consultations with the participants to discuss their needs and expectations in more detail. This can help to identify any specific areas of interest or concern, and can also provide an opportunity to address any questions or concerns the participants may have.
  3. Audience analysis: Analyze the characteristics of the audience, such as their profession, level of education and experience, and any other relevant details. This will give you a better idea of the type of content that will be most relevant and useful for the participants.
  4. Feedback: Ask for feedback from participants after the workshop and take it into account when planning future workshops. This feedback can be used to improve the overall experience and to tailor the workshop to better meet the needs of the participants.
"},{"location":"community/trainings/#defining-the-goals","title":"Defining the goals","text":"

Defining the goals of a workshop is an essential step in the planning process. The goals will serve as the foundation for the workshop, guiding the content and activities that are included.

  1. Number of participants: The workshop should be designed for a specific number of participants. Depending on the available resources, the number of participants can range from small groups of 4-8 people to larger groups of 8-12 people.
  2. Number of microscopes: The goal of the workshop is to build a specific number of PlanktoScope Microscopes. It is important to have the necessary materials and tools for each participant to build their own microscope.
  3. Content: The workshop will include both theoretical and practical content. The theoretical content will cover the principles of open-source hardware and software and the specific design of the PlanktoScope Microscope. The practical content will focus on the assembly and usage of the microscope, including hands-on experience with soldering and other techniques.

Tip

Depending on the time, resources, and audience, it is important to carefully decide what activities and tasks should be done during the workshop and what should be prepared upfront. This will ensure that the workshop runs smoothly and efficiently, and that the participants are able to fully engage and participate in the activities. Additionally, by carefully planning and preparing upfront, you can minimize the chances of overwhelming attendees with problems or difficulties that may arise during the workshop.

"},{"location":"community/trainings/#financial-planning","title":"Financial planning","text":"

The cost of materials, equipment, and other expenses can add up quickly, so it is important to have a plan in place to secure funding. Here are a few things to consider when planning the finances for your workshop:

  1. Decide on the cost of the kits: One of the first things to consider is whether you want to offer the kits for sale to the participants or if you want them to purchase the kits themselves. If you choose to offer the kits for sale, you will need to factor in the cost of materials and other expenses, such as shipping and handling. If you choose to have the participants purchase the kits themselves, you will need to provide them with information on where to purchase the kits and the estimated cost.
  2. Check for funding opportunities: There may be organizations or foundations that would be willing to support your workshop financially. It's a good idea to research potential sources of funding such as grants, sponsorships, and crowdfunding campaigns. Additionally, look for local or regional organizations that are working in the same field as your workshop, they might be interested in supporting your initiative.
  3. Reach out to potential sponsors: Once you have identified potential sources of funding, reach out to them to inquire about their funding opportunities. Be prepared to provide them with information about the workshop, including the goals, objectives, and expected outcomes. Be sure to include information about the open-source nature of the project, as this may make it more attractive to organizations with an interest in open-source technology.
  4. Look for cost-saving options: In addition to securing funding, there are also ways to save money on expenses. Consider renting equipment or space rather than purchasing it. Reach out to local universities or community organizations to see if they have equipment or space that you can use for the workshop at a reduced cost or for free.

Tip

If you are organizing the workshop as an individual, consider running the project through a non-profit organization to facilitate the collection of donations. This will also help to ensure transparency and accountability for the funding received. Alternatively, you can choose a commercially active organization that can provide proper accounting and financial management for the workshop participants. This will provide a clear financial record and can help to ensure that the workshop is run in a professional and organized manner.

"},{"location":"community/trainings/#creating-a-timetable","title":"Creating a timetable","text":"

Creating a schedule for a workshop is an important step in the planning process. A well-organized schedule will help to ensure that the workshop runs smoothly and that all the important topics are covered. Here are a few things to consider when creating a schedule for your workshop:

  1. Plan for more than just a day: A workshop may take more than one day to complete, so be sure to plan accordingly. Consider the amount of time required to cover all the topics, and allocate enough time for each one.
  2. Assign an expected duration to each item on the schedule: Assign an expected duration to each item on the schedule so that participants know how much time they should expect to spend on each topic. This will also help you to ensure that you have allocated enough time for each topic.
  3. Allocate time for breaks and activities: Make sure to allocate time for breaks, meals and other activities such as group discussions, teamwork, or hands-on activities. This will help to keep the participants engaged and energized throughout the workshop.
  4. Plan for contingencies: Include some flexibility in the schedule to allow for unexpected events or delays. This will help to ensure that the workshop stays on track even if things don't go exactly as planned.
"},{"location":"community/trainings/#venue-selection","title":"Venue selection","text":"

The location should be convenient and accessible for the participants, and should be equipped with the necessary resources to make the workshop a success. Here are a few things to consider when choosing a workshop location for a workshop on building an open-source PlanktoScope microscope:

  1. Reach out to Universities, research institutions, Fablabs, Hackspaces or non-profit organizations: Reach out to organizations that might have an interest in the PlanktoScope, and a community that might support you with free access to their location.
  2. Check the equipment: Make sure the location is equipped with the necessary resources such as a whiteboard, projector/TV, and other equipment that may be required for the workshop.
  3. Check the accessibility: Check the accessibility of the location with the public transport system and parking availability.
  4. Check for food provision: Consider if there is a possibility to go shopping or how to provide food for the course participants during the workshop.
  5. Check the environment: Consider the environment of the location, make sure it is comfortable, has enough space and is well-ventilated for the workshop.
"},{"location":"community/trainings/#announcing-the-event","title":"Announcing the event","text":"

When announcing the event, it is important to include the following information:

  1. Date: Provide a specific date, start and end time for the workshop, and ensure there is enough lead time for preparation, including ordering or manufacturing materials and coordinating with suppliers. Allow ample time between announcing the workshop and the actual event.
  2. Goal: Clearly communicate the specific goal of the workshop, such as to build a fully functional planktoscope and learn how to use it.
  3. What attendees will learn in the workshop: Clearly outline the specific skills or knowledge that will be covered in the workshop, such as how to assemble the kit, soldering the through-hole components of the controller, and working with the software.
  4. Instructor's background: Provide some notes about the instructor's qualifications or experience that make them well-suited to lead the workshop, such as experience working with planktoscope.
  5. Target audience: Clearly indicate the target group of the workshop, such as researchers, engineers or designers.
  6. Previous knowledge: Specify any previous knowledge required for the workshop, such as soldering skills or experience working with open-source hardware and software.
  7. Implementation method: Describe the form of the workshop, such as a step-by-step guide.
  8. Documentation: Consider sharing the documentation beforehand, so they can familiarize themselves with the process.
  9. Cost: Clearly communicate the cost of the workshop.
  10. Schedule: Provide a clear and detailed schedule of the workshop, including the duration of the workshop, for example, one day of building and one day of using the plankoscope.
  11. Location: Provide the location of the workshop, including information on how to get there with public transportation or Arrival by car and parking. Also, provide a link to a map service
  12. Registration: Details of the registration process, including information on where to obtain a ticket and any deadlines for registration.
  13. Contact details: Additionally, it may be helpful to include contact information for any questions.
  14. Images: Include some visually appealing images, such as from a previous workshop or field trip, to show what attendees can expect from the event. This can additionally be a great way to build anticipation and excitement, thus motivating more people to attend the workshop.
  15. Media: Post your offer on a website or social media platform that is relevant to the workshop topic and your target audience. This way you can increase visibility and reach a wider audience, which increases the chances of getting more attendees.

Tip

If you already have a group of interested people, send a link to the announcement via email or chat and invite them personally.

"},{"location":"community/trainings/#preparing-a-presentation","title":"Preparing a presentation","text":"

Preparing a presentation for a build workshop is an important step in the preparation process. It helps to ensure that the participants have the information they need to complete the workshop and understand the concepts behind building the Planktoscope.

  1. Gather resources: Gather resources such as images, videos, and diagrams that can be used to support the presentation. These resources can be found on the Planktoscope website or other sources.
  2. Outline the main topics: Outline the main topics that will be covered during the workshop, such as the components of the microscope, the assembly process, and the use of the microscope.
  3. Prepare a handout: Prepare a handout or a guide that the participants can use during the workshop to follow the steps, and have it ready to be printed or shared digitally
  4. Practice the presentation: Practice the presentation several times before the workshop to ensure that it runs smoothly and that you are comfortable with the material.
  5. Be ready to adapt: Be ready to adapt the presentation during the workshop to fit the needs of the participants.

Here are some topics that should be covered in a presentation:

  1. Event: Provide an overview of the event, including the goal of the workshop.
  2. Schedule: Provide an timetable for the event, including breaks, start and end times, and any planned activities for the next day.
  3. Venue: Provide information about the venue, including where to find restrooms and where to buy food.
  4. Instructor: Provide information about the instructor, including his or her background, and how to get in touch with him or her
  5. Digital tools: Provide information about the digital tools that will be used during the workshop, such as the platform for collaboration, the survey tool and the chat channel, and how to access them
  6. Data privacy: Provide information about the data privacy policy and the forms that need to be signed by the participants.
  7. Follow-ups: Point out follow-up actions such as the survey and that participation can be very helpful in improving the offer.
  8. Communication: Inform about the communication channels that will be used during the workshop and complete the onboarding.
  9. Introduction round: A round of introductions at the beginning of a workshop helps to create a sense of community and connection among the participants, allows the instructor to tailor the workshop to the group's needs, addresses potential language barriers, creates a sense of accountability, and helps participants to be more focused and relaxed.
  10. About the project: Provide details about the project, including the working materials such as the kit, the documentation, and the git repository.
"},{"location":"community/trainings/#send-an-final-reminder","title":"Send an final Reminder","text":"

Make sure participants are well informed and can find their way to you by sending a final reminder before the start so everything is well prepared.

  1. Schedule for the event: Include a detailed schedule for the event, including breaks, start and end times, and any planned activities for the next day. This will help participants to plan their time and make the most of the workshop.
  2. About the venue: Provide detailed information about the venue, including the address, public transportation options, and parking situation. Make sure to include any specific instructions or requirements for accessing the venue.
  3. About the documentation: Provide a link to the documentation, such as the assembly and manufacturing guide, that the participants can familiarize themselves with before the workshop. This will help them to be better prepared and make the most of the workshop.
  4. Cancellation policy: Remind the participants that now is the last opportunity to cancel their registration. This will allow other individuals on the waiting list to attend the workshop.
  5. Final Instructions: Provide any final instructions or important information that the participants should be aware of before the workshop.
"},{"location":"community/trainings/#documenting-the-event","title":"Documenting the event","text":"

Documenting a PlanktoScope workshop through photography is essential for several reasons. Photos can be used to showcase the workshop activities and the learning process of the participants. This can be useful for sharing information about the workshop with others, and for promoting future workshops.

  1. Equipment: Make sure you have the necessary equipment to document the event, including a camera (DSLR or mirrorless camera), lenses, memory cards, and batteries.
  2. Backup: Always make sure to have a backup plan for your equipment and photos, such as bringing extra memory cards and batteries.
  3. Lighting: Take into account the lighting conditions and make sure to have the right settings for your camera to capture the best possible images.
  4. Planning: Plan out the photos you want to take, taking into account the theme, location and schedule of the event.
  5. Composition: Pay attention to the composition of your photos and make sure to use techniques such as the rule of thirds and leading lines to create visually appealing images.
  6. Capturing candid moments: In addition to capturing posed shots, make sure to capture candid moments that capture the atmosphere and emotions of the event.
  7. Post-processing: Once the event is over, review and edit your photos to make them look their best.
  8. Data Privacy and Opt-Out: Pay attention to the privacy policy and get participants' consent before taking photos of them. Offer an opt-out option for participants who do not want to have photos taken. Clearly communicate what the photos will be used for and by whom, for example, to enhance this documentation.
  9. License: If your participants have agreed to share and use the photos, choose an appropriate license under which to license the photos. We recommend the Creative Commons license. For more information, see the project's license terms page.
  10. Sharing on Social Media: Share the photos on social media platforms to create a visual memory of the event and increase the visibility of the event.

By preparing and taking care of these things, you can ensure that you are able to document the event effectively and create a visual record of the event that can be shared and enjoyed for years to come.

"},{"location":"community/trainings/#follow-up","title":"Follow-up","text":"

Follow-up activities are an essential part of the workshop planning process. They help to ensure that the workshop's objectives are met and that the participants leave the workshop with a sense of accomplishment. Here are a few things to consider when planning follow-up activities after an event like a workshop:

  1. Follow-up with participants: Send out a survey or contact participants individually to gather feedback on their experience during the workshop. This feedback can be used to improve future workshops and address any issues that may have arisen.
  2. Share resources and information: Share any relevant resources such as presentations, handouts, or any other materials that will help the participants continue their learning after the workshop.
  3. Build a community: Encourage participants to connect and share their experiences with each other. This can be done through online forums, social media groups, or other platforms. Building a community of enthusiasts and collaborators will help to ensure that the workshop's goals and objectives are met and that the participants leave the workshop with a sense of accomplishment.
  4. Continual learning: Provide additional training opportunities or resources for participants to continue their learning after the workshop. This could be through follow-up workshops, webinars, or online tutorials.
  5. Track progress: Keep track of the progress of the participants, check if they are applying what they learned during the workshop and give feedback to help them improve.
"},{"location":"community/trainings/#improve-this-training-program","title":"Improve this training program","text":"

As with any training program, there is always room for improvement. To ensure that this program continues to meet the needs of its attendees, it is important to actively seek feedback and make changes as necessary.

Here are a few ways to improve this training program:

  1. Gather feedback: Regularly gather feedback from attendees, instructors and other stakeholders to understand how the program is being received and identify areas for improvement.
  2. Review and revise content: Review the content of the program and make changes as necessary to ensure that it is up-to-date, accurate, and relevant to the attendees.
  3. Continuously update the material: Continuously update the material, adding new information and best practices as it becomes available.
  4. Use different learning methods: Use different learning methods to accommodate different learning styles, such as hands-on activities, group discussions, and online resources.
  5. Encourage participation: Encourage participation and collaboration among attendees, creating an interactive and dynamic learning experience.
  6. Use modern technologies: Use modern technologies to enhance the learning experience, such as virtual reality, gamification, and AI-based learning.
  7. Assess the impact: Assess the impact of the program on the attendees and make changes as necessary to ensure that the program is achieving its intended goals.

For more information on how to contribute to this document and improve this training program, please see the contribute section on Writing Documentation.

"},{"location":"community/contribute/documentation/","title":"Writing Documentation","text":"

The source files are in the main github repository, in the docs folder.

They are simple Markdown files, that you can edit in any text editor of your choice.

The local development and test is made using mkdocs. This allows you to test your documentation changes for styling issues and see what it will look like once rendered.

hatch run docs:serve\n

After installing mkdocs, you can use mkdocs serve in the main folder of this repository to start the development server.

If you want to include pictures and diagrams in the documentation, please set the pictures in a dedicated folder to the name of the page you are creating (for example, if your page is named expert_setup.md, please put all the related pictures in the docs/expert_setup/ folder). Each picture should be named with a simple yet descriptive name, using jpg or png format if possible. Try to limit the size of the file by limiting the resolution to what is necessary for the picture to be clear on screen.

Contributions should be made by creating pull requests on Github directly.

"},{"location":"community/contribute/documentation/#extensions-available","title":"Extensions available","text":"

In addition to the common markdown syntax, several extensions are activated. If you want more information on any of them, please follow the linked guides.

  • SmartyPants: Converts ASCII dashes, quotes and ellipses to their HTML entity equivalents.
  • Sane Lists: Alters the behavior of the Markdown List syntax to be less surprising.
  • Admonition: Adds rST-style admonitions to Markdown documents.
  • Table of contents: Generates a Table of Contents from a Markdown document and adds it into the resulting HTML document.
  • Metadata: Adds a syntax for defining meta-data about a document.
  • Tables: Adds the ability to create tables in Markdown documents.
  • Fenced Code Blocks: Adds a secondary way to define code blocks.
"},{"location":"community/contribute/github/","title":"Contributing","text":"

First of all, thank you for contributing to the PlanktoScope! The goal of this document is to provide everything you need to know in order to contribute to PlanktoScope.

There are several ways to join the development effort, share your progress with your build or just ask for help.

We are using slack as a communication platform between interested parties. You can request to join by filling this form.

This repository is also a good way to get involved. Please fill in an issue if you witnessed a bug in the software or hardware. If you are able, you can also join the development effort. Look through the issues opened and choose one that piques your interest. Let us know you want to work on it in the comments, we may even be able to guide your beginnings around the code.

"},{"location":"community/contribute/github/#assumptions","title":"Assumptions","text":"
  1. You're familiar with git and the Merge Request(PR) workflow.
  2. **You've read the PlanktoScope documentation.
  3. You know about the PlanktoScope community on Slack. Please use this for help.
"},{"location":"community/contribute/github/#how-to-contribute","title":"How to Contribute","text":"
  1. Make sure that the contribution you want to make is explained or detailed in a GitHub issue! Find an existing issue or open a new one.
  2. Once done, fork the PlanktoScope repository in your Github account. Ask a mastertainer if you want your issue to be checked before making a PR.
  3. Create a new Git branch.
  4. Review the Development Workflow section that describes the steps to mastertain the repository.
  5. Make the changes on your branch.
  6. Submit the branch as a PR pointing to the master branch of the master fabcity-os-core-chart repository. A mastertainer should comment and/or review your Pull Request within a few days. Although depending on the circumstances, it may take longer. We do not enforce a naming convention for the PRs, but please use something descriptive of your changes, having in mind that the title of your PR will be automatically added to the next release changelog.
"},{"location":"community/contribute/github/#git-guidelines","title":"Git Guidelines","text":""},{"location":"community/contribute/github/#git-branches","title":"Git Branches","text":"

All changes must be made in a branch and submitted as PR. We do not enforce any branch naming style, but please use something descriptive of your changes.

"},{"location":"community/contribute/github/#git-commits","title":"Git Commits","text":"

As minimal requirements, your commit message should:

  • be capitalized
  • not finish by a dot or any other punctuation character (!,?)
  • start with a verb so that we can read your commit message this way: \"This commit will ...\", where \"...\" is the commit message. e.g.: \"Fix the home page button\" or \"Add more tests for create_index method\"

We don't follow any other convention, but if you want to use one, we recommend this one.

"},{"location":"community/contribute/github/#pull-requests","title":"Pull Requests","text":"

Some notes on PRs:

  • Convert your PR as a draft if your changes are a work in progress: no one will review it until you pass your PR as ready for review. The draft PR can be very useful if you want to show that you are working on something and make your work visible.
  • The branch related to the PR must be up-to-date with master before merging. Fortunately, this project integrates a bot to automatically enforce this requirement without the PR author having to do it manually.
  • All PRs must be reviewed and approved by at least one mastertainer.
  • The PR title should be accurate and descriptive of the changes. The title of the PR will be indeed automatically added to the next release changelogs.
"},{"location":"community/contribute/github/#release-process-for-internal-team-only","title":"Release Process (for internal team only)","text":"

PlanktoScope tools follow the Semantic Versioning Convention.

"},{"location":"community/contribute/github/#automation-to-rebase-and-merge-the-prs","title":"Automation to Rebase and Merge the PRs","text":"

This project integrates a bot that helps us manage pull requests merging. Read more about this.

"},{"location":"community/contribute/github/#how-to-publish-the-release","title":"How to Publish the Release","text":"

\u26a0\ufe0f Before doing anything, make sure you got through the guide about Releasing an Integration.

\u26a0\ufe0f Every PR that is merged to master introducing changes to the PlanktoScope needs to modify the file ``, by increasing the version of the chart accordingly.

Every PR that is merged to master triggers the automated release process, as specified at ``. A GitHub Action will be triggered and publish a new release on the GitHub repository releases. This will enable users to start using the new version of the chart immediately after publishing.

Thank you again for reading this through, we can not wait to begin to work with you if you made your way through this contributing guide \u2764\ufe0f

"},{"location":"community/contribute/hardware/","title":"Hardware Development","text":""},{"location":"community/contribute/hardware/#planktoscope-case","title":"PlanktoScope Case","text":"

As a hardware engineer working on the PlanktoScope Case, you will be using Autodesk Fusion 360 for the development of the case design. Fusion 360 is a comprehensive computer-aided design (CAD) software that allows you to create and analyze complex 3D models, perform simulations and stress tests, and collaborate with team members in real-time.

To get started with the project, you will need to install a development environment on your computer. Here are the steps to follow:

  • Download and install Fusion 360 from the Autodesk website.
  • Create a free Autodesk account and log in to Fusion 360.
  • Join the PlanktoScope Case team in Fusion 360. This will give you access to all of the project files and allow you to collaborate with other team members.
  • Familiarize yourself with the Fusion 360 interface and tools. There are many resources available online, including tutorials and user guides, to help you get up to speed.
  • Start designing and testing your case components in Fusion 360. You can use the software to create 3D models, run simulations and stress tests, and collaborate with other team members in real-time.

By following these steps, you will be able to successfully install a development environment and participate in the PlanktoScope Case using Autodesk Fusion 360.

"},{"location":"community/contribute/hardware/#planktoscope-hat","title":"PlanktoScope Hat","text":"

As a hardware engineer working on the PlanktoScope Hat, you will be using Autodesk Eagle to design and develop the electronic components of the hat. Autodesk Eagle is a powerful and widely used software platform for designing and laying out printed circuit boards (PCBs).

To participate in the project, you will need to install a development environment on your computer that includes Autodesk Eagle and any other necessary tools and libraries. Here are the steps you can follow to set up your development environment:

  • Download and install Autodesk Eagle from the official website. Make sure to select the appropriate version for your operating system (Windows, Mac, or Linux).
  • Follow the instructions provided by Autodesk to complete the installation process. This may involve entering a license key or activating the software through your Autodesk account.
  • Once Autodesk Eagle is installed, you may need to install additional libraries or tools depending on the specific requirements of the PlanktoScope Hat. These may include libraries for communicating with specific hardware components, or tools for debugging and testing your designs.
  • Once you have installed all the necessary tools and libraries, you should be ready to start working on the PlanktoScope Hat using Autodesk Eagle. You can begin by opening the project files and familiarizing yourself with the existing design, or by creating new designs as needed.

By following these steps, you can set up a development environment that allows you to contribute to the PlanktoScope Hat using Autodesk Eagle.

"},{"location":"community/contribute/software/","title":"How to help development for the PlanktoScope code","text":"

We are using the Github Flow approach for our development efforts.

If you want to join us, have a look at the currently opened issues and pick one where you feel like you can have an impact. Let us know you want to work it in the comments and get started.

For working on Node-Red, we recommend to install it directly on your development machine to allow for faster cycles of testing (and ease of use). But feel free to setup a Pi Zero as a portable and compact development environment! (One of us is using one configured as usb gadget to do so!)

"},{"location":"community/contribute/software/#node-red","title":"Node-Red","text":"

Node-Red is our main process. We use the flow to manage our user interface through a dashboard instance.

As a software engineer, you may need to set up a Node-RED development environment on a Debian operating system. Node-RED is an open-source programming tool for wiring together hardware devices, APIs, and online services in new and interesting ways. It provides a visual, drag-and-drop interface for building applications, and can be used to develop a wide range of IoT, automation, and data processing projects.

To set up a Node-RED development environment on a Debian operating system, you will need to follow these steps:

  1. Install Node.js: Node-RED requires Node.js to be installed on your system. You can install Node.js using the package manager by running the following command: sudo apt-get install nodejs
  2. Install npm (Node Package Manager): npm is a package manager for Node.js that is used to install and manage Node-RED and its dependencies. You can install npm by running the following command: sudo apt-get install npm
  3. Install Node-RED: Once Node.js and npm are installed, you can install Node-RED by running the following command: sudo npm install -g --unsafe-perm node-red
  4. Start the Node-RED server: You can start the Node-RED server by running the following command: node-red
  5. Access the Node-RED editor: You can access the Node-RED editor by opening a web browser and going to the URL http://localhost:1880.

By following these steps, you will be able to set up a Node-RED development environment on your Debian operating system and start building applications with the visual, drag-and-drop interface.

"},{"location":"community/contribute/software/#python","title":"Python","text":"

The python code is separated in four main processes, each with a specific set of responsibilities:

  • The main process controls all the others, starts everything up and cleans up on shutdown
  • The stepper process manages the stepper movements.
  • The imager process controls the camera and the streaming server via a state machine.
  • The segmenter process manages the segmentation and its outputs.

Those processes all communicates together using MQTT and json messages. Each message is adressed to one topic. The high level topic controls which process receives the message. The details of each topic is at the end of this commit message. You can learn more about the MQTT Messages here.

The code is architectured around 6 modules and about 10 classes. I encourage you to have a look at the files, they're pretty straightforward to understand.

"},{"location":"operation/","title":"Operation","text":"

This page provides basic instructions for operating your PlanktoScope.

"},{"location":"operation/#connect-directly-to-your-planktoscope","title":"Connect directly to your PlanktoScope","text":"

In order to operate your PlanktoScope, you will need to connect to your PlanktoScope from a separate device (a computer, tablet, or phone) with a web browser. If this is your first time setting up or connecting to your PlanktoScope, you will need to set up a direct network connection between your computer and your PlanktoScope.

"},{"location":"operation/#connect-with-an-ethernet-cable","title":"Connect with an Ethernet cable","text":"

You can connect your computer to the PlanktoScope by plugging an Ethernet cable between your computer and your PlanktoScope's Raspberry Pi.

"},{"location":"operation/#connect-with-the-planktoscopes-isolated-wi-fi-network","title":"Connect with the PlanktoScope's isolated Wi-Fi network","text":"

Unless you have already configured your PlanktoScope to connect to an existing Wi-Fi network, your PlanktoScope will create its own isolated Wi-Fi network (like a Wi-Fi hotspot, but without internet access). The Wi-Fi network created by your PlanktoScope should appear on your computer's list of available Wi-Fi networks a few minutes after you turn on power to your PlanktoScope.

As you can see, the name of your PlanktoScope's Wi-Fi network will be of the format pkscope-{random word}-{random word}-{random number}. This name corresponds exactly to the serial number of the Raspberry Pi computer in your PlanktoScope, so it is a unique Wi-Fi network name; and the unique name of your machine has format {random-word}-{random-word}-{random number}, which is just the name of the Wi-Fi network but without the pkscope- prefix (e.g. chain-list-27764). You should connect to the Wi-Fi network specific to your PlanktoScope.

Unless you have changed the password of your PlanktoScope's Wi-Fi network, the password should be copepode.

"},{"location":"operation/#access-your-planktoscopes-software","title":"Access your PlanktoScope's software","text":"

Once you connect your computer to your PlanktoScope, you will need to access your PlanktoScope's software from a web browser on your computer. You should try opening the following URLs in your web browser (try opening them in the following order, and just use the first one which works):

  • http://planktoscope.local\u00a0(this should work unless you're on a device and web browser without mDNS support; notably, older versions of Android do not have mDNS support)
  • http://pkscope.local\u00a0(this should work unless you're on a device and web browser without mDNS support; notably, older versions of Android do not have mDNS support)
  • http://home.pkscope\u00a0(this should work unless your web browser is configured to use a Private DNS provider)
  • http://192.168.4.1\u00a0(this should always work)
  • http://192.168.5.1\u00a0(this should always work)

Tip

If you know the machine name of your PlanktoScope (which has format {random-word}-{random-word}-{random number}, e.g. chain-list-27764, you can also try the following URLs after replacing {machine-name} with the actual machine name of your PlanktoScope:

http://pkscope-{machine-name}.local\u00a0(this should work unless you're on a device and web browser without mDNS support; notably, older versions of Android do not have mDNS support)

http://{machine-name}.pkscope\u00a0(this should work unless your web browser is configured to use a Private DNS provider)

You will need to use a URL with your PlanktoScope's machine name if your computer has network connections to multiple PlanktoScopes, e.g. via multiple Ethernet cables. In such a situation, using http://home.pkscope or http://pkscope.local may cause you to access the software for a different PlanktoScope connected to your computer than the one you had intended to access.

Warning

You may encounter older documents which ask you to connect to http://planktoscope.local:1880/ui, which is the URL to use for software version 2.3 and even older versions. That link does not work on software versions newer than v2.3; instead, you should use the links listed above.

One of the above URLs should work, and your web browser should show a landing page with a list of links:

You should click on the \"Node-RED dashboard\" link; this will open a new tab with the primary interface for operating your PlanktoScope. Once you have opened the Node-RED dashboard, you should proceed to our User interface guide to understand how to use it.

"},{"location":"operation/#how-to-image-plankton","title":"How to image plankton","text":"

Before doing an acquisition, you will need to collect targets. There are several ways to do this, and you probably already have a source nearby (in a culture if you are working in a lab).

However, if you have access to a body of water (even a tiny lake or river is enough), you can build yourself a plankton net to collect a sample. Once the sample is collected, either pump it with a syringe that you connect to the machine, or dip one of the silicone tube inside the sample tube you have.

You can then do an acquisition run. This is the best way to learn about the machine and this process!

Warning

After doing an acquisition, the machine should be cleaned, especially in the fluidic part. One good way to do this is to first flush the machine with clear water (distilled if possible). You can then push through a 5-10% bleach solution, or some alcohol.

If needed you can also clean the outside of the objective lens with a soft cloth. You can do the same on the flow cell if there are traces of finger on it too.

For quantitative imaging of water samples, refer to the following protocols published by members of the PlanktoScope community:

  • \"Planktoscope protocol for plankton imaging V.2\" for software v2.3+ and hardware v2.5. A PDF copy of this protocol is also available for offline use.
  • \"Planktoscope protocol for plankton imaging V.1\" for software v2.3 and hardware v2.1-2.3. A PDF copy of this protocol is also available for offline use.
"},{"location":"operation/clone-sd/","title":"Clone your SD card","text":"

If you want to create an SD card image from your PlanktoScope to use on other PlanktoScopes, you can follow the following steps.

"},{"location":"operation/clone-sd/#prepare-the-sd-card-for-cloning","title":"Prepare the SD card for cloning","text":"

Depending on whether you want to make an SD card image to reuse across multiple machines or whether you only want to make an exact backup of your SD card image, you will need to perform different steps to prepare your SD card for cloning.

"},{"location":"operation/clone-sd/#clone-your-sd-card","title":"Clone your SD card","text":""},{"location":"operation/clone-sd/#prepare-for-cloning-to-reuse-in-other-machines","title":"Prepare for cloning to reuse in other machines","text":"

Normally, your SD card contains some information (a machine-specific ID, system secrets, and SSH secrets) which should never be replicated across multiple PlanktoScopes, and some information (apt package cache) which you would probably consider a waste of space which unnecessarily increases the size of the SD card image you want to make. We provide a preparation script at /usr/libexec/prepare-custom-image to remove this information; it also allows an SD card image created from your SD card to automatically resize itself to match the size of any SD card it's flashed to in the future. After you make any changes you want to make on your PlanktoScope for your SD card image, you should run the preparation script on the PlanktoScope with the command:

sudo /usr/libexec/prepare-custom-image\n

Once this script finishes running, it will shut down your PlanktoScope's Raspberry Pi.

Next, you should remove the SD card from your PlanktoScope and plug it into another computer, so that you can clone the SD card into an SD card image; this guide assumes that your other computer runs Linux. With your SD card plugged into your other computer, you can mount the SD card's rootfs partition to delete any other sensitive files which were not removed by the /usr/libexec/prepare-custom-image script. For example, you may also want to delete or edit some or all of the following files from the rootfs partition in order to remove any sensitive or machine-specific information:

  • etc/wpa_supplicant/wpa_supplicant.conf: Wi-Fi configuration and network secrets.
  • home/pi/.ssh/authorized_keys: SSH public keys of devices authorized to remotely connect to the PlanktoScope.
  • home/pi/data/: all images acquired before by the PlanktoScope - this directory may be large, and you probably don't want to copy those datasets across all your other PlanktoScopes.
  • home/pi/.bash_history: Bash command history.
  • home/pi/.python_history: Python command history.
  • home/pi/.gitconfig: Git configuration, which may contain user-specific details.

Info

You can also delete the files listed above before running the /usr/libexec/prepare-custom-image script; the effect is the same. Either way, those files will be permanently deleted on your SD card. However, if you want to keep those files on your SD card, you should make backup copies of those files, and then you can copy those files back onto your SD card after you finish cloning the SD card to an image.

Next, proceed to the Make an SD card image section of this guide.

"},{"location":"operation/clone-sd/#prepare-an-exact-backup","title":"Prepare an exact backup","text":"

If you want to make an exact backup of your SD card and you don't want to reuse your SD card image across multiple PlanktoScopes, then you shouldn't run the /usr/libexec/prepare-custom-image script: that script will delete some files which you probably want to keep. Instead, you should edit the /boot/cmdline.txt file to add the string init=/usr/lib/raspberrypi-sys-mods/firstboot to the end of the file, for example resulting in a file which looks something like:

console=tty1 root=PARTUUID=someuniqueidhere rootfstype=ext4 fsck.repair=yes rootwait init=/usr/lib/raspberrypi-sys-mods/firstboot\n

Next, you should remove the SD card from your PlanktoScope and plug it into another computer, so that you can clone the SD card into an SD card image; this guide assumes that your other computer runs Linux. Then proceed to the Make an SD card image section of this guide.

Warning

After you have finished cloning the SD card to an SD card image, you should edit the /boot/cmdline.txt file to remove the init=/usr/lib/raspberrypi-sys-mods/firstboot string, before booting up the Raspberry Pi with your SD card again. This will prevent the first-boot script from deleting the SSH server keys already on your SD card.

"},{"location":"operation/clone-sd/#make-an-sd-card-image","title":"Make an SD card image","text":""},{"location":"operation/clone-sd/#locate-the-sd-card","title":"Locate the SD card","text":"

Now that your SD card is plugged into a Linux computer, you will need to determine the path of the device file corresponding to your SD card. Usually it will look something like /dev/mmcblk0, /dev/sda, or /dev/sdb; it should always be some file in /dev. To identify the device file for your SD card, run the command sudo fdisk -l in your terminal. The output may look something like:

Disk /dev/nvme0n1: 1.82 TiB, 2000398934016 bytes, 3907029168 sectors\nDisk model: WD_BLACK SN770 2TB\nUnits: sectors of 1 * 512 = 512 bytes\nSector size (logical/physical): 512 bytes / 512 bytes\nI/O size (minimum/optimal): 512 bytes / 512 bytes\nDisklabel type: gpt\nDisk identifier: D18C4567-ADF2-4987-987F-CDA411988C8E\n\nDevice           Start        End    Sectors  Size Type\n/dev/nvme0n1p1    2048    1230847    1228800  600M EFI System\n/dev/nvme0n1p2 1230848    3327999    2097152    1G Linux filesystem\n/dev/nvme0n1p3 3328000 3907028991 3903700992  1.8T Linux filesystem\n\nDisk /dev/mmcblk0: 58.29 GiB, 62587404288 bytes, 122241024 sectors\nUnits: sectors of 1 * 512 = 512 bytes\nSector size (logical/physical): 512 bytes / 512 bytes\nI/O size (minimum/optimal): 512 bytes / 512 bytes\nDisklabel type: dos\nDisk identifier: 0xa2033091\n

To determine which disk device corresponds to your SD card, you should check the size of each device to find the one which approximately matches the size of your SD card. In the above example, the 64 GB SD card is at /dev/mmcblk0.

Next, you should unmount the SD card from your system (or ensure that the device is already not mounted on your system). If you're unsure whether the SD card is mounted, you should use the umount command. For example, if your device is /dev/mmcblk0, you will need to run:

sudo umount /dev/mmcblk0p1\nsudo umount /dev/mmcblk0p2\n

If the devices were already not mounted, you should expect to see (and you can safely ignore) error messages which look like:

umount: /dev/mmcblk0p1: not mounted.\numount: /dev/mmcblk0p2: not mounted.\n
"},{"location":"operation/clone-sd/#clone-the-sd-card-to-an-image","title":"Clone the SD card to an image","text":"

To clone the Raspberry Pi's SD card to an image file which you can write to other SD cards, you should follow the instructions at https://github.com/mgomesborges/raspberry-pi/blob/master/setup/clone-sd-card.md or https://raspberrytips.com/create-image-sd-card/ . For example, if you are using a Linux computer and the SD card shows up as /dev/mmcblk0, you could run the following command (replacing file paths and names accordingly):

sudo dd bs=4M if=/dev/mmcblk0 of=/some/path/here/image-name-here.img status=progress\n

This will create a .img file (at /some/path/here/image-name-here.img) as large as your SD card - make sure you have enough space on your hard drive for the file! If your SD card is large, this process may take a long time; this greatly depends on the speed of your SD card reader. For example, a slow SD card reader may take 30 minutes in order to clone a 32 GB SD card.

"},{"location":"operation/clone-sd/#shrink-the-sd-card-image","title":"Shrink the SD card image","text":"

In order to make the SD card practical to share, you should shrink and compress the SD card image file using the PiShrink tool. For example, on Linux you could run the following set of commands (again replacing file paths and names accordingly):

cd /some/path/here\nwget https://raw.githubusercontent.com/Drewsif/PiShrink/master/pishrink.sh\nchmod +x pishrink.sh\nsudo ./pishrink.sh -za image-name-here.img\n

If you had set up the PlanktoScope software on a Raspberry Pi OS Lite image, you should get a image-name-here.img.gz file which is at least 2 GB in size.

"},{"location":"operation/clone-sd/#use-the-sd-card-image","title":"Use the SD card image","text":"

You can now use this SD card image with the non-standard installation guide for installing the PlanktoScope OS on an SD card for one or more PlanktoScopes.

"},{"location":"operation/maintenance/","title":"Maintenance and Repair","text":"

Instructions for maintaining and repairing the PlanktoScope.

"},{"location":"operation/maintenance/#cleaning-the-optics","title":"Cleaning the optics","text":"
  • Begin by turning off the microscope and unplugging it from any power source. Gently remove any dust or debris using a soft, dry cloth.
  • To clean the lenses and other optics, use a lens cleaning solution and a lens cleaning tissue or cloth. Gently wipe the optics in a circular motion, starting from the center and working outward. Avoid applying too much pressure or using a rough cloth, as this can scratch or damage the optics.
  • Once you have finished cleaning the optics, use a dry cloth to remove any excess moisture or cleaning solution.
"},{"location":"operation/maintenance/#software-updates","title":"Software updates","text":"

The PlanktoScope project aims to keep improving the PlanktoScope software by fixing problems and making the software simpler and easier to use, releasing a new version of the software a few times each year. At the same time, we aim to keep the software compatible with all previous officially-released versions of the PlanktoScope hardware. For this reason, we strongly recommend everyone to keep their PlanktoScopes updated to run the latest stable release of the PlanktoScope software, and the PlanktoScope documentation will only support the latest stable release. You can always find the latest stable release at https://github.com/PlanktoScope/PlanktoScope/releases/latest, which will redirect you to a web page for the latest stable release.

Currently, you will need to re-flash the SD card of your PlanktoScope's embedded Raspberry Pi in order to update the PlanktoScope software to the latest version, and then you will need to reapply any custom software configurations you had set (e.g. hardware settings). We are also developing an easier and less disruptive way to update the PlanktoScope software, but it is not yet ready for use.

"},{"location":"operation/sample-collection/","title":"Sample collection","text":"

The most common way to collect samples for the PlanktoScope is to use a plankton net.

"},{"location":"operation/sample-collection/#plankton-net","title":"Plankton Net","text":"

A plankton net is a scientific tool used to collect plankton samples from aquatic environments. Plankton are small, drifting organisms that play a vital role in marine ecosystems. They include a diverse range of species, including bacteria, algae, protozoa, and small animals such as crustaceans and mollusks. Plankton nets are designed to capture these tiny organisms as they drift through the water column.

Plankton nets typically consist of a fine mesh net attached to a long, narrow handle. The net is usually cone- or cylinder-shaped, with a small opening at the base and a wider opening at the top. The net is lowered into the water and dragged through the water column, collecting plankton as it goes. The collected plankton is then collected in a sample bottle or container for further study.

Plankton nets can be used in a variety of aquatic environments, including oceans, lakes, and rivers. They are commonly used in scientific research to study the diversity and abundance of plankton in different ecosystems, as well as their role in the food web and the broader ecosystem. Plankton nets are also used in environmental monitoring programs to track changes in plankton populations over time.

The simplest device you can use is a plankton net. It should be made of a fine mesh, down to 20 micron. It can be towed behind a boat at low speed (less than 2 knots) or towed by hand in a river or a lake.

Plankton nets can be made easily with a good sewind machine and some hardware.

"},{"location":"operation/user-interface/","title":"User interface guide","text":"

This guide will help you understand how to use the Node-RED dashboard, which is the primary user interface for operating the PlanktoScope.

"},{"location":"operation/user-interface/#home","title":"Home","text":"

When you open the \"Node-RED dashboard link\" from the PlanktoScope's landing page, you will reach a page like what is shown in the screenshot above.

From here, you can quickly access any of the available tabs. The buttons are only the most used functionnalities of the machine. Three others tabs are accessible only through the hamburger menu on the top left of the screen (the three horizontal lines):

  • Wifi
  • Administration
  • Hardware Config

Tip

This list is also available from any other tab and allows you to quickly navigate between tabs.

"},{"location":"operation/user-interface/#machine-shutdown","title":"Machine shutdown","text":"

From this page, you can also shutdown the machine when you are done.

Warning

It's very very very important to always shutdown the machine and wait a minute for it to completely shutdown before unplugging the power supply! You risk data corruption if you turn off power without shutting down the machine through the software!

To shutdown the machine, first unlock the shutdown button by clicking on \"Unlock Button\".

You can then click on \"Shutdown\". The machine will ask for a final confirmation and will then shut itself down.

"},{"location":"operation/user-interface/#sample-tab","title":"Sample Tab","text":"

In this page, you can enter all the information regarding the current sample you want to image. This includes the project name, the operator, but also the type of collection device you used.

Depending on the device you choose, the page will change to reflect the needed information.

There is a mechanism of validation of the submitted data. Please be careful to use the format given in example for each input field.

The GPS status block will give you the current information on the GPS fix and location, your direction and speed. This can be used to grab the location when in the field.

Once all the fields are completed, you can go to the next tab by clicking the -> arrow. This will make sure all the inserted data is valid.

"},{"location":"operation/user-interface/#optic-configuration","title":"Optic Configuration","text":"

This page allows you to control the optical setup of the acquisition.

In the Optic Characterization block, you can control to turn the light on or not. You also have to choose the optics in use in the machine.

Warning

For now, the characteristics shown here are not true values (except if you use the 25mm/16mm lens couple).

The Camera Settings block allows you to change the shutter speed, the ISO number and the camera white balance settings. You can set it to automatic, but it's better if you control it by hand to make sure the setting doesn't change when the acquisition is started.

The Fluidic Manual Manipulation allows you to control the pump. You can change both the flowrate and the volume pumped. If you click on the rotating arrow, it will start the pump for the given volume at the chosen flowrate.

The Focus Adjustment block allows you to control the focus stage. With the leftmost buttons, you can choose to move the stage quickly by one mm, either up or down. The rightmost buttons move the stage by the specified distance in the slider under.

As with all the tabs, once you are satisfied with your focus and your image settings, you can click on \"Continue\".

"},{"location":"operation/user-interface/#fluidic-acquisition","title":"Fluidic Acquisition","text":"

Finally, this is where the magic happens! You will be able to chose the final parameters of your capture.

First of all, change the Fraction Size of your sample. You can then choose a unique ID for your acquisition, the number of pictures you want to take, the pumped volume (in between images), the delay to stabilize the image and the Flowcell thickness. All those settings will influence the Total imaged volume (the total volume captured during the acquisition) and the Total pumped volume.

Warning

Make sure the Total pumped volume is lower than the volume of your sample.

"},{"location":"operation/user-interface/#gallery","title":"Gallery","text":"

This simple page will allow you to preview and download the captured data.

"},{"location":"operation/user-interface/#system-monitoring","title":"System Monitoring","text":"

This tab allows you to monitor the physical characteristics of the machine and follow the processor load, CPU temperature, memory use and disk usage.

You also can find information about the software version you are using, the machine name and its camera.

"},{"location":"operation/user-interface/#wifi","title":"Wifi","text":"

This page will give you information about the network the PlanktoScope is connected to. It will also allows you to connect your machine to a new WiFi network.

Start by doing a network scan by clicking on the Scan button. The list will be populated with detected networks after a few seconds. You can then choose one of them, enter its password and click on Add the network to connect to it. The wifi network of the PlanktoScope will disappear after a few seconds, so you will need to connect back to the same network you just put the machine on.

Finally, if you are not located in the US, please update the Country code in the field below. This will ensure the PlanktoScope complies with local Wifi regulations (such as maximum emitted power, duty cycle and such).

Clicking on the button Reset wifi networks will erase ALL networks saved previously by the machine. If you do this, it will disconnect immediately from any network it's connected to, and will put up its own network.

Info

For now, only WPA/WPA2 Personal security is supported; Wi-Fi networks without passwords are not supported.

Warning

Please be mindful about the security policies of your organisation before connecting your device to a network (either through Wifi or with an Ethernet cable). A lot of research institutions don't allow devices not controlled by them to be connected to their network without first going on an approved list with a least a basic security checkup.

"},{"location":"operation/user-interface/#administration","title":"Administration","text":"

On this page you can find links to view the logs generated by the Python backend, and buttons to restart the Python backend's hardware controller or segmenter, as well as buttons to restart or shut down your PlanktoScope's Raspberry Pi computer.

"},{"location":"operation/user-interface/#hardware-settings","title":"Hardware Settings","text":"

You should not touch anything here unless you have received specific instructions to do so, e.g. as part of our post-installation configuration guide, or as part of a guide for calibrating your PlanktoScope.

"},{"location":"reference/","title":"Technical Reference","text":"

The PlanktoScope is a modular, open-source platform for high-throughput quantitative imaging of plankton samples. Its small size, ease of use, and low cost make it suitable for a variety of applications, including the monitoring of laboratory cultures or natural micro-plankton communities. It can be controlled from any WiFi-enabled device and can be easily reconfigured to meet the changing needs of the user.

"},{"location":"reference/#key-features","title":"Key Features","text":"

Here are some key features of the PlanktoScope:

  1. Low cost: The PlanktoScope is designed to be affordable, with parts costing under $1000.
  2. Modular: The PlanktoScope is modular, meaning it can be easily reconfigured to meet the changing needs of users.
  3. Open-source: The PlanktoScope is based on open-source hardware and software, making it accessible to a wide community of engineers, researchers, and citizens.
  4. Versatility: The PlanktoScope is versatile, and can be used to study a variety of plankton types, including laboratory cultures and natural micro-plankton communities.
  5. High-throughput: The PlanktoScope is capable of high-throughput quantitative imaging, allowing users to analyze large numbers of samples quickly and efficiently.
  6. WiFi-enabled: The PlanktoScope can be controlled from any WiFi-enabled device, making it easy to use and deploy in a variety of settings.
  7. Portable: The PlanktoScope is small and portable, making it easy to transport and use in the field.
  8. Ease of use: The PlanktoScope is designed to be easy to use, with instructions for assembly and use available on the PlanktoScope website.
"},{"location":"reference/hardware/changelog/","title":"Changelog","text":"

The design of the PlanktoScope's hardware has been evolving to fix usability issues and improve the quality of images captured by the PlanktoScope. Thus, multiple versions of the hardware have been developed:

"},{"location":"reference/hardware/changelog/#v26","title":"v2.6","text":"

This is the latest version of the PlanktoScope hardware, and it is the version currently sold by FairScope. It replaced the optical components so that the PlanktoScope produces higher-quality images.

"},{"location":"reference/hardware/changelog/#v25","title":"v2.5","text":"

This was the first version of the PlanktoScope hardware made commercially available by FairScope, a small business started by the inventor of the PlanktoScope in order to make it easier for people to obtain PlanktoScopes. It is a minor variation of the v2.4 hardware design and includes all of the changes made in previous hardware versions - including a custom-designed PCB HAT, a glass capillary flowcell. The mechanical structure of this design uses CNC-milled parts rather than laser-cut parts.

"},{"location":"reference/hardware/changelog/#v24","title":"v2.4","text":"

This was a prototype which replaced the ibidi u-Slide flowcell with a simpler flowcell design based on rectangular glass capillaries, in order to fix various issues with the ibidi flowcells and to make it possible for people to make their own flowcells.

This version was only an internal prototype for the PlanktoScope development team.

"},{"location":"reference/hardware/changelog/#v23","title":"v2.3","text":"

This was a prototype version of the hardware which replaced the Adafruit Stepper Motor HAT and the Yahboom RGB Cooling HAT with a custom-designed PCB HAT, in order to simplify overall assembly and provide additional features which solved problems with the v2.1 hardware design. As a result, a different configuration of the PlanktoScope software is required to control this version of the PlanktoScope hardware, as well as subsequent hardware versions. This version also significantly changed the physical dimensions of the PlanktoScope's mechanical structure, in order to solve some problems with the v2.1 design.

This version was only an internal prototype for the PlanktoScope development team.

"},{"location":"reference/hardware/changelog/#v22","title":"v2.2","text":"

This was a prototype version of the hardware which replaced the Adafruit Stepper Motor HAT with a Waveshare Stepper Motor HAT.

This version was only an internal prototype for the PlanktoScope development team.

"},{"location":"reference/hardware/changelog/#v21","title":"v2.1","text":"

This is the first version of the PlanktoScope hardware which was publicly released, and it is one of the two hardware designs described in the initial paper introducing the PlanktoScope. It simplified the hardware's robustness and mechanical assembly by integrating most subsystems into a monolithic architecture whose structure uses laser-cut parts. The electronic hardware components of this design are all available off-the-shelf, using an Adafruit Stepper Motor HAT to control various actuators and a Yahboom RGB Cooling HAT to cool the PlanktoScope's embedded Raspberry Pi computer. The mechanical structure was designed for fabrication using a laser cutter. This hardware version included some design flaws, such as providing no way to replace the Raspberry Pi's micro-SD card without partially disassembling the PlanktoScope.

"},{"location":"reference/hardware/changelog/#v10","title":"v1.0","text":"

This was the first prototype of the PlanktoScope, and it is one of the two hardware designs described in the initial paper introducing the PlanktoScope. Its mechanical structure featured a fully modular, stackable architecture consisting of triangular layers which coupled together with magnets.

This design was complicated to assemble, and it suffered from unreliable electronic communication between the modules, so it was never publicly released.

"},{"location":"reference/hardware/hat/","title":"PlanktoScope Hat Hardware","text":""},{"location":"reference/hardware/hat/#buses-and-gpio-pinout","title":"Buses and GPIO pinout","text":""},{"location":"reference/hardware/hat/#i2c1-bus","title":"I2C1 Bus","text":""},{"location":"reference/hardware/hat/#rtc-rv-3028-c7","title":"RTC RV-3028-C7","text":"

Address 0x52 Configured through a kernel driver.

"},{"location":"reference/hardware/hat/#oled-display","title":"OLED Display","text":"

Address 0x3c

"},{"location":"reference/hardware/hat/#led-control-lm36011","title":"LED control: LM36011","text":"

Address 0x64 Control through specific software, current range from 0 to 376mA in normal mode, up to 1.5A in flash mode.

"},{"location":"reference/hardware/hat/#spi0-bus","title":"SPI0 Bus","text":""},{"location":"reference/hardware/hat/#motor-controller-0-tmc5160","title":"Motor Controller 0: TMC5160","text":"

Chip Enable: SPI0_CE0 Motor Enable: GPIO23

Diagnostic output: GPIO16 for Error output GPIO20 for Stall output

"},{"location":"reference/hardware/hat/#motor-controller-1-tmc5160","title":"Motor Controller 1: TMC5160","text":"

Chip Enable: SPI0_CE1 Motor Enable: GPIO5

Diagnostic output: GPIO16 for Error output GPIO20 for Stall output

"},{"location":"reference/hardware/hat/#gpio","title":"GPIO","text":""},{"location":"reference/hardware/hat/#fan-control","title":"Fan control","text":"

PWM1 control through GPIO13

"},{"location":"reference/hardware/hat/#led-output-selection","title":"LED Output selection","text":"

GPIO18: high for LED1, low for LED2

"},{"location":"reference/hardware/hat/#led-strobe","title":"LED Strobe","text":"

GPIO22 for pulse

"},{"location":"reference/hardware/hat/#i2c0-bus","title":"I2C0 Bus","text":""},{"location":"reference/hardware/hat/#eeprom-m24c32","title":"EEPROM M24C32","text":"

Address 0x50 For HAT information only.

"},{"location":"reference/hardware/product-specs/","title":"Product Specifications","text":"

Product specifications for the PlanktoScope hardware are listed below for each hardwaare version. For more information on each hardware version, refer to the hardware changelog.

"},{"location":"reference/hardware/product-specs/#v26","title":"v2.6","text":"

Overview:

  • Weight: 3.5 kg
  • Enclosure:

    • Dimensions: 27.5 cm (length) x 12.5 cm (width) x 10.5 cm (height)
    • Material: bamboo plywood
    • Fabrication process: CNC milling
"},{"location":"reference/hardware/product-specs/#functionalities","title":"Functionalities","text":"
  • Automated image acquisition, with a motorized pump and an embedded computer
  • Precise focus adjustment, with motorized linear actuators
  • Continuous mixing of input sample to prevent sedimentation of heavier particles, with a USB-powered bubbler
  • On-board image processing, with the embedded computer
  • Local Wi-Fi network hotspot for local operation from a connected phone, tablet or laptop, with the embedded computer
  • Internet connectivity via Wi-Fi or Ethernet for remote operation, with the embedded computer
"},{"location":"reference/hardware/product-specs/#subsystems","title":"Subsystems","text":"

Optics:

  • Imaging characteristics:

    • Optical magnification: 1.33
    • Field of view: 3062 \u00b5m x 2295 \u00b5m
    • Optical pixel size: 0.75 \u00b5m
    • Depth of field: 95 \u00b5m
  • Internal camera: Raspberry Pi High Quality Camera

    • Sensor: Sony IMX477R
    • Resolution: 12.3 Megapixels (4056 x 3040 pixels)
  • Lenses:

    • Objective lens: 12 mm focal length, M12
    • Tube lens: 25 mm focal length, M12
    • Lens mount: M12x0.5
  • Illumination: white LED

Fluidics:

  • Flow cell: capillary with rectangular cross-section

    • Thickness: 300 \u00b5m
    • Material: glass
  • Internal tubing:

    • Material: Tygon S3 (contains no BPA or phthalates)
    • Dimensions: 1.6 mm (1/16\") inner diameter, 3.2 mm (1/8\") outer diameter
    • Connectors: Luer lock
  • Peristaltic pump

  • Sample intake capacity: 20 mL

Other internal electronics:

  • Embedded computer: Raspberry Pi 4 Model B

    • Processor: Broadcom BCM2711, Quad core Cortex-A72 (ARM v8) 64-bit SoC @ 1.8 GHz
    • Memory: 4 GB RAM
    • Storage: 128 GB capacity (micro-SD card, UHS speed class 3)
  • Control board: PlanktoScope HAT v1.2

External interfaces & connectivity:

  • Expansion: 2 USB 3.0 ports, 2 USB 2.0 ports
  • Wired networking: Gigabit Ethernet
  • Wireless networking: 2.4 GHz and 5.0 GHz 802.11ac Wi-Fi
  • Power input: 12 V DC, up to 4 A of current draw (5.1 x 2.2 mm DC barrel jack, center positive)
  • Latching push-button switch to toggle power

External AC-to-DC power adapter:

  • Input: 100-240 V AC, 50-60 Hz (IEC 60320 C8 socket)
  • Output: 12 V DC, up to 4 A of current output (5.1 x 2.2 mm DC barrel jack, center positive)
  • Dimensions: 126 mm (length) x 52 mm (width) x 35.5 mm (height)
  • Weight: 0.25 kg
"},{"location":"reference/hardware/product-specs/#system-performance","title":"System performance","text":"

Image acquisition throughput:

  • Volume of sample measured: 2.1 \u00b5L per acquired image
  • Volume of sample pumped: ~15 \u00b5L per acquired image
  • Maximum image acquisition rate: ~60 images/min

Samples:

  • Object size range:

    • Minimum for taxonomy: ~20 \u00b5m diameter for round objects
    • Maximum: ~200 \u00b5m diameter for round objects (larger objects will clog the flow cell)
"},{"location":"reference/hardware/product-specs/#v25","title":"v2.5","text":"

Overview:

  • Enclosure:

    • Dimensions: 27.5 cm (length) x 12.5 cm (width) x 10.5 cm (height)
    • Material: bamboo plywood
    • Fabrication process: CNC milling
"},{"location":"reference/hardware/product-specs/#functionalities_1","title":"Functionalities","text":"
  • Automated image acquisition, with a motorized pump and an embedded computer
  • Precise focus adjustment, with motorized linear actuators
  • Continuous mixing of input sample to prevent sedimentation of heavier particles, with a USB-powered bubbler
  • On-board image processing, with the embedded computer
  • Local Wi-Fi network hotspot for local operation from a connected phone, tablet or laptop, with the embedded computer
  • Internet connectivity via Wi-Fi or Ethernet for remote operation, with the embedded computer
"},{"location":"reference/hardware/product-specs/#subsystems_1","title":"Subsystems","text":"

Optics:

  • Imaging characteristics:

    • Field of view: 3670 \u00b5m x 2675 \u00b5m
    • Optical pixel size: 0.88 \u00b5m
  • Internal camera: Raspberry Pi High Quality Camera

    • Sensor: Sony IMX477R
    • Resolution: 12.3 Megapixels (4056 x 3040 pixels)
  • Lenses:

    • Objective lens: 16 mm focal length, M12
    • Tube lens: 25 mm focal length, M12
    • Lens mount: M12x0.5
  • Illumination: white LED

Fluidics:

  • Flow cell: capillary with rectangular cross-section

    • Thickness: 300 \u00b5m
    • Material: glass
  • Internal tubing:

    • Material: Tygon S3 (contains no BPA or phthalates)
    • Dimensions: 1.6 mm (1/16\") inner diameter, 3.2 mm (1/8\") outer diameter
    • Connectors: Luer lock
  • Peristaltic pump

  • Sample intake capacity: 20 mL

Other internal electronics:

  • Embedded computer: Raspberry Pi 4 Model B

    • Processor: Broadcom BCM2711, Quad core Cortex-A72 (ARM v8) 64-bit SoC @ 1.8 GHz
    • Memory: 4 GB RAM
    • Storage: 128 GB capacity (micro-SD card, UHS speed class 3)
  • Control board: PlanktoScope HAT v1.2

External interfaces & connectivity:

  • Expansion: 2 USB 3.0 ports, 2 USB 2.0 ports
  • Wired networking: Gigabit Ethernet
  • Wireless networking: 2.4 GHz and 5.0 GHz 802.11ac Wi-Fi
  • Power input: 12 V DC, up to 4 A of current draw (5.1 x 2.2 mm DC barrel jack, center positive)
  • Latching push-button switch to toggle power

External AC-to-DC power adapter:

  • Input: 100-240 V AC, 50-60 Hz (IEC 60320 C8 socket)
  • Output: 12 V DC, up to 4 A of current output (5.1 x 2.2 mm DC barrel jack, center positive)
  • Dimensions: 126 mm (length) x 52 mm (width) x 35.5 mm (height)
  • Weight: 0.25 kg
"},{"location":"reference/hardware/product-specs/#system-performance_1","title":"System performance","text":"

Image acquisition throughput:

  • Volume of sample pumped: ~15 \u00b5L per acquired image
  • Maximum image acquisition rate: ~60 images/min

Samples:

  • Object size range:

    • Maximum: ~200 \u00b5m diameter for round objects (larger objects will clog the flow cell)
"},{"location":"reference/hardware/product-specs/#v21","title":"v2.1","text":"

Overview:

  • Enclosure:

    • Dimensions: ~32 cm (length) x ~5.5 cm (width) x ~15 cm (height)
    • Material: acrylic, plywood, or fiberboard
    • Fabrication process: laser cutting
"},{"location":"reference/hardware/product-specs/#functionalities_2","title":"Functionalities","text":"
  • Automated image acquisition, with a motorized pump and an embedded computer
  • Precise focus adjustment, with motorized linear actuators
  • On-board image processing, with the embedded computer
  • Local Wi-Fi network hotspot for local operation from a connected phone, tablet or laptop, with the embedded computer
  • Internet connectivity via Wi-Fi or Ethernet for remote operation, with the embedded computer
"},{"location":"reference/hardware/product-specs/#subsystems_2","title":"Subsystems","text":"

Optics:

  • Imaging characteristics:

    • Field of view: 2300 \u00b5m x 1730 \u00b5m
    • Optical pixel size: 0.75 \u00b5m
  • Internal camera: Raspberry Pi Camera Module 2

    • Sensor: Sony IMX219
    • Resolution: 8 Megapixels (3280 x 2464 pixels)
  • Lenses:

    • Objective lens: 12 mm focal length, M12
    • Tube lens: 25 mm focal length, M12
    • Lens mount: M12x0.5
  • Illumination: white LED

Fluidics:

  • Flow cell: ibidi \u00b5-Slide I Luer channel slide

    • Thickness: 200 \u00b5m, 400 \u00b5m, 600 \u00b5m, or 800 \u00b5m
    • Material: Plastic (no surface modification)
  • Internal tubing:

    • Material: Tygon S3 (contains no BPA or phthalates)
    • Dimensions: 1.6 mm (1/16\") inner diameter, 3.2 mm (1/8\") outer diameter
    • Connectors: Luer lock
  • Peristaltic pump

  • Sample intake capacity: 20 mL

Other internal electronics:

  • Embedded computer: Raspberry Pi 4 Model B

    • Processor: Broadcom BCM2711, Quad core Cortex-A72 (ARM v8) 64-bit SoC @ 1.8 GHz
    • Memory: 4 GB RAM
  • Control boards:

    • Adafruit Stepper Motor HAT

      • Input voltage: 5 - 12 V DC
      • Output voltage: 4.5 - 13.5 V DC
      • Output current: up to 1.2 A continuous, 3 A peak
    • Adafruit Ultimate GPS HAT

External interfaces & connectivity:

  • Expansion: 2 USB 3.0 ports, 2 USB 2.0 ports, 2 micro-HDMI ports
  • Wired networking: Gigabit Ethernet
  • Wireless networking: 2.4 GHz and 5.0 GHz 802.11ac Wi-Fi
  • Power input for embedded computer: 5 V DC, up to 3 A of current draw (USB-C)
  • Power input for motors: 5 - 12 V DC, depending on pump motor (5.1 x 2.2 mm DC barrel jack, center positive)
"},{"location":"reference/software/changelog/","title":"Changelog","text":"

All notable changes to the PlanktoScope's software will be documented in this file.

The format is based on Keep a Changelog, and this project uses Calendar Versioning with a YYYY.minor.patch scheme for all releases after v2.3.0. All dates in this file are given in the UTC time zone.

"},{"location":"reference/software/changelog/#v202400-beta2-2024-09-19","title":"v2024.0.0-beta.2 - 2024-09-19","text":""},{"location":"reference/software/changelog/#added","title":"Added","text":"
  • (System: administration) Added a Forklift-deployed script /usr/libexec/prepare-custom-image (which must be invoked with sudo) to reset machine-specific files and re-enable partition resizing and shut down the Raspberry Pi, in order to automate common tasks needed for making a custom SD card image from a booted Raspberry Pi running the PlanktoScope OS. Support for this script should be considered experimental - this was mainly added as a workaround to a developer-experience regression introduced after v2023.9.0, in which an additional step is now needed after making an SD card image from a previously-booted SD card, or else the image will result in an error message loop (\"Partition #2 contains a ext4 signature\") during boot and will be unable to resize the image above 8 GB. That step is now included by the added script. Creation of custom SD card images from booted PlanktoScope OS images should still be considered an experimental workflow which may experience breaking changes to the developer experience at any time.
"},{"location":"reference/software/changelog/#changed","title":"Changed","text":"
  • (Application: GUI) Changed the default ISO value from 100 to 150.
"},{"location":"reference/software/changelog/#fixed","title":"Fixed","text":"
  • (Application: backend) Changed the hardware controller's libcamera-based camera controller to initialize its default image gain based on camera sensor type in order to match the GUI's default ISO value of 150, instead of initializing default image gain to 1.0 regardless of camera sensor type.
  • (Breaking change; Application: backend) Changed the segmenter to include the acquisition ID in the filename of the metadata TSV file included with the EcoTaxa export ZIP archive; this is necessary to allow efficient bulk importing of such ZIP archives into EcoTaxa, which was previously prevented by the use of the same ecotaxa_export.tsv filename for all metadata TSV files.
  • (Application: GUI) The Grafana server's CPU allowance should now be limited to one core, in an attempt to prevent it from starving other programs of CPU time shortly after booting up under certain situations.
"},{"location":"reference/software/changelog/#v202400-beta1-2024-06-24","title":"v2024.0.0-beta.1 - 2024-06-24","text":""},{"location":"reference/software/changelog/#added_1","title":"Added","text":"
  • (Application: GUI) On the planktoscopehat SD card image, the Node-RED dashboard's homepage now asks the user to set the hardware version (choosing between v2.3, v2.5, and v2.6) as a first-boot setup step; this dialog replaces the navigation buttons on the homepage until a hardware version is set.
  • (Release) A fairscope-latest SD card image is now provided which is identical to the planktoscopehat SD card image, except that its default settings configuration file is for the v2.6 PlanktoScope hardware (so that the homepage does not ask the user to choose a hardware version).
  • (System: administration) The Forklift pallet provided by default as the SD card image is now named (and pinned as) the factory-reset staged pallet bundle.
  • (System: networking) The planktoscope.local mDNS name was deprecated in v2023.9.0-beta.1, but now it's un-deprecated (i.e. official support for this name is added back to the project). As before, you can still use pkscope.local or the machine-specific mDNS name (of format pkscope-{machine-name}.local) instead of planktoscope.local.
"},{"location":"reference/software/changelog/#changed_1","title":"Changed","text":"
  • (Breaking change; Application: GUI) The default settings configuration file for the planktoscopehat SD card image has been reverted to be for the v2.5 PlanktoScope hardware (reverting a change made for v2024.0.0-alpha.2); in v2024.0.0-alpha.2, it was for the v2.6 hardware, while in previous versions it was still for the v2.5 hardware.
  • (Release) SD card images are now released with xz compression (as .img.xz files) rather than gzip compression (as .img.gz files).
"},{"location":"reference/software/changelog/#removed","title":"Removed","text":"
  • (Application: GUI) On the planktoscopehat SD card image, a hardware version is no longer set in the default config.json file provided on the image. Instead, the user must select their hardware version when they open the Node-RED dashboard's homepage for the first time.
  • (Application: GUI) The Node-RED dashboard's Administration page's \"Dashboard Errors\" panel has been removed, because it doesn't show any useful messages.
  • (System) gcc has been removed from the SD card image, to help reduce SD card image size.
"},{"location":"reference/software/changelog/#fixed_1","title":"Fixed","text":"
  • (Application: GUI) The flowcell setting from the config.json file should now be properly displayed as the default selection on the Node-RED dashboard's \"Fluidic Acquisition\" page.
"},{"location":"reference/software/changelog/#v202400-beta0-2024-06-07","title":"v2024.0.0-beta.0 - 2024-06-07","text":""},{"location":"reference/software/changelog/#changed_2","title":"Changed","text":"
  • (Application: GUI) The ISO selector in the \"Optic Configuration\" page has been changed from a button group to a slider (with an increment of 50), to enable somewhat finer adjustment of the ISO setting.
  • (Breaking change; System) The official SD card images of PlanktoScope OS are now based on the 64-bit (arm64) version of the 2024-03-12 build of Raspberry Pi OS 11 (bullseye), instead of the 32-bit (armhf) version of the 2023-05-03 build of Raspberry Pi OS 11 (bullseye). This increases the performance of the Python segmenter, potentially by a factor of 2. This is expected to break compatibility with the raspimjpeg-based imaging module. If you need a 32-bit version of PlanktoScope OS, you will need to run the OS setup scripts following the PlanktoScope project's documentation's \"Non-standard installation\" guide for software setup.
  • (System: administration) The machine-name binary is no longer provided by the OS setup scripts, but instead is provided by Forklift for upgradeability (by upgrading the pallet applied to the Raspberry Pi) & removeability/replaceability (by switching to a different pallet which provides a different version of - or does not provide - the machine-name).
"},{"location":"reference/software/changelog/#deprecated","title":"Deprecated","text":"
  • (System: networking)
  • (System) 32-bit versions of PlanktoScope OS (which can be set up on a 32-bit version of Raspberry Pi OS using the OS setup scripts) are no longer officially supported by the project, but they will continue to work for v2024.0.0 of PlanktoScope OS.
"},{"location":"reference/software/changelog/#removed_1","title":"Removed","text":"
  • (Application: GUI) The landing page's links to Portainer have been removed, as part of the deprecation in v2024.0.0-alpha.2 of the inclusion of Portainer by default in the PlanktoScope OS's SD card images.
"},{"location":"reference/software/changelog/#fixed_2","title":"Fixed","text":"
  • (Application: GUI) The landing page's links to offline PDF copies of the protocols.io protocols for PlanktoScope operation are no longer broken.
  • (Application: GUI) The maximum allowed value in the ISO selector in the \"Optic Configuration\" page has been reduced from 800 to 650, but only for the planktoscopehat version of the Node-RED dashboard; maximum allowed value is still 800 in the adafruithat version of the Node-RED dashboard. This change is because v2024.0.0-alpha.2's change to the scaling factor for converting between ISO settings and camera gains in the picamera2 library has meant that ISO values above 650 were converted to image gain values which were silently rejected for the Raspberry Pi HQ Camera used PlanktoScopes with hardware version at or above v2.3; this, this change prevents users from setting ISO values which would be silently rejected by the Python hardware controller.
"},{"location":"reference/software/changelog/#v202400-alpha2-2024-04-25","title":"v2024.0.0-alpha.2 - 2024-04-25","text":""},{"location":"reference/software/changelog/#added_2","title":"Added","text":"
  • (System: administration) The hostname can now be customized by modifying the hostname template (with string interpolation for the machine name) in /etc/hostname-template.
  • (System: administration) The Cockpit configuration can now be customized by adding configuration snippets as drop-in files in /etc/cockpit/cockpit.conf.d, and adding origins to allow in /etc/cockpit/origins.d, and adding templated origins (with string interpolation for the machine name, the hostname, and the custom domain) to allow in /etc/cockpit/origins-templates.d.
  • (System: administration) The dnsmasq configuration can now be customized by adding templated drop-in configuration files (with string interpolation for the machine name, the hostname, and the custom domain) in /etc/dnsmasq-templates.d, and by modifying the custom domain (which defaults to pkscope) in /etc/custom-domain.
  • (System: administration) The hostapd configuration can now be customized by adding configuration snippets as drop-in files in /etc/hostapd/hostapd.conf.d, and adding templated drop-in files (with string interpolation for the machine name, the hostname, and the custom domain) in /etc/hostapd/hostapd.conf-templates.d.
  • (System: administration) The hosts file can now be customized can now be customized by adding snippets as drop-in files at /etc/hosts.d, and and adding templated snippets (with string interpolation for the machine name, the hostname, and the custom domain) in /etc/hosts-templates.d.
  • (System: administration) SSH host keys for the SSH server are now automatically generated (if deleted or otherwise missing) during every boot, not just during the first boot.
"},{"location":"reference/software/changelog/#changed_3","title":"Changed","text":"
  • (Breaking change; Application: backend) Previously, the segmenter's default behavior was to subtract consecutive masks to try to mitigate image-processing issues with objects which get stuck to the flowcell during imaging. However, when different objects occupied the same space in consecutive frames, the subtraction behavior would subtract one object's mask from the mask of the other object in the following frame, which would produce clearly incorrect masks. This behavior is no longer enabled by default; in order to re-enable it, you should enable the pipeline-subtract-consecutive-masks feature flag in the apps/ps/backend/proc-segmenter package deployment of the local Forklift pallet and re-apply the pallet.
  • (Application: backend, GUI) The image quality of frames in the camera preview stream is increased, and frames also have greater width and height.
  • (Breaking change; Application: GUI) The default settings configuration file for the planktoscopehat SD card image is now for the v2.6 PlanktoScope hardware; previously, it was still for the v2.5 hardware.
  • (Breaking change; System: administration) The minimum supported Forklift version for Forklift pallets has increased from v0.4.0 to v0.7.0, due to new integration between Forklift and the filesystem.
  • (System: administration) Forklift has been upgraded to v0.7.0, so that pallets are staged before being applied (and with automatic fallback to the last successfully-applied staged pallet), and so that systemd services, /etc config files, and some scripts in /usr are now managed by Forklift.
  • (System: administration) /etc is now a overlay filesystem with all manually-edited files saved at /var/lib/overlays/overrides/etc.
  • (System: administration) /usr is now a overlay filesystem with all manually-edited files saved at /var/lib/overlays/overrides/usr.
"},{"location":"reference/software/changelog/#deprecated_1","title":"Deprecated","text":"
  • (System: administration, troubleshooting; Application: GUI) Portainer will no longer be installed/provided by default after v2024.0.0. This is because it requires inclusion of a relatively large Docker container image in the PlanktoScope OS's SD card image (which is constrained to be up to 2 GB in size so that it can be attached as an upload to GitHub Releases), and because it has an annoying first-time user experience (i.e. that a password must be set within a few minutes of boot, or else the Portainer container must be restarted), and because Dozzle already provides all the basic functionalities needed by most users, and because Portainer has never actually been used for troubleshooting within the past year of the project, and because Portainer has a nontrivial impact on the sizes of the PlanktoScope OS SD card images (which are limited to 2 GB).
  • (System: administration; Application: GUI) The \"USB backup\" functionality of the Node-RED dashboard will be removed in v2024.1.0 (the next release after v2024.0.0). Instead, you should use the datasets file browser for backing up and deleting dataset files on your PlanktoScope.
  • (Application: backend) The raspimjpeg-based imaging module in the Python hardware controller has not yet been deleted so that you can change the Python hardware controller code to switch back from the new picamera2-based imaging module if picamera2 ends up causing big problems for you. However, we are deprecating the raspimjpeg-based imaging module, and we will fully delete it in a future release (perhaps v2024.1.0, or perhaps later).
"},{"location":"reference/software/changelog/#fixed_3","title":"Fixed","text":"
  • (Application: GUI) The white balance input validation, which previously only allowed gains between 1.0 and 8.0, now allows gains in the full range allowed by the camera (i.e. between 0.0 and 32.0).
  • (Application: backend, GUI) The incorrect scaling factor for converting between ISO settings (in the Node-RED dashboard) and image gains in the new picamera2-based imager is fixed.
  • (System: networking) Some uncommon edge cases for packet forwarding (e.g. accessing a one of the PlanktoScope's static IP addresses on a network interface not associated with that static IP address) should work now.
"},{"location":"reference/software/changelog/#v202400-alpha1-2024-03-26","title":"v2024.0.0-alpha.1 - 2024-03-26","text":""},{"location":"reference/software/changelog/#changed_4","title":"Changed","text":"
  • (Breaking change; System: setup) The word pscopehat has been replaced with planktoscopehat everywhere. This means that any distro setup scripts/commands you previously used with pscopehat should be changed.
  • (Breaking change; Application: hardware controller) The hardware controller now uses picamera2 instead of raspimjpeg for camera control. This may require different ISO and white balance gains to be used. It also no longer limits the framerate of the camera preview, so the preview stream should adapt to the bandwidth available on your network connection and the system resources available to your web browser; this may increase resource usage on your web browser.
"},{"location":"reference/software/changelog/#deprecated_2","title":"Deprecated","text":"
  • (Application: GUI) The current Node-RED dashboard (both the version for the Adafruit HAT and the version for the PlanktoScope HAT) is transitioning to maintenance mode: no new features will be added, and any bugs will be only be fixed if someone volunteers to fix them. The current Node-RED dashboard will be completely replaced by a fully-rewritten Node-RED dashboard, though there is no timeline for completion of that new dashboard. Currently, our plan for deprecating and eventually removing the current Node-RED dashboard is as follows: maintenance mode (no new features, only some bugfixes), then deprecation (no maintenance; not enabled by default, but still installed), then removal (not installed by default, but anyone is free to install it and see if it still works); deprecation will not occur before the rewritten Node-RED dashboard is stable for general-purpose usage. If you have concerns, please share your feedback on GitHub, in an email, or on the PlanktoScope Slack.
"},{"location":"reference/software/changelog/#fixed_4","title":"Fixed","text":"
  • (Breaking change; Application: backend) The default hardware configuration file for the planktoscopehat SD card image is now for the v2.6 PlanktoScope hardware; previously, it was (incorrectly) a mixture of v2.5 and v2.6 optical settings.
  • (Application: hardware controller) The camera no longer overexposes captured images compared to the camera preview stream, and it no longer produces camera timeout errors.
  • (Application: backend) The segmenter should no longer have file permissions errors when trying to read or write files in directories created by Docker or by the Python hardware controller.
"},{"location":"reference/software/changelog/#v202400-alpha0-2024-02-06","title":"v2024.0.0-alpha.0 - 2024-02-06","text":""},{"location":"reference/software/changelog/#added_3","title":"Added","text":"
  • (System: networking) Added support to share internet access and browser application access over additional network interfaces: a second Wi-Fi module, an additional Ethernet adapter, and a USB networking interface (made by plugging a phone to the Raspberry Pi in USB tethering mode).
  • (Application: GUI) The \"System Monitoring\" page now shows the current system time on the Raspberry Pi and the current time in the web browser of the client device.
  • (Application: GUI) The \"System Monitoring\" page now detects when the Raspberry Pi's system time is very different from the web browser's time, and shows a message and a buttom to change the Raspberry Pi's system time to match the web browser's time.
  • (Application: GUI) The \"System Monitoring\" page's system metrics panel is now collapsible, and it now includes an expandable \"Detailed History\" subsection to view additional information.
  • (System: administration) Added Dozzle as a viewer for Docker container logs.
  • (System: networking) Added lynx as an alternative terminal web browser to w3m for trying to work through captive portals on the Cockpit terminal.
  • (System: administration) Added Prometheus as a metrics collection & storage system.
  • (System: administration) Added Grafana as a metrics visualization & alerting system.
"},{"location":"reference/software/changelog/#changed_5","title":"Changed","text":"
  • (Application: GUI) The \"System Monitoring\" page now uses a Grafana dashboard to display metrics.
  • (Application: GUI) The \"Fluidic Acquisition\" page now uses a numeric text input instead of a slider for adjusting the \"Pumped volume\" setting, to make it easier to change the setting to a different exact value.
  • (Application: GUI) On the \"Sample\" page, the input fields of the \"Sample Location\"/\"Net Throw Location\"/\"Net Retrieval Location\"/\"Culture Date and Time\" panels no longer get cleared when pressing the \"Validate\" button.
  • (System: administration) Docker commands can now be run without sudo.
  • (System: security) ufw has been replaced with firewalld. However, firewalld has not yet been properly configured.
  • (System) The PlanktoScope's machine name is now saved to /var/lib/planktoscope/machine-name instead of /home/pi/.local/etc/machine-name, and it's now saved without a trailing newline.
"},{"location":"reference/software/changelog/#removed_2","title":"Removed","text":"
  • (Application: GUI) The \"System Monitoring\" page no longer displays a gauge for the CPU usage, since that information does not need to be monitored to ensure system stability & usability. Instead, a CPU usage history graph can be found in the new \"Detailed History\" subsection.
  • (System: administration) Removed cockpit-storaged, which was not useful enough to justify the number (and size of) unneeded dependencies it pulled in for the PlanktoScope software SD card image.
  • (System: setup) Removed some unnecessary apt-get update commands for a very minor speed-up in the distro setup process.
"},{"location":"reference/software/changelog/#fixed_5","title":"Fixed","text":"
  • (Application: GUI) The \"Filtered volume\" field (on the \"Sample\" page) is now saved as the sample_total_volume metadata field for all sample types, not just horizontal Plankton tows (corresponding to the \"Plankton net\", \"High Speed Net\", and \"Tara decknet\" sample types).
  • (System) Boot time has been made faster by approximately 1 minute.
  • (Application: GUI) On Mozilla Firefox, the embedded file browser in the Node-RED dashboard's \"Gallery\" page should now consistently load with the correct height, instead of sometimes loading with an absurdly small height.
  • (System: networking) The Raspberry Pi now correctly detects a phone connected in USB tethering mode to share internet access regardless of when the phone was connected, instead of only detecting that phone if USB tethering mode was enabled early in startup (specifically, before the dhcpcd service had started).
  • (System: networking) Functionality for automatically updating the /etc/hosts file and the hostname based on the machine name has now been split into two separate system services, planktoscope-org.update-hosts-machine-name.service and planktoscope-org.update-hostname-machine-name.service.
"},{"location":"reference/software/changelog/#v202390-2023-12-30","title":"v2023.9.0 - 2023-12-30","text":"

(this release involves no changes from v2023.9.0-beta.2; it's just a promotion of v2023.9.0-beta.2 to a stable release)

"},{"location":"reference/software/changelog/#v202390-beta2-2023-12-02","title":"v2023.9.0-beta.2 - 2023-12-02","text":""},{"location":"reference/software/changelog/#added_4","title":"Added","text":"
  • (Application) A hardware configuration file for PlanktoScope hardware v2.6, which was previously missing, has been added. It is now the default hardware configuration file for pscopehat builds of the PlanktoScope distro.
"},{"location":"reference/software/changelog/#changed_6","title":"Changed","text":"
  • (System: infrastructure) Forklift has been upgraded from v0.3.1 to v0.4.0, which includes breaking changes to the schema of Forklift repositories and pallets.
"},{"location":"reference/software/changelog/#removed_3","title":"Removed","text":"
  • (Application: documentation) The offline documentation included on the PlanktoScope now omits the hardware setup guides.
"},{"location":"reference/software/changelog/#fixed_6","title":"Fixed","text":"
  • (Application: GUI) The white balance gains are now only validated and sent to the backend after the user changes focus away from the input field, instead of being validated and sent 300 ms after the user pauses while editing the value in the input field. This prevents the input validation from being run while the user is still editing the value.
  • (Application) The default brightness of the illumination LED for the pscopehat version of the backend (for the custom PlanktoScope HAT) has been reduced; this a temporary workaround to a bug with raspimjpeg where saved images are overexposed even on the default brightness settings with minimum shutter speed and ISO, despite the brightness of raspimjpeg's camera preview looking reasonable (see https://github.com/PlanktoScope/PlanktoScope/issues/259 for details).
  • (Application: GUI) In the \"Sample\" page, when the minimal & maximal fraction size fields and min & max sampling depth fields are both displayed simultaneously, now the adafruithat version of the Node-RED dashboard shows the fraction size fields on one row and the sampling depth fields on another row, rather than showing them in adjacent columns. This way, the adafruithat version of the Node-RED dashboard now matches the layout in the pscopehat version of the Node-RED dashboard.
  • (Application: GUI) The \"System Monitoring\" page now correctly displays the PlanktoScope hardware version in the \"Information\" panel's \"Instrument Type\" field.
  • (Application: GUI) The \"System Monitoring\" and \"Fluidic Acquisition\" pages now display a software version string which is either a tagged version (e.g. v2023.9.0-beta.1) when the version is tagged, or else a pseudoversion (e.g. v2023.9.0-beta.1-36-gf276e84) which contains an abbreviated commit SHA and a list of the number of commits since the last tagged version. This version string is now also used for the acq_software metadata field.
  • (Application: GUI) The process_commit metadata field is now set once again. Now it depends on the new installer script provided by the github.com/PlanktoScope/install.planktoscope.community repo.
  • (Application: GUI) The process_source metadata field is no longer hard-coded in the Node-RED dashboard. Now it depends on the new installer script provided by the github.com/PlanktoScope/install.planktoscope.community repo.
  • (System: infrastructure) The SD card setup scripts now apply the Forklift pallet in order to create the Docker Compose services and resources ahead-of-time (rather than waiting for the first boot to do that work), so that the first boot of the SD card image will be much faster.
  • (System: infrastructure) The distro setup scripts now work even if they are run from a repository downloaded to some path other than /home/pi/PlanktoScope.
  • (Application: GUI) The landing page now links to the new project documentation site for online documentation, instead of the old project documentation site.
"},{"location":"reference/software/changelog/#v202390-beta1-2023-09-14","title":"v2023.9.0-beta.1 - 2023-09-14","text":""},{"location":"reference/software/changelog/#added_5","title":"Added","text":"
  • (System: networking) The PlanktoScope can now also be accessed using the domain name pkscope.local from any web browser where planktoscope.local previously worked. We recommend using http://pkscope.local instead of http://planktoscope.local to access your PlanktoScope, for consistency with other domain name formats (see the \"Changes\" section for details).
  • (System: administration, networking) In operating system's networking configuration files which have lines which are automatically generated based on the PlanktoScope's machine name, those lines now have accompanying code comments which explain the correct files to edit in order to make changes which will persist across device reboots.
  • (System: administration, networking) You can now check the machine name at /home/pi/.local/etc/machine-name. It's updated when the PlanktoScope boots.
  • (System: administration; Application: GUI) The Node-RED dashboard now provides some context on the \"Administration\" page for how to access the logs linked to from that page, and which links to use for providing logs on GitHub or Slack.
  • (System: administration; Application: GUI) The Node-RED dashboard now provides some additional information about the side-effects of selecting a hardware version on the \"Hardware Settings\" page, specifically that the white balance settings will be overwritten.
"},{"location":"reference/software/changelog/#changed_7","title":"Changed","text":"
  • (Major user-facing change; System: networking) The top-level domain for domain names of format home.planktoscope and {machine-name}.planktoscope (e.g. http://metal-slope-23501.planktoscope) has been changed from planktoscope to pkscope, so that the domain names are now of format home.pkscope and {machine-name}.pkscope. Similarly, the machine-specific mDNS name has been changed from format planktoscope-{machine-name}.local to pkscope-{machine-name}.local.
  • (User-facing change; System: networking) The SSIDs of wifi hotspots generated by the PlanktoScope has been changed from the format PlanktoScope {machine-name} to the format pkscope-{machine-name}. This makes it easier to determine the machine-specific mDNS URL: just add .local, to get pkscope-{machine-name}.local (e.g. pkscope-metal-slope-23501.local).
  • (User-facing change; Application: backend) The Python backend now uses the new machine naming scheme everywhere.
  • (System: networking) The default hostname and SSID (used only in certain unexpected situations when a machine name cannot be determined) have both been shortened from planktoscope to pkscope.
  • (System: networking) The SSID format is now specified in /home/pi/.local/etc/hostapd/ssid.snippet, instead of /home/pi/.local/bin/update-ssid-machine-name.sh.
"},{"location":"reference/software/changelog/#deprecated_3","title":"Deprecated","text":"
  • (System: networking) The planktoscope.local mDNS name is no longer recommended. We will continue to support it for the foreseeable future (and definitely for at least one year), but we recommend using pkscope.local or the machine-specific mDNS name (of format pkscope-{machine-name}.local) instead.
  • (Application: backend) The Python backend's logs still print machine names in the old naming scheme, to help instrument operators with the naming scheme transition (so that they can identify how each machine was renamed). The machine names in this old naming scheme will be removed in a future release - probably the next release.
"},{"location":"reference/software/changelog/#removed_4","title":"Removed","text":"
  • (System: administration, networking) The auto-generated /home/pi/.local/etc/cockpit/origins file has been removed, because it does not need to be persisted after being generated. Instead, a temporary file is generated and removed after being used.
  • (System: administration, networking) The default /home/pi/.local/etc/hosts file has been removed from the setup files. Instead, it is now automatically generated by the setup scripts.
"},{"location":"reference/software/changelog/#fixed_7","title":"Fixed","text":"
  • (System: networking) The PlanktoScope no longer generates any machine names or SSIDs which are so long that they prevent the wifi hotspot network from being brought up.
  • (Application: backend) The segmenter no longer crashes and fails to respond immediately after attempting to start segmentation.
  • (Application: preset settings, GUI) The default setting for the pscopehat version of the Node-RED dashboard is now the 300 um capillary, since that version of the hardware is meant to be used with 300 um capillaries. Previously, the default was the 200 um ibidi slide.
  • (Application: preset settings) All default settings for all hardware versions now include a default pixel size calibration of 0.75 um/pixel. Previously, the default settings for v2.1 and v2.3 were missing this setting, which would cause the segmenter to crash when processing datasets generated on PlanktoScopes using the v2.1 or v2.3 hardware settings.
  • (Application: preset settings, GUI) The Node-RED dashboard now correctly lists the selected hardware version in the \"Hardware Settings\" page's \"Hardware Version\" dropdown menu upon startup.
  • (Application: GUI) The Node-RED dashboard now (hopefully) is able to determine the camera type from the Python backend.
"},{"location":"reference/software/changelog/#v202390-beta0-2023-09-02","title":"v2023.9.0-beta.0 - 2023-09-02","text":""},{"location":"reference/software/changelog/#added_6","title":"Added","text":"
  • (System: networking) Traffic is now routed with Network Address Translation between the Ethernet and Wi-Fi network interfaces. This means that if the PlanktoScope has internet access through an Ethernet connection, it will share that internet access to devices connected to its Wi-Fi hotspot; and if the PlanktoScope has internet access through a Wi-Fi connection, it will share that internet access to devices connected to its Ethernet port.
  • (System: networking) Now both 192.168.4.1 and 192.168.5.1 can be used to access your PlanktoScope when your computer is connected directly to it, regardless of whether you are connecting over an Ethernet cable or the PlanktoScope's Wi-Fi hotspot.
  • (System: networking) Previously the PlanktoScope could be connected to from 192.168.4.1 (over Wi-Fi, when running in wireless AP mode), 192.168.5.1 (over Ethernet), and planktoscope.local (over Wi-Fi or Ethernet, from a client device with mDNS support); this meant that Android devices could only connect to the PlanktoScope at 192.168.4.1, as they lack mDNS support. Now, client devices - even those without mDNS support - can connect to the PlanktoScope at home.planktoscope, and/or URLs like clear-field-33719.planktoscope and planktoscope-clear-field-33719.local (where clear-field-33719 is replaced with the PlanktoScope's Raspberry Pi's machine name, which is also part of the name of the PlanktoScope's Wi-Fi network - e.g. \"PlanktoScope clear-field-33719\").
  • (Application: Documentation) An offline copy of the PlanktoScope project documentation is now provided at URL path /ps/docs/ (so e.g. it's accessible at http://home.planktoscope/ps/docs/)
  • (Application: GUI) The Node-RED dashboard's \"Hardware Settings\" page now includes a drop-down menu item to select \"PlanktoScope v2.5\" as an allowed hardware version.
  • (Application: GUI, administration) The Node-RED dashboard now generates a notification whenever it restarts the Python backend. This provides visibility for the user when changing the hardware version triggers a restart of the Python backend.
  • (System: administration, troubleshooting, GUI) A Cockpit system administration dashboard is now installed and made accessible at URL path /admin/cockpit/ (so e.g. it's accessible at http://home.planktoscope/admin/cockpit/).
  • (System: administration, troubleshooting, GUI) A filebrowser instance, allowing you to manage and edit files anywhere in the Raspberry Pi's SD card, is now installed and made accessible at URL path /admin/fs/ (so e.g. it's accessible at http://home.planktoscope/admin/fs/)
  • (System: administration, troubleshooting, GUI) A Portainer administration dashboard for Docker is now installed and made accessible at URL path /admin/portainer/ (so e.g. it's accessible at http://home.planktoscope/admin/portainer/). Note that you will need to open Portainer within a few minutes after booting (or rebooting) your PlanktoScope in order to create an admin account for Portainer.
  • (System: administration) Docker is now installed. We are using it to deliver various applications in a way that will eventually enable safe and easy upgrades.
  • (System: administration, troubleshooting) w3m is now installed, enabling terminal-based interaction with some Wi-Fi network captive portals to obtain internet access on the PlanktoScope. For captive portals which require Javascript, we recommend instead using browsh as a Docker container; we don't provide browsh in the default SD card image because it adds ~250 MB of dependencies to the image.
"},{"location":"reference/software/changelog/#changed_8","title":"Changed","text":"
  • (User-facing change; System: administration) The file browser on port 80 for viewing datasets has now been moved to path /ps/data/browse/ (so e.g. it's accessible at http://home.planktoscope/ps/data/browse/ ), and it is now implemented using filebrowser, so that now you can delete folders, download folders, preview images, etc. As before, you can still access this from the \"Gallery\" page of the Node-RED dashboard.
  • (User-facing change; Application: GUI) If you navigate the PlanktoScope in your web browser on port 80 (or without specifying a port) (e.g. with URLs like http://home.planktoscope or http://planktoscope.local), your browser will show a landing page with a list of links for easy access to the Node-RED dashboard, documentation, other embedded applications, and reference information about your PlanktoScope.
  • (User-facing change; Application: GUI) Previously, the Node-RED dashboard was accessed on the path /ui on port 1880, e.g. with URLs like http://planktoscope.local:1880/ui or http://192.168.4.1:1880/ui; now, it should be accessed via a link on the landing page.
  • (User-facing change; System: networking) Previously, PlanktoScope machine names were generated as gibberish words like \"Babaxio-Detuiau\", and the machine names were used as the names of the private Wi-Fi networks generated by the PlanktoScope in wireless AP mode. However, the machine names created by this naming scheme were often difficult to pronounce, remember, and type for people in various languages, and the naming scheme sometimes generated names which sounded like curses or insults in some languages. Now, PlanktoScope machine names are generated as a combination of two words and a number up to five digits long; words are selected from pre-built lists in a language which can be chosen based on localization settings. Currently, word lists are only provided in US English, resulting in names like \"metal-slope-23501\", \"conscious-pocket-1684\", and \"plant-range-10581\"; however, word lists can be added for other languages in the future, and a user interface will eventually be provided for changing localization settings.
  • (User-facing change; Application: GUI) Selecting a hardware version on the \"Hardware Settings\" page of the Node-RED dashboard now causes a default hardware preset for that version to overwrite the entire hardware.json file, and the Node-RED dashboard will reload the settings; this prevents the hardware.json file from being changed into an inconsistent mixture of settings for different hardware versions, which was the previous (incorrect) behavior. The description on the \"Hardware Settings\" page is also now more specific about what happens when a hardware version is selected.
  • (User-facing change; Application: GUI, troubleshooting) Previously, the Node-RED dashboard's \"Administration\" page merged log entries from every component of the Python backend and the Node-RED dashboard. Now, the Node-RED dashboard instead displays links to separate Cockpit log-viewing pages (which by default are accessed with username pi and password copepode) for the Node-RED dashboard, the backend's hardware controller, and the backend's segmenter, and links to filebrowser directories for all log files created by the backend's hardware controller and segmenter.
  • (User-facing change; System: GUI) Previously, the Node-RED flow editor was accessed directly on port 1880, e.g. with URLs like http://planktoscope.local:1880 or http://192.168.4.1:1880; now, it should be accessed via a link on the landing page .
  • (System: networking) Previously, PlanktoScopes all had planktoscope as their hostname. Now, the hostname is of the format planktoscope-<machine-name>, e.g. planktoscope-metal-slope-23501 or planktoscope-plant-range-10581.
  • (Likely user-facing change; System: networking) The default Wi-Fi country has been changed from FR (France) to US (USA).
  • (Likely user-facing change; System: networking) Previously the autohotspot script considered receiving an IP address assignment from the connected Wi-Fi network as the criterion for determining whether the Wi-Fi connection was successful. Now the autohotspot script tries to ping google.com to determine whether the connection was successful, so that the autohotspot script will revert to wireless AP mode if no internet access is available over the Wi-Fi network (e.g. if the connected Wi-Fi network is actually behaving like a captive portal, which would prevent the PlanktoScope from being accessed via a VPN over the internet - in which case the PlanktoScope would become accessible only over an Ethernet cable). This change is meant to make it easier to fix a PlanktoScope's Wi-Fi connection configuration when that configuration makes internet access impossible.
  • (System: networking, troubleshooting) Previously the autohotspot script would print the MAC addresses and SSIDs of all Wi-Fi networks found by scanning. Now it only prints the SSIDs of Wi-Fi networks found by scanning and avoids printing duplicate SSIDs, for more concise service logs.
  • (System: networking, troubleshooting) When the autohotspot script fails to connect to google.com, it will also print some diagnostic information by attempting to ping 1.1.1.1 (the static IP address of Cloudflare DNS, so a ping without DNS lookup) and checking whether the Wi-Fi network assigned an IP address to the Raspberry Pi, and reporting the results. This enables better troubleshooting of internet access issues on Wi-Fi networks.
  • (System: networking) Previously the autohotspot script was run every 5 minutes to scan for available Wi-Fi networks. Now it is run every 2 minutes, so that the PlanktoScope will connect more quickly to a Wi-Fi network which has just appeared.
  • (System: networking) Previously the autohotspot script and the dhcpcd service would both try to manage when to start and stop the dnsmasq service. Now, the dnsmasq service always runs. This change was made to simplify the network configuration so that it would be easier to understand, troubleshoot, and maintain.
  • (System: networking) Previously the autohotspot script would use a mixture of dhcpcd and wpa_supplicant as entrypoints for Wi-Fi network connection management. Now, dhcpcd is used to manage wpa_supplicant, and the autohotspot script only interacts with dhcpcd. This change was made to simplify the network configuration so that it would be easier to understand, troubleshoot, and maintain. Note that, in the future, wpa_supplicant and dhcpcd may be replaced with NetworkManager.
  • (System: networking) The autohotspot script has undergone a major refactoring, which may accidentally introduce bugs.
  • (Application: Backend, GUI) The Node-RED dashboard no longer supervises the Python backend; instead, it delegates that work to systemd.
  • (Application: Backend) Log files from the Python backend are no longer saved to /home/pi, but instead to subdirectories for the backend components under /home/pi/device-backend-logs. Note: the locations of log files may be changed again in the future, and/or file logging may be changed to use a different systemd-based mechanism in the future.
  • (System) The /usr/bin/stepper-disable and /usr/bin/autohotspotN scripts have been moved to /home/pi/.local/bin/release-gpio-steppers.sh and /home/pi/.local/bin/autohotspot.sh, respectively.
  • (System) The gpio-init.service systemd service has been renamed to planktoscope-org.init-gpio-steppers.service.
  • (System) Previously the en_DK.UTF-8 locale was used for everything. Now it is only used for time, measurements, and paper dimensions, and the en_US.UTF-8 locale is the base locale for everything else. In the future we may provide GUI functionality for changing the base locale.
  • (System) The chrony configuration has been simplified, but it may be broken.
  • (System) The default timezone is now officially set to UTC, and we will be using UTC as the standard system time zone for all PlanktoScopes. Previously, the pre-built SD card images provided by this project used UTC as the timezone, but the \"Expert Setup\" instructions for manually setting up the PlanktoScope software did not specify a time zone to use.
  • (System, Dependencies) The base OS is now the 2023-05-03 release of Raspberry Pi OS Bullseye.
  • (Application: Backend, Dependencies) The Python backend and Node-RED dashboard's indirect dependencies are now version-locked to improve the reproducibility of the OS setup script independently of when the script is run.
"},{"location":"reference/software/changelog/#deprecated_4","title":"Deprecated","text":"
  • (Application: GUI) In a future release (potentially as early as v2023.12.0), the Node-RED editor and Node-RED dashboard will not be accessible at all over port 1880. In this release, you can still access the Node-RED dashboard at path /ps/node-red-v2/ui on port 1880, but the embedded image streams and file gallery will not be properly displayed; and you can access the Node-RED editor at path /admin/ps/node-red-v2 on port 1880. However, you should instead access the Node-RED editor and Node-RED dashboard via the links on the PlanktoScope's landing page.
  • (Application: GUI) In a future release (timeline not yet decided), the version of the Node-RED dashboard for the Adafruit HAT will stop receiving new features even as the version of the Node-RED dashboard for the custom PlanktoScope HAT continues receiving new features. However, we will continue to fix bugs in the Node-RED dashboard for the Adafruit HAT, and we will continue to build SD card images for the Adafruit HAT which will also include new features in other software components.
"},{"location":"reference/software/changelog/#removed_5","title":"Removed","text":"
  • (User-facing removal; Application: GUI) The Node-RED dashboard no longer allows selection of \"PlanktoScope v1.0\" or \"PlanktoScope v2.2 (waveshare HAT)\" as the hardware version. Those hardware versions are no longer supported by the software.
  • (User-facing removal; System: networking) Now planktoscope.local only works for devices connected directly to the PlanktoScope, either via an Ethernet cable or over Wi-Fi when the PlanktoScope is running in wireless AP mode. planktoscope.local no longer works on other networks, such as LANs or mesh VPNs, which the PlanktoScope might be connected to. On such networks, the machine-specific mDNS name (of format planktoscope-<machine-name>.local) should be used instead.
  • (System: administration) The Git-based software update system (exposed in the Node-RED dashboard's \"Adminisration\" page) has been removed, since it was reported to behave problematically anyways. In the future, we will use a system based on Docker for safer and easier software updates.
"},{"location":"reference/software/changelog/#fixed_8","title":"Fixed","text":"
  • (Major fault-tolerance improvement; Application: GUI) When an invalid value is entered for the red or blue white balance gain on the Node-RED dashboard's \"Optic Configuration\" page, that value is now ignored, a notification is displayed about the invalid value, and the white balance gain is reset to the last valid value (loaded from the hardware.json configuration file). This fixes issue #166 by preventing the Node-RED dashboard from saving an invalid value to the hardware.json file, which would crash the Python hardware controller after the next boot (or after the next time the Python hardware controller was restarted).
  • (Major quality-of-life improvement; Backend: dependencies) The adafruit-blinka and adafruit-platformdetect dependencies are now updated to their latest version, so that Python hardware controller will work on PlanktoScopes with recent (i.e. post-2021) versions of the Adafruit HAT.
  • (Application: GUI, troubleshooting) Previously, the Node-RED dashboard would often fail to display the log output from the Python backend. Now, it should always make the logs accessible (either by the links to Cockpit log viewer or by the links to the log file browser).
  • (System: networking) Previously the autohotspot script would not ignore any networks which were commented out in the /etc/wpa_supplicant/wpa_supplicant.conf file when checking if any networks found by scanning matched networks were specified in the wpa_supplicant.conf file; now it ignores them, so that commented-out networks don't incorrectly prevent the autohotspot from going into wireless AP mode.
  • (System: networking) Previously the autohotspot script would always wait 20 seconds after attempting to connect to a Wi-Fi network before checking whether the connection was successful, even if it didn't actually need to wait 20 seconds. Now the autohotspot script repeatedly attempts to ping google.com with a timeout of 2 seconds per attempt and a maximum of 10 attempts, so that the autohotspot script only waits as long as a necessary to determine that a Wi-Fi network connection has succeeded.
  • (System: networking) Previously the autohotspot script could decide that the SSID scan results were available even if no SSIDs were found (despite local Wi-Fi networks being active). Now an empty SSID scan result is treated as a condition where a re-scan is required.
  • (System: networking) Previously the log messages from the autohotspot script had inconsistent capitalization and grammar, and slightly unclear wording. Those have now been made more clear and consistent.
"},{"location":"reference/software/changelog/#v230-2021-12-20","title":"v2.3.0 - 2021-12-20","text":""},{"location":"reference/software/changelog/#added_7","title":"Added","text":"
  • A basic working image segmenter.
  • Direct connections over Ethernet.
  • A \"Lab culture\" sample type, where location is set to the South Pole, and sample collection time and date are set by default to the current time and date on the Raspberry Pi but can be changed. (#74)
  • A \"Test\" sample type, where location is set to the South Pole, and sample collection time and date are always set to the current time and date on the Raspberry Pi.
  • A selector in the Node-RED dashboard for the machine hardware version (#98)
"},{"location":"reference/software/changelog/#changed_9","title":"Changed","text":"
  • Various parts of the UI (we do not have a list of specific changes).
  • Node-RED is now upgraded to v2.0 (#97)
  • The base OS is now the 2021-12-03 release of Raspberry Pi OS Buster.
"},{"location":"reference/software/changelog/#fixed_9","title":"Fixed","text":"
  • Various issues with accessing the Node-RED dashboard via http://planktoscope.local:1880/ui .
  • Various issues with Node-RED (#80, #91, #87, #96)
"},{"location":"reference/software/changelog/#v221-2021-05-10","title":"v2.2.1 - 2021-05-10","text":""},{"location":"reference/software/changelog/#added_8","title":"Added","text":"
  • The ability for developers to change the PlanktoScope repository to a development branch from the Node-RED dashboard.
"},{"location":"reference/software/changelog/#fixed_10","title":"Fixed","text":"
  • Various bugs (we do not have a list of specific changes)
"},{"location":"reference/software/changelog/#v220-2021-02-23","title":"v2.2.0 - 2021-02-23","text":""},{"location":"reference/software/changelog/#added_9","title":"Added","text":"
  • Support for Raspberry Pi HQ cameras.
  • Control of image white balance.
  • A Node-RED dashboard panel to copy all data from /home/pi/data to a USB drive.
  • Integrity check of the generated files (for now only for raw pictures and metadata.json files). A file called integrity.check is created alongside the images. This file contains one line per file, with the filename, its size and a checksum of both its filename and its content.
  • A file gallery to browse data files in the /home/pi/data directory.
  • A way to update the PlanktoScope software repository on the Raspberry Pi.
  • A Node-RED dashboard panel to choose a wifi network to connect to.
  • A Node-RED tab to enter the configuration of the hardware.
"},{"location":"reference/software/changelog/#changed_10","title":"Changed","text":"
  • (Breaking change) The UI has been changed (we do not have a list of specific changes)
"},{"location":"reference/software/changelog/#fixed_11","title":"Fixed","text":"
  • Random camera crash solved: instead of using the python picamera library, we now use a compiled binary, raspimjpeg, controlled through a FIFO pipe
"},{"location":"reference/software/changelog/#v210-2020-10-14","title":"v2.1.0 - 2020-10-14","text":""},{"location":"reference/software/changelog/#added_10","title":"Added","text":"
  • If the Raspberry Pi is configured (via the /etc/wpa_supplicant/wpa_supplicant.conf file) to connect to an existing wifi network, it will try to connect to the network; and it will only start its own wifi hotspot if it failed to connect.
  • If the Raspberry Pi is connected to the internet via its Ethernet port, it will share internet access to devices connected to the Raspberry Pi's wifi hotspot.
  • (Documentation) Information has been added about ribbon cable assembly.
  • (Documentation) Information has been added about how to back up the SD card.
"},{"location":"reference/software/changelog/#changed_11","title":"Changed","text":"
  • (Breaking change) The OS is now based on Raspberry OS Lite, so there is no graphical desktop.
  • (Breaking change) The wifi network is now named PlanktoScope, and the password to it is now copepode.
  • (Breaking change) The default user is now pi, and the default password is copepode for this user.
  • (Breaking change) All raw and processed data files are now stored in the directory /home/pi/data.
  • The software has undergone a major refactoring, which may accidentally introduce some bugs.
"},{"location":"reference/software/product-specs/","title":"Product Specifications","text":"

The PlanktoScope OS includes all software which needs to run on the PlanktoScope's hardware to provide the overall functionality of a PlanktoScope. Product specifications for the PlanktoScope OS are listed below for ranges of software version numbers. To see software versions listed individually in chronological order, refer to the project release notes or the software changelog. To understand how to interpret software version numbers, refer to our description of the PlanktoScope OS's version numbering system.

"},{"location":"reference/software/product-specs/#v202400","title":"v2024.0.0","text":"

Specs for v2024.0.0 are the same as in v2023.9.0, except for the following sections:

  • Base operating system: the binary target architecture has changed from 32-bit to 64-bit.
  • System performance: on-board image processing speeds have improved (processing speeds have nearly doubled).
"},{"location":"reference/software/product-specs/#functionalities","title":"Functionalities","text":"

Regular operation:

  • Image acquisition: stop-flow imaging (JPEG image output)
  • On-board image processing: detection and segmentation of objects (batch-processing only)
  • User interfacing: graphical interface accessible through web browser of a connected phone, tablet, or computer
  • Export of data for uploading to EcoTaxa

Advanced operations:

  • User interfacing: web browser interfaces for system administration, system monitoring, and troubleshooting
  • Automation: MQTT-based API
  • Application deployment: ability to add software as OCI containers using Docker, optionally via Forklift
  • System configuration: ability to reversibly add, remove, replace, or override OS configuration files via Forklift
"},{"location":"reference/software/product-specs/#base-operating-system","title":"Base operating system","text":"
  • Distro: Raspberry Pi OS 11 (bullseye)
  • Binary target architecture: 64-bit (aarch64, also known as arm64)
"},{"location":"reference/software/product-specs/#supported-hardware","title":"Supported hardware","text":"

Minimum for image acquisition (but not sufficient for on-board image processing):

  • PlanktoScope: hardware v2.1 with Raspberry Pi 4 Model B computer
  • Memory: 1 GB RAM
  • Storage: 8 GB capacity

Minimum for full functionality, including on-board image processing:

  • Memory: 4 GB RAM

Recommended:

  • PlanktoScope: hardware v2.5 or v2.6 with Raspberry Pi 4 Model B computer
  • Storage: 32 GB capacity

Forwards-incompatibilities:

  • Unable to run on the Raspberry Pi 5 computer.

Backwards-incompatibilities:

  • Might still work on a Raspberry Pi 3 Model B+ computer or a Raspberry Pi 4 Model B computer with 1 GB of RAM, but compatibility is not tested.
"},{"location":"reference/software/product-specs/#system-performance","title":"System performance","text":"

With minimum supported hardware for full functionality:

  • On-board image processing: a dataset of 400 raw images is processed in approximately 1 hour
"},{"location":"reference/software/product-specs/#v202390","title":"v2023.9.0","text":""},{"location":"reference/software/product-specs/#functionalities_1","title":"Functionalities","text":"

Regular operation:

  • Image acquisition: stop-flow imaging (JPEG image output)
  • On-board image processing: detection and segmentation of objects (batch-processing only)
  • User interfacing: graphical interface accessible through web browser of a connected phone, tablet, or computer
  • Export of data for uploading to EcoTaxa

Advanced operations:

  • User interfacing: web browser interfaces for system administration, system monitoring, and troubleshooting
  • Automation: MQTT-based API
  • Application deployment: ability to add software as OCI containers using Docker, optionally via Forklift
"},{"location":"reference/software/product-specs/#base-operating-system_1","title":"Base operating system","text":"
  • Distro: Raspberry Pi OS 11 (bullseye)
  • Binary target architecture: 32-bit only (armhf, also known as armv7)
"},{"location":"reference/software/product-specs/#supported-hardware_1","title":"Supported hardware","text":"

Minimum for image acquisition (but not sufficient for on-board image processing):

  • PlanktoScope: hardware v2.1 with Raspberry Pi 4 Model B computer
  • Memory: 1 GB RAM
  • Storage: 8 GB capacity

Minimum for full functionality, including on-board image processing:

  • Memory: 4 GB RAM

Recommended:

  • PlanktoScope: hardware v2.5 or v2.6 with Raspberry Pi 4 Model B computer
  • Storage: 32 GB capacity

Forwards-incompatibilities:

  • Unable to run on the Raspberry Pi 5 computer.

Backwards-incompatibilities:

  • Might still work on a Raspberry Pi 3 Model B+ computer or a Raspberry Pi 4 Model B computer with 1 GB of RAM, but compatibility is not tested.
"},{"location":"reference/software/product-specs/#system-performance_1","title":"System performance","text":"

With minimum supported hardware for full functionality:

  • On-board image processing: a dataset of 400 raw images is processed in approximately 1.5 to 2 hours
"},{"location":"reference/software/product-specs/#v23","title":"v2.3","text":""},{"location":"reference/software/product-specs/#functionalities_2","title":"Functionalities","text":"

Regular operation:

  • Image acquisition: stop-flow imaging (JPEG image output)
  • On-board image processing: detection and segmentation of objects (batch-processing only)
  • User interfacing: graphical interface accessible through web browser of a connected phone, tablet, or computer
  • Export of data for uploading to EcoTaxa

Advanced operations:

  • Automation: MQTT-based API
"},{"location":"reference/software/product-specs/#base-operating-system_2","title":"Base operating system","text":"
  • Distro: Raspberry Pi OS 11 (bullseye)
  • Binary target architecture: 32-bit only (armhf, also known as armv7)
"},{"location":"reference/software/product-specs/#supported-hardware_2","title":"Supported hardware","text":"

Minimum for image acquisition (but not sufficient for on-board image processing):

  • PlanktoScope: hardware v2.1 with Raspberry Pi 3 Model B+ computer
  • Memory: 1 GB RAM
  • Storage: 8 GB capacity

Minimum for full functionality, including on-board image processing:

  • PlanktoScope: hardware v2.1 with Raspberry Pi 4 Model B computer
  • Memory: 4 GB RAM

Recommended for full functionality:

  • PlanktoScope: hardware v2.5 or v2.6
  • Storage: 32 GB capacity

Forwards-incompatibilities:

  • Unable to run on the Raspberry Pi 5 computer.
  • Incompatible with Adafruit Stepper Motor HATs (used in PlanktoScope hardware v2.1) manufactured after mid-2022.
"},{"location":"reference/software/product-specs/#system-performance_2","title":"System performance","text":"

With minimum supported hardware for full functionality:

  • On-board image processing: a dataset of 400 raw images is processed in approximately 1.5 to 2 hours
"},{"location":"reference/software/release-process/","title":"Release Process","text":"

The PlanktoScope's software is released independently of the PlanktoScope's hardware; this document explains how we manage releases of the PlanktoScope OS (which contains the software which runs on a PlanktoScope, and which you can download as an SD card image), to help you to:

  • Understand what you should do when we publish a new release of the PlanktoScope OS.
  • Interpret the software product specifications and the software changelog.
"},{"location":"reference/software/release-process/#version-numbering","title":"Version numbering","text":"

The PlanktoScope OS is a combination of many individual software components; some components (such as most parts of the PlanktoScope's graphical user interface, and some of its hardware drivers) are written, maintained, and distributed by the PlanktoScope project, while other components (such as the Cockpit administration dashboard and the file browser) are written, maintained, and distributed by other open-source software projects. Each component has its own release schedule and version numbering system; the specific combination of releases and versions of all these components will change over time as these components change, and we represent each total combination of all software components by a version number assigned to a particular release of the PlanktoScope OS. For example, the v2023.9.0 release of the PlanktoScope OS included various software programs at one specific combination of versions, while the v2024.0.0 release upgraded some of those programs to newer versions.

We use a calendar-based version numbering system for the PlanktoScope OS, where each version number has the format v(year).(minor).(patch) for stable releases of the software or v(year).(minor).(patch)-(modifier) for testing pre-releases of the software:

  • year is a 4-digit number representing the year (in the Gregorian calendar) in which the stable release is (or will be) published. For example, version v2024.0.0 was published in 2024, while version v2025.0.0 will be published in 2025.

  • minor is a number which starts at 0 for the first release in each year, and increments by 1 for each release which adds new features or includes notable changes to existing features. Usually minor will be incremented one or two times each year. For example, version v2024.0.0 was the first version published in 2024, while version v2024.1.0 will be the second version with notable changes to be published in 2024.

  • patch is a number which starts at 0 for each (year).(minor) combination, and increments by 1 for each release which consists only of small bug fixes. For example, if there were some small bugs in v2024.0.0 which we wanted to patch before a v2024.1.0 release, we could add those patches as part of a (hypothetical) v2024.0.1 release. If the bugs are not very severe, we might not publish a patch release and we could instead just include those bug fixes together with other new features, in which case we would increment minor with the next release. For example, we might not publish a v2024.0.1 release, and instead just publish a v2024.1.0 release.

  • modifier is an additional string included to identify \"alpha\" or \"beta\" pre-releases published for testing before the stable release. We typically publish multiple \"alpha\" and \"beta\" pre-releases with additional improvements before a stable release, so modifier has the format of either alpha.(index) or beta.(index), where index is a number which starts at 0 for each (year).(minor).(patch)-alpha or (year).(minor).(patch)-beta combination. For example, the first \"alpha\" pre-release for v2024.0.0 was v2024.0.0-alpha.0, the second \"alpha\" pre-release was v2024.0.0-alpha.1, and the first \"beta\" pre-release was v2024.0.0-beta.0.

"},{"location":"reference/software/release-process/#release-channels","title":"Release channels","text":"

The PlanktoScope project uses a concept called \"release channels\" to structure our process for stabilizing and testing our software before we publish a new release of the PlanktoScope OS for everyone to use. There are three channels for PlanktoScope software releases and pre-releases, each corresponding to a particular branch of the PlanktoScope repository on GitHub:

  • Edge: On the \"Edge\" channel, the PlanktoScope OS is built from the setup scripts on the latest commit of the master branch of the PlanktoScope repository on GitHub - so the \"Edge\" channel is essentially the current unstable development version of the PlanktoScope OS, and is often likely to be broken or buggy in various ways. Occasionally, specific commits on the master branch are tagged as \"alpha\" pre-releases; \"alpha\" pre-releases should be treated as snapshots of PlanktoScope software development for testing by PlanktoScope software developers and advanced users.
  • Beta: Once an \"alpha\" pre-release has received sufficient testing for the PlanktoScope software developers to consider it stable enough for all PlanktoScope users to test it out, it will be promoted to a \"beta\" pre-release, and the software/beta branch of the PlanktoScope repository on GitHub will be advanced to the Git commit of the \"beta\" pre-release. At that point, the software/beta branch will only receive patches to fix serious errors. As bugs are fixed on the software/beta branch, more \"beta\" pre-releases may be created on that branch for users to test.
  • Stable: After the latest \"beta\" pre-release has received sufficient testing for the PlanktoScope software developers to consider it stable enough for most (or, ideally, all) PlanktoScope users to rely on it for production use and scientific operations, that \"beta\" pre-release will be promoted to a \"stable\" release, and the software/stable branch of the PlanktoScope repository on GitHub will be advanced to the git commit of the \"stable\" release.
"},{"location":"reference/software/release-process/#release-schedules","title":"Release schedules","text":"

We try to publish a few stable releases every year. Some stable releases may consist of small bugfixes, while other stable releases may add new functionalities or change existing functionalities. Thus, each release involves changes with different sizes of potential impact on software stability and different levels of risks for introducing new bugs. Because of this, we usually cannot make confident predictions about how long we will need to wait before we can promote an \"alpha\" pre-release to a \"beta\" pre-release. And because we rely on volunteers to test our \"beta\" pre-releases and the availability of volunteers for testing each \"beta\" pre-release often varies a lot, we cannot make confident predictions about how long we will need to wait before we can promote a \"beta\" pre-release to a \"stable\" release.

Although the unpredictability of \"alpha\" and \"beta\" pre-release testing timelines prevents us from being able to set realistic expectations about specific software release timelines, you can generally expect at least one stable release in the first half of each year, and at least one stable release in the second half of each year.

"},{"location":"reference/software/release-process/#choosing-a-release-channel","title":"Choosing a release channel","text":"

Unless you have a specific reason, you probably should follow the stable release channel. \"Stable\" releases are intended for a general audience to rely on.

However, we encourage all PlanktoScope users who use the stable release channel to also test beta pre-releases once those pre-releases are published. This will help us to discover and understand bugs which we may need to fix before promoting the PlanktoScope software from the \"Beta\"\" channel to the \"Stable\" channel.

"},{"location":"reference/software/release-process/#upgrading-to-a-new-release-or-pre-release","title":"Upgrading to a new release or pre-release","text":"

In order to use a new release or pre-release of the PlanktoScope OS, you will need to do one of the following:

  • Download the new SD card image for that release/pre-release, following the standard installation process.

  • Create a new custom SD card image for that release/pre-release, following the non-standard installation process.

Then you will need to re-flash your PlanktoScope's SD card (or flash a new SD card for your PlanktoScope) with the resulting SD card image for the new release/pre-release of the PlanktoScope OS.

"},{"location":"reference/software/architecture/os/","title":"Operating System","text":"

When you flash an SD card image with the PlanktoScope software as part of PlanktoScope's software setup process, that SD card image consists of the PlanktoScope OS. This document describes the architecture of the PlanktoScope OS as an operating system, in order to explain:

  • How the PlanktoScope software abstracts over the PlanktoScope hardware.

  • How the PlanktoScope manages the execution of software programs intended to run on the PlanktoScope.

This information is intended to help you understand:

  • The overall design of the PlanktoScope OS, including what functionalities it provides and what software it includes, and why we made certain design decisions.

  • How various software functionalities and responsibilities in the PlanktoScope are divided among the various programs in the PlanktoScope OS.

  • How various programs in the PlanktoScope OS support other programs which provide the PlanktoScope's high-level/end-user functionalities.

  • What tools you can use to perform software troubleshooting and system administration tasks with the PlanktoScope.

  • What kinds of new software you can develop and deploy to run on a PlanktoScope.

Each SD card image of the PlanktoScope's software consists of an operating system for the PlanktoScope; the definition of the term \"operating system\" can be tricky to demarcate, but for practical purposes this document follows Bryan Cantrill's characterization of the operating system as the special program that:

  • \"Abstracts hardware to allow execution of other programs.\"
  • \"Defines the liveness of the machine: without it, no program can run.\"
  • Provides some important components including the operating system kernel, libraries, commands, daemons, and other facilities.

This definition is a reasonable description of the PlanktoScope OS, because it's a program which abstracts the following hardware subsystems in a way that enables you to run other programs on the PlanktoScope which need to control or otherwise interact with the PlanktoScope's hardware:

  • A Raspberry Pi computer.

  • Various input/output devices such as actuators (e.g. the pump, the sample focus-adjustment actuators, and the illumination LED), sensors (e.g. the camera and the GPS module), and information storage devices (e.g. the real-time clock and the EEPROM).

"},{"location":"reference/software/architecture/os/#software-deployment-execution","title":"Software deployment & execution","text":"

In order to abstract the Raspberry Pi computer hardware to enable execution of other programs, the PlanktoScope OS merely uses software provided by other open-source projects:

  • The PlanktoScope OS is based on - and includes everything from the \"Lite\" image of - the Raspberry Pi OS (which in turn is based on Debian Linux), which provides abstractions for the Raspberry Pi's computer hardware via its custom Linux kernel and its included libraries. We use the Raspberry Pi OS because it provides Raspberry Pi-specific hardware support which we need and which is not easy to achieve with other Linux distros; and because it is the Linux distro with the best combination of familiarity, optimization, and maturity for the Raspberry Pi.

  • Lower-level system services - including services which we've added on top of the default Raspberry Pi OS - are launched and supervised by systemd, which provides a system and service manager. We use systemd because the Raspberry Pi OS provides it and relies on it.

  • Most of the PlanktoScope's software is (or eventually will be) executed as Docker containers by the dockerd daemon (which in turn is run by the docker.service systemd service). In the PlanktoScope OS, all Docker containers are declaratively specified, configured, and integrated together as Docker Compose applications. We use Docker because it enables us to isolate programs from each other so that they interact only in specifically-defined ways; this makes it easier for us to configure, integrate, distribute, and deploy the various programs running on the PlanktoScope.

The PlanktoScope OS is a 64-bit operating system.

"},{"location":"reference/software/architecture/os/#boot-sequence","title":"Boot sequence","text":"

Because the PlanktoScope OS is a systemd-based Linux system running on the Raspberry Pi, the PlanktoScope's initial boot sequence is described by external documentation of:

  • The Raspberry Pi 4/5's boot flow, which consists of two bootloader stages to load the Raspberry Pi's firmware from the Raspberry Pi's SD card; in turn, the firmware loads the Linux kernel from the Raspberry Pi's SD card.

  • Debian's system initialization, which consists of an initramfs stage after the Linux kernel is loaded, followed by a stage for mounting the full filesystem from the Raspberry Pi's SD card and transferring control to the systemd init process as the root user-space process.

  • The systemd system manager's boot behavior, which initializes all necessary filesystems, drivers, and system services.

The systemd system manager starts a variety of services added by the PlanktoScope OS which do not exist in the default installation of the Raspberry Pi OS, such as docker.service. The startup ordering relationships between those services are listed in our reference document about services in the startup process.

"},{"location":"reference/software/architecture/os/#system-upgrades","title":"System upgrades","text":"

Traditional Linux distros such as the Raspberry Pi OS are designed to run software directly on the host OS using a shared collection of programs and system libraries provided by the Linux distro, and with programs and libraries installed and upgraded in-place directly on the host OS via the package managers provided by the distro, such as APT and pip. This causes the following challenges for system administration on the PlanktoScope:

  • These packages are not atomic in how they perform system upgrades of installed libraries and programs, so they can fail during the upgrade process (e.g. due to loss of power) in a way that leaves the system in an unknown and un-reproducible state. Such a state can be hard to revert or recover from, short of wiping and re-flashing the Raspberry Pi's SD card with a new OS installation; this would cause the loss of any OS customizations (e.g. installation of additional software) made by the user.

  • If an upgrade of all installed programs and libraries results in a system with problems (e.g. bugs in the new version of an installed program), it is hard to completely revert the system to the previous state. Thus, software upgrades involve a trade-off between extra work (e.g. to backup the SD card image before any upgrade) and extra risk (e.g. of software breakage which is hard to revert due to lack of backups).

  • Making certain customizations to the OS, such as adding additional programs/libraries or modifying system configuration files, increases the risk of configuration drift in which the system's actual state increasingly diverges over time from the state expected by the PlanktoScope's software maintainers, and thus becomes harder to understand, troubleshoot, or replace. User customizations to the OS cannot be easily separated from the default configuration of the OS, so it is complicated to copy only those customizations in order to drop them onto a fresh installation of the OS from a newer release - especially if the updated OS includes changes to default configurations which conflict with the user customizations.

  • Some Python packages required by PlanktoScope-specific programs (namely the PlanktoScope hardware controller and the PlanktoScope segmenter, which are both described in later sections of this document), such as picamera2 and opencv-python-headless, can only be installed as pre-built wheels from piwheels (which is used instead of PyPi because the PlanktoScope OS is not yet able to run as a 64-bit operating system) when certain versions of system libraries are installed, or else they must be re-compiled from source (which is prohitively slow on the Raspberry Pi for the affected Python packages). This makes dependencies more complicated to manage in maintenance of the PlanktoScope OS for creating and releasing new SD card images with updated software. The reliance on system libraries also increases the risk that a user-initiated upgrade or removal of some of the system's installed APT packages could cause breakage of some pip-managed Python packages which had been installed before the change.

All of the factors listed above increase the perceived risk (and/or the required effort for sufficient mitigation of that risk) of accidentally degrading system integrity by keeping all software on the OS up-to-date, which makes it harder for users to receive bugfixes, security patches, and new features in a timely manner. Indeed, outside of systems like phones and Chromebooks (whose operating systems automatically update themselves), it is common for users of operating systems to avoid installing security updates or OS upgrades out of a fear of breaking their installed software; this is especially common for users who rely on software to operate other scientific instruments, and for good reasons! But the PlanktoScope project currently does not have enough resources to be able to support users stuck on old versions of the PlanktoScope OS; instead, we want to make it easy and safe for all users to always keep their PlanktoScopes - even with customizations to the OS - automatically updated to the latest version of the PlanktoScope OS. We intend to achieve this by:

  • Running all PlanktoScope-specific programs which require system libraries (e.g. the PlanktoScope's Python-based programs) in Docker containers - with the required versions of the required system libraries bundled inside those containers - to isolate them from the host OS's libraries installed via APT. This way, APT packages will always be safe to add, upgrade, and remove on the host OS with negligible risk of interfering with PlanktoScope-specific software.

  • Enabling (almost) all software not provided by the default installation of the Raspberry Pi OS to be upgraded and downgraded in-place - either as container images or as replacements of files on the filesystem - with just a reboot. This way, software upgrades can be reverted in-place in case new bugs are introduced, and SD cards will only need to be re-flashed with new images once every few years (i.e. after a new major version of the Raspberry Pi OS is released).

  • Enabling most types of user-initiated OS customizations to be version-controlled (in a Git repository) and applied (as a system upgrade/downgrade) together with most of the default configurations added by the PlanktoScope OS over what is already present from the default installation of the Raspberry Pi OS. This way, user-initiated OS customizations can be easy to re-apply automatically even after an SD card is re-flashed with a fresh SD card image of the PlanktoScope OS.

Currently, we have partially implemented the systems necessary for these goals. Much of the PlanktoScope's software is not installed or upgraded directly on the host OS via APT or pip; instead, we use a (partially-implemented) tool called forklift which we're developing specifically to support the goals listed above, and which provides a robust way for us to fully manage deployment, configuration, and upgrading of:

  • All software which we run using Docker.
  • PlanktoScope-specific systemd services.
  • PlanktoScope-specific OS configuration files.

Everything managed by forklift is version-controlled in a Git repository, enabling easy backup and restoration of forklift-managed configurations even if the PlanktoScope's SD card is wiped and re-flashed.

"},{"location":"reference/software/architecture/os/#package-management-with-forklift","title":"Package management with forklift","text":"

When you're just experimenting and you can tolerate the challenges mentioned above, it's fine to customize the PlanktoScope OS by installing software packages using pip directly on the OS and/or by making extensive changes to OS configuration files. However, once you actually care about keeping your customizations around - and especially if/when you want to share your customizations with other people - we recommend migrating those customizations into Forklift packages, which are just files and configuration files stored in a specially-structured Git repository which is also published online (e.g. on GitHub, GitLab, Gitea, etc.). forklift provides an easy way to package, publish, combine, and apply customizations via YAML configuration files in Git repositories; this enables easy sharing, configuration, (re-)composition, and downloading of Docker Compose applications, systemd services, and OS configuration files. Configurations of all deployments of Forklift packages on a computer running the PlanktoScope OS are specified and integrated in a single Git repository, a Forklift pallet. At any given time, each PlanktoScope has exactly one Forklift pallet deployed; switching between Forklift pallets (whether to try out a different set of customizations or to upgrade/downgrade all programs and OS configurations managed by Forklift) is easy and can be done by running just one command (forklift pallet switch, described below in the Applying published customizations subsection).

forklift is used very differently compared to traditional Linux system package managers like APT, for which you must run step-by-step commands in order to modify the state of your system (e.g. to install some package or install some other package). When using forklift, you instead edit configuration files which declare the desired state of your system (though some step-by-step commands are also provided by forklift to make editing of files easier), and then you ask forklift to try to reconcile the actual state of your system with the desired state. If you've worked with Hashicorp Terraform/OpenTofu before, this may sound very familiar to you - in fact, several aspects of forklift's design were inspired by Terraform.

"},{"location":"reference/software/architecture/os/#dependency-management","title":"Dependency management","text":"

forklift is simpler than traditional package managers in some notable ways, including in the concept of dependencies between packages. For example, Forklift packages cannot specify dependencies on other Forklift packages; instead, they may declare that they depend on certain resources - and you must declare a deployment of some other package which provides those resources. And although forklift checks whether resource dependencies between package deployments are satisfied, it does not attempt to solve unmet dependencies. If you've worked with the Go programming language before, resource dependency relationships among Forklift packages are analogous to the relationships between functions which require arguments with particular interfaces and the types which implement those interfaces, with Forklift resources being analogous to Go interfaces.

This design is intended to facilitate replacement of particular programs with modified or customized versions of those programs. For example, a Forklift package could be declared as providing the same API on the same network port as some other package, so that one package can be substituted for the other while still maintaining compatibility with some other program which relies on the existence of that API. forklift also checks these resource declarations to ensure that any two packages which would conflict with each other (e.g. by trying to listen on the same network port) will be prevented from being deployed together.

"},{"location":"reference/software/architecture/os/#making-publishing-customizations","title":"Making & publishing customizations","text":"

The workflow with forklift for developing/testing OS customizations, such as new package deployments or non-standard configurations of existing package deployments or substitutions of existing package deployments, is as follows:

  • Initialize a custom pallet based on (i.e. layered over) an existing pallet, using the forklift pallet init command (e.g. forklift pallet init --from github.com/PlanktoScope/pallet-standard@stable --as github.com/ethanjli/custom-pallet to make a starter which will be a customization of the latest stable version of the github.com/PlanktoScope/pallet-standard pallet, and which can be published to github.com/ethanjli/custom-pallet). (Note: the forklift pallet init command is not yet implemented, and pallet layering is not yet implemented; currently, pallets can only be created manually via the filesystem by cloning from an existing Git repository.)

  • Optionally, create new Forklift packages with definitions of Docker Compose applications and/or systemd services and/or OS configuration files, and configure the deployment of those packages by creating particular files in the pallet.

  • Optionally, add published Forklift repositories to the pallet with the forklift pallet add-repo command (e.g. forklift pallet add-repo github.com/ethanjli/pallet-example-minimal@main), so that one or more packages provided by those repositories can be deployed with the pallet by creating one or more package deployment configuration files for each package. The forklift pallet add-repo command is also used to upgrade or downgrade the version of the Forklift repository used by the pallet.

  • Optionally, add one or more files which override files from the existing pallet, in order to override the configurations specified by those files. (Note: file overrides are not yet implemented, because they are part of pallet layering functionality which is not yet implemented.)

  • Stage the pallet to be applied on the next boot of the PlanktoScope OS, with the forklift pallet stage command; when Forklift applies a pallet, it makes the PlanktoScope OS match the configuration of Forklift package deployments specified by the pallet.

  • Use git to commit changes and (ideally) push them to GitHub, in order to publish your customizations for other people to try out.

(TODO: create a \"tutorial\"-style page elsewhere in this docs site, and link to it from here; it could be as simple as creating a new pallet which adds a new helloworld-style Node-RED dashboard)

"},{"location":"reference/software/architecture/os/#applying-published-customizations","title":"Applying published customizations","text":"

The envisioned workflow for applying published customizations (which you or someone else already developed and pushed to a Git repository served by an online host such as GitHub) is only partially implemented so far, but it already works well for basic use-cases - and it is already used as part of the PlanktoScope OS's installation process for setting up the PlanktoScope OS over a Raspberry Pi OS image:

  • Stage the customized pallet to be applied on the next boot of the PlanktoScope OS, using the forklift pallet switch command (e.g. forklift pallet switch github.com/PlanktoScope/pallet-segmenter@edge to use the latest development/unstable version of the github.com/PlanktoScope/pallet-segmenter pallet).

  • Reboot the Raspberry Pi computer to apply the staged pallet. If the staged pallet cannot be successfully applied during boot, on subsequent boots forklift will instead apply the last staged pallet which was successfully applied. (Note: only a failure to update the Docker containers running on the OS is detected as a failed attempt to apply the staged pallet; if you cause problems with the systemd services or other OS configurations provided by your pallet but the Docker containers are all correctly updated, the pallet will still be considered to have been successfully applied.)

(TODO: create a \"tutorial\"-style page elsewhere in this docs site, and link to it from here; it could just be a pallet which reconfigures the docs-site deployment to serve the full site with hardware instructions, and which includes https://hub.docker.com/r/linuxserver/firefox or https://github.com/linuxserver/docker-chromium and/or https://github.com/linuxserver/docker-webtop and/or ZeroTier and/or an ML classifier GUI and/or Jupyter Tensorflow)

Note: currently all of forklift's functionality is only exposed through a command-line interface, but after the forklift tool stabilizes we plan to add a web browser-based graphical interface for use by a general audience.

"},{"location":"reference/software/architecture/os/#planktoscope-specific-hardware-abstraction","title":"PlanktoScope-specific hardware abstraction","text":"

PlanktoScope-specific hardware modules are abstracted by PlanktoScope-specific programs which expose high-level network APIs (typically using MQTT and/or HTTP); other programs should use these APIs in order to interact with the PlanktoScope-specific hardware modules. To provide these APIs, the PlanktoScope OS adds the following services (beyond what is already provided by the default installation of the Raspberry Pi OS):

  • gpsd: for providing an abstraction for the PlanktoScope's GPS receiver.

  • chronyd: for managing synchronization of the Raspberry Pi's system clock with the PlanktoScope's GPS receiver and with any time sources available over the Internet.

  • The PlanktoScope hardware controller: for controlling PlanktoScope-specific hardware modules and abstracting them into high-level network APIs for other programs to interact with.

"},{"location":"reference/software/architecture/os/#user-interface","title":"User interface","text":"

Traditional operating systems provide a desktop environment with a graphical user interface for operating the computer. By contrast, the PlanktoScope OS provides a set of web browser-based graphical user interfaces for operating the PlanktoScope. This approach was chosen for the following reasons:

  • Most people already have a personal computing device (e.g. a phone or laptop). By relying on the user's personal computing device as the graphical interface for the PlanktoScope's software, the PlanktoScope project can reduce hardware costs by omitting a display from the PlanktoScope hardware.

  • The PlanktoScope's computational resources are limited and may often need to be fully used for data processing tasks. By offloading real-time interaction (such as rendering of the graphical display, and handling of mouse and keyboard events) to a separate device, we can ensure a smooth user experience even when the PlanktoScope's Raspberry Pi computer is busy with other work.

  • When the PlanktoScope is connected to the internet, its web browser-based graphical interfaces can be accessed remotely over the internet from other web browsers. This can be easier to set up - and have lower bandwidth requirements and higher responsiveness - compared to a remote-desktop system for remotely accessing a Raspberry Pi's graphical desktop. This is especially relevant when the PlanktoScope is deployed in a setting where it only has a relatively low-bandwidth internet connection.

The PlanktoScope OS adds the following network services which provide web browser-based graphical user interfaces to help users operate the PlanktoScope:

  • A Node-RED server which serves over HTTP the PlanktoScope Node-RED dashboard, a graphical interface for end-users to operate the PlanktoScope for image acquisition and image processing.

  • A datasets file browser for viewing, managing, uploading, and downloading image dataset files on the PlanktoScope. These files are generated and used by the PlanktoScope hardware controller and the PlanktoScope segmenter.

  • device-portal: a landing page with links for end-users to quickly access the various web browser-based interfaces mentioned above.

Note: we will probably simplify things by consolidating some of these components together into the PlanktoScope's Node-RED dashboard.

The PlanktoScope OS also provides various tools with web browser-based interfaces to aid with system administration and troubleshooting:

  • Cockpit: for performing system-administration tasks such as monitoring system resources, managing system services, viewing system logs, and executing commands in a terminal.

  • A system file browser for viewing, managing, editing, uploading, and downloading any file on the PlanktoScope.

  • A log file browser for viewing, downloading, and deleting log files files generated by the PlanktoScope hardware controller.

  • Dozzle: for viewing and monitoring logs of Docker containers.

  • Grafana: for monitoring and exploring metrics stored in Prometheus.

Finally, the PlanktoScope OS adds some command-line tools (beyond what is already provided by the default installation of the Raspberry Pi OS) for administrative tasks which system administrators, software developers, and advanced users may need to use:

  • vim: for editing text files.

  • byobu: for running processes persistently across ephemeral terminal sessions.

  • git: for interacting with Git repositories.

  • w3m and lynx: for interacting with web pages (such as Wi-Fi network captive portals) from the PlanktoScope.

  • docker: for managing and inspecting Docker containers.

"},{"location":"reference/software/architecture/os/#networking","title":"Networking","text":"

The PlanktoScope is often deployed in settings with limited or unstable internet access, and also in settings with no internet access at all. The PlanktoScope also needs to be deployable in remote settings where the user needs to control the PlanktoScope without being physically present. In both types of situations, the PlanktoScope's web browser-based interfaces need to remain accessible.

We solve this problem by allowing the PlanktoScope to connect to the internet over a known Wi-Fi network, and/or over Ethernet, so that the PlanktoScope's web browser-based interfaces can be accessed over the internet; and by making the PlanktoScope bring up a Wi-Fi hotspot (more formally, a wireless access point) using the Raspberry Pi's integrated Wi-Fi module in the absence of any known Wi-Fi network, so that the web browser-based interfaces can be accessed over the Wi-Fi hotspot.

When a device connects directly to the PlanktoScope (e.g. via the PlanktoScope's Wi-Fi hotspot, or via an Ethernet cable), the PlanktoScope acts as a DHCP server to assign itself certain static IP addresses (e.g. 192.168.4.1) and as a DNS server to assign itself certain domain names (e.g. home.pkscope), so that user can locate and open the PlanktoScope's web browser-based interfaces via those domain names. The PlanktoScope also announces itself under certain mDNS names (e.g. pkscope.local) which may work on networks where the PlanktoScope does not have a static IP address (e.g. because the PlanktoScope is connected to an existing Wi-Fi network).

When the PlanktoScope both has internet access and has devices connected to it (e.g. over a Wi-Fi hotspot or over Ethernet), the PlanktoScope shares its internet access with all connected devices, to enable the user to access web pages even when connected to the PlanktoScope. This is implemented in the PlanktoScope OS with network configurations for the PlanktoScope to act as a network router using Network Address Translation when it has internet access.

The standard PlanktoScope OS adds the following systemd services (beyond what is already provided by the default installation of the Raspberry Pi OS) for managing the PlanktoScope's network connectivity:

  • autohotspot (which in turn launches hostapd): a PlanktoScope-specific daemon for automatically checking the presence of known Wi-Fi networks, automatically connecting to any known Wi-Fi networks, and falling back to creating a Wi-Fi hotspot when no known Wi-Fi networks are present.

  • enable-interface-forwarding: configures the Linux kernel firewall's IP packet filter rules to forward packets between the Raspberry Pi's network interfaces, to allow the Raspberry Pi to act as a network router.

  • dnsmasq: for allowing computers connected to the PlanktoScope over a network to access the PlanktoScope using domain names defined on the PlanktoScope.

  • firewalld: a network firewall (currently disabled by default).

The standard PlanktoScope OS also adds the following systemd services for dynamically updating the system's network configuration during boot:

  • generate-machine-name: generates a human-readable machine name at /run/machine-name from the Raspberry Pi's serial number (or, if that's missing, from /etc/machine-d).

  • generate-hostname-templated: generates a temporary hostname file (which is used by a symlink at /etc/hostname) from /etc/hostname-template, which can include the machine name from /run/machine-name.

  • update-hostname: updates systemd-hostnamed so that the hostname matches what is specified by /etc/hostname.

  • assemble-dnsmasq-config-templated: generates a temporary dnsmasq drop-in config file (which is used by a symlink at /etc/dnsmasq.d/40-generated-templated-config) from drop-in config file templates at /etc/dnsmasq-templates.d.

  • assemble-hostapd-config-templated: generates a temporary hostapd drop-in config file (which is used by a symlink at /etc/hostapd/hostapd.conf.d/60-generated-templated.conf) from drop-in config file templates at /etc/hostapd/hostapd.conf-templates.d.

  • assemble-hostapd-config: generates a temporary hostapd config file (which is used by a symlink at /etc/hostapd/hostapd.conf) from drop-in config files at /etc/hostapd/hostapd.conf.d.

  • assemble-hosts-templated: generates a temporary hosts drop-in snippet (which is used by a symlink at /etc/hosts.d/50-generated-templated) from drop-in hosts snippet templates at /etc/hosts-templates.d.

  • assemble-hosts generates a temporary hosts file (which is used by a symlink at /etc/hosts) from drop-in snippets at /etc/hosts-templates.d.

The PlanktoScope OS also adds the following common services for integrating network APIs provided by various programs, and to facilitate communication among programs running on the PlanktoScope OS:

  • Mosquitto: a server which acts as an MQTT broker. This is used by the PlanktoScope hardware controller and segmenter (described below) to receive commands and broadcast notifications. This is also used by the PlanktoScope's Node-RED dashboard (described below) to send commands and receive notifications.

  • Caddy with the caddy-docker-proxy plugin: an HTTP server which acts as a reverse proxy to route all HTTP requests on port 80 from HTTP clients (e.g. web browsers) to the appropriate HTTP servers (e.g. the Node-RED server, Prometheus, and the PlanktoScope hardware controller's HTTP-MJPEG camera preview stream) running on the PlanktoScope.

"},{"location":"reference/software/architecture/os/#filesystem","title":"Filesystem","text":"

The PlanktoScope OS's filesystem makes some changes from the default Debian/Raspberry Pi OS filesystem structure so that /etc and /usr can be managed by Forklift while still being directly customizable by the system administrator. Specifically, a number of systemd services in the PlanktoScope OS run during early boot to:

  • Make a read-only mount (via the overlay-sysroot systemd service) of the initial root filesystem, at /sysroot.

  • Make a read-only mount of the next Forklift pallet to be applied (via the bindro-run-forklift-stages-current.service) from a subdirectory within /var/lib/forklift/stages to /run/forklift/stages/current.

  • Remount /usr (via the overlay-usr systemd service) as a writable overlay with a Forklift-managed intermediate layer (in a subdirectory within /var/lib/forklift/stages which can also be accessed at /run/forklift/stages/current/exports/overlays/usr) and /sysroot/usr as a base layer; any changes made by the system administrator to files in /usr will be transparently stored by the overlay in /var/lib/overlays/overrides/usr. This allows Forklift to provide extra files in /usr in an atomic way, while overrides made by the system administrator are stored separately.

  • Remount /etc (via the overlay-etc systemd service) as a writable overlay with a Forklift-managed intermediate layer (in a subdirectory within /var/lib/forklift/stages which can also be accessed at /run/forklift/stages/current/exports/overlays/etc) and /sysroot/etc as a base layer; any changes made by the system administrator to files in /etc will be transparently stored by the overlay in /var/lib/overlays/overrides/etc. This allows Forklift to provide extra files in /etc in an atomic way, while overrides made by the system administrator are stored separately.

  • Make a writable mount of /var/lib/forklift/stages to /home/pi/.local/share/forklift/stages (via the bind-.local-share-forklift-stages@home-pi systemd service) so that, when the pi user runs forklift commands like forklift pallet switch, those commands will update /var/lib/forklift/stages - and without requiring the use of sudo.

  • Update systemd (via the start-overlaid-units systemd service) with any new systemd units provided via Forklift, so that they will run during boot.

Beyond what is required by the Linux Filesystem Hierarchy Standard, the PlanktoScope OS sets the following conventions related to filesystem paths:

  • Scripts which are provided by Forklift and only used as part of systemd services should be provided in /usr/libexec, Forklift packages should export those scripts to overlays/usr/libexec (so, for example, they will be accessible in /run/forklift/stages/current/exports/overlays/usr/libexec).

  • Systemd units provided by Forklift should be provided in /usr/lib/systemd/system, and Forklift packages should export those units to overlays/usr/lib/systemd/system. Symlinks to enable those units should be provided in /etc/systemd/system, and Forklift packages should export those scripts to overlays/etc/systemd/system.

  • Forklift-provided systemd services which dynamically generate temporary files meant to be used in /etc should generate those temporary files at stable paths in /run/overlays/generated/etc. Forklift packages which provide such systemd services should also provide relative symlinks into those temporary files in /run/overlays/generated/etc to be exported into overlays/etc as overlays for the corresponding paths in /etc. For example, if a package provides a service to dynamically generate a hosts file meant to be used as /etc/hosts, that service should generate the file in /run/overlays/generated/etc/hosts and the package should export a symlink at overlays/etc/hosts which points to ../../run/overlays/generated/etc/hosts, so that /etc/hosts will be a symlink pointing to /run/overlays/generated/etc/hosts.

"},{"location":"reference/software/architecture/os/#observability-telemetry","title":"Observability & telemetry","text":"

Although it is not a high priority yet, we would like to enable operators of large (>10) collections of PlanktoScopes to easily log and monitor the health and utilization of each PlanktoScope and to investigate issues with their PlanktoScopes, regardless of whether each PlanktoScope is deployed locally or remotely. The PlanktoScope OS currently includes the following common services to support system observability and telemetry both for the PlanktoScope OS as a system and for programs running on the PlanktoScope OS:

  • Prometheus: a server for collecting and storing metrics and for exposing metrics over an HTTP API.

  • Prometheus node exporter: for measuring computer hardware and OS monitoring metrics and exposing them over a Prometheus-compatible HTTP API.

In the future, we will instrument other PlanktoScope-specific programs (especially the PlanktoScope hardware controller) to export various metrics for Prometheus to collect and expose.

"},{"location":"reference/software/architecture/os/#data-processing","title":"Data processing","text":"

Because the PlanktoScope collects raw image datasets which are often too large to transfer efficiently over low-bandwidth or intermittent internet connections, the PlanktoScope needs to be able to process raw image data into lower-bandwidth data (e.g. cropped and segmented images of particles in the raw images, or even just counts of different classes of particles) without internet access. In other words, the PlanktoScope must support on-board data processing at the edge. The PlanktoScope OS adds the following services for on-board processing of data generated by the PlanktoScope:

  • The PlanktoScope segmenter: for processing raw image datasets acquired by the PlanktoScope hardware controller to detect and extract particles from raw images.

Note: in the future, the PlanktoScope OS will add more on-board services for processing the outputs of the PlanktoScope segmenter, and the PlanktoScope OS may also provide hardware abstractions (such as for AI accelerator modules) to support the deployment of neural-network models for data processing.

"},{"location":"reference/software/architecture/os/#security","title":"Security","text":"

Currently, the PlanktoScope OS lacks basic security measures to make it safe for them to be connected to the internet; currently it is the responsibility of system administrators to add extremely basic risk mitigations, for example by:

  • Changing the password of the pi user away from the default of copepode.

  • Password-protecting the Node-RED dashboard editor, which can be used to execute arbitrary commands with root permissions.

  • Setting firewall rules.

  • Changing the password of the Wi-Fi hotspot away from the default of copepode, or disabling Wi-Fi hotspot functionality.

Other risk mitigations will require deeper changes to the PlanktoScope OS, such as:

  • Limiting the permissions and capabilities made available to various system services which currently run with root permissions

  • Password-protecting web browser-based user interfaces

  • Password-protecting network APIs.

We would like to start taking even just the very basic steps listed above to improve security, but security is not yet a high-enough priority for us to work on it with the limited resources available to us \ud83d\ude43 - if you're interested in computer/network security and you'd like to help us as a volunteer on this project, please contact us!

"},{"location":"reference/software/functionalities/camera-settings/","title":"Camera Settings","text":"

This document explains how the PlanktoScope software controls the PlanktoScope's camera using the camera settings exposed by the \"Optic Configuration\" page of the PlanktoScope's Node-RED dashboard.

The following camera settings can be adjusted via the Node-RED dashboard:

  • \"ISO\" & \"Shutter Speed\" control the brightness of images captured by the camera.

  • \"Auto White Balance\", \"WB: Red\", and \"WB: Blue\" control the color balance of images captured by the camera.

"},{"location":"reference/software/functionalities/camera-settings/#image-brightness","title":"Image brightness","text":"

The Node-RED dashboard's \"Shutter Speed\" setting, which is specified in units of microseconds (\u03bcs), is used to set the ExposureTime control with the picamera2 library; a higher value for this setting will make captured images brighter and - when objects are moving - blurrier. To prevent the camera from capturing blurry images of moving objects, the value of this setting should be minimized; usually the default value of 125 \u03bcs is appropriate. For a detailed explanation of the exposure time of the camera sensor, refer to the picamera library's discussion of \"exposure time\".

The Node-RED dashboard's \"ISO\" setting is divided by 100 and used to set the AnalogueGain control with the picamera2 library; a higher value for this setting will make the camera sensor more sensitive to light, and thus make captured images brighter and noisier. To prevent the camera from capturing excessively dark images - which will prevent the PlanktoScope's segmenter from correctly detecting objects - the value of this setting should not be too low. To prevent the camera from \"washing out\" images by making everything excessively bright - which will destroy visual detail in the images - the value of this setting should not be too high, either. For a detailed explanation of the analog gain of the camera sensor, refer to the picamera library's discussion of \"sensor gain\" and the picamera2 library's discussion of the AnalogueGain control and the DigitalGain property.

"},{"location":"reference/software/functionalities/camera-settings/#image-color-balance","title":"Image color balance","text":"

The PlanktoScope's camera can operate with \"Automatic White Balance\" mode either enabled or disabled. In \"Automatic White Balance\" mode, the camera ignores any manually-set white-balance settings and instead applies an adaptive algorithm to automatically (and gradually) correct the color balance of the images to prevent them from appearing more red or more blue than we would expect the images to be. However, \"Automatic White Balance\" mode prevents images from having consistent calibrations, so we recommend always disabling \"Automatic White Balance\" mode when collecting data with the PlanktoScope, and instead manually calibrating the camera's white-balance settings.

The camera's manual white-balance settings consist of two normalized color values, which are the red gain (\"WB: Red\" in the Node-RED dashboard) and the blue gain (\"WB: Blue\" in the Node-RED dashboard). The red gain can be understood as a multiplier applied to the image to achieve the desired ratio between the redness of the image and the greenness of the image, so a higher value will make the image appear redder. Similarly, the blue gain can be understood as a multiplier applied to the image to achieve the desired ratio between the blueness of the image and the greenness of the image, so a higher value will make the image appear bluer. For a deeper conceptual explanation of white balance, refer to the first two pages of Freescale Semiconductor's application note on white balance and color correction in digital cameras.

"},{"location":"reference/software/functionalities/sample-imaging/","title":"Sample Imaging","text":"

This document explains how the PlanktoScope software captures images of samples and how it uses the image-acquisition settings exposed by the \"Fluidic Acquisition\" page of the PlanktoScope's Node-RED dashboard.

Currently, the PlanktoScope software only has one sample-imaging mode, which we call \"stop-flow imaging\":

"},{"location":"reference/software/functionalities/sample-imaging/#stop-flow-imaging","title":"Stop-flow imaging","text":"

This imaging mode is optimized to allow capture of high-quality images using low-cost, high-resolution camera modules such as the Raspberry Pi Camera Module 2 and the Raspberry Pi High Quality Camera (refer to the hardware product specifications to see which camera modules are used in each version of the PlanktoScope hardware), whose rolling-shutter designs can introduce artifacts around moving objects while the camera is capturing an image.

When this imaging mode is started, the PlanktoScope will repeatedly perform the following sequence of actions until a desired number of images (\"Number of images to acquire\" in the Node-RED dashboard) is captured:

  1. The PlanktoScope's pump will pull some fixed volume of sample (\"Pumped volume\" in the Node-RED dashboard, in units of mL) from the sample intake and move the same volume of sample down through the PlanktoScope's flowcell.

  2. After the PlanktoScope's pump finishes pumping the specified volume, the pump will stop and the PlanktoScope will wait for some short fixed duration of time (\"Delay to stabilize image\" in the Node-RED dashboard, in units of seconds). This waiting period is intended to allow the sample in the PlanktoScope's flowcell to stop flowing, so that all objects in the camera's field-of-view will (hopefully) stop moving - because moving objects will cause distortion effects to appear in images captured with rolling-shutter cameras such as those used in the PlanktoScope.

  3. The PlanktoScope will capture and save an image of its entire field-of-view.

"},{"location":"reference/software/functionalities/segmentation/","title":"Image Segmentation","text":"

This document explains how the PlanktoScope software's segmenter program processes raw images (captured by the PlanktoScope's sample-imaging functionality) in order to detect objects - such as plankton, microplastics, and other particles - and to extract each object into its own segmented image for downstream use, such as for uploading to EcoTaxa. This document also lists and explains the metadata fields added by the PlanktoScope segmenter for uploading to EcoTaxa.

Currently, the segmenter only operates in batch-processing mode: the segmenter takes as input a complete raw image dataset, and it produces as output a complete segmented object dataset as well as an export archive of segmented objects which can be uploaded to EcoTaxa.

When the segmenter starts, it will perform a median-calculation step on the first ten images of the dataset of raw images. The median-calculation step outputs a median image which is then used as an input for an image-correction step on each raw image; the median image will occasionally be recalculated (conditions triggering a recalculation are described below). Each image-cleaning step outputs a median-corrected image is then used as the input for a mask-calculation step. Each mask-calculation step outputs a segmentation mask which is then used as an input for an object-extraction step.

For each raw image from the input dataset, after the object-extraction step outputs a set of objects, the number of extracted objects is accumulated into a cumulative moving average of the number of objects extracted per raw image. However, before the cumulative moving average is updated, the number of extracted objects is compared against the previous value of the cumulative moving average (calculated after the previous raw image was processed): if the number of extracted objects is greater than the previous value of the cumulative moving average by more than 20, then the median image will be recalculated for the next raw image. The input for the next median-calculation step will usually be the next 10 consecutive raw images, unless the next raw image is one of the last 10 raw images - in which case the previous ten images will instead be used as the input for the next median-calculation step. Yes, this logic is complicated, and yes, for some reason we don't center the sequence of raw images around the next raw image as our input to the median-calculation step.

"},{"location":"reference/software/functionalities/segmentation/#median-calculation-step","title":"Median-calculation step","text":"

The median-calculation step takes as input a sequence of consecutive raw images, but if the image sequence consists of an even number of images then the last image is excluded from the calculation. The median-calculation step uses the raw images to calculate a median image, in which the color of each pixel of the output is calculated as the median of the colors of the corresponding pixels in the input images.

The output of this step is supposed to be an estimate of what the the \"background\" of the image would be if there were no objects within the field-of-view. However, this step is not robust to sample density: if a sample is dense enough that certain pixel locations overlap with objects in more than half of any consecutive sequence of ten images, the color of the \"background\" in those pixel locations will be estimated as the color of an object in one of those images.

"},{"location":"reference/software/functionalities/segmentation/#image-correction-step","title":"Image-correction step","text":"

The image-correction step takes as input a median image and a raw image. First, the image-correction step divides the color of each pixel of the raw image by the color of the corresponding pixel of the median image; this is probably intended to correct for inhomogeneous illumination in the raw image, and to remove any objects which had been stuck to the flow cell (and thus were included in the median image) from the raw image. Next, the image-correction step slightly rescales the intensity range of the resulting image (TODO: determine what the effect of this intensity-rescaling operation is - does it make the image brighter or dimmer? Does it increase or decrease the contrast? Does it clip the white value? Why is this step performed???). The final result is a median-corrected image.

"},{"location":"reference/software/functionalities/segmentation/#mask-calculation-step","title":"Mask-calculation step","text":"

The mask-calculation step takes as input a median-corrected image and the result from the previous mask-calculation step. It consists of the following operations:

  1. \"Simple threshold\": this operation applies a global threshold to the input corrected image, using the triangle algorithm to calculate an optimal threshold value for the image; the output is a mask in which each pixel is set to 0 if the corresponding pixel of the input image is greater than the threshold, and to 255 otherwise. The resulting mask should select for objects which appear darker than the background of the image.

  2. \"Remove previous mask\": this operation combines the result of the previous mask-calculation step with the mask created by the previous \"simple threshold\" operation, by subtracting the intersection of the two masks from the mask created by the previous \"simple threshold\" operation. This operation is probably intended to remove objects which had been stuck to the PlanktoScope's flowcell during imaging and thus might appear in many consecutive input corrected images. However, this operation is not robust in dense samples where two different objects might appear in overlapping locations across two consecutive raw images.

  3. \"Erode\": this operation erodes the mask with a 2-pixel-by-2-pixel square kernel. In the resulting mask, small regions (such as thresholded noise) are eliminated.

  4. \"Dilate\": this operation dilates the mask with an 8-pixel-diameter circular kernel. In the resulting mask, regions remaining after the previous \"erode\" operation are padded with a margin.

  5. \"Close\": this operation dilates and then erodes the mask with an 8-pixel-diameter circular kernel. In the resulting mask, small holes in regions remaining after the previous \"dilate\" operation are eliminated.

  6. \"Erode2\": this operation erodes the mask with an 8-pixel-diameter circular kernel, inverting the effect of the previous \"dilate\" operation.

The final result these operations is a spatially-filtered segmentation mask where the value of each pixel represents whether that pixel is part of an object or part of the background of the input corrected image.

"},{"location":"reference/software/functionalities/segmentation/#object-extraction-step","title":"Object-extraction step","text":"

The object-extraction step takes the following inputs:

  • A median-corrected image

  • A segmentation mask

  • The following sample metadata fields:

  • acq_minimum_mesh: the diameter of the smallest spherical object which is expected to be in the sample, usually 20 \u00b5m. This value is set on the \"Fluidic Acquisition\" page of the PlanktoScope's Node-RED dashboard as the \"Min fraction size\".

  • process_pixel: the pixel size calibration of the PlanktoScope, in units of \u00b5m per pixel; then the area (in units of \u00b5m2) per pixel is process_pixel * process_pixel. This value is set on the \"Hardware Settings\" page of the PlanktoScope's Node-RED dashboard as the \"Pixel size calibration: um per pixel\".

First, the object-extraction step calculates a minimum-area threshold for objects to extract using the input segmentation mask: the threshold (in units of pixel2) is calculated as (2 * acq_minimum_mesh / process_pixel) ^ 2.

Next, the object-extraction step identifies all connected regions of the input segmentation mask and measures properties of those regions. The object-extraction step then discards any region whose bounding-box area (area_bbox in scikit-image) is less than the minimum-area threshold.

"},{"location":"reference/software/functionalities/segmentation/#metadata-calculation","title":"Metadata calculation","text":"

For each resulting region after the minimum-area threshold is applied, that region will be used to extract a segmented and cropped image of the object (including pixels in any holes in the object) from the input median-corrected image. This cropped image is used to calculate some metadata fields about the distribution of colors in the object's segmented image:

  • MeanHue: the mean of the hue channel of the image in a hue-saturation-value (HSV) representation of the image

  • StdHue: the standard deviation of the hue channel of the image in an HSV representation of the image

  • MeanSaturation: the standard deviation of the saturation channel of the image in an HSV representation of the image

  • StdSaturation: the standard deviation of the saturation channel of the image in an HSV representation of the image

  • MeanValue: the standard deviation of the value channel of the image in an HSV representation of the image

  • StdValue: the standard deviation of the value channel of the image in an HSV representation of the image

Additionally, some metadata for the object is calculated from the region properties calculated by scikit-image for that object's region:

  • label: The identifier of the object's region, as assigned by scikit-image. This corresponds to the label region property in scikit-image.

  • Basic area properties:

  • area_exc: Number of pixels in the region (excluding pixels in any holes). This corresponds to the area region property in scikit-image.

  • area: Number of pixels of the region with all holes filled in (i.e. including pixels in any holes). This corresponds to the area_filled region property in scikit-image. Yes, it's somewhat confusing that the PlanktoScope segmenter renames scikit-image's area region property to area_exc and renames scikit-image's area_filled region property to area.

  • %area: Ratio between the number of pixels in any holes in the region and the total number of pixels of the region with all holes filled in; calculated as 1 - area_exc / area. In other words, this represents the proportion of the region which consists of holes. Yes, %area is a misleading name both because of the % in the name and because of the area in the name.

  • Equivalent-circle properties:

  • equivalent_diameter: The diameter (in pixels) of a circle with the same number of pixels in its area as the number of pixels in the region (excluding pixels in any holes). This corresponds to the equivalent_diameter_area property in scikit-image.

  • Equivalent-ellipse properties:
  • eccentricity: Eccentricity of the ellipse that has the same second-moments as the region; eccentricity is the ratio of the focal distance (distance between focal points) over the major axis length. The value is in the interval [0, 1), where a value of 0 represents a circle. This corresponds to the eccentricity property in scikit-image.

  • major: The length (in pixels) of the major axis of region's equivalent ellipse. This corresponds to the axis_major_length property in scikit-image.

  • minor: The length (in pixels) of the minor axis of the region's equivalent ellipse. This corresponds to the axis_minor_length property in scikit-image.

  • elongation: The ratio between major and minor.

  • angle: Angle (in degrees) between the x-axis of the input median-corrected image and the major axis of the region's equivalent ellipse. Values range from 0 deg to 180 deg counter-clockwise. This is calculated from the orientation property in scikit-image.

  • Equivalent-object perimeter properties:

  • perim.: Perimeter (in pixels) of an object which approximates the region's contour as a line through the centers of border pixels using a 4-connectivity. This corresponds to the perimeter property in scikit-image.

  • perimareaexc: Ratio between the perimeter and the number of pixels in the region (excluding pixels in any holes). Calculated as perim. / area_exc.

  • perimmajor: Ratio between the perimeter and the length of the major axis of the region's equivalent ellipse. Calculated as perim. / major.

  • circ.: The roundness of the region's equivalent object, including pixels in any holes. Calculated as 4 * \u03c0 * area / (perim. * perim.). Ranges from 1 for a perfect circle to 0 for highly non-circular shapes.

  • circex: The roundness of the region's equivalent object, excluding pixels in any holes. Calculated as 4 * \u03c0 * area_exc / (perim. * perim.). Ranges from 1 for a perfect circle to 0 for highly non-circular shapes or shapes with many large holes.

  • Bounding box (the smallest rectangle which includes all pixels of the region, under the constraint that the edges of the box are parallel to the x- and y-axes of the input median-corrected image) properties:

  • bx: x-position (in pixels) of the top-left corner of the region's bounding box, relative to the top-left corner of the input median-corrected image. This corresponds to the second element of the bbox property in scikit-image.

  • by: y-position (in pixels) of the top-left corner of the region's bounding box, relative to the top-left corner of the input median-corrected image. This corresponds to the first element of the bbox property in scikit-image.

  • width: Width (in number of pixels) of the region's bounding box. This is calculated from the elements of the bbox property in scikit-image.

  • height: Height (in number of pixels) of the region's bounding box. This is calculated from the elements of the bbox property in scikit-image.

  • bounding_box_area: Number of pixels in the region's bounding box; equivalent to width * height. This corresponds to the area_bbox region property in scikit-image.

  • extent: Ratio between the number of pixels in the region (excluding pixels in any holes) and the number of pixels in the region's bounding box; equivalent to area_exc / bounding_box_area. This corresponds to the extent region property in scikit-image.

  • Convex hull (the smallest convex polygon which encloses the region) properties:

  • convex_area: Number of pixels in the convex hull of the region. This corresponds to the area_convex region property in scikit-image.

  • solidity: Ratio between the number of pixels in the region (excluding pixels in any holes) and the number of pixels in the convex hull of the region. Equivalent to area_exc / convex_area. This corresponds to the solidity region property in scikit-image.

  • Unweighted centroid properties:

  • x: x-position (in pixels) of the centroid of the object, relative to the top-left corner of the input median-corrected image. This corresponds to the second element of the centroid region property in scikit-image.

  • y: y-position (in pixels) of the centroid of the object, relative to the top-left corner of the input median-corrected image. This corresponds to the first element of the centroid region property in scikit-image.

  • local_centroid_col: x-position (in pixels) of the centroid of the object, relative to the top-left corner of the region's bounding box; equivalent to x - bx. This corresponds to the second element of the centroid_local region property in scikit-image.

  • local_centroid_row: y-position (in pixels) of the centroid of the object, relative to the top-left corner of the region's bounding box; equivalent to y - by. This corresponds to the first element of the centroid_local region property in scikit-image.

  • Topological properties:

  • euler_number: The Euler characteristic of the set of non-zero pixels. Computed as the number of connected components subtracted by the number of holes (with 2-connectivity). This corresponds to the euler_number property in scikit-image.

"},{"location":"reference/software/functionalities/segmentation/#output-image-cropping","title":"Output image cropping","text":"

Finally, a segmented and cropped image of the object (including pixels in any holes in the object) is saved from the input median-corrected image, but with the crop expanded by up to 10 pixels in each direction (TODO: check whether this description is accurate - the corresponding code is extremely unreadable).

Thus, the output of the output-extraction step is a set of objects, each with a corresponding cropped image saved to file and with a corresponding list of metadata values.

"},{"location":"reference/software/interfaces/exported-metadata/","title":"Exported Metadata","text":"

TODO

"},{"location":"reference/software/interfaces/mqtt/","title":"Planktoscope MQTT API Reference","text":"

The MQTT API is the primary programming interface for controlling the PlanktoScope. The API is served by the PlanktoScope's Python backend, and data is sent across the API with the following architecture:

flowchart TD\n    API[API Client] -->|Command| Broker[MQTT Broker]\n    Broker -->|Command| Backend[Python Backend]\n    Backend -->|Status Update| Broker[MQTT Broker]\n    Broker -->|Status Update| API

Most messages in the MQTT API are organized according to a request-response pattern in which the API client sends a command as a request to take some action, and then the Python backend sends one or more responses as status updates about how the Python backend's state has changed as a result of the command:

  • API clients send commands to the Python backend (via the MQTT broker), and receive status updates from the Python backend (also via the MQTT broker). The PlanktoScope's Node-RED dashboard is an API client, but other programs are also allowed to act as API clients.
  • The MQTT broker passes commands and status updates between the API client(s) and the Python backend. The MQTT broker runs on the PlanktoScope and accepts connections from API clients on port 1883.
  • The Python backend handles commands, takes actions (e.g. changing the state of hardware actuators), and publishes status updates both in response to commands and in response to changes in internal state. Currently, parts of the Python backend also act as MQTT API clients to other parts of the Python backend.

Every MQTT message in the PlanktoScope's MQTT API is published on a specific topic, which is a slash-delimited path of strings (e.g. actuator/pump). Every MQTT message in the PlanktoScope's MQTT API carries a payload, which is a JSON object serialized as a string:

  • Messages which are commands usually specify the type of command in an action field of the payload object; other fields of the payload object are parameters of the command.
  • Messages which are status updates have a single field in the payload object, status, which is a string containing a status or error message.

In the rest of this reference document, we organize our description of the MQTT API into sections corresponding to distinct functionalities of the Python backend:

"},{"location":"reference/software/interfaces/mqtt/#pump","title":"Pump","text":"

The Pump API controls the movement of fluid through the PlanktoScope:

  • MQTT topics for commands: actuator/pump
  • MQTT topics for status updates: status/pump
  • Commands: move, stop
"},{"location":"reference/software/interfaces/mqtt/#move-command","title":"move command","text":"

The move command initiates movement of fluid through the PlanktoScope by driving the PlanktoScope pump's stepper motor. For example, this command makes the pump move 10 mL of fluid forwards through the PlanktoScope's fluidic path, at a rate of 1 mL/min:

{\n  \"action\": \"move\",\n  \"direction\": \"FORWARD\",\n  \"volume\": 10,\n  \"flowrate\": 1\n}\n

The move command has the following parameters:

Field Description Type Accepted Values action Specifies the move command. string move direction Direction to run the pump. string FORWARD, BACKWARD volume Total volume of sample to pump before stopping automatically (mL). float 0 < volume flowrate Speed of pumping (mL/min). float 0 < flowrate \u2264 45 mL/min"},{"location":"reference/software/interfaces/mqtt/#move-command-responses","title":"move command responses","text":"

The Python backend can send status updates on the status/pump topic, in response to the move command. The status field of such status updates can have any of the following values:

Status/Error Cause Started The pump has started moving in response to a valid move command. Error, the message is missing an argument One or more required parameters (direction, volume, flowrate) are missing in the move command. Error, The flowrate should not be == 0 An invalid value (0) was provided for the flowrate field. Done The pump has successfully stopped after fully pumping the specified volume of sample.

Note: the MQTT API does not yet completely specify error messages in response to invalid values for the direction, volume, and flowrate parameters.

"},{"location":"reference/software/interfaces/mqtt/#stop-command","title":"stop command","text":"

The stop command interrupts any ongoing movement of fluid through the PlanktoScope and cuts off power to the PlanktoScope pump's stepper motor:

{\n  \"action\": \"stop\"\n}\n

The stop command has the following parameters:

Field Description Type Accepted Values action Specifies the stop command. string stop"},{"location":"reference/software/interfaces/mqtt/#stop-command-responses","title":"stop command responses","text":"

The Python backend can send status updates on the status/pump topic, in response to the stop command. The status field of such status updates can have any of the following values:

Status/Error Cause Interrupted The pump has stopped moving in response to a valid stop command, interrupting any ongoing move command.Sent in response to any Pump stop command, and any Imager stop command."},{"location":"reference/software/interfaces/mqtt/#non-response-status-updates","title":"Non-response status updates","text":"

The Python backend can send status updates on the status/pump topic which are not triggered by any command. The status field of such status updates can have any of the following values:

Status/Error Cause Ready The backend has become ready to respond to Pump commands. Dead The backend will no longer respond to Pump commands."},{"location":"reference/software/interfaces/mqtt/#focus","title":"Focus","text":"

The Focus API controls the movement of the sample stage focusing motors in the PlanktoScope:

  • MQTT topics for commands: actuator/focus
  • MQTT topics for status updates: status/focus
  • Commands: move, stop
"},{"location":"reference/software/interfaces/mqtt/#move-command_1","title":"move command","text":"

The move command initiates movement of the focusing stage by a specified displacement. For example, this command makes the stage move up by 0.26 mm at a speed of 1 mm/s:

{\n  \"action\": \"move\",\n  \"direction\": \"UP\",\n  \"distance\": 0.26,\n  \"speed\": 1\n}\n

The move command has the following parameters:

Field Description Type Accepted Values action Specifies the move command. string move direction Direction to move the sample stage. string UP, DOWN distance Total distance to move the stage before stopping automatically (in mm). float 0 < distance \u2264 45.0 speed Speed of movement (in mm/s).Defaults to 5. float 0 < speed \u2264 5.0 (optional)"},{"location":"reference/software/interfaces/mqtt/#move-command-responses_1","title":"move command responses","text":"

The Python backend can send status updates on the status/focus topic in response to the move command. The status field of such status updates can have any of the following values:

Status/Error Cause Started The focusing motors have started moving in response to a valid move command. Error The move command is missing the distance and/or direction fields. Done The focusing motors have successfully stopped after moving the specified distance."},{"location":"reference/software/interfaces/mqtt/#stop-command_1","title":"stop command","text":"

The stop command interrupts any ongoing movement of the focusing stage and cuts off power to the focusing motors:

{\n  \"action\": \"stop\"\n}\n

The stop command has the following parameters:

Field Description Type Accepted Values action Specifies the stop command. string stop"},{"location":"reference/software/interfaces/mqtt/#stop-command-responses_1","title":"stop command responses","text":"

The Python backend can send status updates on the status/focus topic, in response to the stop command. The status field of such status updates can have any of the following values:

Status/Error Cause Interrupted The focusing motors have stopped moving in response to a valid stop command, interrupting any ongoing stop command."},{"location":"reference/software/interfaces/mqtt/#non-response-status-updates_1","title":"Non-response status updates","text":"

The Python backend can send status updates on the status/focus topic which are not triggered by any command. The status field of such status updates can have any of the following values:

Status/Error Description Ready The backend has become ready to respond to Focus commands. Dead The backend will no longer respond to Focus commands."},{"location":"reference/software/interfaces/mqtt/#light","title":"Light","text":"

The Light API controls the state of the LED lighting system in the PlanktoScope:

  • MQTT topics for commands: actuator/light
  • MQTT topics for status updates: status/light
  • Commands: on, off
"},{"location":"reference/software/interfaces/mqtt/#on-command","title":"on command","text":"

The on command turns on the sample illumination LED. For example:

{\n  \"action\": \"on\"\n  \"led\": \"1\"\n}\n

The on command has the following parameters:

Field Description Type Accepted Values action Specifies the on command. string on led Specifies the LED to turn on.Defaults to 1. integer 1\u00a0(optional)"},{"location":"reference/software/interfaces/mqtt/#on-command-responses","title":"on command responses","text":"

The Python backend can send status updates on the status/light topic in response to the on command. The status field of such status updates can have any of the following values:

Status/Error Cause Led 1: On The LED turned on successfully. Error with LED number An invalid value was provided for the led field of the command."},{"location":"reference/software/interfaces/mqtt/#off-command","title":"off command","text":"

The off command turns off the sample illumination LED. For example:

{\n  \"action\": \"off\"\n}\n

The off command has the following parameters:

Field Description Type Accepted Values action Specifies the off command. string off led Specifies the LED to turn on.Defaults to 1 integer 1"},{"location":"reference/software/interfaces/mqtt/#off-command-responses","title":"off command responses","text":"

The Python backend can send status updates on the status/light topic in response to the off command. The status field of such status updates can have any of the following values:

Status/Error Cause Led 1: Off The LED turned off successfully. Error with LED number An invalid value was provided for the led field of the command."},{"location":"reference/software/interfaces/mqtt/#non-response-status-updates_2","title":"Non-response status updates","text":"

The Python backend can send status updates on the status/light topic which are not triggered by any command. The status field of such status updates can have any of the following values:

Status/Error Description Ready The backend has become ready to respond to Light commands. Dead The backend will no longer respond to Light commands."},{"location":"reference/software/interfaces/mqtt/#imager","title":"Imager","text":"

The Imager API controls image acquisition with the PlanktoScope's hardware, as well as the PlanktoScope's camera:

  • MQTT topics for commands: imager/image
  • MQTT topics for status updates: status/imager
  • Commands: settings, update_config, image, stop

For details on how images are acquired, refer to our technical reference on sample imaging in the PlanktoScope.

Generally, commands should be sent in the following order:

  1. settings command: Configure the camera settings.
  2. update_config command: Update the dataset metadata for the next image acquisition.
  3. image command: Initiate image acquisition.
  4. stop command: Stop any in-progress image acquisition.
"},{"location":"reference/software/interfaces/mqtt/#settings-command","title":"settings command","text":"

The settings command changes the camera settings. The fields iso, shutter_speed, white_balance_gain and white_balance are optional - if a field is omitted, its setting will not be changed. Here's an example of a command with values specified for all fields:

{\n  \"action\": \"settings\",\n  \"settings\": {\n    \"iso\": 100,\n    \"shutter_speed\": 40,\n    \"white_balance_gain\": { \"red\": 100, \"blue\": 100 },\n    \"white_balance\": \"auto\",\n  }\n}\n

The settings command has the following parameters:

Parameter Description Type Accepted Values action Specifies the settings command. string settings iso Simulated ISO image sensitivity. int 0 < iso \u2264 650 (higher values may be accepted for certain cameras) (optional) shutter_speed Exposure time (in \u03bcs). int 125 \u2264 shutter_speed\u00a0(optional) white_balance_gain.red White balance red gain. float 0.0 \u2264 white_balance_gain.red\u00a0\u2264 32.0 (optional) white_balance_gain.blue White balance blue gain. float 0.0\u00a0\u2264\u00a0white_balance_gain.blue\u00a0\u2264 32.0 (optional) white_balance White balance mode. (off\u00a0specifies the use of manual white balance gains) string auto, off\u00a0(optional)"},{"location":"reference/software/interfaces/mqtt/#settings-command-responses","title":"settings command responses","text":"

The Python backend can send status updates on the status/imager topic in response to the settings command. The status field of such status updates can have any of the following values:

Status/Error Cause Camera settings updated The camera settings have been successfully updated. Camera settings error The settings command is missing required parameters. Iso number not valid The provided iso\u00a0value is not allowed. Shutter speed not valid The provided shutter_speed\u00a0value is not allowed. White balance gain not valid The provided white_balance_gain\u00a0object is not valid or has an invalid value. White balance mode {white_balance} not valid The provided white_balance\u00a0value is not allowed."},{"location":"reference/software/interfaces/mqtt/#update_config-command","title":"update_config command","text":"

The update_config command sets/changes the metadata which will be saved with the dataset which to be acquired by the next image command. For example:

{\n  \"action\": \"update_config\",\n  \"config\": {\n    \"sample_project\": \"fairscope bzh\",\n    \"sample_id\": \"fairscope_bzh_estacade\",\n    \"sample_uuid\": \"uuid-1234\",\n    \"sample_ship\": \"Fairscope\",\n    \"sample_operator\": \"jeremy\",\n    \"sample_sampling_gear\": \"net\",\n    \"sample_concentrated_sample_volume\": 70,\n    \"sample_total_volume\": 100,\n    \"sample_dilution_factor\": 10,\n    \"sample_speed_through_water\": \"5 knots\",\n    \"sample_instrument\": \"PlanktoScope v2.6\",\n    \"sample_bottom_depth\": \"N/A\",\n    \"sample_depth_min\": 0.1,\n    \"sample_depth_max\": 0.5,\n    \"sample_temperature\": \"N/A\",\n    \"sample_salinity\": \"N/A\",\n    \"sample_date\": \"2024-05-15\",\n    \"acq_id\": \"fairscope_bzh_estacade_2\",\n    \"acq_instrument\": \"PlanktoScope v2.6\",\n    \"acq_magnification\": \"1.2\",\n    \"acq_camera_id\": \"deep-point-8125\",\n    \"acq_camera_lens\": \"N/A\",\n    \"acq_software\": \"PlanktoScope v2024.0.0-alpha.1\",\n    \"acq_atlas_id\": \"N/A\",\n    \"acq_resolution\": \"1080p\",\n    \"acq_stacks_count\": \"N/A\",\n    \"acq_time_between_frames\": 0.3,\n    \"acq_brightness\": \"N/A\",\n    \"acq_contrast\": \"N/A\",\n    \"acq_sharpness\": \"N/A\",\n    \"acq_saturation\": \"N/A\",\n    \"acq_gamma\": \"N/A\",\n    \"acq_uuid\": \"acq-uuid-5678\",\n    \"acq_volume\": 2.50,\n    \"acq_imaged_volume\": 1.04,\n    \"acq_minimum_mesh\": 300,\n    \"acq_maximum_mesh\": 300,\n    \"acq_min_esd\": 300,\n    \"acq_max_esd\": 300,\n    \"acq_camera_name\": \"HQ Camera\",\n    \"acq_nb_frame\": 500,\n    \"acq_local_datetime\": \"2024-05-15T09:00:00Z\",\n    \"acq_caamera_iso\": 400,\n    \"acq_camera_shutter_speed\": 500,\n    \"object_date\": \"2024-05-15\",\n    \"object_time\": \"09:00:00Z\",\n    \"object_lat\": 48.7273,\n    \"object_lon\": -3.9814,\n    \"object_depth_min\": 0.1,\n    \"object_depth_max\": 0.5,\n    \"process_pixel\": 0.75,\n    \"process_datetime\": \"2024-05-15T09:00:00Z\",\n    \"process_id\": \"Process01\",\n    \"process_uuid\": \"proc-uuid-7890\",\n    \"process_source\": \"https://www.github.com/PlanktonPlanet/PlanktoScope\",\n    \"process_commit\": \"CommitHash\",\n    \"sample_gear_net_opening\": 300,\n    \"object_date_end\": \"2024-05-15\",\n    \"object_time_end\": \"10:00:00Z\",\n    \"object_lat_end\": 48.7274,\n    \"object_lon_end\": -3.9815\n  }\n}\n

The metadata should contain comprehensive information about the sample, acquisition process, object details, and processing parameters to ensure accurate tracking and reproducibility of the dataset. The update_config command has the following parameters:

Sample information:

Field Description Type sample_project Project name. string sample_id Sample identifier. integer sample_uuid Sample UUID. string sample_ship Ship name. string sample_operator Operator name. string sample_sampling_gear Sampling gear description. string sample_concentrated_sample_volume Concentrated sample volume. float sample_total_volume Total volume. float sample_dilution_factor Dilution factor. float sample_speed_through_water Speed through water. float

Acquisition information:

Field Description Type acq_id Acquisition identifier. integer acq_instrument Acquisition instrument. string acq_magnification Magnification level. string acq_camera_id Camera identifier. integer acq_camera_lens Camera lens. string acq_software Acquisition software. string acq_volume Acquisition volume. float acq_imaged_volume Imaged volume. float acq_minimum_mesh Minimum mesh size. float acq_maximum_mesh Maximum mesh size. float acq_min_esd Minimum equivalent spherical diameter. float acq_max_esd Maximum equivalent spherical diameter. float acq_camera_name Camera name. string acq_nb_frame Number of frames captured. integer acq_local_datetime Local date and time of acquisition. string acq_camera_resolution Camera resolution. string acq_camera_iso Camera ISO setting. float acq_camera_shutter_speed Camera shutter speed. float

Object information:

Field Description Type object_date Date of the object recording. string object_time Time of the object recording. string object_lat Latitude of the sample location. float object_lon Longitude of the sample location. float object_depth_min Minimum depth of the sample location. float object_depth_max Maximum depth of the sample location. float object_date_end End date of the object recording. string object_time_end End time of the object recording. string object_lat_end End latitude of the sample location. float object_lon_end End longitude of the sample location. float

Processing information:

Field Description Type process_pixel Pixel processing method. string process_datetime Date and time of processing. string process_id Processing identifier. integer process_uuid Processing UUID. string process_source Source of processing software or method. string process_commit Commit hash of the software used. string"},{"location":"reference/software/interfaces/mqtt/#update_config-command-responses","title":"update_config command responses","text":"

The Python backend can send status updates on the status/imager topic in response to the update_config command. The status field of such status updates can have any of the following values:

Status/Error Description Config updated The metadata has been successfully updated. Configuration message error The command is missing the required\u00a0config field. Busy Image acquisition is already in progress, so dataset metadata cannot be changed."},{"location":"reference/software/interfaces/mqtt/#image-command","title":"image command","text":"

The image command initiates acquisition of one raw image dataset consisting of a specified number of images, via stop-flow imaging. For example, this command initiates acquisition of 200 images, with 1 mL of sample pumped between each image and an image stabilization period of 0.1 seconds between the end of pumping and the triggering of the image capture for each acquired image:

{\n  \"action\": \"image\",\n  \"pump_direction\": \"FORWARD\",\n  \"volume\": 1,\n  \"nb_frame\": 200,\n  \"sleep\": 0.1\n}\n

A valid update_config command with a unique (object_date, sample_id, acq_id) combination must be sent some time before each image command. If an update_config command has not been sent before the image command, the image command will trigger a \u201cStarted\u201d response status and then do nothing (this is a software bug which needs to be fixed so that an error status is reported instead).

The image command has the following parameters:

Parameter Description Type Accepted Values pump_direction Direction of sample pumping. string FORWARD, BACKWARD. volume Volume (in mL) of sample to pump between each captured image. float 0 < volume nb_frame Number of frames to capture. integer 0 < nb_frame sleep Duration (in s) to wait after pumping has stopped before saving an image, to allow the sample objects to stabilize in the image. float 0 < sleep"},{"location":"reference/software/interfaces/mqtt/#image-command-responses","title":"image command responses","text":"

The Python backend can send status updates on the status/imager topic, in response to the image command. The status field of such status updates can have any of the following values:

Status/Error Description Started The image capture process has started successfully. Error At least one field of the\u00a0image\u00a0command is missing or has an invalid value. Error: missing camera No camera is available to use for image acquisition. Configuration update error: object_date is missing! The last time the update_config\u00a0command was sent, it did not have an object_date\u00a0parameter. Configuration update error: Chosen id are already in use! The\u00a0(object_date, sample_id, acq_id)\u00a0combination for the dataset (set by the last update_config\u00a0command) is already used by a previous dataset. Image {index}/{nb_frame} saved to {filename} An image has been successfully captured and saved. Image {index}/{nb_frame} WAS NOT CAPTURED! STOPPING THE PROCESS! An error occurred during image capture; the ongoing image acquisition has finished with failure, resulting in an incomplete dataset. Done The image acquisition finished successfully, resulting in a complete dataset."},{"location":"reference/software/interfaces/mqtt/#stop-command_2","title":"stop command","text":"

This message interrupts any in-progress image acquisition routine and stops any ongoing sample pumping.

{\n  \"action\": \"stop\"\n}\n

The stop command has the following parameters:

Field Description Type Accepted Values action Specifies the stop\u00a0command. string stop"},{"location":"reference/software/interfaces/mqtt/#stop-command-responses_2","title":"stop command responses","text":"

The Python backend can send status updates on the status/imager topic, in response to the stop command. The status field of such status updates can have any of the following values:

Status/Error message Description Interrupted The image capture process was stopped successfully."},{"location":"reference/software/interfaces/mqtt/#non-response-status-updates_3","title":"Non-response status updates","text":"

The Python backend can send status updates on the status/imager topic which are not triggered by any command. The status field of such status updates can have any of the following values:

Status/Error Description Starting up The backend will soon attempt to initialize the camera. Error: missing camera A camera was not detected. Ready The camera is now operational, and the backend has become ready to respond to Imager commands. Dead The backend will no longer respond to Imager commands."},{"location":"reference/software/interfaces/mqtt/#segmenter","title":"Segmenter","text":"

The Segmenter API controls the processing of acquired images:

  • MQTT topics for commands: segmenter/segment
  • MQTT topics for status updates: status/segmenter, status/segmenter/object_id, status/segmenter/metric
  • Commands: segment

For details on how images are processed, refer to our technical reference on image segmentation in the PlanktoScope.

"},{"location":"reference/software/interfaces/mqtt/#segment-command","title":"segment command","text":"

The segment command initiates processing of images stored in the specified path, optionally exporting the results to an EcoTaxa-compatible archive. The various settings parameters of this command provide control over the behavior of image processing. For example, this command initiates processing of all images in the /path/to/segment directory:

{\n  \"action\": \"segment\",\n  \"path\": \"/path/to/segment\",\n  \"settings\": {\n    \"force\": false,\n    \"recursive\": true,\n    \"ecotaxa\": true,\n    \"keep\": true\n  }\n}\n

The segment command has the following parameters:

Parameter Description Type Accepted Values path Path to the directory of images to process.Defaults to /home/pi/data/img. file path (string) any subdirectory of\u00a0/home/pi/data/img (optional) settings.force Force re-segmentation of already-processed directories, ignoring the existence of\u00a0done\u00a0files which otherwise prevent already-segmented directories from being processed again.Defaults to false. boolean true, false (optional) settings.recursive Process datasets in all subdirectories of\u00a0path.Defaults to true. boolean true, false (optional) settings.ecotaxa Export an EcoTaxa-compatible archive.Defaults to true. boolean true, false (optional) settings.keep Keep ROI files generated when exporting an EcoTaxa-compatible archive. It has no effect if settings.ecotaxa\u00a0is false.Defaults to true. boolean true, false (optional)"},{"location":"reference/software/interfaces/mqtt/#segment-command-responses","title":"segment command responses","text":"

The Python backend can send status updates on the status/segmenter topic, in response to the segment command. The status field of such status updates can have any of the following values:

Status/Error message Description Started The segmentation process has begun. Busy The segmenter is currently running and cannot update configurations. Calculating flat The frame background is being calculated. Segmenting image %s, image %d/%d Segmentation of a specific image is in progress. An exception was raised during the segmentation: %s. An error occurred during segmentation. Done Processing has finished for the specified datasets.

As the Python backend performs segmentation, it will repeatedly send additional status updates on the status/segmenter/object_id topic, once for each object isolated by the segmenter. Each status update is a JSON object with the following fields:

Field Description Type object_id A scikit-image region label. integer

As the Python backend performs segmentation, it will repeatedly send additional status updates on the status/segmenter/metric topic, once for each object isolated by the segmenter. Each status update is a JSON object with the following fields:

Field Description Type name An object ID, which is a undersctore-delimited concatenation of the name of the raw image which was processed and the object ID reported by status/segmenter/object_id. string metadata Metadata for the object. struct

The metadata field of status updates sent on the status/segmenter/metric topic is an object with the following fields:

Field Description Type label Label of the object. integer width Width of the smallest rectangle enclosing the object. integer height Height of the smallest rectangle enclosing the object. integer bx X coordinate of the top left point of the smallest rectangle enclosing the object. integer by Y coordinate of the top left point of the smallest rectangle enclosing the object. integer circ Circularity: (4 \u2217 \u03c0 \u2217 Area) / Perimeter^2. A value of 1 indicates a perfect circle, approaching 0 indicates an elongated polygon. float area_exc Surface area of the object excluding holes, in square pixels. integer area Surface area of the object in square pixels. integer %area Percentage of object\u2019s surface area that is comprised of holes. float major Primary axis of the best fitting ellipse for the object. float minor Secondary axis of the best fitting ellipse for the object. float y Y position of the center of gravity of the object. float x X position of the center of gravity of the object. float convex_area The area of the smallest polygon within which all points in the object fit. integer perim The length of the outside boundary of the object. float elongation The result of dividing the major parameter by the minor parameter. float perimareaexc The result of dividing the perim parameter by the area_exc parameter. float perimmajor The result of dividing the perim parameter by the major parameter. float circex (4 \u2217 \u03c0 \u2217 area_exc) / perim^2. float angle Angle between the primary axis and a line parallel to the x-axis of the image. float bounding_box_area Area of the bounding box enclosing the object. integer eccentricity Eccentricity of the object. float equivalent_diameter Diameter of a circle with the same area as the object. float euler_number Euler number of the object. integer extent Ratio of object area to bounding box area. float local_centroid_col Column position of the local centroid. float local_centroid_row Row position of the local centroid. float solidity Ratio of object area to convex area. float MeanHue Mean hue value of the object. float MeanSaturation Mean saturation value of the object. float MeanValue Mean value (brightness) of the object. float StdHue Standard deviation of the hue value of the object. float StdSaturation Standard deviation of the saturation value of the object. float StdValue Standard deviation of the value (brightness) of the object. float"},{"location":"reference/software/interfaces/mqtt/#stop-command_3","title":"stop command","text":"

The stop command interrupts any ongoing image processing. For example:

{\n  \"action\": \"stop\"\n}\n

The stop command has the following parameters:

Parameter Type Accepted Values Description action string \"stop\" Specifies the action to stop segmentation.

Warning

The functionality for this command has not yet been implemented. Currently an Interrupted status is sent as a response on the segmenter/segment topic even though no interruption will actual happen.

"},{"location":"reference/software/interfaces/mqtt/#stop-command-responses_3","title":"stop command responses","text":"

The Python backend can send status updates on the segmenter/segment topic, in response to the stop command. The status field of such status updates can have any of the following values:

Status/Error message Description Interrupted The segmentation process was interrupted."},{"location":"reference/software/interfaces/mqtt/#non-response-status-updates_4","title":"Non-response status updates","text":"

The Python backend can send status updates on the status/segmenter topic which are not triggered by any command. The status field of such status updates can have any of the following values:

Status/Error Description Ready The backend has become ready to respond to Segmenter commands. Dead The backend will no longer respond to Segmenter commands."},{"location":"reference/software/subsystems/installation/","title":"Installation","text":"

This document explains how the PlanktoScope OS's installation process works, as a companion to our non-standard installation guide which carries out the process explained below.

The installation process is initiated by booting into an appropriate installation of the Raspberry Pi OS and then downloading and running the installation bootstrap script, which in turn downloads and runs the appropriate distro setup scripts according to the installation parameters provided to the installation bootstrap script.

"},{"location":"reference/software/subsystems/installation/#installation-bootstrap-script","title":"Installation bootstrap script","text":"

The installation bootstrap script is provided so that a one-line command can be executed to automatically perform the entire process of installing the PlanktoScope OS on top of the Raspberry Pi OS. The GitHub repository which contains that script always publishes the latest version on its stable branch to install.planktoscope.community/distro.sh via GitHub Pages; other versions can be downloaded from GitHub via the corresponding permalinks for those versions of the file (e.g. https://github.com/PlanktoScope/install.planktoscope.community/raw/v2023.9.0/distro.sh for the version from the v2023.9.0 tag in the repository). The installation bootstrap script performs the following steps:

  1. The script loads some parameters (set by environment variables and/or corresponding command-line arguments) which set the behavior of the script.

  2. The script installs git, if it was not already installed (as is the case on the \"Lite\" image of the Raspberry Pi OS); if the yes parameter was not set and git was not already installed, the script will first ask the user to confirm that they wish to install git before the script continues. git is required to resolve version query parameters provided to the script, so that the script can determine how to download the requested version of the PlanktoScope OS's distro setup scripts.

  3. The script clones a minimal \"mirror\" copy of the specified repository (set by the repo parameter) of distro setup scripts to a temporary directory (i.e. a directory created in /tmp). This \"mirror\" copy is used to:

    • Resolve the version query parameters (version-query, query-type, and - when query-type is tag - tag-prefix) into a specific commit hash for the repository.

    • Determine a (pseudo-)version string for the resolved commit based on the last release tag (whose name is prefixed with the tag-prefix parameter) ancestral to that commit.

  4. The script clones a copy of the specified repository (set by the repo parameter) to a temporary directory and checks out the specific commit which was resolved by the previous step; if the yes parameter was not set, the script will first ask the user to confirm that they wish to download the resolved commit of the distro setup scripts before the script continues. Because the repository containing the distro setup scripts may have many large files (e.g. image files for documentation) which are unrelated to the distro setup scripts, this step only downloads files in the specific commit needed for the distro setup scripts.

  5. The script records versioning information for the downloaded installation scripts, saving that information in two YAML files in a particular directory; if that directory already exists and the yes parameter was not set, the script will first ask the user to confirm that they wish to delete and re-create that directory before the script continues. Installed programs can read these files in order to determine the installed version of the PlanktoScope OS.

  6. The script runs the specified script (set by the setup-entrypoint parameter) within the downloaded copy of the specified repository; if the yes parameter was not set, the script will first ask the user to confirm that they wish to run the downloaded distro scripts before the script continues.

"},{"location":"reference/software/subsystems/installation/#script-parameters","title":"Script parameters","text":"Command-Line Flags Environment Variable Name Description -r--repo REPO URL of the Git repository used for downloading the distro setup scripts. If a protocol is not specified, the URL will be assumed to use HTTPS.Default value:\u00a0github.com/PlanktoScope/PlanktoScope -v--version-query VERSION_QUERY The version of the repository to download. The version query is interpreted differently depending on the query type set by the\u00a0query-type\u00a0parameter:
  • Query type\u00a0\u00a0branch: query should be a branch name (e.g. software/beta).
  • Query type\u00a0tag: query should be a Git tag name, excluding the tag prefix specified by the tag-prefix\u00a0parameter (e.g. v2024.0.0\u00a0if tag-prefix\u00a0is software\u00a0and the Git tag is\u00a0software/v2024.0.0).
  • Query type\u00a0hash: query should be a commit hash and may be abbreviated (e.g. 2d6928e).
Default value: software/stable -t--query-type QUERY_TYPE The type of version query set by the version-query\u00a0parameter.Allowed values: branch, tag, hash.Default value: branch -H--hardware HARDWARE The hardware configuration, passed as the first argument to the entrypoint of the distro setup scripts. The distro setup scripts in the\u00a0github.com/PlanktoScope/PlanktoScope\u00a0repo currently expect either none, segmenter-only,\u00a0adafruithat,\u00a0planktoscopehat, or fairscope-latest.Default value: planktoscopehat --tag-prefix TAG_PREFIX The prefix for Git version tags when resolving the version query (with query type\u00a0tag) and when resolving tags (for pseudoversion strings).\u00a0Default value: software/ --setup-entrypoint SETUP_ENTRYPOINT The entrypoint of the distro setup scripts, which will be executed in order to run the downloaded distro setup scripts. This should be a subdirectory path within the repository (set by the repo\u00a0parameter) which will be downloaded at the specified commit (set by the version-query\u00a0and query-type\u00a0parameters and - when query-type\u00a0is tag\u00a0- by the tag-prefix\u00a0parameter) to obtain the distro setup scripts.Default value: software/distro/setup/setup.sh -y-f--yes--force FORCE Whether to automatically confirm all user confirmation prompts:
  • FORCE=1\u00a0(or including the command-line flag) automatically confirms all prompts.
  • Not setting FORCE (or not including the command-line flag) requires user input for confirmation on all prompts.
Default: User input required -V--verbose VERBOSE Whether to display additional (verbose) output:
  • VERBOSE=1\u00a0(or including the command-line flag) enables verbose output.
  • Not setting VERBOSE (or not including the command-line flag) disables verbose output.
Default: Don't display verbose output -h--help Whether to display a help message (which includes this parameter reference table and a list of example commands using this script) and quit without doing any work.

Example combinations of command-line arguments using the above parameters:

  • -v software/stable -H planktoscopehat or -H planktoscopehat: install the latest stable release of the standard PlanktoScope OS (i.e. from the software/stable branch) for a PlanktoScope with the PlanktoScope HAT.

  • -v software/beta -H adafruithat: install the latest beta pre-release or stable release of the standard PlanktoScope OS (i.e. from the software/beta branch) for a PlanktoScope with the Adafruit HAT.

  • -v master -H planktoscopehat: install the latest development version of the standard PlanktoScope OS (i.e. from the master branch) for a PlanktoScope with the PlanktoScope HAT.

  • -t tag -v v2024.0.0-alpha.1 -H adafruithat: install the v2024.0.0-alpha.1 pre-release of the standard PlanktoScope OS (i.e. from the software/v2024.0.0-alpha.1 tag) for a PlanktoScope with the Adafruit HAT.

  • -t hash -v 2d6928e -H planktoscopehat: install 2d6928e commit of the standard PlanktoScope OS for a PlanktoScope with the PlanktoScope HAT.

  • -v master -r github.com/LaurentPV/PlanktoScope -H adafruithat: install the latest development commit of master branch of the github.com/LaurentPV/PlanktoScope fork of the PlanktoScope OS for a PlanktoScope with the Adafruit HAT.

"},{"location":"reference/software/subsystems/installation/#recorded-versioning-information","title":"Recorded versioning information","text":"

Currently the installer script creates two YAML files, both in the /usr/share/planktoscope directory.

/usr/share/planktoscope/installer-config.yml records the values of the parameters with which the installer script was invoked:

YAML Field Name Corresponding Script Parameter Example Value repo repo \"github.com/PlanktoScope/PlanktoScope\" version-query version-query \"v2024.0.0-alpha.1\" query-type query-type \"tag\" hardware hardware \"adafruithat\" tag-prefix tag-prefix \"software/\" setup-entrypoint setup-entrypoint \"software/distro/setup/setup.sh\"

/usr/share/planktoscope/installer-versioning.yml records information about the version of the PlanktoScope OS's distro setup scripts which was used to install the PlanktoScope OS:

Field Name Description repo The path of the Git repository which provided the distro setup scripts, with any leading protocol string (e.g. https://) removed.Example Values:
  1. \"github.com/PlanktoScope/PlanktoScope\"
  2. \"github.com/PlanktoScope/PlanktoScope\"
commit The full hash of the exact commit which provided the distro setup scripts.Example Values:
  1. \"2d6928e596b28f0c4c268fecb588c85215b1027e\"\u00a0(for commit 2d6928e)
  2. \"4d8b882616a8374918730bc1c6d300edfd7a523a\"\u00a0(for commit 4d8b882)
tag The full name of the Git tag (whose name starts with the prefix set by the tag-prefix\u00a0script parameter) at the exact commit which provided the distro setup scripts, if such a tag exists; otherwise, the empty string (\"\").Example Values:
  1. \"software/v2024.0.0-alpha.1\"\u00a0(so commit 2d6928e\u00a0has Git tag software/v2024.0.0-alpha.1)
  2. \"\"\u00a0(so commit 4d8b882\u00a0has no Git tag)
version A version string or pseudo-version string describing the exact commit which provided the distro setup scripts. If a Git tag (with a name starting with the prefix set by the tag-prefix\u00a0script parameter) exists at that commit, this is a version string which just the name of that tag, but with the tag-prefix\u00a0stripped from the name. Otherwise, this is a pseudo-version string with format \"{tag}-{distance}-g{commit}\", where:
  • {tag}\u00a0is the name of the most recent ancestral tag (with a name starting with the prefix set by the tag-prefix\u00a0script parameter) reachable from the commit, but with the tag-prefix\u00a0stripped from the name.
  • {distance}\u00a0distance (in number of commits) between the commit and the most recent ancestral tag.
  • {commit}\u00a0consists of the first seven characters of the hash of the commit.
  • Example Values:
    1. \"v2024.0.0-alpha.1\"\u00a0(so commit 2d6928e\u00a0has Git tag software/v2024.0.0-alpha.1)
    2. \"v2024.0.0-alpha.1-4-g4d8b882\"\u00a0(so commit 4d8b882\u00a0is 4 commits above the commit with Git tag software/v2024.0.0-alpha.1, which was the last tag in the ancestry of the commit)
    "},{"location":"reference/software/subsystems/installation/#distro-setup-scripts","title":"Distro setup scripts","text":"

    Currently, the entrypoint of the distro setup scripts, at software/distro/setup/setup.sh, takes exactly one command-line argument which must be one of the following values:

    • adafruithat: this will cause the distro setup scripts to install a version of the PlanktoScope hardware controller and the PlanktoScope Node-RED dashboard specific to PlanktoScopes using the Adafruit HAT, and to set the default hardware configuration files accordingly.

    • planktoscopehat: this will cause the distro setup scripts to install a version of the PlanktoScope hardware controller and the PlanktoScope Node-RED dashboard specific to PlanktoScopes using the PlanktoScope HAT, and to set the default hardware configuration files accordingly.

    Currently, the distro setup scripts must be run by a user named pi. The scripts should not be run with sudo!

    Currently, the distro setup scripts are split into two phases: setup of the base operating system, and setup of the PlanktoScope application environment. In the future, as we remove various setup steps from these scripts (and instead manage those steps using forklift), we may consolidate these two phases into a single phase.

    "},{"location":"reference/software/subsystems/installation/#base-system-setup","title":"Base system setup","text":"

    This phase performs steps which might (in theory) be useful for other projects which don't use the PlanktoScope hardware but would still benefit from many of the functionalities provided by the PlanktoScope OS. This phase consists of the following steps:

    • Installation of base tools: Docker, Cockpit, and various command-line tools are installed.

    • Installation of forklift and a Forklift pallet: a hard-coded version of forklift is downloaded to /usr/bin/forklift , a hard-coded version of a hard-coded pallet (namely, github.com/PlanktoScope/pallet-standard) is downloaded and prepared for deployment, and the forklift-apply.service systemd service is created and enabled. (Note: in the future, it will be possible to specify the pallet to be installed as a command-line argument.)

    • Partial configuration of Raspberry Pi-specific hardware: the SPI and I2C hardware interfaces are enabled, and the serial port and serial port console are enabled (note: the serial port console will be disabled by the PlanktoScope application environment setup phase so that the serial port can be used for the PlanktoScope's GPS receiver instead), and legacy camera support is disabled.

    • Configuration of the system locale: the system's language is changed to en_US.UTF-8, but the time and measurement formats are changed to en_DK.UTF-8 so that the date format is yyyy-mm-dd and units are metric. The system timezone is set to UTC.

    • Partial configuration of networking: various system services are installed and configured, namely dhcpcd, dnsmasq, hostapd, and firewalld. The enable-interface-forwarding.service and autohotspot.service systemd services are created and enabled. The Raspberry Pi's Wi-Fi country is set to the US.

    • Cleanup: SSH keys are reset to be regenerated on the next boot, unnecessary APT files are removed, and the OS machine ID is reset to be regenerated on the next boot.

    "},{"location":"reference/software/subsystems/installation/#planktoscope-application-environment-setup","title":"PlanktoScope application environment setup","text":"

    This phase performs steps specific to the PlanktoScope's hardware:

    • Remaining configuration of networking: a hard-coded version of machine-name is downloaded to /usr/bin/machine-name, avahi-utils is installed using APT, and various systemd services are created and enabled to update the PlanktoScope OS's networking configurations based on a machine name which will be determined by machine-name from the Raspberry Pi's serial number at every boot. Additional systemd services are created and enabled so that the PlanktoScope will be accessible over some additional mDNS names (namely, pkscope.local and planktoscope.local).

    • Setup of the PlanktoScope hardware controller: various Python tools (pip, venv, and poetry) are installed using APT, a hard-coded version of a hard-coded Git repository (namely github.com/PlanktoScope/device-backend) is cloned, and various dependencies (both system libraries and Python packages) of the hardware controller are installed. The planktoscope-org.device-backend.controller-adafruithat.service and planktoscope-org.device-backend.controller-planktoscopehat.service systemd services are created, and the appropriate one is enabled depending on which HAT the PlanktoScope OS is being installed for. The appropriate hardware configuration file will also be copied into the location expected by the hardware controller. (Note: once the PlanktoScope hardware controller is containerized and managed in Forklift, this step will be eliminated.)

    • Setup of GPIO stepper initialization at boot: a systemd service is created to release the stepper motors at startup. (Note: this service currently doesn't work and will eventually be deleted or replaced.)

    • Setup of the PlanktoScope Node-RED dashboard: Node-RED is installed, as well as a Python package required by the adafruithat version of the PlanktoScope Node-RED dashboard (Note: the dependency on that package will eventually be removed.). The appropriate version of the PlanktoScope Node-RED dashboard and will be copied to the location expected by Node-RED depending on which HAT the PlanktoScope OS is being installed for, along with the appropriate configuration file. Finally, npm packages required by the Node-RED dashboard are installed. (Note: once the Node-RED dashboard is containerized and managed in Forklift, this step will be eliminated.)

    • Setup of hardware support for the PlanktoScope's real-time clock module: A kernel devicetree overlay is enabled. (Note: this currently enables support for the wrong hardware real-time clock chip, so it doesn't work yet.)

    • Setup of hardware support for the PlanktoScope's GPS receiver: gpsd and chrony are installed and configured. (Note: currently the configurations may be incorrect.)

    • Configuration of CPU overclocking: the CPU is overclocked so that the PlanktoScope segmenter will run more quickly. (Note: in the future, this will be removed.)

    • Cleanup: unnecessary APT and pip files are removed.

    "},{"location":"reference/software/subsystems/startup/","title":"Startup","text":"

    This reference document is a companion to our explanation about the PlanktoScope software as an operating system, particularly its discussion of the operating system's boot sequence and its explanation of the various system services provided with the operating system. Specifically, this document lists information about what happens when the PlanktoScope is powered on.

    "},{"location":"reference/software/subsystems/startup/#services","title":"Services","text":"

    The PlanktoScope OS's daemons and system services (beyond what is already provided by the default installation of the Raspberry Pi OS) are defined with the following boot sequencing relationships:

    "},{"location":"reference/software/subsystems/startup/#software-deployment-execution","title":"Software deployment & execution","text":"

    In general:

    • dockerd (managed by docker.service) can start before network connectivity has been established; this is not the default behavior for dockerd.

    • All daemons & background processes not described in the rest of this page are sequenced by systemd according to the systemd unit dependency relationships specified by the default systemd service files installed with the APT packages which provide those programs.

    The PlanktoScope OS's setup scripts provide some system services which are not managed by Forklift, because they are used to integrate Forklift into the OS in order to bootstrap the system services and config files provided by Forklift:

    • overlay-sysroot.service runs after -.mount and systemd-remount-fs.service.

    • bindro-run-forklift-stages-current.service runs after -mount and systemd-remount-fs.service and before overlay-fs.target.

    • overlay-usr.service runs after overlay-sysroot.service and before overlay-fs.target.

    • overlay-etc.service runs after overlay-sysroot.service and systemd-machine-id-commit.service , and before systemd-sysctl.service and overlay-fs.target.

    • start-overlaid-units.service runs after overlay-fs.target and basic.target.

    • bind-.local-share-forklift-stages@home-pi.service runs after -.mount, home.mount, and basic.target.

    • forklift-apply.service, which uses the forklift tool to start all Docker Compose applications, runs after docker.service has started. Docker Compose applications managed with forklift are sequenced by forklift-apply.service according to the resource dependency relationships declared by the Forklift packages which provide those applications.

    "},{"location":"reference/software/subsystems/startup/#networking","title":"Networking","text":"

    For descriptions of the various targets (e.g. sysinit.target, network-pre.target) referred to below, see systemd's bootup process and systemd's special targets:

    • generate-machine-name.service and generate-hostname-templated.service runs before sysinit.target.

    • update-hostname.service runs after generate-hostname-templated.service and systemd-hostnamed.service but before network-pre.target.

    • assemble-dnsmasq-config-templated.service runs after generate-machine-name.service and generate-hostname-templated.service but before dnsmasq.service.

    • assemble-hosts-templated.service and assemble-hosts.service run after generate-machine-name.service and generate-hostname-templated.service but before dnsmasq.service and network-pre.target.

    • enable-interface-forwarding.service runs before network-online.target.

    • assemble-hostapd-config-templated.service and assemble-hostapd-config.service run after generate-machine-name.service and generate-hostname-templated.service but before hostapd.service.

    • The hostapd daemon is manually started and stopped by autohotspot.service.

    • autohotspot.service runs after forklift-apply.service and enable-interface-forwarding.service have started (so that the PlanktoScope's web browser-based user interfaces are ready for connections before the PlanktoScope's Wi-Fi hotspot is started) and before network connectivity is considered to have been established. It is re-run every one or two minutes by autohotspot.timer.

    • planktoscope-mdns-alias@pkscope.service and planktoscopemdns-alias@planktoscope.service configure the Avahi daemon (provided by the Raspberry Pi OS) to also resolve mDNS names pkscope.local and planktoscope.local, respectively, to an IP address (192.168.4.1) which is usable by devices connected to the PlanktoScope by a direct connection between their respective network interfaces.

    "},{"location":"reference/software/subsystems/startup/#user-interface","title":"User interface","text":"
    • assemble-cockpit-config.service, assemble-cockpit-origins.service, and assemble-cockpit-origins-templated.service update Cockpit's configuration file from drop-in config file fragments in /etc/cockpit/cockpit.conf.d, /etc/cockpit/origins.d, and /etc/cockpit/origins-templates.d, respectively. They run after generate-machine-name.service and generate-hostname-templated.service and before cockpit.service.

    • ensure-ssh-host-keys.service regenerates the SSH server's host keys if the keys are missing, and runs before ssh.service.

    • The PlanktoScope Node-RED dashboard (managed by nodered.service) starts after planktoscope-org.update-machine-name.service has started, to ensure that the Node-RED dashboard has the correct machine name. (In the future the PlanktoScope Node-RED dashboard will instead be run as a Docker container and will be managed by forklift.)

    "},{"location":"reference/software/subsystems/startup/#planktoscope-specific-hardware-abstraction","title":"PlanktoScope-specific hardware abstraction","text":"
    • The PlanktoScope hardware controller (managed by planktoscope-org.device-backend.controller-{adafruithat or planktoscopehat}.service) starts after forklift-apply.service (which manages Mosquitto) and nodered.service have started, to ensure that the PlanktoScope hardware controller broadcasts the detected camera model name only after the PlanktoScope Node-RED dashboard is ready to receive that broadcast. (In the future the PlanktoScope hardware controller will instead be run as a Docker container and will be managed by forklift.)
    "},{"location":"setup/","title":"Setup","text":"

    This section of the PlanktoScope documentation will help you get to a working PlanktoScope. Every PlanktoScope has two aspects which have to work together: the hardware and the software. Depending on what hardware you already have, you should start at different places in the documentation:

    • \"I have a product from FairScope\": you probably received either a fully-assembled Planktoscope or a PlanktoScope do-it-yourself assembly kit. For more information, see the FairScope product section of this page.
    • \"I have a fully assembled PlanktoScope, and it was not assembled by FairScope\": you will need to ensure that you have the latest version of the PlanktoScope software installed on the PlanktoScope, and that the PlanktoScope hardware works. For more information, see the Fully-assembled PlanktoScope section of this page.
    • \"I have a kit of hardware parts to assemble into a PlanktoScope, and it was not provided by FairScope\": you will need to assemble your PlanktoScope hardware and then set up the software on it. For more information, see the DIY kit section of this page.
    • \"I don't have any of the hardware for the PlanktoScope\": you have several options for getting the PlanktoScope hardware. For more information, see the No hardware yet section of this page.
    "},{"location":"setup/#fairscope-product","title":"FairScope product","text":"

    You probably purchased either a fully-assembled PlanktoScope or a do-it-yourself assembly kit from FairScope. The various sections of this documentation will provide you with instructions for how to proceed:

    • If you purchased a fully-assembled PlanktoScope, it is ready for you to use! You should go to our operation guide to learn how to operate your PlanktoScope.
    • If you purchased a do-it-yourself assembly kit from FairScope, you should go to our hardware setup guide to learn how to assemble your kit into a working PlanktoScope. The software will already have been set up for you, so after you finish setting up the hardware you can proceed to our operation guide to learn how to operate your PlanktoScope.
    "},{"location":"setup/#fully-assembled-planktoscope","title":"Fully-assembled PlanktoScope","text":"

    If you have a fully-assembled PlanktoScope which was provided to you by FairScope, please refer instead to the Fairscope product section of this page. If someone else provided you with a PlanktoScope, you might need to do some additional hardware setup, software setup, calibration, and/or troubleshooting - please talk to them to figure out what might be needed. The various sections of this documentation site may be a useful resource for you:

    • Depending on what software is pre-installed on your PlanktoScope, and how old the software is, our software setup guide may be useful to help you update the software. You should always ensure that you are running the most recent available version of the PlanktoScope software.
    • Depending on what software configuration your PlanktoScope is running, our operation guide may be useful to help you operate your PlanktoScope.
    "},{"location":"setup/#diy-kit","title":"DIY kit","text":"

    If you have a DIY assembly kit which was provided to you by FairScope, please refer instead to the Fairscope product section of this page. If someone else provided you with a DIY assembly kit, the process for assembling it into a PlanktoScope may be different from what is described in this documentation site - please talk to them to figure out what you should do. The various sections of this documentation site may be a useful resource for you:

    • Depending on what is included in your DIY kit, our hardware setup guide may be useful to assemble a PlanktoScope from your kit.
    • Depending on what is on the micro-SD card included with your DIY kit (if it includes a micro-SD card), our software setup guide may be useful to help you update the software. You should always ensure that you are running the most recent available version of the PlanktoScope software.
    • Depending on what software configuration your PlanktoScope is running, our operation guide may be useful to help you operate your PlanktoScope.
    "},{"location":"setup/#no-hardware-yet","title":"No hardware yet","text":"

    If you don't have any hardware for a PlanktoScope yet, you have a few options depending on how much work you want to do, what your budget is, and how much troubleshooting you are willing to do:

    1. Purchase a fully pre-assembled PlanktoScope.
    2. Purchase a DIY kit of parts to assemble into a PlanktoScope.
    3. Both make your own kit of parts and assemble it into a PlanktoScope.
    "},{"location":"setup/#buy-a-pre-assembled-planktoscope","title":"Buy a pre-assembled PlanktoScope","text":"

    You can buy a PlanktoScope from FairScope, which is a small business started by the inventor of the PlanktoScope in order to make it easier for people to obtain PlanktoScopes. If you buy a PlanktoScope from FairScope, it will be fully standard, fully assembled, and fully tested. It will already have been calibrated in order to produce scientific data which can be compared with data from other PlanktoScopes, without requiring you to perform any additional calibration steps. The software will be pre-installed, so that once you receive your PlanktoScope you can immediately start using it.

    We recommend this approach for:

    • Anyone who wants a PlanktoScope which \"just works\" out-of-the-box.
    • Scientists who just want to collect data and don't want to become engineers.
    • Anyone who just wants to use the PlanktoScope as a tool, rather than tinkering with their PlanktoScope as a project.
    "},{"location":"setup/#buy-a-diy-kit","title":"Buy a DIY kit","text":"

    If you are on a budget which does not allow you to buy a fully-assembled PlanktoScope from FairScope, you can instead buy a do-it-yourself assembly kit from FairScope. By assembling your PlanktoScope yourself, you will gain a deeper understanding of how it works, how to troubleshoot any problems you might encounter, and how to repair your PlanktoScope if you damage its hardware. If you make any mistakes while assembling the PlanktoScope, you will have to do some troubleshooting. You will also need to calibrate your PlanktoScope if you want to use it to produce data useful for scientists.

    We recommend this approach for:

    • Anyone who wants a standard PlanktoScope but is on a limited budget, and has some interest in building things and troubleshooting problems.
    • Anyone who wants to approach the PlanktoScope as a project and not just a tool, but who has a limited tolerance of technical complexity.
    • Anyone who wants a do-it-yourself experience but does not have access to a laser cutter or CNC mill.
    • Anyone who wants a standard set of parts as the foundation for customizing their PlanktoScope.
    • Engineers and makers who don't want to worry about figuring out suppliers and making their own one-time supply chain in order to obtain all the hardware parts needed to build a single PlanktoScope.
    "},{"location":"setup/#make-a-kit-and-assemble-it","title":"Make a kit and assemble it","text":"

    If you don't want to purchase a pre-assembled PlanktoScope or a DIY assembly kit from FairScope, you will need to make your own assembly kit, and then assemble it into a PlanktoScope. This will require identifying sellers who will provide you with the necessary parts, and it will require identifying a way either to fabricate various mechanical parts yourself or to use a commercial service to fabricate those parts for you. Depending on which version of the PlanktoScope hardware you want to build, you might also need to assemble a custom printed circuit board (or work with a commercial service to assemble it for you). Once you have a kit, you can begin to assemble your PlanktoScope from it. You will almost certainly have to do some troubleshooting of problems with how you assembled your hardware, which is a great learning opportunity - but only if you're interested in it.

    We recommend this approach for:

    • Anyone who is on an extremely limited budget but has lots of time and some hardware engineering experience.
    • Makers who are already familiar with laser cutting or CNC milling, and with soldering or PCB assembly (the necessary skills will depend on the version of PlanktoScope hardware being built).
    • Hobbyists and students who are primarily interested in the PlanktoScope as an engineering project and want to figure out everything by themselves.
    • Anyone who wants to design and build an extremely non-standard PlanktoScope, whether for fun or to use it for unconventional purposes.
    "},{"location":"setup/#next-steps","title":"Next steps","text":"

    After finishing any necessary hardware setup and all necessary software setup for your PlanktoScope, you can proceed to our guide on how to operate your PlanktoScope.

    "},{"location":"setup/hardware/","title":"PlanktoScope Hardware","text":"

    This section of the PlanktoScope documentation will help you to build the hardware of a PlanktoScope. Our documentation splits this PlanktoScope production process into two phases: making a kit of parts, and assembling a PlanktoScope from that kit of parts.

    If you do not already have a kit of parts, you will need to either purchase a kit or make a kit yourself. You will need to choose a PlanktoScope hardware version and obtain the hardware components necessary for that hardware version; your assembly kit will consist of those components. You can purchase a kit from FairScope, a small business started by the inventor of the PlanktoScope in order to make it easier for people to obtain PlanktoScopes. Once you have selected a hardware version, you can proceed to our instructions for making your kit.

    If you do already have a kit of parts, you can proceed to our instructions for assembling your kit into a PlanktoScope. However, you will first need to determine the PlanktoScope hardware version which your kit is made for, so that you can choose the correct assembly guide for your kit.

    "},{"location":"setup/hardware/#hardware-versions","title":"Hardware versions","text":"

    The design of the PlanktoScope's hardware has been evolving to fix usability issues and improve the quality of images captured by the PlanktoScope. Thus, multiple versions of the hardware have been developed. This page only describes hardware versions for which documentation has been published for anyone to manufacture the hardware, and here we only describe aspects of each hardware version relevant to choosing a version to manufacture. Due to a lack of time by the people developing the PlanktoScope hardware, documentation for other versions of the PlanktoScope hardware has not yet been created; for information on these other versions of the PlanktoScope hardware, please refer to the technical reference section of our documentation site.

    "},{"location":"setup/hardware/#hardware-v21","title":"Hardware v2.1","text":"

    This was the first publicly released version of the PlanktoScope hardware. The electronic components of this design are all available from commercial off-the-shelf sources, using an Adafruit Stepper Motor HAT to control various actuators and a Yahboom RGB Cooling HAT to cool the PlanktoScope's embedded Raspberry Pi 4 computer. The mechanical structure was designed for fabrication using a laser cutter. This hardware version has some design flaws, such as providing no way to replace the Raspberry Pi's micro-SD card without partially disassembling the PlanktoScope; these problems have been fixed in later versions of the PlanktoScope hardware.

    This version of the PlanktoScope hardware is the only version which has been widely replicated by independent makers so far. Note that this hardware design specifies a peristaltic pump which is no longer commercially available, so anyone making an assembly kit for this version will have to identify a different pump to use as a substitute.

    "},{"location":"setup/hardware/#hardware-v25","title":"Hardware v2.5","text":"

    This version includes many design improvements to solve various problems with the v2.1 hardware design, including:

    • Replacing the ibidi flowcell with a simpler glass capillary flowcell.

    • Replacing the Adafruit Stepper Motor HAT with a HAT designed specifically for the PlanktoScope (the PlanktoScope HAT).

    • Replacing the linear actuators for sample focusing with a more mechanically robust pair of linear actuators.

    • Replacing the peristaltic pump with a more accurate pump which is commercially available.

    • Making the Raspberry Pi's micro-SD card accessible without requiring disassembly of the PlanktoScope.

    The mechanical structure of this design uses CNC-milled parts rather than laser-cut parts.

    Our documentation site provides manufacturing documentation to make assembly kits for this hardware version, and to assemble kits for this version into PlanktoScopes.

    "},{"location":"setup/hardware/#choosing-a-version","title":"Choosing a version","text":"

    We recommend building a PlanktoScope of the latest available hardware version (currently v2.5). However, if you are making your own assembly kit and the following limitations apply to you, you may need to choose an older hardware version such as v2.1:

    • You do not have access to a CNC mill, or to a commercial fabrication service with a CNC mill.

    • You do not have access to manufacturing capabilities for assembling a custom printed circuit board, and you cannot buy a pre-assembled HAT from FairScope.

    "},{"location":"setup/hardware/#building-a-planktoscope","title":"Building a PlanktoScope","text":"

    If you received a PlanktoScope hardware assembly kit from someone but you are not sure what hardware version the kit is for, you should check with the person who gave the kit to you.

    Once you have figured out what hardware version of the PlanktoScope you will build, you can proceed to our version-specific hardware setup guides:

    • If you are building a PlanktoScope with the v2.5 hardware, please proceed to our page for Hardware v2.5 to find instructions for making an assembly kit, as well as instructions for building a PlanktoScope from an assembly kit for v2.5 of the hardware.

    • If you are building a PlanktoScope with the v2.1 hardware, please proceed to our page for Hardware v2.1 to find instructions for making an assembly kit, as well as instructions for building a PlanktoScope from an assembly kit for v2.1 of the hardware.

    "},{"location":"setup/hardware/#next-steps","title":"Next steps","text":"

    After making an assembly kit (if necessary) and building a PlanktoScope from your assembly kit, you should proceed to our software setup guide.

    "},{"location":"setup/hardware/index-noguides/","title":"PlanktoScope Hardware","text":"

    You are viewing a copy of the PlanktoScope project documentation without the hardware setup guides, probably because you're viewing an offline, reduced-size copy of the PlanktoScope documentation served by your PlanktoScope. You should go to an online copy of the PlanktoScope documentation to find the hardware setup guides.

    "},{"location":"setup/hardware/v2.1/","title":"Hardware v2.1","text":"

    This page will help you to build the v2.1 hardware for a PlanktoScope.

    "},{"location":"setup/hardware/v2.1/#make-an-assembly-kit","title":"Make an assembly kit","text":"

    If you do not already have an assembly kit, you will need to make a kit for yourself. Note: you will need to set up the PlanktoScope software on the micro-SD card of your PlanktoScope's Raspberry Pi, as part of the assembly kit.

    You should be aware that some of the parts required for the kit, especially the peristaltic pump, are no longer commercially available; you will have to identify alternatives to substitute for those parts.

    "},{"location":"setup/hardware/v2.1/#assemble-a-planktoscope-from-a-kit","title":"Assemble a PlanktoScope from a kit","text":"

    Once you have an assembly kit, you will need to assemble it into a PlanktoScope.

    "},{"location":"setup/hardware/v2.1/#next-steps","title":"Next steps","text":"

    Once you have assembled your PlanktoScope, you can proceed to our operation guide\u00a0to learn how to operate your PlanktoScope.

    "},{"location":"setup/hardware/v2.1/assembly/","title":"Assembly guide of the PlanktoScope","text":"

    You can also use CAD renders and photos from the following links as a supplementary material for this assembly guide:

    • CAD renders for the assembly guide
    • Photos for the assembly guide

    For the assembly guide below, the pieces of the laser-cut structure are referred to by single-letter labels (A, J, L, K, H, F, E, C, B, N, M, D, G, I) according to the following assignments:

    "},{"location":"setup/hardware/v2.1/assembly/#step-1-gather-everything-you-need","title":"Step 1: Gather everything you need","text":"

    For the full list of all required tools and parts, please refer to the v2.1 hardware kit production guide.

    • Laser cut structure
    • M12 lenses
    • Peristaltic pump and tubing
    • Raspberry Pi, motor driver board, GPIO connectors
    • Flashed SD card
    • Stepper motors
    • PiCam and flex cable
    • GPIO ribbon connector, headers, HATs, LED
    • DC Power terminal
    • Magnets
    • Super glue
    • Standoffs (M2.5), M3 screws and nuts

    Make sure you have your screwdriver kit, soldering iron, and components ready. Also, remember to flash the PlanktoScope image disk on the SD card before installing the Raspberry Pi.

    If you are not familiar with any process, such as soldering, tapping, or wiring, try and familiarize yourself with the topics first.

    Soldering deals with high heat and potentially toxic materials, so make sure to use the proper precautions.

    "},{"location":"setup/hardware/v2.1/assembly/#step-2-standoff-installation","title":"Step 2: Standoff installation","text":"

    Place 8 standoffs (M2.5 6mm) into the designated holes on the laser-cut base A. A pair of pliers make the job more comfortable. Do not overtighten as it is possible to crack the base material.

    "},{"location":"setup/hardware/v2.1/assembly/#step-3-motor-hat-preparation","title":"Step 3: Motor HAT preparation","text":"

    Insert and solder the terminal blocks and headers onto the motor driver PCB.

    Place the motor driver PCB on to the indicated standoffs.

    "},{"location":"setup/hardware/v2.1/assembly/#step-4-magnets-setup","title":"Step 4: Magnets setup","text":"

    Now is a good time to think about how the magnets will function within the microscope. The magnets in the sample stage will need to attract to the magnets on the flow cell holder. The magnets in the objective holder will need to attract the magnets on the mount. Keep this in mind as you are adding your magnets and tapping your respective M12 holders so your orientation will be correct.

    You can now fix your magnets into their appropriate holes on sample stage B. It is recommended to glue the magnets in place. If the magnets are too large to fit in, the holes can be widened with a handheld drill. However, they should be quite snug in place. Before you glue them in place make sure that the polarity is maintained, as they will be impossible to remove after gluing.

    "},{"location":"setup/hardware/v2.1/assembly/#step-5-sample-stage-assembly","title":"Step 5: Sample stage assembly","text":"

    Don\u2019t be alarmed by the color swap, this is the sample stage B. You can now fit the pegs on the driver mounts into the corresponding holes on the sample stage. They should be glued in place with superglue or epoxy. You can spin the shaft to align the driver mounts on the 2 steppers if it helps making the process easier.

    You should now have a sample stage and motor assembly that looks like this.

    "},{"location":"setup/hardware/v2.1/assembly/#step-6-lenses-tapping-and-mounting","title":"Step 6: Lenses tapping and mounting","text":"

    You now need to tap the holes for the M12 lenses in stage and mount M and D. It is helpful for alignment to do both the objeDtive and tube lens mount together. It is important to do this as straight as possible. A drop of mineral or olive oil can help the process. Be careful to use a right-hand tap (that goes down when turning clockwise).

    You can now screw the objective lens (the 25mm one) in part D.

    "},{"location":"setup/hardware/v2.1/assembly/#step-7-camera-preparation","title":"Step 7: Camera preparation","text":"

    You can now unscrew the lens from the Pi camera, being careful not to disturb the sensor below.

    "},{"location":"setup/hardware/v2.1/assembly/#step-8-camera-mount","title":"Step 8: Camera mount","text":"

    You can mount the camera using the appropriate holes on the camera mount G. Be careful to avoid getting oil or dust on the sensor.

    "},{"location":"setup/hardware/v2.1/assembly/#step-9-led-preparation","title":"Step 9: LED preparation","text":"

    The LED can then be wired up and put into its mount F. If you wire the LED yourself, remember to give enough length to reach the motor driver on the other end of the microscope. You can also add a bit of glue to fix F to the motor mount E at this time to make assembly easier, though it is not required.

    Warning

    This picture shows the correct wiring for the LED. Please make sure the red wire is on the long pin of the LED.

    "},{"location":"setup/hardware/v2.1/assembly/#step-10-vertical-slices-assembly","title":"Step 10: Vertical slices assembly","text":"

    You can now start placing the motor mount/LED assembly- B,

    C,

    D,

    E,

    F,

    and G into the base A.

    "},{"location":"setup/hardware/v2.1/assembly/#step-11-pump-setup","title":"Step 11: Pump setup","text":"

    The pump can then be mounted in place on H. Thread the wires through the hole with the pump tubing pointed toward the holes on the mount.

    Fix the pump in place.

    "},{"location":"setup/hardware/v2.1/assembly/#step-12-pump-mounting","title":"Step 12: Pump mounting","text":"

    You can now mount the pump on base A.

    Your setup should look like this. Don't worry about the wiring, we'll have a look at it in the next step!

    "},{"location":"setup/hardware/v2.1/assembly/#step-13-motor-hat-wiring","title":"Step 13: Motor HAT wiring","text":"

    You will now want to wire the steppers and pump to the terminals on the motor driver board.

    Info

    The PlanktoScope uses only bipolar stepper motors (with 4 wires coming out, and two coils inside), so you need to identify the two wires working together for each coil. The RepRap Wiki has great information on how to do this, either with a multimeter or without.

    You can find more information about stepper motors and how they work in this document.

    Tip

    If your wires are too short, you can invert the pump and the focus wiring. However, you will have to remember to change the configuration later on.

    Tip

    Make sure the wires are properly connected by pulling on them a little. They should not come loose.

    "},{"location":"setup/hardware/v2.1/assembly/#step-14-raspberry-pi-setup-and-installation","title":"Step 14: Raspberry Pi setup and installation","text":"

    At this point, you can insert your flashed SD card into your Raspberry Pi. If you did not already flash your SD card with the PlanktoScope OS, refer to our guide for doing so. The heat sink can also be added to the processor.

    Mount the Raspberry Pi containing the flashed SD card on the standoffs attached to the laser cut base A.

    "},{"location":"setup/hardware/v2.1/assembly/#step-15-standoffs","title":"Step 15: Standoffs","text":"

    Add 8 standoffs (M2.5 15mm) to fix the motor driver board and the Raspberry Pi to the base.

    "},{"location":"setup/hardware/v2.1/assembly/#step-16-camera-flex-cable","title":"Step 16: Camera flex cable","text":"

    At this point you can use the Pi camera flex cable to connect the camera to the Pi. This is done by gently pulling up the tensioners, inserting the cable in the right orientation, then pushing the tensioners back in place to set the cable. Try not to kink or fold the flex cable too much as it is possible to damage it.

    "},{"location":"setup/hardware/v2.1/assembly/#step-17-power-supply-wiring","title":"Step 17: Power supply wiring","text":"

    The power wires can be wired into place on the motor driver board.

    Tip

    Make sure the wires are properly connected by pulling on them a little. They should not come loose.

    "},{"location":"setup/hardware/v2.1/assembly/#step-18-prepare-the-gps-hat","title":"Step 18: Prepare the GPS HAT","text":"

    Tip

    If you don't have a GPS HAT, you can just skip the assembly steps related to the GPS HAT - the PlanktoScope software will still work without GPS.

    Insert the battery to power the GPS HAT and solder the terminal mounts in place.

    "},{"location":"setup/hardware/v2.1/assembly/#step-19-install-the-gps-hat","title":"Step 19: Install the GPS HAT","text":"

    Mount the GPS HAT over the motor driver PCB using the standoffs attached to the laser cut base A.

    "},{"location":"setup/hardware/v2.1/assembly/#step-20-install-the-fan-hat","title":"Step 20: Install the Fan HAT","text":"

    Place the cooling fan HAT above the Raspberry Pi by mounting it to the standoffs on base A.

    Warning

    Be careful to slide the camera flat cable in the slot in the HAT above the connector.

    "},{"location":"setup/hardware/v2.1/assembly/#step-21-secure-the-hats","title":"Step 21: Secure the HATS","text":"

    Secure the cooling fan HAT and GPS HAT by tightening the 8 screws to the standoffs on base A

    "},{"location":"setup/hardware/v2.1/assembly/#step-22-install-back-panel","title":"Step 22: Install back panel","text":"

    Insert the laser cut border I into base A.

    "},{"location":"setup/hardware/v2.1/assembly/#step-23-gps-output-connector","title":"Step 23: GPS output connector","text":"

    Insert the power and GPS connectors into side plate J.

    "},{"location":"setup/hardware/v2.1/assembly/#step-24-install-side-panel","title":"Step 24: Install side panel","text":"

    Place the side plate J into the designated slots on the base. You can connect the GPS cable to its connector on the board.

    Warning

    The GPS connector is quite fragile, make sure to align it properly before inserting it.

    "},{"location":"setup/hardware/v2.1/assembly/#step-25-install-the-other-side-panel","title":"Step 25: Install the other side panel","text":"

    Mount the side plate K on base A using the assigned slots.

    "},{"location":"setup/hardware/v2.1/assembly/#step-26-secure-the-sides-together","title":"Step 26: Secure the sides together","text":"

    Secure the laser cut sides with the screws and nuts.

    "},{"location":"setup/hardware/v2.1/assembly/#step-27-secure-the-sides-to-the-base-plate","title":"Step 27: Secure the sides to the base plate","text":"

    Secure the laser cut sides to the base plate A with the screws and nuts.

    Warning

    To make this easier, you can turn the assembly upside down or on its side. Be careful when doing so as the plates may fall.

    "},{"location":"setup/hardware/v2.1/assembly/#step-28-insert-the-camera-ribbon-cable-in-the-camera","title":"Step 28: Insert the camera ribbon cable in the camera","text":"

    You can now connect the camera flex cable into the connector on the camera board. Once again, gently pull up the tensioners, insert the cable in the right orientation, and push the tensioners back in place to set the cable. Try not to kink or fold the flex cable too much as it is possible to damage it.

    "},{"location":"setup/hardware/v2.1/assembly/#step-29-assemble-the-gpio-ribbon-cable","title":"Step 29: Assemble the GPIO ribbon cable","text":"

    If you didn't get an already assembled ribbon cable, you need to build it yourself.

    The orientation of the connector does not really matter. However, you need to make sure that both connectors are oriented in the same direction and are on the same side of the ribbon.

    To assemble, slide the ribbon in its connector and close it off. You need to tighten it really hard. It's very warmly recommended to use a vice to do so.

    Warning

    Once assembled, the ribbon should NOT look like this:

    It should rather look like this:

    "},{"location":"setup/hardware/v2.1/assembly/#step-30-insert-the-ribbon-cable","title":"Step 30: Insert the ribbon cable","text":"

    Attach the GPIO ribbon to connect the cooling fan HAT to the GPS HAT.

    Tip

    You can try to route the flat ribbon from the camera under the ribbon cable you are connecting now.

    "},{"location":"setup/hardware/v2.1/assembly/#step-31-fluidic-assembly","title":"Step 31: Fluidic assembly","text":"

    Feed in the tubing from syringe 1 to form the fluidic path as shown.

    Feed in the tubing from syringe 2 to form the fluidic path as shown

    Feed in a length of tubing as shown through motor mount H and illumination mount FE

    "},{"location":"setup/hardware/v2.1/assembly/#step-32-close-your-planktoscope","title":"Step 32: Close your PlanktoScope","text":"

    Warning

    Take a moment to check your wiring one last time. Also check the routing, make sure the LED wires and the pump stepper wires are in their dedicated channel.

    Place the top L into the slots on the PlanktoScope body. Secure it in place with screws and nuts.

    "},{"location":"setup/hardware/v2.1/assembly/#step-33-enjoy","title":"Step 33: Enjoy!","text":"

    Congratulations on a job well done. You can have some rest, get a tea and some biscuits!

    Warning

    If this was your first time assembling a PlanktoScope, you will probably need to do some troubleshooting of problems with the hardware assembly before your PlanktoScope will fully work. Refer to our troubleshooting documentation for assistance.

    "},{"location":"setup/hardware/v2.1/assembly/#next-steps","title":"Next steps","text":"

    Once your PlanktoScope fully works, you can proceed to our operation guide\u00a0to learn how to operate your PlanktoScope.

    "},{"location":"setup/hardware/v2.1/kit/","title":"Kit Production","text":""},{"location":"setup/hardware/v2.1/kit/#required-tools","title":"Required Tools","text":"

    Building the PlanktoScope involves components that can be sourced from various vendors, both online and locally. The assembly process is straightforward and can be completed within a few hours. Our website offers detailed guides for both hardware and software assembly, and the PlanktoScope community is ready to assist you with any questions or issues.

    "},{"location":"setup/hardware/v2.1/kit/#soldering-station","title":"Soldering Station","text":"

    A soldering station with flux, or flux core solder, is necessary for making a few electrical connections. Purchase here.

    "},{"location":"setup/hardware/v2.1/kit/#tap-wrench","title":"Tap Wrench","text":"

    Any tap wrench compatible with the M12x0.5 tap will work. Purchase here.

    "},{"location":"setup/hardware/v2.1/kit/#m12-x-05-tap","title":"M12 x 0.5 Tap","text":"

    An M12x0.5 tap is required to secure the objective and tube lenses. Purchase here.

    "},{"location":"setup/hardware/v2.1/kit/#screwdriver-kit","title":"Screwdriver Kit","text":"

    A screwdriver kit with multiple drivers simplifies many assembly operations. Purchase here.

    "},{"location":"setup/hardware/v2.1/kit/#required-components","title":"Required Components","text":"

    Below is a comprehensive list of components required to build the PlanktoScope V2.1, along with links to purchase them in both the US and France.

    "},{"location":"setup/hardware/v2.1/kit/#electronic-components","title":"Electronic Components","text":"Quantity Name Details US Link FR Link 1 Raspberry Pi 4 B (4GB) The single board computer from Raspberry Pi with 4GB of memory Amazon US DigiKey FR 1 Adafruit Stepper Motor HAT Controls 2 steppers: focus and pump stepper motors Amazon US Amazon FR 1 Adafruit Ultimate GPS HAT Stores date & time and logs GPS coordinates Amazon US DigiKey FR 1 Yahboom Cooling Fan HAT Cools and provides visual feedback with LEDs Amazon US Kubii FR 1 Hammer Header Male 2x20 Only one needed Amazon US Mouser FR 1 Stacking Header 2x20 Only one needed Amazon US Mouser FR 2 Pitch IDC Sockets 2x20 Two needed Amazon US Mouser FR 10cm GPIO Ribbon IDC 40P Only 10 cm needed Amazon US Amazon FR 1 Flex Cable for Pi Camera Longer flex cable needed Amazon US Amazon FR 1 DC Power Jack Socket Only one needed Amazon US Amazon FR 1 GPS Active Antenna Includes uPF to SMA adapter Amazon US Amazon FR 1 Micro HDMI Cable Optional, for development purposes Amazon US Amazon FR 1 Power Supply 3A (USB) Needs to provide 3A 5V Amazon US Amazon FR 1 Power Supply 1A (USB) Needs to provide 1A 5V Amazon US Mouser FR 1 USB Type-C to USB-A 2.0 To power the Raspberry Pi Amazon US Amazon FR 1 USB 5v to DC 12v Step Up Make sure this USB 5V / DC 12V step up converter limits the current at 0.8A Amazon US Amazon FR 1 Maschinenreich peristaltic pump 12V XP88-ST01 This pump can be replaced by others depending on its availability Amazon US 2 Linear Stepper Motor Make sure to select two linear stepper Amazon US 1 MicroSD Card + Adapter Minimum size is 32GB Amazon US Amazon FR 1 kit Heat sink kit for Raspberry Pi Only one kit needed Amazon US Mouser FR"},{"location":"setup/hardware/v2.1/kit/#fluidic-components","title":"Fluidic Components","text":"Quantity Name Details US Link FR Link 1 kit \u00b5-Slide I Luer Variety Pack Make sure to select uncoated Ibidi US Ibidi FR 2 HSW 20ml Syringe Two syringes needed Grainger US Darwin Microfluidics FR 1 kit \u00dcberStrainer Set 3 Optional strainer kit to filter the samples Pluriselect US 1m Silicone Tubing ID 1.6mm Ibidi website provides good but expensive tubing Ibidi US Darwin Microfluidics FR 2 Luer Lock Connector Female 1.6 mm Make sure to select the proper diameter Ibidi US Darwin Microfluidics FR 2 Luer Connector Male 1.6 mm Make sure to select the proper diameter Ibidi US Darwin Microfluidics FR"},{"location":"setup/hardware/v2.1/kit/#optic-components","title":"Optic Components","text":"Quantity Name Details US Link FR Link 1 LED white 5mm Intensity: 23,000 mcd, Forward Voltage: 3.5V, Current: 20mA, Beam Angle: 15\u00b0 DigiKey US Gotronic FR 1 kit Arducam M12 Lens Kit Includes 10 M12 Lenses for various angles of view Amazon US 1 M12 Lens 25mm IR 1/2\" 5MP Additional essential 25mm M12 lens Amazon US AliExpress 1 Pi Camera v2.1 Amazon US"},{"location":"setup/hardware/v2.1/kit/#hardware-components","title":"Hardware Components","text":"Quantity Name Details US Link FR Link 1 M2.5 Standoff Assortment Kit 6mm and 15mm standoffs Amazon US 1 M2 M3 M4 Screw Assortment Kit M2x8mm and M3x12mm screws and M3 nuts Amazon US 1 CR1220 Battery For the Adafruit Ultimate GPS HAT Amazon US Amazon FR 16 Magnets 6 x 2 mm Neodynium magnets to connect functional layers Amazon US"},{"location":"setup/hardware/v2.1/kit/#machine-your-structure","title":"Machine Your Structure","text":"

    To complete your PlanktoScope kit, you'll need to fabricate the structure. This can be done using laser cutting or CNC machining from a sheet of material. You can machine the structure locally at a FabLab or through a company specializing in laser cutting or CNC machining. The cost will vary depending on the material chosen and whether you machine it yourself or use a company.

    "},{"location":"setup/hardware/v2.1/kit/#suggested-materials","title":"Suggested Materials","text":"Material Easy to Machine Robustness Water Resistance Price Recyclable Ideal For Transparent Acrylic \u2605\u2605\u2605\u2605\u2605 \u2605\u2606\u2606\u2606\u2606 \u2605\u2605\u2605\u2605\u2605 \u2605\u2605\u2606\u2606\u2606 \u2606\u2606\u2606\u2606\u2606 Seeing internal electronics Black Acrylic \u2605\u2605\u2605\u2605\u2605 \u2605\u2605\u2606\u2606\u2606 \u2605\u2605\u2605\u2605\u2605 \u2605\u2605\u2605\u2606\u2606 \u2606\u2606\u2606\u2606\u2606 Removing surrounding light Marine Plywood \u2605\u2605\u2605\u2605\u2606 \u2605\u2605\u2605\u2605\u2606 \u2605\u2605\u2605\u2605\u2606 \u2605\u2605\u2605\u2605\u2606 \u2605\u2606\u2606\u2606\u2606 Deploying at sea Basic Plywood \u2605\u2605\u2605\u2606\u2606 \u2605\u2605\u2606\u2606\u2606 \u2605\u2605\u2606\u2606\u2606 \u2605\u2606\u2606\u2606\u2606 \u2605\u2605\u2606\u2606\u2606 Cheap prototyping HDF Forescolor \u2605\u2605\u2605\u2605\u2605 \u2605\u2605\u2605\u2605\u2606 \u2605\u2605\u2605\u2606\u2606 \u2605\u2605\u2605\u2606\u2606 \u2605\u2605\u2605\u2605\u2605 Feeling good about recycling PP Waste, 100% Recycled \u2606\u2606\u2606\u2606\u2606 \u2606\u2606\u2606\u2606\u2606 \u2606\u2606\u2606\u2606\u2606 \u2605\u2605\u2605\u2605\u2606 \u2605\u2605\u2605\u2605\u2605 Feeling good about recycling Aluminum \u2605\u2605\u2605\u2605\u2605 \u2605\u2605\u2605\u2605\u2605 \u2605\u2605\u2605\u2605\u2605 \u2605\u2605\u2605\u2605\u2605 \u2605\u2605\u2605\u2605\u2605 Robust professional setup"},{"location":"setup/hardware/v2.1/kit/#get-the-plan-and-machine-it","title":"Get the Plan and Machine It","text":"

    You can download the necessary fabrication patterns for the structure here; two versions are available, one for material with 5 mm thickness, and the other for material with 1/4 inch thickness:

    • 5 mm thickness: SVG file (recommended), DXF file
    • 1/4 inch thickness: DXF file

    Since DXF files don't include unit information, when you open or import one of these DXF files you may need to rescale all dimensions to achieve the correct sizes. You can check whether dimensions are correct by checking the length and width of part M against the actual dimensions shown below:

    You can also compare the approximate dimensions of parts in the SVG file (for 5 mm thickness material) with the sizes of parts in your imported DXF file to check whether the rescaling result looks approximately correct.

    "},{"location":"setup/hardware/v2.5/","title":"Hardware v2.5","text":"

    This page will help you to build the v2.5 hardware for a PlanktoScope.

    "},{"location":"setup/hardware/v2.5/#make-an-assembly-kit","title":"Make an assembly kit","text":"

    If you do not already have an assembly kit, you will need to make a kit for yourself.

    "},{"location":"setup/hardware/v2.5/#assemble-a-planktoscope-from-a-kit","title":"Assemble a PlanktoScope from a kit","text":"

    Once you have an assembly kit, you will need to assemble it into a PlanktoScope.

    "},{"location":"setup/hardware/v2.5/#next-steps","title":"Next steps","text":"

    If you assembled your PlanktoScope from a kit provided by FairScope, you can proceed to our operation guide\u00a0to learn how to operate your PlanktoScope. Otherwise, you will first need to set up the PlanktoScope software on the micro-SD card of your PlanktoScope's Raspberry Pi.

    "},{"location":"setup/hardware/v2.5/assembly/","title":"Assembly","text":""},{"location":"setup/hardware/v2.5/assembly/#content-of-the-kit","title":"Content of the Kit","text":"

    It is important to ensure that you have all of the necessary components before beginning the assembly of your PlanktoScope. To do so, please check that all bags are present as part of the kit.

    Bag Content A Scews B Tools C Adhesive Pads D Tubing, Glass Cuvettes E Bubbler Pump F Peristaltic Pump G Linear Stepper Motor H Raspberry PI Chip cooler I Raspberry HAT J Camera Lens K MicroSD Card, DC Power Jack Socket L DC Power Supply and Cable M Syringe and Falcon Tube X1 Raspberry PI 4 X2 Pipet X3 Cable ties X4 Raspberry PI HQ Camera Modul X5 Sandpaper

    If any bags are missing, please go back to the BOM (Bill of Materials) and reorder the required components.

    "},{"location":"setup/hardware/v2.5/assembly/#about-this-document","title":"About this document","text":"

    To read this document, follow these guidelines:

    "},{"location":"setup/hardware/v2.5/assembly/#color-codes","title":"Color codes","text":"
    • \ud83d\udd34\u00a0Look to the color red
    • \ud83d\udfe0\u00a0Look to the color orange
    • \ud83d\udfe1\u00a0Look to the color yellow
    • \ud83d\udfe2\u00a0Look to the color green
    • \ud83d\udd35\u00a0Look to the color blue
    • \ud83d\udfe3\u00a0Look to the color purple
    "},{"location":"setup/hardware/v2.5/assembly/#icons","title":"Icons","text":"
    • \ud83d\udc41\u00a0Pay attention to this
    • \u26a0\u00a0Be careful with this
    • \ud83d\udcdc\u00a0The book says
    • \ud83c\udfac\u00a0Action !
    • \u274c\u00a0Don't focus on that location

    As you read through the document, be sure to pay attention to these visual cues to guide you through the build process.

    "},{"location":"setup/hardware/v2.5/assembly/#requirements","title":"Requirements","text":""},{"location":"setup/hardware/v2.5/assembly/#tools","title":"Tools","text":"

    Content of\u00a0Bag B:

    • \ud83d\udd34\u00a0B1. Small flat screwdriver 2mm
    • \ud83d\udfe0\u00a0B2. Razor blade
    • \ud83d\udfe1\u00a0B3. Allen key 2mm
    • \ud83d\udfe2 B4. Wrenches for standoffs
    "},{"location":"setup/hardware/v2.5/assembly/#components","title":"Components","text":"

    Content of\u00a0Bag A:

    • \ud83d\udfe2\u00a0A1. Standoff M2.5 - 6mm - Brass
    • \ud83d\udd35\u00a0A2. Standoff M2.5 - 15mm - \u00a0Brass
    • \ud83d\udfe3\u00a0A3. Standoff M2.5 - 16mm - SS
    • \ud83d\udfe0\u00a0A4. Screw M2.5x5mm CHC - SS
    • \ud83d\udfe1\u00a0A5. Screw M2.5x10mm CHC - SS
    • \ud83d\udd34\u00a0A6. Screw M3x12mm BHC - SS
    "},{"location":"setup/hardware/v2.5/assembly/#chapter-1-detach-the-parts-from-panels-by-cutting-the-tabs","title":"Chapter 1: Detach the Parts from panels by cutting the tabs","text":"

    \ud83d\udc41 Locate the panel S1 and discover the 5 differents Parts F, P, K, J and I.

    \ud83c\udfac Flip your panel S1.

    \ud83d\udd34 Locate the outer tabs on the edges of the different Parts. These are typically small projections of material that are used to secure the case parts to the panels.

    Gather all the necessary tools. You will need the B2 \ud83d\udfe0 Razor blade to cut the tabs.

    • \ud83d\udfe3 Use the razor blade to cut the outer tabs located on the edges of the different Parts
    • \u274c Do not cut the inner tabs present inside the different Parts for now and focus on the outer tabs attaching the Parts to the main panel.

    • Position your razor blade on the tab as close to the piece as possible to avoid residual tab after cutting.
    • Press firmly on the razor blade, being very careful with your finger, to cut your first tab.
    • Make sure you don't damage your table by placing a flat, rigid support under the S1 panel.
    • Keep going with the other tabs of this piece F.

    Once all of the tabs are cut, gently lift the case parts away from the panels. If the case parts are stuck or difficult to remove, you may need to gently wiggle or pry them loose using a flat tool such as a screwdriver.

    Warning

    Be extremely careful because this is very sharp.

    Once you have removed your Part from the main panel by cutting off all the tabs holding it, inspect it for potential residual tabs.

    • \ud83d\udfe3 Here is a residual tab that will need to be removed.
    • \ud83d\udfe0 Here there is no residual tab which is perfect.

    \ud83d\udfe3 Place your razor blade flat on the edge of your piece being very careful with your fingers and cut the residual tab.

    Warning

    Be extremely careful because this is very sharp.

    Repeat the cutting of the tabs on all the Parts F, P, K, J and I present on the panel S1.

    Warning

    Be extremely careful because this is very sharp.

    \ud83d\udd34 Locate the inner tabs on the edges of the different Parts.

    Cut out the tabs inside of all the Parts F, P, K, J and I detached from the panel S1.

    Dispose of the cut tabs and any other debris that may have been created during the detachment process.

    Warning

    Be extremely careful because this is very sharp.

    • \u2705 Good way of cutting inner tabs
    • \u274c Wrong way of cutting inner tabs

    Repeat the process on the panel S2.

    Warning

    Be extremely careful because this is very sharp.

    Discover the 11 differents Parts.

    Dispose of the cut tabs and any other debris that may have been created during the detachment process. Inspect the case parts and panels for any damage or imperfections that may have occurred during the detachment process. If any damage is found, it may be necessary to repair or replace the affected parts.

    "},{"location":"setup/hardware/v2.5/assembly/#chapter-2-place-the-4-adhesive-pads-under-the-part-i","title":"Chapter 2: Place the 4 Adhesive Pads under the Part I","text":"

    To secure the PlanktoScope on slippery grounds using the adhesive pads, follow these steps. Gather all the necessary materials. You will need:

    • Time: 1 min
    • \ud83d\udc41 and Take the Part I
    • \ud83d\udfe0 Take the four adhesive pads present in the bag A.
    • \ud83d\udfe3 Locate the four pockets that will receive the four adhesive pads.

    • Clean the bottom of the case part I. Make sure the surface is free of dirt, debris, and any other substances that may prevent the adhesive pads from sticking properly.
    • Remove the paper and place the four adhesive pads in the pockets by pressing firmly on them, sticky-side down.
    • Test the stability of the PlanktoScope by gently shaking or tilting it. If it feels secure and does not slip or slide, the adhesive pads have been successfully installed.

    Note

    \ud83c\udfac Store this assembly for later.

    "},{"location":"setup/hardware/v2.5/assembly/#chapter-3-screw-the-four-standoffs-into-part-a","title":"Chapter 3: Screw the four Standoffs into Part A","text":"

    Now it's time to assemble the ground plate for the Raspberry Pi as the PlanktoScope main processing unit.

    • Time: 5 min

    • \ud83d\udc41 Grab the Part A.
    • \ud83d\udfe3 Locate the four holes on Part A.

    \ud83d\udfe2 A1. Standoff M2.5 - 6mm- Brass

    \ud83d\udfe2 B4. Wrenches for standoffs

    • \ud83d\udfe3 Place the Standoff M2.5 - 6mm in the small side of the wrenches for standoffs B4.
    • \ud83d\udfe0 Do not use the big side of the wrenches for standoffs since the standoff will be loose in it.

    • Place the standoff in the hole and start rotating by hand in a clockwise direction until secure.
    • Then tighten with the wrench.

    • \u2705 Make sure to screw until the standoff is properly inserted in the hole.
    • \u274c Do not stop screwing before.

    Keep going for each of the four holes.

    "},{"location":"setup/hardware/v2.5/assembly/#chapter-4-mount-the-heat-sinks-on-the-raspberry-pi","title":"Chapter 4: Mount the Heat Sinks on the Raspberry Pi","text":"
    • Time: 2 min

    Locate the Raspberry Pi 4 Model B packaging.

    Warning

    Be careful removing it from its packaging.

    Place the four Heat Sinks next to your Raspberry Pi and mark the locations of the Heat Sinks on the Raspberry Pi.

    • \ud83d\udfe0 & \ud83d\udd35 Small Heat Sinks
    • \ud83d\udfe2 Medium Heat Sink
    • \ud83d\udfe3 Big Heat Sink

    Remove the protective labels under a Heat Sink and place the Heat Sink on the slot of the Raspberry Pi.

    Remove the protective labels under all the Heat Sinks and place all the Heat Sinks on the slots of the Raspberry Pi.

    "},{"location":"setup/hardware/v2.5/assembly/#chapter-5-insert-the-micro-sd-card-in-the-raspberry-pi","title":"Chapter 5: Insert the micro SD card in the Raspberry Pi","text":"
    • Locate the SD card adapter in the bag K.
    • The micro SD card is inserted in the SD card adapter.
    • \ud83d\udfe3 Remove the micro SD card from the SD card adapter.
    • Flip your Raspberry Pi.
    • \ud83d\udfe0 Locate the micro SD port.
    • \ud83d\udfe3 Insert the micro SD card in the Raspberry Pi.

    Push the micro SD card in the Raspberry Pi port to a point of resistance.

    Note

    If you notice that the micro SD card protrudes about 2mm from its slot, this is normal.

    "},{"location":"setup/hardware/v2.5/assembly/#chapter-6-mount-the-raspberry-pi-on-the-part-a","title":"Chapter 6: Mount the Raspberry Pi on the Part A","text":"
    • Time: 1 min
    • \u2705 Make sure to position the Raspberry Pi properly on the four standoffs screwed on the Part A.
    • \u274c Do not invert the position of the Raspberry Pi on the four standoffs screwed on the Part A.

    \ud83d\udfe3 A3. Standoff M2.5 - 16mm - SS

    Screw by hand a Standoff M2.5 - 16mm on the Raspberry Pi.

    • Screw by hand all Standoffs M2.5 - 16mm on the Raspberry Pi.
    • Make sure you insert all four standoffs by hand and tighten slightly.

    \ud83d\udfe2 B4. Wrenches for standoffs

    • \ud83d\udfe0 Secure the Standoff M2.5 - 16 mm - SS A3 in the big side of the wrenches for standoffs B4.
    • \ud83d\udfe3 Do not use the small side of the wrenches for standoffs since the standoff won\u2019t fit in it.
    "},{"location":"setup/hardware/v2.5/assembly/#chapter-7-attach-the-ribbon-cable-to-the-raspberry-pi","title":"Chapter 7: Attach the Ribbon Cable to the Raspberry Pi","text":"
    • Time: 2 min

    Locate the Raspberry Pi Camera HQ packaging.

    Warning

    Be careful removing it from its packaging.

    Lay your Raspberry Pi Camera face down on a suitable surface.

    \ud83d\udd34 The black connector is simply a push/pull fit. To disengage the cable, pull the two corners of the black connector down, away from the camera board. It will unclip to about 3mm, make sure you don't pull it off! If you're struggling, try pulling off one corner of the connector at a time.

    Warning

    Be careful with this, this part is delicate. Lift the black connector gently

    Once the connector has been disengaged from the Raspberry Pi camera board, the cable will simply slide out!

    • \ud83d\udfe3 Put aside Camera the Raspberry Pi
    • \ud83d\udfe2 Keep the Ribbon Cable for next step.

    \ud83d\udd34 Locate the black connector present on the Raspberry Pi.

    \ud83d\udd34 The black connector is simply a push/pull fit. To disengage the cable, pull the two corners of the black connector down, away from the camera board. It will unclip to about 3mm, make sure you don't pull it off! If you're struggling, try pulling off one corner of the connector at a time.

    Warning

    Be careful, this part is delicate. Gently prise the black connector with nail or fingertip and thumb.

    Insert the Ribbon Cable you just detached from the Raspberry Pi Camera in the Raspberry Pi.

    • Make sure to insert in as much as you can.
    • Blue rectangle on Ribbon Cable should face the same direction as the arrow below.

    \ud83d\udd34 Secure the Ribbon Cable in the Raspberry Pi by pressing firmly on the black connector.

    "},{"location":"setup/hardware/v2.5/assembly/#chapter-8-mount-the-planktoscope-hat-on-the-raspberry-pi","title":"Chapter 8: Mount the PlanktoScope HAT on the Raspberry Pi","text":"
    • Time: 2 min

    Locate the PlanktoScope HAT present in bag I.

    \ud83d\udd34 Thread the Ribbon cable through the PlanktoScope HAT slot from the underside.

    Warning

    Make sure the two \ud83d\udfe3 black connectors are aligned before threading through the ribbon.

    \ud83d\udd34 Plug the PlanktoScope HAT into the Raspberry Pi.

    Warning

    Make sure the two black connectors are aligned before attaching them together.

    Press the PlanktoScope HAT against the Raspberry Pi until it is no longer possible to move them closer together.

    Warning

    Continue to feed through the Ribbon Cable and do not crush it while pressing the PlanktoScope HAT against the standoffs.

    \ud83d\udfe0 A4. Screw M2.5X5mm CHC - SS

    \ud83d\udfe3 Locate the 4 holes on the top of the PlanktoScope HAT and insert the four M2.5X5mm

    \ud83d\udfe1 B3. Allen key 2mm

    Screw the four A4 screws through the PlanktoScope HAT onto the Standoff M2.5 - 16mm.

    Note

    \ud83c\udfac Store this assembly for later.

    "},{"location":"setup/hardware/v2.5/assembly/#chapter-9-place-the-power-socket-on-part-m","title":"Chapter 9: Place the Power Socket on Part M","text":"
    • Time: 2 min
    • Locate the DC Power Jack from the Bag K.
    • Remove the Lock Ring from the DC Power Jack
    • \ud83d\udd34 Lay the Part M down and make sure the pockets in these holes are facing upwards.
    • \ud83d\udfe3 Locate the Power Socket hole on Part M.

    \ud83d\udd34 Insert the cable inside of the hole by being sure of the orientation of the Part M.

    \ud83d\udfe3 Flip the Part M and secure the DC Power Jack by hand on the Part M by screwing the Lock Ring.

    Warning

    Make sure the Lock Ring doesn\u2019t spin on itself.

    Note

    \ud83c\udfac Store this assembly for later.

    "},{"location":"setup/hardware/v2.5/assembly/#chapter-10-mount-the-raspberry-pi-camera-hq-on-part-b","title":"Chapter 10: Mount the Raspberry Pi Camera HQ on Part B","text":"
    • Time: 2 min

    \ud83d\udfe3 Locate the 4 holes on the top of the Part B.

    \ud83d\udd35 A2. Standoff M2.5 - 15mm - Brass

    Insert the four Standoff M2.5 - 15mm.

    The result should be similar to the picture.

    \ud83d\udfe2 B4. Wrenches for standoffs

    Using the small side of the Standoff Wrench, secure the 4 M2.5 - 15mm Standoffs

    • \u2705 Make sure to screw until the Standoff is properly tightened into the hole.
    • \u274c Do not stop screwing before.

    Locate the Raspberry Pi Camera HQ

    Remove the lens cap Raspberry Pi Camera HQ.

    Warning

    Make sure your camera lens is clean. If it is not, gently wipe using cotton swab for this task.

    Place the Raspberry Pi Camera HQ on top of the four Standoffs installed on Part B.

    \ud83d\udfe3Ensure correct orientation of the Raspberry Pi Camera HQ. The black connector where the Ribbon Cable was removed is on the same side as the \ud83d\udfe2slot circled in green

    \ud83d\udfe0 A4. Screw M2.5X5mm CHC - SS

    \ud83d\udfe1 B3. Allen key 2mm

    Use the allen key and tighten the Raspberry Pi Camera to the Standoffs.

    The result should be similar to the picture.

    Note

    \ud83c\udfac Store this assembly for later.

    "},{"location":"setup/hardware/v2.5/assembly/#chapter-11-mount-the-linear-stepper-motor-on-part-e","title":"Chapter 11: Mount the Linear Stepper Motor on Part E","text":"

    Locate the Stepper Motors

    Warning

    Avoid touching the metal rods on the Stepper Motors

    Info

    You can touch the \ud83d\udfe3 gold stands

    \ud83d\udfe1 A5. Screw M2.5X10mm CHC - SS

    \ud83d\udfe1 B3. Allen key 2mm

    • \ud83d\udd34 Lay the Part E down and make sure the pockets in these holes are facing upwards.
    • \ud83d\udfe3 Locate the four holes on Part E and place four M2 Screws in the holes.

    Attach the stepper motors to the screws we have just placed with the \ud83d\udd34 pockets positioned on opposite to the cabling.

    The result should be similar to the picture.

    Use the 2mm allen key to fix the Stepper Motors.

    The result should be similar to that picture.

    The result should be similar to the picture.

    Repeat the process on the other side with the other Stepper Motor.

    Repeat the process on the other side with the other Stepper Motor.

    The result should be similar to the picture.

    Note

    \ud83c\udfac Store this assembly for later.

    "},{"location":"setup/hardware/v2.5/assembly/#chapter-12-mount-the-led-on-part-g","title":"Chapter 12: Mount the\u00a0LED\u00a0on\u00a0Part G","text":"
    • Locate the\u00a0LED\u00a0and\u00a0LED cable\u00a0in Bag K.
    • \ud83d\udfe3\u00a0The LED will go on the end where\u00a0the white plastic connector is\u00a0smallest.

    Insert the\u00a0LED into the LED cable.

    The result should be similar to the\u00a0picture.

    Locate part\u00a0G.

    \ud83d\udfe3\u00a0Locate the LED hole on\u00a0Part G.

    We\u00a0will\u00a0now\u00a0place\u00a0the\u00a0LED\u00a0into\u00a0the\u00a0slot\u00a0on part\u00a0G.

    Warning

    Gently push the LED into the LED\u00a0hole located on Part\u00a0G. It should be a snug fit.

    The result should be similar to the\u00a0picture.

    Info

    \ud83c\udfac\u00a0Store this assembly for later.

    "},{"location":"setup/hardware/v2.5/assembly/#chapter-13-mount-the-peristaltic-pump-on-part-o-and-part-l","title":"Chapter 13: Mount the\u00a0Peristaltic Pump\u00a0on\u00a0Part O and\u00a0Part L","text":"
    • Locate the\u00a0Kamoer Peristaltic pump\u00a0from the\u00a0Bag F.
    • \ud83d\udfe3\u00a0Put aside the\u00a0tubing contained in\u00a0the little bag.

    \ud83d\udfe2\u00a0Insert the cable of the\u00a0Peristaltic Pump\u00a0into the hole on\u00a0Part O\u00a0and\u00a0then insert the motor block assembly\u00a0of the pump into it.

    Warning

    \ud83d\udc41 Ensure the correct orientation of\u00a0Part O\u00a0and the\u00a0Peristaltic Pump

    \ud83d\udfe1\u00a0A5. Screw\u00a0M2.5X10mm\u00a0CHC - SS

    \ud83d\udfe1\u00a0B3. Allen key 2mm B3

    \ud83d\udfe2\u00a0Insert the two\u00a0M2.5X10mm\u00a0in the\u00a0two holes.

    Screw the two\u00a0M2.5X10mm\u00a0into the\u00a0two holes.

    \ud83d\udd34\u00a0Lay\u00a0the\u00a0Part\u00a0L\u00a0down and make\u00a0sure the pockets in these holes are\u00a0facing upwards.

    • Place\u00a0the\u00a0Peristaltic Pump underneath part L, ensuring the\u00a0correct orientation of these two parts.
    • \ud83d\udd34 Insert the Peristaltic Pump into\u00a0the allocated slot in\u00a0Part L.

    Insert the\u00a0Peristaltic Pump\u00a0into the\u00a0allocated slot in\u00a0Part L.

    Insert the\u00a0Peristaltic Pump\u00a0into the\u00a0allocated slot in\u00a0Part L.

    • Lay the assembly down.
    • \ud83d\udd34\u00a0Locate the\u00a0four different holes.

    \ud83d\udfe1\u00a0A5.Screw\u00a0M2.5X10mm\u00a0CHC - SS

    \ud83d\udfe1\u00a0B3.Allen key 2mm

    Screw the four M2.5X10mm in the\u00a0located\u00a0holes\u00a0attaching\u00a0the\u00a0Part\u00a0O\u00a0to\u00a0the\u00a0Part L Peristaltic Pump.

    The result should be similar to the\u00a0picture.

    Info

    We will use this part in the next step.

    "},{"location":"setup/hardware/v2.5/assembly/#chapter-14-spiral-wrap-the-led-and-peristaltic-pump-cabling","title":"Chapter 14: Spiral wrap the LED and Peristaltic Pump cabling","text":"
    • Locate the LED and housing, along\u00a0with the pump and housing.
    • \ud83d\udfe3\u00a0Locate the\u00a0spiral wrap\u00a0from\u00a0bag K.
    • Spiral wrap both sets of cables\u00a0together.
    • There should be 4 cm (1.5 inches)\u00a0between\u00a0the\u00a0connectors\u00a0and\u00a0the\u00a0start\u00a0of the spiral wrap.

    Continue wrapping around the\u00a0cables until you have used all of the\u00a0spiral wrap, leaving small or no gaps.

    Info

    The result should look the same as\u00a0the picture.

    Info

    The result should look the same as\u00a0the picture.

    Note

    \ud83c\udfac\u00a0Store this assembly for later.

    "},{"location":"setup/hardware/v2.5/assembly/#chapter-15-attaching-the-stepper-motors-to-the-raspberry-pi-camera","title":"Chapter 15: Attaching the\u00a0Stepper Motors\u00a0to the\u00a0Raspberry Pi Camera","text":"

    Locate the Stepper Motors with\u00a0mount, and the Raspberry Pi\u00a0Camera.

    Feed the Stepper Motor cables into\u00a0the\u00a0slots\u00a0either\u00a0side\u00a0of\u00a0the\u00a0Raspberry\u00a0Pi Camera.

    Warning

    Make sure the orientation is\u00a0correct and matches the picture.

    Feed the Stepper Motor cables into\u00a0the\u00a0slots\u00a0either\u00a0side\u00a0of\u00a0the\u00a0Raspberry\u00a0Pi Camera.

    Warning

    Make sure the orientation is\u00a0correct and matches the picture.

    Then\u00a0insert\u00a0the\u00a0cylindrical\u00a0parts\u00a0of\u00a0the\u00a0Stepper Motor into the slots.

    Feed the Stepper Motor cables into\u00a0the\u00a0slots\u00a0either\u00a0side\u00a0of\u00a0the\u00a0Raspberry\u00a0Pi Camera.

    Warning

    Make sure the orientation is\u00a0correct and matches the picture.

    Then\u00a0insert\u00a0the\u00a0cylindrical\u00a0parts\u00a0of\u00a0the\u00a0Stepper Motor into the slots.

    Note

    The\u00a0result\u00a0should\u00a0be\u00a0the\u00a0same\u00a0as\u00a0the\u00a0picture.

    "},{"location":"setup/hardware/v2.5/assembly/#chapter-16-connecting-the-raspberry-pi-camera-to-the-raspberry-pi-hat","title":"Chapter 16: Connecting the\u00a0Raspberry Pi Camera\u00a0to the\u00a0Raspberry Pi HAT","text":"
    • We will need the\u00a0Raspberry Pi HAT with housing and Ribbon Cable along\u00a0\\ with the\u00a0Raspberry Pi Camera with\u00a0Stepper Motors and housing.
    • We will be connecting the\u00a0\ud83d\udfe2Ribbon\u00a0Cableto the\u00a0\ud83d\udfe1black\u00a0Raspberry Pi Camera\u00a0connector\u00a0that we removed\u00a0it from earlier.

    Gently feed the\u00a0Ribbon Cable\u00a0into the\u00a0port of the\u00a0Camera.

    Warning

    \ud83d\udc41 Ensure the correct orientation of\u00a0the\u00a0Ribbon Cable\u00a0with the blue end\u00a0facing upwards.

    \ud83d\udd34\u00a0Press down on the black\u00a0connector on the Raspberry Pi\u00a0camera board once the Ribbon\u00a0Cable is in position.

    \ud83d\udd34\u00a0B1.Small flat screwdriver 2mm

    • Now we will plug in the\u00a0Stepper\u00a0Mounts to the\u00a0HAT.
    • \ud83d\udd34The cables for the\u00a0Stepper Mounts\u00a0will be plugged into the\u00a0HAT\u00a0\ud83d\udfe3here.

    Warning

    Hold tight, a specific order is\u00a0required.

    Starting with the\u00a0red cable, insert the\u00a0cable in the far left port and tighten\u00a0the screw situated above the port.

    Note

    The result should look the same as\u00a0the picture.

    Repeat this process with the order\u00a0pictured here from left to right:\u00a0\ud83d\udd34 Red\u00a0\ud83d\udfe1 Yellow\u00a0\ud83d\udd35 Blue\u00a0\u26ab Black.

    "},{"location":"setup/hardware/v2.5/assembly/#chapter-17-connect-the-led-and-peristaltic-pump-to-the-raspberry-pi","title":"Chapter 17: Connect the\u00a0LED\u00a0and\u00a0Peristaltic Pump\u00a0to the\u00a0Raspberry Pi","text":"

    We will now be connecting the LED\u00a0and Peristaltic Pump with the\u00a0Raspberry Pi HAT\u00a0and\u00a0Camera.

    Place the LED housing onto the\u00a0Stepper Mounts.

    Warning

    \ud83d\udc41 Ensure correct orientation of both\u00a0\ud83d\udfe3 parts by looking at the\u00a0precut holes.

    Info

    The result should be similar to the\u00a0picture.

    Now we will plug in the\u00a0LED and\u00a0Stepper Mount\u00a0cables to the\u00a0Raspberry Pi.

    Feed the area of cabling that is not\u00a0covered by the\u00a0spiral wrap\u00a0through\u00a0the two holes to start. Then thread\u00a0through to the\u00a0spiral wrap\u00a0so that it\u00a0matches the picture.

    We will now plug the cables into the\u00a0correct ports.

    \ud83d\udfe3\u00a0The four wires (\ud83d\udd34 Red\u00a0\ud83d\udd35 Blue \ud83d\udfe2 Green \u26ab Black) enter the side port on the\u00a0Raspberry Pi HAT.

    \ud83d\udd34 The two wires (LED) enter on the\u00a0port on top of the Raspberry Pi HAT.

    The result should be similar to the\u00a0picture.

    Note

    We will use this assembly in the next\u00a0step.

    "},{"location":"setup/hardware/v2.5/assembly/#chapter-18-connect-the-dc-power-jack-to-the-raspberry-pi","title":"Chapter 18: Connect the\u00a0DC Power Jack\u00a0to the\u00a0Raspberry Pi","text":"
    • \ud83d\udfe2\u00a0Locate the\u00a0DC Power Jack
    • We will plug the DC Power Jack\u00a0into the Raspberry Pi via the \ud83d\udd35 blue port.

    \ud83d\udd34\u00a0B1.Small flat screwdriver 2mm

    • Insert the \ud83d\udd34 red cable of the DC\u00a0Power Jack into the left side of the\u00a0blue port.
    • Tighten the screw above.

    • Insert the \u26ab black cable of the DC\u00a0Power\u00a0Jack\u00a0into\u00a0the\u00a0right\u00a0side\u00a0of\u00a0the\u00a0blue port.
    • Tighten the screw above.

    Info

    The result should be similar to the\u00a0picture.

    Note

    We will use this assembly in the next\u00a0step.

    "},{"location":"setup/hardware/v2.5/assembly/#chapter-19-your-planktoscope-starts-to-take-shape","title":"Chapter 19: Your PlanktoScope starts to take shape","text":"

    Locate Part I\u00a0and\u00a0Part H.

    • Slot\u00a0Part H\u00a0into\u00a0Part I.
    • \ud83d\udfe3\u00a0Note the orientation.\u00a0Part H\u00a0goes\u00a0into\u00a0Part Iat the end with the\u00a0rectangular slot (as opposed to the\u00a0rectangle with bulbous hole).
    • \ud83d\udfe1\u00a0Also, the deeper slots on\u00a0part H\u00a0should be on the upper side.

    \ud83d\udd34 Slot the\u00a0Peristaltic Pump\u00a0above\u00a0the\u00a0LED.

    Note

    The result should be the same as the\u00a0picture.

    Warning

    \ud83d\udc41 Ensure the correct orientation of\u00a0the housing and the\u00a0Peristaltic Pump.

    At the other end, slot the\u00a0DC Power\u00a0Jack\u00a0housing adjacent to the\u00a0Raspberry Pi.

    Rotate so that the DC Power Jack is\u00a0facing upwards. We will now slot the Raspberry Pi onto\u00a0the rest of the housing.

    Info

    The result should be similar to that\u00a0picture.

    Note

    \ud83c\udfac\u00a0Store this assembly for later.

    "},{"location":"setup/hardware/v2.5/assembly/#chapter-20-inserting-screws","title":"Chapter 20: Inserting screws","text":"

    \ud83d\udfe3 We\u00a0will\u00a0now\u00a0insert\u00a0eight\u00a0M3\u00a0screws\u00a0to fasten the housing together.

    Note

    \ud83c\udfac\u00a0Store this assembly for later.

    \ud83d\udd34\u00a0A6. Screw M3X12mm BHC - SS

    \ud83d\udfe1\u00a0B3. Allen key 2mm

    Info

    The result should be similar to the\u00a0picture.

    We will now turn over the\u00a0PlanktoScope\u00a0and\u00a0repeat\u00a0the\u00a0process\u00a0for the underside.

    \ud83d\udfe3\u00a0Insert eight more M3 screws on the\u00a0underside.

    Info

    The result should be similar to the\u00a0picture.

    Now turn the PlanktoScope on its side.

    Warning

    \ud83d\udc41 Ensure the orientation of your\u00a0PlanktoScope and\u00a0Part K\u00a0matches\u00a0the picture.

    Slot\u00a0Part K\u00a0onto the rest of the\u00a0PlanktoScope.

    Warning

    \ud83d\udfe2\u00a0Ensure the correct orientation. The\u00a0result should look the same at the\u00a0picture.

    Content of\u00a0Bag A: \ud83d\udd34\u00a0A6. Screw M3X12mm BHC - SS

    Content of\u00a0Bag B: \ud83d\udfe1\u00a0B3. Allen key 2mm

    \ud83d\udfe3\u00a0Insert eight more M3 screws on the\u00a0side to hold\u00a0Part K\u00a0in place.

    We will now place\u00a0Part J\u00a0into position\u00a0as the housing for the side.

    Warning

    \ud83d\udc41 Ensure your PlanktoScope matches\u00a0the orientation in the picture.

    \ud83d\udfe2 Place\u00a0Part K\u00a0onto the rest of the\u00a0PlanktoScope and note the position\u00a0of the cutout.

    Content of\u00a0Bag A: \ud83d\udd34\u00a0A6. Screw M3X12mm BHC - SS

    Content of\u00a0Bag B: \ud83d\udfe1\u00a0B3. Allen key 2mm

    \ud83d\udfe3\u00a0Insert eight more M3 screws on the\u00a0underside

    Info

    The result should be similar to the\u00a0picture.

    Content of\u00a0Bag A: \ud83d\udfe1\u00a0A5. Screw M2.5X10mm CHC - SS

    Place\u00a0the\u00a0M2.5\u00a0screw\u00a0through\u00a0Part\u00a0N. It\u00a0will\u00a0act\u00a0as\u00a0a\u00a0cover\u00a0for\u00a0the\u00a0electrical\u00a0inputs.

    • Place the\u00a0cover\u00a0over the electrical\u00a0inputs on the PlanktoScope.
    • \ud83d\udfe3 The screw will enter the hole\u00a0located here.

    Using the allen key, tighten the screw\u00a0so that it is possible to move the\u00a0cover with light force.

    Info

    The\u00a0result\u00a0should\u00a0be\u00a0the\u00a0same\u00a0as\u00a0the\u00a0picture.

    "},{"location":"setup/hardware/v2.5/assembly/#chapter-21-insert-the-tubing-in-the-peristaltic-pump","title":"Chapter 21: Insert the tubing in the\u00a0Peristaltic Pump","text":"
    • Orientate\u00a0your\u00a0PlanktoScope\u00a0so\u00a0that\u00a0it\u00a0matches the picture.
    • Twist off the orange top of the\u00a0Peristaltic\u00a0pump\u00a0in\u00a0an\u00a0anti-clockwise\u00a0direction.

    You can now remove the Peristaltic\u00a0Pump housing and\u00a0\ud83d\udfe2 Rotor.

    You can now remove the Peristaltic\u00a0Pump housing and\u00a0\ud83d\udfe2 Rotor.

    \ud83d\udd34 Locate the\u00a0Tube\u00a0for the Peristaltic\u00a0Pump in\u00a0Bag F\u00a0and remove it from the\u00a0bag.

    Warning

    The tips of the Tubing that are\u00a0covered by black rubber are very\u00a0delicate and easily broken.

    Insert the first plastic arch of the\u00a0Tube\u00a0into the slot on the Peristaltic Pump\u00a0\\ housing.

    Info

    The result should be similar to the\u00a0picture.

    Insert the\u00a0Rotor\u00a0into the housing\u00a0ensuring the correct orientation. The\u00a0hole in the centre should be visible on\u00a0the underside.

    Info

    The result should be similar to the\u00a0picture.

    Insert the\u00a0Rotor\u00a0into the housing.\u00a0Then, thread the\u00a0Tube\u00a0around the\u00a0Rotor\u00a0and insert the other plastic\u00a0arch into the second slot.

    Info

    The result should be similar to the\u00a0picture.

    • Thread the\u00a0Tube\u00a0around around the\u00a0Rotor\u00a0and insert the other plastic\u00a0arch into the second slot.
    • This will require stretching the\u00a0Tube\u00a0slightly.

    Info

    The result should be similar to the\u00a0picture.

    Place the Peristaltic Pump housing\u00a0back onto the PlanktoScope.

    Achieve the angle shown in the\u00a0picture between the Peristaltic Pump\u00a0housing and PlanktoScope main\u00a0body. Then, press and twist in a\u00a0clockwise direction.

    Info

    The result should be similar to the\u00a0picture.

    • \ud83d\udfe3\u00a0Gently remove the black rubber\u00a0covers for the Peristaltic Pump\u00a0connectors by pinching the very tip\u00a0and pulling away.
    • Once complete, locate\u00a0Bag D\u00a0which\u00a0contains tubing.

    Push the small piece of tubing from\u00a0Bag D\u00a0over the left-side connector of\u00a0the\u00a0Peristaltic Pump.

    Place the long piece of tubing from\u00a0Bag D\u00a0over the right-side connector\u00a0of the\u00a0Peristaltic Pump.

    Insert the connector from\u00a0Bag D\u00a0into\u00a0the other end of the\u00a0small piece of\u00a0tubing.

    Orientate\u00a0Part P\u00a0so that the magnets\u00a0are face-down on the left-hand side.

    Place Part P over the magnets\u00a0adjacent to the\u00a0Peristaltic Pump.

    Info

    The result should be similar to the\u00a0picture.

    \ud83d\udd34 From\u00a0Bag M, Place the\u00a0light blue Test Tube in the hole adjacent to the\u00a0Peristaltic Pump.

    Place the\u00a0\ud83d\udd35 dark blue Test Tube\u00a0into\u00a0the hole situated outside of the\u00a0PlanktoScope.

    \ud83d\udfe2\u00a0Insert the other end of the long\u00a0piece of tubing into the\u00a0\ud83d\udd35 dark blue Test Tube. This will serve as the waste container.\u00a0The result should look the same as\u00a0the picture.

    • Locate Part\u00a0C
    • Locate\u00a025\u00a0mm\u00a0camera\u00a0lens\u00a0and\u00a0Lock Ring\u00a0from\u00a0Bag J.
    • 25MM is printed on the lens.

    • Remove the plastic lens cap.
    • Slot\u00a0the\u00a025\u00a0mm\u00a0camera\u00a0lens into\u00a0Part C.

    Info

    The magnets are raised on the\u00a0side where the lens lays flat.

    Warning

    Try not to touch the lens

    Screw the\u00a0Lock Ring\u00a0onto the lens,\u00a0flat-side down.

    • Locate Part\u00a0D.
    • Locate\u00a016\u00a0mm\u00a0camera\u00a0lens\u00a0and\u00a0Lock\u00a0Ring\u00a0from\u00a0Bag J.
    • 16MM is printed on the lens.

    • Remove the plastic lens cap.
    • Slot\u00a0the\u00a016\u00a0mm\u00a0camera\u00a0lens into Part\u00a0D.

    Info

    The\u00a0magnets\u00a0are\u00a0indented\u00a0on\u00a0the\u00a0side that the lens lays flat.

    Warning

    Try not to touch the lens

    Screw the\u00a0Lock Ring\u00a0onto the lens,\u00a0flat-side down.

    The result should be similar to that\u00a0picture.

    Place\u00a0both\u00a0Lenses (C\u00a0and\u00a0D)\u00a0together\u00a0so that they flat together and both\u00a0lenses are facing each other.

    Info

    The result should be similar to the\u00a0picture.

    Place\u00a0the\u00a0Lenses\u00a0(both\u00a0C\u00a0and\u00a0D)\u00a0into\u00a0position, adjacent to the camera.

    The orientation of your PlanktoScope\u00a0and Lenses should match the\u00a0pictures.

    • Once\u00a0together,\u00a0place\u00a0the\u00a0lenses\u00a0(both\u00a0C and D) into position, adjacent to\u00a0the camera.
    • Part\u00a0C\u00a0/\u00a025mm\u00a0lens\u00a0should\u00a0be\u00a0furthest\u00a0from the pump (orange piece).

    Info

    The result should be similar to the\u00a0picture.

    Info

    The Fluidic Path will have a\u00a0cardboard protector.

    Please take extra precaution while handling\u00a0this\u00a0part\u00a0and\u00a0avoid\u00a0touching\u00a0the glass element of the piece.

    Warning

    The Fluidic Path is very delicate.

    Place the Tube Clamp over the long\u00a0piece\u00a0of\u00a0tube\u00a0at\u00a0the\u00a0end\u00a0of\u00a0the\u00a0Fluidic\u00a0Path.

    Place the white clamp over the long\u00a0piece\u00a0of\u00a0tube\u00a0at\u00a0the\u00a0end\u00a0of\u00a0the\u00a0Fluidic Path.

    Info

    The result should look the same as\u00a0the picture.

    Press down on the Tube Clamp so\u00a0that it clicks into place with just one\u00a0click.

    Info

    The result should look the same as\u00a0the picture.

    Insert\u00a0a\u00a0small\u00a0plastic\u00a0Connector\u00a0into\u00a0the\u00a0end\u00a0of\u00a0the\u00a0tubing,\u00a0below\u00a0the\u00a0Tube\u00a0Clamp.

    Make sure the tubing is over the\u00a0Connector.

    Info

    The result should look the same as\u00a0the picture.

    Remove the cardboard protector\u00a0from the\u00a0Fluidic Path.

    Warning

    A reminder, the glass part of the\u00a0Fluidic\u00a0Path\u00a0is\u00a0very\u00a0delicate.\u00a0Please\u00a0try\u00a0not to touch it.

    Place another Connector at the end\u00a0of the tubing.

    The\u00a0result\u00a0should\u00a0be\u00a0the\u00a0same\u00a0as\u00a0the\u00a0picture.

    \u26a0 Gently place the Fluidic Path in\u00a0the designated indentation on\u00a0Part F.

    Warning

    Do not touch the glass.\u00a0

    • You may have to slightly stretch the\u00a0tubing to get the Fluidic Path into\u00a0position.
    • The\u00a0result\u00a0should\u00a0be\u00a0the\u00a0same\u00a0as\u00a0the\u00a0picture.

    If you have tape available, place a\u00a0small\u00a0piece\u00a0at\u00a0the\u00a0the\u00a0bottom\u00a0of\u00a0Part F so that the tubing remains fixed in\u00a0its position.

    Avoid placing tape over the glass.

    Info

    The result should be similar to the\u00a0picture.

    To\u00a0insert\u00a0the\u00a0syringe,\u00a0place\u00a0finger\u00a0and\u00a0thumb either side of part F where\u00a0green circle is located. This ensures\u00a0the tubing does not rotate while you\u00a0twist the syringe into position in a\u00a0clockwise direction.

    Info

    The result should be similar to the\u00a0picture.

    • Place the Fluidic Path into position\u00a0between the mount and the\u00a0Peristaltic Pump.
    • Connect the magnets to face each\u00a0other.

    The result should look the same as\u00a0the pictures.

    • \ud83d\udfe2 Connect the Fluidic Path to the\u00a0Peristaltic Pump by twisting the two\u00a0connectors together.
    • The\u00a0result\u00a0should\u00a0be\u00a0the\u00a0same\u00a0as\u00a0the\u00a0picture.
    "},{"location":"setup/hardware/v2.5/assembly/#build-complete","title":"Build complete! \ud83d\udcaf \ud83d\udcab","text":""},{"location":"setup/hardware/v2.5/assembly/#next-steps","title":"Next steps","text":"

    Next, you will need to set up the PlanktoScope software on the micro-SD card of your PlanktoScope's Raspberry Pi.

    "},{"location":"setup/hardware/v2.5/kit/","title":"Kit Production","text":""},{"location":"setup/hardware/v2.5/kit/#mechanical-structure","title":"Mechanical Structure","text":"

    CNC (computer numerical control) milling machines are used to fabricate parts with precise dimensions and shapes. The configuration of the feed rate and diameter plays a crucial role in the machining process and can significantly affect the quality and efficiency of the production of a workpiece.

    "},{"location":"setup/hardware/v2.5/kit/#manufacturing-files","title":"Manufacturing files","text":"Files Description PlanktoScope-Case.dxf PlanktoScope Case export for CNC Milling"},{"location":"setup/hardware/v2.5/kit/#tools","title":"Tools","text":"Tool Specification CNC Milling machine minimum traverse path at a minimum size of 600 mm to 1000 mm End Mill \u00d8 6mm End Mill \u00d8 3mm End Mill \u00d8 2mm End Mill \u00d8 1mm"},{"location":"setup/hardware/v2.5/kit/#material","title":"Material","text":""},{"location":"setup/hardware/v2.5/kit/#wood","title":"Wood","text":"

    Valchromat is a wood-based composite material made from recycled wood fibers and colored with natural dyes. It is known for its durability, resistance to moisture and decay, and ability to be machined and finished in a similar way to solid wood. Here are some of the key characteristics of valchromat:

    • Durability: Valchromat is a highly durable material that is resistant to moisture, decay, and termites, making it ideal for use in outdoor or high-moisture environments.

    • Strength: Valchromat has a high mechanical strength, making it suitable for use in structural applications such as flooring, furniture, and doors.

    • Machinability: Valchromat can be machined using traditional woodworking tools, such as saws, routers, and drill bits. It can also be finished using sanding, staining, and painting techniques.

    • Sustainability: Valchromat is made from recycled wood fibers, which makes it a more sustainable option compared to traditional wood products. It is also produced using an eco-friendly manufacturing process that generates zero emissions.

    • Versatility: Valchromat is available in a variety of colors, including shades of red, yellow, green, blue, and black, making it suitable for a wide range of applications and design projects.

    • When compared to conventional MDF wood, valchromat has a number of advantages. It is more durable and resistant to moisture and decay, making it a better choice for use in outdoor or high-moisture environments. Valchromat is also more sustainable, as it is made from recycled wood fibers.

    • Valchromat can be processed using a CNC router in a similar way to MDF wood. However, it is important to consider the specific characteristics of valchromat when setting up the CNC router, such as the appropriate cutting speed and feed rate.

    For the specific use case of the PlanktoScope Case, valchromat was used with a thickness of 8mm. This thickness may be suitable for a variety of applications, depending on the specific requirements and design of the project.

    In summary, valchromat is a durable, strong, and versatile wood-based composite material that can be machined and finished in a similar way to solid wood. It is available in a variety of colors and is a more sustainable alternative to traditional wood products. When processed using a CNC router, it is important to consider the specific characteristics of valchromat in order to achieve the desired results.

    "},{"location":"setup/hardware/v2.5/kit/#finishing","title":"Finishing","text":"

    Rubio Monocoat Plus is a wood finishing product that is designed to provide a durable, natural-looking finish to wood surfaces. It is made from plant-based oils and pigments, which give it a unique, transparent finish that enhances the natural beauty of the wood.

    One of the key features of Rubio Monocoat Plus is its versatility and ease of use. It can be applied to a wide range of wood species, including hardwoods and softwoods, and can be used on both indoor and outdoor surfaces. It is also easy to apply, with a simple one-coat application process that allows users to achieve a professional-grade finish in a matter of hours.

    Rubio Monocoat Plus is also environmentally friendly, with a low VOC (volatile organic compound) content and a biodegradable formula. This makes it a popular choice for those who are looking for a sustainable and eco-friendly wood finishing solution.

    We use Rubio Monocoat Plus as a finishing product for Valchromat.

    "},{"location":"setup/hardware/v2.5/kit/#cnc-workflow","title":"CNC workflow","text":"

    Here is a step-by-step guide on how to configure the feed rate and the diameter of the end mill of a CNC milling machine for the production of a workpiece, using the specified tools and configuration:

    1. Select the appropriate end mill: The end mill should be selected based on the material and shape of the workpiece, as well as the desired level of precision. For this specific production, the following end mills will be used:

    2. 6mm end mill for straight flats

    3. 2mm end mill for inner contours
    4. 1mm end mill for small holes

    5. Determine the feed rate: The feed rate is the speed at which the end mill moves along the surface of the workpiece and is usually measured in millimeters per minute (mm/m). The appropriate feed rate will depend on the diameter of the end mill and the material and thickness of the workpiece. For this specific production, the following feed rates will be used:

    6. 1500mm/min for 1-2mm end mills

    7. 2500mm/min for 3mm end mills
    8. 3500mm/min for 6mm end mills

    9. Load the end mill: Once the appropriate end mill has been selected, it can be loaded onto the spindle of the CNC milling machine.

    10. Set the workpiece: The workpiece should be securely clamped onto the table of the CNC milling machine.

    11. Set the machine parameters: The feed rate and end mill diameter should be entered into the machine's control panel or included in the machining program.

    12. Begin machining: The machining process should be carried out in the following sequence:

    13. Mill the screw holes with a 2mm end mill and then with a 3mm end mill

    14. Mill the corners with a 2mm end mill
    15. Mill everything else with a 3mm end mill

    By following these steps, you can properly configure the feed rate and the diameter of the end mill of a CNC milling machine for the production of a workpiece. It is important to follow the manufacturer's recommendations and guidelines for the specific CNC milling machine being used, as well as to use proper safety measures while operating the machine.

    "},{"location":"setup/hardware/v2.5/kit/#finnish-of-the-case-parts","title":"Finnish of the case parts","text":""},{"location":"setup/hardware/v2.5/kit/#requirements-for-case-parts","title":"Requirements for case parts","text":""},{"location":"setup/hardware/v2.5/kit/#case-tools","title":"Case tools","text":"
    • Hammer
    • Air Compressor
    • Rubber gloves
    • Paper carpet pad
    • Clean piece of cotton fabric
    • Support material for drying the parts
    "},{"location":"setup/hardware/v2.5/kit/#case-part-parts","title":"Case part parts","text":"
    • all case parts
    • Rubio Monocoat Oil Plus 2C
    • Rubio Monocoat Accelerator Component B
    • Magnets
    • Square nuts
    "},{"location":"setup/hardware/v2.5/kit/#clean","title":"Clean","text":""},{"location":"setup/hardware/v2.5/kit/#stir","title":"Stir","text":""},{"location":"setup/hardware/v2.5/kit/#apply","title":"Apply","text":""},{"location":"setup/hardware/v2.5/kit/#dry","title":"Dry","text":""},{"location":"setup/hardware/v2.5/kit/#inserting-the-screws","title":"Inserting the screws","text":""},{"location":"setup/hardware/v2.5/kit/#inserting-the-magnets","title":"Inserting the magnets","text":""},{"location":"setup/hardware/v2.5/kit/#package-housing-part","title":"Package Housing part","text":""},{"location":"setup/hardware/v2.5/kit/#planktoscope-hat","title":"PlanktoScope Hat","text":"

    Welcome to the PCB production manual for the PlanktoScope Hat!

    A PCB (printed circuit board) is a crucial component of many electronic devices, providing a platform for connecting and mounting electronic components. The PCB production process involves several steps, including designing the PCB layout, fabricating the PCB, and assembling the electronic components onto the PCB.

    The raw materials used in PCB production include copper sheets, fiberglass sheets, and various chemicals for etching and plating. These materials are used to create the circuitry patterns on the PCB.

    There are two main types of electronic components that can be mounted onto a PCB: thru-hole components and surface mount components. Thru-hole components have leads that are inserted through holes in the PCB and soldered to the other side, while surface mount components are soldered directly onto the surface of the PCB. The choice between thru-hole and surface mount components depends on the specific requirements of the device being produced.

    Note

    Please note that this document describes a two-part production of the PCB. To reduce costs, the through hole components are assembled manually as described here. Depending on your budget and the services offered by the manufacturing company, this can also be ordered in the production of the PCB.

    "},{"location":"setup/hardware/v2.5/kit/#manufacturing-files_1","title":"Manufacturing files","text":"Files Description Planktoscope-Hat-gerbers.zip The exported Gerber files for PCB fabrication Planktoscope-Hat-bom.csv The list of used SMD components Planktoscope-Hat.pdf The SMD assembly footprints Planktoscope-Hat-PnP-front.txt Pick-and-place machine instructions"},{"location":"setup/hardware/v2.5/kit/#pcb-manufacturing-process","title":"PCB manufacturing process","text":""},{"location":"setup/hardware/v2.5/kit/#placing-an-order","title":"Placing an order","text":"

    To order a PCB board including assembly, follow these steps:

    • Select a manufacturing company based on your local availability, budget, delivery dates, and services such as assembly.

    Note

    If you need assistance with selecting a company, contact us. We can provide you with a list of companies we have worked with in the past.

    • Create a customer account if you do not already have one. Ensure to specify the correct tax, contact, and delivery information.

    Warning

    It is especially crucial to provide correct contact information, including a phone number if possible. Most manufacturing companies provide excellent customer service and will be happy to assist you during the order process.

    • Create a project and select the quantity of PCB boards you need for production.
    • Configure the order based on the values specified in this document.
    • Upload the bill of material (BOM) and validate the component availability.

    Warning

    It is crucial that you use the exact IC's like the RTC and EEPROM we specified. If a component is \"end of life\" (EOL), do not hesitate to contact us so we can help you find an alternative solution. For all other components, you are welcome to choose alternatives providet by the manufacturing company.

    Info

    The component costs will now be calculated, and the price should be displayed.

    • Upload the gerber files provided as a zip file in the repository under the following link.
    • Upload the assembly instructions provided as a zip file in the repository under the following link.
    • Check that there are no missing references in your order configuration.
    • Place the order based on your delivery requirements.
    • Select a payment method and complete the order process.
    "},{"location":"setup/hardware/v2.5/kit/#configuration","title":"Configuration","text":"

    The following configuration parameters can be used for the production of the PCB.

    Info

    Please note that the naming may vary depanding on the manufacturing company you used and are only intended to provide you with support. You can, of course, adjust the parameters as you see fit.

    "},{"location":"setup/hardware/v2.5/kit/#board-dimensions","title":"Board dimensions","text":"

    65 mm x 100 mm

    "},{"location":"setup/hardware/v2.5/kit/#circuit-specifications","title":"Circuit specifications","text":"Property Value Material FR4 Thickness 1.6 mm Finish Chem. gold Number of layers 2 Specific stackup sans SMD sides top Finished external copper thickness (\u00b5) 35 \u00b5m Internal copper thickness (\u00b5) without IPC Class Class 2"},{"location":"setup/hardware/v2.5/kit/#solder-mask","title":"Solder mask","text":"Property Value Solder mask TOP + BOT Mask colour green Peelable mask without"},{"location":"setup/hardware/v2.5/kit/#marking","title":"Marking","text":"Property Value Silkscreen (ink) TOP + BOT Ink colour white ROHS marking without UL marking without Date marking without"},{"location":"setup/hardware/v2.5/kit/#specific-options","title":"Specific options","text":"Property Value Space between tracks > 0.15 mm Min. drill hole size > 0.20 mm Blind via with out Cross blind no Burried via na Impedance control no Edge plating no Press-fit no Carbon without Via Fill without Beveled edge without Contersunk holes without Contersunk holes (qty/PCB) without Metallographic section without Gold fingers (thickness) without Gold fingers (qty/PCB) without"},{"location":"setup/hardware/v2.5/kit/#quality-assurance","title":"Quality assurance","text":"

    To ensure the quality of the produced PCB, request data validation from the customer support team. They can provide you with image files like the following to visually verify the manufacturing files you provide.

    Warning

    This step must be requested directly after completing the order process and confirmed promptly. Otherwise, the delivery date will be postponed or the order may be put on hold completely.

    "},{"location":"setup/hardware/v2.5/kit/#top","title":"Top","text":""},{"location":"setup/hardware/v2.5/kit/#bottom","title":"Bottom","text":""},{"location":"setup/hardware/v2.5/kit/#copper-layer-1","title":"Copper layer 1","text":""},{"location":"setup/hardware/v2.5/kit/#copper-layer-2","title":"Copper layer 2","text":""},{"location":"setup/hardware/v2.5/kit/#mechanical","title":"Mechanical","text":""},{"location":"setup/hardware/v2.5/kit/#component-placement","title":"Component placement","text":""},{"location":"setup/hardware/v2.5/kit/#assembly-of-the-thru-hole-components","title":"Assembly of the Thru-Hole components","text":""},{"location":"setup/hardware/v2.5/kit/#thru-hole-requirements","title":"Thru-Hole Requirements","text":""},{"location":"setup/hardware/v2.5/kit/#thru-hole-tools","title":"Thru-Hole tools","text":"
    • professional Soldering iron
    • solder with flux
    • Helping hand or Breadboard
    "},{"location":"setup/hardware/v2.5/kit/#thru-hole-parts","title":"Thru-Hole parts","text":"Files Description Planktoscope-Hat-bom-through-hole.csv The list of used SMD components

    Warning

    When you solder this for the first time, take special care not to damage the board.

    Info

    To learn how to solder we recommend you the awesome Comic \"Soldering is easy\" by Mitch Altmal, Andie Nordgren and Jeff Keyzer

    "},{"location":"setup/hardware/v2.5/kit/#soldering-of-the-stepper-motor-driver","title":"Soldering of the stepper motor driver","text":"

    Unpack the motor driver and the connector strips and take the breadboard aside.

    Plug the connectors with the appropriate distance to the breadboard.

    Info

    The breadboard supports you during soldering to ensure the spacing and angle of the connectors, alternatively you can also use a third hand.

    Now position the motor driver on the connector strips of the beadboard.

    Warning

    Make sure that the larger chip labeled trimatik is positioned on the bottom of the board and the four smaller chips are positioned on the top of the board as shown in the picture.

    Now solder all pins of the connector strip.

    Info

    Soldering is sometimes like eating with chopsticks \ud83e\udd62. It takes a bit of practice, but with time you learn how to hold the workpiece in place with one free finger and apply the solder with another, and then use the other hand to move the soldering iron to the workpiece and solder it.

    Tip

    You can also solder one pin on one side and then the opposite one to fix your workpiece, this ensures that nothing accidentally moves.

    "},{"location":"setup/hardware/v2.5/kit/#soldering-of-the-motor-driver-sockets","title":"Soldering of the motor driver sockets","text":"

    Now take the PlanktoScope Hat board and the female connector of the stepper motor driver and position them as shown in the picture.

    Now put the previously soldered motor driver on the socket connector to fix it for the soldering process. Turn the board as shown in the picture and place it carefully.

    Now solder all pins of the connector strip.

    Info

    Soldering is sometimes like eating with chopsticks \ud83e\udd62. It takes a bit of practice, but with time you learn how to hold the workpiece in place with one free finger and apply the solder with another, and then use the other hand to move the soldering iron to the workpiece and solder it.

    Tip

    You can also solder one pin on one side and then the opposite one to fix your workpiece, this ensures that nothing accidentally moves.

    Repeat the procedure with the second motor driver. The end result should look like this.

    "},{"location":"setup/hardware/v2.5/kit/#soldering-the-connection-sockets","title":"Soldering the connection sockets","text":"

    Now solder the motor driver sockets, inserting the connector into the holes as shown.

    Turn the board over and hold the loose connector while soldering it. Repeat the procedure with the second motor connector.

    Info

    Soldering is sometimes like eating with chopsticks \ud83e\udd62. It takes a bit of practice, but with time you learn how to hold the workpiece in place with one free finger and apply the solder with another, and then use the other hand to move the soldering iron to the workpiece and solder it.

    Repeat the procedure with the power connector. The end result should look like this.

    Repeat the procedure with the led connector. The end result should look like this.

    "},{"location":"setup/hardware/v2.5/kit/#soldering-the-raspberry-pi-connector","title":"Soldering the Raspberry Pi connector","text":"

    Now solder the Raspberry Pi header connector with all 20 pins.

    Warning

    Be extremely careful when soldering the connections, make sure you don't accidentally bridge several contacts because you used too much solder or have cold solder joints because you had too little solder or too little heat.

    "},{"location":"setup/hardware/v2.5/kit/#install-and-solder-the-cooling-fan","title":"Install and solder the cooling fan","text":"

    Install the fan with the four screws and nuts.

    Warning

    Pay attention to the running direction with the arrow marking on the side of the fan. The fan should blow on the cooler of the Raspberry Pi.

    Cut off the excess cable of the fan and leave about 6 cm.

    Feed the fan cable through the hole provided, check if you can reach the contacts on the board without any problems and trim it further if necessary and enisolate the ends.

    Solder the fan cables according to the marking and color codes \u26ab GND, \ud83d\udd34 VCC, \ud83d\udfe1 RPM, \ud83d\udd35 PWM.

    Note

    If your fan doesn't have a \ud83d\udd35 PWM connector, then that's not a problem, you can just leave it out.

    "},{"location":"setup/hardware/v2.5/kit/#solder-the-display-connector","title":"Solder the display connector","text":"

    Insert the pin headers into the holes provided, hold them in place, carefully turn the board over and solder the connector.

    Note

    If you do not use an OLED display, you do not need to solder the connector.

    "},{"location":"setup/hardware/v2.5/kit/#solder-the-configuration-option-jumpers","title":"Solder the configuration option jumpers","text":"

    Insert the pin headers into the holes provided, hold them in place, carefully turn the board over and solder the connector.

    Note

    If you do not use an OLED display, you do not need to solder the connector.

    "},{"location":"setup/hardware/v2.5/kit/#you-have-finished-soldering-the-components","title":"You have finished soldering the components","text":"

    The assembly of the thru-hole components for the planktoscope hat is now complete. The end result should look like this.

    "},{"location":"setup/hardware/v2.5/kit/#planktoscope-hard-case","title":"PlanktoScope Hard case","text":""},{"location":"setup/hardware/v2.5/kit/#hard-case-requirements","title":"Hard case Requirements","text":""},{"location":"setup/hardware/v2.5/kit/#hard-case-tools","title":"Hard case tools","text":"
    • double sided adhesive tape
    "},{"location":"setup/hardware/v2.5/kit/#hard-case-parts","title":"Hard case parts","text":"
    • Hard case
    "},{"location":"setup/hardware/v2.5/kit/#foam-preparation","title":"Foam preparation","text":"

    Cut the foam block at the outer edge by gently tearing it apart with your fingers.

    Warning

    Be careful the foam tears easily and can not be repaired.

    Tip

    You can try in the middle of the foam block to see how the material can be cut through before you peel off with the edge.

    Now lay a layer of two-sided adhesive tape on the upper inside edge of the case, with which we can later attach the show fabric.

    Now insert the foam edge in to the case and glue it to the outer wall.

    Note

    Before you fix the foam, position it completely and check that it is placed flush with the edge of the case.

    "},{"location":"setup/hardware/v2.5/kit/#kit-composition","title":"Kit composition","text":"

    Now divide all the components for the kit, and pack it in the hard case. You can find the full list of components for the kit in the v2.5 hardware BOM (Bill of Materials). However, this BOM does not include ordering links, since such links will need to be different for each country. If you've customized the v2.5 hardware BOM for your own v2.5 PlanktoScope kit (e.g. by finding and adding part ordering links from suppliers in your country for each component), please share your custom BOM to our GitHub Discussions thread for v2.5 Localized Hardware BOMs, so that other members of our community can learn from your work!

    "},{"location":"setup/software/","title":"PlanktoScope Software","text":"

    This section of the PlanktoScope documentation will help you to set up the necessary software for your PlanktoScope hardware. Our documentation splits the PlanktoScope software setup process into two phases: installing the PlanktoScope software onto the micro-SD card of the Raspberry Pi computer in your PlanktoScope, and configuring the PlanktoScope software after installation.

    The PlanktoScope software is an operating system, the PlanktoScope OS, distributed as an SD card image to be run on the PlanktoScope hardware's embedded Raspberry Pi computer.

    If you are building your own PlanktoScope from your own hardware kit, you will need to install and set up the PlanktoScope OS yourself. If you received a PlanktoScope from FairScope, a working and pre-configured version of the PlanktoScope OS is already pre-installed, and you can skip the software setup process and proceed to our guide on how to operate your PlanktoScope. - but you still might wish to update your PlanktoScope to the latest release of the PlanktoScope OS, in which case you should reinstall the PlanktoScope software by going through our software setup guide below.

    In order to install the PlanktoScope software, you will first need to choose an SD card image file to use for installation, and then you will install that SD card image and perform some configuration of the software.

    "},{"location":"setup/software/#choosing-an-sd-card-image","title":"Choosing an SD card image","text":"

    PlanktoScope SD card image files are identified with a version number as well as a hardware configuration tag - for example, the SD card image file named planktoscope-v2024.0.0+planktoscopehat.img.gz is for v2020.0.0 of the PlanktoScope OS, configured to work with versions of the PlanktoScope hardware based on the custom PlanktoScope HAT (rather than the Adafruit Stepper Motor HAT). Thus, you will need to choose both a version number (e.g. v2023.9.0) and a hardware configuration (e.g. planktoscopehat).

    "},{"location":"setup/software/#planktoscope-os-versions","title":"PlanktoScope OS versions","text":"

    Because the PlanktoScope project aims to release occasional updates to the PlanktoScope OS in order to fix various software problems and make various improvements to the software, multiple versions of the PlanktoScope OS exist, and new versions will be released in the future. In general, each version of the PlanktoScope OS will be compatible with all previous officially-released versions of the PlanktoScope hardware (which are all versions listed in the hardware changelog without the description of a \"prototype\"). The PlanktoScope documentation describes the latest stable release of the PlanktoScope OS, and you should always use the latest stable release on your PlanktoScopes.

    PlanktoScope OS versions are independent of hardware versions, and (starting in 2023) use a different version numbering system from the hardware (see the Hardware setup guide for an overview of some hardware versions). Now, OS version numbers have three numeric components: the year of the release, a minor number (which is incremented for releases with new features and/or backwards-incompatible changes), and a patch number (which is incremented for minor bugfixes). You may see references to the following SD card image versions in online discussions of the PlanktoScope software:

    • v2.3: this release, from December 2021, was the last release of the PlanktoScope software in the old version numbering system in which the software and hardware were released together. The v2.3 OS is preinstalled on most PlanktoScopes sold by FairScope during 2023.

    • v2023.9.0: this release, from the end of 2023, is the first software release in the new version numbering system, and it is currently the latest release of the PlanktoScope OS. The number 9 should not be interpreted as having any special meaning.

    • v2024.0.0: this version is the first release of the PlanktoScope OS in 2024.

    • v2024.1.0: this version will be the second release of the PlanktoScope OS in 2024.

    "},{"location":"setup/software/#hardware-configurations","title":"Hardware configurations","text":"

    Currently, each version of the PlanktoScope OS is provided as three SD card images which support the two different types of hardware configurations supported by the PlanktoScope software:

    • adafruithat: this configuration of the PlanktoScope OS is compatible with v2.1 of the PlanktoScope hardware, which uses the Adafruit Stepper Motor HAT.

    • planktoscopehat: this configuration of the PlanktoScope OS is compatible with all versions of the PlanktoScope hardware starting with hardware v2.3; those hardware versions use the PlanktoScope HAT instead of the Adafruit Stepper Motor HAT. This configuration requires you to select the hardware version of your PlanktoScope in the post-installation configuration process.

    • fairscope-latest: this configuration of the PlanktoScope OS is identical to the planktoscopehat configuration, except that this one sets the default settings to be for hardware version v2.6 so that you won't need to select the hardware version of your PlanktoScope in the post-installation configuration process.

    If you have a PlanktoScope from FairScope, you should probably use the fairscope-latest SD card image; otherwise, if you have a non-FairScope PlanktoScope with hardware version v2.3 or later, you should probably use the planktoscopehat SD card image; otherwise, if you have a v2.1 PlanktoScope, you should probably use an adafruithat SD card image.

    "},{"location":"setup/software/#installation","title":"Installation","text":"

    After you have chosen a PlanktoScope OS SD card image for the desired OS version and hardware configuration, you should follow our standard installation guide in order to install that SD card image into your PlanktoScope. If the official PlanktoScope SD card images don't meet your requirements and you have successfully set up and used the PlanktoScope OS in the past via the standard installation process, then you may also find the non-standard installation guide useful.

    "},{"location":"setup/software/#post-installation-configuration","title":"Post-installation configuration","text":"

    The first time you start the PlanktoScope after installing or updating the software, you should change some settings in the PlanktoScope software in order to match the configuration of your PlanktoScope hardware. Refer to our post-installation configuration guide for details.

    "},{"location":"setup/software/#next-steps","title":"Next steps","text":"

    After installing the PlanktoScope software (or after ensuring that the PlanktoScope software is installed) and performing all necessary post-installation configuration, then you can proceed to our guide on how to operate your PlanktoScope.

    "},{"location":"setup/software/config/","title":"Post-Installation Configuration","text":"

    After installing the PlanktoScope software onto your PlanktoScope, you will need to configure the software to match your PlanktoScope hardware and your operational requirements.

    Currently, all post-installation configuration is performed in the PlanktoScope software's Node-RED dashboard. To access it, you should first open the PlanktoScope's landing page in your web browser, e.g. following the instructions in the software installation guide. Then you should click the \"Node-RED dashboard\" link at the top of the \"Browser applications\" section of the landing page.

    "},{"location":"setup/software/config/#hardware-version","title":"Hardware Version","text":"

    Info

    This step is only required if you are using a planktoscopehat SD card image; it is not needed on the adafruithat and fairscope-latest SD card images.

    The first time you start the PlanktoScope, you will need to select the hardware version of your PlanktoScope for the PlanktoScope software to match the actual configuration of your PlanktoScope hardware. To do this, open the Node-RED dashboard. You should see a homepage with a drop-down menu to select your PlanktoScope hardware version. You should select the correct version for your PlanktoScope. After you select a hardware version, the PlanktoScope will show the Node-RED dashboard's normal homepage navigation buttons; you should also wait several seconds for the PlanktoScope software to restart and load the updated hardware settings.

    "},{"location":"setup/software/config/#next-steps","title":"Next steps","text":"

    Now that you have configured the PlanktoScope software, you can proceed to our guide on how to operate your PlanktoScope.

    "},{"location":"setup/software/nonstandard-install/","title":"Non-Standard Installation","text":"

    This page provides instructions for setting up non-standard versions of the PlanktoScope OS on a PlanktoScope. The PlanktoScope project also uses this same process for creating the official PlanktoScope software SD card images used in the standard software installation process.

    "},{"location":"setup/software/nonstandard-install/#prerequisites","title":"Prerequisites","text":"

    This guide assumes that:

    1. You have previous experience with using the command-line terminal on the Raspberry Pi OS or another Linux distribution.
    2. You have already confirmed that your PlanktoScope works without any problems with software installed by the standard PlanktoScope software setup process.
    3. You already know how to use the PlanktoScope software.

    If you have not used the PlanktoScope software before, you should first start with the standard software setup process in order to troubleshoot any problems with your PlanktoScope hardware; you can then try the non-standard setup process afterwards.

    In order to complete the non-standard setup process, you will need all of the following:

    1. A Raspberry Pi computer. We only test to ensure that the PlanktoScope software works on the Raspberry Pi 4; it may or may not work on the Raspberry Pi 3, and it does not yet work on the Raspberry Pi 5.
    2. A keyboard connected to your Raspberry Pi.
    3. A display connected to your Raspberry Pi.
    4. A micro-SD card for your Raspberry Pi.
    5. A way to provide internet access to your Raspberry Pi.
    6. A separate computer which can flash SD card images to your micro-SD card.
    "},{"location":"setup/software/nonstandard-install/#install-and-set-up-raspberry-pi-os-on-your-raspberry-pi","title":"Install and set up Raspberry Pi OS on your Raspberry Pi","text":""},{"location":"setup/software/nonstandard-install/#download-a-raspberry-pi-os-sd-card-image","title":"Download a Raspberry Pi OS SD card image","text":"

    The setup scripts for the PlanktoScope OS assume that you will be setting up the PlanktoScope software on a 64-bit version of the Raspberry Pi OS with Debian version 11 (bullseye), preferably the version released on 2023-03-12. You can choose any of the following three variants of that version of the Raspberry Pi OS, depending on your needs:

    • \"Raspberry Pi OS with desktop\"
    • \"Raspberry Pi OS with desktop and recommended software\"
    • \"Raspberry Pi OS Lite\"

    The standard PlanktoScope software SD card images are built on the Raspberry Pi OS Lite image, which only provides a command-line interface, without a graphical desktop environment or web browser; because the PlanktoScope's graphical user interface must be accessed from a web browser, you might prefer to use the \"Raspberry Pi OS with desktop\" image in order to have a graphical desktop environment with a web browser. This would allow you to operate the PlanktoScope by plugging in a display, keyboard, and mouse to your Raspberry Pi; otherwise, you will have to connect to the PlanktoScope from another device over Ethernet or Wi-Fi in order access the PlanktoScope's graphical user interface.

    Warning

    The latest version of Raspberry Pi OS, with Debian version 12 (bookworm), can be downloaded from the Raspberry Pi Operating system images page, but the PlanktoScope software setup scripts do not yet work on Debian version 12; that page also has links named \"Archive\" under the download buttons where you can find older versions with Debian version 11 (bullseye) under the \"Raspberry Pi OS (Legacy)\" section; those links are the same as the links we listed above.

    "},{"location":"setup/software/nonstandard-install/#write-the-os-image-to-an-sd-card","title":"Write the OS image to an SD card","text":"

    Next, you will need to write your downloaded Raspberry Pi OS image file to your microSD card. Plug your microSD card into your computer; you may need to use a microSD-to-SD-card adapter, and/or an SD-card-to-USB adapter.

    To use a graphical application to write the image file to your microSD card, you can install the Raspberry Pi imager. Download the latest version of the Raspberry Pi Imager, install it, and start it. Select the Raspberry Pi OS image file (likely a .img, .img.gz, or .img.xz file) you just downloaded, and select the SD card you want to write the Raspberry Pi OS image to. Review your selections and click the appropriate button to begin writing the Raspberry Pi OS image to the SD card. The process should take several minutes.

    If you'd instead prefer to write the image file to your microSD card from a command-line tool, you could instead use a tool like ddrescue on a Debian-based system, e.g. as follows:

    gunzip planktoscope-v2.3-final.img.gz\nsudo ddrescue planktoscope-v2.3-final.img /dev/mmcblk0 --force\n

    Warning: be extremely careful when choosing the storage medium and ensure that you are writing the OS image file to the device which actually corresponds to the correct microSD card. Once the image has been written, data previously on the device will be lost and impossible to recover.

    "},{"location":"setup/software/nonstandard-install/#configure-your-raspberry-pi","title":"Configure your Raspberry Pi","text":"

    Insert the microSD card into your Raspberry Pi and connect your Pi to a screen, a mouse, and a keyboard. Double-check the connections before plugging in power.

    The first boot to the desktop may take up to 120 seconds. This is normal and is caused by the image expanding the filesystem to the whole SD card. DO NOT REBOOT before you reach the desktop.

    Eventually, the display will ask you to configure some settings for the Raspberry Pi. You will be asked to choose language settings and a keyboard layout; you should choose settings appropriate for you. The standard PlanktoScope SD card images use the en_US.UTF-8 locale and the \"Generic 104-key PC, English (US)\" keyboard layout. The display will also ask you to set a username and password for the default user account on the Raspberry Pi; you must choose pi as the username, and you should choose a password you can remember. By default, the standard PlanktoScope SD card images use copepode as the password - so you may want to choose a different password for better security. Refer to the official Getting Started with your Raspberry Pi guide for additional details and instructions on configuring settings for the Raspberry Pi.

    Next, configure your Raspberry Pi to get internet access - your Raspberry Pi will need to download software packages from the internet as part of the installation process for the PlanktoScope OS. If you have an Ethernet cable you can plug into your Raspberry Pi, that will be the simplest option for setup, because it won't require you to edit any files or run any commands on your Raspberry Pi; when we make our official SD card images with the PlanktoScope OS, we use an Ethernet cable. Otherwise, you will need to connect your Raspberry Pi to a wifi network with internet access; you can refer to the Raspberry Pi project's network configuration guide.

    "},{"location":"setup/software/nonstandard-install/#set-up-the-planktoscope-os","title":"Set up the PlanktoScope OS","text":""},{"location":"setup/software/nonstandard-install/#run-the-installation-script","title":"Run the installation script","text":"

    Depending on whether you're installing the software on a PlanktoScope with the PlanktoScope HAT (which is the standard HAT on v2.3 hardware and later) or with the Adafruit Stepper Motor HAT (which is the standard HAT on v2.1 hardware), you will need to adjust the commands below. Specifically, if you're installing the software for a PlanktoScope with the Adafruit Stepper Motor HAT, you will need to replace the word planktoscopehat with the word adafruithat in any of the commands below.

    Log in to your Raspberry Pi and (if you installed a version of Raspberry Pi OS with a graphical desktop) open a terminal. Then type in one of the following commands, depending on which release channel you want to use for installation (refer to our technical reference document on release channels to understand which release channel to use):

    StableBetaEdge
    wget -O - https://install.planktoscope.community/distro.sh \\\n  | sh -s -- -v software/stable -H planktoscopehat\n

    This will install the most recent stable release of the PlanktoScope OS (or, if the most recent release of the PlanktoScope software is a stable release, to install that stable release). This is recommended for most users.

    wget -O - https://install.planktoscope.community/distro.sh \\\n  | sh -s -- -v software/beta -H planktoscopehat\n

    This will install the most recent beta prerelease of the PlanktoScope OS (or, if the most recent prerelease/release of the PlanktoScope software is a stable release, to install that stable release). The beta prerelease probably contains bugs which will be fixed before the next stable release.

    wget -O - https://install.planktoscope.community/distro.sh \\\n  | sh -s -- -v master -H planktoscopehat\n

    This will install the current unstable development version of the PlanktoScope OS. This version is likely to be broken in various ways.

    Instead of installing the latest version on the \"stable\", \"beta\", or \"edge\" release channel, you can also install a specific tagged release or pre-release of the PlanktoScope software. For example, to install the v2024.0.0-alpha.1 pre-release of the PlanktoScope software, you would run the following command:

    wget -O - https://install.planktoscope.community/distro.sh \\\n  | sh -s -- -t tag -v v2024.0.0-alpha.1 -H planktoscopehat\n

    You can also choose to install the PlanktoScope software from some other repository on GitHub instead of github.com/PlanktoScope/PlanktoScope, by using the -r command-line option; for more information including usage examples, you can refer to the reference page for the installation script's command-line parameters, and/or you can get usage instructions by running the following command:

    wget -O - https://install.planktoscope.community/distro.sh \\\n  | sh -s -- --help\n
    "},{"location":"setup/software/nonstandard-install/#wait-for-installation-to-finish","title":"Wait for installation to finish","text":"

    The installation process will take a long time (around 15 - 30 minutes, depending on the speed of your internet connection and your microSD card) to finish.

    If an error occurs during this setup process, you will need to wipe the Raspberry Pi's microSD card, flash the Raspberry Pi OS image onto it again, and try running the setup steps again. Otherwise, you will eventually see a message reporting that the setup script finished setting up the PlanktoScope application environment.

    "},{"location":"setup/software/nonstandard-install/#connect-to-the-planktoscope","title":"Connect to the PlanktoScope","text":"

    Next, you will need to restart the Raspberry Pi, e.g. with the following command:

    sudo reboot now\n

    This step is necessary to finish the PlanktoScope software setup process.

    Afterwards, your PlanktoScope's Raspberry Pi will either connect to a Wi-Fi network (if you had previously configured it to connect to a Wi-Fi network) or make a new isolated Wi-Fi network whose name starts with the word pkscope followed by the unique randomly-generated name of your PlanktoScope, and whose password is copepode.

    If you connect another device (e.g. a phone or computer) directly to the PlanktoScope's Raspberry Pi over its isolated Wi-Fi network or over an Ethernet cable, then you can open a web browser on the device to access the PlanktoScope's graphical user interface at one of the following URLs (try them in the following order, and just use the first one which works):

    • http://planktoscope.local (this should work unless you're on a device and web browser without mDNS support; notably, older versions of Android do not have mDNS support)
    • http://pkscope.local (this should work unless you're on a device and web browser without mDNS support; notably, older versions of Android do not have mDNS support)
    • http://home.pkscope (this should work unless your web browser is configured to use a Private DNS provider)
    • http://192.168.4.1 (this should always work)
    • http://192.168.5.1 (this should always work)

    Note that if you had previously configured your PlanktoScope's Raspberry Pi to connect to a Wi-Fi network, it will not make its own isolated Wi-Fi network. On the Wi-Fi network it's connected to, it should be accessible at http://pkscope.local (if you're accessing it from a device and web browser with mDNS support, assuming the device is on the same network), assuming that no other PlanktoScope is connected to the same network. If multiple PlanktoScopes are connected to the same network, open http://pkscope.local and read the web page's \"Wrong PlanktoScope?\" section for instructions on what URL to use; you can determine your PlanktoScope's name by connecting a display to its Raspberry Pi, booting up the Raspberry Pi, and reading the name from the login prompt (e.g. if it says pkscope-chain-list-27764 login:, then the PlanktoScope is named pkscope-chain-list-27764).

    You will only be able to access the PlanktoScope's graphical user interface by plugging in a display and keyboard and mouse to the Raspberry Pi if you had previously used a \"Raspberry Pi OS with desktop\" or \"Raspberry Pi OS with desktop and recommended software\" SD card image as the base for the PlanktoScope software's setup script. In that case, you can open a web browser window on the Raspberry Pi and open http://localhost or any of the previously-listed URLs.

    "},{"location":"setup/software/nonstandard-install/#next-steps","title":"Next steps","text":"

    Now that you have installed the software and accessed the PlanktoScope software's user interface from your web browser, you should proceed to our guide for configuring your PlanktoScope.

    "},{"location":"setup/software/standard-install/","title":"Standard Installation","text":"

    This page provides instructions for installing the most recent standard version of the PlanktoScope OS on a PlanktoScope.

    "},{"location":"setup/software/standard-install/#set-up-the-sd-card","title":"Set up the SD card","text":"

    If you purchased a fully-assembled PlanktoScope or a DIY-assembly PlanktoScope kit from FairScope which includes a microSD card, then the SD card is already set up with the PlanktoScope OS, and you should skip to the next step.

    "},{"location":"setup/software/standard-install/#prerequisites","title":"Prerequisites","text":"

    In order to complete this step, you will need all of the following:

    1. A microSD card for your Raspberry Pi.
    2. A separate computer which can flash SD card images to your microSD card.
    "},{"location":"setup/software/standard-install/#download-the-planktoscope-software-sd-card-image","title":"Download the PlanktoScope software SD card image","text":"

    For ease of setup, we distribute the PlanktoScope OS as SD card image files. You can download the latest release from the releases page for the PlanktoScope project on GitHub. Each released version of the PlanktoScope OS has downloadable SD card images under the \"Assets\" dropdown, which has multiple SD card image files corresponding to different types of PlanktoScope hardware; for information about how to select the appropriate SD card image for your PlanktoScope hardware, refer to the \"Hardware configurations\" section of the software setup overview.

    "},{"location":"setup/software/standard-install/#write-the-image-to-the-sd-card","title":"Write the image to the SD card","text":"

    To write the image file to your microSD card:

    1. Download, install, and start the latest version of the Raspberry Pi Imager.
    2. Plug your microSD card into your computer; you may need to use a microSD-to-SD-card adapter, and/or an SD-card-to-USB adapter.
    3. Press the \"Choose Device\" button. Select \"No filtering\" from the menu. It actually doesn't matter what you select here.
    4. Press the \"Choose OS\" button. Select \"Use custom\" from the menu (this is why it doesn't matter what you selected in the \"Choose Device\" menu). In the file dialog, open the PlanktoScope SD card image file you downloaded in the previous section of this setup guide.
    5. Press the \"Choose Storage\" button. Select your SD card from the menu.
    6. Press the \"Next\" button. A pop-up dialog should appear asking if you would like to customize the OS. You should probably press the \"No\" button unless you are already experienced with the PlanktoScope software, because most of the settings inside don't matter to typical users of the PlanktoScope software, and because it's possible to break the software with incorrect settings.
    7. A pop-up dialog should appear asking you to confirm whether you selected the correct SD card and want to wipe all data on the SD card in order to write the PlanktoScope SD card image to your SD card. If you are ready, press the \"Yes\" button.
    8. The Raspberry Pi Imager will begin overwriting your SD card with the PlanktoScope SD card image. This will take a while to finish.

    Once flashing is complete, unmount the SD card and remove it from the computer.

    "},{"location":"setup/software/standard-install/#insert-the-sd-card-into-the-planktoscope","title":"Insert the SD card into the PlanktoScope","text":"

    Insert the microSD card into the Raspberry Pi computer installed in your PlanktoScope.

    "},{"location":"setup/software/standard-install/#connect-to-the-planktoscope","title":"Connect to the PlanktoScope","text":"

    Power on your PlanktoScope, and wait for it to start up. Note that it may take a few minutes to start up. Once it has finished starting up, it should create a new isolated Wi-Fi network whose name starts with the word pkscope followed by the unique randomly-generated name of your PlanktoScope. The password of this Wi-Fi network is copepode.

    Note that you will not be able to access the PlanktoScope's graphical user interface by plugging in a display to the Raspberry Pi. This is because the SD card image we provide does not include a graphical desktop or web browser, in order to keep the SD card image file smaller and to keep the PlanktoScope's Raspberry Pi running more efficiently. Instead, you will need to connect another device (e.g. a phone or a computer) directly to the PlanktoScope's Raspberry Pi, either over its isolated Wi-Fi network or over an Ethernet cable.

    After you connect another device directly to the PlanktoScope's Raspberry Pi, then you can open a web browser on the device to access the PlanktoScope's graphical user interface at one of the following URLs (try them in the following order, and just use the first one which works):

    • http://planktoscope.local (this should work unless you're on a device and web browser without mDNS support; notably, older versions of Android do not have mDNS support)
    • http://pkscope.local (this should work unless you're on a device and web browser without mDNS support; notably, older versions of Android do not have mDNS support)
    • http://home.pkscope (this should work unless your web browser is configured to use a Private DNS provider)
    • http://192.168.4.1 (this should always work)
    • http://192.168.5.1 (this should always work)

    The web browser should show a landing page with some information about your PlanktoScope and a list of links, including links to apps running on your PlanktoScope.

    "},{"location":"setup/software/standard-install/#next-steps","title":"Next steps","text":"

    Now that you have installed the software and accessed the PlanktoScope software's user interface from your web browser, you should proceed to our guide for configuring your PlanktoScope.

    "},{"location":"troubleshooting/","title":"Troubleshooting","text":"

    We don't yet have documentation to help you troubleshoot problems with your PlanktoScope yet! For now, you should sign up to join the PlanktoScope community on Slack, and ask for help in the #3-start-testing channel on Slack.

    "}]} \ No newline at end of file +{"config":{"lang":["en"],"separator":"[\\s\\-]+","pipeline":["stopWordFilter"]},"docs":[{"location":"","title":"PlanktoScope Documentation","text":"

    Welcome to the documentation for the PlanktoScope project! Here are some quick links to help you navigate the documentation depending on what you what you want to do:

    1. \"I want to get a PlanktoScope!\"
    2. \"I want to learn how to operate a PlanktoScope!\"
    3. \"I want to fix something which isn't working on my PlanktoScope!\"
    4. \"I want to get involved in the PlanktoScope community!\"
    5. \"I want to study the design of the PlanktoScope!\"
    "},{"location":"#what-is-planktoscope","title":"What is PlanktoScope?","text":"

    Plankton are living things which drift with the water currents in our world's oceans, rivers, and lakes. Lots of plankton are very small - so small that we need tools called microscopes in order for us to see them. One type of plankton is phytoplankton: plant-like plankton which take a huge amount of carbon dioxide from the air and become the food for all other life in the water - like the grasses of the sea. Because of this, plankton are very important to the health of our planet.

    But there\u2019s still a lot we don\u2019t know about what\u2019s happening with groups of plankton and how they\u2019re changing: most tools would be too hard and expensive for us to use to get much detail about how every group of plankton is changing across an entire ocean. If we can make tools which give detailed information and which everyone can use - everywhere, all the time - then we can learn more about how the oceans will change because of things people and companies are doing.

    The PlanktoScope is a low-cost, open-source, and portable microscope designed to take detailed photos of tiny plankton from lots of water, so that we can count the different kinds of plankton in the water.

    "},{"location":"#what-is-the-planktoscope-project","title":"What is the PlanktoScope project?","text":"

    The PlanktoScope project is a community project to develop the PlanktoScope as a tool and to help people use it for a variety of purposes around the world. It is part of a broader movement toward making scientific tools more accessible and affordable, while also empowering citizen scientists, educators, and researchers to study and monitor aquatic ecosystems.

    "},{"location":"#who-are-planktoscopes-for","title":"Who are PlanktoScopes for?","text":"

    We want the PlanktoScope to be a tool which is easy to use for anyone who's interested in the tiny things which live in our oceans, and for anyone who cares about the health of our oceans - not just scientists, but also sailors, marine farmers, makers, fishing communities, and students. However, we still need to make many improvements to the PlanktoScope in order to reach this goal. Most of the people who currently enjoy using PlanktoScopes have some experience with using microscopes, a tolerance for handling software problems, and a sense of adventure for trying out new technologies which are still in development.

    We also want PlanktoScopes to be easy to use for people around the world. Currently, the PlanktoScope software's user interface and documentation are all in English; we will need software and translation help to support other languages. The PlanktoScope community mainly works in English, though we also have active community members whose primary languages are French and Japanese.

    We are excited about the possibility of using PlanktoScopes for measuring things besides plankton - for example, counting and identifying microplastics, or monitoring suspended cell cultures, or even detecting parasites in certain diseases. However, we have not yet developed or assessed the PlanktoScope as a tool which people could use for these other purposes.

    If you want to help to improve the PlanktoScope, to build a PlanktoScope community in a non-English language, or to explore new uses for PlanktoScopes, please get involved in our global community!

    "},{"location":"faq/","title":"Frequently Asked Questions","text":"

    This FAQ has been compiled to answer common questions about the PlanktoScope project and how you can get involved. We hope you find it useful and we look forward to working with you to advance our knowledge of the oceans!

    "},{"location":"faq/#can-i-purchase-a-planktoscope","title":"Can I purchase a PlanktoScope?","text":"

    You can purchase a PlanktoScope - either as a kit of parts to assemble yourself or as a fully preassembled device - from a small business called FairScope, which was started by the inventor of the PlanktoScope in order to make PlanktoScopes easier to obtain. For more information, please refer to our page on how to obtain a PlanktoScope.

    "},{"location":"faq/#where-do-i-get-support-or-find-the-necessary-tools-to-build-planktoscope","title":"Where do I get support or find the necessary tools to build PlanktoScope?","text":"

    To find the necessary tools and knowledge to produce the PlanktoScope, consider visiting a Fablab or Hackspaces in your region. These organizations often have a culture of openness and may be willing to support you with your project.

    And if you have specific questions or problems, you can always report them in the Slack Channel and in the best case you will find someone there who can support you.

    "},{"location":"community/","title":"The PlanktoScope Community","text":"

    PlanktoScope is a completely open platform. The core of the PlanktoScope project is a basis in an evolving network of designers and users collaborating to increase the impact and availability of the tools. Building a community of users will enable PlanktoScope to grow with capabilities not yet imagined.

    For around $800, and with parts freely available in most parts of the globe, any person with the desire to engage can begin building a PlanktoScope. This website contains the information needed to assemble, test, and begin collecting data on your PlanktoScope.

    "},{"location":"community/#engage-on-github","title":"Engage on GitHub","text":"

    Feel free to visit the GitHub and engage if you want.

    GitHub is a web-based platform that is widely used in the PlanktoScope Community for version control and collaboration. It allows members to easily share, track, and manage code and other project files. The platform is built around the Git version control system, which allows multiple contributors to work on the same codebase simultaneously while keeping a record of every change made.

    In the PlanktoScope Community, members can use GitHub to collaborate on the development of the Planktoscope project. They created a central repository where they can share and track the code, documentation, and other project files.

    "},{"location":"community/#chat-on-slack","title":"Chat on Slack","text":"

    The community is using Slack to communicate.

    Slack is a communication and collaboration tool that is widely used in the PlanktoScope Community. It allows members to communicate and work together in real-time, providing a central hub for all conversations related to Planktoscope project. The platform offers features such as direct messaging, group channels, video conferencing, and file sharing, making it easy for members to stay informed and on the same page.

    The PlanktoScope community has created a dedicated Slack workspace for the community members to share their findings, ask for help, and discuss project-related topics.

    "},{"location":"community/#classify-on-ecotaxa","title":"Classify on EcoTaxa","text":"

    To join EcoTaxa, you just need to create an account.

    EcoTaxa is a web-based platform that enables researchers, educators, and citizen scientists to identify, classify and share images of microorganisms. The platform is designed to support biodiversity research and education by providing a user-friendly interface for browsing and analyzing images of microorganisms, as well as a collaborative environment for sharing images and data. EcoTaxa allows users to upload their own images, and the platform's machine learning algorithms can automatically identify and classify the organisms in the images.

    The platform also offers a variety of tools for analyzing and visualizing data, including image annotation, statistical analysis, and data export. Additionally, EcoTaxa has a community feature where researchers can share their findings, and have a discussion on the data, and contribute to the knowledge base. Overall, EcoTaxa is a valuable resource for anyone interested in microorganism biodiversity research and education.

    "},{"location":"community/code-of-conduct/","title":"Contributor Covenant Code of Conduct","text":""},{"location":"community/code-of-conduct/#our-pledge","title":"Our Pledge","text":"

    We as members, contributors, and leaders pledge to make participation in our community a harassment-free experience for everyone, regardless of age, body size, visible or invisible disability, ethnicity, sex characteristics, gender identity and expression, level of experience, education, socio-economic status, nationality, personal appearance, race, caste, color, religion, or sexual identity and orientation.

    We pledge to act and interact in ways that contribute to an open, welcoming, diverse, inclusive, and healthy community.

    "},{"location":"community/code-of-conduct/#our-standards","title":"Our Standards","text":"

    Examples of behavior that contributes to a positive environment for our community include:

    • Demonstrating empathy and kindness toward other people
    • Being respectful of differing opinions, viewpoints, and experiences
    • Giving and gracefully accepting constructive feedback
    • Accepting responsibility and apologizing to those affected by our mistakes, and learning from the experience
    • Focusing on what is best not just for us as individuals, but for the overall community

    Examples of unacceptable behavior include:

    • The use of sexualized language or imagery, and sexual attention or advances of any kind
    • Trolling, insulting or derogatory comments, and personal or political attacks
    • Public or private harassment
    • Publishing others' private information, such as a physical or email address, without their explicit permission
    • Other conduct which could reasonably be considered inappropriate in a professional setting
    "},{"location":"community/code-of-conduct/#enforcement-responsibilities","title":"Enforcement Responsibilities","text":"

    Community leaders are responsible for clarifying and enforcing our standards of acceptable behavior and will take appropriate and fair corrective action in response to any behavior that they deem inappropriate, threatening, offensive, or harmful.

    Community leaders have the right and responsibility to remove, edit, or reject comments, commits, code, wiki edits, issues, and other contributions that are not aligned to this Code of Conduct, and will communicate reasons for moderation decisions when appropriate.

    "},{"location":"community/code-of-conduct/#scope","title":"Scope","text":"

    This Code of Conduct applies within all community spaces, and also applies when an individual is officially representing the community in public spaces. Examples of representing our community include using an official e-mail address, posting via an official social media account, or acting as an appointed representative at an online or offline event.

    "},{"location":"community/code-of-conduct/#enforcement","title":"Enforcement","text":"

    Instances of abusive, harassing, or otherwise unacceptable behavior may be reported to the community leaders responsible for enforcement at < thibaut at fairscope.com > . All complaints will be reviewed and investigated promptly and fairly.

    All community leaders are obligated to respect the privacy and security of the reporter of any incident.

    "},{"location":"community/code-of-conduct/#enforcement-guidelines","title":"Enforcement Guidelines","text":"

    Community leaders will follow these Community Impact Guidelines in determining the consequences for any action they deem in violation of this Code of Conduct:

    "},{"location":"community/code-of-conduct/#1-correction","title":"1. Correction","text":"

    Community Impact: Use of inappropriate language or other behavior deemed unprofessional or unwelcome in the community.

    Consequence: A private, written warning from community leaders, providing clarity around the nature of the violation and an explanation of why the behavior was inappropriate. A public apology may be requested.

    "},{"location":"community/code-of-conduct/#2-warning","title":"2. Warning","text":"

    Community Impact: A violation through a single incident or series of actions.

    Consequence: A warning with consequences for continued behavior. No interaction with the people involved, including unsolicited interaction with those enforcing the Code of Conduct, for a specified period of time. This includes avoiding interactions in community spaces as well as external channels like social media. Violating these terms may lead to a temporary or permanent ban.

    "},{"location":"community/code-of-conduct/#3-temporary-ban","title":"3. Temporary Ban","text":"

    Community Impact: A serious violation of community standards, including sustained inappropriate behavior.

    Consequence: A temporary ban from any sort of interaction or public communication with the community for a specified period of time. No public or private interaction with the people involved, including unsolicited interaction with those enforcing the Code of Conduct, is allowed during this period. Violating these terms may lead to a permanent ban.

    "},{"location":"community/code-of-conduct/#4-permanent-ban","title":"4. Permanent Ban","text":"

    Community Impact: Demonstrating a pattern of violation of community standards, including sustained inappropriate behavior, harassment of an individual, or aggression toward or disparagement of classes of individuals.

    Consequence: A permanent ban from any sort of public interaction within the community.

    "},{"location":"community/code-of-conduct/#attribution","title":"Attribution","text":"

    This Code of Conduct is adapted from the Contributor Covenant, version 2.1, available at https://www.contributor-covenant.org/version/2/1/code_of_conduct.html.

    Community Impact Guidelines were inspired by Mozilla's code of conduct enforcement ladder.

    For answers to common questions about this code of conduct, see the FAQ at https://www.contributor-covenant.org/faq. Translations are available at https://www.contributor-covenant.org/translations.

    "},{"location":"community/license/","title":"Our work is fully open source","text":"

    That's the headline, yes.

    "},{"location":"community/license/#hardware-files","title":"Hardware files","text":"

    We released our hardware files (everything in the hardware directory) under a CERN OHL-S license.

    "},{"location":"community/license/#software-source","title":"Software source","text":"

    Our source code (everything in the directories flows and scripts) is released under a GPL-3.0 license.

    "},{"location":"community/license/#everything-else-documentation-pictures-etc","title":"Everything else (documentation, pictures, etc...)","text":"

    Everything else is released under a Creative Commons CC-BY-SA license.

    "},{"location":"community/trainings/","title":"Trainings","text":"

    The success of the PlanktoScope community depends on the people who generously share their knowledge and expertise about its production and use with others, helping to promote its widespread adoption and use. By actively participating in the community and sharing their insights and experiences, individuals can contribute to the growth and success of the PlanktoScope, ultimately benefiting not just the community but also the broader field of study.

    "},{"location":"community/trainings/#the-train-the-trainer-program","title":"The Train the trainer program","text":"

    The train the trainer program is a training program designed to equip individuals with the knowledge and skills needed to deliver training to others. The goal of a train the trainer program is to build capacity within the PlanktoScope community by volunteers to become trainers themselves.

    This guide is intended to provide you with a solid foundation of knowledge and understanding about the PlanktoScope, enabling you to confidently develop and deliver your own training program for others. Whether you are an experienced user looking to share your expertise with others or a newcomer to the PlanktoScope looking to learn more about its capabilities and applications, this guide is designed to help you gain the necessary skills and knowledge to successfully teach others about this powerful tool.

    "},{"location":"community/trainings/#event-types","title":"Event types","text":""},{"location":"community/trainings/#build-workshop","title":"Build workshop","text":"

    Organizing a build workshop can be a challenging but rewarding experience. It requires careful planning and execution to ensure that the workshop is successful. This trainer manual is designed to guide you through the process of organizing a build workshop.

    "},{"location":"community/trainings/#selecting-the-production-site","title":"Selecting the production site","text":"

    Choosing the right production site for preparing and manufacturing the PlanktoScope Kits is an important step in the workshop planning process. The production site should have the necessary tools and equipment, as well as the knowledge and expertise to manufacture the PlanktoScope Kits. Here are a few things to consider when choosing a production site:

    1. Check the Manufacturing and Assembly Guides: Before choosing a production site, make sure to review the PlanktoScope Kit Manufacturing Guide and the Device Assembly Guide. These guides will provide detailed information on the necessary tools and equipment required for the production of the PlanktoScope Kits.
    2. Visit Fablab and Hackspaces: Consider visiting Fablabs or Hackspaces in your region. These organizations often have a culture of openness and may be willing to support you with your project. They may have the necessary tools and equipment to produce the PlanktoScope Kits, as well as the knowledge and expertise to guide you through the production process.
    3. Commercial Manufacturing: Look for a facility that has the capability to handle small scale production runs, a good quality control process and a logistic plan to ship the product to the final destination. Many

    Tip

    For the PlanktoScope case, for example, you can look for woodworking companies. They often have a CNC machine and are familiar with the process of ditigal production.

    "},{"location":"community/trainings/#material-procurement","title":"Material procurement","text":"

    Building a PlanktoScope requires a specific set of materials. In order to ensure that the workshop runs smoothly and that all attendees are able to successfully build their own PlanktoScope, it is important to properly plan and execute the procurement of materials. The following is a step-by-step guide on how to properly plan and execute the procurement of materials for a workshop:

    1. Prepare the order list: Use the bill of materials (BOM) as a starting point to create a comprehensive list of all materials needed for the workshop. Expand it with additional columns for suppliers, delivery dates, prices, shipping costs, and import taxes.
    2. Plan for packaging: Plan for extra packaging so you can assemble the parts as shown in the instructions. Try to minimize plastic as much as possible.
    3. Research suppliers: Research suppliers and see if there are local options, if you can consolidate orders to save costs and ensure timely delivery.
    4. Compare prices: Compare the prices of different suppliers to minimize the total cost.
    5. Plan for spare parts: Plan for spare parts in case something is broken or lost.
    6. Check your Budget: Check your budget and ensure that you have enough funds to cover the cost of all materials, shipping, and any additional expenses before placing your orders.
    7. Place orders: Once you have identified the best suppliers, place orders for all of the materials that you need. Be sure to factor in lead time when placing orders to ensure that the materials will arrive in time for the workshop.
    8. Track orders: Keep track of your orders and expected delivery dates, mark a component when it arrives. Contact suppliers if there are any delays or problems with delivery.
    9. Communicate: Communicate with participants if there are issues with timely delivery. It may make sense to postpone the workshop if there is not enough time to prepare and test everything. The participants will be grateful and will understand if it helps to ensure that everything runs smoothly.

    By following this process, you can ensure that all materials are procured and organized well in advance of the workshop, to avoid any last-minute delays or complications.

    Note

    If you have difficulty finding the components you need, contact us and we will be happy to help you find the right alternative.

    Warning

    Have a backup plan and be prepared for unexpected events that may occur during the procurement process. Allow two months for delivery, as some specialty parts may travel a long way and require additional time for customs inspection.

    Tip

    Let us know your results, we would love to hear what solutions you found and how cost effective you were able to make the PlanktoScope.

    "},{"location":"community/trainings/#prepare-the-kit","title":"Prepare the Kit","text":"

    Kit preparation for the workshop is an important step in the preparation process. This ensures that participants have the materials and equipment they need to complete the workshop and build their own PlanktoScope. Here are a few things to keep in mind when preparing the kits:

    1. Review the Bill of Materials (BOM): Review the Bill of Materials (BOM) for the PlanktoScope to ensure that you have all the necessary parts and materials for the workshop. The parts list can be found in the Device Assembly Guide and lists all components and quantities needed to build a microscope.
    2. Divide the kit components according to the BOM: Once the materials have been received, divide the kit components from the orders according to the Bill of Materials (BOM) of the PlanktoScope. This will ensure that each participant receives the correct components and that there are no missing parts.
    3. Have extra components: Have extra components on hand in case of any missing or damaged parts during the workshop.
    4. Package the kits: Package the kits in a way that makes it easy for the participants to find and use the components during the workshop.
    5. Label materials: Label the packages as described in Device Assembly Guide so that they are easy to find and distribute during the workshop.
    6. Preparation of the housing parts: Prepare the housing parts by applying the surface sealant and insert the nuts to screw the housing as described in the Kit Manufacturing Guide.
    7. Cutting and soldering of electronic cables: Cut and solder the electronic cables for the PlanktoScope. This will save time during the workshop and ensure that the participants have all the necessary cables to complete the assembly.
    8. Setting up the embedded development environment: Set up the embedded development environment and flash the eeprom of the PlanktoScope hat. This will ensure that the PlanktoScope hat is ready to be used during the workshop.
    9. Download the Raspberry Pi image: Download the Raspberry Pi image and flash it to the SD card. This will ensure that the participants have a ready to use image for the PlanktoScope.
    10. Test the kits: Test the kits before the workshop to ensure that all components are working correctly and that the instructions are clear and easy to follow. This will help to ensure that the participants have a positive and productive experience during the workshop.

    Tip

    Identify any items that are time consuming during the workshop and not particularly important or complex to explain. These tasks can be completed in advance to save time during the workshop. This will make it easier for the participants to assemble the PlanktoScope during the workshop.

    "},{"location":"community/trainings/#conducting-the-workshop","title":"Conducting the workshop","text":"

    It's finally here! After all the planning, preparation, and anticipation, the build workshop is about to begin. Take a deep breath and let's go!

    1. Prepare the presentation: Prepare the presentation device and start your slides.
    2. Check-In: Once the Participants arrive, complete the check-in, share the agenda and set expectations for the workshop.
    3. Venue: Provide information about the venue, including where to find restrooms and where to buy food.
    4. Digital tools: Provide information about the digital tools that will be used during the workshop, such as the platform for collaboration, the survey tool and the chat channel, and how to access them.
    5. Data privacy: Inform about the privacy policy and the forms that need to be signed by the participants if you want to take photos.
    6. Introduction round: Begin with a round of introductions and give everyone a chance to introduce themselves, their background, and their interest in the project.
    7. Provide an overview: Provide details about the project, including the general mode of operation, the working materials such as the kit, the documentation and the git repository.
    8. Provide the Kits and Tools: Provide the Kit and Tools to each participant with a kit and the necessary tools.
    9. Follow the build instructions: Depending on the format you have chosen, start implementing by following the Kit Manufacturing guide or Device Assembly guide
    10. Follow the operation instructions: Now that you have successfully assembled the PlanktoScope, you can proceed to operation of the PlanktoScope by following the Getting started and User interface instructions.
    11. Final Test: For a final test you can use for example pure cultures or a sample taken with a Plankton net from a surrounding waters.
    "},{"location":"community/trainings/#field-trip","title":"Field trip","text":"

    Are you an expert in organizing field trips? Share your skills with the PlanktoScope community by documenting the process! By documenting how you organize a field trip, you can help others create successful events and bring more event options to the PlanktoScope community. Your documentation will be a valuable resource for anyone looking to plan a field trip, and it will also help to grow and strengthen the PlanktoScope community. Don't miss this opportunity to contribute to the community, start documenting your process today!

    "},{"location":"community/trainings/#hackathon","title":"Hackathon","text":"

    Are you a master at organizing Hackathons? Share your knowledge with the PlanktoScope community by documenting the process! By documenting how you organize a Hackathon, you can help others create successful events and bring more event options to the PlanktoScope community. Your documentation will be a valuable resource for anyone looking to host a Hackathon, and it will also help to grow and strengthen the PlanktoScope community. Don't miss this opportunity to contribute to the community, start documenting your process today!

    "},{"location":"community/trainings/#general-planning-methods","title":"General planning methods","text":"

    Organizing a workshop can be a challenging but rewarding experience. It requires careful planning and execution to ensure that the workshop is successful. This trainer module is designed to guide you through the process of organizing any type of event.

    By following the guidelines, you will be able to plan a workshop that is engaging, productive, and successful. It will also help you to create a sense of community among participants and will help them continue their learning after the workshop.

    "},{"location":"community/trainings/#building-a-team","title":"Building a team","text":"

    Every project needs a team to support it. The team should be composed of individuals with a diverse set of skills and experiences to ensure all aspects of the workshop are effectively covered.

    1. Identify the roles and responsibilities: Determine the key areas that need to be covered during the workshop and assign specific roles to team members. For example, one team member may be responsible for organizing logistics, while another may be responsible for creating the agenda.
    2. Assemble the team: Once the roles and responsibilities have been identified, begin assembling the team. Consider individuals with relevant skills and experiences, as well as those who have a passion for the topic of the workshop. It is also important to have a mix of team members from different departments or backgrounds to bring a variety of perspectives to the planning process.
    3. Communicate effectively: Establish clear lines of communication within the team to ensure that everyone is on the same page. This can be done through regular meetings, email, or a team collaboration platform.
    4. Encourage participation: Encourage team members to actively participate in the planning process by sharing their ideas and feedback. This will help to ensure that everyone feels invested in the success of the workshop.
    5. Appoint a leader: Appoint a leader for the team who will be responsible for coordinating the planning process and ensuring that the team stays on track. The leader should be someone who is organized, a good communicator, and able to delegate tasks effectively.
    "},{"location":"community/trainings/#communication-channels","title":"Communication channels","text":"

    Choosing the right communication channels is an important step in the planning process for a workshop, as it is crucial not only for the organizing team but also for the participants during and after the workshop. The right communication channels can help to build a fluent community, improve collaboration and keep everyone informed and on the same page.

    1. Choose the right channels: Once the needs have been identified, choose the communication channels that will best serve those needs. Email, chat, and video conferencing are all popular options. If the group is small, a group chat or email chain may be sufficient. If the group is larger or more dispersed, a video conferencing platform may be more appropriate.
    2. Make sure they are accessible: Ensure that the communication channels you choose are accessible to all participants. This may include providing training or support for those who are less familiar with the tools you are using.
    3. Communicate expectations: Clearly communicate the expectations for using the communication channels to the participants. This includes guidelines for how often and when to check the channels, as well as how to respond to messages.
    4. Continuity: Make sure that you have continuity in the communication channels after the workshop. This will help to build a fluent community and to keep the participants connected and engaged. Use the same channels to share updates and resources, or to organize follow-up events or activities.

    Note

    Email is a reliable and widely-used communication channel that can be used for sending out workshop updates, sending materials, and answering questions. It is also a good option for sending out reminders and follow-up information after the workshop.

    Note

    Chat networks, such as Matrix, are a great option for secure, real-time and decentralized communication during the workshop. They allow participants to ask questions, share resources and collaborate on projects in real-time. They can also be used for group discussions and as a platform for sharing feedback. Additionally, chat platforms can be used as a platform for post-workshop communication and to build a fluent community.

    Tip

    If you need assistance with creating a Chat for your workshop, please let us know. We can easily set up new subchannels within our PlanktoScope Slack channel to support communication and collaboration during your workshop. This will also help facilitate the exchange of information within the community.

    "},{"location":"community/trainings/#selecting-digital-tools","title":"Selecting digital tools","text":"

    The right tools can help to facilitate communication, collaboration, and organization, making the workshop experience more productive and enjoyable for everyone.

    1. Use web-based tools: Whenever possible, use web-based tools that can be accessed from any device with an internet connection. This will make it easier for participants to access and use the tools, regardless of their location or device.
    2. Use collaborative note-taking tools: You might use web-based tools like HedgeDoc that allow participants to collaboratively collect notes during the workshop. This can help to ensure that everyone has access to the same information, and can help to make the workshop experience more productive and enjoyable for everyone.
    3. Use survey tools: You might use survey tools like LimeSurvey to gather information about the participants' needs and expectations for the workshop. This can help to ensure that the workshop is relevant, valuable, and effective for them.
    4. Use ticketing tools: You might use tools like Pretix to manage ticketing for the workshop. This can help to simplify the registration process, and can also provide valuable information about the attendees.
    "},{"location":"community/trainings/#find-your-audience","title":"Find your audience","text":"

    If you already have an audience for your workshop, that's fantastic. But it's also a good idea to let others know about your plans and potentially expand your audience. Contact nongovernmental organizations, universities, and research institutions in your area to see if they would be interested in participating in or even helping to organize the workshop.

    Tip

    One way to get in touch with others who are interested in PlanktoScope is to join our Slack Channel. We can support you by sharing contacts of individuals and organizations who have expressed an interest in PlanktoScope.

    "},{"location":"community/trainings/#determining-the-need","title":"Determining the need","text":"

    Understanding the needs of the participants will help to ensure that the workshop is relevant, valuable, and effective for them. Here are a few things to consider when determining the needs of the participants:

    1. Surveys and questionnaires: Use surveys and questionnaires to gather information about the participants' needs and expectations for the workshop. This can include their level of experience and knowledge, their specific interests and goals, and any challenges or concerns they may have.
    2. Pre-workshop consultation: Schedule pre-workshop consultations with the participants to discuss their needs and expectations in more detail. This can help to identify any specific areas of interest or concern, and can also provide an opportunity to address any questions or concerns the participants may have.
    3. Audience analysis: Analyze the characteristics of the audience, such as their profession, level of education and experience, and any other relevant details. This will give you a better idea of the type of content that will be most relevant and useful for the participants.
    4. Feedback: Ask for feedback from participants after the workshop and take it into account when planning future workshops. This feedback can be used to improve the overall experience and to tailor the workshop to better meet the needs of the participants.
    "},{"location":"community/trainings/#defining-the-goals","title":"Defining the goals","text":"

    Defining the goals of a workshop is an essential step in the planning process. The goals will serve as the foundation for the workshop, guiding the content and activities that are included.

    1. Number of participants: The workshop should be designed for a specific number of participants. Depending on the available resources, the number of participants can range from small groups of 4-8 people to larger groups of 8-12 people.
    2. Number of microscopes: The goal of the workshop is to build a specific number of PlanktoScope Microscopes. It is important to have the necessary materials and tools for each participant to build their own microscope.
    3. Content: The workshop will include both theoretical and practical content. The theoretical content will cover the principles of open-source hardware and software and the specific design of the PlanktoScope Microscope. The practical content will focus on the assembly and usage of the microscope, including hands-on experience with soldering and other techniques.

    Tip

    Depending on the time, resources, and audience, it is important to carefully decide what activities and tasks should be done during the workshop and what should be prepared upfront. This will ensure that the workshop runs smoothly and efficiently, and that the participants are able to fully engage and participate in the activities. Additionally, by carefully planning and preparing upfront, you can minimize the chances of overwhelming attendees with problems or difficulties that may arise during the workshop.

    "},{"location":"community/trainings/#financial-planning","title":"Financial planning","text":"

    The cost of materials, equipment, and other expenses can add up quickly, so it is important to have a plan in place to secure funding. Here are a few things to consider when planning the finances for your workshop:

    1. Decide on the cost of the kits: One of the first things to consider is whether you want to offer the kits for sale to the participants or if you want them to purchase the kits themselves. If you choose to offer the kits for sale, you will need to factor in the cost of materials and other expenses, such as shipping and handling. If you choose to have the participants purchase the kits themselves, you will need to provide them with information on where to purchase the kits and the estimated cost.
    2. Check for funding opportunities: There may be organizations or foundations that would be willing to support your workshop financially. It's a good idea to research potential sources of funding such as grants, sponsorships, and crowdfunding campaigns. Additionally, look for local or regional organizations that are working in the same field as your workshop, they might be interested in supporting your initiative.
    3. Reach out to potential sponsors: Once you have identified potential sources of funding, reach out to them to inquire about their funding opportunities. Be prepared to provide them with information about the workshop, including the goals, objectives, and expected outcomes. Be sure to include information about the open-source nature of the project, as this may make it more attractive to organizations with an interest in open-source technology.
    4. Look for cost-saving options: In addition to securing funding, there are also ways to save money on expenses. Consider renting equipment or space rather than purchasing it. Reach out to local universities or community organizations to see if they have equipment or space that you can use for the workshop at a reduced cost or for free.

    Tip

    If you are organizing the workshop as an individual, consider running the project through a non-profit organization to facilitate the collection of donations. This will also help to ensure transparency and accountability for the funding received. Alternatively, you can choose a commercially active organization that can provide proper accounting and financial management for the workshop participants. This will provide a clear financial record and can help to ensure that the workshop is run in a professional and organized manner.

    "},{"location":"community/trainings/#creating-a-timetable","title":"Creating a timetable","text":"

    Creating a schedule for a workshop is an important step in the planning process. A well-organized schedule will help to ensure that the workshop runs smoothly and that all the important topics are covered. Here are a few things to consider when creating a schedule for your workshop:

    1. Plan for more than just a day: A workshop may take more than one day to complete, so be sure to plan accordingly. Consider the amount of time required to cover all the topics, and allocate enough time for each one.
    2. Assign an expected duration to each item on the schedule: Assign an expected duration to each item on the schedule so that participants know how much time they should expect to spend on each topic. This will also help you to ensure that you have allocated enough time for each topic.
    3. Allocate time for breaks and activities: Make sure to allocate time for breaks, meals and other activities such as group discussions, teamwork, or hands-on activities. This will help to keep the participants engaged and energized throughout the workshop.
    4. Plan for contingencies: Include some flexibility in the schedule to allow for unexpected events or delays. This will help to ensure that the workshop stays on track even if things don't go exactly as planned.
    "},{"location":"community/trainings/#venue-selection","title":"Venue selection","text":"

    The location should be convenient and accessible for the participants, and should be equipped with the necessary resources to make the workshop a success. Here are a few things to consider when choosing a workshop location for a workshop on building an open-source PlanktoScope microscope:

    1. Reach out to Universities, research institutions, Fablabs, Hackspaces or non-profit organizations: Reach out to organizations that might have an interest in the PlanktoScope, and a community that might support you with free access to their location.
    2. Check the equipment: Make sure the location is equipped with the necessary resources such as a whiteboard, projector/TV, and other equipment that may be required for the workshop.
    3. Check the accessibility: Check the accessibility of the location with the public transport system and parking availability.
    4. Check for food provision: Consider if there is a possibility to go shopping or how to provide food for the course participants during the workshop.
    5. Check the environment: Consider the environment of the location, make sure it is comfortable, has enough space and is well-ventilated for the workshop.
    "},{"location":"community/trainings/#announcing-the-event","title":"Announcing the event","text":"

    When announcing the event, it is important to include the following information:

    1. Date: Provide a specific date, start and end time for the workshop, and ensure there is enough lead time for preparation, including ordering or manufacturing materials and coordinating with suppliers. Allow ample time between announcing the workshop and the actual event.
    2. Goal: Clearly communicate the specific goal of the workshop, such as to build a fully functional planktoscope and learn how to use it.
    3. What attendees will learn in the workshop: Clearly outline the specific skills or knowledge that will be covered in the workshop, such as how to assemble the kit, soldering the through-hole components of the controller, and working with the software.
    4. Instructor's background: Provide some notes about the instructor's qualifications or experience that make them well-suited to lead the workshop, such as experience working with planktoscope.
    5. Target audience: Clearly indicate the target group of the workshop, such as researchers, engineers or designers.
    6. Previous knowledge: Specify any previous knowledge required for the workshop, such as soldering skills or experience working with open-source hardware and software.
    7. Implementation method: Describe the form of the workshop, such as a step-by-step guide.
    8. Documentation: Consider sharing the documentation beforehand, so they can familiarize themselves with the process.
    9. Cost: Clearly communicate the cost of the workshop.
    10. Schedule: Provide a clear and detailed schedule of the workshop, including the duration of the workshop, for example, one day of building and one day of using the plankoscope.
    11. Location: Provide the location of the workshop, including information on how to get there with public transportation or Arrival by car and parking. Also, provide a link to a map service
    12. Registration: Details of the registration process, including information on where to obtain a ticket and any deadlines for registration.
    13. Contact details: Additionally, it may be helpful to include contact information for any questions.
    14. Images: Include some visually appealing images, such as from a previous workshop or field trip, to show what attendees can expect from the event. This can additionally be a great way to build anticipation and excitement, thus motivating more people to attend the workshop.
    15. Media: Post your offer on a website or social media platform that is relevant to the workshop topic and your target audience. This way you can increase visibility and reach a wider audience, which increases the chances of getting more attendees.

    Tip

    If you already have a group of interested people, send a link to the announcement via email or chat and invite them personally.

    "},{"location":"community/trainings/#preparing-a-presentation","title":"Preparing a presentation","text":"

    Preparing a presentation for a build workshop is an important step in the preparation process. It helps to ensure that the participants have the information they need to complete the workshop and understand the concepts behind building the Planktoscope.

    1. Gather resources: Gather resources such as images, videos, and diagrams that can be used to support the presentation. These resources can be found on the Planktoscope website or other sources.
    2. Outline the main topics: Outline the main topics that will be covered during the workshop, such as the components of the microscope, the assembly process, and the use of the microscope.
    3. Prepare a handout: Prepare a handout or a guide that the participants can use during the workshop to follow the steps, and have it ready to be printed or shared digitally
    4. Practice the presentation: Practice the presentation several times before the workshop to ensure that it runs smoothly and that you are comfortable with the material.
    5. Be ready to adapt: Be ready to adapt the presentation during the workshop to fit the needs of the participants.

    Here are some topics that should be covered in a presentation:

    1. Event: Provide an overview of the event, including the goal of the workshop.
    2. Schedule: Provide an timetable for the event, including breaks, start and end times, and any planned activities for the next day.
    3. Venue: Provide information about the venue, including where to find restrooms and where to buy food.
    4. Instructor: Provide information about the instructor, including his or her background, and how to get in touch with him or her
    5. Digital tools: Provide information about the digital tools that will be used during the workshop, such as the platform for collaboration, the survey tool and the chat channel, and how to access them
    6. Data privacy: Provide information about the data privacy policy and the forms that need to be signed by the participants.
    7. Follow-ups: Point out follow-up actions such as the survey and that participation can be very helpful in improving the offer.
    8. Communication: Inform about the communication channels that will be used during the workshop and complete the onboarding.
    9. Introduction round: A round of introductions at the beginning of a workshop helps to create a sense of community and connection among the participants, allows the instructor to tailor the workshop to the group's needs, addresses potential language barriers, creates a sense of accountability, and helps participants to be more focused and relaxed.
    10. About the project: Provide details about the project, including the working materials such as the kit, the documentation, and the git repository.
    "},{"location":"community/trainings/#send-an-final-reminder","title":"Send an final Reminder","text":"

    Make sure participants are well informed and can find their way to you by sending a final reminder before the start so everything is well prepared.

    1. Schedule for the event: Include a detailed schedule for the event, including breaks, start and end times, and any planned activities for the next day. This will help participants to plan their time and make the most of the workshop.
    2. About the venue: Provide detailed information about the venue, including the address, public transportation options, and parking situation. Make sure to include any specific instructions or requirements for accessing the venue.
    3. About the documentation: Provide a link to the documentation, such as the assembly and manufacturing guide, that the participants can familiarize themselves with before the workshop. This will help them to be better prepared and make the most of the workshop.
    4. Cancellation policy: Remind the participants that now is the last opportunity to cancel their registration. This will allow other individuals on the waiting list to attend the workshop.
    5. Final Instructions: Provide any final instructions or important information that the participants should be aware of before the workshop.
    "},{"location":"community/trainings/#documenting-the-event","title":"Documenting the event","text":"

    Documenting a PlanktoScope workshop through photography is essential for several reasons. Photos can be used to showcase the workshop activities and the learning process of the participants. This can be useful for sharing information about the workshop with others, and for promoting future workshops.

    1. Equipment: Make sure you have the necessary equipment to document the event, including a camera (DSLR or mirrorless camera), lenses, memory cards, and batteries.
    2. Backup: Always make sure to have a backup plan for your equipment and photos, such as bringing extra memory cards and batteries.
    3. Lighting: Take into account the lighting conditions and make sure to have the right settings for your camera to capture the best possible images.
    4. Planning: Plan out the photos you want to take, taking into account the theme, location and schedule of the event.
    5. Composition: Pay attention to the composition of your photos and make sure to use techniques such as the rule of thirds and leading lines to create visually appealing images.
    6. Capturing candid moments: In addition to capturing posed shots, make sure to capture candid moments that capture the atmosphere and emotions of the event.
    7. Post-processing: Once the event is over, review and edit your photos to make them look their best.
    8. Data Privacy and Opt-Out: Pay attention to the privacy policy and get participants' consent before taking photos of them. Offer an opt-out option for participants who do not want to have photos taken. Clearly communicate what the photos will be used for and by whom, for example, to enhance this documentation.
    9. License: If your participants have agreed to share and use the photos, choose an appropriate license under which to license the photos. We recommend the Creative Commons license. For more information, see the project's license terms page.
    10. Sharing on Social Media: Share the photos on social media platforms to create a visual memory of the event and increase the visibility of the event.

    By preparing and taking care of these things, you can ensure that you are able to document the event effectively and create a visual record of the event that can be shared and enjoyed for years to come.

    "},{"location":"community/trainings/#follow-up","title":"Follow-up","text":"

    Follow-up activities are an essential part of the workshop planning process. They help to ensure that the workshop's objectives are met and that the participants leave the workshop with a sense of accomplishment. Here are a few things to consider when planning follow-up activities after an event like a workshop:

    1. Follow-up with participants: Send out a survey or contact participants individually to gather feedback on their experience during the workshop. This feedback can be used to improve future workshops and address any issues that may have arisen.
    2. Share resources and information: Share any relevant resources such as presentations, handouts, or any other materials that will help the participants continue their learning after the workshop.
    3. Build a community: Encourage participants to connect and share their experiences with each other. This can be done through online forums, social media groups, or other platforms. Building a community of enthusiasts and collaborators will help to ensure that the workshop's goals and objectives are met and that the participants leave the workshop with a sense of accomplishment.
    4. Continual learning: Provide additional training opportunities or resources for participants to continue their learning after the workshop. This could be through follow-up workshops, webinars, or online tutorials.
    5. Track progress: Keep track of the progress of the participants, check if they are applying what they learned during the workshop and give feedback to help them improve.
    "},{"location":"community/trainings/#improve-this-training-program","title":"Improve this training program","text":"

    As with any training program, there is always room for improvement. To ensure that this program continues to meet the needs of its attendees, it is important to actively seek feedback and make changes as necessary.

    Here are a few ways to improve this training program:

    1. Gather feedback: Regularly gather feedback from attendees, instructors and other stakeholders to understand how the program is being received and identify areas for improvement.
    2. Review and revise content: Review the content of the program and make changes as necessary to ensure that it is up-to-date, accurate, and relevant to the attendees.
    3. Continuously update the material: Continuously update the material, adding new information and best practices as it becomes available.
    4. Use different learning methods: Use different learning methods to accommodate different learning styles, such as hands-on activities, group discussions, and online resources.
    5. Encourage participation: Encourage participation and collaboration among attendees, creating an interactive and dynamic learning experience.
    6. Use modern technologies: Use modern technologies to enhance the learning experience, such as virtual reality, gamification, and AI-based learning.
    7. Assess the impact: Assess the impact of the program on the attendees and make changes as necessary to ensure that the program is achieving its intended goals.

    For more information on how to contribute to this document and improve this training program, please see the contribute section on Writing Documentation.

    "},{"location":"community/contribute/documentation/","title":"Writing Documentation","text":"

    The source files are in the main github repository, in the docs folder.

    They are simple Markdown files, that you can edit in any text editor of your choice.

    The local development and test is made using mkdocs. This allows you to test your documentation changes for styling issues and see what it will look like once rendered.

    hatch run docs:serve\n

    After installing mkdocs, you can use mkdocs serve in the main folder of this repository to start the development server.

    If you want to include pictures and diagrams in the documentation, please set the pictures in a dedicated folder to the name of the page you are creating (for example, if your page is named expert_setup.md, please put all the related pictures in the docs/expert_setup/ folder). Each picture should be named with a simple yet descriptive name, using jpg or png format if possible. Try to limit the size of the file by limiting the resolution to what is necessary for the picture to be clear on screen.

    Contributions should be made by creating pull requests on Github directly.

    "},{"location":"community/contribute/documentation/#extensions-available","title":"Extensions available","text":"

    In addition to the common markdown syntax, several extensions are activated. If you want more information on any of them, please follow the linked guides.

    • SmartyPants: Converts ASCII dashes, quotes and ellipses to their HTML entity equivalents.
    • Sane Lists: Alters the behavior of the Markdown List syntax to be less surprising.
    • Admonition: Adds rST-style admonitions to Markdown documents.
    • Table of contents: Generates a Table of Contents from a Markdown document and adds it into the resulting HTML document.
    • Metadata: Adds a syntax for defining meta-data about a document.
    • Tables: Adds the ability to create tables in Markdown documents.
    • Fenced Code Blocks: Adds a secondary way to define code blocks.
    "},{"location":"community/contribute/github/","title":"Contributing","text":"

    First of all, thank you for contributing to the PlanktoScope! The goal of this document is to provide everything you need to know in order to contribute to PlanktoScope.

    There are several ways to join the development effort, share your progress with your build or just ask for help.

    We are using slack as a communication platform between interested parties. You can request to join by filling this form.

    This repository is also a good way to get involved. Please fill in an issue if you witnessed a bug in the software or hardware. If you are able, you can also join the development effort. Look through the issues opened and choose one that piques your interest. Let us know you want to work on it in the comments, we may even be able to guide your beginnings around the code.

    "},{"location":"community/contribute/github/#assumptions","title":"Assumptions","text":"
    1. You're familiar with git and the Merge Request(PR) workflow.
    2. **You've read the PlanktoScope documentation.
    3. You know about the PlanktoScope community on Slack. Please use this for help.
    "},{"location":"community/contribute/github/#how-to-contribute","title":"How to Contribute","text":"
    1. Make sure that the contribution you want to make is explained or detailed in a GitHub issue! Find an existing issue or open a new one.
    2. Once done, fork the PlanktoScope repository in your Github account. Ask a mastertainer if you want your issue to be checked before making a PR.
    3. Create a new Git branch.
    4. Review the Development Workflow section that describes the steps to mastertain the repository.
    5. Make the changes on your branch.
    6. Submit the branch as a PR pointing to the master branch of the master fabcity-os-core-chart repository. A mastertainer should comment and/or review your Pull Request within a few days. Although depending on the circumstances, it may take longer. We do not enforce a naming convention for the PRs, but please use something descriptive of your changes, having in mind that the title of your PR will be automatically added to the next release changelog.
    "},{"location":"community/contribute/github/#git-guidelines","title":"Git Guidelines","text":""},{"location":"community/contribute/github/#git-branches","title":"Git Branches","text":"

    All changes must be made in a branch and submitted as PR. We do not enforce any branch naming style, but please use something descriptive of your changes.

    "},{"location":"community/contribute/github/#git-commits","title":"Git Commits","text":"

    As minimal requirements, your commit message should:

    • be capitalized
    • not finish by a dot or any other punctuation character (!,?)
    • start with a verb so that we can read your commit message this way: \"This commit will ...\", where \"...\" is the commit message. e.g.: \"Fix the home page button\" or \"Add more tests for create_index method\"

    We don't follow any other convention, but if you want to use one, we recommend this one.

    "},{"location":"community/contribute/github/#pull-requests","title":"Pull Requests","text":"

    Some notes on PRs:

    • Convert your PR as a draft if your changes are a work in progress: no one will review it until you pass your PR as ready for review. The draft PR can be very useful if you want to show that you are working on something and make your work visible.
    • The branch related to the PR must be up-to-date with master before merging. Fortunately, this project integrates a bot to automatically enforce this requirement without the PR author having to do it manually.
    • All PRs must be reviewed and approved by at least one mastertainer.
    • The PR title should be accurate and descriptive of the changes. The title of the PR will be indeed automatically added to the next release changelogs.
    "},{"location":"community/contribute/github/#release-process-for-internal-team-only","title":"Release Process (for internal team only)","text":"

    PlanktoScope tools follow the Semantic Versioning Convention.

    "},{"location":"community/contribute/github/#automation-to-rebase-and-merge-the-prs","title":"Automation to Rebase and Merge the PRs","text":"

    This project integrates a bot that helps us manage pull requests merging. Read more about this.

    "},{"location":"community/contribute/github/#how-to-publish-the-release","title":"How to Publish the Release","text":"

    \u26a0\ufe0f Before doing anything, make sure you got through the guide about Releasing an Integration.

    \u26a0\ufe0f Every PR that is merged to master introducing changes to the PlanktoScope needs to modify the file ``, by increasing the version of the chart accordingly.

    Every PR that is merged to master triggers the automated release process, as specified at ``. A GitHub Action will be triggered and publish a new release on the GitHub repository releases. This will enable users to start using the new version of the chart immediately after publishing.

    Thank you again for reading this through, we can not wait to begin to work with you if you made your way through this contributing guide \u2764\ufe0f

    "},{"location":"community/contribute/hardware/","title":"Hardware Development","text":""},{"location":"community/contribute/hardware/#planktoscope-case","title":"PlanktoScope Case","text":"

    As a hardware engineer working on the PlanktoScope Case, you will be using Autodesk Fusion 360 for the development of the case design. Fusion 360 is a comprehensive computer-aided design (CAD) software that allows you to create and analyze complex 3D models, perform simulations and stress tests, and collaborate with team members in real-time.

    To get started with the project, you will need to install a development environment on your computer. Here are the steps to follow:

    • Download and install Fusion 360 from the Autodesk website.
    • Create a free Autodesk account and log in to Fusion 360.
    • Join the PlanktoScope Case team in Fusion 360. This will give you access to all of the project files and allow you to collaborate with other team members.
    • Familiarize yourself with the Fusion 360 interface and tools. There are many resources available online, including tutorials and user guides, to help you get up to speed.
    • Start designing and testing your case components in Fusion 360. You can use the software to create 3D models, run simulations and stress tests, and collaborate with other team members in real-time.

    By following these steps, you will be able to successfully install a development environment and participate in the PlanktoScope Case using Autodesk Fusion 360.

    "},{"location":"community/contribute/hardware/#planktoscope-hat","title":"PlanktoScope Hat","text":"

    As a hardware engineer working on the PlanktoScope Hat, you will be using Autodesk Eagle to design and develop the electronic components of the hat. Autodesk Eagle is a powerful and widely used software platform for designing and laying out printed circuit boards (PCBs).

    To participate in the project, you will need to install a development environment on your computer that includes Autodesk Eagle and any other necessary tools and libraries. Here are the steps you can follow to set up your development environment:

    • Download and install Autodesk Eagle from the official website. Make sure to select the appropriate version for your operating system (Windows, Mac, or Linux).
    • Follow the instructions provided by Autodesk to complete the installation process. This may involve entering a license key or activating the software through your Autodesk account.
    • Once Autodesk Eagle is installed, you may need to install additional libraries or tools depending on the specific requirements of the PlanktoScope Hat. These may include libraries for communicating with specific hardware components, or tools for debugging and testing your designs.
    • Once you have installed all the necessary tools and libraries, you should be ready to start working on the PlanktoScope Hat using Autodesk Eagle. You can begin by opening the project files and familiarizing yourself with the existing design, or by creating new designs as needed.

    By following these steps, you can set up a development environment that allows you to contribute to the PlanktoScope Hat using Autodesk Eagle.

    "},{"location":"community/contribute/software/","title":"How to help development for the PlanktoScope code","text":"

    We are using the Github Flow approach for our development efforts.

    If you want to join us, have a look at the currently opened issues and pick one where you feel like you can have an impact. Let us know you want to work it in the comments and get started.

    For working on Node-Red, we recommend to install it directly on your development machine to allow for faster cycles of testing (and ease of use). But feel free to setup a Pi Zero as a portable and compact development environment! (One of us is using one configured as usb gadget to do so!)

    "},{"location":"community/contribute/software/#node-red","title":"Node-Red","text":"

    Node-Red is our main process. We use the flow to manage our user interface through a dashboard instance.

    As a software engineer, you may need to set up a Node-RED development environment on a Debian operating system. Node-RED is an open-source programming tool for wiring together hardware devices, APIs, and online services in new and interesting ways. It provides a visual, drag-and-drop interface for building applications, and can be used to develop a wide range of IoT, automation, and data processing projects.

    To set up a Node-RED development environment on a Debian operating system, you will need to follow these steps:

    1. Install Node.js: Node-RED requires Node.js to be installed on your system. You can install Node.js using the package manager by running the following command: sudo apt-get install nodejs
    2. Install npm (Node Package Manager): npm is a package manager for Node.js that is used to install and manage Node-RED and its dependencies. You can install npm by running the following command: sudo apt-get install npm
    3. Install Node-RED: Once Node.js and npm are installed, you can install Node-RED by running the following command: sudo npm install -g --unsafe-perm node-red
    4. Start the Node-RED server: You can start the Node-RED server by running the following command: node-red
    5. Access the Node-RED editor: You can access the Node-RED editor by opening a web browser and going to the URL http://localhost:1880.

    By following these steps, you will be able to set up a Node-RED development environment on your Debian operating system and start building applications with the visual, drag-and-drop interface.

    "},{"location":"community/contribute/software/#python","title":"Python","text":"

    The python code is separated in four main processes, each with a specific set of responsibilities:

    • The main process controls all the others, starts everything up and cleans up on shutdown
    • The stepper process manages the stepper movements.
    • The imager process controls the camera and the streaming server via a state machine.
    • The segmenter process manages the segmentation and its outputs.

    Those processes all communicates together using MQTT and json messages. Each message is adressed to one topic. The high level topic controls which process receives the message. The details of each topic is at the end of this commit message. You can learn more about the MQTT Messages here.

    The code is architectured around 6 modules and about 10 classes. I encourage you to have a look at the files, they're pretty straightforward to understand.

    "},{"location":"operation/","title":"Operation","text":"

    This page provides basic instructions for operating your PlanktoScope.

    "},{"location":"operation/#connect-directly-to-your-planktoscope","title":"Connect directly to your PlanktoScope","text":"

    In order to operate your PlanktoScope, you will need to connect to your PlanktoScope from a separate device (a computer, tablet, or phone) with a web browser. If this is your first time setting up or connecting to your PlanktoScope, you will need to set up a direct network connection between your computer and your PlanktoScope.

    "},{"location":"operation/#connect-with-an-ethernet-cable","title":"Connect with an Ethernet cable","text":"

    You can connect your computer to the PlanktoScope by plugging an Ethernet cable between your computer and your PlanktoScope's Raspberry Pi.

    "},{"location":"operation/#connect-with-the-planktoscopes-isolated-wi-fi-network","title":"Connect with the PlanktoScope's isolated Wi-Fi network","text":"

    Unless you have already configured your PlanktoScope to connect to an existing Wi-Fi network, your PlanktoScope will create its own isolated Wi-Fi network (like a Wi-Fi hotspot, but without internet access). The Wi-Fi network created by your PlanktoScope should appear on your computer's list of available Wi-Fi networks a few minutes after you turn on power to your PlanktoScope.

    As you can see, the name of your PlanktoScope's Wi-Fi network will be of the format pkscope-{random word}-{random word}-{random number}. This name corresponds exactly to the serial number of the Raspberry Pi computer in your PlanktoScope, so it is a unique Wi-Fi network name; and the unique name of your machine has format {random-word}-{random-word}-{random number}, which is just the name of the Wi-Fi network but without the pkscope- prefix (e.g. chain-list-27764). You should connect to the Wi-Fi network specific to your PlanktoScope.

    Unless you have changed the password of your PlanktoScope's Wi-Fi network, the password should be copepode.

    "},{"location":"operation/#access-your-planktoscopes-software","title":"Access your PlanktoScope's software","text":"

    Once you connect your computer to your PlanktoScope, you will need to access your PlanktoScope's software from a web browser on your computer. You should try opening the following URLs in your web browser (try opening them in the following order, and just use the first one which works):

    • http://planktoscope.local\u00a0(this should work unless you're on a device and web browser without mDNS support; notably, older versions of Android do not have mDNS support)
    • http://pkscope.local\u00a0(this should work unless you're on a device and web browser without mDNS support; notably, older versions of Android do not have mDNS support)
    • http://home.pkscope\u00a0(this should work unless your web browser is configured to use a Private DNS provider)
    • http://192.168.4.1\u00a0(this should always work)
    • http://192.168.5.1\u00a0(this should always work)

    Tip

    If you know the machine name of your PlanktoScope (which has format {random-word}-{random-word}-{random number}, e.g. chain-list-27764, you can also try the following URLs after replacing {machine-name} with the actual machine name of your PlanktoScope:

    http://pkscope-{machine-name}.local\u00a0(this should work unless you're on a device and web browser without mDNS support; notably, older versions of Android do not have mDNS support)

    http://{machine-name}.pkscope\u00a0(this should work unless your web browser is configured to use a Private DNS provider)

    You will need to use a URL with your PlanktoScope's machine name if your computer has network connections to multiple PlanktoScopes, e.g. via multiple Ethernet cables. In such a situation, using http://home.pkscope or http://pkscope.local may cause you to access the software for a different PlanktoScope connected to your computer than the one you had intended to access.

    Warning

    You may encounter older documents which ask you to connect to http://planktoscope.local:1880/ui, which is the URL to use for software version 2.3 and even older versions. That link does not work on software versions newer than v2.3; instead, you should use the links listed above.

    One of the above URLs should work, and your web browser should show a landing page with a list of links:

    You should click on the \"Node-RED dashboard\" link; this will open a new tab with the primary interface for operating your PlanktoScope. Once you have opened the Node-RED dashboard, you should proceed to our User interface guide to understand how to use it.

    "},{"location":"operation/#how-to-image-plankton","title":"How to image plankton","text":"

    Before doing an acquisition, you will need to collect targets. There are several ways to do this, and you probably already have a source nearby (in a culture if you are working in a lab).

    However, if you have access to a body of water (even a tiny lake or river is enough), you can build yourself a plankton net to collect a sample. Once the sample is collected, either pump it with a syringe that you connect to the machine, or dip one of the silicone tube inside the sample tube you have.

    You can then do an acquisition run. This is the best way to learn about the machine and this process!

    Warning

    After doing an acquisition, the machine should be cleaned, especially in the fluidic part. One good way to do this is to first flush the machine with clear water (distilled if possible). You can then push through a 5-10% bleach solution, or some alcohol.

    If needed you can also clean the outside of the objective lens with a soft cloth. You can do the same on the flow cell if there are traces of finger on it too.

    For quantitative imaging of water samples, refer to the following protocols published by members of the PlanktoScope community:

    • \"Planktoscope protocol for plankton imaging V.2\" for software v2.3+ and hardware v2.5. A PDF copy of this protocol is also available for offline use.
    • \"Planktoscope protocol for plankton imaging V.1\" for software v2.3 and hardware v2.1-2.3. A PDF copy of this protocol is also available for offline use.
    "},{"location":"operation/clone-sd/","title":"Clone your SD card","text":"

    If you want to create an SD card image from your PlanktoScope to use on other PlanktoScopes, you can follow the following steps.

    "},{"location":"operation/clone-sd/#prepare-the-sd-card-for-cloning","title":"Prepare the SD card for cloning","text":"

    Depending on whether you want to make an SD card image to reuse across multiple machines or whether you only want to make an exact backup of your SD card image, you will need to perform different steps to prepare your SD card for cloning.

    "},{"location":"operation/clone-sd/#clone-your-sd-card","title":"Clone your SD card","text":""},{"location":"operation/clone-sd/#prepare-for-cloning-to-reuse-in-other-machines","title":"Prepare for cloning to reuse in other machines","text":"

    Normally, your SD card contains some information (a machine-specific ID, system secrets, and SSH secrets) which should never be replicated across multiple PlanktoScopes, and some information (apt package cache) which you would probably consider a waste of space which unnecessarily increases the size of the SD card image you want to make. We provide a preparation script at /usr/libexec/prepare-custom-image to remove this information; it also allows an SD card image created from your SD card to automatically resize itself to match the size of any SD card it's flashed to in the future. After you make any changes you want to make on your PlanktoScope for your SD card image, you should run the preparation script on the PlanktoScope with the command:

    sudo /usr/libexec/prepare-custom-image\n

    Once this script finishes running, it will shut down your PlanktoScope's Raspberry Pi.

    Next, you should remove the SD card from your PlanktoScope and plug it into another computer, so that you can clone the SD card into an SD card image; this guide assumes that your other computer runs Linux. With your SD card plugged into your other computer, you can mount the SD card's rootfs partition to delete any other sensitive files which were not removed by the /usr/libexec/prepare-custom-image script. For example, you may also want to delete or edit some or all of the following files from the rootfs partition in order to remove any sensitive or machine-specific information:

    • etc/wpa_supplicant/wpa_supplicant.conf: Wi-Fi configuration and network secrets.
    • home/pi/.ssh/authorized_keys: SSH public keys of devices authorized to remotely connect to the PlanktoScope.
    • home/pi/data/: all images acquired before by the PlanktoScope - this directory may be large, and you probably don't want to copy those datasets across all your other PlanktoScopes.
    • home/pi/.bash_history: Bash command history.
    • home/pi/.python_history: Python command history.
    • home/pi/.gitconfig: Git configuration, which may contain user-specific details.

    Info

    You can also delete the files listed above before running the /usr/libexec/prepare-custom-image script; the effect is the same. Either way, those files will be permanently deleted on your SD card. However, if you want to keep those files on your SD card, you should make backup copies of those files, and then you can copy those files back onto your SD card after you finish cloning the SD card to an image.

    Next, proceed to the Make an SD card image section of this guide.

    "},{"location":"operation/clone-sd/#prepare-an-exact-backup","title":"Prepare an exact backup","text":"

    If you want to make an exact backup of your SD card and you don't want to reuse your SD card image across multiple PlanktoScopes, then you shouldn't run the /usr/libexec/prepare-custom-image script: that script will delete some files which you probably want to keep. Instead, you should edit the /boot/cmdline.txt file to add the string init=/usr/lib/raspberrypi-sys-mods/firstboot to the end of the file, for example resulting in a file which looks something like:

    console=tty1 root=PARTUUID=someuniqueidhere rootfstype=ext4 fsck.repair=yes rootwait init=/usr/lib/raspberrypi-sys-mods/firstboot\n

    Next, you should remove the SD card from your PlanktoScope and plug it into another computer, so that you can clone the SD card into an SD card image; this guide assumes that your other computer runs Linux. Then proceed to the Make an SD card image section of this guide.

    Warning

    After you have finished cloning the SD card to an SD card image, you should edit the /boot/cmdline.txt file to remove the init=/usr/lib/raspberrypi-sys-mods/firstboot string, before booting up the Raspberry Pi with your SD card again. This will prevent the first-boot script from deleting the SSH server keys already on your SD card.

    "},{"location":"operation/clone-sd/#make-an-sd-card-image","title":"Make an SD card image","text":""},{"location":"operation/clone-sd/#locate-the-sd-card","title":"Locate the SD card","text":"

    Now that your SD card is plugged into a Linux computer, you will need to determine the path of the device file corresponding to your SD card. Usually it will look something like /dev/mmcblk0, /dev/sda, or /dev/sdb; it should always be some file in /dev. To identify the device file for your SD card, run the command sudo fdisk -l in your terminal. The output may look something like:

    Disk /dev/nvme0n1: 1.82 TiB, 2000398934016 bytes, 3907029168 sectors\nDisk model: WD_BLACK SN770 2TB\nUnits: sectors of 1 * 512 = 512 bytes\nSector size (logical/physical): 512 bytes / 512 bytes\nI/O size (minimum/optimal): 512 bytes / 512 bytes\nDisklabel type: gpt\nDisk identifier: D18C4567-ADF2-4987-987F-CDA411988C8E\n\nDevice           Start        End    Sectors  Size Type\n/dev/nvme0n1p1    2048    1230847    1228800  600M EFI System\n/dev/nvme0n1p2 1230848    3327999    2097152    1G Linux filesystem\n/dev/nvme0n1p3 3328000 3907028991 3903700992  1.8T Linux filesystem\n\nDisk /dev/mmcblk0: 58.29 GiB, 62587404288 bytes, 122241024 sectors\nUnits: sectors of 1 * 512 = 512 bytes\nSector size (logical/physical): 512 bytes / 512 bytes\nI/O size (minimum/optimal): 512 bytes / 512 bytes\nDisklabel type: dos\nDisk identifier: 0xa2033091\n

    To determine which disk device corresponds to your SD card, you should check the size of each device to find the one which approximately matches the size of your SD card. In the above example, the 64 GB SD card is at /dev/mmcblk0.

    Next, you should unmount the SD card from your system (or ensure that the device is already not mounted on your system). If you're unsure whether the SD card is mounted, you should use the umount command. For example, if your device is /dev/mmcblk0, you will need to run:

    sudo umount /dev/mmcblk0p1\nsudo umount /dev/mmcblk0p2\n

    If the devices were already not mounted, you should expect to see (and you can safely ignore) error messages which look like:

    umount: /dev/mmcblk0p1: not mounted.\numount: /dev/mmcblk0p2: not mounted.\n
    "},{"location":"operation/clone-sd/#clone-the-sd-card-to-an-image","title":"Clone the SD card to an image","text":"

    To clone the Raspberry Pi's SD card to an image file which you can write to other SD cards, you should follow the instructions at https://github.com/mgomesborges/raspberry-pi/blob/master/setup/clone-sd-card.md or https://raspberrytips.com/create-image-sd-card/ . For example, if you are using a Linux computer and the SD card shows up as /dev/mmcblk0, you could run the following command (replacing file paths and names accordingly):

    sudo dd bs=4M if=/dev/mmcblk0 of=/some/path/here/image-name-here.img status=progress\n

    This will create a .img file (at /some/path/here/image-name-here.img) as large as your SD card - make sure you have enough space on your hard drive for the file! If your SD card is large, this process may take a long time; this greatly depends on the speed of your SD card reader. For example, a slow SD card reader may take 30 minutes in order to clone a 32 GB SD card.

    "},{"location":"operation/clone-sd/#shrink-the-sd-card-image","title":"Shrink the SD card image","text":"

    In order to make the SD card practical to share, you should shrink and compress the SD card image file using the PiShrink tool. For example, on Linux you could run the following set of commands (again replacing file paths and names accordingly):

    cd /some/path/here\nwget https://raw.githubusercontent.com/Drewsif/PiShrink/master/pishrink.sh\nchmod +x pishrink.sh\nsudo ./pishrink.sh -za image-name-here.img\n

    If you had set up the PlanktoScope software on a Raspberry Pi OS Lite image, you should get a image-name-here.img.gz file which is at least 2 GB in size.

    "},{"location":"operation/clone-sd/#use-the-sd-card-image","title":"Use the SD card image","text":"

    You can now use this SD card image with the non-standard installation guide for installing the PlanktoScope OS on an SD card for one or more PlanktoScopes.

    "},{"location":"operation/maintenance/","title":"Maintenance and Repair","text":"

    Instructions for maintaining and repairing the PlanktoScope.

    "},{"location":"operation/maintenance/#cleaning-the-optics","title":"Cleaning the optics","text":"
    • Begin by turning off the microscope and unplugging it from any power source. Gently remove any dust or debris using a soft, dry cloth.
    • To clean the lenses and other optics, use a lens cleaning solution and a lens cleaning tissue or cloth. Gently wipe the optics in a circular motion, starting from the center and working outward. Avoid applying too much pressure or using a rough cloth, as this can scratch or damage the optics.
    • Once you have finished cleaning the optics, use a dry cloth to remove any excess moisture or cleaning solution.
    "},{"location":"operation/maintenance/#software-updates","title":"Software updates","text":"

    The PlanktoScope project aims to keep improving the PlanktoScope software by fixing problems and making the software simpler and easier to use, releasing a new version of the software a few times each year. At the same time, we aim to keep the software compatible with all previous officially-released versions of the PlanktoScope hardware. For this reason, we strongly recommend everyone to keep their PlanktoScopes updated to run the latest stable release of the PlanktoScope software, and the PlanktoScope documentation will only support the latest stable release. You can always find the latest stable release at https://github.com/PlanktoScope/PlanktoScope/releases/latest, which will redirect you to a web page for the latest stable release.

    Currently, you will need to re-flash the SD card of your PlanktoScope's embedded Raspberry Pi in order to update the PlanktoScope software to the latest version, and then you will need to reapply any custom software configurations you had set (e.g. hardware settings). We are also developing an easier and less disruptive way to update the PlanktoScope software, but it is not yet ready for use.

    "},{"location":"operation/sample-collection/","title":"Sample collection","text":"

    The most common way to collect samples for the PlanktoScope is to use a plankton net.

    "},{"location":"operation/sample-collection/#plankton-net","title":"Plankton Net","text":"

    A plankton net is a scientific tool used to collect plankton samples from aquatic environments. Plankton are small, drifting organisms that play a vital role in marine ecosystems. They include a diverse range of species, including bacteria, algae, protozoa, and small animals such as crustaceans and mollusks. Plankton nets are designed to capture these tiny organisms as they drift through the water column.

    Plankton nets typically consist of a fine mesh net attached to a long, narrow handle. The net is usually cone- or cylinder-shaped, with a small opening at the base and a wider opening at the top. The net is lowered into the water and dragged through the water column, collecting plankton as it goes. The collected plankton is then collected in a sample bottle or container for further study.

    Plankton nets can be used in a variety of aquatic environments, including oceans, lakes, and rivers. They are commonly used in scientific research to study the diversity and abundance of plankton in different ecosystems, as well as their role in the food web and the broader ecosystem. Plankton nets are also used in environmental monitoring programs to track changes in plankton populations over time.

    The simplest device you can use is a plankton net. It should be made of a fine mesh, down to 20 micron. It can be towed behind a boat at low speed (less than 2 knots) or towed by hand in a river or a lake.

    Plankton nets can be made easily with a good sewind machine and some hardware.

    "},{"location":"operation/user-interface/","title":"User interface guide","text":"

    This guide will help you understand how to use the Node-RED dashboard, which is the primary user interface for operating the PlanktoScope.

    "},{"location":"operation/user-interface/#home","title":"Home","text":"

    When you open the \"Node-RED dashboard link\" from the PlanktoScope's landing page, you will reach a page like what is shown in the screenshot above.

    From here, you can quickly access any of the available tabs. The buttons are only the most used functionnalities of the machine. Three others tabs are accessible only through the hamburger menu on the top left of the screen (the three horizontal lines):

    • Wifi
    • Administration
    • Hardware Config

    Tip

    This list is also available from any other tab and allows you to quickly navigate between tabs.

    "},{"location":"operation/user-interface/#machine-shutdown","title":"Machine shutdown","text":"

    From this page, you can also shutdown the machine when you are done.

    Warning

    It's very very very important to always shutdown the machine and wait a minute for it to completely shutdown before unplugging the power supply! You risk data corruption if you turn off power without shutting down the machine through the software!

    To shutdown the machine, first unlock the shutdown button by clicking on \"Unlock Button\".

    You can then click on \"Shutdown\". The machine will ask for a final confirmation and will then shut itself down.

    "},{"location":"operation/user-interface/#sample-tab","title":"Sample Tab","text":"

    In this page, you can enter all the information regarding the current sample you want to image. This includes the project name, the operator, but also the type of collection device you used.

    Depending on the device you choose, the page will change to reflect the needed information.

    There is a mechanism of validation of the submitted data. Please be careful to use the format given in example for each input field.

    The GPS status block will give you the current information on the GPS fix and location, your direction and speed. This can be used to grab the location when in the field.

    Once all the fields are completed, you can go to the next tab by clicking the -> arrow. This will make sure all the inserted data is valid.

    "},{"location":"operation/user-interface/#optic-configuration","title":"Optic Configuration","text":"

    This page allows you to control the optical setup of the acquisition.

    In the Optic Characterization block, you can control to turn the light on or not. You also have to choose the optics in use in the machine.

    Warning

    For now, the characteristics shown here are not true values (except if you use the 25mm/16mm lens couple).

    The Camera Settings block allows you to change the shutter speed, the ISO number and the camera white balance settings. You can set it to automatic, but it's better if you control it by hand to make sure the setting doesn't change when the acquisition is started.

    The Fluidic Manual Manipulation allows you to control the pump. You can change both the flowrate and the volume pumped. If you click on the rotating arrow, it will start the pump for the given volume at the chosen flowrate.

    The Focus Adjustment block allows you to control the focus stage. With the leftmost buttons, you can choose to move the stage quickly by one mm, either up or down. The rightmost buttons move the stage by the specified distance in the slider under.

    As with all the tabs, once you are satisfied with your focus and your image settings, you can click on \"Continue\".

    "},{"location":"operation/user-interface/#fluidic-acquisition","title":"Fluidic Acquisition","text":"

    Finally, this is where the magic happens! You will be able to chose the final parameters of your capture.

    First of all, change the Fraction Size of your sample. You can then choose a unique ID for your acquisition, the number of pictures you want to take, the pumped volume (in between images), the delay to stabilize the image and the Flowcell thickness. All those settings will influence the Total imaged volume (the total volume captured during the acquisition) and the Total pumped volume.

    Warning

    Make sure the Total pumped volume is lower than the volume of your sample.

    "},{"location":"operation/user-interface/#gallery","title":"Gallery","text":"

    This simple page will allow you to preview and download the captured data.

    "},{"location":"operation/user-interface/#system-monitoring","title":"System Monitoring","text":"

    This tab allows you to monitor the physical characteristics of the machine and follow the processor load, CPU temperature, memory use and disk usage.

    You also can find information about the software version you are using, the machine name and its camera.

    "},{"location":"operation/user-interface/#wifi","title":"Wifi","text":"

    This page will give you information about the network the PlanktoScope is connected to. It will also allows you to connect your machine to a new WiFi network.

    Start by doing a network scan by clicking on the Scan button. The list will be populated with detected networks after a few seconds. You can then choose one of them, enter its password and click on Add the network to connect to it. The wifi network of the PlanktoScope will disappear after a few seconds, so you will need to connect back to the same network you just put the machine on.

    Finally, if you are not located in the US, please update the Country code in the field below. This will ensure the PlanktoScope complies with local Wifi regulations (such as maximum emitted power, duty cycle and such).

    Clicking on the button Reset wifi networks will erase ALL networks saved previously by the machine. If you do this, it will disconnect immediately from any network it's connected to, and will put up its own network.

    Info

    For now, only WPA/WPA2 Personal security is supported; Wi-Fi networks without passwords are not supported.

    Warning

    Please be mindful about the security policies of your organisation before connecting your device to a network (either through Wifi or with an Ethernet cable). A lot of research institutions don't allow devices not controlled by them to be connected to their network without first going on an approved list with a least a basic security checkup.

    "},{"location":"operation/user-interface/#administration","title":"Administration","text":"

    On this page you can find links to view the logs generated by the Python backend, and buttons to restart the Python backend's hardware controller or segmenter, as well as buttons to restart or shut down your PlanktoScope's Raspberry Pi computer.

    "},{"location":"operation/user-interface/#hardware-settings","title":"Hardware Settings","text":"

    You should not touch anything here unless you have received specific instructions to do so, e.g. as part of our post-installation configuration guide, or as part of a guide for calibrating your PlanktoScope.

    "},{"location":"reference/","title":"Technical Reference","text":"

    The PlanktoScope is a modular, open-source platform for high-throughput quantitative imaging of plankton samples. Its small size, ease of use, and low cost make it suitable for a variety of applications, including the monitoring of laboratory cultures or natural micro-plankton communities. It can be controlled from any WiFi-enabled device and can be easily reconfigured to meet the changing needs of the user.

    "},{"location":"reference/#key-features","title":"Key Features","text":"

    Here are some key features of the PlanktoScope:

    1. Low cost: The PlanktoScope is designed to be affordable, with parts costing under $1000.
    2. Modular: The PlanktoScope is modular, meaning it can be easily reconfigured to meet the changing needs of users.
    3. Open-source: The PlanktoScope is based on open-source hardware and software, making it accessible to a wide community of engineers, researchers, and citizens.
    4. Versatility: The PlanktoScope is versatile, and can be used to study a variety of plankton types, including laboratory cultures and natural micro-plankton communities.
    5. High-throughput: The PlanktoScope is capable of high-throughput quantitative imaging, allowing users to analyze large numbers of samples quickly and efficiently.
    6. WiFi-enabled: The PlanktoScope can be controlled from any WiFi-enabled device, making it easy to use and deploy in a variety of settings.
    7. Portable: The PlanktoScope is small and portable, making it easy to transport and use in the field.
    8. Ease of use: The PlanktoScope is designed to be easy to use, with instructions for assembly and use available on the PlanktoScope website.
    "},{"location":"reference/hardware/changelog/","title":"Changelog","text":"

    The design of the PlanktoScope's hardware has been evolving to fix usability issues and improve the quality of images captured by the PlanktoScope. Thus, multiple versions of the hardware have been developed:

    "},{"location":"reference/hardware/changelog/#v26","title":"v2.6","text":"

    This is the latest version of the PlanktoScope hardware, and it is the version currently sold by FairScope. It replaced the optical components so that the PlanktoScope produces higher-quality images.

    "},{"location":"reference/hardware/changelog/#v25","title":"v2.5","text":"

    This was the first version of the PlanktoScope hardware made commercially available by FairScope, a small business started by the inventor of the PlanktoScope in order to make it easier for people to obtain PlanktoScopes. It is a minor variation of the v2.4 hardware design and includes all of the changes made in previous hardware versions - including a custom-designed PCB HAT, a glass capillary flowcell. The mechanical structure of this design uses CNC-milled parts rather than laser-cut parts.

    "},{"location":"reference/hardware/changelog/#v24","title":"v2.4","text":"

    This was a prototype which replaced the ibidi u-Slide flowcell with a simpler flowcell design based on rectangular glass capillaries, in order to fix various issues with the ibidi flowcells and to make it possible for people to make their own flowcells.

    This version was only an internal prototype for the PlanktoScope development team.

    "},{"location":"reference/hardware/changelog/#v23","title":"v2.3","text":"

    This was a prototype version of the hardware which replaced the Adafruit Stepper Motor HAT and the Yahboom RGB Cooling HAT with a custom-designed PCB HAT, in order to simplify overall assembly and provide additional features which solved problems with the v2.1 hardware design. As a result, a different configuration of the PlanktoScope software is required to control this version of the PlanktoScope hardware, as well as subsequent hardware versions. This version also significantly changed the physical dimensions of the PlanktoScope's mechanical structure, in order to solve some problems with the v2.1 design.

    This version was only an internal prototype for the PlanktoScope development team.

    "},{"location":"reference/hardware/changelog/#v22","title":"v2.2","text":"

    This was a prototype version of the hardware which replaced the Adafruit Stepper Motor HAT with a Waveshare Stepper Motor HAT.

    This version was only an internal prototype for the PlanktoScope development team.

    "},{"location":"reference/hardware/changelog/#v21","title":"v2.1","text":"

    This is the first version of the PlanktoScope hardware which was publicly released, and it is one of the two hardware designs described in the initial paper introducing the PlanktoScope. It simplified the hardware's robustness and mechanical assembly by integrating most subsystems into a monolithic architecture whose structure uses laser-cut parts. The electronic hardware components of this design are all available off-the-shelf, using an Adafruit Stepper Motor HAT to control various actuators and a Yahboom RGB Cooling HAT to cool the PlanktoScope's embedded Raspberry Pi computer. The mechanical structure was designed for fabrication using a laser cutter. This hardware version included some design flaws, such as providing no way to replace the Raspberry Pi's micro-SD card without partially disassembling the PlanktoScope.

    "},{"location":"reference/hardware/changelog/#v10","title":"v1.0","text":"

    This was the first prototype of the PlanktoScope, and it is one of the two hardware designs described in the initial paper introducing the PlanktoScope. Its mechanical structure featured a fully modular, stackable architecture consisting of triangular layers which coupled together with magnets.

    This design was complicated to assemble, and it suffered from unreliable electronic communication between the modules, so it was never publicly released.

    "},{"location":"reference/hardware/hat/","title":"PlanktoScope Hat Hardware","text":""},{"location":"reference/hardware/hat/#buses-and-gpio-pinout","title":"Buses and GPIO pinout","text":""},{"location":"reference/hardware/hat/#i2c1-bus","title":"I2C1 Bus","text":""},{"location":"reference/hardware/hat/#rtc-rv-3028-c7","title":"RTC RV-3028-C7","text":"

    Address 0x52 Configured through a kernel driver.

    "},{"location":"reference/hardware/hat/#oled-display","title":"OLED Display","text":"

    Address 0x3c

    "},{"location":"reference/hardware/hat/#led-control-lm36011","title":"LED control: LM36011","text":"

    Address 0x64 Control through specific software, current range from 0 to 376mA in normal mode, up to 1.5A in flash mode.

    "},{"location":"reference/hardware/hat/#spi0-bus","title":"SPI0 Bus","text":""},{"location":"reference/hardware/hat/#motor-controller-0-tmc5160","title":"Motor Controller 0: TMC5160","text":"

    Chip Enable: SPI0_CE0 Motor Enable: GPIO23

    Diagnostic output: GPIO16 for Error output GPIO20 for Stall output

    "},{"location":"reference/hardware/hat/#motor-controller-1-tmc5160","title":"Motor Controller 1: TMC5160","text":"

    Chip Enable: SPI0_CE1 Motor Enable: GPIO5

    Diagnostic output: GPIO16 for Error output GPIO20 for Stall output

    "},{"location":"reference/hardware/hat/#gpio","title":"GPIO","text":""},{"location":"reference/hardware/hat/#fan-control","title":"Fan control","text":"

    PWM1 control through GPIO13

    "},{"location":"reference/hardware/hat/#led-output-selection","title":"LED Output selection","text":"

    GPIO18: high for LED1, low for LED2

    "},{"location":"reference/hardware/hat/#led-strobe","title":"LED Strobe","text":"

    GPIO22 for pulse

    "},{"location":"reference/hardware/hat/#i2c0-bus","title":"I2C0 Bus","text":""},{"location":"reference/hardware/hat/#eeprom-m24c32","title":"EEPROM M24C32","text":"

    Address 0x50 For HAT information only.

    "},{"location":"reference/hardware/product-specs/","title":"Product Specifications","text":"

    Product specifications for the PlanktoScope hardware are listed below for each hardwaare version. For more information on each hardware version, refer to the hardware changelog.

    "},{"location":"reference/hardware/product-specs/#v26","title":"v2.6","text":"

    Overview:

    • Weight: 3.5 kg
    • Enclosure:

      • Dimensions: 27.5 cm (length) x 12.5 cm (width) x 10.5 cm (height)
      • Material: bamboo plywood
      • Fabrication process: CNC milling
    "},{"location":"reference/hardware/product-specs/#functionalities","title":"Functionalities","text":"
    • Automated image acquisition, with a motorized pump and an embedded computer
    • Precise focus adjustment, with motorized linear actuators
    • Continuous mixing of input sample to prevent sedimentation of heavier particles, with a USB-powered bubbler
    • On-board image processing, with the embedded computer
    • Local Wi-Fi network hotspot for local operation from a connected phone, tablet or laptop, with the embedded computer
    • Internet connectivity via Wi-Fi or Ethernet for remote operation, with the embedded computer
    "},{"location":"reference/hardware/product-specs/#subsystems","title":"Subsystems","text":"

    Optics:

    • Imaging characteristics:

      • Optical magnification: 1.33
      • Field of view: 3062 \u00b5m x 2295 \u00b5m
      • Optical pixel size: 0.75 \u00b5m
      • Depth of field: 95 \u00b5m
    • Internal camera: Raspberry Pi High Quality Camera

      • Sensor: Sony IMX477R
      • Resolution: 12.3 Megapixels (4056 x 3040 pixels)
    • Lenses:

      • Objective lens: 12 mm focal length, M12
      • Tube lens: 25 mm focal length, M12
      • Lens mount: M12x0.5
    • Illumination: white LED

    Fluidics:

    • Flow cell: capillary with rectangular cross-section

      • Thickness: 300 \u00b5m
      • Material: glass
    • Internal tubing:

      • Material: Tygon S3 (contains no BPA or phthalates)
      • Dimensions: 1.6 mm (1/16\") inner diameter, 3.2 mm (1/8\") outer diameter
      • Connectors: Luer lock
    • Peristaltic pump

    • Sample intake capacity: 20 mL

    Other internal electronics:

    • Embedded computer: Raspberry Pi 4 Model B

      • Processor: Broadcom BCM2711, Quad core Cortex-A72 (ARM v8) 64-bit SoC @ 1.8 GHz
      • Memory: 4 GB RAM
      • Storage: 128 GB capacity (micro-SD card, UHS speed class 3)
    • Control board: PlanktoScope HAT v1.2

    External interfaces & connectivity:

    • Expansion: 2 USB 3.0 ports, 2 USB 2.0 ports
    • Wired networking: Gigabit Ethernet
    • Wireless networking: 2.4 GHz and 5.0 GHz 802.11ac Wi-Fi
    • Power input: 12 V DC, up to 4 A of current draw (5.1 x 2.2 mm DC barrel jack, center positive)
    • Latching push-button switch to toggle power

    External AC-to-DC power adapter:

    • Input: 100-240 V AC, 50-60 Hz (IEC 60320 C8 socket)
    • Output: 12 V DC, up to 4 A of current output (5.1 x 2.2 mm DC barrel jack, center positive)
    • Dimensions: 126 mm (length) x 52 mm (width) x 35.5 mm (height)
    • Weight: 0.25 kg
    "},{"location":"reference/hardware/product-specs/#system-performance","title":"System performance","text":"

    Image acquisition throughput:

    • Volume of sample measured: 2.1 \u00b5L per acquired image
    • Volume of sample pumped: ~15 \u00b5L per acquired image
    • Maximum image acquisition rate: ~60 images/min

    Samples:

    • Object size range:

      • Minimum for taxonomy: ~20 \u00b5m diameter for round objects
      • Maximum: ~200 \u00b5m diameter for round objects (larger objects will clog the flow cell)
    "},{"location":"reference/hardware/product-specs/#v25","title":"v2.5","text":"

    Overview:

    • Enclosure:

      • Dimensions: 27.5 cm (length) x 12.5 cm (width) x 10.5 cm (height)
      • Material: bamboo plywood
      • Fabrication process: CNC milling
    "},{"location":"reference/hardware/product-specs/#functionalities_1","title":"Functionalities","text":"
    • Automated image acquisition, with a motorized pump and an embedded computer
    • Precise focus adjustment, with motorized linear actuators
    • Continuous mixing of input sample to prevent sedimentation of heavier particles, with a USB-powered bubbler
    • On-board image processing, with the embedded computer
    • Local Wi-Fi network hotspot for local operation from a connected phone, tablet or laptop, with the embedded computer
    • Internet connectivity via Wi-Fi or Ethernet for remote operation, with the embedded computer
    "},{"location":"reference/hardware/product-specs/#subsystems_1","title":"Subsystems","text":"

    Optics:

    • Imaging characteristics:

      • Field of view: 3670 \u00b5m x 2675 \u00b5m
      • Optical pixel size: 0.88 \u00b5m
    • Internal camera: Raspberry Pi High Quality Camera

      • Sensor: Sony IMX477R
      • Resolution: 12.3 Megapixels (4056 x 3040 pixels)
    • Lenses:

      • Objective lens: 16 mm focal length, M12
      • Tube lens: 25 mm focal length, M12
      • Lens mount: M12x0.5
    • Illumination: white LED

    Fluidics:

    • Flow cell: capillary with rectangular cross-section

      • Thickness: 300 \u00b5m
      • Material: glass
    • Internal tubing:

      • Material: Tygon S3 (contains no BPA or phthalates)
      • Dimensions: 1.6 mm (1/16\") inner diameter, 3.2 mm (1/8\") outer diameter
      • Connectors: Luer lock
    • Peristaltic pump

    • Sample intake capacity: 20 mL

    Other internal electronics:

    • Embedded computer: Raspberry Pi 4 Model B

      • Processor: Broadcom BCM2711, Quad core Cortex-A72 (ARM v8) 64-bit SoC @ 1.8 GHz
      • Memory: 4 GB RAM
      • Storage: 128 GB capacity (micro-SD card, UHS speed class 3)
    • Control board: PlanktoScope HAT v1.2

    External interfaces & connectivity:

    • Expansion: 2 USB 3.0 ports, 2 USB 2.0 ports
    • Wired networking: Gigabit Ethernet
    • Wireless networking: 2.4 GHz and 5.0 GHz 802.11ac Wi-Fi
    • Power input: 12 V DC, up to 4 A of current draw (5.1 x 2.2 mm DC barrel jack, center positive)
    • Latching push-button switch to toggle power

    External AC-to-DC power adapter:

    • Input: 100-240 V AC, 50-60 Hz (IEC 60320 C8 socket)
    • Output: 12 V DC, up to 4 A of current output (5.1 x 2.2 mm DC barrel jack, center positive)
    • Dimensions: 126 mm (length) x 52 mm (width) x 35.5 mm (height)
    • Weight: 0.25 kg
    "},{"location":"reference/hardware/product-specs/#system-performance_1","title":"System performance","text":"

    Image acquisition throughput:

    • Volume of sample pumped: ~15 \u00b5L per acquired image
    • Maximum image acquisition rate: ~60 images/min

    Samples:

    • Object size range:

      • Maximum: ~200 \u00b5m diameter for round objects (larger objects will clog the flow cell)
    "},{"location":"reference/hardware/product-specs/#v21","title":"v2.1","text":"

    Overview:

    • Enclosure:

      • Dimensions: ~32 cm (length) x ~5.5 cm (width) x ~15 cm (height)
      • Material: acrylic, plywood, or fiberboard
      • Fabrication process: laser cutting
    "},{"location":"reference/hardware/product-specs/#functionalities_2","title":"Functionalities","text":"
    • Automated image acquisition, with a motorized pump and an embedded computer
    • Precise focus adjustment, with motorized linear actuators
    • On-board image processing, with the embedded computer
    • Local Wi-Fi network hotspot for local operation from a connected phone, tablet or laptop, with the embedded computer
    • Internet connectivity via Wi-Fi or Ethernet for remote operation, with the embedded computer
    "},{"location":"reference/hardware/product-specs/#subsystems_2","title":"Subsystems","text":"

    Optics:

    • Imaging characteristics:

      • Field of view: 2300 \u00b5m x 1730 \u00b5m
      • Optical pixel size: 0.75 \u00b5m
    • Internal camera: Raspberry Pi Camera Module 2

      • Sensor: Sony IMX219
      • Resolution: 8 Megapixels (3280 x 2464 pixels)
    • Lenses:

      • Objective lens: 12 mm focal length, M12
      • Tube lens: 25 mm focal length, M12
      • Lens mount: M12x0.5
    • Illumination: white LED

    Fluidics:

    • Flow cell: ibidi \u00b5-Slide I Luer channel slide

      • Thickness: 200 \u00b5m, 400 \u00b5m, 600 \u00b5m, or 800 \u00b5m
      • Material: Plastic (no surface modification)
    • Internal tubing:

      • Material: Tygon S3 (contains no BPA or phthalates)
      • Dimensions: 1.6 mm (1/16\") inner diameter, 3.2 mm (1/8\") outer diameter
      • Connectors: Luer lock
    • Peristaltic pump

    • Sample intake capacity: 20 mL

    Other internal electronics:

    • Embedded computer: Raspberry Pi 4 Model B

      • Processor: Broadcom BCM2711, Quad core Cortex-A72 (ARM v8) 64-bit SoC @ 1.8 GHz
      • Memory: 4 GB RAM
    • Control boards:

      • Adafruit Stepper Motor HAT

        • Input voltage: 5 - 12 V DC
        • Output voltage: 4.5 - 13.5 V DC
        • Output current: up to 1.2 A continuous, 3 A peak
      • Adafruit Ultimate GPS HAT

    External interfaces & connectivity:

    • Expansion: 2 USB 3.0 ports, 2 USB 2.0 ports, 2 micro-HDMI ports
    • Wired networking: Gigabit Ethernet
    • Wireless networking: 2.4 GHz and 5.0 GHz 802.11ac Wi-Fi
    • Power input for embedded computer: 5 V DC, up to 3 A of current draw (USB-C)
    • Power input for motors: 5 - 12 V DC, depending on pump motor (5.1 x 2.2 mm DC barrel jack, center positive)
    "},{"location":"reference/software/changelog/","title":"Changelog","text":"

    All notable changes to the PlanktoScope's software will be documented in this file.

    The format is based on Keep a Changelog, and this project uses Calendar Versioning with a YYYY.minor.patch scheme for all releases after v2.3.0. All dates in this file are given in the UTC time zone.

    "},{"location":"reference/software/changelog/#v202400-beta2-2024-09-19","title":"v2024.0.0-beta.2 - 2024-09-19","text":""},{"location":"reference/software/changelog/#added","title":"Added","text":"
    • (System: administration) Added a Forklift-deployed script /usr/libexec/prepare-custom-image (which must be invoked with sudo) to reset machine-specific files and re-enable partition resizing and shut down the Raspberry Pi, in order to automate common tasks needed for making a custom SD card image from a booted Raspberry Pi running the PlanktoScope OS. Support for this script should be considered experimental - this was mainly added as a workaround to a developer-experience regression introduced after v2023.9.0, in which an additional step is now needed after making an SD card image from a previously-booted SD card, or else the image will result in an error message loop (\"Partition #2 contains a ext4 signature\") during boot and will be unable to resize the image above 8 GB. That step is now included by the added script. Creation of custom SD card images from booted PlanktoScope OS images should still be considered an experimental workflow which may experience breaking changes to the developer experience at any time.
    "},{"location":"reference/software/changelog/#changed","title":"Changed","text":"
    • (Application: GUI) Changed the default ISO value from 100 to 150.
    "},{"location":"reference/software/changelog/#fixed","title":"Fixed","text":"
    • (Application: backend) Changed the hardware controller's libcamera-based camera controller to initialize its default image gain based on camera sensor type in order to match the GUI's default ISO value of 150, instead of initializing default image gain to 1.0 regardless of camera sensor type.
    • (Breaking change; Application: backend) Changed the segmenter to include the acquisition ID in the filename of the metadata TSV file included with the EcoTaxa export ZIP archive; this is necessary to allow efficient bulk importing of such ZIP archives into EcoTaxa, which was previously prevented by the use of the same ecotaxa_export.tsv filename for all metadata TSV files.
    • (Application: GUI) The Grafana server's CPU allowance should now be limited to one core, in an attempt to prevent it from starving other programs of CPU time shortly after booting up under certain situations.
    "},{"location":"reference/software/changelog/#v202400-beta1-2024-06-24","title":"v2024.0.0-beta.1 - 2024-06-24","text":""},{"location":"reference/software/changelog/#added_1","title":"Added","text":"
    • (Application: GUI) On the planktoscopehat SD card image, the Node-RED dashboard's homepage now asks the user to set the hardware version (choosing between v2.3, v2.5, and v2.6) as a first-boot setup step; this dialog replaces the navigation buttons on the homepage until a hardware version is set.
    • (Release) A fairscope-latest SD card image is now provided which is identical to the planktoscopehat SD card image, except that its default settings configuration file is for the v2.6 PlanktoScope hardware (so that the homepage does not ask the user to choose a hardware version).
    • (System: administration) The Forklift pallet provided by default as the SD card image is now named (and pinned as) the factory-reset staged pallet bundle.
    • (System: networking) The planktoscope.local mDNS name was deprecated in v2023.9.0-beta.1, but now it's un-deprecated (i.e. official support for this name is added back to the project). As before, you can still use pkscope.local or the machine-specific mDNS name (of format pkscope-{machine-name}.local) instead of planktoscope.local.
    "},{"location":"reference/software/changelog/#changed_1","title":"Changed","text":"
    • (Breaking change; Application: GUI) The default settings configuration file for the planktoscopehat SD card image has been reverted to be for the v2.5 PlanktoScope hardware (reverting a change made for v2024.0.0-alpha.2); in v2024.0.0-alpha.2, it was for the v2.6 hardware, while in previous versions it was still for the v2.5 hardware.
    • (Release) SD card images are now released with xz compression (as .img.xz files) rather than gzip compression (as .img.gz files).
    "},{"location":"reference/software/changelog/#removed","title":"Removed","text":"
    • (Application: GUI) On the planktoscopehat SD card image, a hardware version is no longer set in the default config.json file provided on the image. Instead, the user must select their hardware version when they open the Node-RED dashboard's homepage for the first time.
    • (Application: GUI) The Node-RED dashboard's Administration page's \"Dashboard Errors\" panel has been removed, because it doesn't show any useful messages.
    • (System) gcc has been removed from the SD card image, to help reduce SD card image size.
    "},{"location":"reference/software/changelog/#fixed_1","title":"Fixed","text":"
    • (Application: GUI) The flowcell setting from the config.json file should now be properly displayed as the default selection on the Node-RED dashboard's \"Fluidic Acquisition\" page.
    "},{"location":"reference/software/changelog/#v202400-beta0-2024-06-07","title":"v2024.0.0-beta.0 - 2024-06-07","text":""},{"location":"reference/software/changelog/#changed_2","title":"Changed","text":"
    • (Application: GUI) The ISO selector in the \"Optic Configuration\" page has been changed from a button group to a slider (with an increment of 50), to enable somewhat finer adjustment of the ISO setting.
    • (Breaking change; System) The official SD card images of PlanktoScope OS are now based on the 64-bit (arm64) version of the 2024-03-12 build of Raspberry Pi OS 11 (bullseye), instead of the 32-bit (armhf) version of the 2023-05-03 build of Raspberry Pi OS 11 (bullseye). This increases the performance of the Python segmenter, potentially by a factor of 2. This is expected to break compatibility with the raspimjpeg-based imaging module. If you need a 32-bit version of PlanktoScope OS, you will need to run the OS setup scripts following the PlanktoScope project's documentation's \"Non-standard installation\" guide for software setup.
    • (System: administration) The machine-name binary is no longer provided by the OS setup scripts, but instead is provided by Forklift for upgradeability (by upgrading the pallet applied to the Raspberry Pi) & removeability/replaceability (by switching to a different pallet which provides a different version of - or does not provide - the machine-name).
    "},{"location":"reference/software/changelog/#deprecated","title":"Deprecated","text":"
    • (System: networking)
    • (System) 32-bit versions of PlanktoScope OS (which can be set up on a 32-bit version of Raspberry Pi OS using the OS setup scripts) are no longer officially supported by the project, but they will continue to work for v2024.0.0 of PlanktoScope OS.
    "},{"location":"reference/software/changelog/#removed_1","title":"Removed","text":"
    • (Application: GUI) The landing page's links to Portainer have been removed, as part of the deprecation in v2024.0.0-alpha.2 of the inclusion of Portainer by default in the PlanktoScope OS's SD card images.
    "},{"location":"reference/software/changelog/#fixed_2","title":"Fixed","text":"
    • (Application: GUI) The landing page's links to offline PDF copies of the protocols.io protocols for PlanktoScope operation are no longer broken.
    • (Application: GUI) The maximum allowed value in the ISO selector in the \"Optic Configuration\" page has been reduced from 800 to 650, but only for the planktoscopehat version of the Node-RED dashboard; maximum allowed value is still 800 in the adafruithat version of the Node-RED dashboard. This change is because v2024.0.0-alpha.2's change to the scaling factor for converting between ISO settings and camera gains in the picamera2 library has meant that ISO values above 650 were converted to image gain values which were silently rejected for the Raspberry Pi HQ Camera used PlanktoScopes with hardware version at or above v2.3; this, this change prevents users from setting ISO values which would be silently rejected by the Python hardware controller.
    "},{"location":"reference/software/changelog/#v202400-alpha2-2024-04-25","title":"v2024.0.0-alpha.2 - 2024-04-25","text":""},{"location":"reference/software/changelog/#added_2","title":"Added","text":"
    • (System: administration) The hostname can now be customized by modifying the hostname template (with string interpolation for the machine name) in /etc/hostname-template.
    • (System: administration) The Cockpit configuration can now be customized by adding configuration snippets as drop-in files in /etc/cockpit/cockpit.conf.d, and adding origins to allow in /etc/cockpit/origins.d, and adding templated origins (with string interpolation for the machine name, the hostname, and the custom domain) to allow in /etc/cockpit/origins-templates.d.
    • (System: administration) The dnsmasq configuration can now be customized by adding templated drop-in configuration files (with string interpolation for the machine name, the hostname, and the custom domain) in /etc/dnsmasq-templates.d, and by modifying the custom domain (which defaults to pkscope) in /etc/custom-domain.
    • (System: administration) The hostapd configuration can now be customized by adding configuration snippets as drop-in files in /etc/hostapd/hostapd.conf.d, and adding templated drop-in files (with string interpolation for the machine name, the hostname, and the custom domain) in /etc/hostapd/hostapd.conf-templates.d.
    • (System: administration) The hosts file can now be customized can now be customized by adding snippets as drop-in files at /etc/hosts.d, and and adding templated snippets (with string interpolation for the machine name, the hostname, and the custom domain) in /etc/hosts-templates.d.
    • (System: administration) SSH host keys for the SSH server are now automatically generated (if deleted or otherwise missing) during every boot, not just during the first boot.
    "},{"location":"reference/software/changelog/#changed_3","title":"Changed","text":"
    • (Breaking change; Application: backend) Previously, the segmenter's default behavior was to subtract consecutive masks to try to mitigate image-processing issues with objects which get stuck to the flowcell during imaging. However, when different objects occupied the same space in consecutive frames, the subtraction behavior would subtract one object's mask from the mask of the other object in the following frame, which would produce clearly incorrect masks. This behavior is no longer enabled by default; in order to re-enable it, you should enable the pipeline-subtract-consecutive-masks feature flag in the apps/ps/backend/proc-segmenter package deployment of the local Forklift pallet and re-apply the pallet.
    • (Application: backend, GUI) The image quality of frames in the camera preview stream is increased, and frames also have greater width and height.
    • (Breaking change; Application: GUI) The default settings configuration file for the planktoscopehat SD card image is now for the v2.6 PlanktoScope hardware; previously, it was still for the v2.5 hardware.
    • (Breaking change; System: administration) The minimum supported Forklift version for Forklift pallets has increased from v0.4.0 to v0.7.0, due to new integration between Forklift and the filesystem.
    • (System: administration) Forklift has been upgraded to v0.7.0, so that pallets are staged before being applied (and with automatic fallback to the last successfully-applied staged pallet), and so that systemd services, /etc config files, and some scripts in /usr are now managed by Forklift.
    • (System: administration) /etc is now a overlay filesystem with all manually-edited files saved at /var/lib/overlays/overrides/etc.
    • (System: administration) /usr is now a overlay filesystem with all manually-edited files saved at /var/lib/overlays/overrides/usr.
    "},{"location":"reference/software/changelog/#deprecated_1","title":"Deprecated","text":"
    • (System: administration, troubleshooting; Application: GUI) Portainer will no longer be installed/provided by default after v2024.0.0. This is because it requires inclusion of a relatively large Docker container image in the PlanktoScope OS's SD card image (which is constrained to be up to 2 GB in size so that it can be attached as an upload to GitHub Releases), and because it has an annoying first-time user experience (i.e. that a password must be set within a few minutes of boot, or else the Portainer container must be restarted), and because Dozzle already provides all the basic functionalities needed by most users, and because Portainer has never actually been used for troubleshooting within the past year of the project, and because Portainer has a nontrivial impact on the sizes of the PlanktoScope OS SD card images (which are limited to 2 GB).
    • (System: administration; Application: GUI) The \"USB backup\" functionality of the Node-RED dashboard will be removed in v2024.1.0 (the next release after v2024.0.0). Instead, you should use the datasets file browser for backing up and deleting dataset files on your PlanktoScope.
    • (Application: backend) The raspimjpeg-based imaging module in the Python hardware controller has not yet been deleted so that you can change the Python hardware controller code to switch back from the new picamera2-based imaging module if picamera2 ends up causing big problems for you. However, we are deprecating the raspimjpeg-based imaging module, and we will fully delete it in a future release (perhaps v2024.1.0, or perhaps later).
    "},{"location":"reference/software/changelog/#fixed_3","title":"Fixed","text":"
    • (Application: GUI) The white balance input validation, which previously only allowed gains between 1.0 and 8.0, now allows gains in the full range allowed by the camera (i.e. between 0.0 and 32.0).
    • (Application: backend, GUI) The incorrect scaling factor for converting between ISO settings (in the Node-RED dashboard) and image gains in the new picamera2-based imager is fixed.
    • (System: networking) Some uncommon edge cases for packet forwarding (e.g. accessing a one of the PlanktoScope's static IP addresses on a network interface not associated with that static IP address) should work now.
    "},{"location":"reference/software/changelog/#v202400-alpha1-2024-03-26","title":"v2024.0.0-alpha.1 - 2024-03-26","text":""},{"location":"reference/software/changelog/#changed_4","title":"Changed","text":"
    • (Breaking change; System: setup) The word pscopehat has been replaced with planktoscopehat everywhere. This means that any distro setup scripts/commands you previously used with pscopehat should be changed.
    • (Breaking change; Application: hardware controller) The hardware controller now uses picamera2 instead of raspimjpeg for camera control. This may require different ISO and white balance gains to be used. It also no longer limits the framerate of the camera preview, so the preview stream should adapt to the bandwidth available on your network connection and the system resources available to your web browser; this may increase resource usage on your web browser.
    "},{"location":"reference/software/changelog/#deprecated_2","title":"Deprecated","text":"
    • (Application: GUI) The current Node-RED dashboard (both the version for the Adafruit HAT and the version for the PlanktoScope HAT) is transitioning to maintenance mode: no new features will be added, and any bugs will be only be fixed if someone volunteers to fix them. The current Node-RED dashboard will be completely replaced by a fully-rewritten Node-RED dashboard, though there is no timeline for completion of that new dashboard. Currently, our plan for deprecating and eventually removing the current Node-RED dashboard is as follows: maintenance mode (no new features, only some bugfixes), then deprecation (no maintenance; not enabled by default, but still installed), then removal (not installed by default, but anyone is free to install it and see if it still works); deprecation will not occur before the rewritten Node-RED dashboard is stable for general-purpose usage. If you have concerns, please share your feedback on GitHub, in an email, or on the PlanktoScope Slack.
    "},{"location":"reference/software/changelog/#fixed_4","title":"Fixed","text":"
    • (Breaking change; Application: backend) The default hardware configuration file for the planktoscopehat SD card image is now for the v2.6 PlanktoScope hardware; previously, it was (incorrectly) a mixture of v2.5 and v2.6 optical settings.
    • (Application: hardware controller) The camera no longer overexposes captured images compared to the camera preview stream, and it no longer produces camera timeout errors.
    • (Application: backend) The segmenter should no longer have file permissions errors when trying to read or write files in directories created by Docker or by the Python hardware controller.
    "},{"location":"reference/software/changelog/#v202400-alpha0-2024-02-06","title":"v2024.0.0-alpha.0 - 2024-02-06","text":""},{"location":"reference/software/changelog/#added_3","title":"Added","text":"
    • (System: networking) Added support to share internet access and browser application access over additional network interfaces: a second Wi-Fi module, an additional Ethernet adapter, and a USB networking interface (made by plugging a phone to the Raspberry Pi in USB tethering mode).
    • (Application: GUI) The \"System Monitoring\" page now shows the current system time on the Raspberry Pi and the current time in the web browser of the client device.
    • (Application: GUI) The \"System Monitoring\" page now detects when the Raspberry Pi's system time is very different from the web browser's time, and shows a message and a buttom to change the Raspberry Pi's system time to match the web browser's time.
    • (Application: GUI) The \"System Monitoring\" page's system metrics panel is now collapsible, and it now includes an expandable \"Detailed History\" subsection to view additional information.
    • (System: administration) Added Dozzle as a viewer for Docker container logs.
    • (System: networking) Added lynx as an alternative terminal web browser to w3m for trying to work through captive portals on the Cockpit terminal.
    • (System: administration) Added Prometheus as a metrics collection & storage system.
    • (System: administration) Added Grafana as a metrics visualization & alerting system.
    "},{"location":"reference/software/changelog/#changed_5","title":"Changed","text":"
    • (Application: GUI) The \"System Monitoring\" page now uses a Grafana dashboard to display metrics.
    • (Application: GUI) The \"Fluidic Acquisition\" page now uses a numeric text input instead of a slider for adjusting the \"Pumped volume\" setting, to make it easier to change the setting to a different exact value.
    • (Application: GUI) On the \"Sample\" page, the input fields of the \"Sample Location\"/\"Net Throw Location\"/\"Net Retrieval Location\"/\"Culture Date and Time\" panels no longer get cleared when pressing the \"Validate\" button.
    • (System: administration) Docker commands can now be run without sudo.
    • (System: security) ufw has been replaced with firewalld. However, firewalld has not yet been properly configured.
    • (System) The PlanktoScope's machine name is now saved to /var/lib/planktoscope/machine-name instead of /home/pi/.local/etc/machine-name, and it's now saved without a trailing newline.
    "},{"location":"reference/software/changelog/#removed_2","title":"Removed","text":"
    • (Application: GUI) The \"System Monitoring\" page no longer displays a gauge for the CPU usage, since that information does not need to be monitored to ensure system stability & usability. Instead, a CPU usage history graph can be found in the new \"Detailed History\" subsection.
    • (System: administration) Removed cockpit-storaged, which was not useful enough to justify the number (and size of) unneeded dependencies it pulled in for the PlanktoScope software SD card image.
    • (System: setup) Removed some unnecessary apt-get update commands for a very minor speed-up in the distro setup process.
    "},{"location":"reference/software/changelog/#fixed_5","title":"Fixed","text":"
    • (Application: GUI) The \"Filtered volume\" field (on the \"Sample\" page) is now saved as the sample_total_volume metadata field for all sample types, not just horizontal Plankton tows (corresponding to the \"Plankton net\", \"High Speed Net\", and \"Tara decknet\" sample types).
    • (System) Boot time has been made faster by approximately 1 minute.
    • (Application: GUI) On Mozilla Firefox, the embedded file browser in the Node-RED dashboard's \"Gallery\" page should now consistently load with the correct height, instead of sometimes loading with an absurdly small height.
    • (System: networking) The Raspberry Pi now correctly detects a phone connected in USB tethering mode to share internet access regardless of when the phone was connected, instead of only detecting that phone if USB tethering mode was enabled early in startup (specifically, before the dhcpcd service had started).
    • (System: networking) Functionality for automatically updating the /etc/hosts file and the hostname based on the machine name has now been split into two separate system services, planktoscope-org.update-hosts-machine-name.service and planktoscope-org.update-hostname-machine-name.service.
    "},{"location":"reference/software/changelog/#v202390-2023-12-30","title":"v2023.9.0 - 2023-12-30","text":"

    (this release involves no changes from v2023.9.0-beta.2; it's just a promotion of v2023.9.0-beta.2 to a stable release)

    "},{"location":"reference/software/changelog/#v202390-beta2-2023-12-02","title":"v2023.9.0-beta.2 - 2023-12-02","text":""},{"location":"reference/software/changelog/#added_4","title":"Added","text":"
    • (Application) A hardware configuration file for PlanktoScope hardware v2.6, which was previously missing, has been added. It is now the default hardware configuration file for pscopehat builds of the PlanktoScope distro.
    "},{"location":"reference/software/changelog/#changed_6","title":"Changed","text":"
    • (System: infrastructure) Forklift has been upgraded from v0.3.1 to v0.4.0, which includes breaking changes to the schema of Forklift repositories and pallets.
    "},{"location":"reference/software/changelog/#removed_3","title":"Removed","text":"
    • (Application: documentation) The offline documentation included on the PlanktoScope now omits the hardware setup guides.
    "},{"location":"reference/software/changelog/#fixed_6","title":"Fixed","text":"
    • (Application: GUI) The white balance gains are now only validated and sent to the backend after the user changes focus away from the input field, instead of being validated and sent 300 ms after the user pauses while editing the value in the input field. This prevents the input validation from being run while the user is still editing the value.
    • (Application) The default brightness of the illumination LED for the pscopehat version of the backend (for the custom PlanktoScope HAT) has been reduced; this a temporary workaround to a bug with raspimjpeg where saved images are overexposed even on the default brightness settings with minimum shutter speed and ISO, despite the brightness of raspimjpeg's camera preview looking reasonable (see https://github.com/PlanktoScope/PlanktoScope/issues/259 for details).
    • (Application: GUI) In the \"Sample\" page, when the minimal & maximal fraction size fields and min & max sampling depth fields are both displayed simultaneously, now the adafruithat version of the Node-RED dashboard shows the fraction size fields on one row and the sampling depth fields on another row, rather than showing them in adjacent columns. This way, the adafruithat version of the Node-RED dashboard now matches the layout in the pscopehat version of the Node-RED dashboard.
    • (Application: GUI) The \"System Monitoring\" page now correctly displays the PlanktoScope hardware version in the \"Information\" panel's \"Instrument Type\" field.
    • (Application: GUI) The \"System Monitoring\" and \"Fluidic Acquisition\" pages now display a software version string which is either a tagged version (e.g. v2023.9.0-beta.1) when the version is tagged, or else a pseudoversion (e.g. v2023.9.0-beta.1-36-gf276e84) which contains an abbreviated commit SHA and a list of the number of commits since the last tagged version. This version string is now also used for the acq_software metadata field.
    • (Application: GUI) The process_commit metadata field is now set once again. Now it depends on the new installer script provided by the github.com/PlanktoScope/install.planktoscope.community repo.
    • (Application: GUI) The process_source metadata field is no longer hard-coded in the Node-RED dashboard. Now it depends on the new installer script provided by the github.com/PlanktoScope/install.planktoscope.community repo.
    • (System: infrastructure) The SD card setup scripts now apply the Forklift pallet in order to create the Docker Compose services and resources ahead-of-time (rather than waiting for the first boot to do that work), so that the first boot of the SD card image will be much faster.
    • (System: infrastructure) The distro setup scripts now work even if they are run from a repository downloaded to some path other than /home/pi/PlanktoScope.
    • (Application: GUI) The landing page now links to the new project documentation site for online documentation, instead of the old project documentation site.
    "},{"location":"reference/software/changelog/#v202390-beta1-2023-09-14","title":"v2023.9.0-beta.1 - 2023-09-14","text":""},{"location":"reference/software/changelog/#added_5","title":"Added","text":"
    • (System: networking) The PlanktoScope can now also be accessed using the domain name pkscope.local from any web browser where planktoscope.local previously worked. We recommend using http://pkscope.local instead of http://planktoscope.local to access your PlanktoScope, for consistency with other domain name formats (see the \"Changes\" section for details).
    • (System: administration, networking) In operating system's networking configuration files which have lines which are automatically generated based on the PlanktoScope's machine name, those lines now have accompanying code comments which explain the correct files to edit in order to make changes which will persist across device reboots.
    • (System: administration, networking) You can now check the machine name at /home/pi/.local/etc/machine-name. It's updated when the PlanktoScope boots.
    • (System: administration; Application: GUI) The Node-RED dashboard now provides some context on the \"Administration\" page for how to access the logs linked to from that page, and which links to use for providing logs on GitHub or Slack.
    • (System: administration; Application: GUI) The Node-RED dashboard now provides some additional information about the side-effects of selecting a hardware version on the \"Hardware Settings\" page, specifically that the white balance settings will be overwritten.
    "},{"location":"reference/software/changelog/#changed_7","title":"Changed","text":"
    • (Major user-facing change; System: networking) The top-level domain for domain names of format home.planktoscope and {machine-name}.planktoscope (e.g. http://metal-slope-23501.planktoscope) has been changed from planktoscope to pkscope, so that the domain names are now of format home.pkscope and {machine-name}.pkscope. Similarly, the machine-specific mDNS name has been changed from format planktoscope-{machine-name}.local to pkscope-{machine-name}.local.
    • (User-facing change; System: networking) The SSIDs of wifi hotspots generated by the PlanktoScope has been changed from the format PlanktoScope {machine-name} to the format pkscope-{machine-name}. This makes it easier to determine the machine-specific mDNS URL: just add .local, to get pkscope-{machine-name}.local (e.g. pkscope-metal-slope-23501.local).
    • (User-facing change; Application: backend) The Python backend now uses the new machine naming scheme everywhere.
    • (System: networking) The default hostname and SSID (used only in certain unexpected situations when a machine name cannot be determined) have both been shortened from planktoscope to pkscope.
    • (System: networking) The SSID format is now specified in /home/pi/.local/etc/hostapd/ssid.snippet, instead of /home/pi/.local/bin/update-ssid-machine-name.sh.
    "},{"location":"reference/software/changelog/#deprecated_3","title":"Deprecated","text":"
    • (System: networking) The planktoscope.local mDNS name is no longer recommended. We will continue to support it for the foreseeable future (and definitely for at least one year), but we recommend using pkscope.local or the machine-specific mDNS name (of format pkscope-{machine-name}.local) instead.
    • (Application: backend) The Python backend's logs still print machine names in the old naming scheme, to help instrument operators with the naming scheme transition (so that they can identify how each machine was renamed). The machine names in this old naming scheme will be removed in a future release - probably the next release.
    "},{"location":"reference/software/changelog/#removed_4","title":"Removed","text":"
    • (System: administration, networking) The auto-generated /home/pi/.local/etc/cockpit/origins file has been removed, because it does not need to be persisted after being generated. Instead, a temporary file is generated and removed after being used.
    • (System: administration, networking) The default /home/pi/.local/etc/hosts file has been removed from the setup files. Instead, it is now automatically generated by the setup scripts.
    "},{"location":"reference/software/changelog/#fixed_7","title":"Fixed","text":"
    • (System: networking) The PlanktoScope no longer generates any machine names or SSIDs which are so long that they prevent the wifi hotspot network from being brought up.
    • (Application: backend) The segmenter no longer crashes and fails to respond immediately after attempting to start segmentation.
    • (Application: preset settings, GUI) The default setting for the pscopehat version of the Node-RED dashboard is now the 300 um capillary, since that version of the hardware is meant to be used with 300 um capillaries. Previously, the default was the 200 um ibidi slide.
    • (Application: preset settings) All default settings for all hardware versions now include a default pixel size calibration of 0.75 um/pixel. Previously, the default settings for v2.1 and v2.3 were missing this setting, which would cause the segmenter to crash when processing datasets generated on PlanktoScopes using the v2.1 or v2.3 hardware settings.
    • (Application: preset settings, GUI) The Node-RED dashboard now correctly lists the selected hardware version in the \"Hardware Settings\" page's \"Hardware Version\" dropdown menu upon startup.
    • (Application: GUI) The Node-RED dashboard now (hopefully) is able to determine the camera type from the Python backend.
    "},{"location":"reference/software/changelog/#v202390-beta0-2023-09-02","title":"v2023.9.0-beta.0 - 2023-09-02","text":""},{"location":"reference/software/changelog/#added_6","title":"Added","text":"
    • (System: networking) Traffic is now routed with Network Address Translation between the Ethernet and Wi-Fi network interfaces. This means that if the PlanktoScope has internet access through an Ethernet connection, it will share that internet access to devices connected to its Wi-Fi hotspot; and if the PlanktoScope has internet access through a Wi-Fi connection, it will share that internet access to devices connected to its Ethernet port.
    • (System: networking) Now both 192.168.4.1 and 192.168.5.1 can be used to access your PlanktoScope when your computer is connected directly to it, regardless of whether you are connecting over an Ethernet cable or the PlanktoScope's Wi-Fi hotspot.
    • (System: networking) Previously the PlanktoScope could be connected to from 192.168.4.1 (over Wi-Fi, when running in wireless AP mode), 192.168.5.1 (over Ethernet), and planktoscope.local (over Wi-Fi or Ethernet, from a client device with mDNS support); this meant that Android devices could only connect to the PlanktoScope at 192.168.4.1, as they lack mDNS support. Now, client devices - even those without mDNS support - can connect to the PlanktoScope at home.planktoscope, and/or URLs like clear-field-33719.planktoscope and planktoscope-clear-field-33719.local (where clear-field-33719 is replaced with the PlanktoScope's Raspberry Pi's machine name, which is also part of the name of the PlanktoScope's Wi-Fi network - e.g. \"PlanktoScope clear-field-33719\").
    • (Application: Documentation) An offline copy of the PlanktoScope project documentation is now provided at URL path /ps/docs/ (so e.g. it's accessible at http://home.planktoscope/ps/docs/)
    • (Application: GUI) The Node-RED dashboard's \"Hardware Settings\" page now includes a drop-down menu item to select \"PlanktoScope v2.5\" as an allowed hardware version.
    • (Application: GUI, administration) The Node-RED dashboard now generates a notification whenever it restarts the Python backend. This provides visibility for the user when changing the hardware version triggers a restart of the Python backend.
    • (System: administration, troubleshooting, GUI) A Cockpit system administration dashboard is now installed and made accessible at URL path /admin/cockpit/ (so e.g. it's accessible at http://home.planktoscope/admin/cockpit/).
    • (System: administration, troubleshooting, GUI) A filebrowser instance, allowing you to manage and edit files anywhere in the Raspberry Pi's SD card, is now installed and made accessible at URL path /admin/fs/ (so e.g. it's accessible at http://home.planktoscope/admin/fs/)
    • (System: administration, troubleshooting, GUI) A Portainer administration dashboard for Docker is now installed and made accessible at URL path /admin/portainer/ (so e.g. it's accessible at http://home.planktoscope/admin/portainer/). Note that you will need to open Portainer within a few minutes after booting (or rebooting) your PlanktoScope in order to create an admin account for Portainer.
    • (System: administration) Docker is now installed. We are using it to deliver various applications in a way that will eventually enable safe and easy upgrades.
    • (System: administration, troubleshooting) w3m is now installed, enabling terminal-based interaction with some Wi-Fi network captive portals to obtain internet access on the PlanktoScope. For captive portals which require Javascript, we recommend instead using browsh as a Docker container; we don't provide browsh in the default SD card image because it adds ~250 MB of dependencies to the image.
    "},{"location":"reference/software/changelog/#changed_8","title":"Changed","text":"
    • (User-facing change; System: administration) The file browser on port 80 for viewing datasets has now been moved to path /ps/data/browse/ (so e.g. it's accessible at http://home.planktoscope/ps/data/browse/ ), and it is now implemented using filebrowser, so that now you can delete folders, download folders, preview images, etc. As before, you can still access this from the \"Gallery\" page of the Node-RED dashboard.
    • (User-facing change; Application: GUI) If you navigate the PlanktoScope in your web browser on port 80 (or without specifying a port) (e.g. with URLs like http://home.planktoscope or http://planktoscope.local), your browser will show a landing page with a list of links for easy access to the Node-RED dashboard, documentation, other embedded applications, and reference information about your PlanktoScope.
    • (User-facing change; Application: GUI) Previously, the Node-RED dashboard was accessed on the path /ui on port 1880, e.g. with URLs like http://planktoscope.local:1880/ui or http://192.168.4.1:1880/ui; now, it should be accessed via a link on the landing page.
    • (User-facing change; System: networking) Previously, PlanktoScope machine names were generated as gibberish words like \"Babaxio-Detuiau\", and the machine names were used as the names of the private Wi-Fi networks generated by the PlanktoScope in wireless AP mode. However, the machine names created by this naming scheme were often difficult to pronounce, remember, and type for people in various languages, and the naming scheme sometimes generated names which sounded like curses or insults in some languages. Now, PlanktoScope machine names are generated as a combination of two words and a number up to five digits long; words are selected from pre-built lists in a language which can be chosen based on localization settings. Currently, word lists are only provided in US English, resulting in names like \"metal-slope-23501\", \"conscious-pocket-1684\", and \"plant-range-10581\"; however, word lists can be added for other languages in the future, and a user interface will eventually be provided for changing localization settings.
    • (User-facing change; Application: GUI) Selecting a hardware version on the \"Hardware Settings\" page of the Node-RED dashboard now causes a default hardware preset for that version to overwrite the entire hardware.json file, and the Node-RED dashboard will reload the settings; this prevents the hardware.json file from being changed into an inconsistent mixture of settings for different hardware versions, which was the previous (incorrect) behavior. The description on the \"Hardware Settings\" page is also now more specific about what happens when a hardware version is selected.
    • (User-facing change; Application: GUI, troubleshooting) Previously, the Node-RED dashboard's \"Administration\" page merged log entries from every component of the Python backend and the Node-RED dashboard. Now, the Node-RED dashboard instead displays links to separate Cockpit log-viewing pages (which by default are accessed with username pi and password copepode) for the Node-RED dashboard, the backend's hardware controller, and the backend's segmenter, and links to filebrowser directories for all log files created by the backend's hardware controller and segmenter.
    • (User-facing change; System: GUI) Previously, the Node-RED flow editor was accessed directly on port 1880, e.g. with URLs like http://planktoscope.local:1880 or http://192.168.4.1:1880; now, it should be accessed via a link on the landing page .
    • (System: networking) Previously, PlanktoScopes all had planktoscope as their hostname. Now, the hostname is of the format planktoscope-<machine-name>, e.g. planktoscope-metal-slope-23501 or planktoscope-plant-range-10581.
    • (Likely user-facing change; System: networking) The default Wi-Fi country has been changed from FR (France) to US (USA).
    • (Likely user-facing change; System: networking) Previously the autohotspot script considered receiving an IP address assignment from the connected Wi-Fi network as the criterion for determining whether the Wi-Fi connection was successful. Now the autohotspot script tries to ping google.com to determine whether the connection was successful, so that the autohotspot script will revert to wireless AP mode if no internet access is available over the Wi-Fi network (e.g. if the connected Wi-Fi network is actually behaving like a captive portal, which would prevent the PlanktoScope from being accessed via a VPN over the internet - in which case the PlanktoScope would become accessible only over an Ethernet cable). This change is meant to make it easier to fix a PlanktoScope's Wi-Fi connection configuration when that configuration makes internet access impossible.
    • (System: networking, troubleshooting) Previously the autohotspot script would print the MAC addresses and SSIDs of all Wi-Fi networks found by scanning. Now it only prints the SSIDs of Wi-Fi networks found by scanning and avoids printing duplicate SSIDs, for more concise service logs.
    • (System: networking, troubleshooting) When the autohotspot script fails to connect to google.com, it will also print some diagnostic information by attempting to ping 1.1.1.1 (the static IP address of Cloudflare DNS, so a ping without DNS lookup) and checking whether the Wi-Fi network assigned an IP address to the Raspberry Pi, and reporting the results. This enables better troubleshooting of internet access issues on Wi-Fi networks.
    • (System: networking) Previously the autohotspot script was run every 5 minutes to scan for available Wi-Fi networks. Now it is run every 2 minutes, so that the PlanktoScope will connect more quickly to a Wi-Fi network which has just appeared.
    • (System: networking) Previously the autohotspot script and the dhcpcd service would both try to manage when to start and stop the dnsmasq service. Now, the dnsmasq service always runs. This change was made to simplify the network configuration so that it would be easier to understand, troubleshoot, and maintain.
    • (System: networking) Previously the autohotspot script would use a mixture of dhcpcd and wpa_supplicant as entrypoints for Wi-Fi network connection management. Now, dhcpcd is used to manage wpa_supplicant, and the autohotspot script only interacts with dhcpcd. This change was made to simplify the network configuration so that it would be easier to understand, troubleshoot, and maintain. Note that, in the future, wpa_supplicant and dhcpcd may be replaced with NetworkManager.
    • (System: networking) The autohotspot script has undergone a major refactoring, which may accidentally introduce bugs.
    • (Application: Backend, GUI) The Node-RED dashboard no longer supervises the Python backend; instead, it delegates that work to systemd.
    • (Application: Backend) Log files from the Python backend are no longer saved to /home/pi, but instead to subdirectories for the backend components under /home/pi/device-backend-logs. Note: the locations of log files may be changed again in the future, and/or file logging may be changed to use a different systemd-based mechanism in the future.
    • (System) The /usr/bin/stepper-disable and /usr/bin/autohotspotN scripts have been moved to /home/pi/.local/bin/release-gpio-steppers.sh and /home/pi/.local/bin/autohotspot.sh, respectively.
    • (System) The gpio-init.service systemd service has been renamed to planktoscope-org.init-gpio-steppers.service.
    • (System) Previously the en_DK.UTF-8 locale was used for everything. Now it is only used for time, measurements, and paper dimensions, and the en_US.UTF-8 locale is the base locale for everything else. In the future we may provide GUI functionality for changing the base locale.
    • (System) The chrony configuration has been simplified, but it may be broken.
    • (System) The default timezone is now officially set to UTC, and we will be using UTC as the standard system time zone for all PlanktoScopes. Previously, the pre-built SD card images provided by this project used UTC as the timezone, but the \"Expert Setup\" instructions for manually setting up the PlanktoScope software did not specify a time zone to use.
    • (System, Dependencies) The base OS is now the 2023-05-03 release of Raspberry Pi OS Bullseye.
    • (Application: Backend, Dependencies) The Python backend and Node-RED dashboard's indirect dependencies are now version-locked to improve the reproducibility of the OS setup script independently of when the script is run.
    "},{"location":"reference/software/changelog/#deprecated_4","title":"Deprecated","text":"
    • (Application: GUI) In a future release (potentially as early as v2023.12.0), the Node-RED editor and Node-RED dashboard will not be accessible at all over port 1880. In this release, you can still access the Node-RED dashboard at path /ps/node-red-v2/ui on port 1880, but the embedded image streams and file gallery will not be properly displayed; and you can access the Node-RED editor at path /admin/ps/node-red-v2 on port 1880. However, you should instead access the Node-RED editor and Node-RED dashboard via the links on the PlanktoScope's landing page.
    • (Application: GUI) In a future release (timeline not yet decided), the version of the Node-RED dashboard for the Adafruit HAT will stop receiving new features even as the version of the Node-RED dashboard for the custom PlanktoScope HAT continues receiving new features. However, we will continue to fix bugs in the Node-RED dashboard for the Adafruit HAT, and we will continue to build SD card images for the Adafruit HAT which will also include new features in other software components.
    "},{"location":"reference/software/changelog/#removed_5","title":"Removed","text":"
    • (User-facing removal; Application: GUI) The Node-RED dashboard no longer allows selection of \"PlanktoScope v1.0\" or \"PlanktoScope v2.2 (waveshare HAT)\" as the hardware version. Those hardware versions are no longer supported by the software.
    • (User-facing removal; System: networking) Now planktoscope.local only works for devices connected directly to the PlanktoScope, either via an Ethernet cable or over Wi-Fi when the PlanktoScope is running in wireless AP mode. planktoscope.local no longer works on other networks, such as LANs or mesh VPNs, which the PlanktoScope might be connected to. On such networks, the machine-specific mDNS name (of format planktoscope-<machine-name>.local) should be used instead.
    • (System: administration) The Git-based software update system (exposed in the Node-RED dashboard's \"Adminisration\" page) has been removed, since it was reported to behave problematically anyways. In the future, we will use a system based on Docker for safer and easier software updates.
    "},{"location":"reference/software/changelog/#fixed_8","title":"Fixed","text":"
    • (Major fault-tolerance improvement; Application: GUI) When an invalid value is entered for the red or blue white balance gain on the Node-RED dashboard's \"Optic Configuration\" page, that value is now ignored, a notification is displayed about the invalid value, and the white balance gain is reset to the last valid value (loaded from the hardware.json configuration file). This fixes issue #166 by preventing the Node-RED dashboard from saving an invalid value to the hardware.json file, which would crash the Python hardware controller after the next boot (or after the next time the Python hardware controller was restarted).
    • (Major quality-of-life improvement; Backend: dependencies) The adafruit-blinka and adafruit-platformdetect dependencies are now updated to their latest version, so that Python hardware controller will work on PlanktoScopes with recent (i.e. post-2021) versions of the Adafruit HAT.
    • (Application: GUI, troubleshooting) Previously, the Node-RED dashboard would often fail to display the log output from the Python backend. Now, it should always make the logs accessible (either by the links to Cockpit log viewer or by the links to the log file browser).
    • (System: networking) Previously the autohotspot script would not ignore any networks which were commented out in the /etc/wpa_supplicant/wpa_supplicant.conf file when checking if any networks found by scanning matched networks were specified in the wpa_supplicant.conf file; now it ignores them, so that commented-out networks don't incorrectly prevent the autohotspot from going into wireless AP mode.
    • (System: networking) Previously the autohotspot script would always wait 20 seconds after attempting to connect to a Wi-Fi network before checking whether the connection was successful, even if it didn't actually need to wait 20 seconds. Now the autohotspot script repeatedly attempts to ping google.com with a timeout of 2 seconds per attempt and a maximum of 10 attempts, so that the autohotspot script only waits as long as a necessary to determine that a Wi-Fi network connection has succeeded.
    • (System: networking) Previously the autohotspot script could decide that the SSID scan results were available even if no SSIDs were found (despite local Wi-Fi networks being active). Now an empty SSID scan result is treated as a condition where a re-scan is required.
    • (System: networking) Previously the log messages from the autohotspot script had inconsistent capitalization and grammar, and slightly unclear wording. Those have now been made more clear and consistent.
    "},{"location":"reference/software/changelog/#v230-2021-12-20","title":"v2.3.0 - 2021-12-20","text":""},{"location":"reference/software/changelog/#added_7","title":"Added","text":"
    • A basic working image segmenter.
    • Direct connections over Ethernet.
    • A \"Lab culture\" sample type, where location is set to the South Pole, and sample collection time and date are set by default to the current time and date on the Raspberry Pi but can be changed. (#74)
    • A \"Test\" sample type, where location is set to the South Pole, and sample collection time and date are always set to the current time and date on the Raspberry Pi.
    • A selector in the Node-RED dashboard for the machine hardware version (#98)
    "},{"location":"reference/software/changelog/#changed_9","title":"Changed","text":"
    • Various parts of the UI (we do not have a list of specific changes).
    • Node-RED is now upgraded to v2.0 (#97)
    • The base OS is now the 2021-12-03 release of Raspberry Pi OS Buster.
    "},{"location":"reference/software/changelog/#fixed_9","title":"Fixed","text":"
    • Various issues with accessing the Node-RED dashboard via http://planktoscope.local:1880/ui .
    • Various issues with Node-RED (#80, #91, #87, #96)
    "},{"location":"reference/software/changelog/#v221-2021-05-10","title":"v2.2.1 - 2021-05-10","text":""},{"location":"reference/software/changelog/#added_8","title":"Added","text":"
    • The ability for developers to change the PlanktoScope repository to a development branch from the Node-RED dashboard.
    "},{"location":"reference/software/changelog/#fixed_10","title":"Fixed","text":"
    • Various bugs (we do not have a list of specific changes)
    "},{"location":"reference/software/changelog/#v220-2021-02-23","title":"v2.2.0 - 2021-02-23","text":""},{"location":"reference/software/changelog/#added_9","title":"Added","text":"
    • Support for Raspberry Pi HQ cameras.
    • Control of image white balance.
    • A Node-RED dashboard panel to copy all data from /home/pi/data to a USB drive.
    • Integrity check of the generated files (for now only for raw pictures and metadata.json files). A file called integrity.check is created alongside the images. This file contains one line per file, with the filename, its size and a checksum of both its filename and its content.
    • A file gallery to browse data files in the /home/pi/data directory.
    • A way to update the PlanktoScope software repository on the Raspberry Pi.
    • A Node-RED dashboard panel to choose a wifi network to connect to.
    • A Node-RED tab to enter the configuration of the hardware.
    "},{"location":"reference/software/changelog/#changed_10","title":"Changed","text":"
    • (Breaking change) The UI has been changed (we do not have a list of specific changes)
    "},{"location":"reference/software/changelog/#fixed_11","title":"Fixed","text":"
    • Random camera crash solved: instead of using the python picamera library, we now use a compiled binary, raspimjpeg, controlled through a FIFO pipe
    "},{"location":"reference/software/changelog/#v210-2020-10-14","title":"v2.1.0 - 2020-10-14","text":""},{"location":"reference/software/changelog/#added_10","title":"Added","text":"
    • If the Raspberry Pi is configured (via the /etc/wpa_supplicant/wpa_supplicant.conf file) to connect to an existing wifi network, it will try to connect to the network; and it will only start its own wifi hotspot if it failed to connect.
    • If the Raspberry Pi is connected to the internet via its Ethernet port, it will share internet access to devices connected to the Raspberry Pi's wifi hotspot.
    • (Documentation) Information has been added about ribbon cable assembly.
    • (Documentation) Information has been added about how to back up the SD card.
    "},{"location":"reference/software/changelog/#changed_11","title":"Changed","text":"
    • (Breaking change) The OS is now based on Raspberry OS Lite, so there is no graphical desktop.
    • (Breaking change) The wifi network is now named PlanktoScope, and the password to it is now copepode.
    • (Breaking change) The default user is now pi, and the default password is copepode for this user.
    • (Breaking change) All raw and processed data files are now stored in the directory /home/pi/data.
    • The software has undergone a major refactoring, which may accidentally introduce some bugs.
    "},{"location":"reference/software/product-specs/","title":"Product Specifications","text":"

    The PlanktoScope OS includes all software which needs to run on the PlanktoScope's hardware to provide the overall functionality of a PlanktoScope. Product specifications for the PlanktoScope OS are listed below for ranges of software version numbers. To see software versions listed individually in chronological order, refer to the project release notes or the software changelog. To understand how to interpret software version numbers, refer to our description of the PlanktoScope OS's version numbering system.

    "},{"location":"reference/software/product-specs/#v202400","title":"v2024.0.0","text":"

    Specs for v2024.0.0 are the same as in v2023.9.0, except for the following sections:

    • Base operating system: the binary target architecture has changed from 32-bit to 64-bit.
    • System performance: on-board image processing speeds have improved (processing speeds have nearly doubled).
    "},{"location":"reference/software/product-specs/#functionalities","title":"Functionalities","text":"

    Regular operation:

    • Image acquisition: stop-flow imaging (JPEG image output)
    • On-board image processing: detection and segmentation of objects (batch-processing only)
    • User interfacing: graphical interface accessible through web browser of a connected phone, tablet, or computer
    • Export of data for uploading to EcoTaxa

    Advanced operations:

    • User interfacing: web browser interfaces for system administration, system monitoring, and troubleshooting
    • Automation: MQTT-based API
    • Application deployment: ability to add software as OCI containers using Docker, optionally via Forklift
    • System configuration: ability to reversibly add, remove, replace, or override OS configuration files via Forklift
    "},{"location":"reference/software/product-specs/#base-operating-system","title":"Base operating system","text":"
    • Distro: Raspberry Pi OS 11 (bullseye)
    • Binary target architecture: 64-bit (aarch64, also known as arm64)
    "},{"location":"reference/software/product-specs/#supported-hardware","title":"Supported hardware","text":"

    Minimum for image acquisition (but not sufficient for on-board image processing):

    • PlanktoScope: hardware v2.1 with Raspberry Pi 4 Model B computer
    • Memory: 1 GB RAM
    • Storage: 8 GB capacity

    Minimum for full functionality, including on-board image processing:

    • Memory: 4 GB RAM

    Recommended:

    • PlanktoScope: hardware v2.5 or v2.6 with Raspberry Pi 4 Model B computer
    • Storage: 32 GB capacity

    Forwards-incompatibilities:

    • Unable to run on the Raspberry Pi 5 computer.

    Backwards-incompatibilities:

    • Might still work on a Raspberry Pi 3 Model B+ computer or a Raspberry Pi 4 Model B computer with 1 GB of RAM, but compatibility is not tested.
    "},{"location":"reference/software/product-specs/#system-performance","title":"System performance","text":"

    With minimum supported hardware for full functionality:

    • On-board image processing: a dataset of 400 raw images is processed in approximately 1 hour
    "},{"location":"reference/software/product-specs/#v202390","title":"v2023.9.0","text":""},{"location":"reference/software/product-specs/#functionalities_1","title":"Functionalities","text":"

    Regular operation:

    • Image acquisition: stop-flow imaging (JPEG image output)
    • On-board image processing: detection and segmentation of objects (batch-processing only)
    • User interfacing: graphical interface accessible through web browser of a connected phone, tablet, or computer
    • Export of data for uploading to EcoTaxa

    Advanced operations:

    • User interfacing: web browser interfaces for system administration, system monitoring, and troubleshooting
    • Automation: MQTT-based API
    • Application deployment: ability to add software as OCI containers using Docker, optionally via Forklift
    "},{"location":"reference/software/product-specs/#base-operating-system_1","title":"Base operating system","text":"
    • Distro: Raspberry Pi OS 11 (bullseye)
    • Binary target architecture: 32-bit only (armhf, also known as armv7)
    "},{"location":"reference/software/product-specs/#supported-hardware_1","title":"Supported hardware","text":"

    Minimum for image acquisition (but not sufficient for on-board image processing):

    • PlanktoScope: hardware v2.1 with Raspberry Pi 4 Model B computer
    • Memory: 1 GB RAM
    • Storage: 8 GB capacity

    Minimum for full functionality, including on-board image processing:

    • Memory: 4 GB RAM

    Recommended:

    • PlanktoScope: hardware v2.5 or v2.6 with Raspberry Pi 4 Model B computer
    • Storage: 32 GB capacity

    Forwards-incompatibilities:

    • Unable to run on the Raspberry Pi 5 computer.

    Backwards-incompatibilities:

    • Might still work on a Raspberry Pi 3 Model B+ computer or a Raspberry Pi 4 Model B computer with 1 GB of RAM, but compatibility is not tested.
    "},{"location":"reference/software/product-specs/#system-performance_1","title":"System performance","text":"

    With minimum supported hardware for full functionality:

    • On-board image processing: a dataset of 400 raw images is processed in approximately 1.5 to 2 hours
    "},{"location":"reference/software/product-specs/#v23","title":"v2.3","text":""},{"location":"reference/software/product-specs/#functionalities_2","title":"Functionalities","text":"

    Regular operation:

    • Image acquisition: stop-flow imaging (JPEG image output)
    • On-board image processing: detection and segmentation of objects (batch-processing only)
    • User interfacing: graphical interface accessible through web browser of a connected phone, tablet, or computer
    • Export of data for uploading to EcoTaxa

    Advanced operations:

    • Automation: MQTT-based API
    "},{"location":"reference/software/product-specs/#base-operating-system_2","title":"Base operating system","text":"
    • Distro: Raspberry Pi OS 11 (bullseye)
    • Binary target architecture: 32-bit only (armhf, also known as armv7)
    "},{"location":"reference/software/product-specs/#supported-hardware_2","title":"Supported hardware","text":"

    Minimum for image acquisition (but not sufficient for on-board image processing):

    • PlanktoScope: hardware v2.1 with Raspberry Pi 3 Model B+ computer
    • Memory: 1 GB RAM
    • Storage: 8 GB capacity

    Minimum for full functionality, including on-board image processing:

    • PlanktoScope: hardware v2.1 with Raspberry Pi 4 Model B computer
    • Memory: 4 GB RAM

    Recommended for full functionality:

    • PlanktoScope: hardware v2.5 or v2.6
    • Storage: 32 GB capacity

    Forwards-incompatibilities:

    • Unable to run on the Raspberry Pi 5 computer.
    • Incompatible with Adafruit Stepper Motor HATs (used in PlanktoScope hardware v2.1) manufactured after mid-2022.
    "},{"location":"reference/software/product-specs/#system-performance_2","title":"System performance","text":"

    With minimum supported hardware for full functionality:

    • On-board image processing: a dataset of 400 raw images is processed in approximately 1.5 to 2 hours
    "},{"location":"reference/software/release-process/","title":"Release Process","text":"

    The PlanktoScope's software is released independently of the PlanktoScope's hardware; this document explains how we manage releases of the PlanktoScope OS (which contains the software which runs on a PlanktoScope, and which you can download as an SD card image), to help you to:

    • Understand what you should do when we publish a new release of the PlanktoScope OS.
    • Interpret the software product specifications and the software changelog.
    "},{"location":"reference/software/release-process/#version-numbering","title":"Version numbering","text":"

    The PlanktoScope OS is a combination of many individual software components; some components (such as most parts of the PlanktoScope's graphical user interface, and some of its hardware drivers) are written, maintained, and distributed by the PlanktoScope project, while other components (such as the Cockpit administration dashboard and the file browser) are written, maintained, and distributed by other open-source software projects. Each component has its own release schedule and version numbering system; the specific combination of releases and versions of all these components will change over time as these components change, and we represent each total combination of all software components by a version number assigned to a particular release of the PlanktoScope OS. For example, the v2023.9.0 release of the PlanktoScope OS included various software programs at one specific combination of versions, while the v2024.0.0 release upgraded some of those programs to newer versions.

    We use a calendar-based version numbering system for the PlanktoScope OS, where each version number has the format v(year).(minor).(patch) for stable releases of the software or v(year).(minor).(patch)-(modifier) for testing pre-releases of the software:

    • year is a 4-digit number representing the year (in the Gregorian calendar) in which the stable release is (or will be) published. For example, version v2024.0.0 was published in 2024, while version v2025.0.0 will be published in 2025.

    • minor is a number which starts at 0 for the first release in each year, and increments by 1 for each release which adds new features or includes notable changes to existing features. Usually minor will be incremented one or two times each year. For example, version v2024.0.0 was the first version published in 2024, while version v2024.1.0 will be the second version with notable changes to be published in 2024.

    • patch is a number which starts at 0 for each (year).(minor) combination, and increments by 1 for each release which consists only of small bug fixes. For example, if there were some small bugs in v2024.0.0 which we wanted to patch before a v2024.1.0 release, we could add those patches as part of a (hypothetical) v2024.0.1 release. If the bugs are not very severe, we might not publish a patch release and we could instead just include those bug fixes together with other new features, in which case we would increment minor with the next release. For example, we might not publish a v2024.0.1 release, and instead just publish a v2024.1.0 release.

    • modifier is an additional string included to identify \"alpha\" or \"beta\" pre-releases published for testing before the stable release. We typically publish multiple \"alpha\" and \"beta\" pre-releases with additional improvements before a stable release, so modifier has the format of either alpha.(index) or beta.(index), where index is a number which starts at 0 for each (year).(minor).(patch)-alpha or (year).(minor).(patch)-beta combination. For example, the first \"alpha\" pre-release for v2024.0.0 was v2024.0.0-alpha.0, the second \"alpha\" pre-release was v2024.0.0-alpha.1, and the first \"beta\" pre-release was v2024.0.0-beta.0.

    "},{"location":"reference/software/release-process/#release-channels","title":"Release channels","text":"

    The PlanktoScope project uses a concept called \"release channels\" to structure our process for stabilizing and testing our software before we publish a new release of the PlanktoScope OS for everyone to use. There are three channels for PlanktoScope software releases and pre-releases, each corresponding to a particular branch of the PlanktoScope repository on GitHub:

    • Edge: On the \"Edge\" channel, the PlanktoScope OS is built from the setup scripts on the latest commit of the master branch of the PlanktoScope repository on GitHub - so the \"Edge\" channel is essentially the current unstable development version of the PlanktoScope OS, and is often likely to be broken or buggy in various ways. Occasionally, specific commits on the master branch are tagged as \"alpha\" pre-releases; \"alpha\" pre-releases should be treated as snapshots of PlanktoScope software development for testing by PlanktoScope software developers and advanced users.
    • Beta: Once an \"alpha\" pre-release has received sufficient testing for the PlanktoScope software developers to consider it stable enough for all PlanktoScope users to test it out, it will be promoted to a \"beta\" pre-release, and the software/beta branch of the PlanktoScope repository on GitHub will be advanced to the Git commit of the \"beta\" pre-release. At that point, the software/beta branch will only receive patches to fix serious errors. As bugs are fixed on the software/beta branch, more \"beta\" pre-releases may be created on that branch for users to test.
    • Stable: After the latest \"beta\" pre-release has received sufficient testing for the PlanktoScope software developers to consider it stable enough for most (or, ideally, all) PlanktoScope users to rely on it for production use and scientific operations, that \"beta\" pre-release will be promoted to a \"stable\" release, and the software/stable branch of the PlanktoScope repository on GitHub will be advanced to the git commit of the \"stable\" release.
    "},{"location":"reference/software/release-process/#release-schedules","title":"Release schedules","text":"

    We try to publish a few stable releases every year. Some stable releases may consist of small bugfixes, while other stable releases may add new functionalities or change existing functionalities. Thus, each release involves changes with different sizes of potential impact on software stability and different levels of risks for introducing new bugs. Because of this, we usually cannot make confident predictions about how long we will need to wait before we can promote an \"alpha\" pre-release to a \"beta\" pre-release. And because we rely on volunteers to test our \"beta\" pre-releases and the availability of volunteers for testing each \"beta\" pre-release often varies a lot, we cannot make confident predictions about how long we will need to wait before we can promote a \"beta\" pre-release to a \"stable\" release.

    Although the unpredictability of \"alpha\" and \"beta\" pre-release testing timelines prevents us from being able to set realistic expectations about specific software release timelines, you can generally expect at least one stable release in the first half of each year, and at least one stable release in the second half of each year.

    "},{"location":"reference/software/release-process/#choosing-a-release-channel","title":"Choosing a release channel","text":"

    Unless you have a specific reason, you probably should follow the stable release channel. \"Stable\" releases are intended for a general audience to rely on.

    However, we encourage all PlanktoScope users who use the stable release channel to also test beta pre-releases once those pre-releases are published. This will help us to discover and understand bugs which we may need to fix before promoting the PlanktoScope software from the \"Beta\"\" channel to the \"Stable\" channel.

    "},{"location":"reference/software/release-process/#upgrading-to-a-new-release-or-pre-release","title":"Upgrading to a new release or pre-release","text":"

    In order to use a new release or pre-release of the PlanktoScope OS, you will need to do one of the following:

    • Download the new SD card image for that release/pre-release, following the standard installation process.

    • Create a new custom SD card image for that release/pre-release, following the non-standard installation process.

    Then you will need to re-flash your PlanktoScope's SD card (or flash a new SD card for your PlanktoScope) with the resulting SD card image for the new release/pre-release of the PlanktoScope OS.

    "},{"location":"reference/software/architecture/os/","title":"Operating System","text":"

    When you flash an SD card image with the PlanktoScope software as part of PlanktoScope's software setup process, that SD card image consists of the PlanktoScope OS. This document describes the architecture of the PlanktoScope OS as an operating system, in order to explain:

    • How the PlanktoScope software abstracts over the PlanktoScope hardware.

    • How the PlanktoScope manages the execution of software programs intended to run on the PlanktoScope.

    This information is intended to help you understand:

    • The overall design of the PlanktoScope OS, including what functionalities it provides and what software it includes, and why we made certain design decisions.

    • How various software functionalities and responsibilities in the PlanktoScope are divided among the various programs in the PlanktoScope OS.

    • How various programs in the PlanktoScope OS support other programs which provide the PlanktoScope's high-level/end-user functionalities.

    • What tools you can use to perform software troubleshooting and system administration tasks with the PlanktoScope.

    • What kinds of new software you can develop and deploy to run on a PlanktoScope.

    Each SD card image of the PlanktoScope's software consists of an operating system for the PlanktoScope; the definition of the term \"operating system\" can be tricky to demarcate, but for practical purposes this document follows Bryan Cantrill's characterization of the operating system as the special program that:

    • \"Abstracts hardware to allow execution of other programs.\"
    • \"Defines the liveness of the machine: without it, no program can run.\"
    • Provides some important components including the operating system kernel, libraries, commands, daemons, and other facilities.

    This definition is a reasonable description of the PlanktoScope OS, because it's a program which abstracts the following hardware subsystems in a way that enables you to run other programs on the PlanktoScope which need to control or otherwise interact with the PlanktoScope's hardware:

    • A Raspberry Pi computer.

    • Various input/output devices such as actuators (e.g. the pump, the sample focus-adjustment actuators, and the illumination LED), sensors (e.g. the camera and the GPS module), and information storage devices (e.g. the real-time clock and the EEPROM).

    "},{"location":"reference/software/architecture/os/#software-deployment-execution","title":"Software deployment & execution","text":"

    In order to abstract the Raspberry Pi computer hardware to enable execution of other programs, the PlanktoScope OS merely uses software provided by other open-source projects:

    • The PlanktoScope OS is based on - and includes everything from the \"Lite\" image of - the Raspberry Pi OS (which in turn is based on Debian Linux), which provides abstractions for the Raspberry Pi's computer hardware via its custom Linux kernel and its included libraries. We use the Raspberry Pi OS because it provides Raspberry Pi-specific hardware support which we need and which is not easy to achieve with other Linux distros; and because it is the Linux distro with the best combination of familiarity, optimization, and maturity for the Raspberry Pi.

    • Lower-level system services - including services which we've added on top of the default Raspberry Pi OS - are launched and supervised by systemd, which provides a system and service manager. We use systemd because the Raspberry Pi OS provides it and relies on it.

    • Most of the PlanktoScope's software is (or eventually will be) executed as Docker containers by the dockerd daemon (which in turn is run by the docker.service systemd service). In the PlanktoScope OS, all Docker containers are declaratively specified, configured, and integrated together as Docker Compose applications. We use Docker because it enables us to isolate programs from each other so that they interact only in specifically-defined ways; this makes it easier for us to configure, integrate, distribute, and deploy the various programs running on the PlanktoScope.

    The PlanktoScope OS is a 64-bit operating system.

    "},{"location":"reference/software/architecture/os/#boot-sequence","title":"Boot sequence","text":"

    Because the PlanktoScope OS is a systemd-based Linux system running on the Raspberry Pi, the PlanktoScope's initial boot sequence is described by external documentation of:

    • The Raspberry Pi 4/5's boot flow, which consists of two bootloader stages to load the Raspberry Pi's firmware from the Raspberry Pi's SD card; in turn, the firmware loads the Linux kernel from the Raspberry Pi's SD card.

    • Debian's system initialization, which consists of an initramfs stage after the Linux kernel is loaded, followed by a stage for mounting the full filesystem from the Raspberry Pi's SD card and transferring control to the systemd init process as the root user-space process.

    • The systemd system manager's boot behavior, which initializes all necessary filesystems, drivers, and system services.

    The systemd system manager starts a variety of services added by the PlanktoScope OS which do not exist in the default installation of the Raspberry Pi OS, such as docker.service. The startup ordering relationships between those services are listed in our reference document about services in the startup process.

    "},{"location":"reference/software/architecture/os/#system-upgrades","title":"System upgrades","text":"

    Traditional Linux distros such as the Raspberry Pi OS are designed to run software directly on the host OS using a shared collection of programs and system libraries provided by the Linux distro, and with programs and libraries installed and upgraded in-place directly on the host OS via the package managers provided by the distro, such as APT and pip. This causes the following challenges for system administration on the PlanktoScope:

    • These packages are not atomic in how they perform system upgrades of installed libraries and programs, so they can fail during the upgrade process (e.g. due to loss of power) in a way that leaves the system in an unknown and un-reproducible state. Such a state can be hard to revert or recover from, short of wiping and re-flashing the Raspberry Pi's SD card with a new OS installation; this would cause the loss of any OS customizations (e.g. installation of additional software) made by the user.

    • If an upgrade of all installed programs and libraries results in a system with problems (e.g. bugs in the new version of an installed program), it is hard to completely revert the system to the previous state. Thus, software upgrades involve a trade-off between extra work (e.g. to backup the SD card image before any upgrade) and extra risk (e.g. of software breakage which is hard to revert due to lack of backups).

    • Making certain customizations to the OS, such as adding additional programs/libraries or modifying system configuration files, increases the risk of configuration drift in which the system's actual state increasingly diverges over time from the state expected by the PlanktoScope's software maintainers, and thus becomes harder to understand, troubleshoot, or replace. User customizations to the OS cannot be easily separated from the default configuration of the OS, so it is complicated to copy only those customizations in order to drop them onto a fresh installation of the OS from a newer release - especially if the updated OS includes changes to default configurations which conflict with the user customizations.

    • Some Python packages required by PlanktoScope-specific programs (namely the PlanktoScope hardware controller and the PlanktoScope segmenter, which are both described in later sections of this document), such as picamera2 and opencv-python-headless, can only be installed as pre-built wheels from piwheels (which is used instead of PyPi because the PlanktoScope OS is not yet able to run as a 64-bit operating system) when certain versions of system libraries are installed, or else they must be re-compiled from source (which is prohitively slow on the Raspberry Pi for the affected Python packages). This makes dependencies more complicated to manage in maintenance of the PlanktoScope OS for creating and releasing new SD card images with updated software. The reliance on system libraries also increases the risk that a user-initiated upgrade or removal of some of the system's installed APT packages could cause breakage of some pip-managed Python packages which had been installed before the change.

    All of the factors listed above increase the perceived risk (and/or the required effort for sufficient mitigation of that risk) of accidentally degrading system integrity by keeping all software on the OS up-to-date, which makes it harder for users to receive bugfixes, security patches, and new features in a timely manner. Indeed, outside of systems like phones and Chromebooks (whose operating systems automatically update themselves), it is common for users of operating systems to avoid installing security updates or OS upgrades out of a fear of breaking their installed software; this is especially common for users who rely on software to operate other scientific instruments, and for good reasons! But the PlanktoScope project currently does not have enough resources to be able to support users stuck on old versions of the PlanktoScope OS; instead, we want to make it easy and safe for all users to always keep their PlanktoScopes - even with customizations to the OS - automatically updated to the latest version of the PlanktoScope OS. We intend to achieve this by:

    • Running all PlanktoScope-specific programs which require system libraries (e.g. the PlanktoScope's Python-based programs) in Docker containers - with the required versions of the required system libraries bundled inside those containers - to isolate them from the host OS's libraries installed via APT. This way, APT packages will always be safe to add, upgrade, and remove on the host OS with negligible risk of interfering with PlanktoScope-specific software.

    • Enabling (almost) all software not provided by the default installation of the Raspberry Pi OS to be upgraded and downgraded in-place - either as container images or as replacements of files on the filesystem - with just a reboot. This way, software upgrades can be reverted in-place in case new bugs are introduced, and SD cards will only need to be re-flashed with new images once every few years (i.e. after a new major version of the Raspberry Pi OS is released).

    • Enabling most types of user-initiated OS customizations to be version-controlled (in a Git repository) and applied (as a system upgrade/downgrade) together with most of the default configurations added by the PlanktoScope OS over what is already present from the default installation of the Raspberry Pi OS. This way, user-initiated OS customizations can be easy to re-apply automatically even after an SD card is re-flashed with a fresh SD card image of the PlanktoScope OS.

    Currently, we have partially implemented the systems necessary for these goals. Much of the PlanktoScope's software is not installed or upgraded directly on the host OS via APT or pip; instead, we use a (partially-implemented) tool called forklift which we're developing specifically to support the goals listed above, and which provides a robust way for us to fully manage deployment, configuration, and upgrading of:

    • All software which we run using Docker.
    • PlanktoScope-specific systemd services.
    • PlanktoScope-specific OS configuration files.

    Everything managed by forklift is version-controlled in a Git repository, enabling easy backup and restoration of forklift-managed configurations even if the PlanktoScope's SD card is wiped and re-flashed.

    "},{"location":"reference/software/architecture/os/#package-management-with-forklift","title":"Package management with forklift","text":"

    When you're just experimenting and you can tolerate the challenges mentioned above, it's fine to customize the PlanktoScope OS by installing software packages using pip directly on the OS and/or by making extensive changes to OS configuration files. However, once you actually care about keeping your customizations around - and especially if/when you want to share your customizations with other people - we recommend migrating those customizations into Forklift packages, which are just files and configuration files stored in a specially-structured Git repository which is also published online (e.g. on GitHub, GitLab, Gitea, etc.). forklift provides an easy way to package, publish, combine, and apply customizations via YAML configuration files in Git repositories; this enables easy sharing, configuration, (re-)composition, and downloading of Docker Compose applications, systemd services, and OS configuration files. Configurations of all deployments of Forklift packages on a computer running the PlanktoScope OS are specified and integrated in a single Git repository, a Forklift pallet. At any given time, each PlanktoScope has exactly one Forklift pallet deployed; switching between Forklift pallets (whether to try out a different set of customizations or to upgrade/downgrade all programs and OS configurations managed by Forklift) is easy and can be done by running just one command (forklift pallet switch, described below in the Applying published customizations subsection).

    forklift is used very differently compared to traditional Linux system package managers like APT, for which you must run step-by-step commands in order to modify the state of your system (e.g. to install some package or install some other package). When using forklift, you instead edit configuration files which declare the desired state of your system (though some step-by-step commands are also provided by forklift to make editing of files easier), and then you ask forklift to try to reconcile the actual state of your system with the desired state. If you've worked with Hashicorp Terraform/OpenTofu before, this may sound very familiar to you - in fact, several aspects of forklift's design were inspired by Terraform.

    "},{"location":"reference/software/architecture/os/#dependency-management","title":"Dependency management","text":"

    forklift is simpler than traditional package managers in some notable ways, including in the concept of dependencies between packages. For example, Forklift packages cannot specify dependencies on other Forklift packages; instead, they may declare that they depend on certain resources - and you must declare a deployment of some other package which provides those resources. And although forklift checks whether resource dependencies between package deployments are satisfied, it does not attempt to solve unmet dependencies. If you've worked with the Go programming language before, resource dependency relationships among Forklift packages are analogous to the relationships between functions which require arguments with particular interfaces and the types which implement those interfaces, with Forklift resources being analogous to Go interfaces.

    This design is intended to facilitate replacement of particular programs with modified or customized versions of those programs. For example, a Forklift package could be declared as providing the same API on the same network port as some other package, so that one package can be substituted for the other while still maintaining compatibility with some other program which relies on the existence of that API. forklift also checks these resource declarations to ensure that any two packages which would conflict with each other (e.g. by trying to listen on the same network port) will be prevented from being deployed together.

    "},{"location":"reference/software/architecture/os/#making-publishing-customizations","title":"Making & publishing customizations","text":"

    The workflow with forklift for developing/testing OS customizations, such as new package deployments or non-standard configurations of existing package deployments or substitutions of existing package deployments, is as follows:

    • Initialize a custom pallet based on (i.e. layered over) an existing pallet, using the forklift pallet init command (e.g. forklift pallet init --from github.com/PlanktoScope/pallet-standard@stable --as github.com/ethanjli/custom-pallet to make a starter which will be a customization of the latest stable version of the github.com/PlanktoScope/pallet-standard pallet, and which can be published to github.com/ethanjli/custom-pallet). (Note: the forklift pallet init command is not yet implemented, and pallet layering is not yet implemented; currently, pallets can only be created manually via the filesystem by cloning from an existing Git repository.)

    • Optionally, create new Forklift packages with definitions of Docker Compose applications and/or systemd services and/or OS configuration files, and configure the deployment of those packages by creating particular files in the pallet.

    • Optionally, add published Forklift repositories to the pallet with the forklift pallet add-repo command (e.g. forklift pallet add-repo github.com/ethanjli/pallet-example-minimal@main), so that one or more packages provided by those repositories can be deployed with the pallet by creating one or more package deployment configuration files for each package. The forklift pallet add-repo command is also used to upgrade or downgrade the version of the Forklift repository used by the pallet.

    • Optionally, add one or more files which override files from the existing pallet, in order to override the configurations specified by those files. (Note: file overrides are not yet implemented, because they are part of pallet layering functionality which is not yet implemented.)

    • Stage the pallet to be applied on the next boot of the PlanktoScope OS, with the forklift pallet stage command; when Forklift applies a pallet, it makes the PlanktoScope OS match the configuration of Forklift package deployments specified by the pallet.

    • Use git to commit changes and (ideally) push them to GitHub, in order to publish your customizations for other people to try out.

    (TODO: create a \"tutorial\"-style page elsewhere in this docs site, and link to it from here; it could be as simple as creating a new pallet which adds a new helloworld-style Node-RED dashboard)

    "},{"location":"reference/software/architecture/os/#applying-published-customizations","title":"Applying published customizations","text":"

    The envisioned workflow for applying published customizations (which you or someone else already developed and pushed to a Git repository served by an online host such as GitHub) is only partially implemented so far, but it already works well for basic use-cases - and it is already used as part of the PlanktoScope OS's installation process for setting up the PlanktoScope OS over a Raspberry Pi OS image:

    • Stage the customized pallet to be applied on the next boot of the PlanktoScope OS, using the forklift pallet switch command (e.g. forklift pallet switch github.com/PlanktoScope/pallet-segmenter@edge to use the latest development/unstable version of the github.com/PlanktoScope/pallet-segmenter pallet).

    • Reboot the Raspberry Pi computer to apply the staged pallet. If the staged pallet cannot be successfully applied during boot, on subsequent boots forklift will instead apply the last staged pallet which was successfully applied. (Note: only a failure to update the Docker containers running on the OS is detected as a failed attempt to apply the staged pallet; if you cause problems with the systemd services or other OS configurations provided by your pallet but the Docker containers are all correctly updated, the pallet will still be considered to have been successfully applied.)

    (TODO: create a \"tutorial\"-style page elsewhere in this docs site, and link to it from here; it could just be a pallet which reconfigures the docs-site deployment to serve the full site with hardware instructions, and which includes https://hub.docker.com/r/linuxserver/firefox or https://github.com/linuxserver/docker-chromium and/or https://github.com/linuxserver/docker-webtop and/or ZeroTier and/or an ML classifier GUI and/or Jupyter Tensorflow)

    Note: currently all of forklift's functionality is only exposed through a command-line interface, but after the forklift tool stabilizes we plan to add a web browser-based graphical interface for use by a general audience.

    "},{"location":"reference/software/architecture/os/#planktoscope-specific-hardware-abstraction","title":"PlanktoScope-specific hardware abstraction","text":"

    PlanktoScope-specific hardware modules are abstracted by PlanktoScope-specific programs which expose high-level network APIs (typically using MQTT and/or HTTP); other programs should use these APIs in order to interact with the PlanktoScope-specific hardware modules. To provide these APIs, the PlanktoScope OS adds the following services (beyond what is already provided by the default installation of the Raspberry Pi OS):

    • gpsd: for providing an abstraction for the PlanktoScope's GPS receiver.

    • chronyd: for managing synchronization of the Raspberry Pi's system clock with the PlanktoScope's GPS receiver and with any time sources available over the Internet.

    • The PlanktoScope hardware controller: for controlling PlanktoScope-specific hardware modules and abstracting them into high-level network APIs for other programs to interact with.

    "},{"location":"reference/software/architecture/os/#user-interface","title":"User interface","text":"

    Traditional operating systems provide a desktop environment with a graphical user interface for operating the computer. By contrast, the PlanktoScope OS provides a set of web browser-based graphical user interfaces for operating the PlanktoScope. This approach was chosen for the following reasons:

    • Most people already have a personal computing device (e.g. a phone or laptop). By relying on the user's personal computing device as the graphical interface for the PlanktoScope's software, the PlanktoScope project can reduce hardware costs by omitting a display from the PlanktoScope hardware.

    • The PlanktoScope's computational resources are limited and may often need to be fully used for data processing tasks. By offloading real-time interaction (such as rendering of the graphical display, and handling of mouse and keyboard events) to a separate device, we can ensure a smooth user experience even when the PlanktoScope's Raspberry Pi computer is busy with other work.

    • When the PlanktoScope is connected to the internet, its web browser-based graphical interfaces can be accessed remotely over the internet from other web browsers. This can be easier to set up - and have lower bandwidth requirements and higher responsiveness - compared to a remote-desktop system for remotely accessing a Raspberry Pi's graphical desktop. This is especially relevant when the PlanktoScope is deployed in a setting where it only has a relatively low-bandwidth internet connection.

    The PlanktoScope OS adds the following network services which provide web browser-based graphical user interfaces to help users operate the PlanktoScope:

    • A Node-RED server which serves over HTTP the PlanktoScope Node-RED dashboard, a graphical interface for end-users to operate the PlanktoScope for image acquisition and image processing.

    • A datasets file browser for viewing, managing, uploading, and downloading image dataset files on the PlanktoScope. These files are generated and used by the PlanktoScope hardware controller and the PlanktoScope segmenter.

    • device-portal: a landing page with links for end-users to quickly access the various web browser-based interfaces mentioned above.

    Note: we will probably simplify things by consolidating some of these components together into the PlanktoScope's Node-RED dashboard.

    The PlanktoScope OS also provides various tools with web browser-based interfaces to aid with system administration and troubleshooting:

    • Cockpit: for performing system-administration tasks such as monitoring system resources, managing system services, viewing system logs, and executing commands in a terminal.

    • A system file browser for viewing, managing, editing, uploading, and downloading any file on the PlanktoScope.

    • A log file browser for viewing, downloading, and deleting log files files generated by the PlanktoScope hardware controller.

    • Dozzle: for viewing and monitoring logs of Docker containers.

    • Grafana: for monitoring and exploring metrics stored in Prometheus.

    Finally, the PlanktoScope OS adds some command-line tools (beyond what is already provided by the default installation of the Raspberry Pi OS) for administrative tasks which system administrators, software developers, and advanced users may need to use:

    • vim: for editing text files.

    • byobu: for running processes persistently across ephemeral terminal sessions.

    • git: for interacting with Git repositories.

    • w3m and lynx: for interacting with web pages (such as Wi-Fi network captive portals) from the PlanktoScope.

    • docker: for managing and inspecting Docker containers.

    "},{"location":"reference/software/architecture/os/#networking","title":"Networking","text":"

    The PlanktoScope is often deployed in settings with limited or unstable internet access, and also in settings with no internet access at all. The PlanktoScope also needs to be deployable in remote settings where the user needs to control the PlanktoScope without being physically present. In both types of situations, the PlanktoScope's web browser-based interfaces need to remain accessible.

    We solve this problem by allowing the PlanktoScope to connect to the internet over a known Wi-Fi network, and/or over Ethernet, so that the PlanktoScope's web browser-based interfaces can be accessed over the internet; and by making the PlanktoScope bring up a Wi-Fi hotspot (more formally, a wireless access point) using the Raspberry Pi's integrated Wi-Fi module in the absence of any known Wi-Fi network, so that the web browser-based interfaces can be accessed over the Wi-Fi hotspot.

    When a device connects directly to the PlanktoScope (e.g. via the PlanktoScope's Wi-Fi hotspot, or via an Ethernet cable), the PlanktoScope acts as a DHCP server to assign itself certain static IP addresses (e.g. 192.168.4.1) and as a DNS server to assign itself certain domain names (e.g. home.pkscope), so that user can locate and open the PlanktoScope's web browser-based interfaces via those domain names. The PlanktoScope also announces itself under certain mDNS names (e.g. pkscope.local) which may work on networks where the PlanktoScope does not have a static IP address (e.g. because the PlanktoScope is connected to an existing Wi-Fi network).

    When the PlanktoScope both has internet access and has devices connected to it (e.g. over a Wi-Fi hotspot or over Ethernet), the PlanktoScope shares its internet access with all connected devices, to enable the user to access web pages even when connected to the PlanktoScope. This is implemented in the PlanktoScope OS with network configurations for the PlanktoScope to act as a network router using Network Address Translation when it has internet access.

    The standard PlanktoScope OS adds the following systemd services (beyond what is already provided by the default installation of the Raspberry Pi OS) for managing the PlanktoScope's network connectivity:

    • autohotspot (which in turn launches hostapd): a PlanktoScope-specific daemon for automatically checking the presence of known Wi-Fi networks, automatically connecting to any known Wi-Fi networks, and falling back to creating a Wi-Fi hotspot when no known Wi-Fi networks are present.

    • enable-interface-forwarding: configures the Linux kernel firewall's IP packet filter rules to forward packets between the Raspberry Pi's network interfaces, to allow the Raspberry Pi to act as a network router.

    • dnsmasq: for allowing computers connected to the PlanktoScope over a network to access the PlanktoScope using domain names defined on the PlanktoScope.

    • firewalld: a network firewall (currently disabled by default).

    The standard PlanktoScope OS also adds the following systemd services for dynamically updating the system's network configuration during boot:

    • generate-machine-name: generates a human-readable machine name at /run/machine-name from the Raspberry Pi's serial number (or, if that's missing, from /etc/machine-d).

    • generate-hostname-templated: generates a temporary hostname file (which is used by a symlink at /etc/hostname) from /etc/hostname-template, which can include the machine name from /run/machine-name.

    • update-hostname: updates systemd-hostnamed so that the hostname matches what is specified by /etc/hostname.

    • assemble-dnsmasq-config-templated: generates a temporary dnsmasq drop-in config file (which is used by a symlink at /etc/dnsmasq.d/40-generated-templated-config) from drop-in config file templates at /etc/dnsmasq-templates.d.

    • assemble-hostapd-config-templated: generates a temporary hostapd drop-in config file (which is used by a symlink at /etc/hostapd/hostapd.conf.d/60-generated-templated.conf) from drop-in config file templates at /etc/hostapd/hostapd.conf-templates.d.

    • assemble-hostapd-config: generates a temporary hostapd config file (which is used by a symlink at /etc/hostapd/hostapd.conf) from drop-in config files at /etc/hostapd/hostapd.conf.d.

    • assemble-hosts-templated: generates a temporary hosts drop-in snippet (which is used by a symlink at /etc/hosts.d/50-generated-templated) from drop-in hosts snippet templates at /etc/hosts-templates.d.

    • assemble-hosts generates a temporary hosts file (which is used by a symlink at /etc/hosts) from drop-in snippets at /etc/hosts-templates.d.

    The PlanktoScope OS also adds the following common services for integrating network APIs provided by various programs, and to facilitate communication among programs running on the PlanktoScope OS:

    • Mosquitto: a server which acts as an MQTT broker. This is used by the PlanktoScope hardware controller and segmenter (described below) to receive commands and broadcast notifications. This is also used by the PlanktoScope's Node-RED dashboard (described below) to send commands and receive notifications.

    • Caddy with the caddy-docker-proxy plugin: an HTTP server which acts as a reverse proxy to route all HTTP requests on port 80 from HTTP clients (e.g. web browsers) to the appropriate HTTP servers (e.g. the Node-RED server, Prometheus, and the PlanktoScope hardware controller's HTTP-MJPEG camera preview stream) running on the PlanktoScope.

    "},{"location":"reference/software/architecture/os/#filesystem","title":"Filesystem","text":"

    The PlanktoScope OS's filesystem makes some changes from the default Debian/Raspberry Pi OS filesystem structure so that /etc and /usr can be managed by Forklift while still being directly customizable by the system administrator. Specifically, a number of systemd services in the PlanktoScope OS run during early boot to:

    • Make a read-only mount (via the overlay-sysroot systemd service) of the initial root filesystem, at /sysroot.

    • Make a read-only mount of the next Forklift pallet to be applied (via the bindro-run-forklift-stages-current.service) from a subdirectory within /var/lib/forklift/stages to /run/forklift/stages/current.

    • Remount /usr (via the overlay-usr systemd service) as a writable overlay with a Forklift-managed intermediate layer (in a subdirectory within /var/lib/forklift/stages which can also be accessed at /run/forklift/stages/current/exports/overlays/usr) and /sysroot/usr as a base layer; any changes made by the system administrator to files in /usr will be transparently stored by the overlay in /var/lib/overlays/overrides/usr. This allows Forklift to provide extra files in /usr in an atomic way, while overrides made by the system administrator are stored separately.

    • Remount /etc (via the overlay-etc systemd service) as a writable overlay with a Forklift-managed intermediate layer (in a subdirectory within /var/lib/forklift/stages which can also be accessed at /run/forklift/stages/current/exports/overlays/etc) and /sysroot/etc as a base layer; any changes made by the system administrator to files in /etc will be transparently stored by the overlay in /var/lib/overlays/overrides/etc. This allows Forklift to provide extra files in /etc in an atomic way, while overrides made by the system administrator are stored separately.

    • Make a writable mount of /var/lib/forklift/stages to /home/pi/.local/share/forklift/stages (via the bind-.local-share-forklift-stages@home-pi systemd service) so that, when the pi user runs forklift commands like forklift pallet switch, those commands will update /var/lib/forklift/stages - and without requiring the use of sudo.

    • Update systemd (via the start-overlaid-units systemd service) with any new systemd units provided via Forklift, so that they will run during boot.

    Beyond what is required by the Linux Filesystem Hierarchy Standard, the PlanktoScope OS sets the following conventions related to filesystem paths:

    • Scripts which are provided by Forklift and only used as part of systemd services should be provided in /usr/libexec, Forklift packages should export those scripts to overlays/usr/libexec (so, for example, they will be accessible in /run/forklift/stages/current/exports/overlays/usr/libexec).

    • Systemd units provided by Forklift should be provided in /usr/lib/systemd/system, and Forklift packages should export those units to overlays/usr/lib/systemd/system. Symlinks to enable those units should be provided in /etc/systemd/system, and Forklift packages should export those scripts to overlays/etc/systemd/system.

    • Forklift-provided systemd services which dynamically generate temporary files meant to be used in /etc should generate those temporary files at stable paths in /run/overlays/generated/etc. Forklift packages which provide such systemd services should also provide relative symlinks into those temporary files in /run/overlays/generated/etc to be exported into overlays/etc as overlays for the corresponding paths in /etc. For example, if a package provides a service to dynamically generate a hosts file meant to be used as /etc/hosts, that service should generate the file in /run/overlays/generated/etc/hosts and the package should export a symlink at overlays/etc/hosts which points to ../../run/overlays/generated/etc/hosts, so that /etc/hosts will be a symlink pointing to /run/overlays/generated/etc/hosts.

    "},{"location":"reference/software/architecture/os/#observability-telemetry","title":"Observability & telemetry","text":"

    Although it is not a high priority yet, we would like to enable operators of large (>10) collections of PlanktoScopes to easily log and monitor the health and utilization of each PlanktoScope and to investigate issues with their PlanktoScopes, regardless of whether each PlanktoScope is deployed locally or remotely. The PlanktoScope OS currently includes the following common services to support system observability and telemetry both for the PlanktoScope OS as a system and for programs running on the PlanktoScope OS:

    • Prometheus: a server for collecting and storing metrics and for exposing metrics over an HTTP API.

    • Prometheus node exporter: for measuring computer hardware and OS monitoring metrics and exposing them over a Prometheus-compatible HTTP API.

    In the future, we will instrument other PlanktoScope-specific programs (especially the PlanktoScope hardware controller) to export various metrics for Prometheus to collect and expose.

    "},{"location":"reference/software/architecture/os/#data-processing","title":"Data processing","text":"

    Because the PlanktoScope collects raw image datasets which are often too large to transfer efficiently over low-bandwidth or intermittent internet connections, the PlanktoScope needs to be able to process raw image data into lower-bandwidth data (e.g. cropped and segmented images of particles in the raw images, or even just counts of different classes of particles) without internet access. In other words, the PlanktoScope must support on-board data processing at the edge. The PlanktoScope OS adds the following services for on-board processing of data generated by the PlanktoScope:

    • The PlanktoScope segmenter: for processing raw image datasets acquired by the PlanktoScope hardware controller to detect and extract particles from raw images.

    Note: in the future, the PlanktoScope OS will add more on-board services for processing the outputs of the PlanktoScope segmenter, and the PlanktoScope OS may also provide hardware abstractions (such as for AI accelerator modules) to support the deployment of neural-network models for data processing.

    "},{"location":"reference/software/architecture/os/#security","title":"Security","text":"

    Currently, the PlanktoScope OS lacks basic security measures to make it safe for them to be connected to the internet; currently it is the responsibility of system administrators to add extremely basic risk mitigations, for example by:

    • Changing the password of the pi user away from the default of copepode.

    • Password-protecting the Node-RED dashboard editor, which can be used to execute arbitrary commands with root permissions.

    • Setting firewall rules.

    • Changing the password of the Wi-Fi hotspot away from the default of copepode, or disabling Wi-Fi hotspot functionality.

    Other risk mitigations will require deeper changes to the PlanktoScope OS, such as:

    • Limiting the permissions and capabilities made available to various system services which currently run with root permissions

    • Password-protecting web browser-based user interfaces

    • Password-protecting network APIs.

    We would like to start taking even just the very basic steps listed above to improve security, but security is not yet a high-enough priority for us to work on it with the limited resources available to us \ud83d\ude43 - if you're interested in computer/network security and you'd like to help us as a volunteer on this project, please contact us!

    "},{"location":"reference/software/functionalities/camera-settings/","title":"Camera Settings","text":"

    This document explains how the PlanktoScope software controls the PlanktoScope's camera using the camera settings exposed by the \"Optic Configuration\" page of the PlanktoScope's Node-RED dashboard.

    The following camera settings can be adjusted via the Node-RED dashboard:

    • \"ISO\" & \"Shutter Speed\" control the brightness of images captured by the camera.

    • \"Auto White Balance\", \"WB: Red\", and \"WB: Blue\" control the color balance of images captured by the camera.

    "},{"location":"reference/software/functionalities/camera-settings/#image-brightness","title":"Image brightness","text":"

    The Node-RED dashboard's \"Shutter Speed\" setting, which is specified in units of microseconds (\u03bcs), is used to set the ExposureTime control with the picamera2 library; a higher value for this setting will make captured images brighter and - when objects are moving - blurrier. To prevent the camera from capturing blurry images of moving objects, the value of this setting should be minimized; usually the default value of 125 \u03bcs is appropriate. For a detailed explanation of the exposure time of the camera sensor, refer to the picamera library's discussion of \"exposure time\".

    The Node-RED dashboard's \"ISO\" setting is divided by 100 and used to set the AnalogueGain control with the picamera2 library; a higher value for this setting will make the camera sensor more sensitive to light, and thus make captured images brighter and noisier. To prevent the camera from capturing excessively dark images - which will prevent the PlanktoScope's segmenter from correctly detecting objects - the value of this setting should not be too low. To prevent the camera from \"washing out\" images by making everything excessively bright - which will destroy visual detail in the images - the value of this setting should not be too high, either. For a detailed explanation of the analog gain of the camera sensor, refer to the picamera library's discussion of \"sensor gain\" and the picamera2 library's discussion of the AnalogueGain control and the DigitalGain property.

    "},{"location":"reference/software/functionalities/camera-settings/#image-color-balance","title":"Image color balance","text":"

    The PlanktoScope's camera can operate with \"Automatic White Balance\" mode either enabled or disabled. In \"Automatic White Balance\" mode, the camera ignores any manually-set white-balance settings and instead applies an adaptive algorithm to automatically (and gradually) correct the color balance of the images to prevent them from appearing more red or more blue than we would expect the images to be. However, \"Automatic White Balance\" mode prevents images from having consistent calibrations, so we recommend always disabling \"Automatic White Balance\" mode when collecting data with the PlanktoScope, and instead manually calibrating the camera's white-balance settings.

    The camera's manual white-balance settings consist of two normalized color values, which are the red gain (\"WB: Red\" in the Node-RED dashboard) and the blue gain (\"WB: Blue\" in the Node-RED dashboard). The red gain can be understood as a multiplier applied to the image to achieve the desired ratio between the redness of the image and the greenness of the image, so a higher value will make the image appear redder. Similarly, the blue gain can be understood as a multiplier applied to the image to achieve the desired ratio between the blueness of the image and the greenness of the image, so a higher value will make the image appear bluer. For a deeper conceptual explanation of white balance, refer to the first two pages of Freescale Semiconductor's application note on white balance and color correction in digital cameras.

    "},{"location":"reference/software/functionalities/sample-imaging/","title":"Sample Imaging","text":"

    This document explains how the PlanktoScope software captures images of samples and how it uses the image-acquisition settings exposed by the \"Fluidic Acquisition\" page of the PlanktoScope's Node-RED dashboard.

    Currently, the PlanktoScope software only has one sample-imaging mode, which we call \"stop-flow imaging\":

    "},{"location":"reference/software/functionalities/sample-imaging/#stop-flow-imaging","title":"Stop-flow imaging","text":"

    This imaging mode is optimized to allow capture of high-quality images using low-cost, high-resolution camera modules such as the Raspberry Pi Camera Module 2 and the Raspberry Pi High Quality Camera (refer to the hardware product specifications to see which camera modules are used in each version of the PlanktoScope hardware), whose rolling-shutter designs can introduce artifacts around moving objects while the camera is capturing an image.

    When this imaging mode is started, the PlanktoScope will repeatedly perform the following sequence of actions until a desired number of images (\"Number of images to acquire\" in the Node-RED dashboard) is captured:

    1. The PlanktoScope's pump will pull some fixed volume of sample (\"Pumped volume\" in the Node-RED dashboard, in units of mL) from the sample intake and move the same volume of sample down through the PlanktoScope's flowcell.

    2. After the PlanktoScope's pump finishes pumping the specified volume, the pump will stop and the PlanktoScope will wait for some short fixed duration of time (\"Delay to stabilize image\" in the Node-RED dashboard, in units of seconds). This waiting period is intended to allow the sample in the PlanktoScope's flowcell to stop flowing, so that all objects in the camera's field-of-view will (hopefully) stop moving - because moving objects will cause distortion effects to appear in images captured with rolling-shutter cameras such as those used in the PlanktoScope.

    3. The PlanktoScope will capture and save an image of its entire field-of-view.

    "},{"location":"reference/software/functionalities/segmentation/","title":"Image Segmentation","text":"

    This document explains how the PlanktoScope software's segmenter program processes raw images (captured by the PlanktoScope's sample-imaging functionality) in order to detect objects - such as plankton, microplastics, and other particles - and to extract each object into its own segmented image for downstream use, such as for uploading to EcoTaxa. This document also lists and explains the metadata fields added by the PlanktoScope segmenter for uploading to EcoTaxa.

    Currently, the segmenter only operates in batch-processing mode: the segmenter takes as input a complete raw image dataset, and it produces as output a complete segmented object dataset as well as an export archive of segmented objects which can be uploaded to EcoTaxa.

    When the segmenter starts, it will perform a median-calculation step on the first ten images of the dataset of raw images. The median-calculation step outputs a median image which is then used as an input for an image-correction step on each raw image; the median image will occasionally be recalculated (conditions triggering a recalculation are described below). Each image-cleaning step outputs a median-corrected image is then used as the input for a mask-calculation step. Each mask-calculation step outputs a segmentation mask which is then used as an input for an object-extraction step.

    For each raw image from the input dataset, after the object-extraction step outputs a set of objects, the number of extracted objects is accumulated into a cumulative moving average of the number of objects extracted per raw image. However, before the cumulative moving average is updated, the number of extracted objects is compared against the previous value of the cumulative moving average (calculated after the previous raw image was processed): if the number of extracted objects is greater than the previous value of the cumulative moving average by more than 20, then the median image will be recalculated for the next raw image. The input for the next median-calculation step will usually be the next 10 consecutive raw images, unless the next raw image is one of the last 10 raw images - in which case the previous ten images will instead be used as the input for the next median-calculation step. Yes, this logic is complicated, and yes, for some reason we don't center the sequence of raw images around the next raw image as our input to the median-calculation step.

    "},{"location":"reference/software/functionalities/segmentation/#median-calculation-step","title":"Median-calculation step","text":"

    The median-calculation step takes as input a sequence of consecutive raw images, but if the image sequence consists of an even number of images then the last image is excluded from the calculation. The median-calculation step uses the raw images to calculate a median image, in which the color of each pixel of the output is calculated as the median of the colors of the corresponding pixels in the input images.

    The output of this step is supposed to be an estimate of what the the \"background\" of the image would be if there were no objects within the field-of-view. However, this step is not robust to sample density: if a sample is dense enough that certain pixel locations overlap with objects in more than half of any consecutive sequence of ten images, the color of the \"background\" in those pixel locations will be estimated as the color of an object in one of those images.

    "},{"location":"reference/software/functionalities/segmentation/#image-correction-step","title":"Image-correction step","text":"

    The image-correction step takes as input a median image and a raw image. First, the image-correction step divides the color of each pixel of the raw image by the color of the corresponding pixel of the median image; this is probably intended to correct for inhomogeneous illumination in the raw image, and to remove any objects which had been stuck to the flow cell (and thus were included in the median image) from the raw image. Next, the image-correction step slightly rescales the intensity range of the resulting image (TODO: determine what the effect of this intensity-rescaling operation is - does it make the image brighter or dimmer? Does it increase or decrease the contrast? Does it clip the white value? Why is this step performed???). The final result is a median-corrected image.

    "},{"location":"reference/software/functionalities/segmentation/#mask-calculation-step","title":"Mask-calculation step","text":"

    The mask-calculation step takes as input a median-corrected image and the result from the previous mask-calculation step. It consists of the following operations:

    1. \"Simple threshold\": this operation applies a global threshold to the input corrected image, using the triangle algorithm to calculate an optimal threshold value for the image; the output is a mask in which each pixel is set to 0 if the corresponding pixel of the input image is greater than the threshold, and to 255 otherwise. The resulting mask should select for objects which appear darker than the background of the image.

    2. \"Remove previous mask\": this operation combines the result of the previous mask-calculation step with the mask created by the previous \"simple threshold\" operation, by subtracting the intersection of the two masks from the mask created by the previous \"simple threshold\" operation. This operation is probably intended to remove objects which had been stuck to the PlanktoScope's flowcell during imaging and thus might appear in many consecutive input corrected images. However, this operation is not robust in dense samples where two different objects might appear in overlapping locations across two consecutive raw images.

    3. \"Erode\": this operation erodes the mask with a 2-pixel-by-2-pixel square kernel. In the resulting mask, small regions (such as thresholded noise) are eliminated.

    4. \"Dilate\": this operation dilates the mask with an 8-pixel-diameter circular kernel. In the resulting mask, regions remaining after the previous \"erode\" operation are padded with a margin.

    5. \"Close\": this operation dilates and then erodes the mask with an 8-pixel-diameter circular kernel. In the resulting mask, small holes in regions remaining after the previous \"dilate\" operation are eliminated.

    6. \"Erode2\": this operation erodes the mask with an 8-pixel-diameter circular kernel, inverting the effect of the previous \"dilate\" operation.

    The final result these operations is a spatially-filtered segmentation mask where the value of each pixel represents whether that pixel is part of an object or part of the background of the input corrected image.

    "},{"location":"reference/software/functionalities/segmentation/#object-extraction-step","title":"Object-extraction step","text":"

    The object-extraction step takes the following inputs:

    • A median-corrected image

    • A segmentation mask

    • The following sample metadata fields:

    • acq_minimum_mesh: the diameter of the smallest spherical object which is expected to be in the sample, usually 20 \u00b5m. This value is set on the \"Fluidic Acquisition\" page of the PlanktoScope's Node-RED dashboard as the \"Min fraction size\".

    • process_pixel: the pixel size calibration of the PlanktoScope, in units of \u00b5m per pixel; then the area (in units of \u00b5m2) per pixel is process_pixel * process_pixel. This value is set on the \"Hardware Settings\" page of the PlanktoScope's Node-RED dashboard as the \"Pixel size calibration: um per pixel\".

    First, the object-extraction step calculates a minimum-area threshold for objects to extract using the input segmentation mask: the threshold (in units of pixel2) is calculated as (2 * acq_minimum_mesh / process_pixel) ^ 2.

    Next, the object-extraction step identifies all connected regions of the input segmentation mask and measures properties of those regions. The object-extraction step then discards any region whose bounding-box area (area_bbox in scikit-image) is less than the minimum-area threshold.

    "},{"location":"reference/software/functionalities/segmentation/#metadata-calculation","title":"Metadata calculation","text":"

    For each resulting region after the minimum-area threshold is applied, that region will be used to extract a segmented and cropped image of the object (including pixels in any holes in the object) from the input median-corrected image. This cropped image is used to calculate some metadata fields about the distribution of colors in the object's segmented image:

    • MeanHue: the mean of the hue channel of the image in a hue-saturation-value (HSV) representation of the image

    • StdHue: the standard deviation of the hue channel of the image in an HSV representation of the image

    • MeanSaturation: the standard deviation of the saturation channel of the image in an HSV representation of the image

    • StdSaturation: the standard deviation of the saturation channel of the image in an HSV representation of the image

    • MeanValue: the standard deviation of the value channel of the image in an HSV representation of the image

    • StdValue: the standard deviation of the value channel of the image in an HSV representation of the image

    Additionally, some metadata for the object is calculated from the region properties calculated by scikit-image for that object's region:

    • label: The identifier of the object's region, as assigned by scikit-image. This corresponds to the label region property in scikit-image.

    • Basic area properties:

    • area_exc: Number of pixels in the region (excluding pixels in any holes). This corresponds to the area region property in scikit-image.

    • area: Number of pixels of the region with all holes filled in (i.e. including pixels in any holes). This corresponds to the area_filled region property in scikit-image. Yes, it's somewhat confusing that the PlanktoScope segmenter renames scikit-image's area region property to area_exc and renames scikit-image's area_filled region property to area.

    • %area: Ratio between the number of pixels in any holes in the region and the total number of pixels of the region with all holes filled in; calculated as 1 - area_exc / area. In other words, this represents the proportion of the region which consists of holes. Yes, %area is a misleading name both because of the % in the name and because of the area in the name.

    • Equivalent-circle properties:

    • equivalent_diameter: The diameter (in pixels) of a circle with the same number of pixels in its area as the number of pixels in the region (excluding pixels in any holes). This corresponds to the equivalent_diameter_area property in scikit-image.

    • Equivalent-ellipse properties:
    • eccentricity: Eccentricity of the ellipse that has the same second-moments as the region; eccentricity is the ratio of the focal distance (distance between focal points) over the major axis length. The value is in the interval [0, 1), where a value of 0 represents a circle. This corresponds to the eccentricity property in scikit-image.

    • major: The length (in pixels) of the major axis of region's equivalent ellipse. This corresponds to the axis_major_length property in scikit-image.

    • minor: The length (in pixels) of the minor axis of the region's equivalent ellipse. This corresponds to the axis_minor_length property in scikit-image.

    • elongation: The ratio between major and minor.

    • angle: Angle (in degrees) between the x-axis of the input median-corrected image and the major axis of the region's equivalent ellipse. Values range from 0 deg to 180 deg counter-clockwise. This is calculated from the orientation property in scikit-image.

    • Equivalent-object perimeter properties:

    • perim.: Perimeter (in pixels) of an object which approximates the region's contour as a line through the centers of border pixels using a 4-connectivity. This corresponds to the perimeter property in scikit-image.

    • perimareaexc: Ratio between the perimeter and the number of pixels in the region (excluding pixels in any holes). Calculated as perim. / area_exc.

    • perimmajor: Ratio between the perimeter and the length of the major axis of the region's equivalent ellipse. Calculated as perim. / major.

    • circ.: The roundness of the region's equivalent object, including pixels in any holes. Calculated as 4 * \u03c0 * area / (perim. * perim.). Ranges from 1 for a perfect circle to 0 for highly non-circular shapes.

    • circex: The roundness of the region's equivalent object, excluding pixels in any holes. Calculated as 4 * \u03c0 * area_exc / (perim. * perim.). Ranges from 1 for a perfect circle to 0 for highly non-circular shapes or shapes with many large holes.

    • Bounding box (the smallest rectangle which includes all pixels of the region, under the constraint that the edges of the box are parallel to the x- and y-axes of the input median-corrected image) properties:

    • bx: x-position (in pixels) of the top-left corner of the region's bounding box, relative to the top-left corner of the input median-corrected image. This corresponds to the second element of the bbox property in scikit-image.

    • by: y-position (in pixels) of the top-left corner of the region's bounding box, relative to the top-left corner of the input median-corrected image. This corresponds to the first element of the bbox property in scikit-image.

    • width: Width (in number of pixels) of the region's bounding box. This is calculated from the elements of the bbox property in scikit-image.

    • height: Height (in number of pixels) of the region's bounding box. This is calculated from the elements of the bbox property in scikit-image.

    • bounding_box_area: Number of pixels in the region's bounding box; equivalent to width * height. This corresponds to the area_bbox region property in scikit-image.

    • extent: Ratio between the number of pixels in the region (excluding pixels in any holes) and the number of pixels in the region's bounding box; equivalent to area_exc / bounding_box_area. This corresponds to the extent region property in scikit-image.

    • Convex hull (the smallest convex polygon which encloses the region) properties:

    • convex_area: Number of pixels in the convex hull of the region. This corresponds to the area_convex region property in scikit-image.

    • solidity: Ratio between the number of pixels in the region (excluding pixels in any holes) and the number of pixels in the convex hull of the region. Equivalent to area_exc / convex_area. This corresponds to the solidity region property in scikit-image.

    • Unweighted centroid properties:

    • x: x-position (in pixels) of the centroid of the object, relative to the top-left corner of the input median-corrected image. This corresponds to the second element of the centroid region property in scikit-image.

    • y: y-position (in pixels) of the centroid of the object, relative to the top-left corner of the input median-corrected image. This corresponds to the first element of the centroid region property in scikit-image.

    • local_centroid_col: x-position (in pixels) of the centroid of the object, relative to the top-left corner of the region's bounding box; equivalent to x - bx. This corresponds to the second element of the centroid_local region property in scikit-image.

    • local_centroid_row: y-position (in pixels) of the centroid of the object, relative to the top-left corner of the region's bounding box; equivalent to y - by. This corresponds to the first element of the centroid_local region property in scikit-image.

    • Topological properties:

    • euler_number: The Euler characteristic of the set of non-zero pixels. Computed as the number of connected components subtracted by the number of holes (with 2-connectivity). This corresponds to the euler_number property in scikit-image.

    "},{"location":"reference/software/functionalities/segmentation/#output-image-cropping","title":"Output image cropping","text":"

    Finally, a segmented and cropped image of the object (including pixels in any holes in the object) is saved from the input median-corrected image, but with the crop expanded by up to 10 pixels in each direction (TODO: check whether this description is accurate - the corresponding code is extremely unreadable).

    Thus, the output of the output-extraction step is a set of objects, each with a corresponding cropped image saved to file and with a corresponding list of metadata values.

    "},{"location":"reference/software/interfaces/exported-metadata/","title":"Exported Metadata","text":"

    TODO

    "},{"location":"reference/software/interfaces/mqtt/","title":"Planktoscope MQTT API Reference","text":"

    The MQTT API is the primary programming interface for controlling the PlanktoScope. The API is served by the PlanktoScope's Python backend, and data is sent across the API with the following architecture:

    flowchart TD\n    API[API Client] -->|Command| Broker[MQTT Broker]\n    Broker -->|Command| Backend[Python Backend]\n    Backend -->|Status Update| Broker[MQTT Broker]\n    Broker -->|Status Update| API

    Most messages in the MQTT API are organized according to a request-response pattern in which the API client sends a command as a request to take some action, and then the Python backend sends one or more responses as status updates about how the Python backend's state has changed as a result of the command:

    • API clients send commands to the Python backend (via the MQTT broker), and receive status updates from the Python backend (also via the MQTT broker). The PlanktoScope's Node-RED dashboard is an API client, but other programs are also allowed to act as API clients.
    • The MQTT broker passes commands and status updates between the API client(s) and the Python backend. The MQTT broker runs on the PlanktoScope and accepts connections from API clients on port 1883.
    • The Python backend handles commands, takes actions (e.g. changing the state of hardware actuators), and publishes status updates both in response to commands and in response to changes in internal state. Currently, parts of the Python backend also act as MQTT API clients to other parts of the Python backend.

    Every MQTT message in the PlanktoScope's MQTT API is published on a specific topic, which is a slash-delimited path of strings (e.g. actuator/pump). Every MQTT message in the PlanktoScope's MQTT API carries a payload, which is a JSON object serialized as a string:

    • Messages which are commands usually specify the type of command in an action field of the payload object; other fields of the payload object are parameters of the command.
    • Messages which are status updates have a single field in the payload object, status, which is a string containing a status or error message.

    In the rest of this reference document, we organize our description of the MQTT API into sections corresponding to distinct functionalities of the Python backend:

    "},{"location":"reference/software/interfaces/mqtt/#pump","title":"Pump","text":"

    The Pump API controls the movement of fluid through the PlanktoScope:

    • MQTT topics for commands: actuator/pump
    • MQTT topics for status updates: status/pump
    • Commands: move, stop
    "},{"location":"reference/software/interfaces/mqtt/#move-command","title":"move command","text":"

    The move command initiates movement of fluid through the PlanktoScope by driving the PlanktoScope pump's stepper motor. For example, this command makes the pump move 10 mL of fluid forwards through the PlanktoScope's fluidic path, at a rate of 1 mL/min:

    {\n  \"action\": \"move\",\n  \"direction\": \"FORWARD\",\n  \"volume\": 10,\n  \"flowrate\": 1\n}\n

    The move command has the following parameters:

    Field Description Type Accepted Values action Specifies the move command. string move direction Direction to run the pump. string FORWARD, BACKWARD volume Total volume of sample to pump before stopping automatically (mL). float 0 < volume flowrate Speed of pumping (mL/min). float 0 < flowrate \u2264 45 mL/min"},{"location":"reference/software/interfaces/mqtt/#move-command-responses","title":"move command responses","text":"

    The Python backend can send status updates on the status/pump topic, in response to the move command. The status field of such status updates can have any of the following values:

    Status/Error Cause Started The pump has started moving in response to a valid move command. Error, the message is missing an argument One or more required parameters (direction, volume, flowrate) are missing in the move command. Error, The flowrate should not be == 0 An invalid value (0) was provided for the flowrate field. Done The pump has successfully stopped after fully pumping the specified volume of sample.

    Note: the MQTT API does not yet completely specify error messages in response to invalid values for the direction, volume, and flowrate parameters.

    "},{"location":"reference/software/interfaces/mqtt/#stop-command","title":"stop command","text":"

    The stop command interrupts any ongoing movement of fluid through the PlanktoScope and cuts off power to the PlanktoScope pump's stepper motor:

    {\n  \"action\": \"stop\"\n}\n

    The stop command has the following parameters:

    Field Description Type Accepted Values action Specifies the stop command. string stop"},{"location":"reference/software/interfaces/mqtt/#stop-command-responses","title":"stop command responses","text":"

    The Python backend can send status updates on the status/pump topic, in response to the stop command. The status field of such status updates can have any of the following values:

    Status/Error Cause Interrupted The pump has stopped moving in response to a valid stop command, interrupting any ongoing move command.Sent in response to any Pump stop command, and any Imager stop command."},{"location":"reference/software/interfaces/mqtt/#non-response-status-updates","title":"Non-response status updates","text":"

    The Python backend can send status updates on the status/pump topic which are not triggered by any command. The status field of such status updates can have any of the following values:

    Status/Error Cause Ready The backend has become ready to respond to Pump commands. Dead The backend will no longer respond to Pump commands."},{"location":"reference/software/interfaces/mqtt/#focus","title":"Focus","text":"

    The Focus API controls the movement of the sample stage focusing motors in the PlanktoScope:

    • MQTT topics for commands: actuator/focus
    • MQTT topics for status updates: status/focus
    • Commands: move, stop
    "},{"location":"reference/software/interfaces/mqtt/#move-command_1","title":"move command","text":"

    The move command initiates movement of the focusing stage by a specified displacement. For example, this command makes the stage move up by 0.26 mm at a speed of 1 mm/s:

    {\n  \"action\": \"move\",\n  \"direction\": \"UP\",\n  \"distance\": 0.26,\n  \"speed\": 1\n}\n

    The move command has the following parameters:

    Field Description Type Accepted Values action Specifies the move command. string move direction Direction to move the sample stage. string UP, DOWN distance Total distance to move the stage before stopping automatically (in mm). float 0 < distance \u2264 45.0 speed Speed of movement (in mm/s).Defaults to 5. float 0 < speed \u2264 5.0 (optional)"},{"location":"reference/software/interfaces/mqtt/#move-command-responses_1","title":"move command responses","text":"

    The Python backend can send status updates on the status/focus topic in response to the move command. The status field of such status updates can have any of the following values:

    Status/Error Cause Started The focusing motors have started moving in response to a valid move command. Error The move command is missing the distance and/or direction fields. Done The focusing motors have successfully stopped after moving the specified distance."},{"location":"reference/software/interfaces/mqtt/#stop-command_1","title":"stop command","text":"

    The stop command interrupts any ongoing movement of the focusing stage and cuts off power to the focusing motors:

    {\n  \"action\": \"stop\"\n}\n

    The stop command has the following parameters:

    Field Description Type Accepted Values action Specifies the stop command. string stop"},{"location":"reference/software/interfaces/mqtt/#stop-command-responses_1","title":"stop command responses","text":"

    The Python backend can send status updates on the status/focus topic, in response to the stop command. The status field of such status updates can have any of the following values:

    Status/Error Cause Interrupted The focusing motors have stopped moving in response to a valid stop command, interrupting any ongoing stop command."},{"location":"reference/software/interfaces/mqtt/#non-response-status-updates_1","title":"Non-response status updates","text":"

    The Python backend can send status updates on the status/focus topic which are not triggered by any command. The status field of such status updates can have any of the following values:

    Status/Error Description Ready The backend has become ready to respond to Focus commands. Dead The backend will no longer respond to Focus commands."},{"location":"reference/software/interfaces/mqtt/#light","title":"Light","text":"

    The Light API controls the state of the LED lighting system in the PlanktoScope:

    • MQTT topics for commands: actuator/light
    • MQTT topics for status updates: status/light
    • Commands: on, off
    "},{"location":"reference/software/interfaces/mqtt/#on-command","title":"on command","text":"

    The on command turns on the sample illumination LED. For example:

    {\n  \"action\": \"on\"\n  \"led\": \"1\"\n}\n

    The on command has the following parameters:

    Field Description Type Accepted Values action Specifies the on command. string on led Specifies the LED to turn on.Defaults to 1. integer 1\u00a0(optional)"},{"location":"reference/software/interfaces/mqtt/#on-command-responses","title":"on command responses","text":"

    The Python backend can send status updates on the status/light topic in response to the on command. The status field of such status updates can have any of the following values:

    Status/Error Cause Led 1: On The LED turned on successfully. Error with LED number An invalid value was provided for the led field of the command."},{"location":"reference/software/interfaces/mqtt/#off-command","title":"off command","text":"

    The off command turns off the sample illumination LED. For example:

    {\n  \"action\": \"off\"\n}\n

    The off command has the following parameters:

    Field Description Type Accepted Values action Specifies the off command. string off led Specifies the LED to turn on.Defaults to 1 integer 1"},{"location":"reference/software/interfaces/mqtt/#off-command-responses","title":"off command responses","text":"

    The Python backend can send status updates on the status/light topic in response to the off command. The status field of such status updates can have any of the following values:

    Status/Error Cause Led 1: Off The LED turned off successfully. Error with LED number An invalid value was provided for the led field of the command."},{"location":"reference/software/interfaces/mqtt/#non-response-status-updates_2","title":"Non-response status updates","text":"

    The Python backend can send status updates on the status/light topic which are not triggered by any command. The status field of such status updates can have any of the following values:

    Status/Error Description Ready The backend has become ready to respond to Light commands. Dead The backend will no longer respond to Light commands."},{"location":"reference/software/interfaces/mqtt/#imager","title":"Imager","text":"

    The Imager API controls image acquisition with the PlanktoScope's hardware, as well as the PlanktoScope's camera:

    • MQTT topics for commands: imager/image
    • MQTT topics for status updates: status/imager
    • Commands: settings, update_config, image, stop

    For details on how images are acquired, refer to our technical reference on sample imaging in the PlanktoScope.

    Generally, commands should be sent in the following order:

    1. settings command: Configure the camera settings.
    2. update_config command: Update the dataset metadata for the next image acquisition.
    3. image command: Initiate image acquisition.
    4. stop command: Stop any in-progress image acquisition.
    "},{"location":"reference/software/interfaces/mqtt/#settings-command","title":"settings command","text":"

    The settings command changes the camera settings. The fields iso, shutter_speed, white_balance_gain and white_balance are optional - if a field is omitted, its setting will not be changed. Here's an example of a command with values specified for all fields:

    {\n  \"action\": \"settings\",\n  \"settings\": {\n    \"iso\": 100,\n    \"shutter_speed\": 40,\n    \"white_balance_gain\": { \"red\": 100, \"blue\": 100 },\n    \"white_balance\": \"auto\",\n  }\n}\n

    The settings command has the following parameters:

    Parameter Description Type Accepted Values action Specifies the settings command. string settings iso Simulated ISO image sensitivity. int 0 < iso \u2264 650 (higher values may be accepted for certain cameras) (optional) shutter_speed Exposure time (in \u03bcs). int 125 \u2264 shutter_speed\u00a0(optional) white_balance_gain.red White balance red gain. float 0.0 \u2264 white_balance_gain.red\u00a0\u2264 32.0 (optional) white_balance_gain.blue White balance blue gain. float 0.0\u00a0\u2264\u00a0white_balance_gain.blue\u00a0\u2264 32.0 (optional) white_balance White balance mode. (off\u00a0specifies the use of manual white balance gains) string auto, off\u00a0(optional)"},{"location":"reference/software/interfaces/mqtt/#settings-command-responses","title":"settings command responses","text":"

    The Python backend can send status updates on the status/imager topic in response to the settings command. The status field of such status updates can have any of the following values:

    Status/Error Cause Camera settings updated The camera settings have been successfully updated. Camera settings error The settings command is missing required parameters. Iso number not valid The provided iso\u00a0value is not allowed. Shutter speed not valid The provided shutter_speed\u00a0value is not allowed. White balance gain not valid The provided white_balance_gain\u00a0object is not valid or has an invalid value. White balance mode {white_balance} not valid The provided white_balance\u00a0value is not allowed."},{"location":"reference/software/interfaces/mqtt/#update_config-command","title":"update_config command","text":"

    The update_config command sets/changes the metadata which will be saved with the dataset which to be acquired by the next image command. For example:

    {\n  \"action\": \"update_config\",\n  \"config\": {\n    \"sample_project\": \"fairscope bzh\",\n    \"sample_id\": \"fairscope_bzh_estacade\",\n    \"sample_uuid\": \"uuid-1234\",\n    \"sample_ship\": \"Fairscope\",\n    \"sample_operator\": \"jeremy\",\n    \"sample_sampling_gear\": \"net\",\n    \"sample_concentrated_sample_volume\": 70,\n    \"sample_total_volume\": 100,\n    \"sample_dilution_factor\": 10,\n    \"sample_speed_through_water\": \"5 knots\",\n    \"sample_instrument\": \"PlanktoScope v2.6\",\n    \"sample_bottom_depth\": \"N/A\",\n    \"sample_depth_min\": 0.1,\n    \"sample_depth_max\": 0.5,\n    \"sample_temperature\": \"N/A\",\n    \"sample_salinity\": \"N/A\",\n    \"sample_date\": \"2024-05-15\",\n    \"acq_id\": \"fairscope_bzh_estacade_2\",\n    \"acq_instrument\": \"PlanktoScope v2.6\",\n    \"acq_magnification\": \"1.2\",\n    \"acq_camera_id\": \"deep-point-8125\",\n    \"acq_camera_lens\": \"N/A\",\n    \"acq_software\": \"PlanktoScope v2024.0.0-alpha.1\",\n    \"acq_atlas_id\": \"N/A\",\n    \"acq_resolution\": \"1080p\",\n    \"acq_stacks_count\": \"N/A\",\n    \"acq_time_between_frames\": 0.3,\n    \"acq_brightness\": \"N/A\",\n    \"acq_contrast\": \"N/A\",\n    \"acq_sharpness\": \"N/A\",\n    \"acq_saturation\": \"N/A\",\n    \"acq_gamma\": \"N/A\",\n    \"acq_uuid\": \"acq-uuid-5678\",\n    \"acq_volume\": 2.50,\n    \"acq_imaged_volume\": 1.04,\n    \"acq_minimum_mesh\": 300,\n    \"acq_maximum_mesh\": 300,\n    \"acq_min_esd\": 300,\n    \"acq_max_esd\": 300,\n    \"acq_camera_name\": \"HQ Camera\",\n    \"acq_nb_frame\": 500,\n    \"acq_local_datetime\": \"2024-05-15T09:00:00Z\",\n    \"acq_caamera_iso\": 400,\n    \"acq_camera_shutter_speed\": 500,\n    \"object_date\": \"2024-05-15\",\n    \"object_time\": \"09:00:00Z\",\n    \"object_lat\": 48.7273,\n    \"object_lon\": -3.9814,\n    \"object_depth_min\": 0.1,\n    \"object_depth_max\": 0.5,\n    \"process_pixel\": 0.75,\n    \"process_datetime\": \"2024-05-15T09:00:00Z\",\n    \"process_id\": \"Process01\",\n    \"process_uuid\": \"proc-uuid-7890\",\n    \"process_source\": \"https://www.github.com/PlanktonPlanet/PlanktoScope\",\n    \"process_commit\": \"CommitHash\",\n    \"sample_gear_net_opening\": 300,\n    \"object_date_end\": \"2024-05-15\",\n    \"object_time_end\": \"10:00:00Z\",\n    \"object_lat_end\": 48.7274,\n    \"object_lon_end\": -3.9815\n  }\n}\n

    The metadata should contain comprehensive information about the sample, acquisition process, object details, and processing parameters to ensure accurate tracking and reproducibility of the dataset. The update_config command has the following parameters:

    Sample information:

    Field Description Type sample_project Project name. string sample_id Sample identifier. integer sample_uuid Sample UUID. string sample_ship Ship name. string sample_operator Operator name. string sample_sampling_gear Sampling gear description. string sample_concentrated_sample_volume Concentrated sample volume. float sample_total_volume Total volume. float sample_dilution_factor Dilution factor. float sample_speed_through_water Speed through water. float

    Acquisition information:

    Field Description Type acq_id Acquisition identifier. integer acq_instrument Acquisition instrument. string acq_magnification Magnification level. string acq_camera_id Camera identifier. integer acq_camera_lens Camera lens. string acq_software Acquisition software. string acq_volume Acquisition volume. float acq_imaged_volume Imaged volume. float acq_minimum_mesh Minimum mesh size. float acq_maximum_mesh Maximum mesh size. float acq_min_esd Minimum equivalent spherical diameter. float acq_max_esd Maximum equivalent spherical diameter. float acq_camera_name Camera name. string acq_nb_frame Number of frames captured. integer acq_local_datetime Local date and time of acquisition. string acq_camera_resolution Camera resolution. string acq_camera_iso Camera ISO setting. float acq_camera_shutter_speed Camera shutter speed. float

    Object information:

    Field Description Type object_date Date of the object recording. string object_time Time of the object recording. string object_lat Latitude of the sample location. float object_lon Longitude of the sample location. float object_depth_min Minimum depth of the sample location. float object_depth_max Maximum depth of the sample location. float object_date_end End date of the object recording. string object_time_end End time of the object recording. string object_lat_end End latitude of the sample location. float object_lon_end End longitude of the sample location. float

    Processing information:

    Field Description Type process_pixel Pixel processing method. string process_datetime Date and time of processing. string process_id Processing identifier. integer process_uuid Processing UUID. string process_source Source of processing software or method. string process_commit Commit hash of the software used. string"},{"location":"reference/software/interfaces/mqtt/#update_config-command-responses","title":"update_config command responses","text":"

    The Python backend can send status updates on the status/imager topic in response to the update_config command. The status field of such status updates can have any of the following values:

    Status/Error Description Config updated The metadata has been successfully updated. Configuration message error The command is missing the required\u00a0config field. Busy Image acquisition is already in progress, so dataset metadata cannot be changed."},{"location":"reference/software/interfaces/mqtt/#image-command","title":"image command","text":"

    The image command initiates acquisition of one raw image dataset consisting of a specified number of images, via stop-flow imaging. For example, this command initiates acquisition of 200 images, with 1 mL of sample pumped between each image and an image stabilization period of 0.1 seconds between the end of pumping and the triggering of the image capture for each acquired image:

    {\n  \"action\": \"image\",\n  \"pump_direction\": \"FORWARD\",\n  \"volume\": 1,\n  \"nb_frame\": 200,\n  \"sleep\": 0.1\n}\n

    A valid update_config command with a unique (object_date, sample_id, acq_id) combination must be sent some time before each image command. If an update_config command has not been sent before the image command, the image command will trigger a \u201cStarted\u201d response status and then do nothing (this is a software bug which needs to be fixed so that an error status is reported instead).

    The image command has the following parameters:

    Parameter Description Type Accepted Values pump_direction Direction of sample pumping. string FORWARD, BACKWARD. volume Volume (in mL) of sample to pump between each captured image. float 0 < volume nb_frame Number of frames to capture. integer 0 < nb_frame sleep Duration (in s) to wait after pumping has stopped before saving an image, to allow the sample objects to stabilize in the image. float 0 < sleep"},{"location":"reference/software/interfaces/mqtt/#image-command-responses","title":"image command responses","text":"

    The Python backend can send status updates on the status/imager topic, in response to the image command. The status field of such status updates can have any of the following values:

    Status/Error Description Started The image capture process has started successfully. Error At least one field of the\u00a0image\u00a0command is missing or has an invalid value. Error: missing camera No camera is available to use for image acquisition. Configuration update error: object_date is missing! The last time the update_config\u00a0command was sent, it did not have an object_date\u00a0parameter. Configuration update error: Chosen id are already in use! The\u00a0(object_date, sample_id, acq_id)\u00a0combination for the dataset (set by the last update_config\u00a0command) is already used by a previous dataset. Image {index}/{nb_frame} saved to {filename} An image has been successfully captured and saved. Image {index}/{nb_frame} WAS NOT CAPTURED! STOPPING THE PROCESS! An error occurred during image capture; the ongoing image acquisition has finished with failure, resulting in an incomplete dataset. Done The image acquisition finished successfully, resulting in a complete dataset."},{"location":"reference/software/interfaces/mqtt/#stop-command_2","title":"stop command","text":"

    This message interrupts any in-progress image acquisition routine and stops any ongoing sample pumping.

    {\n  \"action\": \"stop\"\n}\n

    The stop command has the following parameters:

    Field Description Type Accepted Values action Specifies the stop\u00a0command. string stop"},{"location":"reference/software/interfaces/mqtt/#stop-command-responses_2","title":"stop command responses","text":"

    The Python backend can send status updates on the status/imager topic, in response to the stop command. The status field of such status updates can have any of the following values:

    Status/Error message Description Interrupted The image capture process was stopped successfully."},{"location":"reference/software/interfaces/mqtt/#non-response-status-updates_3","title":"Non-response status updates","text":"

    The Python backend can send status updates on the status/imager topic which are not triggered by any command. The status field of such status updates can have any of the following values:

    Status/Error Description Starting up The backend will soon attempt to initialize the camera. Error: missing camera A camera was not detected. Ready The camera is now operational, and the backend has become ready to respond to Imager commands. Dead The backend will no longer respond to Imager commands."},{"location":"reference/software/interfaces/mqtt/#segmenter","title":"Segmenter","text":"

    The Segmenter API controls the processing of acquired images:

    • MQTT topics for commands: segmenter/segment
    • MQTT topics for status updates: status/segmenter, status/segmenter/object_id, status/segmenter/metric
    • Commands: segment

    For details on how images are processed, refer to our technical reference on image segmentation in the PlanktoScope.

    "},{"location":"reference/software/interfaces/mqtt/#segment-command","title":"segment command","text":"

    The segment command initiates processing of images stored in the specified path, optionally exporting the results to an EcoTaxa-compatible archive. The various settings parameters of this command provide control over the behavior of image processing. For example, this command initiates processing of all images in the /path/to/segment directory:

    {\n  \"action\": \"segment\",\n  \"path\": \"/path/to/segment\",\n  \"settings\": {\n    \"force\": false,\n    \"recursive\": true,\n    \"ecotaxa\": true,\n    \"keep\": true\n  }\n}\n

    The segment command has the following parameters:

    Parameter Description Type Accepted Values path Path to the directory of images to process.Defaults to /home/pi/data/img. file path (string) any subdirectory of\u00a0/home/pi/data/img (optional) settings.force Force re-segmentation of already-processed directories, ignoring the existence of\u00a0done\u00a0files which otherwise prevent already-segmented directories from being processed again.Defaults to false. boolean true, false (optional) settings.recursive Process datasets in all subdirectories of\u00a0path.Defaults to true. boolean true, false (optional) settings.ecotaxa Export an EcoTaxa-compatible archive.Defaults to true. boolean true, false (optional) settings.keep Keep ROI files generated when exporting an EcoTaxa-compatible archive. It has no effect if settings.ecotaxa\u00a0is false.Defaults to true. boolean true, false (optional)"},{"location":"reference/software/interfaces/mqtt/#segment-command-responses","title":"segment command responses","text":"

    The Python backend can send status updates on the status/segmenter topic, in response to the segment command. The status field of such status updates can have any of the following values:

    Status/Error message Description Started The segmentation process has begun. Busy The segmenter is currently running and cannot update configurations. Calculating flat The frame background is being calculated. Segmenting image %s, image %d/%d Segmentation of a specific image is in progress. An exception was raised during the segmentation: %s. An error occurred during segmentation. Done Processing has finished for the specified datasets.

    As the Python backend performs segmentation, it will repeatedly send additional status updates on the status/segmenter/object_id topic, once for each object isolated by the segmenter. Each status update is a JSON object with the following fields:

    Field Description Type object_id A scikit-image region label. integer

    As the Python backend performs segmentation, it will repeatedly send additional status updates on the status/segmenter/metric topic, once for each object isolated by the segmenter. Each status update is a JSON object with the following fields:

    Field Description Type name An object ID, which is a undersctore-delimited concatenation of the name of the raw image which was processed and the object ID reported by status/segmenter/object_id. string metadata Metadata for the object. struct

    The metadata field of status updates sent on the status/segmenter/metric topic is an object with the following fields:

    Field Description Type label Label of the object. integer width Width of the smallest rectangle enclosing the object. integer height Height of the smallest rectangle enclosing the object. integer bx X coordinate of the top left point of the smallest rectangle enclosing the object. integer by Y coordinate of the top left point of the smallest rectangle enclosing the object. integer circ Circularity: (4 \u2217 \u03c0 \u2217 Area) / Perimeter^2. A value of 1 indicates a perfect circle, approaching 0 indicates an elongated polygon. float area_exc Surface area of the object excluding holes, in square pixels. integer area Surface area of the object in square pixels. integer %area Percentage of object\u2019s surface area that is comprised of holes. float major Primary axis of the best fitting ellipse for the object. float minor Secondary axis of the best fitting ellipse for the object. float y Y position of the center of gravity of the object. float x X position of the center of gravity of the object. float convex_area The area of the smallest polygon within which all points in the object fit. integer perim The length of the outside boundary of the object. float elongation The result of dividing the major parameter by the minor parameter. float perimareaexc The result of dividing the perim parameter by the area_exc parameter. float perimmajor The result of dividing the perim parameter by the major parameter. float circex (4 \u2217 \u03c0 \u2217 area_exc) / perim^2. float angle Angle between the primary axis and a line parallel to the x-axis of the image. float bounding_box_area Area of the bounding box enclosing the object. integer eccentricity Eccentricity of the object. float equivalent_diameter Diameter of a circle with the same area as the object. float euler_number Euler number of the object. integer extent Ratio of object area to bounding box area. float local_centroid_col Column position of the local centroid. float local_centroid_row Row position of the local centroid. float solidity Ratio of object area to convex area. float MeanHue Mean hue value of the object. float MeanSaturation Mean saturation value of the object. float MeanValue Mean value (brightness) of the object. float StdHue Standard deviation of the hue value of the object. float StdSaturation Standard deviation of the saturation value of the object. float StdValue Standard deviation of the value (brightness) of the object. float"},{"location":"reference/software/interfaces/mqtt/#stop-command_3","title":"stop command","text":"

    The stop command interrupts any ongoing image processing. For example:

    {\n  \"action\": \"stop\"\n}\n

    The stop command has the following parameters:

    Parameter Type Accepted Values Description action string \"stop\" Specifies the action to stop segmentation.

    Warning

    The functionality for this command has not yet been implemented. Currently an Interrupted status is sent as a response on the segmenter/segment topic even though no interruption will actual happen.

    "},{"location":"reference/software/interfaces/mqtt/#stop-command-responses_3","title":"stop command responses","text":"

    The Python backend can send status updates on the segmenter/segment topic, in response to the stop command. The status field of such status updates can have any of the following values:

    Status/Error message Description Interrupted The segmentation process was interrupted."},{"location":"reference/software/interfaces/mqtt/#non-response-status-updates_4","title":"Non-response status updates","text":"

    The Python backend can send status updates on the status/segmenter topic which are not triggered by any command. The status field of such status updates can have any of the following values:

    Status/Error Description Ready The backend has become ready to respond to Segmenter commands. Dead The backend will no longer respond to Segmenter commands."},{"location":"reference/software/subsystems/installation/","title":"Installation","text":"

    This document explains how the PlanktoScope OS's installation process works, as a companion to our non-standard installation guide which carries out the process explained below.

    The installation process is initiated by booting into an appropriate installation of the Raspberry Pi OS and then downloading and running the installation bootstrap script, which in turn downloads and runs the appropriate distro setup scripts according to the installation parameters provided to the installation bootstrap script.

    "},{"location":"reference/software/subsystems/installation/#installation-bootstrap-script","title":"Installation bootstrap script","text":"

    The installation bootstrap script is provided so that a one-line command can be executed to automatically perform the entire process of installing the PlanktoScope OS on top of the Raspberry Pi OS. The GitHub repository which contains that script always publishes the latest version on its stable branch to install.planktoscope.community/distro.sh via GitHub Pages; other versions can be downloaded from GitHub via the corresponding permalinks for those versions of the file (e.g. https://github.com/PlanktoScope/install.planktoscope.community/raw/v2023.9.0/distro.sh for the version from the v2023.9.0 tag in the repository). The installation bootstrap script performs the following steps:

    1. The script loads some parameters (set by environment variables and/or corresponding command-line arguments) which set the behavior of the script.

    2. The script installs git, if it was not already installed (as is the case on the \"Lite\" image of the Raspberry Pi OS); if the yes parameter was not set and git was not already installed, the script will first ask the user to confirm that they wish to install git before the script continues. git is required to resolve version query parameters provided to the script, so that the script can determine how to download the requested version of the PlanktoScope OS's distro setup scripts.

    3. The script clones a minimal \"mirror\" copy of the specified repository (set by the repo parameter) of distro setup scripts to a temporary directory (i.e. a directory created in /tmp). This \"mirror\" copy is used to:

      • Resolve the version query parameters (version-query, query-type, and - when query-type is tag - tag-prefix) into a specific commit hash for the repository.

      • Determine a (pseudo-)version string for the resolved commit based on the last release tag (whose name is prefixed with the tag-prefix parameter) ancestral to that commit.

    4. The script clones a copy of the specified repository (set by the repo parameter) to a temporary directory and checks out the specific commit which was resolved by the previous step; if the yes parameter was not set, the script will first ask the user to confirm that they wish to download the resolved commit of the distro setup scripts before the script continues. Because the repository containing the distro setup scripts may have many large files (e.g. image files for documentation) which are unrelated to the distro setup scripts, this step only downloads files in the specific commit needed for the distro setup scripts.

    5. The script records versioning information for the downloaded installation scripts, saving that information in two YAML files in a particular directory; if that directory already exists and the yes parameter was not set, the script will first ask the user to confirm that they wish to delete and re-create that directory before the script continues. Installed programs can read these files in order to determine the installed version of the PlanktoScope OS.

    6. The script runs the specified script (set by the setup-entrypoint parameter) within the downloaded copy of the specified repository; if the yes parameter was not set, the script will first ask the user to confirm that they wish to run the downloaded distro scripts before the script continues.

    "},{"location":"reference/software/subsystems/installation/#script-parameters","title":"Script parameters","text":"Command-Line Flags Environment Variable Name Description -r--repo REPO URL of the Git repository used for downloading the distro setup scripts. If a protocol is not specified, the URL will be assumed to use HTTPS.Default value:\u00a0github.com/PlanktoScope/PlanktoScope -v--version-query VERSION_QUERY The version of the repository to download. The version query is interpreted differently depending on the query type set by the\u00a0query-type\u00a0parameter:
    • Query type\u00a0\u00a0branch: query should be a branch name (e.g. software/beta).
    • Query type\u00a0tag: query should be a Git tag name, excluding the tag prefix specified by the tag-prefix\u00a0parameter (e.g. v2024.0.0\u00a0if tag-prefix\u00a0is software\u00a0and the Git tag is\u00a0software/v2024.0.0).
    • Query type\u00a0hash: query should be a commit hash and may be abbreviated (e.g. 2d6928e).
    Default value: software/stable -t--query-type QUERY_TYPE The type of version query set by the version-query\u00a0parameter.Allowed values: branch, tag, hash.Default value: branch -H--hardware HARDWARE The hardware configuration, passed as the first argument to the entrypoint of the distro setup scripts. The distro setup scripts in the\u00a0github.com/PlanktoScope/PlanktoScope\u00a0repo currently expect either none, segmenter-only,\u00a0adafruithat,\u00a0planktoscopehat, or fairscope-latest.Default value: planktoscopehat --tag-prefix TAG_PREFIX The prefix for Git version tags when resolving the version query (with query type\u00a0tag) and when resolving tags (for pseudoversion strings).\u00a0Default value: software/ --setup-entrypoint SETUP_ENTRYPOINT The entrypoint of the distro setup scripts, which will be executed in order to run the downloaded distro setup scripts. This should be a subdirectory path within the repository (set by the repo\u00a0parameter) which will be downloaded at the specified commit (set by the version-query\u00a0and query-type\u00a0parameters and - when query-type\u00a0is tag\u00a0- by the tag-prefix\u00a0parameter) to obtain the distro setup scripts.Default value: software/distro/setup/setup.sh -y-f--yes--force FORCE Whether to automatically confirm all user confirmation prompts:
    • FORCE=1\u00a0(or including the command-line flag) automatically confirms all prompts.
    • Not setting FORCE (or not including the command-line flag) requires user input for confirmation on all prompts.
    Default: User input required -V--verbose VERBOSE Whether to display additional (verbose) output:
    • VERBOSE=1\u00a0(or including the command-line flag) enables verbose output.
    • Not setting VERBOSE (or not including the command-line flag) disables verbose output.
    Default: Don't display verbose output -h--help Whether to display a help message (which includes this parameter reference table and a list of example commands using this script) and quit without doing any work.

    Example combinations of command-line arguments using the above parameters:

    • -v software/stable -H planktoscopehat or -H planktoscopehat: install the latest stable release of the standard PlanktoScope OS (i.e. from the software/stable branch) for a PlanktoScope with the PlanktoScope HAT.

    • -v software/beta -H adafruithat: install the latest beta pre-release or stable release of the standard PlanktoScope OS (i.e. from the software/beta branch) for a PlanktoScope with the Adafruit HAT.

    • -v master -H planktoscopehat: install the latest development version of the standard PlanktoScope OS (i.e. from the master branch) for a PlanktoScope with the PlanktoScope HAT.

    • -t tag -v v2024.0.0-alpha.1 -H adafruithat: install the v2024.0.0-alpha.1 pre-release of the standard PlanktoScope OS (i.e. from the software/v2024.0.0-alpha.1 tag) for a PlanktoScope with the Adafruit HAT.

    • -t hash -v 2d6928e -H planktoscopehat: install 2d6928e commit of the standard PlanktoScope OS for a PlanktoScope with the PlanktoScope HAT.

    • -v master -r github.com/LaurentPV/PlanktoScope -H adafruithat: install the latest development commit of master branch of the github.com/LaurentPV/PlanktoScope fork of the PlanktoScope OS for a PlanktoScope with the Adafruit HAT.

    "},{"location":"reference/software/subsystems/installation/#recorded-versioning-information","title":"Recorded versioning information","text":"

    Currently the installer script creates two YAML files, both in the /usr/share/planktoscope directory.

    /usr/share/planktoscope/installer-config.yml records the values of the parameters with which the installer script was invoked:

    YAML Field Name Corresponding Script Parameter Example Value repo repo \"github.com/PlanktoScope/PlanktoScope\" version-query version-query \"v2024.0.0-alpha.1\" query-type query-type \"tag\" hardware hardware \"adafruithat\" tag-prefix tag-prefix \"software/\" setup-entrypoint setup-entrypoint \"software/distro/setup/setup.sh\"

    /usr/share/planktoscope/installer-versioning.yml records information about the version of the PlanktoScope OS's distro setup scripts which was used to install the PlanktoScope OS:

    Field Name Description repo The path of the Git repository which provided the distro setup scripts, with any leading protocol string (e.g. https://) removed.Example Values:
    1. \"github.com/PlanktoScope/PlanktoScope\"
    2. \"github.com/PlanktoScope/PlanktoScope\"
    commit The full hash of the exact commit which provided the distro setup scripts.Example Values:
    1. \"2d6928e596b28f0c4c268fecb588c85215b1027e\"\u00a0(for commit 2d6928e)
    2. \"4d8b882616a8374918730bc1c6d300edfd7a523a\"\u00a0(for commit 4d8b882)
    tag The full name of the Git tag (whose name starts with the prefix set by the tag-prefix\u00a0script parameter) at the exact commit which provided the distro setup scripts, if such a tag exists; otherwise, the empty string (\"\").Example Values:
    1. \"software/v2024.0.0-alpha.1\"\u00a0(so commit 2d6928e\u00a0has Git tag software/v2024.0.0-alpha.1)
    2. \"\"\u00a0(so commit 4d8b882\u00a0has no Git tag)
    version A version string or pseudo-version string describing the exact commit which provided the distro setup scripts. If a Git tag (with a name starting with the prefix set by the tag-prefix\u00a0script parameter) exists at that commit, this is a version string which just the name of that tag, but with the tag-prefix\u00a0stripped from the name. Otherwise, this is a pseudo-version string with format \"{tag}-{distance}-g{commit}\", where:
    • {tag}\u00a0is the name of the most recent ancestral tag (with a name starting with the prefix set by the tag-prefix\u00a0script parameter) reachable from the commit, but with the tag-prefix\u00a0stripped from the name.
    • {distance}\u00a0distance (in number of commits) between the commit and the most recent ancestral tag.
    • {commit}\u00a0consists of the first seven characters of the hash of the commit.
    • Example Values:
      1. \"v2024.0.0-alpha.1\"\u00a0(so commit 2d6928e\u00a0has Git tag software/v2024.0.0-alpha.1)
      2. \"v2024.0.0-alpha.1-4-g4d8b882\"\u00a0(so commit 4d8b882\u00a0is 4 commits above the commit with Git tag software/v2024.0.0-alpha.1, which was the last tag in the ancestry of the commit)
      "},{"location":"reference/software/subsystems/installation/#distro-setup-scripts","title":"Distro setup scripts","text":"

      Currently, the entrypoint of the distro setup scripts, at software/distro/setup/setup.sh, takes exactly one command-line argument which must be one of the following values:

      • adafruithat: this will cause the distro setup scripts to install a version of the PlanktoScope hardware controller and the PlanktoScope Node-RED dashboard specific to PlanktoScopes using the Adafruit HAT, and to set the default hardware configuration files accordingly.

      • planktoscopehat: this will cause the distro setup scripts to install a version of the PlanktoScope hardware controller and the PlanktoScope Node-RED dashboard specific to PlanktoScopes using the PlanktoScope HAT, and to set the default hardware configuration files accordingly.

      Currently, the distro setup scripts must be run by a user named pi. The scripts should not be run with sudo!

      Currently, the distro setup scripts are split into two phases: setup of the base operating system, and setup of the PlanktoScope application environment. In the future, as we remove various setup steps from these scripts (and instead manage those steps using forklift), we may consolidate these two phases into a single phase.

      "},{"location":"reference/software/subsystems/installation/#base-system-setup","title":"Base system setup","text":"

      This phase performs steps which might (in theory) be useful for other projects which don't use the PlanktoScope hardware but would still benefit from many of the functionalities provided by the PlanktoScope OS. This phase consists of the following steps:

      • Installation of base tools: Docker, Cockpit, and various command-line tools are installed.

      • Installation of forklift and a Forklift pallet: a hard-coded version of forklift is downloaded to /usr/bin/forklift , a hard-coded version of a hard-coded pallet (namely, github.com/PlanktoScope/pallet-standard) is downloaded and prepared for deployment, and the forklift-apply.service systemd service is created and enabled. (Note: in the future, it will be possible to specify the pallet to be installed as a command-line argument.)

      • Partial configuration of Raspberry Pi-specific hardware: the SPI and I2C hardware interfaces are enabled, and the serial port and serial port console are enabled (note: the serial port console will be disabled by the PlanktoScope application environment setup phase so that the serial port can be used for the PlanktoScope's GPS receiver instead), and legacy camera support is disabled.

      • Configuration of the system locale: the system's language is changed to en_US.UTF-8, but the time and measurement formats are changed to en_DK.UTF-8 so that the date format is yyyy-mm-dd and units are metric. The system timezone is set to UTC.

      • Partial configuration of networking: various system services are installed and configured, namely dhcpcd, dnsmasq, hostapd, and firewalld. The enable-interface-forwarding.service and autohotspot.service systemd services are created and enabled. The Raspberry Pi's Wi-Fi country is set to the US.

      • Cleanup: SSH keys are reset to be regenerated on the next boot, unnecessary APT files are removed, and the OS machine ID is reset to be regenerated on the next boot.

      "},{"location":"reference/software/subsystems/installation/#planktoscope-application-environment-setup","title":"PlanktoScope application environment setup","text":"

      This phase performs steps specific to the PlanktoScope's hardware:

      • Remaining configuration of networking: a hard-coded version of machine-name is downloaded to /usr/bin/machine-name, avahi-utils is installed using APT, and various systemd services are created and enabled to update the PlanktoScope OS's networking configurations based on a machine name which will be determined by machine-name from the Raspberry Pi's serial number at every boot. Additional systemd services are created and enabled so that the PlanktoScope will be accessible over some additional mDNS names (namely, pkscope.local and planktoscope.local).

      • Setup of the PlanktoScope hardware controller: various Python tools (pip, venv, and poetry) are installed using APT, a hard-coded version of a hard-coded Git repository (namely github.com/PlanktoScope/device-backend) is cloned, and various dependencies (both system libraries and Python packages) of the hardware controller are installed. The planktoscope-org.device-backend.controller-adafruithat.service and planktoscope-org.device-backend.controller-planktoscopehat.service systemd services are created, and the appropriate one is enabled depending on which HAT the PlanktoScope OS is being installed for. The appropriate hardware configuration file will also be copied into the location expected by the hardware controller. (Note: once the PlanktoScope hardware controller is containerized and managed in Forklift, this step will be eliminated.)

      • Setup of GPIO stepper initialization at boot: a systemd service is created to release the stepper motors at startup. (Note: this service currently doesn't work and will eventually be deleted or replaced.)

      • Setup of the PlanktoScope Node-RED dashboard: Node-RED is installed, as well as a Python package required by the adafruithat version of the PlanktoScope Node-RED dashboard (Note: the dependency on that package will eventually be removed.). The appropriate version of the PlanktoScope Node-RED dashboard and will be copied to the location expected by Node-RED depending on which HAT the PlanktoScope OS is being installed for, along with the appropriate configuration file. Finally, npm packages required by the Node-RED dashboard are installed. (Note: once the Node-RED dashboard is containerized and managed in Forklift, this step will be eliminated.)

      • Setup of hardware support for the PlanktoScope's real-time clock module: A kernel devicetree overlay is enabled. (Note: this currently enables support for the wrong hardware real-time clock chip, so it doesn't work yet.)

      • Setup of hardware support for the PlanktoScope's GPS receiver: gpsd and chrony are installed and configured. (Note: currently the configurations may be incorrect.)

      • Configuration of CPU overclocking: the CPU is overclocked so that the PlanktoScope segmenter will run more quickly. (Note: in the future, this will be removed.)

      • Cleanup: unnecessary APT and pip files are removed.

      "},{"location":"reference/software/subsystems/startup/","title":"Startup","text":"

      This reference document is a companion to our explanation about the PlanktoScope software as an operating system, particularly its discussion of the operating system's boot sequence and its explanation of the various system services provided with the operating system. Specifically, this document lists information about what happens when the PlanktoScope is powered on.

      "},{"location":"reference/software/subsystems/startup/#services","title":"Services","text":"

      The PlanktoScope OS's daemons and system services (beyond what is already provided by the default installation of the Raspberry Pi OS) are defined with the following boot sequencing relationships:

      "},{"location":"reference/software/subsystems/startup/#software-deployment-execution","title":"Software deployment & execution","text":"

      In general:

      • dockerd (managed by docker.service) can start before network connectivity has been established; this is not the default behavior for dockerd.

      • All daemons & background processes not described in the rest of this page are sequenced by systemd according to the systemd unit dependency relationships specified by the default systemd service files installed with the APT packages which provide those programs.

      The PlanktoScope OS's setup scripts provide some system services which are not managed by Forklift, because they are used to integrate Forklift into the OS in order to bootstrap the system services and config files provided by Forklift:

      • overlay-sysroot.service runs after -.mount and systemd-remount-fs.service.

      • bindro-run-forklift-stages-current.service runs after -mount and systemd-remount-fs.service and before overlay-fs.target.

      • overlay-usr.service runs after overlay-sysroot.service and before overlay-fs.target.

      • overlay-etc.service runs after overlay-sysroot.service and systemd-machine-id-commit.service , and before systemd-sysctl.service and overlay-fs.target.

      • start-overlaid-units.service runs after overlay-fs.target and basic.target.

      • bind-.local-share-forklift-stages@home-pi.service runs after -.mount, home.mount, and basic.target.

      • forklift-apply.service, which uses the forklift tool to start all Docker Compose applications, runs after docker.service has started. Docker Compose applications managed with forklift are sequenced by forklift-apply.service according to the resource dependency relationships declared by the Forklift packages which provide those applications.

      "},{"location":"reference/software/subsystems/startup/#networking","title":"Networking","text":"

      For descriptions of the various targets (e.g. sysinit.target, network-pre.target) referred to below, see systemd's bootup process and systemd's special targets:

      • generate-machine-name.service and generate-hostname-templated.service runs before sysinit.target.

      • update-hostname.service runs after generate-hostname-templated.service and systemd-hostnamed.service but before network-pre.target.

      • assemble-dnsmasq-config-templated.service runs after generate-machine-name.service and generate-hostname-templated.service but before dnsmasq.service.

      • assemble-hosts-templated.service and assemble-hosts.service run after generate-machine-name.service and generate-hostname-templated.service but before dnsmasq.service and network-pre.target.

      • enable-interface-forwarding.service runs before network-online.target.

      • assemble-hostapd-config-templated.service and assemble-hostapd-config.service run after generate-machine-name.service and generate-hostname-templated.service but before hostapd.service.

      • The hostapd daemon is manually started and stopped by autohotspot.service.

      • autohotspot.service runs after forklift-apply.service and enable-interface-forwarding.service have started (so that the PlanktoScope's web browser-based user interfaces are ready for connections before the PlanktoScope's Wi-Fi hotspot is started) and before network connectivity is considered to have been established. It is re-run every one or two minutes by autohotspot.timer.

      • planktoscope-mdns-alias@pkscope.service and planktoscopemdns-alias@planktoscope.service configure the Avahi daemon (provided by the Raspberry Pi OS) to also resolve mDNS names pkscope.local and planktoscope.local, respectively, to an IP address (192.168.4.1) which is usable by devices connected to the PlanktoScope by a direct connection between their respective network interfaces.

      "},{"location":"reference/software/subsystems/startup/#user-interface","title":"User interface","text":"
      • assemble-cockpit-config.service, assemble-cockpit-origins.service, and assemble-cockpit-origins-templated.service update Cockpit's configuration file from drop-in config file fragments in /etc/cockpit/cockpit.conf.d, /etc/cockpit/origins.d, and /etc/cockpit/origins-templates.d, respectively. They run after generate-machine-name.service and generate-hostname-templated.service and before cockpit.service.

      • ensure-ssh-host-keys.service regenerates the SSH server's host keys if the keys are missing, and runs before ssh.service.

      • The PlanktoScope Node-RED dashboard (managed by nodered.service) starts after planktoscope-org.update-machine-name.service has started, to ensure that the Node-RED dashboard has the correct machine name. (In the future the PlanktoScope Node-RED dashboard will instead be run as a Docker container and will be managed by forklift.)

      "},{"location":"reference/software/subsystems/startup/#planktoscope-specific-hardware-abstraction","title":"PlanktoScope-specific hardware abstraction","text":"
      • The PlanktoScope hardware controller (managed by planktoscope-org.device-backend.controller-{adafruithat or planktoscopehat}.service) starts after forklift-apply.service (which manages Mosquitto) and nodered.service have started, to ensure that the PlanktoScope hardware controller broadcasts the detected camera model name only after the PlanktoScope Node-RED dashboard is ready to receive that broadcast. (In the future the PlanktoScope hardware controller will instead be run as a Docker container and will be managed by forklift.)
      "},{"location":"setup/","title":"Setup","text":"

      This section of the PlanktoScope documentation will help you get to a working PlanktoScope. Every PlanktoScope has two aspects which have to work together: the hardware and the software. Depending on what hardware you already have, you should start at different places in the documentation:

      • \"I have a product from FairScope\": you probably received either a fully-assembled Planktoscope or a PlanktoScope do-it-yourself assembly kit. For more information, see the FairScope product section of this page.
      • \"I have a fully assembled PlanktoScope, and it was not assembled by FairScope\": you will need to ensure that you have the latest version of the PlanktoScope software installed on the PlanktoScope, and that the PlanktoScope hardware works. For more information, see the Fully-assembled PlanktoScope section of this page.
      • \"I have a kit of hardware parts to assemble into a PlanktoScope, and it was not provided by FairScope\": you will need to assemble your PlanktoScope hardware and then set up the software on it. For more information, see the DIY kit section of this page.
      • \"I don't have any of the hardware for the PlanktoScope\": you have several options for getting the PlanktoScope hardware. For more information, see the No hardware yet section of this page.
      "},{"location":"setup/#fairscope-product","title":"FairScope product","text":"

      You probably purchased either a fully-assembled PlanktoScope or a do-it-yourself assembly kit from FairScope. The various sections of this documentation will provide you with instructions for how to proceed:

      • If you purchased a fully-assembled PlanktoScope, it is ready for you to use! You should go to our operation guide to learn how to operate your PlanktoScope.
      • If you purchased a do-it-yourself assembly kit from FairScope, you should go to our hardware setup guide to learn how to assemble your kit into a working PlanktoScope. The software will already have been set up for you, so after you finish setting up the hardware you can proceed to our operation guide to learn how to operate your PlanktoScope.
      "},{"location":"setup/#fully-assembled-planktoscope","title":"Fully-assembled PlanktoScope","text":"

      If you have a fully-assembled PlanktoScope which was provided to you by FairScope, please refer instead to the Fairscope product section of this page. If someone else provided you with a PlanktoScope, you might need to do some additional hardware setup, software setup, calibration, and/or troubleshooting - please talk to them to figure out what might be needed. The various sections of this documentation site may be a useful resource for you:

      • Depending on what software is pre-installed on your PlanktoScope, and how old the software is, our software setup guide may be useful to help you update the software. You should always ensure that you are running the most recent available version of the PlanktoScope software.
      • Depending on what software configuration your PlanktoScope is running, our operation guide may be useful to help you operate your PlanktoScope.
      "},{"location":"setup/#diy-kit","title":"DIY kit","text":"

      If you have a DIY assembly kit which was provided to you by FairScope, please refer instead to the Fairscope product section of this page. If someone else provided you with a DIY assembly kit, the process for assembling it into a PlanktoScope may be different from what is described in this documentation site - please talk to them to figure out what you should do. The various sections of this documentation site may be a useful resource for you:

      • Depending on what is included in your DIY kit, our hardware setup guide may be useful to assemble a PlanktoScope from your kit.
      • Depending on what is on the micro-SD card included with your DIY kit (if it includes a micro-SD card), our software setup guide may be useful to help you update the software. You should always ensure that you are running the most recent available version of the PlanktoScope software.
      • Depending on what software configuration your PlanktoScope is running, our operation guide may be useful to help you operate your PlanktoScope.
      "},{"location":"setup/#no-hardware-yet","title":"No hardware yet","text":"

      If you don't have any hardware for a PlanktoScope yet, you have a few options depending on how much work you want to do, what your budget is, and how much troubleshooting you are willing to do:

      1. Purchase a fully pre-assembled PlanktoScope.
      2. Purchase a DIY kit of parts to assemble into a PlanktoScope.
      3. Both make your own kit of parts and assemble it into a PlanktoScope.
      "},{"location":"setup/#buy-a-pre-assembled-planktoscope","title":"Buy a pre-assembled PlanktoScope","text":"

      You can buy a PlanktoScope from FairScope, which is a small business started by the inventor of the PlanktoScope in order to make it easier for people to obtain PlanktoScopes. If you buy a PlanktoScope from FairScope, it will be fully standard, fully assembled, and fully tested. It will already have been calibrated in order to produce scientific data which can be compared with data from other PlanktoScopes, without requiring you to perform any additional calibration steps. The software will be pre-installed, so that once you receive your PlanktoScope you can immediately start using it.

      We recommend this approach for:

      • Anyone who wants a PlanktoScope which \"just works\" out-of-the-box.
      • Scientists who just want to collect data and don't want to become engineers.
      • Anyone who just wants to use the PlanktoScope as a tool, rather than tinkering with their PlanktoScope as a project.
      "},{"location":"setup/#buy-a-diy-kit","title":"Buy a DIY kit","text":"

      If you are on a budget which does not allow you to buy a fully-assembled PlanktoScope from FairScope, you can instead buy a do-it-yourself assembly kit from FairScope. By assembling your PlanktoScope yourself, you will gain a deeper understanding of how it works, how to troubleshoot any problems you might encounter, and how to repair your PlanktoScope if you damage its hardware. If you make any mistakes while assembling the PlanktoScope, you will have to do some troubleshooting. You will also need to calibrate your PlanktoScope if you want to use it to produce data useful for scientists.

      We recommend this approach for:

      • Anyone who wants a standard PlanktoScope but is on a limited budget, and has some interest in building things and troubleshooting problems.
      • Anyone who wants to approach the PlanktoScope as a project and not just a tool, but who has a limited tolerance of technical complexity.
      • Anyone who wants a do-it-yourself experience but does not have access to a laser cutter or CNC mill.
      • Anyone who wants a standard set of parts as the foundation for customizing their PlanktoScope.
      • Engineers and makers who don't want to worry about figuring out suppliers and making their own one-time supply chain in order to obtain all the hardware parts needed to build a single PlanktoScope.
      "},{"location":"setup/#make-a-kit-and-assemble-it","title":"Make a kit and assemble it","text":"

      If you don't want to purchase a pre-assembled PlanktoScope or a DIY assembly kit from FairScope, you will need to make your own assembly kit, and then assemble it into a PlanktoScope. This will require identifying sellers who will provide you with the necessary parts, and it will require identifying a way either to fabricate various mechanical parts yourself or to use a commercial service to fabricate those parts for you. Depending on which version of the PlanktoScope hardware you want to build, you might also need to assemble a custom printed circuit board (or work with a commercial service to assemble it for you). Once you have a kit, you can begin to assemble your PlanktoScope from it. You will almost certainly have to do some troubleshooting of problems with how you assembled your hardware, which is a great learning opportunity - but only if you're interested in it.

      We recommend this approach for:

      • Anyone who is on an extremely limited budget but has lots of time and some hardware engineering experience.
      • Makers who are already familiar with laser cutting or CNC milling, and with soldering or PCB assembly (the necessary skills will depend on the version of PlanktoScope hardware being built).
      • Hobbyists and students who are primarily interested in the PlanktoScope as an engineering project and want to figure out everything by themselves.
      • Anyone who wants to design and build an extremely non-standard PlanktoScope, whether for fun or to use it for unconventional purposes.
      "},{"location":"setup/#next-steps","title":"Next steps","text":"

      After finishing any necessary hardware setup and all necessary software setup for your PlanktoScope, you can proceed to our guide on how to operate your PlanktoScope.

      "},{"location":"setup/hardware/","title":"PlanktoScope Hardware","text":"

      This section of the PlanktoScope documentation will help you to build the hardware of a PlanktoScope. Our documentation splits this PlanktoScope production process into two phases: making a kit of parts, and assembling a PlanktoScope from that kit of parts.

      If you do not already have a kit of parts, you will need to either purchase a kit or make a kit yourself. You will need to choose a PlanktoScope hardware version and obtain the hardware components necessary for that hardware version; your assembly kit will consist of those components. You can purchase a kit from FairScope, a small business started by the inventor of the PlanktoScope in order to make it easier for people to obtain PlanktoScopes. Once you have selected a hardware version, you can proceed to our instructions for making your kit.

      If you do already have a kit of parts, you can proceed to our instructions for assembling your kit into a PlanktoScope. However, you will first need to determine the PlanktoScope hardware version which your kit is made for, so that you can choose the correct assembly guide for your kit.

      "},{"location":"setup/hardware/#hardware-versions","title":"Hardware versions","text":"

      The design of the PlanktoScope's hardware has been evolving to fix usability issues and improve the quality of images captured by the PlanktoScope. Thus, multiple versions of the hardware have been developed. This page only describes hardware versions for which documentation has been published for anyone to manufacture the hardware, and here we only describe aspects of each hardware version relevant to choosing a version to manufacture. Due to a lack of time by the people developing the PlanktoScope hardware, documentation for other versions of the PlanktoScope hardware has not yet been created; for information on these other versions of the PlanktoScope hardware, please refer to the technical reference section of our documentation site.

      "},{"location":"setup/hardware/#hardware-v21","title":"Hardware v2.1","text":"

      This was the first publicly released version of the PlanktoScope hardware. The electronic components of this design are all available from commercial off-the-shelf sources, using an Adafruit Stepper Motor HAT to control various actuators and a Yahboom RGB Cooling HAT to cool the PlanktoScope's embedded Raspberry Pi 4 computer. The mechanical structure was designed for fabrication using a laser cutter. This hardware version has some design flaws, such as providing no way to replace the Raspberry Pi's micro-SD card without partially disassembling the PlanktoScope; these problems have been fixed in later versions of the PlanktoScope hardware.

      This version of the PlanktoScope hardware is the only version which has been widely replicated by independent makers so far. Note that this hardware design specifies a peristaltic pump which is no longer commercially available, so anyone making an assembly kit for this version will have to identify a different pump to use as a substitute.

      "},{"location":"setup/hardware/#hardware-v25","title":"Hardware v2.5","text":"

      This version includes many design improvements to solve various problems with the v2.1 hardware design, including:

      • Replacing the ibidi flowcell with a simpler glass capillary flowcell.

      • Replacing the Adafruit Stepper Motor HAT with a HAT designed specifically for the PlanktoScope (the PlanktoScope HAT).

      • Replacing the linear actuators for sample focusing with a more mechanically robust pair of linear actuators.

      • Replacing the peristaltic pump with a more accurate pump which is commercially available.

      • Making the Raspberry Pi's micro-SD card accessible without requiring disassembly of the PlanktoScope.

      The mechanical structure of this design uses CNC-milled parts rather than laser-cut parts.

      Our documentation site provides manufacturing documentation to make assembly kits for this hardware version, and to assemble kits for this version into PlanktoScopes.

      "},{"location":"setup/hardware/#choosing-a-version","title":"Choosing a version","text":"

      We recommend building a PlanktoScope of the latest available hardware version (currently v2.5). However, if you are making your own assembly kit and the following limitations apply to you, you may need to choose an older hardware version such as v2.1:

      • You do not have access to a CNC mill, or to a commercial fabrication service with a CNC mill.

      • You do not have access to manufacturing capabilities for assembling a custom printed circuit board, and you cannot buy a pre-assembled HAT from FairScope.

      "},{"location":"setup/hardware/#building-a-planktoscope","title":"Building a PlanktoScope","text":"

      If you received a PlanktoScope hardware assembly kit from someone but you are not sure what hardware version the kit is for, you should check with the person who gave the kit to you.

      Once you have figured out what hardware version of the PlanktoScope you will build, you can proceed to our version-specific hardware setup guides:

      • If you are building a PlanktoScope with the v2.5 hardware, please proceed to our page for Hardware v2.5 to find instructions for making an assembly kit, as well as instructions for building a PlanktoScope from an assembly kit for v2.5 of the hardware.

      • If you are building a PlanktoScope with the v2.1 hardware, please proceed to our page for Hardware v2.1 to find instructions for making an assembly kit, as well as instructions for building a PlanktoScope from an assembly kit for v2.1 of the hardware.

      "},{"location":"setup/hardware/#next-steps","title":"Next steps","text":"

      After making an assembly kit (if necessary) and building a PlanktoScope from your assembly kit, you should proceed to our software setup guide.

      "},{"location":"setup/hardware/index-noguides/","title":"PlanktoScope Hardware","text":"

      You are viewing a copy of the PlanktoScope project documentation without the hardware setup guides, probably because you're viewing an offline, reduced-size copy of the PlanktoScope documentation served by your PlanktoScope. You should go to an online copy of the PlanktoScope documentation to find the hardware setup guides.

      "},{"location":"setup/hardware/v2.1/","title":"Hardware v2.1","text":"

      This page will help you to build the v2.1 hardware for a PlanktoScope.

      "},{"location":"setup/hardware/v2.1/#make-an-assembly-kit","title":"Make an assembly kit","text":"

      If you do not already have an assembly kit, you will need to make a kit for yourself. Note: you will need to set up the PlanktoScope software on the micro-SD card of your PlanktoScope's Raspberry Pi, as part of the assembly kit.

      You should be aware that some of the parts required for the kit, especially the peristaltic pump, are no longer commercially available; you will have to identify alternatives to substitute for those parts.

      "},{"location":"setup/hardware/v2.1/#assemble-a-planktoscope-from-a-kit","title":"Assemble a PlanktoScope from a kit","text":"

      Once you have an assembly kit, you will need to assemble it into a PlanktoScope.

      "},{"location":"setup/hardware/v2.1/#next-steps","title":"Next steps","text":"

      Once you have assembled your PlanktoScope, you can proceed to our operation guide\u00a0to learn how to operate your PlanktoScope.

      "},{"location":"setup/hardware/v2.1/assembly/","title":"Assembly guide of the PlanktoScope","text":"

      You can also use CAD renders and photos from the following links as a supplementary material for this assembly guide:

      • CAD renders for the assembly guide
      • Photos for the assembly guide

      For the assembly guide below, the pieces of the laser-cut structure are referred to by single-letter labels (A, J, L, K, H, F, E, C, B, N, M, D, G, I) according to the following assignments:

      "},{"location":"setup/hardware/v2.1/assembly/#step-1-gather-everything-you-need","title":"Step 1: Gather everything you need","text":"

      For the full list of all required tools and parts, please refer to the v2.1 hardware kit production guide.

      • Laser cut structure
      • M12 lenses
      • Peristaltic pump and tubing
      • Raspberry Pi, motor driver board, GPIO connectors
      • Flashed SD card
      • Stepper motors
      • PiCam and flex cable
      • GPIO ribbon connector, headers, HATs, LED
      • DC Power terminal
      • Magnets
      • Super glue
      • Standoffs (M2.5), M3 screws and nuts

      Make sure you have your screwdriver kit, soldering iron, and components ready. Also, remember to flash the PlanktoScope image disk on the SD card before installing the Raspberry Pi.

      If you are not familiar with any process, such as soldering, tapping, or wiring, try and familiarize yourself with the topics first.

      Soldering deals with high heat and potentially toxic materials, so make sure to use the proper precautions.

      "},{"location":"setup/hardware/v2.1/assembly/#step-2-standoff-installation","title":"Step 2: Standoff installation","text":"

      Place 8 standoffs (M2.5 6mm) into the designated holes on the laser-cut base A. A pair of pliers make the job more comfortable. Do not overtighten as it is possible to crack the base material.

      "},{"location":"setup/hardware/v2.1/assembly/#step-3-motor-hat-preparation","title":"Step 3: Motor HAT preparation","text":"

      Insert and solder the terminal blocks and headers onto the motor driver PCB.

      Place the motor driver PCB on to the indicated standoffs.

      "},{"location":"setup/hardware/v2.1/assembly/#step-4-magnets-setup","title":"Step 4: Magnets setup","text":"

      Now is a good time to think about how the magnets will function within the microscope. The magnets in the sample stage will need to attract to the magnets on the flow cell holder. The magnets in the objective holder will need to attract the magnets on the mount. Keep this in mind as you are adding your magnets and tapping your respective M12 holders so your orientation will be correct.

      You can now fix your magnets into their appropriate holes on sample stage B. It is recommended to glue the magnets in place. If the magnets are too large to fit in, the holes can be widened with a handheld drill. However, they should be quite snug in place. Before you glue them in place make sure that the polarity is maintained, as they will be impossible to remove after gluing.

      "},{"location":"setup/hardware/v2.1/assembly/#step-5-sample-stage-assembly","title":"Step 5: Sample stage assembly","text":"

      Don\u2019t be alarmed by the color swap, this is the sample stage B. You can now fit the pegs on the driver mounts into the corresponding holes on the sample stage. They should be glued in place with superglue or epoxy. You can spin the shaft to align the driver mounts on the 2 steppers if it helps making the process easier.

      You should now have a sample stage and motor assembly that looks like this.

      "},{"location":"setup/hardware/v2.1/assembly/#step-6-lenses-tapping-and-mounting","title":"Step 6: Lenses tapping and mounting","text":"

      You now need to tap the holes for the M12 lenses in stage and mount M and D. It is helpful for alignment to do both the objeDtive and tube lens mount together. It is important to do this as straight as possible. A drop of mineral or olive oil can help the process. Be careful to use a right-hand tap (that goes down when turning clockwise).

      You can now screw the objective lens (the 25mm one) in part D.

      "},{"location":"setup/hardware/v2.1/assembly/#step-7-camera-preparation","title":"Step 7: Camera preparation","text":"

      You can now unscrew the lens from the Pi camera, being careful not to disturb the sensor below.

      "},{"location":"setup/hardware/v2.1/assembly/#step-8-camera-mount","title":"Step 8: Camera mount","text":"

      You can mount the camera using the appropriate holes on the camera mount G. Be careful to avoid getting oil or dust on the sensor.

      "},{"location":"setup/hardware/v2.1/assembly/#step-9-led-preparation","title":"Step 9: LED preparation","text":"

      The LED can then be wired up and put into its mount F. If you wire the LED yourself, remember to give enough length to reach the motor driver on the other end of the microscope. You can also add a bit of glue to fix F to the motor mount E at this time to make assembly easier, though it is not required.

      Warning

      This picture shows the correct wiring for the LED. Please make sure the red wire is on the long pin of the LED.

      "},{"location":"setup/hardware/v2.1/assembly/#step-10-vertical-slices-assembly","title":"Step 10: Vertical slices assembly","text":"

      You can now start placing the motor mount/LED assembly- B,

      C,

      D,

      E,

      F,

      and G into the base A.

      "},{"location":"setup/hardware/v2.1/assembly/#step-11-pump-setup","title":"Step 11: Pump setup","text":"

      The pump can then be mounted in place on H. Thread the wires through the hole with the pump tubing pointed toward the holes on the mount.

      Fix the pump in place.

      "},{"location":"setup/hardware/v2.1/assembly/#step-12-pump-mounting","title":"Step 12: Pump mounting","text":"

      You can now mount the pump on base A.

      Your setup should look like this. Don't worry about the wiring, we'll have a look at it in the next step!

      "},{"location":"setup/hardware/v2.1/assembly/#step-13-motor-hat-wiring","title":"Step 13: Motor HAT wiring","text":"

      You will now want to wire the steppers and pump to the terminals on the motor driver board.

      Info

      The PlanktoScope uses only bipolar stepper motors (with 4 wires coming out, and two coils inside), so you need to identify the two wires working together for each coil. The RepRap Wiki has great information on how to do this, either with a multimeter or without.

      You can find more information about stepper motors and how they work in this document.

      Tip

      If your wires are too short, you can invert the pump and the focus wiring. However, you will have to remember to change the configuration later on.

      Tip

      Make sure the wires are properly connected by pulling on them a little. They should not come loose.

      "},{"location":"setup/hardware/v2.1/assembly/#step-14-raspberry-pi-setup-and-installation","title":"Step 14: Raspberry Pi setup and installation","text":"

      At this point, you can insert your flashed SD card into your Raspberry Pi. If you did not already flash your SD card with the PlanktoScope OS, refer to our guide for doing so. The heat sink can also be added to the processor.

      Mount the Raspberry Pi containing the flashed SD card on the standoffs attached to the laser cut base A.

      "},{"location":"setup/hardware/v2.1/assembly/#step-15-standoffs","title":"Step 15: Standoffs","text":"

      Add 8 standoffs (M2.5 15mm) to fix the motor driver board and the Raspberry Pi to the base.

      "},{"location":"setup/hardware/v2.1/assembly/#step-16-camera-flex-cable","title":"Step 16: Camera flex cable","text":"

      At this point you can use the Pi camera flex cable to connect the camera to the Pi. This is done by gently pulling up the tensioners, inserting the cable in the right orientation, then pushing the tensioners back in place to set the cable. Try not to kink or fold the flex cable too much as it is possible to damage it.

      "},{"location":"setup/hardware/v2.1/assembly/#step-17-power-supply-wiring","title":"Step 17: Power supply wiring","text":"

      The power wires can be wired into place on the motor driver board.

      Tip

      Make sure the wires are properly connected by pulling on them a little. They should not come loose.

      "},{"location":"setup/hardware/v2.1/assembly/#step-18-prepare-the-gps-hat","title":"Step 18: Prepare the GPS HAT","text":"

      Tip

      If you don't have a GPS HAT, you can just skip the assembly steps related to the GPS HAT - the PlanktoScope software will still work without GPS.

      Insert the battery to power the GPS HAT and solder the terminal mounts in place.

      "},{"location":"setup/hardware/v2.1/assembly/#step-19-install-the-gps-hat","title":"Step 19: Install the GPS HAT","text":"

      Mount the GPS HAT over the motor driver PCB using the standoffs attached to the laser cut base A.

      "},{"location":"setup/hardware/v2.1/assembly/#step-20-install-the-fan-hat","title":"Step 20: Install the Fan HAT","text":"

      Place the cooling fan HAT above the Raspberry Pi by mounting it to the standoffs on base A.

      Warning

      Be careful to slide the camera flat cable in the slot in the HAT above the connector.

      "},{"location":"setup/hardware/v2.1/assembly/#step-21-secure-the-hats","title":"Step 21: Secure the HATS","text":"

      Secure the cooling fan HAT and GPS HAT by tightening the 8 screws to the standoffs on base A

      "},{"location":"setup/hardware/v2.1/assembly/#step-22-install-back-panel","title":"Step 22: Install back panel","text":"

      Insert the laser cut border I into base A.

      "},{"location":"setup/hardware/v2.1/assembly/#step-23-gps-output-connector","title":"Step 23: GPS output connector","text":"

      Insert the power and GPS connectors into side plate J.

      "},{"location":"setup/hardware/v2.1/assembly/#step-24-install-side-panel","title":"Step 24: Install side panel","text":"

      Place the side plate J into the designated slots on the base. You can connect the GPS cable to its connector on the board.

      Warning

      The GPS connector is quite fragile, make sure to align it properly before inserting it.

      "},{"location":"setup/hardware/v2.1/assembly/#step-25-install-the-other-side-panel","title":"Step 25: Install the other side panel","text":"

      Mount the side plate K on base A using the assigned slots.

      "},{"location":"setup/hardware/v2.1/assembly/#step-26-secure-the-sides-together","title":"Step 26: Secure the sides together","text":"

      Secure the laser cut sides with the screws and nuts.

      "},{"location":"setup/hardware/v2.1/assembly/#step-27-secure-the-sides-to-the-base-plate","title":"Step 27: Secure the sides to the base plate","text":"

      Secure the laser cut sides to the base plate A with the screws and nuts.

      Warning

      To make this easier, you can turn the assembly upside down or on its side. Be careful when doing so as the plates may fall.

      "},{"location":"setup/hardware/v2.1/assembly/#step-28-insert-the-camera-ribbon-cable-in-the-camera","title":"Step 28: Insert the camera ribbon cable in the camera","text":"

      You can now connect the camera flex cable into the connector on the camera board. Once again, gently pull up the tensioners, insert the cable in the right orientation, and push the tensioners back in place to set the cable. Try not to kink or fold the flex cable too much as it is possible to damage it.

      "},{"location":"setup/hardware/v2.1/assembly/#step-29-assemble-the-gpio-ribbon-cable","title":"Step 29: Assemble the GPIO ribbon cable","text":"

      If you didn't get an already assembled ribbon cable, you need to build it yourself.

      The orientation of the connector does not really matter. However, you need to make sure that both connectors are oriented in the same direction and are on the same side of the ribbon.

      To assemble, slide the ribbon in its connector and close it off. You need to tighten it really hard. It's very warmly recommended to use a vice to do so.

      Warning

      Once assembled, the ribbon should NOT look like this:

      It should rather look like this:

      "},{"location":"setup/hardware/v2.1/assembly/#step-30-insert-the-ribbon-cable","title":"Step 30: Insert the ribbon cable","text":"

      Attach the GPIO ribbon to connect the cooling fan HAT to the GPS HAT.

      Tip

      You can try to route the flat ribbon from the camera under the ribbon cable you are connecting now.

      "},{"location":"setup/hardware/v2.1/assembly/#step-31-fluidic-assembly","title":"Step 31: Fluidic assembly","text":"

      Feed in the tubing from syringe 1 to form the fluidic path as shown.

      Feed in the tubing from syringe 2 to form the fluidic path as shown

      Feed in a length of tubing as shown through motor mount H and illumination mount FE

      "},{"location":"setup/hardware/v2.1/assembly/#step-32-close-your-planktoscope","title":"Step 32: Close your PlanktoScope","text":"

      Warning

      Take a moment to check your wiring one last time. Also check the routing, make sure the LED wires and the pump stepper wires are in their dedicated channel.

      Place the top L into the slots on the PlanktoScope body. Secure it in place with screws and nuts.

      "},{"location":"setup/hardware/v2.1/assembly/#step-33-enjoy","title":"Step 33: Enjoy!","text":"

      Congratulations on a job well done. You can have some rest, get a tea and some biscuits!

      Warning

      If this was your first time assembling a PlanktoScope, you will probably need to do some troubleshooting of problems with the hardware assembly before your PlanktoScope will fully work. Refer to our troubleshooting documentation for assistance.

      "},{"location":"setup/hardware/v2.1/assembly/#next-steps","title":"Next steps","text":"

      Once your PlanktoScope fully works, you can proceed to our operation guide\u00a0to learn how to operate your PlanktoScope.

      "},{"location":"setup/hardware/v2.1/kit/","title":"Kit Production","text":""},{"location":"setup/hardware/v2.1/kit/#required-tools","title":"Required Tools","text":"

      Building the PlanktoScope involves components that can be sourced from various vendors, both online and locally. The assembly process is straightforward and can be completed within a few hours. Our website offers detailed guides for both hardware and software assembly, and the PlanktoScope community is ready to assist you with any questions or issues.

      "},{"location":"setup/hardware/v2.1/kit/#soldering-station","title":"Soldering Station","text":"

      A soldering station with flux, or flux core solder, is necessary for making a few electrical connections. Purchase here.

      "},{"location":"setup/hardware/v2.1/kit/#tap-wrench","title":"Tap Wrench","text":"

      Any tap wrench compatible with the M12x0.5 tap will work. Purchase here.

      "},{"location":"setup/hardware/v2.1/kit/#m12-x-05-tap","title":"M12 x 0.5 Tap","text":"

      An M12x0.5 tap is required to secure the objective and tube lenses. Purchase here.

      "},{"location":"setup/hardware/v2.1/kit/#screwdriver-kit","title":"Screwdriver Kit","text":"

      A screwdriver kit with multiple drivers simplifies many assembly operations. Purchase here.

      "},{"location":"setup/hardware/v2.1/kit/#required-components","title":"Required Components","text":"

      Below is a comprehensive list of components required to build the PlanktoScope V2.1, along with links to purchase them in both the US and France.

      "},{"location":"setup/hardware/v2.1/kit/#electronic-components","title":"Electronic Components","text":"Quantity Name Details US Link FR Link 1 Raspberry Pi 4 B (4GB) The single board computer from Raspberry Pi with 4GB of memory Amazon US DigiKey FR 1 Adafruit Stepper Motor HAT Controls 2 steppers: focus and pump stepper motors Amazon US Amazon FR 1 Adafruit Ultimate GPS HAT Stores date & time and logs GPS coordinates Amazon US DigiKey FR 1 Yahboom Cooling Fan HAT Cools and provides visual feedback with LEDs Amazon US Kubii FR 1 Hammer Header Male 2x20 Only one needed Amazon US Mouser FR 1 Stacking Header 2x20 Only one needed Amazon US Mouser FR 2 Pitch IDC Sockets 2x20 Two needed Amazon US Mouser FR 10cm GPIO Ribbon IDC 40P Only 10 cm needed Amazon US Amazon FR 1 Flex Cable for Pi Camera Longer flex cable needed Amazon US Amazon FR 1 DC Power Jack Socket Only one needed Amazon US Amazon FR 1 GPS Active Antenna Includes uPF to SMA adapter Amazon US Amazon FR 1 Micro HDMI Cable Optional, for development purposes Amazon US Amazon FR 1 Power Supply 3A (USB) Needs to provide 3A 5V Amazon US Amazon FR 1 Power Supply 1A (USB) Needs to provide 1A 5V Amazon US Mouser FR 1 USB Type-C to USB-A 2.0 To power the Raspberry Pi Amazon US Amazon FR 1 USB 5v to DC 12v Step Up Make sure this USB 5V / DC 12V step up converter limits the current at 0.8A Amazon US Amazon FR 1 Maschinenreich peristaltic pump 12V XP88-ST01 This pump can be replaced by others depending on its availability Amazon US 2 Linear Stepper Motor Make sure to select two linear stepper Amazon US 1 MicroSD Card + Adapter Minimum size is 32GB Amazon US Amazon FR 1 kit Heat sink kit for Raspberry Pi Only one kit needed Amazon US Mouser FR"},{"location":"setup/hardware/v2.1/kit/#fluidic-components","title":"Fluidic Components","text":"Quantity Name Details US Link FR Link 1 kit \u00b5-Slide I Luer Variety Pack Make sure to select uncoated Ibidi US Ibidi FR 2 HSW 20ml Syringe Two syringes needed Grainger US Darwin Microfluidics FR 1 kit \u00dcberStrainer Set 3 Optional strainer kit to filter the samples Pluriselect US 1m Silicone Tubing ID 1.6mm Ibidi website provides good but expensive tubing Ibidi US Darwin Microfluidics FR 2 Luer Lock Connector Female 1.6 mm Make sure to select the proper diameter Ibidi US Darwin Microfluidics FR 2 Luer Connector Male 1.6 mm Make sure to select the proper diameter Ibidi US Darwin Microfluidics FR"},{"location":"setup/hardware/v2.1/kit/#optic-components","title":"Optic Components","text":"Quantity Name Details US Link FR Link 1 LED white 5mm Intensity: 23,000 mcd, Forward Voltage: 3.5V, Current: 20mA, Beam Angle: 15\u00b0 DigiKey US Gotronic FR 1 kit Arducam M12 Lens Kit Includes 10 M12 Lenses for various angles of view Amazon US 1 M12 Lens 25mm IR 1/2\" 5MP Additional essential 25mm M12 lens Amazon US AliExpress 1 Pi Camera v2.1 Amazon US"},{"location":"setup/hardware/v2.1/kit/#hardware-components","title":"Hardware Components","text":"Quantity Name Details US Link FR Link 1 M2.5 Standoff Assortment Kit 6mm and 15mm standoffs Amazon US 1 M2 M3 M4 Screw Assortment Kit M2x8mm and M3x12mm screws and M3 nuts Amazon US 1 CR1220 Battery For the Adafruit Ultimate GPS HAT Amazon US Amazon FR 16 Magnets 6 x 2 mm Neodynium magnets to connect functional layers Amazon US"},{"location":"setup/hardware/v2.1/kit/#machine-your-structure","title":"Machine Your Structure","text":"

      To complete your PlanktoScope kit, you'll need to fabricate the structure. This can be done using laser cutting or CNC machining from a sheet of material. You can machine the structure locally at a FabLab or through a company specializing in laser cutting or CNC machining. The cost will vary depending on the material chosen and whether you machine it yourself or use a company.

      "},{"location":"setup/hardware/v2.1/kit/#suggested-materials","title":"Suggested Materials","text":"Material Easy to Machine Robustness Water Resistance Price Recyclable Ideal For Transparent Acrylic \u2605\u2605\u2605\u2605\u2605 \u2605\u2606\u2606\u2606\u2606 \u2605\u2605\u2605\u2605\u2605 \u2605\u2605\u2606\u2606\u2606 \u2606\u2606\u2606\u2606\u2606 Seeing internal electronics Black Acrylic \u2605\u2605\u2605\u2605\u2605 \u2605\u2605\u2606\u2606\u2606 \u2605\u2605\u2605\u2605\u2605 \u2605\u2605\u2605\u2606\u2606 \u2606\u2606\u2606\u2606\u2606 Removing surrounding light Marine Plywood \u2605\u2605\u2605\u2605\u2606 \u2605\u2605\u2605\u2605\u2606 \u2605\u2605\u2605\u2605\u2606 \u2605\u2605\u2605\u2605\u2606 \u2605\u2606\u2606\u2606\u2606 Deploying at sea Basic Plywood \u2605\u2605\u2605\u2606\u2606 \u2605\u2605\u2606\u2606\u2606 \u2605\u2605\u2606\u2606\u2606 \u2605\u2606\u2606\u2606\u2606 \u2605\u2605\u2606\u2606\u2606 Cheap prototyping HDF Forescolor \u2605\u2605\u2605\u2605\u2605 \u2605\u2605\u2605\u2605\u2606 \u2605\u2605\u2605\u2606\u2606 \u2605\u2605\u2605\u2606\u2606 \u2605\u2605\u2605\u2605\u2605 Feeling good about recycling PP Waste, 100% Recycled \u2606\u2606\u2606\u2606\u2606 \u2606\u2606\u2606\u2606\u2606 \u2606\u2606\u2606\u2606\u2606 \u2605\u2605\u2605\u2605\u2606 \u2605\u2605\u2605\u2605\u2605 Feeling good about recycling Aluminum \u2605\u2605\u2605\u2605\u2605 \u2605\u2605\u2605\u2605\u2605 \u2605\u2605\u2605\u2605\u2605 \u2605\u2605\u2605\u2605\u2605 \u2605\u2605\u2605\u2605\u2605 Robust professional setup"},{"location":"setup/hardware/v2.1/kit/#get-the-plan-and-machine-it","title":"Get the Plan and Machine It","text":"

      You can download the necessary fabrication patterns for the structure here; two versions are available, one for material with 5 mm thickness, and the other for material with 1/4 inch thickness:

      • 5 mm thickness: SVG file (recommended), DXF file
      • 1/4 inch thickness: DXF file

      Since DXF files don't include unit information, when you open or import one of these DXF files you may need to rescale all dimensions to achieve the correct sizes. You can check whether dimensions are correct by checking the length and width of part M against the actual dimensions shown below:

      You can also compare the approximate dimensions of parts in the SVG file (for 5 mm thickness material) with the sizes of parts in your imported DXF file to check whether the rescaling result looks approximately correct.

      "},{"location":"setup/hardware/v2.5/","title":"Hardware v2.5","text":"

      This page will help you to build the v2.5 hardware for a PlanktoScope.

      "},{"location":"setup/hardware/v2.5/#make-an-assembly-kit","title":"Make an assembly kit","text":"

      If you do not already have an assembly kit, you will need to make a kit for yourself.

      "},{"location":"setup/hardware/v2.5/#assemble-a-planktoscope-from-a-kit","title":"Assemble a PlanktoScope from a kit","text":"

      Once you have an assembly kit, you will need to assemble it into a PlanktoScope.

      "},{"location":"setup/hardware/v2.5/#next-steps","title":"Next steps","text":"

      If you assembled your PlanktoScope from a kit provided by FairScope, you can proceed to our operation guide\u00a0to learn how to operate your PlanktoScope. Otherwise, you will first need to set up the PlanktoScope software on the micro-SD card of your PlanktoScope's Raspberry Pi.

      "},{"location":"setup/hardware/v2.5/assembly/","title":"Assembly","text":""},{"location":"setup/hardware/v2.5/assembly/#content-of-the-kit","title":"Content of the Kit","text":"

      It is important to ensure that you have all of the necessary components before beginning the assembly of your PlanktoScope. To do so, please check that all bags are present as part of the kit.

      Bag Content A Scews B Tools C Adhesive Pads D Tubing, Glass Cuvettes E Bubbler Pump F Peristaltic Pump G Linear Stepper Motor H Raspberry PI Chip cooler I Raspberry HAT J Camera Lens K MicroSD Card, DC Power Jack Socket L DC Power Supply and Cable M Syringe and Falcon Tube X1 Raspberry PI 4 X2 Pipet X3 Cable ties X4 Raspberry PI HQ Camera Modul X5 Sandpaper

      If any bags are missing, please go back to the BOM (Bill of Materials) and reorder the required components.

      "},{"location":"setup/hardware/v2.5/assembly/#about-this-document","title":"About this document","text":"

      To read this document, follow these guidelines:

      "},{"location":"setup/hardware/v2.5/assembly/#color-codes","title":"Color codes","text":"
      • \ud83d\udd34\u00a0Look to the color red
      • \ud83d\udfe0\u00a0Look to the color orange
      • \ud83d\udfe1\u00a0Look to the color yellow
      • \ud83d\udfe2\u00a0Look to the color green
      • \ud83d\udd35\u00a0Look to the color blue
      • \ud83d\udfe3\u00a0Look to the color purple
      "},{"location":"setup/hardware/v2.5/assembly/#icons","title":"Icons","text":"
      • \ud83d\udc41\u00a0Pay attention to this
      • \u26a0\u00a0Be careful with this
      • \ud83d\udcdc\u00a0The book says
      • \ud83c\udfac\u00a0Action !
      • \u274c\u00a0Don't focus on that location

      As you read through the document, be sure to pay attention to these visual cues to guide you through the build process.

      "},{"location":"setup/hardware/v2.5/assembly/#requirements","title":"Requirements","text":""},{"location":"setup/hardware/v2.5/assembly/#tools","title":"Tools","text":"

      Content of\u00a0Bag B:

      • \ud83d\udd34\u00a0B1. Small flat screwdriver 2mm
      • \ud83d\udfe0\u00a0B2. Razor blade
      • \ud83d\udfe1\u00a0B3. Allen key 2mm
      • \ud83d\udfe2 B4. Wrenches for standoffs
      "},{"location":"setup/hardware/v2.5/assembly/#components","title":"Components","text":"

      Content of\u00a0Bag A:

      • \ud83d\udfe2\u00a0A1. Standoff M2.5 - 6mm - Brass
      • \ud83d\udd35\u00a0A2. Standoff M2.5 - 15mm - \u00a0Brass
      • \ud83d\udfe3\u00a0A3. Standoff M2.5 - 16mm - SS
      • \ud83d\udfe0\u00a0A4. Screw M2.5x5mm CHC - SS
      • \ud83d\udfe1\u00a0A5. Screw M2.5x10mm CHC - SS
      • \ud83d\udd34\u00a0A6. Screw M3x12mm BHC - SS
      "},{"location":"setup/hardware/v2.5/assembly/#chapter-1-detach-the-parts-from-panels-by-cutting-the-tabs","title":"Chapter 1: Detach the Parts from panels by cutting the tabs","text":"

      \ud83d\udc41 Locate the panel S1 and discover the 5 differents Parts F, P, K, J and I.

      \ud83c\udfac Flip your panel S1.

      \ud83d\udd34 Locate the outer tabs on the edges of the different Parts. These are typically small projections of material that are used to secure the case parts to the panels.

      Gather all the necessary tools. You will need the B2 \ud83d\udfe0 Razor blade to cut the tabs.

      • \ud83d\udfe3 Use the razor blade to cut the outer tabs located on the edges of the different Parts
      • \u274c Do not cut the inner tabs present inside the different Parts for now and focus on the outer tabs attaching the Parts to the main panel.

      • Position your razor blade on the tab as close to the piece as possible to avoid residual tab after cutting.
      • Press firmly on the razor blade, being very careful with your finger, to cut your first tab.
      • Make sure you don't damage your table by placing a flat, rigid support under the S1 panel.
      • Keep going with the other tabs of this piece F.

      Once all of the tabs are cut, gently lift the case parts away from the panels. If the case parts are stuck or difficult to remove, you may need to gently wiggle or pry them loose using a flat tool such as a screwdriver.

      Warning

      Be extremely careful because this is very sharp.

      Once you have removed your Part from the main panel by cutting off all the tabs holding it, inspect it for potential residual tabs.

      • \ud83d\udfe3 Here is a residual tab that will need to be removed.
      • \ud83d\udfe0 Here there is no residual tab which is perfect.

      \ud83d\udfe3 Place your razor blade flat on the edge of your piece being very careful with your fingers and cut the residual tab.

      Warning

      Be extremely careful because this is very sharp.

      Repeat the cutting of the tabs on all the Parts F, P, K, J and I present on the panel S1.

      Warning

      Be extremely careful because this is very sharp.

      \ud83d\udd34 Locate the inner tabs on the edges of the different Parts.

      Cut out the tabs inside of all the Parts F, P, K, J and I detached from the panel S1.

      Dispose of the cut tabs and any other debris that may have been created during the detachment process.

      Warning

      Be extremely careful because this is very sharp.

      • \u2705 Good way of cutting inner tabs
      • \u274c Wrong way of cutting inner tabs

      Repeat the process on the panel S2.

      Warning

      Be extremely careful because this is very sharp.

      Discover the 11 differents Parts.

      Dispose of the cut tabs and any other debris that may have been created during the detachment process. Inspect the case parts and panels for any damage or imperfections that may have occurred during the detachment process. If any damage is found, it may be necessary to repair or replace the affected parts.

      "},{"location":"setup/hardware/v2.5/assembly/#chapter-2-place-the-4-adhesive-pads-under-the-part-i","title":"Chapter 2: Place the 4 Adhesive Pads under the Part I","text":"

      To secure the PlanktoScope on slippery grounds using the adhesive pads, follow these steps. Gather all the necessary materials. You will need:

      • Time: 1 min
      • \ud83d\udc41 and Take the Part I
      • \ud83d\udfe0 Take the four adhesive pads present in the bag A.
      • \ud83d\udfe3 Locate the four pockets that will receive the four adhesive pads.

      • Clean the bottom of the case part I. Make sure the surface is free of dirt, debris, and any other substances that may prevent the adhesive pads from sticking properly.
      • Remove the paper and place the four adhesive pads in the pockets by pressing firmly on them, sticky-side down.
      • Test the stability of the PlanktoScope by gently shaking or tilting it. If it feels secure and does not slip or slide, the adhesive pads have been successfully installed.

      Note

      \ud83c\udfac Store this assembly for later.

      "},{"location":"setup/hardware/v2.5/assembly/#chapter-3-screw-the-four-standoffs-into-part-a","title":"Chapter 3: Screw the four Standoffs into Part A","text":"

      Now it's time to assemble the ground plate for the Raspberry Pi as the PlanktoScope main processing unit.

      • Time: 5 min

      • \ud83d\udc41 Grab the Part A.
      • \ud83d\udfe3 Locate the four holes on Part A.

      \ud83d\udfe2 A1. Standoff M2.5 - 6mm- Brass

      \ud83d\udfe2 B4. Wrenches for standoffs

      • \ud83d\udfe3 Place the Standoff M2.5 - 6mm in the small side of the wrenches for standoffs B4.
      • \ud83d\udfe0 Do not use the big side of the wrenches for standoffs since the standoff will be loose in it.

      • Place the standoff in the hole and start rotating by hand in a clockwise direction until secure.
      • Then tighten with the wrench.

      • \u2705 Make sure to screw until the standoff is properly inserted in the hole.
      • \u274c Do not stop screwing before.

      Keep going for each of the four holes.

      "},{"location":"setup/hardware/v2.5/assembly/#chapter-4-mount-the-heat-sinks-on-the-raspberry-pi","title":"Chapter 4: Mount the Heat Sinks on the Raspberry Pi","text":"
      • Time: 2 min

      Locate the Raspberry Pi 4 Model B packaging.

      Warning

      Be careful removing it from its packaging.

      Place the four Heat Sinks next to your Raspberry Pi and mark the locations of the Heat Sinks on the Raspberry Pi.

      • \ud83d\udfe0 & \ud83d\udd35 Small Heat Sinks
      • \ud83d\udfe2 Medium Heat Sink
      • \ud83d\udfe3 Big Heat Sink

      Remove the protective labels under a Heat Sink and place the Heat Sink on the slot of the Raspberry Pi.

      Remove the protective labels under all the Heat Sinks and place all the Heat Sinks on the slots of the Raspberry Pi.

      "},{"location":"setup/hardware/v2.5/assembly/#chapter-5-insert-the-micro-sd-card-in-the-raspberry-pi","title":"Chapter 5: Insert the micro SD card in the Raspberry Pi","text":"
      • Locate the SD card adapter in the bag K.
      • The micro SD card is inserted in the SD card adapter.
      • \ud83d\udfe3 Remove the micro SD card from the SD card adapter.
      • Flip your Raspberry Pi.
      • \ud83d\udfe0 Locate the micro SD port.
      • \ud83d\udfe3 Insert the micro SD card in the Raspberry Pi.

      Push the micro SD card in the Raspberry Pi port to a point of resistance.

      Note

      If you notice that the micro SD card protrudes about 2mm from its slot, this is normal.

      "},{"location":"setup/hardware/v2.5/assembly/#chapter-6-mount-the-raspberry-pi-on-the-part-a","title":"Chapter 6: Mount the Raspberry Pi on the Part A","text":"
      • Time: 1 min
      • \u2705 Make sure to position the Raspberry Pi properly on the four standoffs screwed on the Part A.
      • \u274c Do not invert the position of the Raspberry Pi on the four standoffs screwed on the Part A.

      \ud83d\udfe3 A3. Standoff M2.5 - 16mm - SS

      Screw by hand a Standoff M2.5 - 16mm on the Raspberry Pi.

      • Screw by hand all Standoffs M2.5 - 16mm on the Raspberry Pi.
      • Make sure you insert all four standoffs by hand and tighten slightly.

      \ud83d\udfe2 B4. Wrenches for standoffs

      • \ud83d\udfe0 Secure the Standoff M2.5 - 16 mm - SS A3 in the big side of the wrenches for standoffs B4.
      • \ud83d\udfe3 Do not use the small side of the wrenches for standoffs since the standoff won\u2019t fit in it.
      "},{"location":"setup/hardware/v2.5/assembly/#chapter-7-attach-the-ribbon-cable-to-the-raspberry-pi","title":"Chapter 7: Attach the Ribbon Cable to the Raspberry Pi","text":"
      • Time: 2 min

      Locate the Raspberry Pi Camera HQ packaging.

      Warning

      Be careful removing it from its packaging.

      Lay your Raspberry Pi Camera face down on a suitable surface.

      \ud83d\udd34 The black connector is simply a push/pull fit. To disengage the cable, pull the two corners of the black connector down, away from the camera board. It will unclip to about 3mm, make sure you don't pull it off! If you're struggling, try pulling off one corner of the connector at a time.

      Warning

      Be careful with this, this part is delicate. Lift the black connector gently

      Once the connector has been disengaged from the Raspberry Pi camera board, the cable will simply slide out!

      • \ud83d\udfe3 Put aside Camera the Raspberry Pi
      • \ud83d\udfe2 Keep the Ribbon Cable for next step.

      \ud83d\udd34 Locate the black connector present on the Raspberry Pi.

      \ud83d\udd34 The black connector is simply a push/pull fit. To disengage the cable, pull the two corners of the black connector down, away from the camera board. It will unclip to about 3mm, make sure you don't pull it off! If you're struggling, try pulling off one corner of the connector at a time.

      Warning

      Be careful, this part is delicate. Gently prise the black connector with nail or fingertip and thumb.

      Insert the Ribbon Cable you just detached from the Raspberry Pi Camera in the Raspberry Pi.

      • Make sure to insert in as much as you can.
      • Blue rectangle on Ribbon Cable should face the same direction as the arrow below.

      \ud83d\udd34 Secure the Ribbon Cable in the Raspberry Pi by pressing firmly on the black connector.

      "},{"location":"setup/hardware/v2.5/assembly/#chapter-8-mount-the-planktoscope-hat-on-the-raspberry-pi","title":"Chapter 8: Mount the PlanktoScope HAT on the Raspberry Pi","text":"
      • Time: 2 min

      Locate the PlanktoScope HAT present in bag I.

      \ud83d\udd34 Thread the Ribbon cable through the PlanktoScope HAT slot from the underside.

      Warning

      Make sure the two \ud83d\udfe3 black connectors are aligned before threading through the ribbon.

      \ud83d\udd34 Plug the PlanktoScope HAT into the Raspberry Pi.

      Warning

      Make sure the two black connectors are aligned before attaching them together.

      Press the PlanktoScope HAT against the Raspberry Pi until it is no longer possible to move them closer together.

      Warning

      Continue to feed through the Ribbon Cable and do not crush it while pressing the PlanktoScope HAT against the standoffs.

      \ud83d\udfe0 A4. Screw M2.5X5mm CHC - SS

      \ud83d\udfe3 Locate the 4 holes on the top of the PlanktoScope HAT and insert the four M2.5X5mm

      \ud83d\udfe1 B3. Allen key 2mm

      Screw the four A4 screws through the PlanktoScope HAT onto the Standoff M2.5 - 16mm.

      Note

      \ud83c\udfac Store this assembly for later.

      "},{"location":"setup/hardware/v2.5/assembly/#chapter-9-place-the-power-socket-on-part-m","title":"Chapter 9: Place the Power Socket on Part M","text":"
      • Time: 2 min
      • Locate the DC Power Jack from the Bag K.
      • Remove the Lock Ring from the DC Power Jack
      • \ud83d\udd34 Lay the Part M down and make sure the pockets in these holes are facing upwards.
      • \ud83d\udfe3 Locate the Power Socket hole on Part M.

      \ud83d\udd34 Insert the cable inside of the hole by being sure of the orientation of the Part M.

      \ud83d\udfe3 Flip the Part M and secure the DC Power Jack by hand on the Part M by screwing the Lock Ring.

      Warning

      Make sure the Lock Ring doesn\u2019t spin on itself.

      Note

      \ud83c\udfac Store this assembly for later.

      "},{"location":"setup/hardware/v2.5/assembly/#chapter-10-mount-the-raspberry-pi-camera-hq-on-part-b","title":"Chapter 10: Mount the Raspberry Pi Camera HQ on Part B","text":"
      • Time: 2 min

      \ud83d\udfe3 Locate the 4 holes on the top of the Part B.

      \ud83d\udd35 A2. Standoff M2.5 - 15mm - Brass

      Insert the four Standoff M2.5 - 15mm.

      The result should be similar to the picture.

      \ud83d\udfe2 B4. Wrenches for standoffs

      Using the small side of the Standoff Wrench, secure the 4 M2.5 - 15mm Standoffs

      • \u2705 Make sure to screw until the Standoff is properly tightened into the hole.
      • \u274c Do not stop screwing before.

      Locate the Raspberry Pi Camera HQ

      Remove the lens cap Raspberry Pi Camera HQ.

      Warning

      Make sure your camera lens is clean. If it is not, gently wipe using cotton swab for this task.

      Place the Raspberry Pi Camera HQ on top of the four Standoffs installed on Part B.

      \ud83d\udfe3Ensure correct orientation of the Raspberry Pi Camera HQ. The black connector where the Ribbon Cable was removed is on the same side as the \ud83d\udfe2slot circled in green

      \ud83d\udfe0 A4. Screw M2.5X5mm CHC - SS

      \ud83d\udfe1 B3. Allen key 2mm

      Use the allen key and tighten the Raspberry Pi Camera to the Standoffs.

      The result should be similar to the picture.

      Note

      \ud83c\udfac Store this assembly for later.

      "},{"location":"setup/hardware/v2.5/assembly/#chapter-11-mount-the-linear-stepper-motor-on-part-e","title":"Chapter 11: Mount the Linear Stepper Motor on Part E","text":"

      Locate the Stepper Motors

      Warning

      Avoid touching the metal rods on the Stepper Motors

      Info

      You can touch the \ud83d\udfe3 gold stands

      \ud83d\udfe1 A5. Screw M2.5X10mm CHC - SS

      \ud83d\udfe1 B3. Allen key 2mm

      • \ud83d\udd34 Lay the Part E down and make sure the pockets in these holes are facing upwards.
      • \ud83d\udfe3 Locate the four holes on Part E and place four M2 Screws in the holes.

      Attach the stepper motors to the screws we have just placed with the \ud83d\udd34 pockets positioned on opposite to the cabling.

      The result should be similar to the picture.

      Use the 2mm allen key to fix the Stepper Motors.

      The result should be similar to that picture.

      The result should be similar to the picture.

      Repeat the process on the other side with the other Stepper Motor.

      Repeat the process on the other side with the other Stepper Motor.

      The result should be similar to the picture.

      Note

      \ud83c\udfac Store this assembly for later.

      "},{"location":"setup/hardware/v2.5/assembly/#chapter-12-mount-the-led-on-part-g","title":"Chapter 12: Mount the\u00a0LED\u00a0on\u00a0Part G","text":"
      • Locate the\u00a0LED\u00a0and\u00a0LED cable\u00a0in Bag K.
      • \ud83d\udfe3\u00a0The LED will go on the end where\u00a0the white plastic connector is\u00a0smallest.

      Insert the\u00a0LED into the LED cable.

      The result should be similar to the\u00a0picture.

      Locate part\u00a0G.

      \ud83d\udfe3\u00a0Locate the LED hole on\u00a0Part G.

      We\u00a0will\u00a0now\u00a0place\u00a0the\u00a0LED\u00a0into\u00a0the\u00a0slot\u00a0on part\u00a0G.

      Warning

      Gently push the LED into the LED\u00a0hole located on Part\u00a0G. It should be a snug fit.

      The result should be similar to the\u00a0picture.

      Info

      \ud83c\udfac\u00a0Store this assembly for later.

      "},{"location":"setup/hardware/v2.5/assembly/#chapter-13-mount-the-peristaltic-pump-on-part-o-and-part-l","title":"Chapter 13: Mount the\u00a0Peristaltic Pump\u00a0on\u00a0Part O and\u00a0Part L","text":"
      • Locate the\u00a0Kamoer Peristaltic pump\u00a0from the\u00a0Bag F.
      • \ud83d\udfe3\u00a0Put aside the\u00a0tubing contained in\u00a0the little bag.

      \ud83d\udfe2\u00a0Insert the cable of the\u00a0Peristaltic Pump\u00a0into the hole on\u00a0Part O\u00a0and\u00a0then insert the motor block assembly\u00a0of the pump into it.

      Warning

      \ud83d\udc41 Ensure the correct orientation of\u00a0Part O\u00a0and the\u00a0Peristaltic Pump

      \ud83d\udfe1\u00a0A5. Screw\u00a0M2.5X10mm\u00a0CHC - SS

      \ud83d\udfe1\u00a0B3. Allen key 2mm B3

      \ud83d\udfe2\u00a0Insert the two\u00a0M2.5X10mm\u00a0in the\u00a0two holes.

      Screw the two\u00a0M2.5X10mm\u00a0into the\u00a0two holes.

      \ud83d\udd34\u00a0Lay\u00a0the\u00a0Part\u00a0L\u00a0down and make\u00a0sure the pockets in these holes are\u00a0facing upwards.

      • Place\u00a0the\u00a0Peristaltic Pump underneath part L, ensuring the\u00a0correct orientation of these two parts.
      • \ud83d\udd34 Insert the Peristaltic Pump into\u00a0the allocated slot in\u00a0Part L.

      Insert the\u00a0Peristaltic Pump\u00a0into the\u00a0allocated slot in\u00a0Part L.

      Insert the\u00a0Peristaltic Pump\u00a0into the\u00a0allocated slot in\u00a0Part L.

      • Lay the assembly down.
      • \ud83d\udd34\u00a0Locate the\u00a0four different holes.

      \ud83d\udfe1\u00a0A5.Screw\u00a0M2.5X10mm\u00a0CHC - SS

      \ud83d\udfe1\u00a0B3.Allen key 2mm

      Screw the four M2.5X10mm in the\u00a0located\u00a0holes\u00a0attaching\u00a0the\u00a0Part\u00a0O\u00a0to\u00a0the\u00a0Part L Peristaltic Pump.

      The result should be similar to the\u00a0picture.

      Info

      We will use this part in the next step.

      "},{"location":"setup/hardware/v2.5/assembly/#chapter-14-spiral-wrap-the-led-and-peristaltic-pump-cabling","title":"Chapter 14: Spiral wrap the LED and Peristaltic Pump cabling","text":"
      • Locate the LED and housing, along\u00a0with the pump and housing.
      • \ud83d\udfe3\u00a0Locate the\u00a0spiral wrap\u00a0from\u00a0bag K.
      • Spiral wrap both sets of cables\u00a0together.
      • There should be 4 cm (1.5 inches)\u00a0between\u00a0the\u00a0connectors\u00a0and\u00a0the\u00a0start\u00a0of the spiral wrap.

      Continue wrapping around the\u00a0cables until you have used all of the\u00a0spiral wrap, leaving small or no gaps.

      Info

      The result should look the same as\u00a0the picture.

      Info

      The result should look the same as\u00a0the picture.

      Note

      \ud83c\udfac\u00a0Store this assembly for later.

      "},{"location":"setup/hardware/v2.5/assembly/#chapter-15-attaching-the-stepper-motors-to-the-raspberry-pi-camera","title":"Chapter 15: Attaching the\u00a0Stepper Motors\u00a0to the\u00a0Raspberry Pi Camera","text":"

      Locate the Stepper Motors with\u00a0mount, and the Raspberry Pi\u00a0Camera.

      Feed the Stepper Motor cables into\u00a0the\u00a0slots\u00a0either\u00a0side\u00a0of\u00a0the\u00a0Raspberry\u00a0Pi Camera.

      Warning

      Make sure the orientation is\u00a0correct and matches the picture.

      Feed the Stepper Motor cables into\u00a0the\u00a0slots\u00a0either\u00a0side\u00a0of\u00a0the\u00a0Raspberry\u00a0Pi Camera.

      Warning

      Make sure the orientation is\u00a0correct and matches the picture.

      Then\u00a0insert\u00a0the\u00a0cylindrical\u00a0parts\u00a0of\u00a0the\u00a0Stepper Motor into the slots.

      Feed the Stepper Motor cables into\u00a0the\u00a0slots\u00a0either\u00a0side\u00a0of\u00a0the\u00a0Raspberry\u00a0Pi Camera.

      Warning

      Make sure the orientation is\u00a0correct and matches the picture.

      Then\u00a0insert\u00a0the\u00a0cylindrical\u00a0parts\u00a0of\u00a0the\u00a0Stepper Motor into the slots.

      Note

      The\u00a0result\u00a0should\u00a0be\u00a0the\u00a0same\u00a0as\u00a0the\u00a0picture.

      "},{"location":"setup/hardware/v2.5/assembly/#chapter-16-connecting-the-raspberry-pi-camera-to-the-raspberry-pi-hat","title":"Chapter 16: Connecting the\u00a0Raspberry Pi Camera\u00a0to the\u00a0Raspberry Pi HAT","text":"
      • We will need the\u00a0Raspberry Pi HAT with housing and Ribbon Cable along\u00a0\\ with the\u00a0Raspberry Pi Camera with\u00a0Stepper Motors and housing.
      • We will be connecting the\u00a0\ud83d\udfe2Ribbon\u00a0Cableto the\u00a0\ud83d\udfe1black\u00a0Raspberry Pi Camera\u00a0connector\u00a0that we removed\u00a0it from earlier.

      Gently feed the\u00a0Ribbon Cable\u00a0into the\u00a0port of the\u00a0Camera.

      Warning

      \ud83d\udc41 Ensure the correct orientation of\u00a0the\u00a0Ribbon Cable\u00a0with the blue end\u00a0facing upwards.

      \ud83d\udd34\u00a0Press down on the black\u00a0connector on the Raspberry Pi\u00a0camera board once the Ribbon\u00a0Cable is in position.

      \ud83d\udd34\u00a0B1.Small flat screwdriver 2mm

      • Now we will plug in the\u00a0Stepper\u00a0Mounts to the\u00a0HAT.
      • \ud83d\udd34The cables for the\u00a0Stepper Mounts\u00a0will be plugged into the\u00a0HAT\u00a0\ud83d\udfe3here.

      Warning

      Hold tight, a specific order is\u00a0required.

      Starting with the\u00a0red cable, insert the\u00a0cable in the far left port and tighten\u00a0the screw situated above the port.

      Note

      The result should look the same as\u00a0the picture.

      Repeat this process with the order\u00a0pictured here from left to right:\u00a0\ud83d\udd34 Red\u00a0\ud83d\udfe1 Yellow\u00a0\ud83d\udd35 Blue\u00a0\u26ab Black.

      "},{"location":"setup/hardware/v2.5/assembly/#chapter-17-connect-the-led-and-peristaltic-pump-to-the-raspberry-pi","title":"Chapter 17: Connect the\u00a0LED\u00a0and\u00a0Peristaltic Pump\u00a0to the\u00a0Raspberry Pi","text":"

      We will now be connecting the LED\u00a0and Peristaltic Pump with the\u00a0Raspberry Pi HAT\u00a0and\u00a0Camera.

      Place the LED housing onto the\u00a0Stepper Mounts.

      Warning

      \ud83d\udc41 Ensure correct orientation of both\u00a0\ud83d\udfe3 parts by looking at the\u00a0precut holes.

      Info

      The result should be similar to the\u00a0picture.

      Now we will plug in the\u00a0LED and\u00a0Stepper Mount\u00a0cables to the\u00a0Raspberry Pi.

      Feed the area of cabling that is not\u00a0covered by the\u00a0spiral wrap\u00a0through\u00a0the two holes to start. Then thread\u00a0through to the\u00a0spiral wrap\u00a0so that it\u00a0matches the picture.

      We will now plug the cables into the\u00a0correct ports.

      \ud83d\udfe3\u00a0The four wires (\ud83d\udd34 Red\u00a0\ud83d\udd35 Blue \ud83d\udfe2 Green \u26ab Black) enter the side port on the\u00a0Raspberry Pi HAT.

      \ud83d\udd34 The two wires (LED) enter on the\u00a0port on top of the Raspberry Pi HAT.

      The result should be similar to the\u00a0picture.

      Note

      We will use this assembly in the next\u00a0step.

      "},{"location":"setup/hardware/v2.5/assembly/#chapter-18-connect-the-dc-power-jack-to-the-raspberry-pi","title":"Chapter 18: Connect the\u00a0DC Power Jack\u00a0to the\u00a0Raspberry Pi","text":"
      • \ud83d\udfe2\u00a0Locate the\u00a0DC Power Jack
      • We will plug the DC Power Jack\u00a0into the Raspberry Pi via the \ud83d\udd35 blue port.

      \ud83d\udd34\u00a0B1.Small flat screwdriver 2mm

      • Insert the \ud83d\udd34 red cable of the DC\u00a0Power Jack into the left side of the\u00a0blue port.
      • Tighten the screw above.

      • Insert the \u26ab black cable of the DC\u00a0Power\u00a0Jack\u00a0into\u00a0the\u00a0right\u00a0side\u00a0of\u00a0the\u00a0blue port.
      • Tighten the screw above.

      Info

      The result should be similar to the\u00a0picture.

      Note

      We will use this assembly in the next\u00a0step.

      "},{"location":"setup/hardware/v2.5/assembly/#chapter-19-your-planktoscope-starts-to-take-shape","title":"Chapter 19: Your PlanktoScope starts to take shape","text":"

      Locate Part I\u00a0and\u00a0Part H.

      • Slot\u00a0Part H\u00a0into\u00a0Part I.
      • \ud83d\udfe3\u00a0Note the orientation.\u00a0Part H\u00a0goes\u00a0into\u00a0Part Iat the end with the\u00a0rectangular slot (as opposed to the\u00a0rectangle with bulbous hole).
      • \ud83d\udfe1\u00a0Also, the deeper slots on\u00a0part H\u00a0should be on the upper side.

      \ud83d\udd34 Slot the\u00a0Peristaltic Pump\u00a0above\u00a0the\u00a0LED.

      Note

      The result should be the same as the\u00a0picture.

      Warning

      \ud83d\udc41 Ensure the correct orientation of\u00a0the housing and the\u00a0Peristaltic Pump.

      At the other end, slot the\u00a0DC Power\u00a0Jack\u00a0housing adjacent to the\u00a0Raspberry Pi.

      Rotate so that the DC Power Jack is\u00a0facing upwards. We will now slot the Raspberry Pi onto\u00a0the rest of the housing.

      Info

      The result should be similar to that\u00a0picture.

      Note

      \ud83c\udfac\u00a0Store this assembly for later.

      "},{"location":"setup/hardware/v2.5/assembly/#chapter-20-inserting-screws","title":"Chapter 20: Inserting screws","text":"

      \ud83d\udfe3 We\u00a0will\u00a0now\u00a0insert\u00a0eight\u00a0M3\u00a0screws\u00a0to fasten the housing together.

      Note

      \ud83c\udfac\u00a0Store this assembly for later.

      \ud83d\udd34\u00a0A6. Screw M3X12mm BHC - SS

      \ud83d\udfe1\u00a0B3. Allen key 2mm

      Info

      The result should be similar to the\u00a0picture.

      We will now turn over the\u00a0PlanktoScope\u00a0and\u00a0repeat\u00a0the\u00a0process\u00a0for the underside.

      \ud83d\udfe3\u00a0Insert eight more M3 screws on the\u00a0underside.

      Info

      The result should be similar to the\u00a0picture.

      Now turn the PlanktoScope on its side.

      Warning

      \ud83d\udc41 Ensure the orientation of your\u00a0PlanktoScope and\u00a0Part K\u00a0matches\u00a0the picture.

      Slot\u00a0Part K\u00a0onto the rest of the\u00a0PlanktoScope.

      Warning

      \ud83d\udfe2\u00a0Ensure the correct orientation. The\u00a0result should look the same at the\u00a0picture.

      Content of\u00a0Bag A: \ud83d\udd34\u00a0A6. Screw M3X12mm BHC - SS

      Content of\u00a0Bag B: \ud83d\udfe1\u00a0B3. Allen key 2mm

      \ud83d\udfe3\u00a0Insert eight more M3 screws on the\u00a0side to hold\u00a0Part K\u00a0in place.

      We will now place\u00a0Part J\u00a0into position\u00a0as the housing for the side.

      Warning

      \ud83d\udc41 Ensure your PlanktoScope matches\u00a0the orientation in the picture.

      \ud83d\udfe2 Place\u00a0Part K\u00a0onto the rest of the\u00a0PlanktoScope and note the position\u00a0of the cutout.

      Content of\u00a0Bag A: \ud83d\udd34\u00a0A6. Screw M3X12mm BHC - SS

      Content of\u00a0Bag B: \ud83d\udfe1\u00a0B3. Allen key 2mm

      \ud83d\udfe3\u00a0Insert eight more M3 screws on the\u00a0underside

      Info

      The result should be similar to the\u00a0picture.

      Content of\u00a0Bag A: \ud83d\udfe1\u00a0A5. Screw M2.5X10mm CHC - SS

      Place\u00a0the\u00a0M2.5\u00a0screw\u00a0through\u00a0Part\u00a0N. It\u00a0will\u00a0act\u00a0as\u00a0a\u00a0cover\u00a0for\u00a0the\u00a0electrical\u00a0inputs.

      • Place the\u00a0cover\u00a0over the electrical\u00a0inputs on the PlanktoScope.
      • \ud83d\udfe3 The screw will enter the hole\u00a0located here.

      Using the allen key, tighten the screw\u00a0so that it is possible to move the\u00a0cover with light force.

      Info

      The\u00a0result\u00a0should\u00a0be\u00a0the\u00a0same\u00a0as\u00a0the\u00a0picture.

      "},{"location":"setup/hardware/v2.5/assembly/#chapter-21-insert-the-tubing-in-the-peristaltic-pump","title":"Chapter 21: Insert the tubing in the\u00a0Peristaltic Pump","text":"
      • Orientate\u00a0your\u00a0PlanktoScope\u00a0so\u00a0that\u00a0it\u00a0matches the picture.
      • Twist off the orange top of the\u00a0Peristaltic\u00a0pump\u00a0in\u00a0an\u00a0anti-clockwise\u00a0direction.

      You can now remove the Peristaltic\u00a0Pump housing and\u00a0\ud83d\udfe2 Rotor.

      You can now remove the Peristaltic\u00a0Pump housing and\u00a0\ud83d\udfe2 Rotor.

      \ud83d\udd34 Locate the\u00a0Tube\u00a0for the Peristaltic\u00a0Pump in\u00a0Bag F\u00a0and remove it from the\u00a0bag.

      Warning

      The tips of the Tubing that are\u00a0covered by black rubber are very\u00a0delicate and easily broken.

      Insert the first plastic arch of the\u00a0Tube\u00a0into the slot on the Peristaltic Pump\u00a0\\ housing.

      Info

      The result should be similar to the\u00a0picture.

      Insert the\u00a0Rotor\u00a0into the housing\u00a0ensuring the correct orientation. The\u00a0hole in the centre should be visible on\u00a0the underside.

      Info

      The result should be similar to the\u00a0picture.

      Insert the\u00a0Rotor\u00a0into the housing.\u00a0Then, thread the\u00a0Tube\u00a0around the\u00a0Rotor\u00a0and insert the other plastic\u00a0arch into the second slot.

      Info

      The result should be similar to the\u00a0picture.

      • Thread the\u00a0Tube\u00a0around around the\u00a0Rotor\u00a0and insert the other plastic\u00a0arch into the second slot.
      • This will require stretching the\u00a0Tube\u00a0slightly.

      Info

      The result should be similar to the\u00a0picture.

      Place the Peristaltic Pump housing\u00a0back onto the PlanktoScope.

      Achieve the angle shown in the\u00a0picture between the Peristaltic Pump\u00a0housing and PlanktoScope main\u00a0body. Then, press and twist in a\u00a0clockwise direction.

      Info

      The result should be similar to the\u00a0picture.

      • \ud83d\udfe3\u00a0Gently remove the black rubber\u00a0covers for the Peristaltic Pump\u00a0connectors by pinching the very tip\u00a0and pulling away.
      • Once complete, locate\u00a0Bag D\u00a0which\u00a0contains tubing.

      Push the small piece of tubing from\u00a0Bag D\u00a0over the left-side connector of\u00a0the\u00a0Peristaltic Pump.

      Place the long piece of tubing from\u00a0Bag D\u00a0over the right-side connector\u00a0of the\u00a0Peristaltic Pump.

      Insert the connector from\u00a0Bag D\u00a0into\u00a0the other end of the\u00a0small piece of\u00a0tubing.

      Orientate\u00a0Part P\u00a0so that the magnets\u00a0are face-down on the left-hand side.

      Place Part P over the magnets\u00a0adjacent to the\u00a0Peristaltic Pump.

      Info

      The result should be similar to the\u00a0picture.

      \ud83d\udd34 From\u00a0Bag M, Place the\u00a0light blue Test Tube in the hole adjacent to the\u00a0Peristaltic Pump.

      Place the\u00a0\ud83d\udd35 dark blue Test Tube\u00a0into\u00a0the hole situated outside of the\u00a0PlanktoScope.

      \ud83d\udfe2\u00a0Insert the other end of the long\u00a0piece of tubing into the\u00a0\ud83d\udd35 dark blue Test Tube. This will serve as the waste container.\u00a0The result should look the same as\u00a0the picture.

      • Locate Part\u00a0C
      • Locate\u00a025\u00a0mm\u00a0camera\u00a0lens\u00a0and\u00a0Lock Ring\u00a0from\u00a0Bag J.
      • 25MM is printed on the lens.

      • Remove the plastic lens cap.
      • Slot\u00a0the\u00a025\u00a0mm\u00a0camera\u00a0lens into\u00a0Part C.

      Info

      The magnets are raised on the\u00a0side where the lens lays flat.

      Warning

      Try not to touch the lens

      Screw the\u00a0Lock Ring\u00a0onto the lens,\u00a0flat-side down.

      • Locate Part\u00a0D.
      • Locate\u00a016\u00a0mm\u00a0camera\u00a0lens\u00a0and\u00a0Lock\u00a0Ring\u00a0from\u00a0Bag J.
      • 16MM is printed on the lens.

      • Remove the plastic lens cap.
      • Slot\u00a0the\u00a016\u00a0mm\u00a0camera\u00a0lens into Part\u00a0D.

      Info

      The\u00a0magnets\u00a0are\u00a0indented\u00a0on\u00a0the\u00a0side that the lens lays flat.

      Warning

      Try not to touch the lens

      Screw the\u00a0Lock Ring\u00a0onto the lens,\u00a0flat-side down.

      The result should be similar to that\u00a0picture.

      Place\u00a0both\u00a0Lenses (C\u00a0and\u00a0D)\u00a0together\u00a0so that they flat together and both\u00a0lenses are facing each other.

      Info

      The result should be similar to the\u00a0picture.

      Place\u00a0the\u00a0Lenses\u00a0(both\u00a0C\u00a0and\u00a0D)\u00a0into\u00a0position, adjacent to the camera.

      The orientation of your PlanktoScope\u00a0and Lenses should match the\u00a0pictures.

      • Once\u00a0together,\u00a0place\u00a0the\u00a0lenses\u00a0(both\u00a0C and D) into position, adjacent to\u00a0the camera.
      • Part\u00a0C\u00a0/\u00a025mm\u00a0lens\u00a0should\u00a0be\u00a0furthest\u00a0from the pump (orange piece).

      Info

      The result should be similar to the\u00a0picture.

      Info

      The Fluidic Path will have a\u00a0cardboard protector.

      Please take extra precaution while handling\u00a0this\u00a0part\u00a0and\u00a0avoid\u00a0touching\u00a0the glass element of the piece.

      Warning

      The Fluidic Path is very delicate.

      Place the Tube Clamp over the long\u00a0piece\u00a0of\u00a0tube\u00a0at\u00a0the\u00a0end\u00a0of\u00a0the\u00a0Fluidic\u00a0Path.

      Place the white clamp over the long\u00a0piece\u00a0of\u00a0tube\u00a0at\u00a0the\u00a0end\u00a0of\u00a0the\u00a0Fluidic Path.

      Info

      The result should look the same as\u00a0the picture.

      Press down on the Tube Clamp so\u00a0that it clicks into place with just one\u00a0click.

      Info

      The result should look the same as\u00a0the picture.

      Insert\u00a0a\u00a0small\u00a0plastic\u00a0Connector\u00a0into\u00a0the\u00a0end\u00a0of\u00a0the\u00a0tubing,\u00a0below\u00a0the\u00a0Tube\u00a0Clamp.

      Make sure the tubing is over the\u00a0Connector.

      Info

      The result should look the same as\u00a0the picture.

      Remove the cardboard protector\u00a0from the\u00a0Fluidic Path.

      Warning

      A reminder, the glass part of the\u00a0Fluidic\u00a0Path\u00a0is\u00a0very\u00a0delicate.\u00a0Please\u00a0try\u00a0not to touch it.

      Place another Connector at the end\u00a0of the tubing.

      The\u00a0result\u00a0should\u00a0be\u00a0the\u00a0same\u00a0as\u00a0the\u00a0picture.

      \u26a0 Gently place the Fluidic Path in\u00a0the designated indentation on\u00a0Part F.

      Warning

      Do not touch the glass.\u00a0

      • You may have to slightly stretch the\u00a0tubing to get the Fluidic Path into\u00a0position.
      • The\u00a0result\u00a0should\u00a0be\u00a0the\u00a0same\u00a0as\u00a0the\u00a0picture.

      If you have tape available, place a\u00a0small\u00a0piece\u00a0at\u00a0the\u00a0the\u00a0bottom\u00a0of\u00a0Part F so that the tubing remains fixed in\u00a0its position.

      Avoid placing tape over the glass.

      Info

      The result should be similar to the\u00a0picture.

      To\u00a0insert\u00a0the\u00a0syringe,\u00a0place\u00a0finger\u00a0and\u00a0thumb either side of part F where\u00a0green circle is located. This ensures\u00a0the tubing does not rotate while you\u00a0twist the syringe into position in a\u00a0clockwise direction.

      Info

      The result should be similar to the\u00a0picture.

      • Place the Fluidic Path into position\u00a0between the mount and the\u00a0Peristaltic Pump.
      • Connect the magnets to face each\u00a0other.

      The result should look the same as\u00a0the pictures.

      • \ud83d\udfe2 Connect the Fluidic Path to the\u00a0Peristaltic Pump by twisting the two\u00a0connectors together.
      • The\u00a0result\u00a0should\u00a0be\u00a0the\u00a0same\u00a0as\u00a0the\u00a0picture.
      "},{"location":"setup/hardware/v2.5/assembly/#build-complete","title":"Build complete! \ud83d\udcaf \ud83d\udcab","text":""},{"location":"setup/hardware/v2.5/assembly/#next-steps","title":"Next steps","text":"

      Next, you will need to set up the PlanktoScope software on the micro-SD card of your PlanktoScope's Raspberry Pi.

      "},{"location":"setup/hardware/v2.5/kit/","title":"Kit Production","text":""},{"location":"setup/hardware/v2.5/kit/#mechanical-structure","title":"Mechanical Structure","text":"

      CNC (computer numerical control) milling machines are used to fabricate parts with precise dimensions and shapes. The configuration of the feed rate and diameter plays a crucial role in the machining process and can significantly affect the quality and efficiency of the production of a workpiece.

      "},{"location":"setup/hardware/v2.5/kit/#manufacturing-files","title":"Manufacturing files","text":"Files Description PlanktoScope-Case.dxf PlanktoScope Case export for CNC Milling"},{"location":"setup/hardware/v2.5/kit/#tools","title":"Tools","text":"Tool Specification CNC Milling machine minimum traverse path at a minimum size of 600 mm to 1000 mm End Mill \u00d8 6mm End Mill \u00d8 3mm End Mill \u00d8 2mm End Mill \u00d8 1mm"},{"location":"setup/hardware/v2.5/kit/#material","title":"Material","text":""},{"location":"setup/hardware/v2.5/kit/#wood","title":"Wood","text":"

      Valchromat is a wood-based composite material made from recycled wood fibers and colored with natural dyes. It is known for its durability, resistance to moisture and decay, and ability to be machined and finished in a similar way to solid wood. Here are some of the key characteristics of valchromat:

      • Durability: Valchromat is a highly durable material that is resistant to moisture, decay, and termites, making it ideal for use in outdoor or high-moisture environments.

      • Strength: Valchromat has a high mechanical strength, making it suitable for use in structural applications such as flooring, furniture, and doors.

      • Machinability: Valchromat can be machined using traditional woodworking tools, such as saws, routers, and drill bits. It can also be finished using sanding, staining, and painting techniques.

      • Sustainability: Valchromat is made from recycled wood fibers, which makes it a more sustainable option compared to traditional wood products. It is also produced using an eco-friendly manufacturing process that generates zero emissions.

      • Versatility: Valchromat is available in a variety of colors, including shades of red, yellow, green, blue, and black, making it suitable for a wide range of applications and design projects.

      • When compared to conventional MDF wood, valchromat has a number of advantages. It is more durable and resistant to moisture and decay, making it a better choice for use in outdoor or high-moisture environments. Valchromat is also more sustainable, as it is made from recycled wood fibers.

      • Valchromat can be processed using a CNC router in a similar way to MDF wood. However, it is important to consider the specific characteristics of valchromat when setting up the CNC router, such as the appropriate cutting speed and feed rate.

      For the specific use case of the PlanktoScope Case, valchromat was used with a thickness of 8mm. This thickness may be suitable for a variety of applications, depending on the specific requirements and design of the project.

      In summary, valchromat is a durable, strong, and versatile wood-based composite material that can be machined and finished in a similar way to solid wood. It is available in a variety of colors and is a more sustainable alternative to traditional wood products. When processed using a CNC router, it is important to consider the specific characteristics of valchromat in order to achieve the desired results.

      "},{"location":"setup/hardware/v2.5/kit/#finishing","title":"Finishing","text":"

      Rubio Monocoat Plus is a wood finishing product that is designed to provide a durable, natural-looking finish to wood surfaces. It is made from plant-based oils and pigments, which give it a unique, transparent finish that enhances the natural beauty of the wood.

      One of the key features of Rubio Monocoat Plus is its versatility and ease of use. It can be applied to a wide range of wood species, including hardwoods and softwoods, and can be used on both indoor and outdoor surfaces. It is also easy to apply, with a simple one-coat application process that allows users to achieve a professional-grade finish in a matter of hours.

      Rubio Monocoat Plus is also environmentally friendly, with a low VOC (volatile organic compound) content and a biodegradable formula. This makes it a popular choice for those who are looking for a sustainable and eco-friendly wood finishing solution.

      We use Rubio Monocoat Plus as a finishing product for Valchromat.

      "},{"location":"setup/hardware/v2.5/kit/#cnc-workflow","title":"CNC workflow","text":"

      Here is a step-by-step guide on how to configure the feed rate and the diameter of the end mill of a CNC milling machine for the production of a workpiece, using the specified tools and configuration:

      1. Select the appropriate end mill: The end mill should be selected based on the material and shape of the workpiece, as well as the desired level of precision. For this specific production, the following end mills will be used:

      2. 6mm end mill for straight flats

      3. 2mm end mill for inner contours
      4. 1mm end mill for small holes

      5. Determine the feed rate: The feed rate is the speed at which the end mill moves along the surface of the workpiece and is usually measured in millimeters per minute (mm/m). The appropriate feed rate will depend on the diameter of the end mill and the material and thickness of the workpiece. For this specific production, the following feed rates will be used:

      6. 1500mm/min for 1-2mm end mills

      7. 2500mm/min for 3mm end mills
      8. 3500mm/min for 6mm end mills

      9. Load the end mill: Once the appropriate end mill has been selected, it can be loaded onto the spindle of the CNC milling machine.

      10. Set the workpiece: The workpiece should be securely clamped onto the table of the CNC milling machine.

      11. Set the machine parameters: The feed rate and end mill diameter should be entered into the machine's control panel or included in the machining program.

      12. Begin machining: The machining process should be carried out in the following sequence:

      13. Mill the screw holes with a 2mm end mill and then with a 3mm end mill

      14. Mill the corners with a 2mm end mill
      15. Mill everything else with a 3mm end mill

      By following these steps, you can properly configure the feed rate and the diameter of the end mill of a CNC milling machine for the production of a workpiece. It is important to follow the manufacturer's recommendations and guidelines for the specific CNC milling machine being used, as well as to use proper safety measures while operating the machine.

      "},{"location":"setup/hardware/v2.5/kit/#finnish-of-the-case-parts","title":"Finnish of the case parts","text":""},{"location":"setup/hardware/v2.5/kit/#requirements-for-case-parts","title":"Requirements for case parts","text":""},{"location":"setup/hardware/v2.5/kit/#case-tools","title":"Case tools","text":"
      • Hammer
      • Air Compressor
      • Rubber gloves
      • Paper carpet pad
      • Clean piece of cotton fabric
      • Support material for drying the parts
      "},{"location":"setup/hardware/v2.5/kit/#case-part-parts","title":"Case part parts","text":"
      • all case parts
      • Rubio Monocoat Oil Plus 2C
      • Rubio Monocoat Accelerator Component B
      • Magnets
      • Square nuts
      "},{"location":"setup/hardware/v2.5/kit/#clean","title":"Clean","text":""},{"location":"setup/hardware/v2.5/kit/#stir","title":"Stir","text":""},{"location":"setup/hardware/v2.5/kit/#apply","title":"Apply","text":""},{"location":"setup/hardware/v2.5/kit/#dry","title":"Dry","text":""},{"location":"setup/hardware/v2.5/kit/#inserting-the-screws","title":"Inserting the screws","text":""},{"location":"setup/hardware/v2.5/kit/#inserting-the-magnets","title":"Inserting the magnets","text":""},{"location":"setup/hardware/v2.5/kit/#package-housing-part","title":"Package Housing part","text":""},{"location":"setup/hardware/v2.5/kit/#planktoscope-hat","title":"PlanktoScope Hat","text":"

      Welcome to the PCB production manual for the PlanktoScope Hat!

      A PCB (printed circuit board) is a crucial component of many electronic devices, providing a platform for connecting and mounting electronic components. The PCB production process involves several steps, including designing the PCB layout, fabricating the PCB, and assembling the electronic components onto the PCB.

      The raw materials used in PCB production include copper sheets, fiberglass sheets, and various chemicals for etching and plating. These materials are used to create the circuitry patterns on the PCB.

      There are two main types of electronic components that can be mounted onto a PCB: thru-hole components and surface mount components. Thru-hole components have leads that are inserted through holes in the PCB and soldered to the other side, while surface mount components are soldered directly onto the surface of the PCB. The choice between thru-hole and surface mount components depends on the specific requirements of the device being produced.

      Note

      Please note that this document describes a two-part production of the PCB. To reduce costs, the through hole components are assembled manually as described here. Depending on your budget and the services offered by the manufacturing company, this can also be ordered in the production of the PCB.

      "},{"location":"setup/hardware/v2.5/kit/#manufacturing-files_1","title":"Manufacturing files","text":"Files Description Planktoscope-Hat-gerbers.zip The exported Gerber files for PCB fabrication Planktoscope-Hat-bom.csv The list of used SMD components Planktoscope-Hat.pdf The SMD assembly footprints Planktoscope-Hat-PnP-front.txt Pick-and-place machine instructions"},{"location":"setup/hardware/v2.5/kit/#pcb-manufacturing-process","title":"PCB manufacturing process","text":""},{"location":"setup/hardware/v2.5/kit/#placing-an-order","title":"Placing an order","text":"

      To order a PCB board including assembly, follow these steps:

      • Select a manufacturing company based on your local availability, budget, delivery dates, and services such as assembly.

      Note

      If you need assistance with selecting a company, contact us. We can provide you with a list of companies we have worked with in the past.

      • Create a customer account if you do not already have one. Ensure to specify the correct tax, contact, and delivery information.

      Warning

      It is especially crucial to provide correct contact information, including a phone number if possible. Most manufacturing companies provide excellent customer service and will be happy to assist you during the order process.

      • Create a project and select the quantity of PCB boards you need for production.
      • Configure the order based on the values specified in this document.
      • Upload the bill of material (BOM) and validate the component availability.

      Warning

      It is crucial that you use the exact IC's like the RTC and EEPROM we specified. If a component is \"end of life\" (EOL), do not hesitate to contact us so we can help you find an alternative solution. For all other components, you are welcome to choose alternatives providet by the manufacturing company.

      Info

      The component costs will now be calculated, and the price should be displayed.

      • Upload the gerber files provided as a zip file in the repository under the following link.
      • Upload the assembly instructions provided as a zip file in the repository under the following link.
      • Check that there are no missing references in your order configuration.
      • Place the order based on your delivery requirements.
      • Select a payment method and complete the order process.
      "},{"location":"setup/hardware/v2.5/kit/#configuration","title":"Configuration","text":"

      The following configuration parameters can be used for the production of the PCB.

      Info

      Please note that the naming may vary depanding on the manufacturing company you used and are only intended to provide you with support. You can, of course, adjust the parameters as you see fit.

      "},{"location":"setup/hardware/v2.5/kit/#board-dimensions","title":"Board dimensions","text":"

      65 mm x 100 mm

      "},{"location":"setup/hardware/v2.5/kit/#circuit-specifications","title":"Circuit specifications","text":"Property Value Material FR4 Thickness 1.6 mm Finish Chem. gold Number of layers 2 Specific stackup sans SMD sides top Finished external copper thickness (\u00b5) 35 \u00b5m Internal copper thickness (\u00b5) without IPC Class Class 2"},{"location":"setup/hardware/v2.5/kit/#solder-mask","title":"Solder mask","text":"Property Value Solder mask TOP + BOT Mask colour green Peelable mask without"},{"location":"setup/hardware/v2.5/kit/#marking","title":"Marking","text":"Property Value Silkscreen (ink) TOP + BOT Ink colour white ROHS marking without UL marking without Date marking without"},{"location":"setup/hardware/v2.5/kit/#specific-options","title":"Specific options","text":"Property Value Space between tracks > 0.15 mm Min. drill hole size > 0.20 mm Blind via with out Cross blind no Burried via na Impedance control no Edge plating no Press-fit no Carbon without Via Fill without Beveled edge without Contersunk holes without Contersunk holes (qty/PCB) without Metallographic section without Gold fingers (thickness) without Gold fingers (qty/PCB) without"},{"location":"setup/hardware/v2.5/kit/#quality-assurance","title":"Quality assurance","text":"

      To ensure the quality of the produced PCB, request data validation from the customer support team. They can provide you with image files like the following to visually verify the manufacturing files you provide.

      Warning

      This step must be requested directly after completing the order process and confirmed promptly. Otherwise, the delivery date will be postponed or the order may be put on hold completely.

      "},{"location":"setup/hardware/v2.5/kit/#top","title":"Top","text":""},{"location":"setup/hardware/v2.5/kit/#bottom","title":"Bottom","text":""},{"location":"setup/hardware/v2.5/kit/#copper-layer-1","title":"Copper layer 1","text":""},{"location":"setup/hardware/v2.5/kit/#copper-layer-2","title":"Copper layer 2","text":""},{"location":"setup/hardware/v2.5/kit/#mechanical","title":"Mechanical","text":""},{"location":"setup/hardware/v2.5/kit/#component-placement","title":"Component placement","text":""},{"location":"setup/hardware/v2.5/kit/#assembly-of-the-thru-hole-components","title":"Assembly of the Thru-Hole components","text":""},{"location":"setup/hardware/v2.5/kit/#thru-hole-requirements","title":"Thru-Hole Requirements","text":""},{"location":"setup/hardware/v2.5/kit/#thru-hole-tools","title":"Thru-Hole tools","text":"
      • professional Soldering iron
      • solder with flux
      • Helping hand or Breadboard
      "},{"location":"setup/hardware/v2.5/kit/#thru-hole-parts","title":"Thru-Hole parts","text":"Files Description Planktoscope-Hat-bom-through-hole.csv The list of used SMD components

      Warning

      When you solder this for the first time, take special care not to damage the board.

      Info

      To learn how to solder we recommend you the awesome Comic \"Soldering is easy\" by Mitch Altmal, Andie Nordgren and Jeff Keyzer

      "},{"location":"setup/hardware/v2.5/kit/#soldering-of-the-stepper-motor-driver","title":"Soldering of the stepper motor driver","text":"

      Unpack the motor driver and the connector strips and take the breadboard aside.

      Plug the connectors with the appropriate distance to the breadboard.

      Info

      The breadboard supports you during soldering to ensure the spacing and angle of the connectors, alternatively you can also use a third hand.

      Now position the motor driver on the connector strips of the beadboard.

      Warning

      Make sure that the larger chip labeled trimatik is positioned on the bottom of the board and the four smaller chips are positioned on the top of the board as shown in the picture.

      Now solder all pins of the connector strip.

      Info

      Soldering is sometimes like eating with chopsticks \ud83e\udd62. It takes a bit of practice, but with time you learn how to hold the workpiece in place with one free finger and apply the solder with another, and then use the other hand to move the soldering iron to the workpiece and solder it.

      Tip

      You can also solder one pin on one side and then the opposite one to fix your workpiece, this ensures that nothing accidentally moves.

      "},{"location":"setup/hardware/v2.5/kit/#soldering-of-the-motor-driver-sockets","title":"Soldering of the motor driver sockets","text":"

      Now take the PlanktoScope Hat board and the female connector of the stepper motor driver and position them as shown in the picture.

      Now put the previously soldered motor driver on the socket connector to fix it for the soldering process. Turn the board as shown in the picture and place it carefully.

      Now solder all pins of the connector strip.

      Info

      Soldering is sometimes like eating with chopsticks \ud83e\udd62. It takes a bit of practice, but with time you learn how to hold the workpiece in place with one free finger and apply the solder with another, and then use the other hand to move the soldering iron to the workpiece and solder it.

      Tip

      You can also solder one pin on one side and then the opposite one to fix your workpiece, this ensures that nothing accidentally moves.

      Repeat the procedure with the second motor driver. The end result should look like this.

      "},{"location":"setup/hardware/v2.5/kit/#soldering-the-connection-sockets","title":"Soldering the connection sockets","text":"

      Now solder the motor driver sockets, inserting the connector into the holes as shown.

      Turn the board over and hold the loose connector while soldering it. Repeat the procedure with the second motor connector.

      Info

      Soldering is sometimes like eating with chopsticks \ud83e\udd62. It takes a bit of practice, but with time you learn how to hold the workpiece in place with one free finger and apply the solder with another, and then use the other hand to move the soldering iron to the workpiece and solder it.

      Repeat the procedure with the power connector. The end result should look like this.

      Repeat the procedure with the led connector. The end result should look like this.

      "},{"location":"setup/hardware/v2.5/kit/#soldering-the-raspberry-pi-connector","title":"Soldering the Raspberry Pi connector","text":"

      Now solder the Raspberry Pi header connector with all 20 pins.

      Warning

      Be extremely careful when soldering the connections, make sure you don't accidentally bridge several contacts because you used too much solder or have cold solder joints because you had too little solder or too little heat.

      "},{"location":"setup/hardware/v2.5/kit/#install-and-solder-the-cooling-fan","title":"Install and solder the cooling fan","text":"

      Install the fan with the four screws and nuts.

      Warning

      Pay attention to the running direction with the arrow marking on the side of the fan. The fan should blow on the cooler of the Raspberry Pi.

      Cut off the excess cable of the fan and leave about 6 cm.

      Feed the fan cable through the hole provided, check if you can reach the contacts on the board without any problems and trim it further if necessary and enisolate the ends.

      Solder the fan cables according to the marking and color codes \u26ab GND, \ud83d\udd34 VCC, \ud83d\udfe1 RPM, \ud83d\udd35 PWM.

      Note

      If your fan doesn't have a \ud83d\udd35 PWM connector, then that's not a problem, you can just leave it out.

      "},{"location":"setup/hardware/v2.5/kit/#solder-the-display-connector","title":"Solder the display connector","text":"

      Insert the pin headers into the holes provided, hold them in place, carefully turn the board over and solder the connector.

      Note

      If you do not use an OLED display, you do not need to solder the connector.

      "},{"location":"setup/hardware/v2.5/kit/#solder-the-configuration-option-jumpers","title":"Solder the configuration option jumpers","text":"

      Insert the pin headers into the holes provided, hold them in place, carefully turn the board over and solder the connector.

      Note

      If you do not use an OLED display, you do not need to solder the connector.

      "},{"location":"setup/hardware/v2.5/kit/#you-have-finished-soldering-the-components","title":"You have finished soldering the components","text":"

      The assembly of the thru-hole components for the planktoscope hat is now complete. The end result should look like this.

      "},{"location":"setup/hardware/v2.5/kit/#planktoscope-hard-case","title":"PlanktoScope Hard case","text":""},{"location":"setup/hardware/v2.5/kit/#hard-case-requirements","title":"Hard case Requirements","text":""},{"location":"setup/hardware/v2.5/kit/#hard-case-tools","title":"Hard case tools","text":"
      • double sided adhesive tape
      "},{"location":"setup/hardware/v2.5/kit/#hard-case-parts","title":"Hard case parts","text":"
      • Hard case
      "},{"location":"setup/hardware/v2.5/kit/#foam-preparation","title":"Foam preparation","text":"

      Cut the foam block at the outer edge by gently tearing it apart with your fingers.

      Warning

      Be careful the foam tears easily and can not be repaired.

      Tip

      You can try in the middle of the foam block to see how the material can be cut through before you peel off with the edge.

      Now lay a layer of two-sided adhesive tape on the upper inside edge of the case, with which we can later attach the show fabric.

      Now insert the foam edge in to the case and glue it to the outer wall.

      Note

      Before you fix the foam, position it completely and check that it is placed flush with the edge of the case.

      "},{"location":"setup/hardware/v2.5/kit/#kit-composition","title":"Kit composition","text":"

      Now divide all the components for the kit, and pack it in the hard case. You can find the full list of components for the kit in the v2.5 hardware BOM (Bill of Materials). However, this BOM does not include ordering links, since such links will need to be different for each country. If you've customized the v2.5 hardware BOM for your own v2.5 PlanktoScope kit (e.g. by finding and adding part ordering links from suppliers in your country for each component), please share your custom BOM to our GitHub Discussions thread for v2.5 Localized Hardware BOMs, so that other members of our community can learn from your work!

      "},{"location":"setup/hardware/v2.6/","title":"Index","text":"

      This is a marktext document avec

      "},{"location":"setup/software/","title":"PlanktoScope Software","text":"

      This section of the PlanktoScope documentation will help you to set up the necessary software for your PlanktoScope hardware. Our documentation splits the PlanktoScope software setup process into two phases: installing the PlanktoScope software onto the micro-SD card of the Raspberry Pi computer in your PlanktoScope, and configuring the PlanktoScope software after installation.

      The PlanktoScope software is an operating system, the PlanktoScope OS, distributed as an SD card image to be run on the PlanktoScope hardware's embedded Raspberry Pi computer.

      If you are building your own PlanktoScope from your own hardware kit, you will need to install and set up the PlanktoScope OS yourself. If you received a PlanktoScope from FairScope, a working and pre-configured version of the PlanktoScope OS is already pre-installed, and you can skip the software setup process and proceed to our guide on how to operate your PlanktoScope. - but you still might wish to update your PlanktoScope to the latest release of the PlanktoScope OS, in which case you should reinstall the PlanktoScope software by going through our software setup guide below.

      In order to install the PlanktoScope software, you will first need to choose an SD card image file to use for installation, and then you will install that SD card image and perform some configuration of the software.

      "},{"location":"setup/software/#choosing-an-sd-card-image","title":"Choosing an SD card image","text":"

      PlanktoScope SD card image files are identified with a version number as well as a hardware configuration tag - for example, the SD card image file named planktoscope-v2024.0.0+planktoscopehat.img.gz is for v2020.0.0 of the PlanktoScope OS, configured to work with versions of the PlanktoScope hardware based on the custom PlanktoScope HAT (rather than the Adafruit Stepper Motor HAT). Thus, you will need to choose both a version number (e.g. v2023.9.0) and a hardware configuration (e.g. planktoscopehat).

      "},{"location":"setup/software/#planktoscope-os-versions","title":"PlanktoScope OS versions","text":"

      Because the PlanktoScope project aims to release occasional updates to the PlanktoScope OS in order to fix various software problems and make various improvements to the software, multiple versions of the PlanktoScope OS exist, and new versions will be released in the future. In general, each version of the PlanktoScope OS will be compatible with all previous officially-released versions of the PlanktoScope hardware (which are all versions listed in the hardware changelog without the description of a \"prototype\"). The PlanktoScope documentation describes the latest stable release of the PlanktoScope OS, and you should always use the latest stable release on your PlanktoScopes.

      PlanktoScope OS versions are independent of hardware versions, and (starting in 2023) use a different version numbering system from the hardware (see the Hardware setup guide for an overview of some hardware versions). Now, OS version numbers have three numeric components: the year of the release, a minor number (which is incremented for releases with new features and/or backwards-incompatible changes), and a patch number (which is incremented for minor bugfixes). You may see references to the following SD card image versions in online discussions of the PlanktoScope software:

      • v2.3: this release, from December 2021, was the last release of the PlanktoScope software in the old version numbering system in which the software and hardware were released together. The v2.3 OS is preinstalled on most PlanktoScopes sold by FairScope during 2023.

      • v2023.9.0: this release, from the end of 2023, is the first software release in the new version numbering system, and it is currently the latest release of the PlanktoScope OS. The number 9 should not be interpreted as having any special meaning.

      • v2024.0.0: this version is the first release of the PlanktoScope OS in 2024.

      • v2024.1.0: this version will be the second release of the PlanktoScope OS in 2024.

      "},{"location":"setup/software/#hardware-configurations","title":"Hardware configurations","text":"

      Currently, each version of the PlanktoScope OS is provided as three SD card images which support the two different types of hardware configurations supported by the PlanktoScope software:

      • adafruithat: this configuration of the PlanktoScope OS is compatible with v2.1 of the PlanktoScope hardware, which uses the Adafruit Stepper Motor HAT.

      • planktoscopehat: this configuration of the PlanktoScope OS is compatible with all versions of the PlanktoScope hardware starting with hardware v2.3; those hardware versions use the PlanktoScope HAT instead of the Adafruit Stepper Motor HAT. This configuration requires you to select the hardware version of your PlanktoScope in the post-installation configuration process.

      • fairscope-latest: this configuration of the PlanktoScope OS is identical to the planktoscopehat configuration, except that this one sets the default settings to be for hardware version v2.6 so that you won't need to select the hardware version of your PlanktoScope in the post-installation configuration process.

      If you have a PlanktoScope from FairScope, you should probably use the fairscope-latest SD card image; otherwise, if you have a non-FairScope PlanktoScope with hardware version v2.3 or later, you should probably use the planktoscopehat SD card image; otherwise, if you have a v2.1 PlanktoScope, you should probably use an adafruithat SD card image.

      "},{"location":"setup/software/#installation","title":"Installation","text":"

      After you have chosen a PlanktoScope OS SD card image for the desired OS version and hardware configuration, you should follow our standard installation guide in order to install that SD card image into your PlanktoScope. If the official PlanktoScope SD card images don't meet your requirements and you have successfully set up and used the PlanktoScope OS in the past via the standard installation process, then you may also find the non-standard installation guide useful.

      "},{"location":"setup/software/#post-installation-configuration","title":"Post-installation configuration","text":"

      The first time you start the PlanktoScope after installing or updating the software, you should change some settings in the PlanktoScope software in order to match the configuration of your PlanktoScope hardware. Refer to our post-installation configuration guide for details.

      "},{"location":"setup/software/#next-steps","title":"Next steps","text":"

      After installing the PlanktoScope software (or after ensuring that the PlanktoScope software is installed) and performing all necessary post-installation configuration, then you can proceed to our guide on how to operate your PlanktoScope.

      "},{"location":"setup/software/config/","title":"Post-Installation Configuration","text":"

      After installing the PlanktoScope software onto your PlanktoScope, you will need to configure the software to match your PlanktoScope hardware and your operational requirements.

      Currently, all post-installation configuration is performed in the PlanktoScope software's Node-RED dashboard. To access it, you should first open the PlanktoScope's landing page in your web browser, e.g. following the instructions in the software installation guide. Then you should click the \"Node-RED dashboard\" link at the top of the \"Browser applications\" section of the landing page.

      "},{"location":"setup/software/config/#hardware-version","title":"Hardware Version","text":"

      Info

      This step is only required if you are using a planktoscopehat SD card image; it is not needed on the adafruithat and fairscope-latest SD card images.

      The first time you start the PlanktoScope, you will need to select the hardware version of your PlanktoScope for the PlanktoScope software to match the actual configuration of your PlanktoScope hardware. To do this, open the Node-RED dashboard. You should see a homepage with a drop-down menu to select your PlanktoScope hardware version. You should select the correct version for your PlanktoScope. After you select a hardware version, the PlanktoScope will show the Node-RED dashboard's normal homepage navigation buttons; you should also wait several seconds for the PlanktoScope software to restart and load the updated hardware settings.

      "},{"location":"setup/software/config/#next-steps","title":"Next steps","text":"

      Now that you have configured the PlanktoScope software, you can proceed to our guide on how to operate your PlanktoScope.

      "},{"location":"setup/software/nonstandard-install/","title":"Non-Standard Installation","text":"

      This page provides instructions for setting up non-standard versions of the PlanktoScope OS on a PlanktoScope. The PlanktoScope project also uses this same process for creating the official PlanktoScope software SD card images used in the standard software installation process.

      "},{"location":"setup/software/nonstandard-install/#prerequisites","title":"Prerequisites","text":"

      This guide assumes that:

      1. You have previous experience with using the command-line terminal on the Raspberry Pi OS or another Linux distribution.
      2. You have already confirmed that your PlanktoScope works without any problems with software installed by the standard PlanktoScope software setup process.
      3. You already know how to use the PlanktoScope software.

      If you have not used the PlanktoScope software before, you should first start with the standard software setup process in order to troubleshoot any problems with your PlanktoScope hardware; you can then try the non-standard setup process afterwards.

      In order to complete the non-standard setup process, you will need all of the following:

      1. A Raspberry Pi computer. We only test to ensure that the PlanktoScope software works on the Raspberry Pi 4; it may or may not work on the Raspberry Pi 3, and it does not yet work on the Raspberry Pi 5.
      2. A keyboard connected to your Raspberry Pi.
      3. A display connected to your Raspberry Pi.
      4. A micro-SD card for your Raspberry Pi.
      5. A way to provide internet access to your Raspberry Pi.
      6. A separate computer which can flash SD card images to your micro-SD card.
      "},{"location":"setup/software/nonstandard-install/#install-and-set-up-raspberry-pi-os-on-your-raspberry-pi","title":"Install and set up Raspberry Pi OS on your Raspberry Pi","text":""},{"location":"setup/software/nonstandard-install/#download-a-raspberry-pi-os-sd-card-image","title":"Download a Raspberry Pi OS SD card image","text":"

      The setup scripts for the PlanktoScope OS assume that you will be setting up the PlanktoScope software on a 64-bit version of the Raspberry Pi OS with Debian version 11 (bullseye), preferably the version released on 2023-03-12. You can choose any of the following three variants of that version of the Raspberry Pi OS, depending on your needs:

      • \"Raspberry Pi OS with desktop\"
      • \"Raspberry Pi OS with desktop and recommended software\"
      • \"Raspberry Pi OS Lite\"

      The standard PlanktoScope software SD card images are built on the Raspberry Pi OS Lite image, which only provides a command-line interface, without a graphical desktop environment or web browser; because the PlanktoScope's graphical user interface must be accessed from a web browser, you might prefer to use the \"Raspberry Pi OS with desktop\" image in order to have a graphical desktop environment with a web browser. This would allow you to operate the PlanktoScope by plugging in a display, keyboard, and mouse to your Raspberry Pi; otherwise, you will have to connect to the PlanktoScope from another device over Ethernet or Wi-Fi in order access the PlanktoScope's graphical user interface.

      Warning

      The latest version of Raspberry Pi OS, with Debian version 12 (bookworm), can be downloaded from the Raspberry Pi Operating system images page, but the PlanktoScope software setup scripts do not yet work on Debian version 12; that page also has links named \"Archive\" under the download buttons where you can find older versions with Debian version 11 (bullseye) under the \"Raspberry Pi OS (Legacy)\" section; those links are the same as the links we listed above.

      "},{"location":"setup/software/nonstandard-install/#write-the-os-image-to-an-sd-card","title":"Write the OS image to an SD card","text":"

      Next, you will need to write your downloaded Raspberry Pi OS image file to your microSD card. Plug your microSD card into your computer; you may need to use a microSD-to-SD-card adapter, and/or an SD-card-to-USB adapter.

      To use a graphical application to write the image file to your microSD card, you can install the Raspberry Pi imager. Download the latest version of the Raspberry Pi Imager, install it, and start it. Select the Raspberry Pi OS image file (likely a .img, .img.gz, or .img.xz file) you just downloaded, and select the SD card you want to write the Raspberry Pi OS image to. Review your selections and click the appropriate button to begin writing the Raspberry Pi OS image to the SD card. The process should take several minutes.

      If you'd instead prefer to write the image file to your microSD card from a command-line tool, you could instead use a tool like ddrescue on a Debian-based system, e.g. as follows:

      gunzip planktoscope-v2.3-final.img.gz\nsudo ddrescue planktoscope-v2.3-final.img /dev/mmcblk0 --force\n

      Warning: be extremely careful when choosing the storage medium and ensure that you are writing the OS image file to the device which actually corresponds to the correct microSD card. Once the image has been written, data previously on the device will be lost and impossible to recover.

      "},{"location":"setup/software/nonstandard-install/#configure-your-raspberry-pi","title":"Configure your Raspberry Pi","text":"

      Insert the microSD card into your Raspberry Pi and connect your Pi to a screen, a mouse, and a keyboard. Double-check the connections before plugging in power.

      The first boot to the desktop may take up to 120 seconds. This is normal and is caused by the image expanding the filesystem to the whole SD card. DO NOT REBOOT before you reach the desktop.

      Eventually, the display will ask you to configure some settings for the Raspberry Pi. You will be asked to choose language settings and a keyboard layout; you should choose settings appropriate for you. The standard PlanktoScope SD card images use the en_US.UTF-8 locale and the \"Generic 104-key PC, English (US)\" keyboard layout. The display will also ask you to set a username and password for the default user account on the Raspberry Pi; you must choose pi as the username, and you should choose a password you can remember. By default, the standard PlanktoScope SD card images use copepode as the password - so you may want to choose a different password for better security. Refer to the official Getting Started with your Raspberry Pi guide for additional details and instructions on configuring settings for the Raspberry Pi.

      Next, configure your Raspberry Pi to get internet access - your Raspberry Pi will need to download software packages from the internet as part of the installation process for the PlanktoScope OS. If you have an Ethernet cable you can plug into your Raspberry Pi, that will be the simplest option for setup, because it won't require you to edit any files or run any commands on your Raspberry Pi; when we make our official SD card images with the PlanktoScope OS, we use an Ethernet cable. Otherwise, you will need to connect your Raspberry Pi to a wifi network with internet access; you can refer to the Raspberry Pi project's network configuration guide.

      "},{"location":"setup/software/nonstandard-install/#set-up-the-planktoscope-os","title":"Set up the PlanktoScope OS","text":""},{"location":"setup/software/nonstandard-install/#run-the-installation-script","title":"Run the installation script","text":"

      Depending on whether you're installing the software on a PlanktoScope with the PlanktoScope HAT (which is the standard HAT on v2.3 hardware and later) or with the Adafruit Stepper Motor HAT (which is the standard HAT on v2.1 hardware), you will need to adjust the commands below. Specifically, if you're installing the software for a PlanktoScope with the Adafruit Stepper Motor HAT, you will need to replace the word planktoscopehat with the word adafruithat in any of the commands below.

      Log in to your Raspberry Pi and (if you installed a version of Raspberry Pi OS with a graphical desktop) open a terminal. Then type in one of the following commands, depending on which release channel you want to use for installation (refer to our technical reference document on release channels to understand which release channel to use):

      StableBetaEdge
      wget -O - https://install.planktoscope.community/distro.sh \\\n  | sh -s -- -v software/stable -H planktoscopehat\n

      This will install the most recent stable release of the PlanktoScope OS (or, if the most recent release of the PlanktoScope software is a stable release, to install that stable release). This is recommended for most users.

      wget -O - https://install.planktoscope.community/distro.sh \\\n  | sh -s -- -v software/beta -H planktoscopehat\n

      This will install the most recent beta prerelease of the PlanktoScope OS (or, if the most recent prerelease/release of the PlanktoScope software is a stable release, to install that stable release). The beta prerelease probably contains bugs which will be fixed before the next stable release.

      wget -O - https://install.planktoscope.community/distro.sh \\\n  | sh -s -- -v master -H planktoscopehat\n

      This will install the current unstable development version of the PlanktoScope OS. This version is likely to be broken in various ways.

      Instead of installing the latest version on the \"stable\", \"beta\", or \"edge\" release channel, you can also install a specific tagged release or pre-release of the PlanktoScope software. For example, to install the v2024.0.0-alpha.1 pre-release of the PlanktoScope software, you would run the following command:

      wget -O - https://install.planktoscope.community/distro.sh \\\n  | sh -s -- -t tag -v v2024.0.0-alpha.1 -H planktoscopehat\n

      You can also choose to install the PlanktoScope software from some other repository on GitHub instead of github.com/PlanktoScope/PlanktoScope, by using the -r command-line option; for more information including usage examples, you can refer to the reference page for the installation script's command-line parameters, and/or you can get usage instructions by running the following command:

      wget -O - https://install.planktoscope.community/distro.sh \\\n  | sh -s -- --help\n
      "},{"location":"setup/software/nonstandard-install/#wait-for-installation-to-finish","title":"Wait for installation to finish","text":"

      The installation process will take a long time (around 15 - 30 minutes, depending on the speed of your internet connection and your microSD card) to finish.

      If an error occurs during this setup process, you will need to wipe the Raspberry Pi's microSD card, flash the Raspberry Pi OS image onto it again, and try running the setup steps again. Otherwise, you will eventually see a message reporting that the setup script finished setting up the PlanktoScope application environment.

      "},{"location":"setup/software/nonstandard-install/#connect-to-the-planktoscope","title":"Connect to the PlanktoScope","text":"

      Next, you will need to restart the Raspberry Pi, e.g. with the following command:

      sudo reboot now\n

      This step is necessary to finish the PlanktoScope software setup process.

      Afterwards, your PlanktoScope's Raspberry Pi will either connect to a Wi-Fi network (if you had previously configured it to connect to a Wi-Fi network) or make a new isolated Wi-Fi network whose name starts with the word pkscope followed by the unique randomly-generated name of your PlanktoScope, and whose password is copepode.

      If you connect another device (e.g. a phone or computer) directly to the PlanktoScope's Raspberry Pi over its isolated Wi-Fi network or over an Ethernet cable, then you can open a web browser on the device to access the PlanktoScope's graphical user interface at one of the following URLs (try them in the following order, and just use the first one which works):

      • http://planktoscope.local (this should work unless you're on a device and web browser without mDNS support; notably, older versions of Android do not have mDNS support)
      • http://pkscope.local (this should work unless you're on a device and web browser without mDNS support; notably, older versions of Android do not have mDNS support)
      • http://home.pkscope (this should work unless your web browser is configured to use a Private DNS provider)
      • http://192.168.4.1 (this should always work)
      • http://192.168.5.1 (this should always work)

      Note that if you had previously configured your PlanktoScope's Raspberry Pi to connect to a Wi-Fi network, it will not make its own isolated Wi-Fi network. On the Wi-Fi network it's connected to, it should be accessible at http://pkscope.local (if you're accessing it from a device and web browser with mDNS support, assuming the device is on the same network), assuming that no other PlanktoScope is connected to the same network. If multiple PlanktoScopes are connected to the same network, open http://pkscope.local and read the web page's \"Wrong PlanktoScope?\" section for instructions on what URL to use; you can determine your PlanktoScope's name by connecting a display to its Raspberry Pi, booting up the Raspberry Pi, and reading the name from the login prompt (e.g. if it says pkscope-chain-list-27764 login:, then the PlanktoScope is named pkscope-chain-list-27764).

      You will only be able to access the PlanktoScope's graphical user interface by plugging in a display and keyboard and mouse to the Raspberry Pi if you had previously used a \"Raspberry Pi OS with desktop\" or \"Raspberry Pi OS with desktop and recommended software\" SD card image as the base for the PlanktoScope software's setup script. In that case, you can open a web browser window on the Raspberry Pi and open http://localhost or any of the previously-listed URLs.

      "},{"location":"setup/software/nonstandard-install/#next-steps","title":"Next steps","text":"

      Now that you have installed the software and accessed the PlanktoScope software's user interface from your web browser, you should proceed to our guide for configuring your PlanktoScope.

      "},{"location":"setup/software/standard-install/","title":"Standard Installation","text":"

      This page provides instructions for installing the most recent standard version of the PlanktoScope OS on a PlanktoScope.

      "},{"location":"setup/software/standard-install/#set-up-the-sd-card","title":"Set up the SD card","text":"

      If you purchased a fully-assembled PlanktoScope or a DIY-assembly PlanktoScope kit from FairScope which includes a microSD card, then the SD card is already set up with the PlanktoScope OS, and you should skip to the next step.

      "},{"location":"setup/software/standard-install/#prerequisites","title":"Prerequisites","text":"

      In order to complete this step, you will need all of the following:

      1. A microSD card for your Raspberry Pi.
      2. A separate computer which can flash SD card images to your microSD card.
      "},{"location":"setup/software/standard-install/#download-the-planktoscope-software-sd-card-image","title":"Download the PlanktoScope software SD card image","text":"

      For ease of setup, we distribute the PlanktoScope OS as SD card image files. You can download the latest release from the releases page for the PlanktoScope project on GitHub. Each released version of the PlanktoScope OS has downloadable SD card images under the \"Assets\" dropdown, which has multiple SD card image files corresponding to different types of PlanktoScope hardware; for information about how to select the appropriate SD card image for your PlanktoScope hardware, refer to the \"Hardware configurations\" section of the software setup overview.

      "},{"location":"setup/software/standard-install/#write-the-image-to-the-sd-card","title":"Write the image to the SD card","text":"

      To write the image file to your microSD card:

      1. Download, install, and start the latest version of the Raspberry Pi Imager.
      2. Plug your microSD card into your computer; you may need to use a microSD-to-SD-card adapter, and/or an SD-card-to-USB adapter.
      3. Press the \"Choose Device\" button. Select \"No filtering\" from the menu. It actually doesn't matter what you select here.
      4. Press the \"Choose OS\" button. Select \"Use custom\" from the menu (this is why it doesn't matter what you selected in the \"Choose Device\" menu). In the file dialog, open the PlanktoScope SD card image file you downloaded in the previous section of this setup guide.
      5. Press the \"Choose Storage\" button. Select your SD card from the menu.
      6. Press the \"Next\" button. A pop-up dialog should appear asking if you would like to customize the OS. You should probably press the \"No\" button unless you are already experienced with the PlanktoScope software, because most of the settings inside don't matter to typical users of the PlanktoScope software, and because it's possible to break the software with incorrect settings.
      7. A pop-up dialog should appear asking you to confirm whether you selected the correct SD card and want to wipe all data on the SD card in order to write the PlanktoScope SD card image to your SD card. If you are ready, press the \"Yes\" button.
      8. The Raspberry Pi Imager will begin overwriting your SD card with the PlanktoScope SD card image. This will take a while to finish.

      Once flashing is complete, unmount the SD card and remove it from the computer.

      "},{"location":"setup/software/standard-install/#insert-the-sd-card-into-the-planktoscope","title":"Insert the SD card into the PlanktoScope","text":"

      Insert the microSD card into the Raspberry Pi computer installed in your PlanktoScope.

      "},{"location":"setup/software/standard-install/#connect-to-the-planktoscope","title":"Connect to the PlanktoScope","text":"

      Power on your PlanktoScope, and wait for it to start up. Note that it may take a few minutes to start up. Once it has finished starting up, it should create a new isolated Wi-Fi network whose name starts with the word pkscope followed by the unique randomly-generated name of your PlanktoScope. The password of this Wi-Fi network is copepode.

      Note that you will not be able to access the PlanktoScope's graphical user interface by plugging in a display to the Raspberry Pi. This is because the SD card image we provide does not include a graphical desktop or web browser, in order to keep the SD card image file smaller and to keep the PlanktoScope's Raspberry Pi running more efficiently. Instead, you will need to connect another device (e.g. a phone or a computer) directly to the PlanktoScope's Raspberry Pi, either over its isolated Wi-Fi network or over an Ethernet cable.

      After you connect another device directly to the PlanktoScope's Raspberry Pi, then you can open a web browser on the device to access the PlanktoScope's graphical user interface at one of the following URLs (try them in the following order, and just use the first one which works):

      • http://planktoscope.local (this should work unless you're on a device and web browser without mDNS support; notably, older versions of Android do not have mDNS support)
      • http://pkscope.local (this should work unless you're on a device and web browser without mDNS support; notably, older versions of Android do not have mDNS support)
      • http://home.pkscope (this should work unless your web browser is configured to use a Private DNS provider)
      • http://192.168.4.1 (this should always work)
      • http://192.168.5.1 (this should always work)

      The web browser should show a landing page with some information about your PlanktoScope and a list of links, including links to apps running on your PlanktoScope.

      "},{"location":"setup/software/standard-install/#next-steps","title":"Next steps","text":"

      Now that you have installed the software and accessed the PlanktoScope software's user interface from your web browser, you should proceed to our guide for configuring your PlanktoScope.

      "},{"location":"troubleshooting/","title":"Troubleshooting","text":"

      We don't yet have documentation to help you troubleshoot problems with your PlanktoScope yet! For now, you should sign up to join the PlanktoScope community on Slack, and ask for help in the #3-start-testing channel on Slack.

      "}]} \ No newline at end of file diff --git a/site/setup/hardware/v2.6/index.html b/site/setup/hardware/v2.6/index.html index 685ded5..6efd538 100644 --- a/site/setup/hardware/v2.6/index.html +++ b/site/setup/hardware/v2.6/index.html @@ -7,7 +7,7 @@ .gdesc-inner { font-size: 0.75rem; } body[data-md-color-scheme="slate"] .gdesc-inner { background: var(--md-default-bg-color);} body[data-md-color-scheme="slate"] .gslide-title { color: var(--md-default-fg-color);} - body[data-md-color-scheme="slate"] .gslide-desc { color: var(--md-default-fg-color);}

      Index

      This is a marktext document avec