Jump to content
elektro-skateboard.de

Controllereigenbau + Bluetooth + Arduino


barney

Empfohlene Beiträge

Geschrieben

Erste Gedanken:

 

Ich habe gestern einen Nunchuk Controller zerlegt. Der Arduino Mini und ein BT-Modul passen hinein.

 

Folgende Funktionen stelle ich mir vor:

 

Von den 12 digitalen I/O:

1. zwei Taster -2

2. eine Zweifarben LED für den Status -2

3. Piezo Summer -1

Rest 7

 

vier analoge I/O:

1. Joystick -2

2. Spannung des Akkus -1

Rest 1

 

Datenausgabe:

Es sollen mindestens 10 Abtastungen die Sekunde übertragen werden. Um die Entwicklung zu vereinfachen, wird eine schlichte Textausgabe durchgeführt. Dann kann wie bei der Telemetrie mit den Handy die Verbindung überprüft werden.

 

Ausgabe:

#Index (16Bit);Bit digital I/O 1;Bit digital I/O 2;Bit digital I/O n....;Wert analog 1(10Bit);Wert analog 2;Wert analog 3;Wert analog 4;<CR>

2010;1;0;0;0;0;0;0;0;0;0;0;0;512;512;850;0;<CR> -> Heißt Taste 1 gedrückt, Joystick X/Y Mittelstellung (512), Akku fast voll (850)

Der fortlaufende Index soll einen Funkabriss aufzeigen.

 

Rücksendekanal:

Die Zweifarben LED und der Piezo

1;1;0 -> In der LED beide Chips an (1;1), Piezo aus (0)

 

 

Software:

Init Routine für BT-Modul:

1. Namensvergabe: Nunchuck

2. Baud Rate festlegen

3. Pairing mit Arduino Controller BT-Modul durchführen.

 

Rest folgt

 

Bevor ich loslege, hat jemand noch eine Idee, die ich mit einbauen sollte? Vibrationsmotor?

 

 

VG

 

Barney

 

Hallo das o.g. hatte ich ja schon mal geschrieben. Ich möchte ein neues Projekt eröffnen, mit einen völlig eigen designten "Controller". Wer hat Lust einen Controller-Gehäuse zu entwerfen, welches per 3D-Druck hergestellt wird? Es sollte an Nunchuk angelehnt sein und mit Sicherheitsausrüstung zu nutzen sein!

 

Bauteile sind:

1.

Externe Links nur für Mitglieder sichtbar

2. Joystick Soft-Touch-Knopf Schwarz

3. Arduino mini, 3.3V 8MHz

4. BT-Modul HC-05

5. Lithium Akku: Renata Lithium-Polymer Akku ICP402050PR 3.7 V 420 mAh ICP052153 (L x B x H) 52,5 x 20,7 x 4,5 mm, oder kleiner

6. zwei Taster:

7. Due/Triple-Color LED

8. Schalter On/Off

9. Buzzer (optional)

10. Vibrations-Motor (optional)

11. USB-Ladebuchse

12. 3D Print Gehäuse

 

VG

 

Barney

  • 4 months later...
Geschrieben

neue Gedanken beim Löten:

 

Ausgabe:

#ID; Index (32Bit);1 Bit digital I/O; 2 Bit digital I/O; 3 Bit digital I/O n...7;1 Wert analog (10Bit); 2 Wert analog; 3 Wert analog; 4 Wert analog;<CR>

#ID;23948;1;0;0;0;0;0;0;512;512;850;0;<CR> -> Heißt Taste 1 gedrückt, Joystick X/Y Mittelstellung (512), Akku fast voll (850), Analog 4 nicht angeschlossen

Der fortlaufende Index soll einen Funkabriss aufzeigen.

 

Rücksendekanal:

Die Zweifarben LED und der Piezo

Index;1 Wert (Byte);2 Wert (Byte)

23948;0;0;0;0;0;0;0;1;5;0;0;4;<CR> -> In der Duo-LED LED1 an und LED2 blinken 500ms (1;5), Piezo an (4) für 2000ms

 

Zustände für die Ausgangspins:

0 -> Aus

1 -> An

2 -> 500ms An

3 -> 1000ms An

4 -> 2000ms An

5 -> 500ms An/Aus wiederholend (z.B. blinken, Piezo piepst schnell)

6 -> 1000ms An/Aus wiederholend (z.B. blinken, Piezo piepst normal)

7 -> 2000ms An/Aus wiederholend (z.B. blinken, Piezo piepst langsam)

 

Das Display ist definitiv raus, da die Ausgänge für ein Display leider auf den ADC-Anschlüssen liegen. LEDs und Vibrationsmotor sollten für ein Feedback ausreichen. Telemetrie Daten werden an das Handy wie gehabt gesendet.

 

Momentan löte ich an einem Prototyp mit:

2 analog Achsen (Joystick)

1 Taster im Joystick

2 Taster

2 Duo-LED, davon eine für das BT-Modul

1 BT-Modul HC-05

1 Piezo Buzzer

1 Arduino Uno 5V 16 MHz -> später 3.3V 8 Mhz Arduino mini ver. 5

Geschrieben

Beim Programmieren kommen weitere Ideen auf:

Es wird der derzeitige Status des Ausgangs zurückgesendet. Jeder Ausgang kann alleine Parametriert werden, damit muss keine Wissen über die anderen Ausgänge vorhanden sein.

-----------------------------------------------------------------------------

Ausgabe:

Index (32Bit);1 Wert analog X-Achse (10Bit); 2 Wert analog Y-Achse; 3 Wert analog Z-Achse; 4 Wert analog UBatterie;

1 Bit digital I/O; 2 Bit digital I/O; 3 Bit digital I/O; Kommando Status Output01;

Kommando Status Output02; Kommando Status Output03;<CR>

23948;521;521;512;850;0;1;0;1;3;2;<CR>

-> Heißt Taste 1 gedrückt, Joystick X/Y/Z Mittelstellung (512), Akku fast voll (850);

Der fortlaufende Index soll einen Funkabriss aufzeigen.

 

Rücksendekanal:

Output01 bis Output03

1 Output Channel(Byte) Command(Byte) Value(Byte)

1 3 10<CR> -> Ausgang 1, blinken, Intervall 1000ms auf Wunsch auch in Komma Trennung

 

Command fuer die Ausgangspins:

0 -> Aus

1 -> An

2 -> Flash (fuer die Zeitdauer Value)

3 -> Blink (fuer das Interval Value) (z.B. blinken, Piezo piepst langsam)

4-255 -> aus

 

Value (Byte) 10ms Wertigkeit

-----------------------------------------------------------------------------

 

D.h. die Ausgänge sind jetzt universeller. Es geht nicht nur an und aus, sondern auch Impuls und Intervall. Die Zeiten für den Impuls können von 10ms bis ca 2,56 Sekunden im 10ms Raster eingestellt werden. Besonders mit dem Buzzer kann man Effekte wie bei einer Einparkhilfe erreichen.

 

* Es wurden drei analoge Achsen X/Y/Z und Ubatt umgesetzt

* Drei Taster, davon ein Taster im Joystick

* Drei Ausgänge, zwei für LEDs und einen Piezo Buzzer

 

Jetzt fehlt nur noch die Implementierung im Long-Board :) Dazu muss das Empfänger HC-05 BT-Modul auf Master umgestellt werden. Mal sehen, wie das Ganze klappt und ob der Funkabriss (Fehlender fortlaufender Index) ein ausreichender Indikator ist.

 

Jetzt nur noch ein eigenes Controller Gehäuse......

 

Reichweite ca. 5 Meter bis zum Handy als derzeitigen Empfänger!

 

Barney

Geschrieben

Moin,

Mit dem •••• BT-Modul habe ich ca 20 Meter Reichweite.?

Was denkst du was der Controller am Ende kosten wird? Mal ganz abgesehen von dem unermesslichen Entwicklungsaufwand :D.

Geschrieben

Was hälst du von einem unkonventionellen Controllerdesign, wie z.B ein Handschutz (Druckbar)mit integriertem Controller o.Ä. Eine kleine 1W Led wäre für Nächtliche ausfahrten auch ganz praktisch wenn man den Sonnenuntergang und die Ankunftszeit mal wieder unterschätz :D und einem dann noch ein gemeiner unsichtbarer Kabelbruch zwischen Arduino und Nunchuck quält .

 

 

gruß sonni

Geschrieben
Moin,

Mit dem •••• BT-Modul habe ich ca 20 Meter Reichweite.?

Was denkst du was der Controller am Ende kosten wird? Mal ganz abgesehen von dem unermesslichen Entwicklungsaufwand :D.

 

Hi Sonni,

 

die Reichweite habe ich in der Wohnung erreicht. Da bin ich mittlerweile auf ca. 8 Meter gekommen. Ich will das Board steuern, wenn ich drauf stehe :D

 

Kosten:

 

*Sender:

- BT-Modul HC-05 5-10 €

- Arduino Mini 10-15 €

- Taster 2x 4 €

- LEDs 1 €

- Piezo 2 €

- Joystick 2 €

- Kappe für Joystick 1 €

- Akku LiIon 10-20 €

 

Gehäuse ?

 

Also zwischen 40-50 € für den Sender

Für den Empfänger ein weiteres BT-Modul HC-05

 

VG

 

Barney

Geschrieben
Was hälst du von einem unkonventionellen Controllerdesign, wie z.B ein Handschutz (Druckbar)mit integriertem Controller o.Ä. Eine kleine 1W Led wäre für Nächtliche ausfahrten auch ganz praktisch wenn man den Sonnenuntergang und die Ankunftszeit mal wieder unterschätz :D und einem dann noch ein gemeiner unsichtbarer Kabelbruch zwischen Arduino und Nunchuck quält .

 

 

gruß sonni

 

Unkonventionell finde ich gut. Da lasse ich dir volle Kreativität. Ich hätte ein schlichtes Rohr verwendet. Ich lass mich überraschen....

Geschrieben

Parser ist jetzt auch Fertig zum Testen. Jetzt noch die Routine schreiben, die den Funkabriss erkennt....

 

Serial2.find("/n"); Dass war die schlimmste Stelle im Parser... Hat Stunden gedauert bis ich dahinter kam.

 while (Serial2.available() > 0) { // Ist was im Empfangsbuffer?
   Serial2.find("<FB>;");          // Ist es denn die Ferbedienung?
   Index    = Serial2.parseInt();  // Index finden
   X_Achse  = Serial2.parseInt();
   Y_Achse  = Serial2.parseInt();
   Z_Achse  = Serial2.parseInt();
   Ubatt    = Serial2.parseInt();
   Taster01 = Serial2.parseInt();
   Taster02 = Serial2.parseInt();
   Taster03 = Serial2.parseInt();
   Output01 = Serial2.parseInt();
   Output02 = Serial2.parseInt();
   Output03 = Serial2.parseInt();
   Serial2.find("/n");              // Ende der Uebertragung finden


Dann den Kram ins Board basteln und in die Sonne fahren und freuen...

Geschrieben

Externe Links nur für Mitglieder sichtbar

ca. 3 € mit MOSFET.

 

Dann bin ich preislich komplett. Bis auf....

 

Ich kann nicht anders. Mich drängt es danach.....

 

SainSmart 1.8" Serial 128X160 SPI TFT LCD Modul Display + SD Socket For Arduino

ca. 13 €.

 

Und die Pins hätte ich auch noch frei!

 

 

VG

 

Barney

Geschrieben

Über den TFT kann ja dann auch die Telemetrie ausgegeben werden... pw- geschützter Startcode....... snake game falls der eboardakku alle ist.... Möglichkeiten über Möglichkeiten ....

Gruß sonni

Geschrieben
Über den TFT kann ja dann auch die Telemetrie ausgegeben werden... pw- geschützter Startcode....... snake game falls der eboardakku alle ist.... Möglichkeiten über Möglichkeiten ....

Gruß sonni

 

Wie wäre es mit einem leistungsstarken

Elektronen Rekombinations Quanten Emitter?

 

Du machst mir Angst.

 

VG

 

Barney

  • 2 weeks later...
Geschrieben

Schönes Ding!

Hast Du über Hardware SPI oder in Software (bit-banging^^) angesteuert?

Ich hatte mal ein Siemens S65 Handydisplay per Software SPI an nem Atmega32 mit 16 MHz. Das taugte nur zum Schreiben von kleinen Bereichen, sonst gab es sichtbaren Bildaufbau. War eher nichts für Echtzeit-Messwerte ;)

 

Aber mit Hardware SPI und den recht kurzen Textzeilen sollte da schon was gehen.

PS: Snake-Code hab ich hier für VB-net, stammt von nem verregneten Wochenende. Das könnten wir portieren :D

Geschrieben

Hi Beatbuzzer,

 

Hardware SPI! Ich überlege noch, ob ich die SD-Karte auch anschließe. Für ein Log der Daten auch nicht schlecht und es würde die Verbindung zum Handy entfallen. Leider fehlt eine zuverlässige Echtzeituhr, wie ich sie im Handy hätte!

 

Ich habe mich in die Library für das Display eingelesen. Im Endeffekt sind alle Funktionen, Kreis-, Box, Text-zeichnen nur eine "einer" Pixel Operation. Die Geschwindigkeit ist aber ordentlich, so dass ich hoffen kann, alles in Echtzeit hin zubekommen. Da müssen noch einige Tests gemacht werden.

 

"Snake-Code hab ich hier für VB-net" Sagt mir erst mal nichts, kannst Du mir das näher erklären?

 

Layout -> Bis zum WE schaffe ich ein Demo-Layout zu erstellen, damit man einen Überblick bekommen kann, was alles angezeigt wird und wie.

 

VG

 

Barney

Geschrieben

Interessant:

 

Der Displaycontroller ist doof wie Stroh. Keine primitiven Funktionen ersichtlich, so das die Libs, die ich gefunden habe alle auf Pixel-Operationen basieren. Hatte ich anders erwartet.

Dies gibt aber auch ein die Möglichkeit sich frei auf dem Display zu bewegen. Der Text kann z.B. Pixelgenau verschoben werden. Batterien anzeigen können frei platziert werden.

 

Um nicht über das Ziel hinaus zu schießen, werde ich den Text wie schon zu sehen war einbringen und ggf. eine Grafik mit den Strom und Spannungsverlauf, sowie eine Batterienanzeige für die Fernbedienung.

 

Wenn kritische Werte erreicht werden, sollen sich die Zahlen von grün nach gelb nach rot einfärben. Der Piezobuzzer soll ja auch eine Aufgabe haben :D

 

Barney

Geschrieben

"Snake-Code hab ich hier für VB-net" Sagt mir erst mal nichts, kannst Du mir das näher erklären?

Das war eher als Spass auf die Ideen von Sonni gemeint ;)

Fiel mir da grad wieder ein, dass ich mal in Visual basic für PC nen Snake programmiert hatte.

 

Im Endeffekt sind alle Funktionen, Kreis-, Box, Text-zeichnen nur eine "einer" Pixel Operation.

Meist gibts aber auch noch so ein "box-fill" Command. Wo man vorher mit zwei Koordinaten ein Rechteck angibt, welches dann einfach der Reihe nach mit Pixeln vollgeschoben wird. Macht aber bei Kreis und Linie nicht soviel Sinn. Bei Text evtl. schon eher, wenn man die Buchstaben immer als 5x7 Block hinterlegt. Dann könnte man eine Subroutine bauen, wo man nur noch ne Startkoordinate und zwei Farben (Font- und Back-Color) übergibt.

Geschrieben
Das war eher als Spass auf die Ideen von Sonni gemeint ;)

Fiel mir da grad wieder ein, dass ich mal in Visual basic für PC nen Snake programmiert hatte.

 

 

Meist gibts aber auch noch so ein "box-fill" Command. Wo man vorher mit zwei Koordinaten ein Rechteck angibt, welches dann einfach der Reihe nach mit Pixeln vollgeschoben wird. Macht aber bei Kreis und Linie nicht soviel Sinn. Bei Text evtl. schon eher, wenn man die Buchstaben immer als 5x7 Block hinterlegt. Dann könnte man eine Subroutine bauen, wo man nur noch ne Startkoordinate und zwei Farben (Font- und Back-Color) übergibt.

 

Snake -> ahhrg, man stand ich auf dem Schlauch :o

 

Primitives -> jup alles vorhanden, aber über den Microcontroller! Alles Pixel für Pixel vom Arduino aus. Ich will ja auch nicht Windows 8.1 emulieren.

Geschrieben (bearbeitet)

Layout steht.

Alle Daten sind Fake. Die Werteanzeigen müssen auf Parameter Übergabe umgestellt werden. Die Graphen werden auf Ganzzahl und Wertebereich 0 bis 10000 nomiert. Dann noch das hier in die FB Routine einbauen.

 

Edit:

 

Ub -> Akkuspannung Board

I -> Strom am Akku Board

Pm -> Leistung am Motor (Akku)

Pa -> Akkurestleistung

Ta -> Temperatur Akku

Tm -> Temperatur Antrieb (Motor)

Ufb -> Spannung Fernbedienung

 

Die Balken am Text verändern die Farbe in Abhängigkeit der Alarmgrenzen. D.h.

Grün -> O.K.

Geld -> geht noch

Rot -> schlecht

Blau -> keine Einteilung

 

Graph:

Rot -> Strom am Akku Board

Blau -> Spannung am Akku Board

 

Alle Werte werden im Sekundentakt erneuert.

uploadfromtaptalk1389699609890.jpg.8202c87d316b82244cffc7a2531d6516.jpg

bearbeitet von barney
Geschrieben

Codeoptimierung:

 

Dieses schlecht lesbare Konstrukt

// Ausgabe von Ub
itoa (ValueArray[0][0], Ub, 10);  // Messwert von Integer nach Char, geht auch für negative Int
sprintf(Ubalign, "%5s", Ub);          // Den Char Wert nach Rechts ausrichten
// Da die Ausgaberoutine nicht die Funktionen von Print beherrscht, hier der schreckliche Umweg
sprintf(Ubausgabe, "Ub %c%c%c%c,%c",  Ubalign[0], Ubalign[1], Ubalign[2], Ubalign[3], Ubalign[4]); // Ein Komma einfügen
testdrawtext(Ubausgabe, Colors[(ValueArray[0][3])][0], 0, 16, 1);

nach drei Stunden durch

dtostrf(ValueArray[0][0]/(float)10, 7, 1, Ubausgabe);              // Wert/10, Rechts ausrichten, 1 Nachkommastelle
testdrawtext("Ub"     , Colors[(ValueArray[0][3])][0],  0, 16, 1); // Text ausgeben
testdrawtext(Ubausgabe, Colors[(ValueArray[0][3])][0], 12, 16, 1); // Wert ausgeben

ersetzt und schon 3 KByte Programmspeicher eingespart und die Abarbeitung dramatisch beschleunigt.

Und der Code sieht schon viel lesbarer aus....

 

Display ist fertig und wird demnächst mit den Fernbedienungscode zusammengeworfen. Dann noch den Parser erweitern, dann können die Messwerte an die Fernbedienung gesendet werden.

 

Mal sehen, ob der Mikrocontroller dafür schnell genug ist.

Tritt dem Gespräch bei

Du kannst jetzt posten und dich später registrieren. Wenn du bereits einen Account hast kannst du dich hier anmelden.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung jetzt entfernen

  Only 75 emoji are allowed.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Clear editor

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

×
×
  • Neu erstellen...