Quadrocopter auf Arduinobasis: Erfahrungsbericht

Nachdem ich den Copter jetzt einige Male geflogen bin, wird es Zeit für einen Erfahrungsbericht.

Die ersten Versuche waren ziemlich frustrierend, weil die Motoren nicht starteten. Nach der Problemlösung wurde es besser und ich flog die ersten Runden im Garten meiner Freundin. Runden ist übertrieben, aber 2-3 Meter in jede Richtung waren drin 😉 Allerdings waren die Einstellungen noch sehr aggressiv, so dass ich den Copter beim ersten Versuch gleich auf den Kopf drehte und er abstürzte. Wäre ich geduldiger gewesen und hätte etwas überlegt, wäre mir aufgefallen, dass ich mich im Acro-Modus befand, der Copter sich also nicht stabilisierte. Im Stable-Modus flog er dann wesentlich ruhiger und es machte richtig Spaß 🙂

Also wollte ich ein wenig mehr Platz haben und suchte mir ein freies Feld in der näheren Umgebung,. Da ging das Fliegen schon ein wenig besser von der Hand und machte noch mehr Spaß. In meinem Übermut drehte sich der Copter leider wieder und ich konnte ihn gerade noch auf die richtige Seite drehen, bevor er in den Boden einschlug. 15m mehr oder weniger freier Fall, eine ordentliche Staubwolke, die Ausleger etwas verdreht und ein Kabel hatte sich gelöst, sonst war alles in Ordnung. Ziemlich stabil das Ding 😉

Als das Kabel wieder festgelötet war (seitdem nehme ich für schnelle Reparaturen immer ein paar Lüsterklemmen mit ;)) suchte ich mir einige Tage später ein anderes Feld. Leider war es da ein wenig windig und als der Copter von einer Windböe getroffen wurde, wehte er schnell über die Straße und über ein anderes Feld. Ich versuchte noch ihn wieder zurückzusteuern, doch ab einer bestimmten Entfernung rächt sich die Bauart des Copters und man erkennt weder vorne, noch hinten oder oben und unten. Und so entschied ich mich, ihn abstürzen zu lassen, bevor er noch weiter weg fliegt und womöglich jemanden verletzt oder etwas beschädigt. Also hinterher und ihn suchen. Doch das gestaltete sich schwieriger als erwartet, denn er lag in einem Rübenfeld!

Fast hüfthohe Pflanzen sind einfach keine gute Voraussetzung und ich wollte dem Bauern auch nicht die ganzen Rüben zertreten. Nachdem ich von den Fahrrinnen des Treckers nichts entdeckte, vertagte ich das Suchen auf den nächsten Tag. Las ein wenig im Internet und dort sagte man, man verschätzt sich meist ziemlich, was die Entfernung angeht. Also suchte ich näher an meinem Startpunkt, ohne Erfolg. Nachweiteren Suchen, informierte ich den Bauern, was da in seinem Feld liegt, sollte aber weiter suchen. In der Zwischenzeit, änderte ich schon mal die Firmware meiner Fernbedienung (siehe letzter Artikel).

Also machte ich mich wieder an die Arbeit, jetzt etwas strukturierter. Und nach 2 Wochen (in der einen suchte ich wegen meiner Prüfungen etwas weniger) und insgesamt 14 Stunden Suche und einem ordentlichen Sonnenbrand hatte ich schon fast aufgegeben und wollte gerade aufhören, als da doch ein Propeller durch die Blätter guckte 🙂

Ich habe mal bei Google Earth grob verzeichnet, wo ich stand, wo er laut meiner Erinnerung liegen konnte (rot), wo ich suchte (blau) und wo er tatsächlich lag:

Faszinierenderweise war außer dem Akku (tiefentladen und entsorgt 🙂 ) wieder nichts kaputt. Die Platine und den Empfänger reinigte ich in Alkohol, denn es gab in der Zeit 3-4 ziemliche Unwetter und danach funktionierte wieder alles. Glück gehabt!

Die nächsten Flüge liefen ziemlich gut. Nur traf ich mich vorgestern mit Ines und Marc und wie sich das gehört, ging alles schief 😉

Erst brach ein Ausleger direkt am Motor, scheinbar Materialermüdung und kurze Zeit später stand ein Baum im Weg und beim Aufprall auf den Weg darunter, brach ein anderer Arm direkt in der Mitte. Damit hatte sich das fliegen erledigt. Also ersetzte ich die Azsleger durch Alurohre aus dem Baumarkt (war erstaunt, wie günstig das Zeug ist und wie einfach zersägt 😉 ) und flog ihn heute wieder. Nach den ganzen Abstürzen werde ich ihn „Thunderquack“ nennen 😉

Und wie versprochen habe ich auch ein kurzes Video gemacht. Nichts Überragendes, aber der Beweis, dass er fliegt 😉

Das erste Video mit meiner Kamera, die Qualität geht mit Sicherheit besser und ein paar Mal flieg ich aus dem Bild, aber ich denke man sieht, dass er geht 😉

Advertisements

Turnigy 9x: alternative Firmware

Die Turnigy 9x ist eine super Fernbedienung! Ziemlich günstig und kann einiges. Leider macht einem die Standardsoftware einen Strich durch die Rechnung. Sobald man mehr nutzen möchte als die Steuerknüppel, muss man sich mit dem schrecklichen Menü (und dem Bestätigungsbeep der Tasten 😉 ) quälen. Der Mischer, in dem man verschiedene Schalter mischen und auf einen Ausgangskanal legen können sollte, ist leider etwas fehlerhaft und extrem umständlich zu bedienen. Wie es aber bei solchen Sachen immer ist, haben sich einige Leute hingesetzt und alternative Frimware programmiert.

Ich entschied mich für das Projekt er9x. Um die Firmware flashen zu können, muss man nur einige Kabel in der Fernbedienung verlöten. An den passenden Stellen sind sogar schon Lötpads vorhanden (Achtung: es gibt verschiedene Hardwarerevisionen, bei denen ein Lötpad anders verbunden ist!). Das sieht dann so aus (leider etwas unscharf):

Der Stecker kann von innen ins Batteriefach geführt werden und bleibt dadurch immer erreichbar.

Eine gute Anleitung gibt es auf der Projektseite. Möchte man die Fernbedienung mit einem Arduino flashen, empfiehlt sich diese Seite: http://diyjunky.blogspot.de/2011/09/using-your-arduino-to-program-turnigy.html. Man verbindet also die entsprechenden Pins mit dem Arduino, spielt wieder den ArduinoISP Sketch auf (wie auch schon im letzten Artikel beschrieben), dann kann man die Software eepe starten und den Anleitungen im Netz folgen, um die Firmware zu flashen. Die Einstellungen von avrdude sind eventuell etwas umständlich, bei mir funktionierte die Einstellung „arduino“ unter Programmer nicht, sondern ich musste „avrisp“ verwenden. Mit eepe kann man auch noch die Einstellungen und Mischer am Rechner einstellen und Simulieren und dann ins EEPRom der Fernbedienung flashen 😉 Allerdings gibt es da einen Bug im Arduinosketch. Eepe gibt einen Fehler beim Lesen und Schreiben des EEPROMs aus „Bad eeprom“ oder so ähnlich. Das Problem lässt sich sehr einfach lösen. Leider finde ich die Quelle nicht mehr wieder, der Ersteller möge mir verzeihen 😉

Man ändert im ArduinoISP Sketch die Zeile


int start = here * 2;

in den Funktionen uint8_t write_eeprom(int length) und char eeprom_read_page(int length) in


// here is a word address, get the byte address
 int start = here;// * 2; -NA for m64

um. Der Grund für diesen Fehler ist die Adressierung des verwendeten Prozessors. Dieser verwendet byte und keine word-Adressen.

Damit kann man auch das EEPROM der Fernbedieung lesen und schreiben.

Sehr lohnenswerte Modifikation.

Bootloader flashen mit Arduino-ISP

Der Flightcontroller meines Quadrocopters legte manchmal ein seltsames Verhalten an den Tag. Nachdem der Akku angeschlossen wurde, startete der Arduino seinen Bootloader und wartete 8 Sekunden ob vielleicht ein USB-Kabel angeschlossen war oder ähnliches. Dadurch bekamen die Regler der Motoren kein passendes Signal und stellten sich ab. Also leuchtete beim Start des Copters nur die LED, die Flugbereitschaft signalisierte, jedoch setzten die Regler dieses Signal nicht um. Kurzfristig kann man dieses Problem umgehen, indem man die Regler nach dem Akku anschließt, was jedoch auch nur manchmal half. Ziemlich nervig.

Aber der Hersteller hat auf dieses Problem reagiert und einen neuen Bootloader programmiert, der den Resetgrund erkennt und die Bootloaderroutine umgeht wenn es sich um einen Reset durch Spannungsabfall handelt. Ich hatte vorher schon einmal einen Blick in den Code des Standardbootloaders geworfen und eigentlich sollte dieser genau das auch machen. Leider liegt der Code des Herstellers nicht vor, sodass ich nicht weiß, was er geändert hat.

Man findet den neuen Bootloader inklusive einer Anleitung unter http://forum.flyduino.net/viewtopic.php?f=8&t=39.

Bei mir sah das dann so aus:

Mit dem ArduinoISP Sketch, kann man also leicht den Bootloader eines anderen Arduino flashen. Praktischerweise kann man mit eimen Arduino und ArduinoISP nicht nur Bootloader flashen, sondern auch normale Mikrocontroller programmieren, dazu mehr im nächsten Artikel

Quadrocopter auf Arduinobasis: Baubericht

August 2, 2012 2 Kommentare

Dieser Blogeintrag ist keine Anleitung! Die Arbeit kann mitunter gefährlich sein und es sollten auf jeden Fall die dazugehörigen Dokumentationen gelesen werden!

Den Wunsch einen Quadrocopter zu bauen hatte ich schon ewig, nur gab es damals nur die Mikrokopter und die waren mir zu teuer 😉 Kurze Zeit später war das Ganze auch schon wieder in der Schublade „Wunschdenken“ verschwunden. Als sich allerdings der Vater meiner Freundin einen kleinen Hubschrauber zulegte (Blade Mcpx) war der Spieltrieb wieder geweckt. Nach einigen Recherchen fand ich den Blade Mqx, einen kleinen Quadrocopter von Blade, aber auch der war mir irgendwie zu teuer fürs Geleistete. Dann fiel mir wieder mein Arduino ein. Mikrocontroller hab ich also, was kommt als nächstes? Und siehe da, es gibt mittlerweile Quadrocopterprojekte, die Arduinos nutzen.

Aber da müssen dann Sensorboards bestückt werden und schnell steigt der Preis. Und dann stieß ich auf den Nanowii, eine kleine Flugsteuerung, kaum größer als eine 2€ Münze, auf Arduinobasis und mit Gyro und Beschleunigungssensor. Die sollte es werden 🙂

Also weiter recherchiert, gerechnet, gelesen und dann standen die Komponenten fest:

  • Nanowii
  • ein fertiger Rahmen (Selbstbau war mir da zu heikel)
  • 4 Brushless-Motoren mit 1000KV
  • 4 passende Regler mit 18-20A
  • die billigste und gleichzeitig wertigste Fernbedienung: Turnigy 9x
  • Ein paar Sätze Propeller: 9×4.7 Zoll
  • 2 2000mAh Lipos und das passende Ladegerät

Am kompliziertesten ist hierbei die Wahl der Motoren, Propeller und Regler, denn alles muss aufeinander abgestimmt sein und genug Schub liefern, das Ganze in die Luft zu heben. Damit standen also die Komponenten fest und die Bestellung wurden in Hongkong getätigt. Kurze Zeit später war alles bei mir zu Hause und der Bau konnte beginnen 😉

Der Rahmen kam ohne Anleitung, war aber (abgesehen von „nach fest kommt ab“) schnell zusammengebaut.

Also schnell die Verbinder an dem Controller verlötet, alles verbunden und bereit zum Testen.

Die Propeller erst am Schluss anbringen, um Verletzungen zu vermeiden!!!

Die Regler kalibrieren, damit sie den niedrigsten und höchsten Wert der Fernsteuerung lernen. Den passenden Code (http://www.multiwii.com/) auf den Arduino laden. Hierbei müssen einige Anpassungen vorgenommen werden, diese sind aber auf der Projektseite und in den Foren gut dokumentiert.

Danach die Konfigurationssoftware starten und sie startet nicht…

Unter Windows liefen sowohl die 32, als auch die 64bit Version nicht. Unter Ubuntu lässt sich die Software aber über die Processing Software kompilieren und starten. Jetzt sollte nur noch der Anschlussport ausgewählt werden. Doch die Liste mit Ports war leer. Hier hilft ein


ln -s /dev/ttyACM0 /dev/ttySA

und der Port /dev/ttySA taucht in der Konfiguration auf. Verbinden und schon kann man Einstellungen tätigen und Funktionen wie die Ausschläge der Fernbedienung und die Funktion der Sensoren überprüfen. Rechts unten sieht man ein virtuelles Modell des Copters.

Auch das klappte nicht auf Anhieb, denn das Board bekam keinen Strom. Wieder mein Fehler, ich verband alle Steuereingänge der Regler mit dem Board. Auf diesen Steckern liegen neben dem Steuersignal auch eine stabilisierte Spannung, die zur Stromversorgung des Boards dienen soll. Liest man aber die Anleitung nicht richtig (wichtig!!) und verbindet alle diese Spannungsversorgungen mit dem Board und hat in Physik/Elektrotechnik aufgepasst ( 😉 ) stellt man fest, dass nicht 5 V am Board anliegen, sondern nur die Differenzspannungen der Regler und das sind, je nach Regler und Genauigkeit, ca. 0,02 V. Damit kann das Board natürlich nicht starten, also drehte ich die Stecker, so dass bei 3 der 4 Anschlüsse nur die Signalleitungen verbunden sind und bei einem das Signal und die Spannungsversorgung.

Danach funktionierte alles wie gewünscht.

Also warf ich die Motoren an, doch sie funktionierten nur teilweise. Das lag an der gewählten Steckverbindung. Merke: Stecker sind doof, löten ist gut 😉

Also hab ich die Kabel verlötet und nun liefen auch die Motoren. Die Drehrichtung muss überprüft werden und kann geändert werden, indem man 2 der 3 Kabel vertauscht.

Funktioniert auch das, können die Propeller aufgesetzt werden.

Jetzt warte ich auf die Akkus der Fernbedienung und einem Testflug kann nichts im Wege stehen. Naja, fast nichts, denn im Norden von Braunschweig darf wegen des Flughafens nicht geflogen werden. Der Luftraum ist in mehrere Zonen aufgeteilt, die in unterschiedlichen Höhen beginnen, man darf nur in der untersten fliegen, jedoch befindet sich um Flughäfen eine Zone, die bis auf den Boden reicht und in der (Modell-)flugverbot herrscht. Auch hier verweise ich auf die zuständigen Stellen und Karten, die darüber Auskunft geben. Ich werde mich jetzt mal auf den Weg machen und das Teil testen, ein Flugvideo folgt dann, sobald ich ordentlich fliegen kann 😉

Sehr empfehlen möchte ich auch noch die Videos von DianonForce auf Youtube: http://www.youtube.com/user/DianonForce/videos. Da findet man eigentlich den kompletten Aufbau eines Multiwiisystems in Videos.

γ1 Full++ & γ2: Baubericht

Irgendwie juckte es mich mal wieder in den Fingern, lange hatte ich schon kein diy-Projekt mehr durchgeführt. Nachdem ich Ende Januar endlich mit meiner Bachelorarbeit fertig war, konnte ich mich endlich wieder einem solchen  Projekt widmen.

Vor einiger Zeit reparierte ich den alten Tandberg Verstärker meines Vaters, spendierte ihm ordentliche Lautsprecher (Fostex FE103En) und höre wirklich gern Musik mit dieser Kombination. Allerdings zum Großteil über meinen HTPC mit Onboard-Soundkarte. Was nützen mir ein guter Verstärker und Boxen, wenn die Quelle kein gutes Signal liefert?

Also musste eine neue Soundkarte her. Nach einigem Lesen stieß ich auf USB-DACs (Digital-Analog-Konverter), die Preise haben mich dann aber doch abgeschreckt. Durch das hifi-forum entdeckte ich ein interessantes Projekt von amb, den amb γ1, einen DAC mit mehreren Konfigurationsmöglichkeiten, denn eigentlich brauchte ich nur den USB Eingang und einen analogen Ausgang, ob Cinch oder Klinke war dabei egal. Allerdings bietet amb auch noch den γ2 an, die Highend-Variante.

Also war die Entscheidung gefallen, der γ2 benötigt den γ1 und nutzt so dessen USB Eingang und einige andere Komponenten. Der Plan war also eine kleine γ1 Variante (USB-to-S/PDIF) und den γ2 zu bauen.

Die Stücklisten liefern Bestellnummern von diversen Händlern in den USA und die Versandkosten waren ziemlich hoch, kommt man jedoch über einen Mindestbestellwert, entfallen die Versandkosten.

Und so ergab es sich, dass ich den γ1 in der Vollausstattung (Full++) bestellte. Die Platinen und einige Bauteile kamen von amb und der Rest von Mouser und Farnell.

Letzte Woche begann dann also der Bau. Erfahrung mit dem Löten von SMD-Bauteilen hatte ich keine, aber das klappte erstaunlich gut (dachte ich zumindest, doch dazu später mehr).

Erst ein paar Fotos:

γ1 SMD-ICs:

γ1 Widerstände:

γ1 Kondensatoren:

γ1 fast fertig:

Und komplett:

Und alles noch für den γ2:

Beide Platinen zusammen:

Alles in allem ging der Bau zügig voran und ich konnte mich an das Testen der Schaltung machen. USB-Kabel eingesteckt und die Spannung an den Testpunkten gemessen. 6V aus dem USB-Port machten mich schon stutzig und das der 3,3V Spannungsregler (mit 1% Toleranz) 3,9V ausgab war schon auffällig. Ich dachte mir nichts dabei und steckte die Platinen zusammen – in der Full++ Variante werden der USB- und der DAC-Teil der Platine mit 5 Kabeln verbunden, wird der γ2 installiert, übernimmt dieser die Verbindung.

Und dann gingen die Probleme los:

  • der PC erkennt den DAC nicht
  • 3,3V Testpunkt des γ2 zeigt 4,7V, der 4,5V Testpunkt knapp 5V

Also entfernte ich die Platinen wieder voneinander, suchte auf dem γ1 nach Lötbrücken, fand auch einige, besonders an diesen winzigen Spannungsreglern:

Nachdem die Lötbrücken entfernt waren, passten die Spannungen aber immer noch nicht. So verging ein Tag, an dem ich die komplette Schaltung des γ1 mit dem Multimeter durchtestete, bis ich anfing den Fehler beim Multimeter zu suchen.

Also ab mit den Messspitzen in die Steckdose und schon war das Problem gefunden. 270V kommen hier aus keiner Steckdose…

Nach gewechselten Batterien passte es plötzlich und auch die Spannungen auf der Platine waren in Ordnung. Also unternahm ich den nächsten Versuch die Platinen zu verbinden.

Den Frontausgang an den Verstärker angeschlossen und es kam tatsächlich Musik 🙂 Irgendwann fiel mir ein, dass der Frontausgang der Ausgang des γ1 war, der γ2 also nur die Verbindung zwischen den beiden Platinenteilen herstellte, aber ich wollte eigentlich den Sound des γ2. Also fix die Cinch Ausgänge an der Rückseite an den Verstärker angeschlossen und es kam kein Ton 😦

Es war also wieder an der Zeit, die Schaltungen noch einmal zu kontrollieren und der 3,3V Testpunkt zeigte plötzlich 4,7V, ich konnte jedoch keine Lötbrücken mehr finden. Nach einer langen Lektüre des amb-Forums fand ich den Tipp, die Platinen noch einmal ordentlich vom Flussmittel zu reinigen, da dieses manchmal zu Kurzschlüssen führen kann.

Und damit war dann auch dieses Problem gelöst und das Gerät funktionierte ohne Probleme 😉

Also verstaute ich die Platinen in ihrem Gehäuse:

und montierte die Abdeckungen an Front- und Rückseite:

Und zum Schluss noch ein Bild, damit sichtbar wird, wie winzig das Teil eigentlich ist:

So nervenaufreibend der Bau auch war, er hat sich gelohnt. Der Klang wirkt deutlich differenzierter und nicht so „matschig“ wie aus der Soundkarte. Einge Messungen sind auf der Homepage von amb zu finden: γ2 Homepage unter Specifications.

Weitere ordentlich Bilder (ohne Staub ;)) werden wahrscheinlich in den nächsten Tagen bei /photos zu sehen sein.

Und jetzt entschuldigt mich, ich muss Musik hören 😉

Kategorien:Hardware, γ1 Full++ & γ2 Schlagwörter: , , , , , , ,

Highspeedfotografie (Wassertropfen)

Dezember 10, 2010 2 Kommentare

So, hier folgt nun endlich das versprochene „Making of“ der Wassertropfenbilder (Tropfendes, Tropfendes II und Tropfendes III).

Eigentlich ist es wirklich total einfach 😉

Man nehme folgendes:

1. eine Mariottesche Flasche

2. ein Infusionsset aus der Apotheke

3. ein Blitzgerät

4. ein längliches Gefäß

5. eine provisorisch zusammengebaute Lichtschranke

6. einen Arduino

7.  einen riesigen Haufen Küchenpapier 😉

Verdrahtet man den Arduino nach dem Plan:

Die Widerstände müssen natürlich an die Led und die Diode angepasst werden.

Den Arduino verbindet man dann mit einem PC und erstellt folgenden Code:

#define flash 8
#define led 13
#define sensor 0

void setup() {
 pinMode(led, OUTPUT);
 pinMode(flash, OUTPUT);
 pinMode(sensor, INPUT);
 digitalWrite(flash, LOW);
 digitalWrite(led, LOW);
 Serial.begin(9600);
}

void loop() {
 int sensorValue = analogRead(sensor);
 //Serial.println(sensorValue, DEC); //Ausgabe der Sensorwerte auf der Konsole
 if (sensorValue < 100) //wenn ein Tropfen erkannt wird
 {
 delay(168); //Zeit zwischen dem Auslösen der Lichtschranke und
 digitalWrite(flash, HIGH); //dem Zünden des Blitzes
 digitalWrite(led, HIGH); //Auslösen anzeigen
 delay(20);
 digitalWrite(flash, LOW); //der folgende Teil ist nicht notwendig, kurz warten, die Led blinkt und zeigt damit an, dass die Lichtschranke wieder verfügbar ist
 delay(4000);
 digitalWrite(led, LOW);
 delay(500);
 digitalWrite(led, HIGH);
 delay(500);
 digitalWrite(led, LOW);
 delay(500);
 }
}

Diesen lädt man auf den Arduino und los gehts!

Je nachdem, wie man die Zeit (Zeile 19) zwischen Auslösen der Lichtschranke und dem Zünden des Blitzes einstellt, entstehen unterschiedliche Formen.

Stellt man die Zeit so ein, dass eine Säule entsteht, so kann man Schirme erzeugen, indem man das Infosionsset so einstellt, dass fast ein Strahl entsteht, aber eben noch die einzelnen Tropfen zu sehen sind.

Der Raum wird abgedunkelt und die Kamera ausgelöst (Belichtungszeit ~5 Sekunden).

Die Tropfen fängt man mit einem Becher oder ähnlichem auf, damit die Wasseroberfläche im Becken schön ruhig ist.  Lässt man nun einige Tropfen hinunter fallen, werden diese von der Lichtschranke erkannt und der Blitz wird ausgelöst. Mit den richtigen Einstellungen, einer Menge Geduld und ein wenig Glück entstehen dabei die schönsten Bilder 😉

Falls noch Fragen sind, oder sonstige Anmerkungen, schreibt einfach ein Kommentar 😉

Dual 1225: Reparatur

September 24, 2010 2 Kommentare

Die wohl einfachste Reparatur eines HiFi-Gerätes:

Bei Dual Plattenspielern kommt es des öfteren vor, dass die Automatik nicht mehr funktioniert. Der Tonarm bewegt sich nur noch hoch und runter, nicht mehr nach links und rechts.

Dafür verantwortlich ist die Abnutzung des sogennanten Steuerpimpel (das Teil heißt wirklich so ;)). Dieser besteht aus Gummi und nutzt sich im Laufe der Jahre ab. In meinem Fall fehlte er einfach.

An seiner Stelle habe ich einfach ein Stück Isolierung eines 2.5 mm² Lautsprecherkabels verwendet:

Leider hab ich vergessen vorher ein Foto zu machen, aber hier sieht man einen 2. Metallstift, der genauso aussieht (dieser benötigt keine Veränderung!)

Fazit: schnell und einfach durchgeführt, läuft wieder zuverlässig. Weitere Fotos werden unter /photos zu finden sein.

Kategorien:Dual 1225, Hardware Schlagwörter: , , , , , ,