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:

    1. Pga. spændingsfald fra 9v batteriet til pumperne, har vi valgt at montere et 12V batteri, som forsyning.
    2. 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.

    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.