Spisu treści:

Automat vendingowy oparty na Arduino o wartości 1 USD: 8 kroków
Automat vendingowy oparty na Arduino o wartości 1 USD: 8 kroków

Wideo: Automat vendingowy oparty na Arduino o wartości 1 USD: 8 kroków

Wideo: Automat vendingowy oparty na Arduino o wartości 1 USD: 8 kroków
Wideo: Kurs LabVIEW #11 - Maszyna stanów/State machine. 2024, Listopad
Anonim
Image
Image
Obudowa
Obudowa

Nasz pomysł wpadliśmy od naszego nauczyciela inżynierii – wszyscy pomyśleliśmy, że dobrym pomysłem będzie posiadanie automatu dla naszej klasy, a on powiedział – „fajnie, zrób jeden”. Okazało się, że automat vendingowy byłby świetnym starszym projektem, a po ukończeniu będzie służył jako zbiórka pieniędzy na nasz program inżynierski.

Nazywa się to automatem sprzedającym za 1 USD nie dlatego, że kosztuje 1 USD, ale po prostu dlatego, że akceptor banknotów jest starszym modelem, który pobiera tylko 1 banknoty:)

Krok 1: Kryteria

Chcieliśmy automatu, który zmieści się na biurku i nie będzie zbyt wysoki. Wzięliśmy wymiary szerokości stołu, aby upewnić się, że automat nie zwisa ze stołu.

Krok 2: Obudowa

Obudowa
Obudowa
Obudowa
Obudowa
Obudowa
Obudowa

Zrobiliśmy nasze pudełko o szerokości 19 cali, długości 17 cali i wysokości 25 cali. Do cięcia drewna użyliśmy maszyny CNC. Użyliśmy Solidworks do zaprojektowania ścian, a następnie przekonwertowaliśmy je na typy plików rysunkowych dla naszego oprogramowania CNC. Szlifowaliśmy krawędzie, a następnie wkręcaliśmy je 1 ¼”. Przymocowaliśmy przedni panel zawiasem i użyliśmy śrub ¼”, aby śruby nie przeszły na drugą stronę. Użyliśmy również szkła akrylowego, które wycinamy na półki i panel przedni.

Krok 3: Elektronika

Elektronika
Elektronika
Elektronika
Elektronika
Elektronika
Elektronika
Elektronika
Elektronika

Arduino

Użyliśmy płytki Arduino Mega 2560. Użyliśmy również płyt Adafruit Motor Boards, aby mogły napędzać silniki krokowe. Dodaliśmy szpilki do owoców ada, aby mogły się ze sobą połączyć. Umieszczono je jeden na drugim. Każdy może obsługiwać 2 silniki. Należy również pamiętać, że zworka musi być podłączona.

Zasilacz biurkowy

Bestek ATX Zasilanie za pomocą przejściówki do podtrzymania zasilania. Adapter pochodzi ze strony sparkfun.com i zapewnia różne napięcia.

Cewki do silników

Stworzyliśmy modele solidworks do trzymania silnika, chwytania cewki i prowadzenia cewki wzdłuż półki. Sięgnęliśmy po nasze kręgi z serwisu eBay i przycięliśmy je na wymiar. Musieliśmy również zgiąć 3 z nich, ponieważ nie otrzymaliśmy 6 z prostymi końcami do połączenia z mocowaniem cewki. Następnie wydrukowaliśmy je w 3D i przymocowaliśmy do cewki i silnika. Silniki krokowe, które mieliśmy, umieściliśmy w uchwycie. Trzymałby silnik i prowadził cewkę po prostej ścieżce.

LCD i klawiatura

Użyliśmy klawiatury Arduino i ekranu LCD podłączonego do przewodu 5 V na zasilaczu do zasilania, a następnie do tej samej płyty Arduino

Okablowanie

Zalecamy stosowanie przewodów o grubości 18. W naszym przypadku musieliśmy pójść na kompromis, używając różnych wskaźników, ponieważ zabrakło nam 18 wskaźników

Pasek ledowy

Do oświetlenia maszyny użyliśmy taśmy LED. Podłączyliśmy go do przewodu 12V na zasilaczu. Taśma LED, której użyliśmy, na szczęście miała na sobie + i -, co ułatwiało proces jej podłączania.

Krok 4: Akceptant rachunków

Akceptant rachunków
Akceptant rachunków
Akceptant rachunków
Akceptant rachunków
Akceptant rachunków
Akceptant rachunków
Akceptant rachunków
Akceptant rachunków

Użyliśmy Coinco BA30B jako naszego akceptora banknotów. Musiał być podłączony bezpośrednio do ściany jako źródło zasilania. Połączyliśmy go z 24-pinowym adapterem z zasilacza atx, aby podłączyć i ułatwić okablowanie. Wyprowadzenia, które śledziliśmy, znajdują się w następującym linku:

techvalleyprojects.blogspot.com/2011/07/ard…

W naszym przypadku musieliśmy stworzyć mocowanie podnoszące akceptor banknotów, bo inaczej byłby za niski dla naszej obudowy.

Krok 5: Testowanie

Najpierw sprawdź elektronikę na zewnątrz obudowy, aby upewnić się, że elementy działają. Wszelkie pojawiające się problemy należy naprawić przed umieszczeniem ich w obudowie.

Krok 6: Elektronika do obudowy

Gdy już przetestujesz elektronikę i będziesz zadowolony z wyników, zacznij umieszczać je w swojej obudowie. Dostosuj długość przewodów tak, aby wygodnie mieściły się w środku.

Krok 7: Testy końcowe

Po umieszczeniu w obudowie przetestuj wszystko jeszcze raz. Jeśli wszystko działa zgodnie z oczekiwaniami, gratulacje! Zrobiłeś automat.

Krok 8: Kod Arduino + linki

Pliki do pobrania:

Kod Arduino

drive.google.com/drive/folders/1oC4MhOcMFy…

Folder SolidWorks z plikami części i złożeniem

drive.google.com/drive/folders/1amZoypiWcZ…

Na wszelki wypadek, gdyby coś się stało z linkiem, oto kod arduino w pełni wyświetlony. Kod Arduino <<

#include #include #include "Arduino.h" #include #include #include "utility/Adafruit_MS_PWMServoDriver.h" #include

const int stepsPerRevolution = 200; stały bajt ROWS = 4; //cztery wiersze const byte COLS = 3; //trzy kolumny char keys[ROWS][COLS] = {{'1', '2', '3'}, {'4', '5', '6'}, {'7', '8', '9'}, {'*', '0', '#'} }; bajt wierszPins[ROWS] = {5, 6, 7, 8}; //połączenie z pinoutami wiersza klawiatury byte colPins[COLS] = {2, 3, 4}; //połącz się z pinoutami kolumn klawiatury Keypad keyboard = Keypad(makeKeymap(keys), rowPins, colPins, ROWS, COLS); Adafruit_MotorShield AFMS1 = Adafruit_MotorShield(); Adafruit_StepperMotor *myMotor1 = AFMS1.getStepper(-200, 1); Adafruit_StepperMotor *myMotor2 = AFMS1.getStepper(-200, 2); Adafruit_MotorShield AFMS2 = Adafruit_MotorShield (0x61); Adafruit_StepperMotor *myMotor3 = AFMS2.getStepper(-200, 1); Adafruit_StepperMotor *myMotor4 = AFMS2.getStepper(-200, 2); Adafruit_MotorShield AFMS3 = Adafruit_MotorShield (0x62); Adafruit_StepperMotor *myMotor5 = AFMS3.getStepper(-200, 1); Adafruit_StepperMotor *myMotor6 = AFMS3.getStepper(-200, 2); Adafruit_MotorShield AFMS4 = Adafruit_MotorShield (0x63); Adafruit_StepperMotor *myMotor7 = AFMS4.getStepper(-200, 1); Adafruit_StepperMotor *myMotor8 = AFMS4.getStepper(-200, 2); LCD LiquidCrystal (1, 11, 9, 10, 12, 13); //Cyfrowe piny, do których podłączony jest lcd // Stałe // // pin linii kredytowej(-) walidatora rachunków const int billValidator = 22;

// Zmienne /

/ rejestracja czasu trwania impulsu (milisekundy) bez znaku długi czas trwania;

// posiadanie wszystkich zarejestrowanych dolarów int dollarCounter = 0; void setup() { lcd.begin(16, 1); //ustaw współrzędne tekstu lcd lcd.print("Wstaw tylko $1"); //Ustaw tekst Serial.begin(9600); // Zainicjuj porty szeregowe do komunikacji. Serial.println("Test krokowy!"); //Wypisz Stepper Test w monitorze szeregowym, abyśmy wiedzieli, który silnik krokowy jest wciśnięty. AFMS1.początek(); AFMS2.początek(); AFMS3.początek(); AFMS4.początek(); myMotor1->setSpeed(100); //Ustaw prędkość silnika, przy której będą działać myMotor2->setSpeed(100); myMotor3->setSpeed(100); myMotor4->setSpeed(100); myMotor5->setSpeed(100); myMotor6->setSpeed(100); myMotor7->setSpeed(100); myMotor8->setSpeed(100); // Ustawienia pinów dla sprawdzania rachunków i przycisku pinMode(billValidator, INPUT); //Ustawia billaccepter

// Zainicjuj porty szeregowe do komunikacji. Serial.początek(9600); Serial.println("Oczekiwanie na dolara…"); } void loop () { { czas trwania = pulseIn(billValidator, HIGH); //Rozpoczyna szukanie długości impulsu otrzymanego od akceptora banknotów if (czas trwania > 12000) //Wartość, którą musi przekroczyć, aby sprawdzić poprawność jako przetworzony i autentyczny dolar { // Count dollar dollarCounter++; // Sprawdzanie zrozumienia Serial.print("Wykryto dolara.\n Razem: "); // Wyświetl nową liczbę dolarów Serial.println(dollarCounter); //pętla w celu oczekiwania na naciśnięcie przycisku while (czas trwania > 12000){ char key = keyboard.getKey(); //dostaje połączenie klawisza i zaczyna widzieć, który jest naciśnięty if (key != NO_KEY) { //będzie szukał naciśniętego klawisza Serial.println(key); //informuje nas, który z nich został naciśnięty w monitorze szeregowym } { if (klawisz == '1') { //Jeżeli klawisz 1 jest wciśnięty, wykonuje następujące czynności: int keyPressed = klawisz - '1'; mójMotor8->krok(580, DO PRZODU, PODWÓJNIE); //Uruchamia silnik i obraca się o 350 stopni w kierunku do przodu. mójMotor8->zwolnienie(); //Uwalnia silnik ze stanu utrzymywania się w miejscu. powrót; //Wraca do początku kodu pętli }

if (key == '2') { //Jeżeli klawisz 2 zostanie naciśnięty, wykonaj następujące czynności: int keyPressed = klawisz - '2'; myMotor7->krok(400, DO PRZODU, PODWÓJNIE); //Uruchamia silnik i obraca się o 350 stopni w kierunku do przodu. mójMotor7->zwolnienie(); //Uwalnia silnik ze stanu utrzymywania się w miejscu. powrót; //Wraca do początku kodu pętli } if (key == '3') { //Jeśli klawisz 3 jest wciśnięty, wykonuje następujące czynności: int keyPressed = key - '3'; myMotor6->krok(400, DO PRZODU, PODWÓJNIE); //Uruchamia silnik i obraca się o 350 stopni w kierunku do przodu. mójMotor6->zwolnienie(); //Uwalnia silnik ze stanu utrzymywania się w miejscu. powrót; //Wraca do początku kodu pętli } if (key == '4') { //Jeśli klawisz 4 jest wciśnięty, wykonuje następujące czynności: int keyPressed = key - '4'; myMotor5->krok(180, DO PRZODU, PODWÓJNIE); //Uruchamia silnik i obraca się o 350 stopni w kierunku do przodu. mójMotor5->zwolnienie(); //Uwalnia silnik ze stanu utrzymywania się w miejscu. powrót; //Wraca do początku kodu pętli } if (key == '5') { //Jeśli klawisz 5 jest wciśnięty, wykonuje następujące czynności: int keyPressed = key - '5'; myMotor4->krok(6900, DO PRZODU, PODWÓJNIE); //Uruchamia silnik i obraca się o 350 stopni w kierunku do przodu. mójMotor4->zwolnienie(); //Uwalnia silnik ze stanu utrzymywania się w miejscu. powrót; //Wraca do początku kodu pętli } if (key == '6') { //Jeśli klawisz 6 jest wciśnięty, wykonuje następujące czynności: int keyPressed = key - '6'; myMotor3->krok(400, DO PRZODU, PODWÓJNIE); //Uruchamia silnik i obraca się o 350 stopni w kierunku do przodu. mójMotor3->zwolnienie(); //Uwalnia silnik ze stanu utrzymywania się w miejscu. powrót; //Wraca do początku kodu pętli } if (key == '7') { //Jeśli klawisz 7 jest wciśnięty, wykonuje następujące czynności: int keyPressed = key - '7'; myMotor7->krok(400, DO PRZODU, PODWÓJNIE); //Uruchamia silnik i obraca się o 350 stopni w kierunku do przodu. mójMotor7->zwolnienie(); //Uwalnia silnik ze stanu utrzymywania się w miejscu. powrót; //Wraca do początku kodu pętli } if (key == '8') { //Jeśli klawisz 8 jest wciśnięty, wykonuje następujące czynności: int keyPressed = key - '8'; mójMotor8->krok(400, DO PRZODU, PODWÓJNIE); //Uruchamia silnik i obraca się o 350 stopni w kierunku do przodu. mójMotor8->zwolnienie(); //Uwalnia silnik ze stanu utrzymywania się w miejscu. powrót; //Powrót do początku kodu pętli } } } } } } >>

Zalecana: