Sortownik klocków lego

Typ_projektu
Arduino
Zdjecie główne
Błąd wyświetlania obrazu
Krótki opis projektu

Projekt zrealizowany w ramach przedmiotu "Techniki Mikropocesorowe" na IV semestrze kierunku
AIR, wydziału MEiL Politechniki Warszawskiej.
Autorzy:
-Stanisław Walczak
-Hubert Przybysz

Projekt realizuje następujące funkcje:
Wykrywa 1 z 3 kolorów (czerwony, zielony, niebieski), a następnie sortuje go do 1 z 4 pojemników
(jeden pojemnik nieużywany). 

Niezbędne elementy

1. Płytka Arduino UNO
2. 2 silniki "step motor 28BYJ-48"
3. czujnik apds 9960
4. Co najmniej 20 kabelków męsko-męskich i męsko-żeńskich
5. 2 układy sterowania "ULN2003"
6. klocki lego
7. deski
8. taśma (najlepiej czarna)
9. Części wydrukowane na drukarce 3D (modele w załączniku)
10.latarka na usb razem z kablem
11.śrubki, wkręty, nakrętki
12.kątowniki
13.trytytki

Sprzęt

1. komputer

2. drukarka 3D

3. Śrubokręt

4. Wkrętarka

Opis projektu

Problemy na które, trzeba uważać przy robieniu projektu:

Czujnik koloru działała niepoprawnie przy zbyt słabym oświetleniu. Dlatego właśnie potrzebna jest lampka USB (patrz zdj4.jpg) do oświetlania taśmy, na której będzie wykrywany kolor klocka przez czujnik.

Problemem jest również ruszenie taśmociągu przez silniki, gdy są one podłączone bezpośrednio do taśmociągu. Żeby silnik mógł ruszyć taśmociąg należy zrobić przekładnie z kół zębatych​ (patrz zdj5.jpg).

Dodatkowo trzeba zamontować silnik tak by się nie ruszał, oraz połączyć go z resztą mechanizmu zrobioną z klocków lego. Silnik należy przymocować do drewna za pomocą wkrętów (patrz zdj1.jpg).​ Żeby przenieść siłę z silnika na klocki zaprojektowaliśmy specjalną przejściówkę, którą można wydrukować na drukarce 3D (nakładka3_1.stl)

Żeby ciężar koszyków nie spoczywał na silniku, połączony on został ze specjalnym kołem zębatym, dzięki czemu ciężar rozkładał się na podporach. (patrz zdj3.jpg)​

Problemem jest podłączenie silnika w taki sposób, żeby był on współosiowy z dużym kołem zębatym. Sposób w jaki to koło zębate zostało zaprojektowane uniemożliwia włożenia pasującego mniejszego koła zębatego (patrz zdj2.jpg). Rozwiązaniem okazuje się ucięcie paru zębów. Pozostałe zęby wystarczą by przenosić występującą siłę.​

Silniki, czujnik koloru oraz mikrokontrolery należy podłączyć jak na schematach 1 i 2. Jeden silnik jest podłączony do pinów 4,5,6,7 natomiast drugi do pinów 8,9,10,11. Oba silniki są podłączone do gniazda 5V i masy.

Kod na arduino podany jest w zakładce "kod programu". Żeby program mógł poprawnie działać, należy zaimplementować biblioteki:
#include <Stepper.h>  do silników​
#include <Adafruit_APDS9960.h> do czujnika koloru

Zdjęcia
kod programu

#include <Wire.h> #include <Adafruit_GFX.h> #include <Adafruit_APDS9960.h> Adafruit_APDS9960 apds; #include <Stepper.h> //dodajemy do szkicu bibliotekę obsługującą silniki krokowe #define ILOSC_KROKOW 32 //definiujemy stałą gdzie podajemy ilość kroków zależną od użytego silnika w naszym przypadku 32 Stepper mojSilnik(ILOSC_KROKOW, 8, 10, 9, 11); //tutaj podajemy piny w Arduino, którymi sterujemy silnikiem Stepper mojSilnik2(ILOSC_KROKOW, 4, 6, 5, 7); #include "Melopero_APDS9960.h" int kolor=0; float k[3]; int ks=0; int maks=0; int mini; int minin; int maksn; void setup() { Serial.begin(9600); if (!apds.begin()) { Serial.println("APDS-9960 initialization failed!"); while (1); } // Configure APDS-9960 gesture sensor apds.enableProximity(true); apds.enableColor(true); Serial.println("APDS-9960 initialization complete"); mojSilnik.setSpeed(600); } int x,y,z,v; void loop() { // Read proximity uint8_t proximity = apds.readProximity(); Serial.print("Proximity: "); Serial.println(proximity); int r, g, b, c; if (proximity>0) { mojSilnik.setSpeed(10); //podajemy prędkość obrotu wyrażona w rpm apds.getColorData(&r, &g, &b, &c); // r=r/40.0/0.88; // g=g/40.0/0.83; // b=b/36.0/0.86; Serial.print("Red: "); Serial.print(r); Serial.print(" Green: "); Serial.print(g); Serial.print(" Blue: "); Serial.print(b); Serial.print(" Clear: "); Serial.println(c); kolor=0; maks=0; mini=99999; if(r<b) { if(g<b) { maksn=2; } else { maksn=1; } } else if (r<g) { maksn=1; } else { maksn=0; } Serial.println(maksn); // 0 czerwony 1 zielony 2 niebieski 3 biały mojSilnik2.setSpeed(400); mojSilnik2.step(512*(maksn-ks)); ks=maksn; mojSilnik.setSpeed(600); while(proximity>1) { proximity = apds.readProximity(); Serial.print("Proximity: "); Serial.println(proximity); mojSilnik.step(-512); } } // Read color //podajemy prędkość obrotu wyrażona w rpm mojSilnik.step(-512); //linijka powoduje obrót ośki silnika o 90 stopni }

Pliki_projektu
Schemat
Youtube
Tagi
arduino lego sortownik klocki silniki czujniki
Odnośniki zewnętrzne
https://blog.elektroweb.pl/jak-podlaczyc-silnik-krokowy-do-arduino/​

https://microcontrollerslab.com/apds9960-proximity-gesture-ambient-light-sensor-interfacing-arduino/