Skittles Sorter

Bazga Mihai-Carol, 333CD

Introducere

Bomboanele Skittles sunt disponibile în mai multe culori (🔴 roșu, 🟠 portocaliu, 🟡 galben, 🟢 verde, 🟣 mov), iar sortarea lor manuală poate fi un proces monoton și ineficient. Acest proiect automatizează procesul de sortare folosind cele învățate în cadrul cursului de Proiectare cu Microprocesoare. 🤖

Descriere proiect

Skittles Sorter este un sistem automat de sortare care:

🔹 Folosește senzor de culoare și servomotoare

🔹 Identifică culorile prin reflexie lumină

🔹 Direcționează bomboanele în 5 compartimente

🔹 Afișează statistici în timp real

Sistemul este construit în jurul unui microcontroller ATmega328P care coordonează toate componentele. Placa este alimentată prin USB de la laptop, furnizând 5V și GND pentru toate componentele.

Sistemul așteaptă un semnal digital de START trimis printr-o întrerupere la acționarea unui switch. După primirea comenzii, procesul de sortare începe. Bomboanele sunt introduse printr-un tub de alimentare în zona de sortare.

Pentru a proteja plăcuța Arduino, servomotoarele vor beneficia de tratament special și vor fi alimentate separat de la o baterie de 9V a cărei tensiune a fost adusă la 5V printr-un step-down LM2596.

Primul servomotor (M1) conectat la pinul D9 (PWM) al microcontrolerului primește semnal PWM pentru a roti brațul mecanic care plasează bomboana exact sub senzorul de culoare TCS230. Servomotorul este alimentat prin pinii săi de alimentare (+ și -) conectați la 5V și respectiv GND.

Senzorul de culoare TCS230 este conectat la microcontroler prin pinii S0, S1, S2, S3 (pentru configurare) și OUT (pentru transmiterea datelor). Acesta identifică culoarea bomboanei prin detectarea reflexiei luminii de pe suprafața bomboanei. LED-urile încorporate ale senzorului iluminează bomboana pentru o identificare precisă. Datele sunt transmise digital către microcontroler.

După identificarea culorii, al doilea servomotor (M2) conectat la pinul D10 (PWM) primește semnal PWM pentru a orienta o rampă către paharul corespunzător culorii detectate.

Primul servomotor (M1) își continuă rotația pentru a împinge bomboana pe rampa orientată de M2, direcționând-o către recipientul corespunzător.

Întregul proces este monitorizat pe un afișaj LCD 1602 conectat prin interfața I2C la pinii SDA (A4) și SCL (A3) ai microcontrolerului, afișând în timp real culoarea detectată și statistici despre procesul de sortare.

Primul servomotor (M1) se repoziționează pe poziția inițială și se repetă acest ciclu automat până când primește un semnal de STOP prin USB (USART) sau până când detectează o culoare invalidă care nu se încadrează în parametrii predefiniți.

Hardware Design

Listă de piese

  • Arduino Nano (ATmega328P)
  • 2x Micro Servomotor SG90 90°
  • Senzor de Culoare TCS230
  • LCD 1602
  • Step-down LM2596
  • Suport baterie LR61
  • Baterie LR61 9V
  • Switch
  • Fire de legătură mamă-tată și tată-tată
  • Breadboard

Software Design

Codul sursă este scris în C++, folosind PlatformIO în VSCode și rulat pe o placuță Arduino Nano. Programul este scris ca un automat cu stări finite, având următoarele stări:

  • 💤 STATE_IDLE – Așteaptă inițierea sortării (la întreruperea INT0).
  • 🤖 STATE_INITIATE_SORTING – Mută servomotorul de colectare în poziția de detectare.
  • 🎯 STATE_COLLECTING_SAMPLES – Se colectează 51 de mostre RGB folosind senzorul de culoare TCS3200.
  • 🧠 STATE_CLASSIFY_COLOR – Fiecare mostră este clasificată folosind un model de regresie logistică; clasa predominantă este aleasă.
  • 🪛 STATE_EJECT_ITEM – Servomotorul de evacuare rotește tubul către compartimentul corespunzător, iar servomotorul de colectare eliberează bomboana.
  • 🔄 STATE_RESET_POSITION – Se revine la poziția inițială, pregătind sistemul pentru următoarea bomboană.

Sistemul utilizează un model de regresie logistică multiclasă, cu funcție softmax, implementat manual. Am ajuns la aceasta solutie din cauza faptului că frecventele citite de senzor erau destul de apropiate, iar regresia logistică mi s-a părut cea mai la îndemână soluție, în loc să pun condiții care se puteau schimba la cea mai mică mișcare a senzorului. După cum se poate vedea în una din pozele de mai sus, țin în mână senzorul de culoare către o bomboană: acolo colectam date pentru a le încărca în model. După antrenarea modelului, am făcut rost de coeficienți și i-am pus într-un fișier header, iar microcontroller-ul va fi responsabil de a face feeding-ul noii culori în model pentru a prezice culoarea citită. Pentru a evita posibilele preziceri eronare sau erori de citire, senzorul face un sampling de 51 de valori pe care le trece prin model, iar cea mai frecventă culoare este aleasă. Acuratețea este undeva la 90%, cu mici probleme la distincția între portocaliu și roșu.

Structura generală

  • `custom_exp(x)` – Aproximare a funcției exponențiale folosind o serie Taylor (3 termeni) - pentru a evita calcule prea complicate.
  • `softmax(logits, probs, n)` – Transformă scorurile logit într-un vector de probabilități, normalizat.
  • `predict(sample)` – Calculează logit-urile folosind produsul scalar dintre vectorii de greutăți și caracteristicile RGB, adaugă biais-ul, aplică softmax și returnează clasa cu probabilitatea cea mai mare.
  • `readColor()` - Aplică toate filtrele de fotodiode și salvează datele citite pentru predicție

LCD-ul este folosit pentru a indica starea curentă a sistemului și culoarea detectată. Comunicarea serială este utilizată pentru a trimite loguri în timp real.

Pentru a începe o sortare, sistemul așteaptă o întrerupere externă pe pinul PD2, de tipul Pin Change. Pentru asta am folosit un switch connectat la 5V și la pinul digital 2 care are activată rezistența de pull-up.

Servomotoarele sunt acționate prin PWM folosind librăria <Servo.h>.

LCD-ul este implementat folosind <LiquidCrystal_I2C.h>. Transferul de date se face prin I2C.

Senzorul de culoare TCS230 funcționează prin GPIO, iar pentru a citi datele am folosit funcția din Arduino pulseIn() pentru a citi pulsatia pe care o dă senzorul pe pin.

Scopul pinilor:

  • S0 și S1: controlează scalarea frecvenței de ieșire (scaling frequency)
  • S2 și S3: selectează filtrul de culoare activ (R, G, B)
  • OUT: semnalul generat în funcție de frecvența luminii filtrate

Pini conectați pentru senzorul de culoare:

  • S0 la D6
  • S1 la D7
  • S2 la D4
  • S3 la D5
  • OUT → D8 (citit cu pulseIn())

Concluzii

Proiectul Skittles Sorter a reprezentat o experiență bună în aplicarea ingineriei pentru rezolvarea unei probleme reale. Acest proiect m-a dus de la idee și dezvoltarea ei la schițare, prototipare, căutat de piese, materiale și, cel mai important găsirea unor rezolvări și adaptări la problemele apărute pe parcurs.

Una din cele mai grele părți ale proiectului a fost calibrarea senzorului de culoare, iar acest lucru a necesitat găsirea unei soluții din altă arie a ingineriei și anume din inteligență artificială - machine learning. Am fost nevoit pentru acest pas să colectez date (data acquisition) și să le interpretez pentru a putea antrena un model care să prezică suficient de bine culoarea.

Proiectul m-a condus prin aproximativ toate laboratoarele (GPIO, UART, întreruperi, PWM, I2C) și pot spune că m-a ajutat să înțeleg mai bine subiectul materiei și pe lângă asta m-a făcut să înțeleg că greșelile costă, nu neapărat bani, ci timp.

Jurnal

Data Activitate desfășurată
08.05.2025 Alegerea temei proiectului
10.05.2025 Comandarea primei tranșe de componente: Arduino Nano, senzor culoare, servomotoare, LCD
13.05.2025 Transarea schemei electrice
15.05.2025 Montarea pe breadboard a componentelor principale și testarea individuală a componentelor
15.05.2025 Primul microcontroller ars din cauza conectarea servomotoarelor direct la plăcuță
15.05.2025 A doua comandă de componente: Arduino Nano, step-down LM2596, suport baterie 9V
16.05.2025 Ridicarea materialelor necesare: carton, furtun, bride etc
20.05.2025 Arderea celui de-al doilea microcontroller din cauza unui scurt din cauza unui fir buclucaș
22.05.2025 Terminat de testat toate componentele individuale
23.05.2025 Calibrarea senzorului de culoare și găsirea soluției cu ML
24.05.2025 Construirea si asamblarea cutiei
26.05.2025 Arderea celui de-al treilea microcontroller din cauza deconectarii step-down-ului în timpul rulării
26.05.2025 Ultimele retușuri la cutie și testare în condiții reale, recalibrare senzor cu noile valori din interiorul cutiei

Resurse

pm/prj2025/iotelea/mihai_carol.bazga.txt · Last modified: 2025/05/28 04:09 by mihai_carol.bazga
CC Attribution-Share Alike 3.0 Unported
www.chimeric.de Valid CSS Driven by DokuWiki do yourself a favour and use a real browser - get firefox!! Recent changes RSS feed Valid XHTML 1.0