Bazga Mihai-Carol, 333CD
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. 🤖
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.
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:
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ă
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:
Pini conectați pentru senzorul de culoare:
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.
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 |
Versionare: https://github.com/eusuntcarol/skittles-sorter
Live demo: https://youtu.be/PvxCqyMZ7nM