Устройство определения спелости овощей и фруктов по их цвету
Это устройство предназначено для определения спелости овощей и фруктов путем сопоставления данных спектрального анализа с заранее установленными шаблонами.
Такой анализатор, с некоторыми доработками, можно использовать, например, в фермерском хозяйстве.
Инструменты и материалы:
— Arduino Nano;
-Спектральный датчик AS7341 или такой;
-Raspberry Pi 3B + или 4;
-10K потенциометр;
-Ручка потенциометра;
-Тактильная кнопка — 4 шт;
-5 мм светодиод зеленый;
-5 мм светодиод красный;
-Макетная плата;
Шаг первый: теория
Благодаря развитому зрению человека, нам не составляет труда определить спелость по внешнему виду фрукта или овоща. Однако, при массовом выращивании контроль за созреванием и последующая сортировка спелых овощей/фруктов от неспелых, без автоматизации, довольно трудозатратен.
Это устройство мастер решил сделать для помощи пищевым компаниям, продуктовым магазинам и фермерам в сортировке фруктов и овощей. С помощью него можно определять стадии созревания по цвету с помощью модели нейронной сети.
По мере созревания фруктов и овощей они меняют цвет из-за четырех групп класса пигментов:
хлорофилл (зеленый)
каротиноиды (желтый, красный, оранжевый)
флавоноиды: антоцианы + антоксантины (красный, синий, фиолетовый)
беталаины (красный, желтый, фиолетовый)
Эти пигменты представляют собой группы молекулярных структур, поглощающих определенный набор длин волн и отражающих остальные. Незрелые плоды (зеленые) из-за хлорофилла в их клетках. По мере созревания хлорофилл распадается и заменяется оранжевыми каротиноидами и красными антоцианами. Эти соединения являются антиоксидантами, которые не позволяют фруктам слишком быстро портиться на воздухе. Затем происходит ферментативное потемнение и обесцвечивание — становление коричневого цвета. Ферменты действуют как катализатор химических реакций, вызывающих обесцвечивание фенолов.
Проведя некоторое исследование процессов изменения цвета по мере созревания фруктов и овощей, мастер решил построить искусственную нейронную сеть (ИНС) для интерпретации спектрального цвета различных фруктов и овощей и прогнозирования стадий созревания.
Перед построением и тестированием данной модели нейронной сети он разработал веб-приложение для сопоставления данных спектрального цвета фруктов и овощей, сгенерированных датчиком видимого света AS7341. Мастер использовал Arduino Nano для отправки данных, созданных датчиком видимого света, в веб-приложение. Основываясь на своих наблюдениях, он назначил стадию созревания (метку) при получении данных спектрального цвета для каждого фрукта и овоща:
Раннеспелые
Частично спелые
Спелые
Переспевшие
Шаг второй: разработка веб-приложения
Мастер разработал веб-приложение (Vegetables and Fruits Data Logger) для получения данных о спектральном цвете фруктов и овощей от датчика AS7341 через Arduino Nano 33 IoT и установки этих данных в файл CSV (spectral_color_database.csv) для создания таблицы о стадиях.
Веб-приложение включает в себя один файл (index.php) и требует, чтобы эти параметры вставляли новую строку (запись) в набор данных:
F1 F2 F3 F4 F5 F6 F7 F8 nir_1 nir_2 class
Дальше нужно проверить, все ли необходимые параметры передаются Nano.
Если да, создаем массив данных с полученными параметрами, включая текущую дату.
Вставляем недавно созданный массив данных в файл spectral_color_database.csv как новую строку с помощью функции fputcsv.
Затем прописываем: Data Inserted Successfully!
Если есть пропуски или нет входящих данных, прописываем: Waiting for data from the AS7341 sensor to insert
Показать / Скрыть текст# Check the incoming data packet: if(isset($_GET["F1"]) && isset($_GET["F2"]) && isset($_GET["F3"]) && isset($_GET["F4"]) && isset($_GET["F5"]) && isset($_GET["F6"]) && isset($_GET["F7"]) && isset($_GET["F8"]) && isset($_GET["nir_1"]) && isset($_GET["nir_2"]) && isset($_GET["class"])){ # Create the data array. $data = array($_GET["F1"], $_GET["F2"], $_GET["F3"], $_GET["F4"], $_GET["F5"], $_GET["F6"], $_GET["F7"], $_GET["F8"], $_GET["nir_1"], $_GET["nir_2"], $_GET["class"], date("m/d")); # Insert the recently generated data array into the CSV file as a new row. $file = fopen("spectral_color_database.csv", "a"); fputcsv($file, $data); fclose($file); // Print result: echo "Data Inserted Successfully!"; }else{ echo "Waiting for data from the AS7341 sensor to insert…"; }
Шаг третий: настройка веб-приложения на Raspberry Pi
После создания веб-приложения нужно запустить его на Raspberry Pi или любом другом сервере, если это сервер PHP.
Для настройки Raspberry Pi выполняем следующие действия:
Прежде всего, извлекаем папку Vegetables_and_Fruits_Data_Logger.zip.
Затем перемещаем папку приложения (Vegetables_and_Fruits_Data_Logger) на сервер apache (/ var / www / html).
sudo mv /home/pi/Downloads/Vegetables_and_Fruits_Data_Logger/ /var/www/html/
Если требуемые параметры не установлены и не найдены, веб-приложение пропишет: Waiting for data from the AS7341 sensor to insert…(Ожидание данных от датчика AS7341 для вставки )
http: // localhost / Vegetables_and_Fruits_Data_Logger /
В противном случае веб-приложение вставляет входящие данные в виде новой строки в файл CSV (набор данных), добавляя текущую дату, и печатает: Data Inserted Successfully! (Данные успешно вставлены!)
http://localhost/Vegetables_and_Fruits_Data_Logger/?F1=13&F2=12&F3=12&F4=12&F5=12&F6=12&F7=12&F8=12&nir_1=12&nir_2=9&class=0
Шаг четвертый: настройка Arduino Nano
Дальше нужно загрузить необходимые драйверы — Arduino SAMD Core — как описано в этом руководстве.
Чтобы иметь возможность подключиться к Wi-Fi, нужно загрузить библиотеку WiFiNINA.
Чтобы иметь возможность получать данные о цвете от датчика AS7341 необходимо установить библиотеку DFRobot AS7341.
Дальше нужно включить необходимые библиотеки и определить настройки WiFi.
char ssid[] = "SSID"; // your network SSID (name) char pass[] = "PASSWORD"; // your network password (use for WPA, or use as key for WEP) int keyIndex = 0; // your network key Index number (needed only for WEP) int status = WL_IDLE_STATUS; // Enter the IPAddress of your Raspberry Pi. IPAddress server(192, 168, 1, 20); // Initialize the Ethernet client library WiFiClient client; /* WiFiSSLClient client; */
Определить настройки и объекты датчика видимого света AS7341
// Define the AS7341 object. DFRobot_AS7341 as7341; // Define AS7341 data objects: DFRobot_AS7341::sModeOneData_t data1; DFRobot_AS7341::sModeTwoData_t data2;[/spoiler]
Определить может ли I2C правильно обмениваться данными, и включить встроенный светодиод на датчике AS7341.
Показать / Скрыть текст // Detect if I2C can communicate properly while (as7341.begin() != 0) { Serial.println("I2C init failed, please check if the wire connection is correct"); delay(1000); } // Enable the built-in LED on the AS7341 sensor. as7341.enableLed(true);
Проверить модуль WiFi, чтобы проверить соединение.
if (WiFi.status() == WL_NO_MODULE) { Serial.println("Connection Failed!"); while (true); } // Attempt to connect to the WiFi network: while (status != WL_CONNECTED) { Serial.println("Attempting to connect to WiFi !!!"); // Connect to WPA/WPA2 network. Change this line if using open or WEP network: status = WiFi.begin(ssid, pass); // Wait 10 seconds for connection: delay(10000); }
В функции read_controls считываем значения потенциометра и четырех кнопок класса.
void read_controls(){ // Potentiometer: pot_val = analogRead(pot); // Class Buttons: class_1_val = digitalRead(class_1); class_2_val = digitalRead(class_2); class_3_val = digitalRead(class_3); class_4_val = digitalRead(class_4); }
В функции adjust_brightness устанавливаем ток вывода для управления яркостью (от 1 до 20 — соответствует току 4 мА, 6 мА, 8 мА, 10 мА, 12 мА, ……, 42 мА) встроенного светодиода на датчике AS7341.
Для измерение спектра с помощью датчика AS7341 и считывания значение канала данных датчика 0 ~ 5 в следующих режимах отображения каналов:
eF1F4ClearNIR eF5F8ClearNIR
Затем нужно распечатать спектральные данные о цвете, сгенерированные датчиком:
[spoiler] // Start spectrum measurement: // Channel mapping mode: 1.eF1F4ClearNIR as7341.startMeasure(as7341.eF1F4ClearNIR); // Read the value of sensor data channel 0~5, under eF1F4ClearNIR data1 = as7341.readSpectralDataOne(); // Channel mapping mode: 2.eF5F8ClearNIR as7341.startMeasure(as7341.eF5F8ClearNIR); // Read the value of sensor data channel 0~5, under eF5F8ClearNIR data2 = as7341.readSpectralDataTwo(); // Print data: Serial.print("F1(405-425nm): "); Serial.println(data1.ADF1); Serial.print("F2(435-455nm): "); Serial.println(data1.ADF2); Serial.print("F3(470-490nm): "); Serial.println(data1.ADF3); Serial.print("F4(505-525nm): "); Serial.println(data1.ADF4); Serial.print("F5(545-565nm): "); Serial.println(data2.ADF5); Serial.print("F6(580-600nm): "); Serial.println(data2.ADF6); Serial.print("F7(620-640nm): "); Serial.println(data2.ADF7); Serial.print("F8(670-690nm): "); Serial.println(data2.ADF8); // CLEAR and NIR: Serial.print("Clear_1: "); Serial.println(data1.ADCLEAR); Serial.print("NIR_1: "); Serial.println(data1.ADNIR); Serial.print("Clear_2: "); Serial.println(data2.ADCLEAR); Serial.print("NIR_2: "); Serial.println(data2.ADNIR); Serial.print("n——————————n"); delay(1000);
Теперь нужно установить метку/номер каждому классу:
0 — Раннеспелый
1 — Частично спелый
2 — Спелый
3 — Переспелый
Показать / Скрыть текст if(!class_1_val) make_a_get_request("/Vegetables_and_Fruits_Data_Logger/", "0"); if(!class_2_val) make_a_get_request("/Vegetables_and_Fruits_Data_Logger/", "1"); if(!class_3_val) make_a_get_request("/Vegetables_and_Fruits_Data_Logger/", "2"); if(!class_4_val) make_a_get_request("/Vegetables_and_Fruits_Data_Logger/", "3");
Подключаемся к приложению, устанавливаем метки зрелости и подключаем красный светодиод.
Показать / Скрыть текстvoid make_a_get_request(String application, String _class){ // Connect to the web application named Vegetables_and_Fruits_Data_Logger. Change '80' with '443' if you are using SSL connection. if(client.connect(server, 80)){ // If successful: Serial.println("nnConnected to the server!"); // Create the query string: String query = application + "?F1="+data1.ADF1+"&F2="+data1.ADF2+"&F3="+data1.ADF3+"&F4="+data1.ADF4+"&F5="+data2.ADF5+"&F6="+data2.ADF6+"&F7="+data2.ADF7+"&F8="+data2.ADF8+"&nir_1="+data1.ADNIR+"&nir_2="+data2.ADNIR+"&class="+_class; // Make an HTTP Get request: client.println("GET " + query + " HTTP/1.1"); client.println("Host: 192.168.1.20"); client.println("Connection: close"); client.println(); }else{ Serial.println("Server Error!"); digitalWrite(red, HIGH); } delay(2000); // Wait 2 seconds after connection… // If there are incoming bytes available, get the response from the web application. String response = ""; while (client.available()) { char c = client.read(); response += c; } if(response != ""){ Serial.println(response); Serial.println("n"); // Check whether the transferred data is inserted successfully or not: if(response.indexOf("Data Inserted Successfully!") > 0){ digitalWrite(green, HIGH); }else{ digitalWrite(red, HIGH); } } // Turn off LEDs: delay(3000); digitalWrite(green, LOW); digitalWrite(red, LOW); }
Шаг пятый: создание набора данных стадий созревания на основе спектрального цвета
Чтобы обучить данную модель нейронной сети стадиям созревания по спектральному цвету, нужно было собрать данные о спектральном цвете различных фруктов и овощей. Для этого мастер использует датчик AS7341.
В этом датчике используется микросхема спектрального датчика нового поколения AS7341, выпущенная известной компанией AMS. Он имеет восемь каналов для видимого света, один канал для ближнего ИК-диапазона (NIR), один канал без фильтра (Clear) и дополнительный канал, распределенный по мерцанию окружающего света (Flicker). Кроме того, он имеет шесть параллельных 16-битных каналов АЦП для обработки сигналов и данных. Благодаря двум встроенным светодиодам с регулируемой яркостью он может собирать данные даже в темноте.
Проведя ряд исследований, мастер собрал параметры ниже с помощью датчика видимого света AS7341:
F1 (405-425nm)
F2 (435-455nm)
F3 (470-490nm)
F4 (505-525nm)
F5 (545-565nm)
F6 (580-600nm)
F7 (620-640nm)
F8 (670-690nm)
Clear_1
NIR_1
Clear_2
NIR_2
Как объяснялось в предыдущем шаге, мастер подключил датчик AS7341 к Arduino Nano 33 IoT для отправки параметров и назначенных меток стадии созревания в веб-приложение. После получения данных веб-приложение вставляет необходимые параметры, добавляя параметр текущей даты, в файл spectral_color_database.csv (набор данных) под этими строками:
F1
F2
F3
F4
F5
F6
F7
F8
NIR_1
NIR_2
Ripeness
Date
После завершения программирования и сборки устройства он выбрал одиннадцать разных фруктов и овощей, чтобы собрать их классы спелости по спектральному цвету.
Устройство позволяет пользователю отправлять данные в веб-приложение и назначать класс (метку) спелости, нажимая одну из четырех кнопок классов:
0 — Раннеспелый
1 — Частично спелый
2 — Спелый
3 — Переспелый
Для каждого фрукта и овоща он сопоставлял спектральные данные о цвете и присвоенный класс спелости в течение десяти дней, три раза в день.
Устройство позволяет пользователю регулировать яркость встроенного светодиода на датчике AS7341 с помощью потенциометра.
Если переданные данные успешно вставлены в набор данных, на устройстве загорится зеленый светодиод. В противном случае загорится красный светодиод.
Наконец, после сбора классов спелости по спектральному цвету три раза в день в течение десяти дней он извлек набор данных (spectral_color_database.csv) для обучения нейронной сети.
Шаг шестой: создание искусственной нейронной сети (ИНС) с помощью TensorFlow
Дальше мастер создает и обучает нейронную сеть для данного устройства. Ее цель — научить устройство не только определять спелость,но и прогнозировать стадии созревания. Подробно о данном шаге можно ознакомиться здесь.
Полностью код можно скачать здесь.
Шаг седьмой: подключение и регулировка
Сначала мастер устанавливает на макетную плату Arduino Nano 33 IoT. Затем устанавливает четыре кнопки классов, чтобы назначить класс зрелости (Early Ripe, Parically Ripe, Ripe, Decay) при отправке данных в веб-приложение. Мастер использовал потенциометр, чтобы отрегулировать яркость встроенного светодиода на датчике AS7341. Наконец, он установил 5-миллиметровые зеленые и красные светодиоды.
Схема подключения следующая:
Показать / Скрыть текст// Connections // Arduino Nano 33 IoT : // AS7341 11-Channel Spectral Color Sensor // 3.3V ————————— + // GND ————————— — // A5 ————————— C // A4 ————————— D // 10K Potentiometer // A0 ————————— S // Class Button_1 (6×6) // D2 ————————— // Class Button_2 (6×6) // D3 ————————— // Class Button_3 (6×6) // D4 ————————— // Class Button_4 (6×6) // D5 ————————— // 5mm Green LED // D6 ————————— // 5mm Red LED // D7 —————————
Собрав схему, он установил макетную плату и датчик AS7341 на старой книжной полке с помощью клеевого пистолета.
Устройство собрано и готово к тестированию.
Источник (Source)
Источник: