Arduino

Устройство определения спелости овощей и фруктов по их цвету

Это устройство предназначено для определения спелости овощей и фруктов путем сопоставления данных спектрального анализа с заранее установленными шаблонами.

Такой анализатор, с некоторыми доработками, можно использовать, например, в фермерском хозяйстве.

Инструменты и материалы:
— 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 на старой книжной полке с помощью клеевого пистолета.

Устройство собрано и готово к тестированию.

Источник

Похожие статьи

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Кнопка «Наверх»
Закрыть
Закрыть