Manuel Jasch

Alles rund um Internet & Technik

Camper Ausbau - Fragen über Fragen

Mai 132021

Für welches Basisfahrzeug haben wir uns entschieden? Bei der Höhe gibt es an vielen Plätzen Einschränkungen auf eine maximale Fahrzeughöhe. Parkhäuser, Küstenparkplätze und Wanderparkplätze sind häufig in ihrer Zufahrtshöhe bis z.B. 2,2 m limitiert. Auch Parkplätze stehen unter einer Norm und sind meist 2,4 m breit und 5 m lang. Uns war aber wichtig, dass der Camper Stehhöhe aufweist, manövrierbar bleibt und nicht zu auffällig wird. 

Um den Raum bestmöglich zu nutzen war es uns wichtig im Camper quer zu schlafen. Das schränkt die Fahrzeugmodelle bereits stark ein. Zwei Meter Laderaumbreite bieten die baugleichen Modelle Fiat Ducato, Peugeot Boxer und Citroen Jumper. Wir entschieden uns dann für ein Citroen Jumper 2019, L3 H2. Dieser war ein halbjahres Leasing Wagen mit geringer Fahrleistung und wenig Rost, dafür mussten wir ein paar Dellen in Kauf nehmen. Außerdem hat er Tempomat, Klimaanlage und erfüllt die Euro 6 Norm, was vielleicht entscheidend beim Widerverkauf sein kann.

Woher kam unsere Inspiration? Auf Pinterest haben wir uns viele Ausbauten angeschaut und daraus das Beste zusammengetragen. Der Rest war kreative Arbeit um möglichst keinen Platz zu verschwenden und viel Stauraum zu schaffen.

Rohbau

Was haben wir gegen Rost gemacht? Zum Glück war der Kastenwagen in einem guten Zustand, sodass nur wenige Stellen ausgebessert werden mussten. Diese Stellen wurden mit Schleifpapier angeschliffen und mit einer Grundierung bzw. einem weißen Lack angesprüht.

Welche Fenster wurden gewählt? Wir haben uns für ein Seitenfenster von Dometic entschieden mit der Abmessung 800x350 mm. Der Rahmen des Seitenfensters ist meiner Meinung nach ziemlich groß, sodass wenig Fenster übrig bleibt und das bei einem Preis von 360 €. Leider gibt es nicht viele günstige Alternativen. Zusätzlich haben wir zwei Thule Dachluken mit den Maßen 400x400 mm verbaut. Bei den Dachluken haben wir eines mit einem Lüfter gewählt um für Kühlung im Sommer zu sorgen. Der Motor ist ziemlich effektiv und schafft einen sehr guten Luftaustausch. Die Dachluken haben eine Zwangsbelüftung, sodass keine abgestandene Luft entsteht während man schläft.

Soll die Rückwand herausgenommen werden? In unseren Augen hätte es nur Sinn gemacht wenn beide Sitze drehbar wären. Leider bekommt man für die Doppelbank nur schwer eine drehbare Doppelbank. Falls man die Rückwand entnimmt muss man sich auch mehr Gedanken über die Isolierung der Fahrerhaus Fenster machen. Es beschlägt nicht nur, sondern lässt Wärme und Licht ebenso gut rein wie raus. Unter diesen Punkten entschieden wir uns die Wand drinnen zu lassen und ein Fenster darin auszuschneiden. Dieses Fenster hat einen Thermovorhang bekommen, der lichtdicht verschließbar ist.

Welchen Boden haben wir verwendet? Es war bereits eine Siebdruckplatte mit einer Stärke von 12 mm verbaut. Diese war noch sehr gut erhalten. Eine neue und womöglich leichtere Bodenplatte hätte zusätzlichen Aufwand bedeutet und die Kosten unnötig steigen lassen. Daher haben wir uns entschieden die Selbe wieder zu verwenden. Unter der Bodenplatte kam eine Dämmung mit 20 mm XPS Platten und über der Bodenplatte kam ein PVC-Boden, welcher mit doppelseitigem Klebeband fixiert wurde. Der gesamte Boden ist schwimmend verlegt, d.h. es gibt keine Verschraubungen mit dem Fahrzeug.

Wie haben wir isoliert? Für die Dämmung des Bodens und der Decke haben wir 20 mm XPS Platten verwendet. Den restlichen Raum haben wir mit Armaflex in der Dicke 19 mm und 6 mm isoliert. Lücken wurden mit Resten von XPS und Armaflex aufgefüllt. Für die Schallisolierung haben wir an der Decke an einigen Stellen Alubutyl verwendet. Im Nachgang hat sich aber gezeigt das Armaflex ebenso gut schallabsorbierend ist. Im Kofferraum wie unter der Küche haben wir auf weitere Dämmung verzichtet; zum einen aus Kostengründen und zum anderen haben wir so Flächen geschaffen wo warme Luft gezielt kondensieren kann. Ob dieser Plan aufgeht ist noch nicht geklärt.

Wie wurde die Verkleidung gemacht? Wir entschieden uns für eine Profilholzverkleidung an der Decke und an den Seitenwänden. An den Seitenwänden wurde die Verkleidung nur an den sichtbaren Bereichen gemacht, das heißt hinter den Möbeln fehlt diese. Befestigt wurde das Profilholz auf zuvor angeklebten Vierkanthölzern. Eine Holzverkleidung macht für uns einen schöneren Wohneindruck, ist jedoch sehr schwer. Allein 90 kg Profilholz haben wir eingekauft und das meiste davon verwendet. Die Seitenwände haben wir mit Weiß Acryl Seidenmatt gestrichen, die Decke mit einer Holzlasur in Nussbaum. Fehlstellen wurden zuvor an den Seitenwänden mit Acryl ausgebessert.

Für die Wandverkleidung im Schlafbereich haben wir uns für Filz entschieden. Filz hat den Vorteil, dass es kaum aufträgt und somit die wertvolle Länge des Bettes nicht weiter reduziert wird. Außerdem lässt es sich sehr gut dem unebenen Untergrund anpassen. Filz wurde ebenso in den Wandschränken verwendet, um möglichst großen Stauraum zu bekommen. Nur so war es möglich die Rundungen und Verstrebungen im Fahrzeug zu verkleiden und den Raum dabei nicht zu verlieren.

Möbel

Welches Holz wurde verwendet? Für Konstruktionen haben wir Zwei Meter Fichten Vierkantholz mit den Abmessungen 17x36 mm verwendet. Für stabilere Konstruktionen, z.B. am Bett, wurde 48x24 mm verwendet. Dieses Holz ist sehr günstig, kommt aber sägerau, das heißt für den sichtbaren Bereich musste es geschliffen werden.

Für die Schubladen wurde Birke-Sperrholz in der Stärke 9 mm verwendet um die notwendigen Verschraubungen zu setzen. Für den Boden kamen MDF/HDF Platten in 3 mm Stärke zum Einsatz. Um den Aufwand gering zu halten wurde der Boden direkt mit dem Rahmen verschraubt anstelle eine Nut dafür zu fräsen. 

Bei den Möbel wurde bei den nicht tragenden Wänden 4 mm Fichten-Sperrholz verwendet. Bei tragenden Elementen, wie den Sitzen, wurde 6 mm verwendet und eine passende Unterkonstruktion gebaut.

Für den Tisch und die Arbeitsplatte haben wir eine Leimholzplatte aus Akazie mit einer Stärke von 18 mm verwendet. Es hat sich herausgestellt, dass dieses Holz gebeizt ist, welche bei den Schnittkanten helles Holz zum Vorschein bringt. Die Arbeitsplatte wurde 2-3 mal geölt. Wir haben gehofft, dass sich die Schnittkanten damit abdunkeln, was nicht der Fall war. Im Nachgang hätten wir uns vielleicht doch für Eiche entschieden.

Wie wurden die Möbel gebaut? Jedes Möbelstück hat mit einer Unterkonstruktion aus Fichte angefangen. Diese wurde mit Holzleim verklebt und verschraubt. Beim Verschrauben musste sorgfältig vorgebohrt werden, was manchmal eine echte Herausforderung sein konnte, bei 17x36 mm großen Vierkanthölzern. Winkel haben wir gekauft aber nicht verwendet, da diese später sichtbar bleiben und nicht die notwendige Stabilität aufweisen. Mit 4 mm Fichten-Sperrholz wurden die Möbelstücke beplankt. Jedes Möbelstück wurde mit Acryl Seidenmatt Weiß zweimal gestrichen und geschliffen.

Wie werden die Möbel befestigt? Blechschrauben wollten wir vermeiden, da diese eine Kältebrücke schaffen und sich somit Kondenswasser sammeln würde. Somit wurde für jedes Möbelstück eine Unterkonstruktion aus Holz, mit Sikaflex 221, an die Karosserie geklebt. Im Anschluss konnten die Möbel daran angeschraubt werden.

Welches Bettvariante haben wir verbaut: Fixbett, Klappbett, Tischbett oder Dinettenbett? Wir entschieden uns gegen ein fixes Bett um einen möglichst großen Wohnraum zu bekommen. Dafür kann das Bett auf das Doppelte ausgezogen werden um eine gesamte Liegefläche von 195x135 cm zu erhalten. Die Matratze ist dabei in der Mitte geteilt und kann auf den selbstgebauten, ausgezogenen, Lattenrost geschoben werden. Falls wir mal keine Lust haben, das Bett zu machen, kann das Bett auch ausgefahren bleiben. Sitzen ist weiterhin möglich, nur der Tisch verschwindet unter dem Bett. Die Rückseite des Lattenrosts lässt sich bei Bedarf hochklappen. Das ermöglicht uns zwei Fahrräder im Kofferraum mitzunehmen. Geplant war das der Lattenrost hochgeklappt und verriegelt wird, sodass ein Sofa entsteht. Leider verliert der Kastenwagen mit steigender Höhe an Breite, sodass die Matratze beim Umklappen auf halbem Weg stecken bleibt. Die Lösung wäre eine dünnere Matratze oder ein kürzeres Bett - so verzichten wir erstmal auf ein Sofa. 

Um die volle Fahrzeugbreite zu erhalten, mussten zuerst die Stahlverstrebungen an den hinteren Blechen herausgenommen werden. Oben und unten waren diese punktgeschweißt, der Rest war verklebt. Mit einem kleinen Dremel und viel Geduld war das ohne Probleme möglich. Schleifstellen wurden mit Grundierung und Lack geschützt.

Welche Verriegelung wurde verwendet? Die Schränke sollen sich während der Fahrt nicht öffnen. Dafür sind spezielle Sicherungen notwendig. Für die Hängeschränke haben wir einen Push-To-Open Verschluss gewählt. Dadurch wird eine glatte Front erreicht und ebenso eine mechanische Verriegelung. Bei den Schubladen in der Küche kommen 3D gedruckte Klemmen zum Einsatz. Diese werden vor der Fahrt seitlich in die Schubladenfront eingebracht und verhindern dadurch das Aufgehen der Schubladen. Der Vorteil ist hierbei, dass die Schubladen nach der Entsicherung ohne großen Kraftaufwand nutzbar sind. Geöffnet werden können sie durch ein Fingerloch. Die Deckenklappe für den Duschkopf als auch die Gasschranktür wurden mit drehbaren Riegeln versehen. Bei den restlichen Schranktüren wurden Magnetschnäpper verwendet, die durch einen kräftigen Zug öffnen.

Elektrik

Wie groß ist unsere Batterie? Wir haben uns für eine 240 Ah AGM entschieden. Über die Auswahl der Speicher haben wir uns z.B. hier informiert. Die Batterie ist so ausgelegt, dass drei Tage Standzeit ohne Aufladen möglich sein sollten. 

Wie wird die Batterie aufgeladen? Wir entschieden uns ausschließlich für eine Aufladung mit Photovoltaik. Für die Aufladung über die Lichtmaschine wird eine Parallelschaltung der Starterbatterie benötigt. Zusätzlichen benötigt man einen Ladebooster für ein effizientes laden. Zum einen wollten wir die Komplexität der Schaltung einfach halten, zum anderen Kosten und Gewicht sparen was Kupferleitung und Ladebooster angeht. Bei Sonne liefern zwei Module mit je 170 W und einem Victron MPPT 100/20A Laderegler den notwendigen Ladestrom. Sogar wenn es bewölkt ist kommt genug Strom zum Laden von Handys rein.

Wie wurden die Solarpanels befestigt? Fest verkleben war keine Option für uns, falls doch mal ein Paneel kaputt gehen sollte oder man eines durch mehr Leistung ersetzen möchte. Da bleibt nur noch verschrauben - aber worauf? Kommerziell erhältliche Dachträger werden an den Pilzköpfen auf dem Dach verschraubt. Leider wird zusätzlich eine Konstruktion benötigt, die auf dem Dachträger aufbaut, um die Solarpanels aufzunehmen. Wir entschieden uns für eine günstigere Alternative. Im Fahrzeug selber waren ursprünglich Airline Schienen verbaut. Davon wurden mit Sikaflex 552 zwei Stück längs zum Fahrzeug auf das Dach geklebt. Im Anschluss konnten die Paneele mit Aluwinkeln angeschraubt werden. Für die Kabeldurchführung wurde eine Abdeckung 3D-gedruckt. Für alle Zweifler - hält bombenfest!

Wie sieht die Verschaltung der elektrischen Geräte aus? Ein Schaltplan wurde nur auf Papier erstellt. Ein Programm wäre sicher übersichtlicher geworden. Eine Revision davon ist hier zu sehen:undefined

Für die 12 V Versorgung wurden für die rote und schwarze Leitung je 20 Meter 4,0 mm² und 25 Meter 2,5 mm² Kabel verlegt. Die 2,5 mm² wurden für die Beleuchtung verwendet, die 4 mm² für die 12 Volt Steckdosen und Verbindungen zu den Großverbrauchern. Für die Verbindung zum Wechselrichter wurde das Kabel zweifach gelegt. Um Kabel zu sparen wurde bei den Kleinverbrauchern wie dem Licht die selbe Masse genommen. Leider ist mir das zum Verhängnis geworden nachdem ich PWM Dimmer installieren wollte. Es hat sich herausgestellt, dass die Transistoren negativ schaltend waren. Da ich die Kabel nicht mehr verändern konnte habe ich nun für diese Leitungen die Belegung von Spannung und Masse invertiert. Dadurch habe ich einige Leitungen, die mit falscher Farbe in den Sicherungskasten gehen.

Es wurden insgesamt 6 Deckenlampen installiert, die in Zweierreihen einzeln schalt- und dimmbar sind. Zudem gibt es noch eine dimmbare Leselampe, eine Spiegelschrankbeleuchtung und eine Küchenlampe. Für zusätzliche Geräte gibt es vier 12 V und zwei 230 V Steckdosen, sowie am Bett und an der Sitzgelegenheit USB Quick Charge Lademöglichkeiten. Weitere Leitungen wurden für eine potentielle Hängeschrankbeleuchtung, ein Kofferraumlicht und ein Landstromanschluss vorbereitet. Ein Leerrohr wurde für eine potentielle Verbindung mit der Starterbatterie verlegt. Für die Auslegung der Kabelquerschnitte habe ich unter anderem diese Seite verwendet.

Ausstattung

Welcher Kocher ist im Einsatz? Mit Strom zu kochen war für uns keine Alternative, siehe hier für mehr Informationen. Deshalb haben wir uns trotz der vielen Vorschriften für einen Gaskocher entschieden. Für eine Ummeldung als Wohnmobil ist ohnehin ein fest verbauter Kocher Pflicht. Leider konnte unser Wunschkocher nicht geliefert werden, daher haben wir uns für den verfügbaren Dometic 2-Flamm-Kocher HBG 2335 entschieden. Die besagten Gas Vorschriften für Wohnmobile haben wir hier entnommen. Bei dem Anschluss sind wir etwas durcheinander gekommen, daher hier nochmal zur Erinnerung: Der Gasflaschenanschluss sowie der vom Schlauch haben ein 1/4 Zollgewinde. Für die Verbindung von dem Schlauch und dem Endgerät ist eine Stahlrohrverbindung notwendig. Für diese Rohrverbindungen werden spezielle Schneidringverschraubungen verwendet. Für die Installation gibt es hier eine Anleitung. Wir haben uns für einen Gasschlauch entschieden, der auf der einen Seite ein Zollgewinde hat und auf der anderen Seite eine Schneidringverschraubung. Dadurch, dass wir die Gasrohre nicht biegen konnten, haben wir einfach eine Winkelverschraubung verwendet.

Haben wir eine Heizung? Nein. Mit Strom zu heizen macht leider keinen Sinn. Wenn es irgendwann eine Heizung geben soll, würde es eine Dieselheizung werden. Bisher haben wir bei 5 Grad Außentemperatur mit normaler Decke im Camper übernachtet, was frisch, aber nicht zu kalt war.

Was für ein Kühlschrank ist verbaut? Wir entschieden uns für einen 230 V sparsamen Kompressor-Kühlschrank mit 73 Liter Kühlfach und 8 Liter Gefrierfach. Vorteile sind die hohe Effizienz von 62 kWh/a und der niedrige Preis von 200 €. Einen Wechselrichter wollten wir sowieso verbauen. Trotz der Wandlungsverluste verbraucht der Kühlschrank weniger als eine Kompressor-Kühlbox. Wenn der Kompressor läuft werden 35 Watt gemessen. Der Anlaufstrom liegt bei 230 V und 0,65 A. Damit konnte der Wechselrichter möglichst klein ausgelegt werden um die Wandlungsverluste minimal zu halten. Wir entschieden uns für den Victron Phoenix mit 375 W Leistung.

Wie sieht die Wasserversorgung aus? Wir haben einen 80 Liter Frischwassertank, den man von außen über einen Gardena Anschluss befüllen kann. Leitungen wurden mit einem 10 mm PVC Schlauch gelegt. Ursprünglich war der Abwassertank unter dem Auto geplant, schlussendlich wurde es aber ein 15 Liter Abwasserkanister, welcher leichter zu installieren war. Da das Abwasser nur von der Spüle kommt, konnten wir auf einen kleineren Grauwassertank zurückgreifen.
Warmwasser haben wir bisher nicht. Die Überlegung war, mit dem überflüssigen Solarstrom einen kleinen Wasserboiler zu betreiben und somit ca. 10 Liter Warmwasser bereitzustellen. Unter der Spüle sollte genug Platz dafür sein.

Das Wasser wird mit einer 12 V Tauchpumpe gefördert, ein- und ausgeschaltet wird durch ein Kippschalter direkt am Spülschrank. Falls man nasse Hände haben sollte kann man den Schalter auch mit dem Knie erreichen. Mithilfe von vier Ventilen kann die Flussrichtung gesteuert werden. Damit sind unterschiedliche Kombinationen aus Warm- und Kaltwasserzufuhr sowie Spüle und Dusche möglich.

Wo ist denn die Nasszelle? Wir haben uns gegen eine klassische Nasszelle entschieden, da diese viel Platz wegnimmt und am Schluss doch nicht verwendet wird. Dennoch wollten wir den Platz für eine Dusche und Toilette vorsehen. Die Toilette, in Form einer Trenntoilette, findet unter der Sitzbank nahe der Schiebetür Platz. Für die Dusche wurde eine Wasserleitung zur Decke verlegt. Über eine Dachluke ist die Duschbrause erreichbar. Unter der Spüle befindet sich ein großes Fach, wo eine Duschwanne herausgezogen werden kann. Die Duschwanne fasst 40 Liter, welche nach dem Duschvorgang entleert werden muss. Um die Nässe fernzuhalten wird ein Duschvorhang mithilfe von Magneten an der Decke angebracht.

Wie viel Stauraum haben wir? Wir haben drei Hängeschränke: Einen über der Küche und zwei über dem Bett. Über der Fahrerkabine befindet sich noch zusätzlich ein großes Fach. Unter beiden Sitzbänken befindet sich zudem weiterer Stauraum, der zum Teil aber von Batterie und Toilette belegt ist. Die Küche besteht aus vier Schrankeinheiten. Der erste Schrank besteht aus zwei kleineren und einer großen Schublade. Der zweite Schrank ist unter der Spüle. Dieser wird aber hauptsächlich als Zugang zum Wasser genutzt und kann nicht weiter verwendet werden. Der dritte Schrank besteht aus zwei mittelgroßen Schubladen und der Letzte zum Großteil aus dem Gasschrank.

Zusätzlichen Stauraum haben wir in die Wandverkleidung eingearbeitet. Durch die Verstrebungen im Fahrzeug geht theoretisch durch eine Holzverkleidung viel Raum verloren. Durch Löcher in der Holzverkleidung konnten wir diesen Stauraum zurückgewinnen. Diesen nutzten wir um zwei Wandschränke unterzubringen und in der Flügeltür 6 Fächer zu schaffen.

Und was hat der Spaß gekostet? Das erfahrt Ihr neben der Arbeitszeit und dem Gewicht auf der nächsten Seite: camper-ausbau-ressourcen

  • Permalink
  • Kommentare

Kurzanleitung zum Programmieren eines ATtiny 85

Dez 312019

Diese Kurzanleitung soll erklären wie man den ATTiny 85 mit Hilfe des großen Bruders, dem Arduino Uno, über die Arduino Software programmiert. Hierfür benötigen wir:

  • Arduino Uno,
  • ATTiny 85,
  • Arduino Software (hier 1.8.9),
  • Kondensator 10 uF,
  • Jumper Kabel
  • und Breadboard.

Folgende Schritte sind notwendig um den Bootloader und das erste Programm zu schreiben:

  • Zuerst wird der Arduino Uno als ISP programmiert. Dafür die Arduino IDE öffnen und unter "Datei->Beispiele->ArduinoISP" das Programm auswählen. Im Anschluss unter "Werkzeuge->Board" den "Arduino Uno" wählen und "Hochladen" klicken.
  • Im nächsten Schritt wird die Schaltung aufgebaut sodass der ATtiny mit dem Arduino kommunizieren kann.undefined
  • Unter "Werkzeuge->Board" den ATtiny 85 mit 8 MHz Takt wählen. Die restlichen Optionen können so bleiben wie vorausgewählt. Wenn der Port nicht angezeigt wird dann passt noch etwas an der Schaltung nicht. Achte hierbei auf die korrekte Ausrichtung des ATTiny's.
    Anschließend unter "Werkzeuge->Programmer" "Arduino as ISP" wählen und "Bootloader brennen" klicken.
  • Wenn bis hierhin alles geklappt hat, kann das erste Programm geflasht werden. Unter "Sketch->Hochladen mit Programmer" wird das aktuelle Programm auf den ATtiny hochgeladen.

 

Hinweise:
Falls der ATtiny nicht auswählbar ist muss zuerst über den Boardmanager unter "Werkzeuge->Board->Boardverwalter.." der ATtinyCore installiert werden.

Wenn der ATtiny nicht aufgelistet wird im Boardverwalter dann fehlt der Arduino Umgebung der richtige Suchpfad. Dafür unter den Voreinstellungen von Arduino unter "Zusätzliche Boardverwalter URL's" folgende URL eingegeben werden: http://drazzy.com/package_drazzy.com_index.json

Falls das ArduinoISP nicht hochgeladen werden kann, entferne bitte den Kondensator aus der Schaltung und probiere es erneut.

  • Permalink
  • Kommentare

Teaboy "James" geht in die zweite Runde

Dez 312019

  undefined

Der Tea-Boy namens James geht in die nächste Runde. Er bekommt ein update was die Stabilität und den Aufbau angeht. Die Unterschiede zu dem vorherigen James sind folgende:

  • Neue Platine
  • Mechanischer An-/Aus Schalter
  • Halterungen für die Füße und Arme
  • Halterung für den Servo 

Bei der Schaltung hat sich nur wenig geändert. der zweite Taster ist durch einen mechanischen Schlater ersetzt worden um die Stromlaufzeit zu erhöhen.undefined

Daraus ist dann direkt eine Platine entstanden, welche gleichzeitig mechanische Funktionen übernimmt. Die Platine dient als Rumpf des James und bietet Befestigungsmöglichkeiten für die Beine, Arme, Servo und Potentiometer. Hier ist das Layout zu sehen:undefined

Die Halskrause ist gleichzeitig die Auswahl der Minuten. Die zusätzliche Schaltung, welche hier abgebildet ist, dient dazu die Platine voll zu machen, um kosten zu sparen.

Das Programm wurde ebenso überarbeitet. Im Folgenden ist ein Ausschnitt der Main Loop zu sehen.

void pulse_led();
void blink_led(uint8_t num, uint16_t frequency);
void finish_sequence();
uint32_t get_set_time();
uint32_t get_state_time();
void reset_state_time();

void loop() {
  switch(_state) {
    case TEA_BREWING:
      pulse_led(); /* signalize the waiting */
      if (get_state_time() > get_set_time()) /* check if time has expired */
        _state = TEA_FINISHED;
    break;
    case TEA_START_PRESSED:
      reset_state_time();
      blink_led(TEA_START_BLINK, TEA_START_FREQUENCY); /* short delay and blink */
      set_servo(SERVO_MIN, SERVO_POSITIONING_TIME); /* put arm down into the tea */
      _state = TEA_BREWING;
    break;
    case TEA_FINISHED: 
      finish_sequence();
      _state = TEA_POWER_ON;
    break;
    case TEA_POWER_ON:
    default:
      digitalWrite(PIN_LED, HIGH); /* show led that machine is power on */
      if (get_state_time() > WARNING_STILL_ON_AFTER) { /* signalize if the machine is still on */
        play_song(melody, beats, sizeof(melody)/sizeof(melody[0]));
        reset_state_time();
      }
    break;
  }
}

Der vollständige Code und das Eagle Projekt der Platine findet ihr auf Github. Das Programm auf den ATtiny hochladen ist über eine kleine Hilfsschaltung schnell erledigt.

  • Permalink
  • Kommentare

Tea-Boy - James

Dez 202016

undefined

Für ein Weihnachtsgeschenk kam mir die spontane Idee eines Tea Boys. Dieser soll den Tee überwachen, nach abgelaufener Zeit Bescheid geben, ob der Tee fertig ist und den Teebeutel aus der Tasse ziehen.

Über einen Potentiometer soll dabei die Teezeit eingestellt werden und mit einem Taster der Tee-Beutel abgelassen werden. Nach abgelaufener Zeit soll der Beutel wieder aus der Tasse gezogen werden und mit einem Piezo darauf aufmerksam gemacht werden. Eine LED zeigt dabei die Status an.

Was ich für den Tea Boy benötige:

  • ATtiny
  • LED
  • Widerstände: 150 Ohm, 22 kOhm
  • 2 Micro Taster
  • Mini Servo
  • Potentiometer
  • Piezo

Zum Programmieren des ATtiny benötige ich:

  • Kondensator 10 uF, 16 V
  • Arduino Uno Board

Der ATtiny wird mithilfe eines in-system programmer (ISP) und eines Arduino Uno Board programmiert. Dafür wird der ATtiny, wie hier beschrieben, an das Arduino Uno Board angeschlossen. Der Kondensator muss dabei zwischen Masse und Reset gesteckt werden um zu verhindern, dass der Arduino reseted wird. Dann noch ein ISP Programm auf den Arduino installieren, das richtige Board auswählen und schon kann der ATtiny programmiert werden. Über die Entwicklungssoftware von Arduino kann noch die Frequenz des ATtinys ausgewählt werden. Ich habe bei diesem Projekt 8 Mhz gewählt. Nicht vergessen den Bootloader über die Arduino Software zu brennen. Dieser brennt nicht wirklich einen Bootloader sondern dieser setzt die Fuse-Bits, welche den internen Oszillator auf 8 Mhz wählt.

Der nächste Schritt ist die Programmierung. Dabei habe ich mich von dieser Seite inspirieren lassen, um einen Energiesparmodus zu ermöglichen. Der Autor verspricht dabei 0,12 µA im Standby, welcher aber nur durch einen Reset des Mikrocontrollers beendet werden kann. Nachgemessen wurde es nicht. Der Reset Pin wird dafür über einen 22 kOhm Widerstand auf die Versorgungsspannung und gleichzeitig über einen Taster auf Masse gelegt. Nun führt ein Tastendruck zum Reset des Mikrocontrollers.

Der zweite Taster, der den Tee-Vorgang starten soll, wird an A2 und an die Versorgungsspannung gelegt. Ein zusätzlicher Widerstand zieht den Pin auf Masse, falls der Taster nicht gedrückt ist. Der Tastendruck löst einen Interrupt aus, welcher den Potentiometer abfragt, den Servo-Arm herunter fährt und die angegebene Zeit verweilt.

Wenn der Tee fertig ist soll ein Piezo ertönen. Dafür habe ich mich für die hier beschriebene Methode entschieden. Eine andere Melodie ist dabei ohne Probleme möglich und kann in einem Array angegeben werden. Ich entschied mich für eine einfache Tonfolge.

Die Bauteile werden an die folgenden Pins des ATtiny angeschlossen:

undefined

LED D0 (0)
Servo D1 (1)
Reset Reset
Start A2 (4)
Poti A3 (3)
Piezo A1 (2)

undefined

Und das Programm natürlich:

#include <SoftwareServo.h>
#include <avr/sleep.h>           
#include <avr/interrupt.h>       

#define PIN_POTI  3 //A3
#define PIN_START 4 //A2
#define PIN_SERVO 1 //D1
#define PIN_LED   0 //D0
#define PIN_SPEAKER 2 //A1

#define SERVO_MIN 45
#define SERVO_MAX 135
#define SERVO_POSITIONING_TIME 1600  //in ms

#define MAX_TEA_TIME 780000 // 780 000 = 13 min ; 600 000 ms = 10 min
#define SLEEP_AFTER 20000   //go to sleep after this time (in ms 30 000 ms = 30 s)

#define WAKE_UP_BLINK 2 //wake up or reset
#define WAKE_UP_FREQUENCY 400 //in ms

#define TEA_START_BLINK 3
#define TEA_START_FREQUENCY 300

#define END_BREWING_SHAKING 3 //number of shaking the teabag
#define END_BREWING_SHAKE_DISTANCE 10 //in degree
#define END_BREWING_SHAKE_POSITIONING_TIME 300 //in ms

#define TEA_FINISHED_BLINK 7

#define BODS 7                   //BOD Sleep bit in MCUCR
#define BODSE 2                  //BOD Sleep enable bit in MCUCR

// DEFINITION OF TONES  ==========================================
//       note, period, &  frequency. 
#define  c     3830    // 261 Hz 
#define  d     3400    // 294 Hz 
#define  e     3038    // 329 Hz 
#define  f     2864    // 349 Hz 
#define  g     2550    // 392 Hz 
#define  a     2272    // 440 Hz 
#define  b     2028    // 493 Hz 
#define  C     1912    // 523 Hz 
#define  R     0       // to represent a rest
int melody[] = {  c, R, c, R};
int beats[]  = { 32, 32, 32, 128}; // 32 => 320ms

int MAX_COUNT = sizeof(melody) / 2; // Melody length, for looping. (2 byte)
long tempo = 10000; // Set overall tempo
int pause = 2000; // // Set length of pause between notes
// Loop variable to increase Rest length
int rest_count = 100; //<-BLETCHEROUS HACK; See NOTES
// Initialize core variables
int tone_ = 0;
int beat = 0;
long duration  = 0;

//GLOBAL VARIABLES ==============================================
float tea_time, elapsed_time;
bool start, tea_brewing;
uint32_t start_time; 
uint8_t mcucr1, mcucr2, led_brightness, i;
SoftwareServo servo;

// PLAY TONE  ===================================================
void playTone() {
  long elapsed_time = 0;
  if (tone_ > 0) { // if this isn't a Rest beat, while the tone has 
    //  played less long than 'duration', pulse speaker HIGH and LOW
    while (elapsed_time < duration) {
      digitalWrite(PIN_SPEAKER,HIGH);
      delayMicroseconds(tone_ / 2);
      digitalWrite(PIN_SPEAKER, LOW);
      delayMicroseconds(tone_ / 2);
      // Keep track of how long we pulsed
      elapsed_time += (tone_);
    } 
  }
  else { // Rest beat; loop times delay
    for (int j = 0; j < rest_count; j++) { // See NOTE on rest_count
      delayMicroseconds(duration);  
    }                                
  }                                 
}

// PLAY SONG ===================================================
bool toggle = false;
void playSong() {
  for (int i=0; i<MAX_COUNT; i++) {
    tone_ = melody[i];
    beat = beats[i];
    duration = beat * tempo; // Set up timing
    // Blink LED
    digitalWrite(PIN_LED, toggle);
    toggle = !toggle;
    
    playTone(); 
    delayMicroseconds(pause);
  }
}

// GO TO DEEP SLEEP ==============================================
void goToSleep(void) {
    // GIMSK |= _BV(INT0);                    //enable INT0
    // MCUCR &= ~(_BV(ISC01) | _BV(ISC00));   //INT0 on low level
    ACSR |= _BV(ACD);                         //disable the analog comparator
    ADCSRA &= ~_BV(ADEN);                     //disable ADC
    set_sleep_mode(SLEEP_MODE_PWR_DOWN);
    sleep_enable();
    //turn off the brown-out detector.
    //must have an ATtiny45 or ATtiny85 rev C or later for software to be able to disable the BOD.
    //current while sleeping will be <0.5uA if BOD is disabled, <25uA if not.
    cli();
    mcucr1 = MCUCR | _BV(BODS) | _BV(BODSE);  //turn off the brown-out detector
    mcucr2 = mcucr1 & ~_BV(BODSE);
    MCUCR = mcucr1;
    MCUCR = mcucr2;
    sei();                         //ensure interrupts enabled so we can wake up again
    sleep_cpu();                   //go to sleep
    cli();                         //wake up here, disable interrupts
    // GIMSK = 0x00;               //disable INT0
    sleep_disable();               
    sei();                         //enable interrupts again (but INT0 is disabled from above)
}

// WRITE SERVO ANGLE  ============================================
int last_angle = 0;
void setServo(uint8_t degree, uint32_t duration) {
  int diff = degree - last_angle;
  diff = abs(diff);
  int w = (float)duration / (float)diff * 0.5 * 1000.0;
  if(last_angle < degree) {
    for (float k = last_angle; k < degree; k+=0.5) {
      servo.write(k); 
      delayMicroseconds(w);
      SoftwareServo::refresh(); 
    }
  } else if (last_angle > degree) {
    for (float k = last_angle; k > degree; k-=0.5) {
      servo.write(k);
      delayMicroseconds(w); 
      SoftwareServo::refresh(); 
    }
  }
  last_angle = degree;
}

// BLINK STATUS LED ==============================================
void blink_led(int num, uint16_t frequency) {
  for(i = 0; i<num; i++){
    digitalWrite(PIN_LED, HIGH);
    delay(frequency);
    digitalWrite(PIN_LED, LOW);
    delay(frequency);
  }
}

// SETUP =========================================================
void setup() {  
  tea_time = 0;
  start = false;
  tea_brewing = false;
  elapsed_time = 0;

  pinMode(PIN_POTI, INPUT);
  pinMode(PIN_START, INPUT);
  pinMode(PIN_SERVO, OUTPUT);
  pinMode(PIN_LED, OUTPUT);
  pinMode(PIN_SPEAKER, OUTPUT);
  
  servo.attach(PIN_SERVO);
  servo.setMaximumPulse(2100);
  servo.setMinimumPulse(550);
  servo.write(SERVO_MAX);              
  for(int i=0; i<600/20; i++) { //stellzeit
    SoftwareServo::refresh();  
    delay(20); 
  }
  last_angle = SERVO_MAX;
  
  start_time = millis();
  blink_led(WAKE_UP_BLINK, WAKE_UP_FREQUENCY);
  digitalWrite(PIN_LED, HIGH);
  //cli(); 
  //General Interrupt Mask Register, External Interrupts: 0b01000000; Pin Change Interrupts: 0b00100000
  GIMSK = 0b00100000;    // turns on pin change interrupts
  //Pin Change Mask Register 
  PCMSK = 0b00010000;    // turn on interrupts on pin PB4
  sei();                 // enables interrupts (bzw. _SEI();)
}

void loop() {
  if (tea_brewing) {
    elapsed_time = millis() - start_time;
    analogWrite(PIN_LED, 60);
    // Check if tea is finished
    if (elapsed_time > tea_time) {
      endRoutine();    
      digitalWrite(PIN_LED, LOW);  
      goToSleep(); 
    }
  } else {
    if (millis() - start_time > SLEEP_AFTER) {
      digitalWrite(PIN_LED, LOW); // TODO auskommentieren? müsste auch ohne aus gehen?! geht nicht aus!
      goToSleep(); 
    }
  }

  if (start) {
    blink_led(TEA_START_BLINK, TEA_START_FREQUENCY);
    startRoutine();
    start = false;
  }
}

//Start the tea procedure
void startRoutine() {
  tea_brewing = true; //set tea making flag
  //get current time value time in ms
  tea_time = (float)MAX_TEA_TIME - (float)MAX_TEA_TIME * analogRead(PIN_POTI) / 1023.0;
  setServo(SERVO_MIN, SERVO_POSITIONING_TIME);
  start_time = millis();  //start time measure
}

//End tea procedure
void endRoutine() {
  tea_brewing = false;
  setServo(SERVO_MAX, SERVO_POSITIONING_TIME);
  //shake arm
  for (i = 0; i < END_BREWING_SHAKING; i++) {
    setServo(SERVO_MAX, END_BREWING_SHAKE_POSITIONING_TIME);
    setServo(SERVO_MAX - END_BREWING_SHAKE_DISTANCE, END_BREWING_SHAKE_POSITIONING_TIME);
  }
  setServo(SERVO_MAX, END_BREWING_SHAKE_POSITIONING_TIME);
  for(int l = 0; l<TEA_FINISHED_BLINK; l++) {
    playSong();
  }
}

//Interrupt Service Routine
ISR(PCINT0_vect)
{
  if (digitalRead(PIN_START)) {  // is start pressed?
    start = true;
  }
}

Das Programm erfüllt seinen Zweck und ist lange nicht optimiert aber es musste schnell gehen damit das Weihnachtsgeschenk rechtzeitig fertig wird :)

Und so sieht das ganze fertig aus.. mit dem Kopf lässt sich die Minutenzahl einstellen. Dabei habe ich darauf geachtet das bei sechs Minuten die Mittelstellung erreicht ist. Das Video wurde gekürzt um die Wartezeit zu verringern.

Quellen:

Energiesparmodus: http://www.arduino-hausautomation.de/2014/emils-ampel-attiny45-im-tiefschlaf/

ATtiny programmieren: https://www.frag-duino.de/index.php/maker-faq/37-atmel-attiny-85-mit-arduino-arduinoisp-flashen-und-programmieren

Farbcodierung bei Widerständen: http://www.calculino.com/de/elektronik/ohmscher-widerstand_rechner.html

Vorwiderstand LED: http://www.elektronik-kompendium.de/sites/bau/1109111.htm

Piezo Ansteuerung: https://www.arduino.cc/en/Tutorial/PlayMelody

  • Permalink
  • Kommentare
k
Neuere Posts →← Ältere Posts