SeedCrane

Aus HRW FabLab MediaWiki
Wechseln zu: Navigation, Suche

Der Seed Crane ist eine Saathilfe, die Menschen mit motorischen Einschränkungen das Pflanzen von Gemüsesamen erleichtert.

SeedCrane


SeedcraneTitel.png

Entwickler

Robert Daniel, Tom Staab, Nikita Popovic

Verwendete Programmiersprache

Arduino C

Eingesetzte Software

Arduino IDE, Blender , Cura

Eingesetzte Hardware

Ultimaker 3+














Projektbeschreibung[Bearbeiten]

Plakat für das Projekt Seed Crane

Unser Prototyp besteht im essenziellen aus einem Arduino, einem Schrittmotor, einem Display, einer Lochscheibe und diversen Bauteilen aus dem 3D-Drucker. Wir haben Wert darauf gelegt, das System günstig, simpel und robust zu halten, damit man bei der Benutzung im Garten keine Sorgen haben muss. Die Kosten des Prototyps liegen bei etwa 25€. Beim Druck auf einen Taster dreht sich die Lochscheibe und lässt einen einzelnen Samen aus dem Vorratsbehälter in einen Schlauch fallen. Mit diesem Schlauch kann man den Samen direkt in das Pflanzloch einbringen. Auf dem LCD wird der aktuelle Status und die Anzahl der gepflanzten Samen angezeigt. Außerdem gibt es eine selbstkalibrierende Lichtschranke, die sicherstellt, dass immer genau ein Samen pro Knopfdruck ausgegeben wird.











Projektentwicklung[Bearbeiten]

Erster Entwurf des Seed Crane
Unser Prototyp

Wir haben zunächst ein voll automatisches Konzept entwickelt, das sich an den 3D-Druckern des RepRap-Projekts orientiert. Bei diesem System sollte über dem Pflanzkasten ein Dorn zum Einbringen der Samen mithilfe von zwei horizontalen Linearantrieben positioniert werden. Anschließend würde über einen dritten vertikalen Linearantrieb der Samen in die Erde gepflanzt. Daher stammt die Anlehnung des Namens "Seed Crane" an die bekannten "Claw Crane" Spielautomaten.

Nach einem Besuch beim Rotthoffs Hof wurde uns jedoch klar, dass wir damit nicht die genauen Bedürfnisse der Nutzer treffen. Es gab nämlich folgende Punkte zu beachten:

  • Unser System soll das mechanische Portionieren der Samen übernehmen, da dies sehr viel Feinmotorik erfordert.
  • Das Einbringen der Samen soll nicht automatisiert werden, es sollen Hilfsmittel entwickelt werden, um diesen Prozess zu vereinfachen.
  • Wenn große Mengen ausgepflanzt werden ist es leicht den Überblick zu verlieren. Aus diesem Grund soll die Menge der Ausgepflanzten Samen von unserem System gezählt und angezeigt werden.

Um diese Anforderungen erfüllen zu können, haben wir ein neues Konzept entwickelt, das den Nutzer lediglich unterstützen soll. Nach einigen Tests haben wir und für eine Lochscheibe zum Portionieren der Samen entschieden. Die größte Schwierigkeit bestand darin, einen Weg zu finden, die Samen zählen zu können, um sicherzustellen, dass immer genau ein Samen ausgegeben wird. Dieses Problem konnten wir jedoch mit einer Lichtschranke, die von den Samen verdunkelt wird, lösen.













Hardware[Bearbeiten]

Benötigte Bauteile[Bearbeiten]

Materialliste
Beschreibung Anzahl
M3 Schraube 50mm 2
M8 Gewindestange min.0.5m 2
M8 Mutter 8
M8 Unterlegscheibe 8
M5 Gewindestange ca.5cm 1
M5 Mutter 1
M5 Unterlegscheibe 1
Wellenkupplung 5mm 1
Transparenter Schlauch 6mm 1m
Halterungen aus dem 3D-Drucker 9
Lochscheibe aus dem 3D-Drucker 1
Schrittmotor 1
Motortreiber A4988 1
Arduino Nano 1
Display HD44780 1
Taster 2
Photowiderstand 1
LED 1
Widerstand für die LED 1
Widerstand für den Photowiederstand 1
Widerstand für das Display 1
Platine für die Elektronik 1

3D-Druck[Bearbeiten]

Alle benötigten Halterungen für den Seed Crane
Aufbau-Reihenfolge der Bauteile auf den Gewindestangen

Um die Kosten und das Gewicht für unseren Prototyp niedrig zu halten, haben wir uns dafür entschieden, die nötigen Halterungen sowie die Lochscheibe mithilfe des 3D-Duckers zu erstellen. Um die Lichtschranke optimal feinjustieren zu können, haben wir uns für eine modulare Bauweise entschieden. Gleichzeitig ist es so einfach möglich, die Höhe des Seed Crane zu variieren. Aus diesem Grund haben wir verschiedene Halterungen designt, die auf zwei M8 Gewindestangen gesteckt werden und mit Muttern und Unterlegscheiben in der dargestellten Reihenfolge fixiert werden. Die Lochscheibe wird mithilfe der Wellenkupplung und der M5 Gewindestange direkt auf dem Schrittmotor geschraubt.
















Elektronik[Bearbeiten]

Datei:.jpg
Schaltplan des Seed Crane

Die Elektronik wird auf eine 10x11cm große Platine gelötet, die anschließend in den Platinenhalter gesteckt wird. Der Taster zum Auslösen wird am Griff verschraubt. Die Lichtschranke und der Schrittmotor werden an den entsprechenden Halterungen montiert.





Software[Bearbeiten]

Die Steuerung des Seed Crane erfolgt mit einem Arduino Nano, auf welchem das unten dargestellte Programm läuft. Der Arbeitsablauf ist in etwa Folgender: Nach dem Druck auf den Taster wird der Schrittmotor und damit die Lochscheibe in Bewegung gesetzt. Anschließend wird die Lichtschranke kontrolliert bis ein Samen hindurch fällt. Nun wird der Schrittmotor angehalten und auf dem Display die Summe aller Samen mit eins addiert. Um sicherzustellen, dass die Lichtschranke auch bei wechselnden Lichtsituationen funktioniert, wird regelmäßig die durchschnittliche Helligkeit gemessen. Um die Summe aller Samen zurückzusetzen, wird der Arduino mit dem Reset-Taster neu gestartet.

Arduino Code[Bearbeiten]

  /*  Seedcrane Arduino script
 *  by Tom Staab
 */

#include <LiquidCrystal.h>

#define seedSwitchPin A0
#define lightSensor A1
#define seedSensor A2

#define motorDir 8
#define motorStep 9
#define motorEnable 10

#define lcdRS 7

#define lcdE 6
#define lcdD4 2
#define lcdD5 3
#define lcdD6 4
#define lcdD7 5
#define lcdBackground 11

#define airPump 12

/* The signal must go UNDER this value for the
 * controller to think that a seed has been dropped.
 * -1 = self calibration
 */
short seedSensorThreshold = -1;

short seedSensorSelfCalibration = 0;
short seedSensorCalibrationArray[25];
short seedSensorCounter = 0;

const short motorDirection = 1; //Direction of motor
const short motorInterval = 10; //Pulsewidth for motor in ms

const short waitingTime = 50; //Before pump stops and its ready again
short seedCounter = 0; //Count successful dropped seeds

LiquidCrystal lcd(lcdRS, lcdE, lcdD4, lcdD5, lcdD6, lcdD7);

void setup() {
  Serial.begin(9600);
  lcd.begin(16, 2);
  lcd.print("Initialisiere");
  pinMode(airPump, OUTPUT);
  pinMode(motorDir, OUTPUT);
  pinMode(motorStep, OUTPUT);
  pinMode(motorEnable, OUTPUT);
  pinMode(lcdBackground, OUTPUT);
  digitalWrite(lcdBackground, HIGH);
  digitalWrite(motorEnable, HIGH);
  
  if (seedSensorThreshold == -1) { //Determine Threshold
    seedSensorSelfCalibration = 1;
    for (int i = 0; i < 25; i++) {
      seedSensorCalibrationArray[i] = analogRead(seedSensor);
      delay(20);
      
    }
  }
}

void loop() {
  //Variables
  static short delayPeriod = 100;
  static short seedSwitchVal;
  static short isReady = 0;

  //Check
  seedSwitchVal = analogRead(seedSwitchPin) > 1020 ? 1 : 0;
  seedSensorCounter = seedSensorCounter >= 25 ? 0 : seedSensorCounter;
  seedSensorCalibrationArray[seedSensorCounter] = analogRead(seedSensor);
  seedSensorCounter++; 

  //Do
  if (seedSwitchVal && isReady) {
    isReady = 0;
    if (seedSensorSelfCalibration)
      seedSensorThreshold = average() - 20;
    seedButtonPressed();
    delay(waitingTime);
  }
  
  //Finally
  if (!isReady) {
    Serial.println("\nReady.");
    digitalWrite(LED_BUILTIN, HIGH);
    lcd.setCursor(0, 0);
    lcd.print("Bereit          ");
    lcd.setCursor(0, 1);
    lcd.print(seedCounter);
    digitalWrite(airPump, LOW); //Stop pump
    isReady = 1;
  }
  
  delay(delayPeriod);
}

void seedButtonPressed() {
  short seedDetected = 0;
  short lightDetected = 0;
  seedCounter++;

  //Output
  Serial.print("Seed button was pressed. (");
  Serial.print(seedCounter);
  Serial.println(")");
  digitalWrite(LED_BUILTIN, LOW);
  lcd.setCursor(0, 0);
  lcd.print("Bitte warten... ");
  lcd.setCursor(0, 1);
  lcd.print(seedCounter);
  
  //Start pump and motor
  digitalWrite(airPump, HIGH);
  digitalWrite(motorEnable, LOW);
  
  //Rotate motor
  for (short i = 0; i < 5; i++) { //Initial rotation
    oneStep(motorDirection, motorInterval);
  }
  Serial.println("Initial rotation done. Checking for seed.");
  Serial.print("Seed sensor threshold: ");
  Serial.println(seedSensorThreshold);
  checkForSeed(&seedDetected);
  while (!seedDetected) { //Going further while checking for seed
    oneStep(motorDirection, motorInterval);
    for (short i = 0; i < 5; i++) { //Checking i times per step
      checkForSeed(&seedDetected);
      if (seedDetected)
        break;
      delay(motorInterval);
    }
  }
  
  Serial.println("Finished moving.");
  digitalWrite(motorEnable, HIGH);
}

void checkForSeed(short* var) {
  short reading = analogRead(seedSensor);
  if (reading < seedSensorThreshold) {
    Serial.print("Seed dropped at value: ");
    Serial.println(reading);
  }
  *var = reading < seedSensorThreshold ? 1 : 0;
}

void oneStep(short dir, short interval) {
  if (dir) //Set direction
    digitalWrite(motorDir, HIGH);
  else
    digitalWrite(motorDir, LOW);
  digitalWrite(motorStep, HIGH); //Execute step
  delay(interval/2);
  digitalWrite(motorStep, LOW);
  delay(interval/2);
}

short average() {
  short sum = 0;
  float avg;
  for (int i = 0; i < 25; i++) {
    sum += seedSensorCalibrationArray[i];
  }
  avg = (float) sum / 25;
  return (short) avg;
}