Mads Bergholdt Sørensen & Martin Bjerkov Hansen

I denne løsning er der fokus på automatisering af at lave te. Her vil det ved hjælp af aktuatorer og sensorer laves te med varme regulering. Inspirationen kommer af, at når der skal laves en kop te er det altid en længere proces som altid involvere en brændt tunge. Ved hjælp af et ræsonnement af sensorer og aktuatorer skabes der en løsning til den perfekte kop te. 

Før den endelige opstilling, blev hver enkelt komponent testet individuelt, både kredsløb og program, således det til sidst nemt kunne sættes sammen. Dette gav et godt overblik til processen.

Servo motor

En SG90 servo motor, kan køre uden en transistor, grundet dens indre reguleringssystem. Der er tre ledninger; en til 5V, en til GND og en til en port der kan udgive et PWM signal. Efter erfaring, er det bedst at bruge en analog port. PWM signalet bliver oversat til en specifikt vinkel ind i motoren, og der kan på den måde bestemmes ret præcist hvor motoren skal befinde sig henne, mellem 0 og 180 grader. Der bliver brugt to til denne opstilling, som skal styre hvert sit led i en robotarm.

DC motor med enkelt transistor

Bruger en transistor til at trække nok strøm til DC motoren, da den skal bruge mere end hvad Arduinoen kan give som output. Motoren styres meget simpelt, ved at aktivere hvad end digital port, den er forbundet til. Hvis man havde ønsket at den kørte begge veje, kunne den sætte op i en H-bro af transistorer. Resistoren sat ind før Base pin, er ment til at limitere mængden af strøm der føres ind i transistoren. Ellers er DC motoren forbundet til Collector benet, og GND forbundet til Emitter benet.

Termo sensor

Selvom den der bruges i selve opstillingen er anderledes end den tilgængelig på Tinkercad, er det stadig de samme pinouts. Der er til 5V, til GND og en til selve sensor output. Da det er en digital sensor, skal den kobles til en digital port i stedet for en analog port. Det vil sige, at dataen sendes i digitale “pakker”, i modsætning til analoge hvor der sendes varierende spændinger til aflæsning. 

Water level detector

Til at måle hvor meget vand der er i koppen, bruges en water level sensor. Dette er en analog sensor som giver en værdi ud fra hvor meget af sensoren er dækket med vand. De lange strimler som sidder på sensoren reagere på vandet og danner en værdi. 

Ultrasonic sensor

Som start mekanisme for systemet er der implementeret en ultrasonic sensor som aktivere robotten når der holdes en hånd eller en anden genstand tæt på den. Måden at sensoren virker på er ved at udsende lyd bølger, som bliver reflekteret af genstande foran sensoren. De reflekterede lyd bølger bliver så omdannet til et elektrisk signal som kan omregnes til en distance. 

LED indikatorer

Til at indikere forskellige tilstande af programmet, ændres der farve i en RGB LED for en visuel forståelse af systemet. Når programmet ikke er i gang lyser LED’en rød, hvis programmet derimod er i gang, lyser LED’en grønt og hvis programmet ikke køre men dc motoren stadig blæser med kold luft lyser LED’en blåt. RGB LED’en virker ved at få input fra 3 pins, alt efter hvor meget strøm der går til hvert ben kan farven justeres til den givne farver der ønskes, ud fra at blande rød, blå og grøn. Til at definere farverne brugt i programmet sættes den respektive farves digitale pin til HIGH og de andre pins til LOW. 

Fuld konkret komponent liste

For at opsummere, bliver der brugt disse komponenter til opstillingen:

1x PN2222 transistor

1x DC motor

2x SG90 servo motor

1x RGB LED med en 220Ohm modstand til hver af de tre anode ben

1x Ultrasonic sensor

1x Water level sensor

1x DHT11 Temperature/Humidity module 

Opstilling af prototype

Her ses et billede af løsningen hvor robotarmen er monteret med to servo motorer der får tebrevet til at blive hævet og sænket i glasset. I glasset er der monteret en water level sensor, der indikere hvor meget vand der er i glasset. På siden af koppen er monteret en lille blå temperatur sensor som måler temperaturen af te’en. Til højre ses en dc motor med påsat propel som køler på koppen for at varme regulere te’en. Til sidst kan der under hovedet på propellen anes en LED som viser tilstanden af programmet, i dette tilfælde lyser den grønt hvilket indikere at programmet er aktiveret af ultrasonic sensoren som ligger bag ved opstillingen, som hånden aktivere. 

Flowchart over programmering/prioriteringer

Til at starte programmet aflæses ultrasonic sensoren, hvis værdien er mindre end 20 cm går programmet videre sætter først LED til grøn, læser så temperatur og water level sensor værdierne. Dernæst aktiveres servo motorerne og DC motoren. Hvis ultrasonic sensor værdien stadig er mindre end 20 cm køre programmet i et loop. Hvis værdien ikke længere er 20 cm ændres LED farven til Rød og programmet slutter.

Udklip af kode/beskrivelser

Følgende vil der tages udklip og beskrive enkelte dele af programmet. 

Koden for den ultrasoniske sensor, benytter sig af forholdsvis simple kommandoer. Dens echoPin er defineret som værende input og dens pingPin er defineret til at være output. Hvad der essentielt sker, er at pingPin aktiveres i intervaller, som gør sensoren sender lydbølger ud, der reflekteres på overflader og “opfanges” af echoPin. Med en udregning, kan der findes frem til hvor langt væk dette objekt er, da det vides hastigheden af lydbølgerne. Der bruges long-funktionen til at regne det i centimeter. 

Hvis der er et objekt tættere på end 20 cm, aktiveres resten af programmet. Her lyser LED’en også grøn for at indikere aktivering. 

Ved temperatur sensoren, gøres der meget brug af de libraries som findes til den. Ideen er meget simpel; hvis der sker en fejl for indlæsningen, skriver den en error på Serial monitoren, ellers printer den temperaturen ud. 

Der blev testet hvilke vinkler der passede bedst, og derfor er de sat så specifikke som set her. Dette får robotarmen til at køre op og ned, og dermed dyppe teposen i vandet. Der benyttes her det indbygget library for styring af servomotorer. 

Hvis waterlevel sensoren giver en værdi på over eller lig 100 (det svarer til hvis den er dyppet omtrent 2 cm) begynder DC motoren at rotere og “køle” te ned.  

Konklusion

Baseret på den originale ide om at lave et system der kunne dyppe din te, menes opstillingen at kunne fuldføre dette. Løsningen fungerer fint, men det blev ikke testet med kogende vand, da waterlevel sensoren faktisk kun kan fungere optimalt mellem 10 og 30 grader.

Der menes at den endelige opstilling, opfylder de opgivende problemstillinger. Der bruges tre sensorer (Waterlevel, temperatur, ultrasonic) og tre aktuatorer (en DC og to servomotorer). En transistor bruges til at trække nok strøm til at køre DC motoren og temperatursensoren er digital. Det ottende komponent er bare en RGB LED, men fungerer fint som statusindikator. 

Outputtet fra de forskellige sensorer, bruges til at aktivere de tre aktuatorer. Der sker dermed et fint sammenspil mellem den fysiske verden, programmeringen og mekanikken.

Perspektivering

Det ville gerne være ønsket at styre DC motoren baseret på både waterlevel og temperatur sensoren, men der skete ikke nogen betydelig temperaturændring, da alt bare foregik under stuetemperatur. Hvis det skulle være forbedret, kunne waterlevel sensoren måske være erstattet af noget andet, således der kunne benyttes vand med højere temperatur og dermed observere en reel ændring af temperatur når man blæste på koppen med DC motoren. 

Der kunne være brugt lidt mere tid på at sortere ledningerne, således et mere overskueligt billedet af opstillingen kunne tages. Det endte med at blive lidt kaotisk, som gjorde alt ikke kunne fotograferes optimalt på én gang.

Video af opstillingen

Fulde program

#include <Adafruit_Sensor.h>
#include <DHT.h>
#include <DHT_U.h>
#include <Servo.h>

Servo myservoUP;
Servo myservoDOWN;

#define DHTPIN 8     // Digital pin connected to the DHT sensor 
#define DHTTYPE    DHT11     

DHT_Unified dht(DHTPIN, DHTTYPE);
uint32_t delayMS;

const int pingPin = 7; // Trigger Pin of Ultrasonic Sensor
const int echoPin = 6; // Echo Pin of Ultrasonic Sensor

 int dc = 5, r = 4, g = 3, b = 2;

 
void setup() {

  Serial.begin(9600);
  
  myservoUP.attach(A0);
  myservoDOWN.attach(A1);

 

  pinMode(b, OUTPUT);
  pinMode(g, OUTPUT);
  pinMode(r, OUTPUT);
  pinMode(dc, OUTPUT);

  digitalWrite(b, LOW);
  digitalWrite(g, LOW);
  digitalWrite(r, LOW);
 
  dht.begin();
  sensor_t sensor;
  dht.temperature().getSensor(&sensor);
  dht.humidity().getSensor(&sensor);
  delayMS = sensor.min_delay / 1000;

     pinMode(echoPin, INPUT);
     pinMode(pingPin, OUTPUT);
}

void loop() {


  //%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% Ultra sonic sensor %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
   long duration, cm;
   digitalWrite(pingPin, LOW);
   delayMicroseconds(2);
   digitalWrite(pingPin, HIGH);
   delayMicroseconds(10);
   digitalWrite(pingPin, LOW);
   duration = pulseIn(echoPin, HIGH);
   cm = microsecondsToCentimeters(duration);
   delay(100);
   //%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% Ultra sonic sensor %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

   //%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% Startup of program %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
if ( cm < 20){
  digitalWrite(b, LOW);
  digitalWrite(g, HIGH);
  digitalWrite(r, LOW);


   //%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% Temprature sensor %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  delay(delayMS);
  sensors_event_t event;
  dht.temperature().getEvent(&event);
  if (isnan(event.temperature)) {
    Serial.println(F("Error reading temperature!"));
  }
  else {
    Serial.print(F("Temperature: "));
    Serial.print(event.temperature);
    Serial.println(F("°C"));
  }

//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% Humidity & Temprature sensor %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

 //%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% Controlls of servos %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  
  myservoUP.write(125); //Øverste del
  myservoDOWN.write(90);
  delay(1000);
  myservoUP.write(200);
  myservoDOWN.write(150);
  delay(1000);


//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% Controlls of servos %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%


//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% DC motor Controlls %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

if ( analogRead(A5) >= 100){
 digitalWrite(dc, HIGH);
}
else{
  digitalWrite(dc, LOW);
  }

  //Slutningen på det originale if-statement
  }
  
  else {
  digitalWrite(b, LOW);
  digitalWrite(g, LOW);
  digitalWrite(r, HIGH);
    }


//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% Startup of program %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  

}

long microsecondsToCentimeters(long microseconds) {
   return microseconds / 29 / 2;
}

Leave a Reply