Introduction: EAL - Drinks Anlæg
ENGLISH VERSION IS COMMING SOON!!!
I denne instruktion vil vi beskrive og forklare, hvordan vi programmere og samler et drinks anlæg. Der bliver programmeret i en Arduino mega 2560, via Arduino Software.
Dette projekt har vi udarbejdet i forbindelse med vores afsluttende prøve, i vores valgfag på Erhvervsakademiet Lillebælt.
Ideen med dette anlæg er man har 3 forskellige slags sodavand/saft, hvorefter man kan kombinere den med 3 forskellige typer alkohol. Du trykker herefter ind hvilken 2 ting du vil have blandet, og trykker på start, og maskinen vil herefter dosere din drinks, så du selv slipper for at blande den. Du har også mulighed for at dosere ren sodavand/saft hvis dette ønskes.
Man har derfor mulighed for at lave 9 forskellige slags drinks eller 3 forskellige slags sodavand. ENJOY
Herunder er en liste over de ting vi vil komme ind over i løbet af denne guide.
STEP 1: Materialeliste
STEP 2: Programmeringen
STEP 3: Schematic tegning
STEP 4: I/O Liste + Sekvens
STEP 5: Design af kasse.
STEP 6: 3D printning
STEP 7: Samling af anlæg
STEP 8: Video af anlæg
Step 1: MaterialeListe
For at komme i gang med denne drinks maskine, har vi været ude og finde en del materialer inden start.
Vi har derfor listet op herunder hvilke ting du skal bruge, og hvor mange er hver. Vi har valgt at lave den batteri drevet..
1 stk Arduino mega 2560
1 X Mini Breadboard
6 X mini luftpumper 6-12V
6 X 10Kohm resistor
6 X Relæ modul 1 kanal
2 X 9v 300mAh NI-MH Rechargable Battery
2 X Batteri holder box til Indbygning
2 X Rund Rocker switch
6 X Afbryder ON-OFF-ON ( 3- eller 6-pol gør ikke så meget)
1 X Momentary Pushbutton Grøn
6 X Grønne Diode
3 X Hvide Diode
9 X Diode holder
6 m 1/8" PVC slange
6 X plastik flasker med skruelåg
2 X 30x30 mm beslag
1 pk. korte skruer
Diverse ledninger
2000m2000m X 6mm spånplade
Step 2: Programmering
Som en del af projektet skal vi også have udviklet en styring af anlægget. Til dette har vi brugt en Arduino Mega 2560 . Programmeringen har vi lavet løbende da programmet hele tiden har skulle have små ændringer. Vi vil herunder forklare nogle vigtige punkter, som vi har brugt i vores programmering: Programmeringen kan downloades herunder. Programmeringen er beskrevet på engelsk.
- Defination af variabler
Som en del af programmeringen skal vi bruge nogle forskellige timere. Man kunne have brugt koden "Delay()" til dette . Men da vi mener det er mest hensigtsmæssigt at kunne ændre en variabel et sted, og herefter ændres i hele programmet, valgte vi at gøre det på denne måde. Der er tale om 2 forskellige variabler :
- Pump_Time1 = 1600 - Denne variabel sætter tiden for Pumperne til Alkohol ( 1,6sek) + efterløb
Pump_Time2 = 7600 - Denne variabel sætter tiden for Pumperne til Sodavand ved mix(7,6sek
Pump_Time3= 8000 - Denne variabel sætter tiden for Pumperne kun ved Sodavand(8sek) + efterløb
Disse har vi brugt hele vejen i gennem programmet : F.eks. int Delay(Pump_Time1) så ved vores Arduino at det e r7600ms som vi har fortalt den, and so on.
- INPUT_PULLUP
I vores program har vi nogle input fra vores kontakter. Disse skal defineres i vores Void Setup () inden vi går i gang . Disse er blevet defineret som f.eks. PinMode(2, INPUT_PULLUP); . Når vi definere den som "INPUT_PULLUP" kan vi aktivere de indre modstande som vores board har indbygget. disse ligger typisk på omkring 20Kohm. Indgangsværdien af INPUT-tilstanden bliver nu læst omvendt. HIGH betyder nu at sensoren er slukket, og LOW betyder, at kontakten er tændt.
Dette gør så at vi skal forbinde vores Kontakter via "-/0V". Monteringen, med beskrivelse for en bedre mening kommer i næste afsnit, under "Schematic".
- OUTPUT
For at kunne styre vores relæer til vores pumper skal vi have defineret dem. Dette bliver gjort på nøjagtig samme måde som "INPUT", Bare som "OUTPUT" i stedet, f.eks. PinMode(30, OUTPUT);.
// first of all we declare the varibles we want to use in the program further on int Pump_Time1 = 1600 ; // Here we declare the time for the alcohol pumps. change here, and it changes them all int Pump_Time2 = 7600 ; // Here we declare the time for the soda pumps. change here, and it changes them all. int Pump_Time3 = 8000 ; //Here we declare the time for the soda pumps when nothing is mixed void setup() { // under here we have the declaration off the LED` pinMode(22, OUTPUT); //LED for Cola valgt pinMode(23, OUTPUT); //LED for Fanta valgt pinMode(24, OUTPUT); //LED for Sprite valgt pinMode(25, OUTPUT); //LED for Rom valgt pinMode(26, OUTPUT); //LED for Vodka valgt pinMode(27, OUTPUT); //LED for Gin valgt pinMode(12, OUTPUT); //LED LIGHT // Relay Declaration for the Pumps pinMode(28, OUTPUT); //pump for Cola pinMode(29, OUTPUT); //pump for Fanta pinMode(30, OUTPUT); //pump for Sprite pinMode(31, OUTPUT); //pump for Rom // You can change the in- and output as you want // pinMode(32, OUTPUT); //pump for Vodka pinMode(33, OUTPUT); //pump for Gin // Button Declaration of the switches pinMode(2, INPUT_PULLUP); // ON-OFF-ON Switch for cola ( Only using on of them, can be used further on for a double up ) pinMode(3, INPUT_PULLUP); //ON-OFF-ON Switch for Fanta pinMode(4, INPUT_PULLUP); //ON-OFF-ON Switch for Sprite pinMode(5, INPUT_PULLUP); //ON-OFF-ON Switch for ROM pinMode(6, INPUT_PULLUP); //ON-OFF-ON Switch for VODKA pinMode(7, INPUT_PULLUP); //ON-OFF-ON Switch for GIN pinMode(8, INPUT_PULLUP); //Momentary push-button for Start Serial.begin(9600); } void loop() { // We start with the Spot light under the fill up. digitalWrite(12, HIGH); // Here we have the code for the LED's that indicate which liquide is choosen. The ones descibed earlier. if (digitalRead(2) == LOW ){ digitalWrite(22, HIGH); // LED Cola ACTIVATED Serial.println("Cola VALGT"); } else{ digitalWrite(22, LOW); // LED ColaOFF } if (digitalRead(3) == LOW ){ digitalWrite(23, HIGH); // LED Fanta ACTIVATED Serial.println("FANTA VALGT"); } else{ digitalWrite(23, LOW); // LED Fanta OFF } if (digitalRead(4) == LOW ){ digitalWrite(24, HIGH); // LED Sprite ACTIVATED Serial.println("Sprite VALGT"); } else{ digitalWrite(24, LOW); // LED Sprite OFF } if (digitalRead(5) == LOW ){ digitalWrite(25, HIGH); // LED Rom ACTIVATED Serial.println("ROM VALGT"); } else{ digitalWrite(25, LOW); // LED Rom OFF } if (digitalRead(6) == LOW ){ digitalWrite(26, HIGH); // LED Vodka ACTIVATED Serial.println("Vodka VALGT"); } else{ digitalWrite(26, LOW); // LED Vodka OFF } if (digitalRead(7) == LOW ){ digitalWrite(27, HIGH); // LED GIN ACTIVATED Serial.println("Gin VALGT"); } else{ digitalWrite(27, LOW); // LED GIN OFF } //--------------------------------------- Under here, we have the different kinds of mixes you can make --------------------------------- // The describsion of the code is made at the first on, then the others are the same, with different combinations, now we have only used // Now we only use "if" as a different, but same way to program it in. // COLA + VODKA MIX // if (digitalRead(2) == LOW && digitalRead(6)== LOW && digitalRead(8)== LOW && digitalRead(7)== HIGH && digitalRead(5)== HIGH){ digitalWrite(32, HIGH); // ROM Relay is on Serial.println("Vodka Doseres"); // Prints "Vodka doseres in the serial monitor (9600) ( good for troubleshooting and testing) delay(Pump_Time1); // Here is the time for the alcohol pump, the first one we declared at the start Serial.println("Cola Doseres"); // Prints " Cola doseres" in the serial monitor (9600) digitalWrite(28, HIGH); // Sets Cola relay On digitalWrite(32, LOW); // Sets Vodka relay off delay(Pump_Time2); // Here is the time for the soda pump, the second one we declared at the start Serial.println("Drink finish"); // Prints " Drinks finish" in the serial monitor (9600) digitalWrite(28, LOW); // Sets Cola relay off } else { digitalWrite(32, LOW); digitalWrite(28, LOW); Serial.println("STANDBY"); delay(100); } // COLA + ROM MIX // if (digitalRead(2) == LOW && digitalRead(5)== LOW && digitalRead(8)== LOW && digitalRead(7)== HIGH && digitalRead(6)== HIGH){ digitalWrite(31, HIGH); // ROM ON Serial.println("Rom Doseres"); delay(Pump_Time1); Serial.println("Cola Doseres"); digitalWrite(28, HIGH); // COLA ON digitalWrite(31, LOW); // ROM OFF delay(Pump_Time2); Serial.println("Drink færdig"); digitalWrite(28, LOW); // COLA OFF } else { digitalWrite(31, LOW); digitalWrite(28, LOW); Serial.println("STANDBY"); delay(1); } // COLA + GIN MIX // if (digitalRead(2) == LOW && digitalRead(5)== HIGH && digitalRead(8)== LOW && digitalRead(7)== LOW && digitalRead(6)== HIGH){ digitalWrite(33, HIGH); // Gin ON Serial.println("Gin Doseres"); delay(Pump_Time1); Serial.println("Cola Doseres"); digitalWrite(28, HIGH); // COLA ON digitalWrite(33, LOW); // Gin OFF delay(Pump_Time2); Serial.println("Drink færdig"); digitalWrite(28, LOW); // COLA OFF } else { digitalWrite(33, LOW); digitalWrite(28, LOW); Serial.println("STANDBY"); delay(1); } // Fanta + Rom MIX // if (digitalRead(3) == LOW && digitalRead(5)== LOW && digitalRead(8)== LOW && digitalRead(7)== HIGH && digitalRead(6)== HIGH){ digitalWrite(31, HIGH); // ROM ON Serial.println("Rom Doseres"); delay(Pump_Time1); Serial.println("Fante Doseres"); digitalWrite(29, HIGH); // Fanta ON digitalWrite(31, LOW); // ROM OFF delay(Pump_Time2); Serial.println("Drink færdig"); digitalWrite(29, LOW); // Fanta OFF } else { digitalWrite(31, LOW); digitalWrite(29, LOW); Serial.println("STANDBY"); delay(1); } // Fanta + Vodka MIX // if (digitalRead(3) == LOW && digitalRead(5)== HIGH && digitalRead(8)== LOW && digitalRead(7)== HIGH && digitalRead(6)== LOW){ digitalWrite(32, HIGH); // vodka ON Serial.println("Vodka Doseres"); delay(Pump_Time1); Serial.println("Cola Doseres"); digitalWrite(29, HIGH); // Fanta ON digitalWrite(32, LOW); // Vodka OFF delay(Pump_Time2); Serial.println("Drink færdig"); digitalWrite(29, LOW); // Fanta OFF } else { digitalWrite(32, LOW); digitalWrite(29, LOW); Serial.println("STANDBY"); delay(1); } // Fanta + Gin MIX // if (digitalRead(3) == LOW && digitalRead(5)== HIGH && digitalRead(8)== LOW && digitalRead(7)== LOW && digitalRead(6)== HIGH){ digitalWrite(33, HIGH); // Gin ON Serial.println("Rom Doseres"); delay(Pump_Time1); Serial.println("Cola Doseres"); digitalWrite(29, HIGH); // Fanta ON digitalWrite(33, LOW); // Gin OFF delay(Pump_Time2); Serial.println("Drink færdig"); digitalWrite(29, LOW); // Fanta OFF } else { digitalWrite(33, LOW); digitalWrite(29, LOW); Serial.println("STANDBY"); delay(1); } // Sprite + Rom MIX // if (digitalRead(4) == LOW && digitalRead(5)== LOW && digitalRead(8)== LOW && digitalRead(7)== HIGH && digitalRead(6)== HIGH){ digitalWrite(31, HIGH); // Rom ON Serial.println("Rom Doseres"); delay(Pump_Time1); Serial.println("Sprite Doseres"); digitalWrite(30, HIGH); // Sprite ON digitalWrite(31, LOW); // Rom OFF delay(Pump_Time2); Serial.println("Drink færdig"); digitalWrite(30, LOW); // Sprite OFF } else { digitalWrite(30, LOW); digitalWrite(31, LOW); Serial.println("STANDBY"); delay(1); } // Sprite + Vodka MIX // if (digitalRead(4) == LOW && digitalRead(5)== HIGH && digitalRead(8)== LOW && digitalRead(7)== HIGH && digitalRead(6)== LOW){ digitalWrite(32, HIGH); // Vodka ON Serial.println("Vodka Doseres"); delay(8000); Serial.println("Sprite Doseres"); digitalWrite(30, HIGH); // Sprite ON digitalWrite(32, LOW); // vodka OFF delay(Pump_Time2); Serial.println("Drink færdig"); digitalWrite(30, LOW); // Sprite OFF } else { digitalWrite(30, LOW); digitalWrite(32, LOW); Serial.println("STANDBY"); delay(1); } // Sprite + Gin MIX // if (digitalRead(4) == LOW && digitalRead(5)== HIGH && digitalRead(8)== LOW && digitalRead(7)== LOW && digitalRead(6)== HIGH){ digitalWrite(33, HIGH); // Gin ON Serial.println("Gin Doseres"); delay(Pump_Time1); Serial.println("Sprite Doseres"); digitalWrite(30, HIGH); // Sprite ON digitalWrite(33, LOW); // Gin OFF delay(Pump_Time2); Serial.println("Drink færdig"); digitalWrite(30, LOW); // Sprite OFF } else { digitalWrite(30, LOW); digitalWrite(33, LOW); Serial.println("STANDBY"); delay(1); } // Sodavand/saft dosering // Cola dosering if (digitalRead(2) == LOW && digitalRead(8)== LOW && digitalRead(3) == HIGH && digitalRead(4)== HIGH && digitalRead (6) == HIGH ){ digitalWrite(28, HIGH); // Cola ON Serial.println("Cola Doseres"); delay(Pump_Time3); digitalWrite(28, LOW); // COLA OFF Serial.println("Cola færdig"); } else { digitalWrite(28, LOW); Serial.println("STANDBY"); delay(1); } //Fanta Dosering if (digitalRead(3) == LOW && digitalRead(8)== LOW && digitalRead(2) == HIGH && digitalRead(4) == HIGH && digitalRead (6) == HIGH ){ digitalWrite(29, HIGH); // Fanta ON Serial.println("Fanta Doseres"); delay(Pump_Time3); digitalWrite(29, LOW); // Fanta OFF Serial.println("Fanta færdig"); } else { digitalWrite(29, LOW); Serial.println("STANDBY"); delay(1); } // Sprite Dosering if (digitalRead(4) == LOW && digitalRead(8)== LOW && digitalRead(3)== HIGH && digitalRead(2) == HIGH && digitalRead (6) == HIGH ) { digitalWrite(30, HIGH); // Sprite ON Serial.println("Sprite Doseres"); delay(Pump_Time3); digitalWrite(30, LOW); // Sprite OFF Serial.println("Sprite færdig"); } else { digitalWrite(30, LOW); Serial.println("STANDBY"); delay(1); } }
Step 3: Schematic
Efter vi har lavet vores programmering og testet den af, er vi nu nået til det mere praktiske. Vi har brugt et program der hedder "Fritzing" som er et gratis program alle kan bruge.
For at få samlet hele maskinen er der en masse ting der skal kobles op. Fortrådningen af denne maskine skal være nøjagtig som vidst, ellers kan man risikere en kortslutning, eller brænde motor, arduino, diode osv. af, da vi kører med 2 forskkelige spændingskilder. kig diagrammet igennem, eller vend tilbage og følg guiden når den skal monteres.
Det skal nævnes, at på tegningen er tegnet 6 x DC motor ind. Dette er ikke korrekt, men da Fritzing ikke har nogle der lignede, blev det det nærmeste vi kunne komme.
EDIT:
- Pga. spændingsfald fra 9v batteriet til pumperne, har vi valgt at montere et 12V batteri, som forsyning.
- Da vi havde et 9v batteri i overskud, har vi parallel forbundet de to batterier der er på siden, så levetiden er længere for forsyningen til Arduino
1. Del
Den første del af fortrådningen der skal laves, er effektkredesen til vores pumper. Vi har brugt en vippekontakt som Tænd/sluk. Plus fra batteri skal monteres igennem denne første.
- Minus(-) fra 12V batteri : Monteres i bredboard(2) og der luses 3 rækker frem ( Se Tegning)
- Plus (+) fra ON/OFF afbryder: Monteres fra kontakt til "COM" ´på vores Relæ(1) og luses videre mellem "COM" på de resterende
Dette var en hurtig omgang, nu til anden del.
2. Del
- Arduino Power Supply
Da vi har valgt den skal køre på batteri, skal vi have monteret indgang fra batteriet som bliver forsyningen. Vi har også monteret en vippekontakter til denne del, så du kan tænde og slukke styringen som du lyster
Arduino Port: VIN : +/9V Fra batteri
Arduino Port GND : -/0V Fra batteri
- Kontakter
Som det første skal vi have monteret alle vores kontakter. Som vi beskrev tidligere har vi programmeret programmet så Indgangsværdien fra kontakterne læses omvendt. Vi starter derfor med at kører minus ud til at kontakter, vi tager herefter modstand på ca. 10Kohm(R1) som forbindes til "+/5V". Modstanden og Ledningen fra kontakten skal nu sættes sammen, og monteres i den rigtige port. Dette gør at inputtet konstant får +/5V"ind på sig når kontakten er slukket, derfor HIGH. Når vi så aktivere kontakten, og vores indre PULLUP via koden, går indgangsværdien til -/0V. Ovenover ses et diagram over monteringen
- LED
Alle LED´er som indikere hvilke skal have en konstant -/0V, derfor køres denne rundt i serie fra Breadboard 1. Når dette er gjort skal vi have monteret alle vores udgange fra Arduinoen, og over på vores +/5v på LED´en. Kig I/O liste eller schematic.
- Relæer/Pumper
Tidligere har vi monteret den første del af effektkredsen på vores relæer. Nu er vi så kommet til styringskredsen. Vores Relæer har 3 pins på sig :
GND : -/0V monteres fra Breadboard 1
VCC : +/5V monteres fra Breadboard
IN1 : Output fra Arduino Port
Når dette er Gjort mangler vi kun at Montere pumperne til deres respektive relæer og deres -/0V . disse skal monteres på følgende måde
+/9V Ledning på Pumpe : Monteres på COM
-/0V Ledning på Pumpe : Monteres på Breadboard 2
Step 4: I/O List + Sekvens/Flow
I/O listen ovenover giver et indblik i monteringen af de forskellige in- og outputs
Sekvens/Flow af Arduinoen har vi udviklet i Edraw. Dette er gjort for at give et overblik over de forskellige statements i programmet. Skemaet kan downloades i PDF format nedenfor.
Attachments
Step 5: BOX Design
Husk at
For at have noget at bygge alle vores komponenter i, skulle vi have udviklet en kasse. Vi startede med at tegner den på papir, ¨så vi fik de korrekte mål fastsat mm.
Herefter brugte vi http://boxdesigner.connectionslab.org/ for at få lavet en firkantet kasse , derefter har vi været inde i Adobe illustrator og tegnet den om, så den passede vores ønskede design.
Herefter har vi lagt filen over i en lasercutter, som har skåret den ud i 6mm spånplade. Da dette var gjort, samlede vi alle delene og limede alle enderne sammen. Da vi kun vidste hvor vi ville have vores dioder, startede vi med, kun at få dem skåret ud. Alle andre huller er lavet efterfølgende manuelt med boremaskine og stiksav.
Step 6: 3D Printing
Da vi stod og manglede en anordning til samling af vores slanger, og vi havde et alt for stort hul i vores kasse, valgte vi at 3D tegne en lille rund holder, som er undersænket og kan ligges lige i og tages op hvis det er nødvendigt. Designet er tegnet i thinkercad på nettet. STL. fil er tilgængelig nedenunder.
Del 1 : Det første 3D Print vi lavede, var vores holder til alle vores slanger, som kan monteres i det store hul vi har i kassen.
Del 2 : Det andet 3D print vi lavede, er vores holder til koppen, da koppen ellers vil stå for langt nede, og kan forårsage spild. Derfor denne anordning
Step 7: Samling Af Anlæg
HUSK AT "UNFOLD" ALLE BILLEDER
Step 8: Video in Action
Denne video er lavet for at demonstrere hvordan den virker. anlægget er udviklet til Drinks, men da vi ikke har mulighed for at servere det på skolen, Har vi kørt test med saftevand, for at kunne se forskel.