Team Cougar

From Hackteria Wiki
Jump to: navigation, search
Cougar.png

In der Blockwoche MedTech-DIY liegt der Fokus darauf Versuche, sogenannte "Hacks", selbstständig im FABLab zu erarbeiten. Auf dieser Seite werden die Tätigkeiten und Erkenntnisse vom Team Cougar während der Blockwoche MedTech-DIY festgehalten. Ebenfalls werden zu den Hacks Hinweise gegeben, welche für künftige Projekte Aufschluss zum Vorgehen geben sollen.
DIY (Do-it-yourself) ist eine Bewegung, die darauf abzielt, Dinge mit eigenen Händen und Kreativität herzustellen. DIY ist eine Möglichkeit, sich selbst zu verwirklichen und eine Herausforderung zu meistern. Es soll den Mensch motivieren, seinen eigenen Weg zu gehen, sich selbst zu verwirklichen und seine individuelle kreative Seite zu entdecken. Indem man selbst etwas schafft, kann man auch seine Ideen, Gedanken und Vorstellungen verwirklichen und lernt dabei, wie man seine eigenen Probleme löst.

















Organisatorisches

Personelle Aufstellung

Die Teilnehmer der Blockwoche MedTech-DIY wurden in vier Teams zu je vier Teilnehmern eingeteilt. Das Team Cougar ist aus folgenden Teilnehmern zusammengestellt:

Räumliche & zeitliche Organisation

Die Blockwoche findet vor Ort auf dem Campus in Horw statt.
Für die Tätigkeiten während der Blockwoche steht das FABLab im Trakt I, sowie der Unterrrichtsraum E210a zur Verfügung.
Der detaillierte Inhalt der Blockwoche ist auf MedTech-DIY#Schedule festgehalten.

Einführung FABLab

Neben einer allgemeinen Einführung in die Nutzung des FABLab fand ebenfalls eine Einführung in die Arbeit mit dem Laser Cutter sowie mit den 3D-Drucker erklärt. Die Idee ist es, dass wichtige Hinweise zum Gebrauch der Maschinen oder auch Learnings nicht in Vergessenheit geraten, während die Hacks voran schreiten. Weiter wird im Abschnitt Input IoT auf den Begriff selbst eingegangen und die Verwendung von Bluetooth im Bereich IoT erklärt.

Teile aus Laser Cutter

Laser Cutter

Software:

  • Solid bereits vollständig gezeichnet (Änderungen auf der Benutzeroberfläche des Cutter nicht empfohlen)
  • Layer durch Farbvergabe definieren
  • Daten zu Layer gemäss Datenblatt (laminiertes A4) eingeben
  • Reihenfolge (Schaben>Gravieren>Schneiden) gemäss Vorgabe erstellen
  • Export auf vorhandenen USB-Stick
Bedienung Cutter:
3D-Drucker

  • ESC und manuell Laser an den Rand bewegen (Holz nicht unter Laser schieben), Holz positionieren
  • Werkstück Nullpunkt definieren mit ORIGIN
  • Z-Achse abstimmen mit Alu-Platte (Platte auf Werkstück und nicht aktivieren ohne Alu!)
  • File über Stick uploaden und mit START/STOPP Maschine starten

3D Drucker

  • File als .stl am Arbeitsplatz öffnen
  • Werte an das Bauteil anpassen
  • Individuelle Werte je nach Typ zwingend beachten
  • Export auf Speichermedium für .gcode
  • Zustand von Filament und Drucker kontrollieren
  • Fluid auf Grundplatine geben und gleichmässig abstreifen
  • Druckstart rund 5' verfolgen
  • Kontrollen während Druck von Zeit zu Zeit

Input IoT

IoT (Internet of Things) ist ein Begriff, der sich auf das Internet der Dinge bezieht, ein Netzwerk von physischen Geräten, Fahrzeugen, Gebäuden und anderen Objekten, die über ein drahtloses Netzwerk miteinander verbunden sind und Daten austauschen können. Diese vernetzten Gegenstände können über das Internet miteinander kommunizieren und können so auf intelligente Weise miteinander interagieren. Jedes IoT-Gerät ist in der Lage, Daten über seine Umgebung zu sammeln und an andere Geräte zu senden, was eine bessere Steuerung und automatisiertes Reagieren im gesamten System ermöglicht.

Bluetooth im IoT

Bluetooth ist eine drahtlose Technologie, die es Geräten ermöglicht, direkt miteinander zu kommunizieren. Wenn man Bluetooth-Geräte in ein IoT-Netzwerk integriert, kann man diese Geräte untereinander kommunizieren lassen. Dies ermöglicht es, Sensoren, Aktoren und andere Geräte über das IoT-Netzwerk zu verbinden und zu steuern. Bluetooth ersetzt dabei die Kommunikation über das Internet.

Skill Share

Am Donnerstag Morgen fand zudem ein "Skill share" statt. Während rund zwei Stunden konnte man verschiedene Posten besuchen, bei welchen man Fähigkeiten anderer erlernen konnte. Unser Team hat hierzu ein Fliegenfischen Kurs angeboten, bei welchem erst theoretisch auf die Grundlegenden Elemente eingegangen wird und anschliessend spielerisch das Ganze geübt wurde, bei welcher der Fliegenfisch-Champion 2023 gekührt wird.

Wir freuen uns, den Ehrgeiz und die Leistung unserer wertvollen Sportler zu feiern, deren Leidenschaft und Talent sie zu den höchsten Ebenen des Athletengeists geführt haben. Es ist uns eine Ehre, heute den Fliegenfisch-Champion 2023 mit der Medaille zu ehren! Sie haben ihren Zielen und Träumen nachgejagt und sich gegenseitig kontinuierlich angetrieben, um ihre Fähigkeiten zu verbessern. Sie haben sich gemeinsam anstrengen müssen, um diese Leistungen zu erbringen. Die Medaille, die wir Ihnen heute überreichen, ist eine Anerkennung Ihrer harten Arbeit, Ihres Engagements und Ihrer Leidenschaft. Sie sind eine stille Erinnerung an Ihren Einsatz und an das unerschöpfliche Streben nach Höherem.
Wir sind stolz auf Sie alle und gratulieren Ihnen zu Ihren Erfolgen. Sie haben uns gezeigt, was mit Hingabe und Beharrlichkeit erreicht werden kann. Möge Ihre Leidenschaft für den Sport Sie weiterhin antreiben und Ihnen dabei helfen, noch größere Erfolge zu erzielen.
Zum Fliegenfisch-Champion 2023 wird dieses Jahr Sven Rohrer gekührt. Herzlichen Glückwunsch zu deinem hervorragenden Triumph!

Hacks

Ein Hack ist eine kreative Lösung oder ein Verbesserungsvorschlag, der auf unkonventionelle Weise dazu dient, ein handelsübliches Produkt oder ein bestehendes System zu modifizieren, zu erweitern oder zu verbessern, um ein bestimmtes Ziel zu erreichen. Dies kann eine einfache Anpassung eines Produkts sein, um es einzigartig zu machen, oder es kann eine umfassendere Änderung sein, um die Funktion eines Produkts oder Systems zu erweitern oder zu verbessern. Wenn wir von Hacks sprechen, sind diese nicht zu verwechseln mit Hacks im Web bzw. hacktivistischen Angriffen auf Systeme. Der Begriff Hack wird abgeleitet verwendet um u.a. ein biologisches System zu "hacken" bzw. dieses auszulesen.
Während der Blockwoche werden drei Versuche durchgeführt bzw. aufbaut und programmiert. Die Hacks werden in den folgenden Abschnitten genauer beschrieben.

Hack 0

Der Hack 0 beinhaltet den Bau eines Galvanic-Skin-Response Sensors. Ziel dieser Übung ist das Sammeln von Erfahrungen mit dem Lötkolben, das Kennenlernen der ARDUINO IDE und der Umgang mit dem ESP32-Microcontroller.
Der Code für diese erste Anwendung beinhaltet lediglich das Auslesen eines analogen Input-Pins des ESP32. Der ausgelesene Wert kann anschliessend über den Serial Monitor in der ARDUINO IDE angezeigt werden. Das hochladen des Codes auf den ESP32 stellt sich jedoch als etwas komplizierter heraus als angenommen. Um den Code erfolgreich hochzuladen muss zuvor jeweils die folgende Tastenkombination gedrückt werden: BOOST (halten) - RESET (drücken) - BOOST (loslassen). Anschliessend kann das Programm durch einmaliges Drücken der RESET-Taste gestartet werden.

Um die Messung benutzerfreundlicher zu gestalten, kam die Idee auf, die Werte direkt neben dem Sensor ablesen zu können. Dazu haben wir auf dem Board einen OLED-Display angebaut und entsprechend programmiert. Dies war ein spannender Ansatz um die Integrität einer Ausgabe der gemessenen Werte zu testen.

//Galvanic Skin Response Measurement with OLED-Display

//Importing the needed Librarys
#include  <Adafruit_SSD1306.h>
#include  <Adafruit_GFX.h>

//defining the the needed variables for the use of the OLED
#define OLED_RESET    -1
#define SCREEN_WIDTH  128 //Pixels
#define SCREEN_HEIGHT 64  //Pixels

//Setup the OLED Display
Adafruit_SSD1306  display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);

void setup() {
  //Assigning a input-pin to the GSR-Sensor
  pinMode(3, INPUT);

  //defing the settings of the OLED
  display.begin(SSD1306_SWITCHCAPVCC, 0x3C);
  display.setTextSize(1);
  display.setTextColor(WHITE);
  display.setCursor(60, 32);
  display.display();
  delay(500);
  display.clearDisplay();
}

void loop() {
  //Creating a variable for the measured GSR-value
  float GSRValue  = analogRead(3);

  //Sending the data to the OLED via i2C
  display.setCursor(60, 32);
  display.print(GSRValue);
  display.display();
  delay(50);
  display.clearDisplay();
}

Der ESP32 ist ein kleines, preisgünstiges und leicht zu bedienendes Single-Board-Computer-System. Es verwendet einen Mikrocontroller, um digitale und analoge Signale zu verarbeiten und Steuerungsaufgaben auszuführen. Das ESP32 kann über eine Reihe von Ein- und Ausgaben verbunden werden, wie z.B. Sensoren, Motoren, LEDs, Displays usw. Der Benutzer kann dann Programme auf den Arduino hochladen, die diese Ein- und Ausgaben steuern.

Nach den ersten erfolgreichen Experimenten führten wir noch mit der BioAmp EXG Pill, entwickelt von der Firma Upside Down Labs, eine EKG Messung durch. Hierfür verwendeten wir den Code, welcher auch auf der Website von Upside Down Labs verlinkt ist.

#define SAMPLE_RATE 125
#define BAUD_RATE 1200
#define INPUT_PIN 17

void setup() {
	// Serial connection begin
	Serial.begin(BAUD_RATE);
}

void loop() {
	// Calculate elapsed time
	static unsigned long past = 0;
	unsigned long present = micros();
	unsigned long interval = present - past;
	past = present;

	// Run timer
	static long timer = 0;
	timer -= interval;

	// Sample
	if(timer < 0){
		timer += 1000000 / SAMPLE_RATE;
		float sensor_value = analogRead(INPUT_PIN);
		float signal = ECGFilter(sensor_value);
		Serial.println(signal);
	}
}

// Band-Pass Butterworth IIR digital filter, generated using filter_gen.py.
// Sampling rate: 125.0 Hz, frequency: [0.5, 44.5] Hz.
// Filter is order 4, implemented as second-order sections (biquads).
// Reference:
// https://docs.scipy.org/doc/scipy/reference/generated/scipy.signal.butter.html
// https://courses.ideate.cmu.edu/16-223/f2020/Arduino/FilterDemos/filter_gen.py
float ECGFilter(float input)
{
  float output = input;
  {
    static float z1, z2; // filter section state
    float x = output - 0.70682283*z1 - 0.15621030*z2;
    output = 0.28064917*x + 0.56129834*z1 + 0.28064917*z2;
    z2 = z1;
    z1 = x;
  }
  {
    static float z1, z2; // filter section state
    float x = output - 0.95028224*z1 - 0.54073140*z2;
    output = 1.00000000*x + 2.00000000*z1 + 1.00000000*z2;
    z2 = z1;
    z1 = x;
  }
  {
    static float z1, z2; // filter section state
    float x = output - -1.95360385*z1 - 0.95423412*z2;
    output = 1.00000000*x + -2.00000000*z1 + 1.00000000*z2;
    z2 = z1;
    z1 = x;
  }
  {
    static float z1, z2; // filter section state
    float x = output - -1.98048558*z1 - 0.98111344*z2;
    output = 1.00000000*x + -2.00000000*z1 + 1.00000000*z2;
    z2 = z1;
    z1 = x;
  }
  return output;
}


Hack 1

Mit dem Hack 1 möchten wir eine Idee realisieren, um Farberkennung für Farbenblinde zu ermöglichen. Hierfür haben wir ein Python-Programm erstellt, welches zurzeit lokal auf einem Laptop ausgeführt wird. Mit Hilfe der Open-Source Library "OpenCV" wird auf die im Laptop integrierte Webcam zugegriffen und mit derm HSV-Farbmodell die Farbe im zentral gelegenen Pixel ausgewertet. Über die Serielle Schnittstelle zum ESP32 (USB Kabel) kann anschliessend die erkannte Farbe im Datentyp String weitergeleitet werden. Das ESP32 kann anschliessend wie bereits im HACK 0 beschrieben die jeweilige Farbe als Text auf dem OLED-Display anzeigen. Es handelt sich bei diesem Aufbau um ein Proof-of- Concept. Es wäre sicherlich sinnvoll eine externe Kamera zu verwenden um nicht an den Laptop gebunden zu sein. Zudem wäre es denkbar das Konzept für blinde Personen zu erweitern. Möglich wäre z.B. eine haptische Rückmeldung in Form einer Schwingung bzw. Vibration oder auch eine akustische Rückmeldung als Sprachausgabe. Der Python-Code sowie der Arduino Sketch sind unten eingefügt.

#Python-code for color recognition
#importing the necessary libraries
import cv2 as cv
import numpy as np
import serial
import serial.tools.list_ports
import time

#Listing all accessable serialports 
ports = serial.tools.list_ports.comports()
serialInst = serial.Serial()

#Creating an array with the accessable ports
portsList = []

for onePort in ports:
    portsList.append(str(onePort))
    print(str(onePort))

#Asking the user which port should be used
val = input('Select a port: COM')

for x in range(0,len(portsList)):
    if portsList[x].startswith('COM' + str(val)):
        portVar = 'COM' + str(val)
        print(portVar)

#Opening the serialcommunication to the ESP32
serialInst.baudrate = 9600
serialInst.port = portVar
serialInst.open()

#Connecting to the internal webcam
cap = cv.VideoCapture(0)
cap.set(cv.CAP_PROP_FRAME_WIDTH, 1280)
cap.set(cv.CAP_PROP_FRAME_HEIGHT, 720)

#reading the HSV-Value of the center Pixel
while True:
    
    ret, frame = cap.read()
    
    hsv_frame = cv.cvtColor(frame, cv.COLOR_BGR2HSV)
    
    height, width, _ = frame.shape
    
    cx = int(width/2)
    cy = int(height/2)
    

    
    frameCenter = hsv_frame[cy, cx]
    
    hue_value = frameCenter[0]
    
    #Defining the colors which should be recognisable
    color = 'Undefined'
    if hue_value < 5:
        color = 'red'
    elif hue_value < 22:
        color = 'orange'
    elif hue_value < 33:
        color = 'yellow'
    elif hue_value < 78:
        color = 'green'
    elif hue_value < 131:
        color = 'blue'
    elif hue_value < 167:
        color = 'violet'
    else:
        color = 'red'
        
    #Showing the Frames with the name of the color in the top left corner    
    print(color)
    cv.putText(frame, color, (10, 50), 0, 1, (255, 0, 0), 2)
    cv.circle(frame, (cx, cy), 10, (0, 0, 255), 3)
    cv.imshow('frame', frame)
    time.sleep(0.5)
    
    #Sending the name of the color to the ESP32
    serialInst.write(color.encode('utf-8'))
    time.sleep(1)
    
    
    key = cv.waitKey(1)
    if key ==27:
        break

cap.release()
cv.desroyAllWindows()

serialInst.close()
//Color recognition with Laptop Webcam and OLED-Display

//Importing the needed Librarys
#include  <Adafruit_SSD1306.h>
#include  <Adafruit_GFX.h>

//defining the the needed variables for the use of the OLED
#define OLED_RESET    -1
#define SCREEN_WIDTH  128 //Pixels
#define SCREEN_HEIGHT 64  //Pixels

//Setup the OLED Display
Adafruit_SSD1306  display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);

//Creating a color variable
String Rec_color;

void setup() {

  //Starting the Serial communication with the laptop
  Serial.begin(9600);

  //defing the settings of the OLED
  display.begin(SSD1306_SWITCHCAPVCC, 0x3C);
  display.setTextSize(3);
  display.setTextColor(SSD1306_WHITE);
  display.setCursor(1, 16);
  display.display();
  delay(500);
  display.clearDisplay();
}

void loop() {
  //Reading the data that is sent from the Laptop
  while(Serial.available()>0){
    String Rec_color = Serial.readString();
    
    //Sending the data to the OLED via i2C
    display.setCursor(1, 16);
    display.print(Rec_color);
    display.display();
    delay(50);
    display.clearDisplay();
  }
}

Hack 2

Mit dem Hack 2 möchten wir einen Prototypen realisieren, welcher in der Lage ist Flüssigkeiten zu vermischen. Solche Maschinen kommen unteranderem in der Lebensmittel-, Medizin- oder Kosmetikbranche zum Einsatz. Unser Ziel ist, mit nur einer Maschine zwei verschiedene Mischbewegungen durchführen zu können. Zum einen wollen wir einen Aufsatz zum Zentrifugal-mischen, sowie einen Aufsatz mit einer reinen translatorischen Bewegung gestalten. Beide Bewegungen werden dafür von einem einzelenen Schrittmotor erzeugt. Die Geschwindigkeit des Schrittmotors kann zudem mit Hilfe einses Potentiometers angepasst werden.
Die Schwierigkeit bei diesem Projekt war die Ansteuerung des Schrittmotors. Nachdem wir jedoch eine geeignete Arduino Library gefunden haben, welche die Ansteuerung erheblich erleichterte, konnten wir mit dem mechanischen Aufbau forrtfahren. Beinahe alle Teile haben wir mit dem Lasercutter effizient herstellen können. Für den Zentrifugal-Aufsatz haben wir uns für eine Runde Platte entschieden, welche in der Mitte auf die Ausgangswelle des Schrittmotors montiert werden kann. Der Aufsatz für die translatorische Bewegung ist ein wenig komplizierter. Er besteht aus einer rechteckigen Platte welche seitlich geführt wird. Durch einen exzentrischen Hebelarm und die entsprechende Führung in der Platte kann die Drehbewegung in eine translation überführt werden. Der Arduino Sketch ist unten abgebildet.
Das Programm ist eine leicht angepasste Variante von einem Programm welches in diesem Video gezeigt wird.Video zu AccelStepper-Library

#include <AccelStepper.h>

AccelStepper stepper(AccelStepper::DRIVER, 2, 3);  //StepPin D2 and DirPin D3

void setup()
{  
  stepper.setMaxSpeed(1500);
}

void loop()
{  
  int potValue = analogRead(A0);
  if (potValue < 100 ) potValue = 0;
  int stepperMotorSpeed = map(potValue, 0, 1023, 0, 1500);

  stepper.setSpeed(stepperMotorSpeed);  
  stepper.runSpeed();

}

Reflexion

Drei spannende Projekte wurden realisiert und die Ergebnisse haben unsere Erwartung vollumfänglich erfüllt. Es war eine tolle Erfahrung, welche uns die Möglichkeit geboten hat, unsere Kreativität und unsere Fähigkeiten im Umgang mit verschiedenen Materialien zu erweitern. Wir konnte neue Dinge lernen in Bezug auf Prototyping und es hat uns viel Freude bereitet, die Ergebnisse unserer Arbeit zu sehen.
Der Ablauf der Blockwoche war gut strukturiert und bei einem Anliegen oder einer Frage konnte man jederzeit auf die Dozenten zählen. Innerhalb vom Team konnten wir unsere individuellen Stärken gezielt einsetzen und uns auch gegenseitig Wissen weiter geben.
Teils war das weitere Vorgehen etwas sehr offen gehalten, jedoch war dies insofern ein Vorteil, da man dem eigenen Workflow folgen konnte.