Bluetooth-Auto

January 29th, 2013 android, electronics

Bastelprojekte, bei denen man keine Teile bestellen muss, weil man alles schon zu hause herumliegen hat, mag ich besonders. Das Bluetooth-Auto in den letzten 3 Tagen war so ein Projekt. Ein Freund gab mit ein “MGA CLUTCH AXI TRESPASS Land & Sea Fluid 4WD RC” Spielzeug-Auto für das er keine Fernsteuerung und auch keine funktionierenden Akkus mehr besa??. Zunächst habe ich überlegt, ob man normale RC-Empfänger und Motorregler einbauen kann, aber ich hatte nur einen Regler für Bürstenmotoren – ohne Rückwärtsgang.
Das Auto zu öffnen war nicht einfach: Viele schwer erreichbare Schrauben, viel Fett und Dichtungsgummis, denn das Auto konnte auch auf Wasser fahren.
Auf der Platine fand ich 6 Relais: 2 x Motor links , 2 x Motor rechts, 2 x Motor Lenkung – dachte ich – aber die Lenkung hatte eine Eigene Transistor-H-Brücke. Also 3 Relais pro Motor für Umpolung und 2 Geschwindigkeitsstufen.

Hardware-Hack

Die Relais hatten SMD Treiber Transistoren mit Testpunkten am Eingang – Dort hätte ich die Ausgänge meines Atmega8 mit positiver Logik anschlie??en können. aber ich hatte aus dem RGB-Heli-Projekt noch die Platine mit Spannungsregler, ULN2803 und Anschlüssen für Seriell und ISP. Also bin ich mit den Ausgängen des ULN direkt an die Relais gegangen. An TX & RX habe ich ein $10 Bluetooth RF Transceiver Module angeschlossen, wie es sich schon beim Multiwii quadcopter bewährt hat.

Software-Hack, Arduino


int inByte = 0;         // incoming serial byte
const int red1 = 6;
const int green1 = 3;
const int blue1 = 5;
const  int red2 = 9;
const  int green2 = 11;
const  int blue2 = 10;

byte state = 0;
unsigned long currentMillis ;
unsigned long commandMillis;
long interval = 1000;           
const byte o_stop =   0;

void alloff() {
  digitalWrite(blue1, LOW);
  digitalWrite(blue2, LOW);
  digitalWrite(red1, LOW);
  digitalWrite(red2, LOW);
  digitalWrite(green1, LOW);
  digitalWrite(green2, LOW);
  delay(200);
}

void allon() {
  digitalWrite(blue1, HIGH);
  digitalWrite(blue2,HIGH );
  digitalWrite(red1, HIGH);
  digitalWrite(red2, HIGH);
  digitalWrite(green1, HIGH);
  digitalWrite(green2,HIGH );
  delay(200);
  
}

void setup() {
  
  pinMode(red1, OUTPUT);
  pinMode(green1, OUTPUT);
  pinMode(blue1, OUTPUT);
  pinMode(red2, OUTPUT);
  pinMode(green2, OUTPUT);
  pinMode(blue2, OUTPUT);
  currentMillis = millis();
  commandMillis = currentMillis;
  Serial.begin(115200);
  
  allon();
  alloff();
  allon();
  alloff();
}

void loop() {
  if (Serial.available() > 0) {
    inByte = Serial.read();
    Serial.write(inByte);
    state = inByte;
    Serial.write(state);
    digitalWrite(green2, (state & B00100000)   );
    digitalWrite(blue2,  (state & B00010000)   );
    digitalWrite(red2,   (state & B00001000)   );
    digitalWrite(green1, (state & B00000100)   );
    digitalWrite(blue1,  (state & B00000010)   );
    digitalWrite(red1,   (state & B00000001)   );
    commandMillis = millis();
  }
  currentMillis = millis();
  if(currentMillis - commandMillis > interval) {
     alloff();
     state = o_stop;
  }
}

Software-Hack, android

Von der Android-App, die ich mit SL4A in python geschrieben habe, gibt es 3 Varianten:
1.Variante
In einem Dialog mit den Buttons “+” “-” und “send” kann man ASCI Zeichen ab “0” durchblättern und zum Auto senden. Dabei habe ich mir notiert, bei welchen Zeichen (=Relaiskobinationen) was passiert – Für das Auto sind nur die unteren 6 Bits relevant.

XXXX X011 "3" rechter Motor rückwärts 
XXXX X101 "5" rechter Motor vorwärts
???? ???? "@" stop
0101 1000 "X" linker Motor rückwärts
???? ???? "[" beide Motoren rückwärts
???? ???? "]" beide Motoren, Auto dreht auf der Stelle linksherum
0110 1000 "h" linker Motor vorwärts
0110 1011 "k" beide Motoren, Auto dreht auf der Stelle rechtsherum
0110 1101 "m" beide Motoren vorwärts

2.Variante
hier kann man Zeichen per soft-keybord auswählen und senden um die Ergebnisse aus 1 nuch mal zu kontrollieren.

3.Variante
Je nach Neigung des Handys wird eins von 5 Zeichen zum Auto gesendet, 4 x pro Sekunde. siehe Video


#!/usr/bin/python
# -*- coding: utf-8 -*-

import android
import time

tilt_angle = 0.2

b_forw = 'm'
b_backw ='['
b_turn_right ='k'
b_turn_left = ']'
b_stop = '@'
outb = '@'

def bt_out(value):
   droid.bluetoothWrite(value)
 
if __name__ == '__main__':
    # global android Object for GUI
    droid = android.Android()
    
    # every 200ms
    ret = droid.startSensingTimed(1,200)
    droid.bluetoothConnect('00001101-0000-1000-8000-00805F9B34FB', '00:12:02:11:01:10')
    time.sleep(1)
    state = b_stop
    
    while True:
        ret = droid.sensorsReadOrientation().result
        pitch = ret[1]
        roll  = ret[2]
        #print pitch,roll,
        if pitch < -1.4:
            droid.stopSensing() 
            droid.bluetoothStop()
            exit()
        if pitch > tilt_angle:
            print 'forwards',
            state = b_forw
        if pitch < -tilt_angle:
            print 'backwards',
            state = b_backw
        if pitch > -tilt_angle and pitch < tilt_angle:
            print '-----',
            state = b_stop
        if roll > tilt_angle:
            print 'right',
            state = b_turn_right
        if roll < -tilt_angle:
            print 'left',
            state = b_turn_left
        if roll > -tilt_angle and roll < tilt_angle:
            print '-----',    
        bt_out(state)
        print state 
        old_state = state
        time.sleep(0.2)

Ausblick

  • Für Indoor könnte man einen Ultraschall Sensor auf das Auto montieren. Dann könnte es automatisch vor (manchen) Hindernissen stoppen und auch die Umgebung mappen.
  • Per Spannungsteiler am Analogeingang kann das Auto seine Akku-Spannung zurück senden.
  • Für Outdoor könnte man das Handy auf das Auto montieren, dank Kompass & GPS kann es dann autonom navigieren und Wegpunkte abfahren

Baubericht Teil 2

Quadcopter 2: first flips

January 20th, 2013 fly

Bei +6°C heute ein weiter Flug mit dem Quadcopter2. Fliprate ist noch nicht so hoch wie bei dem “kleinen” aber dafür mehr “hang-time” 🙂
10 Minuten Flugzeit mit einem 3S 2200mAh Akku – Allerdings danach auch 2300mAh geladen. Hmm… Das war nicht sehr Akku-freundlich. Aber ich wollte halt mal wissen, was die maximale Flugzeit ist. Wenn ich auf Kunstflug verzichte, sind 10min. für einen FPV Flug realistisch – auch ohne den Akku zu quälen.

Quadcopter 2: Maiden Flight

January 18th, 2013 fly

Heute habe ich noch eine 10x10cm Sperrholz Bodenplatte hinzugefügt. Dadurch habe ich eine solide Akku-Halterung und noch etwas Platz für die (FPV-)Cam. Videosender kommt später wahrscheinlich oben auf die Centerplate. Inklusive Bodenplatte, 4 langen M4 Schrauben und 10″ Gaui Propeller komme ich nun auf ein Abfluggewicht von 750g. Das entspricht ungefähr einem 450er Heli. Strom kann ich momentan nicht messen, aber vielleicht kann ich morgen die Flugzeit mit einem vollen Akku ermitteln.

Erstflug mit Naze32 default-Werten und nicht balancierten Gaui Propellern verlief sehr angenehm. Der Copter schwebt stabil, schwingt nicht, driftet nicht. Baro, Angle, & Horizon habe ich noch nicht getestet.

Morgen möchte ich noch ein paar Schaumstoff-Fü??e bauen. Auf dem Akku zu landen ist keine dauerhafte Lösung 😉

Quadcopter 2

neuer Quadcopter im Bau

January 17th, 2013 fly

Rahmen: 40cm, Alu. Eigentlich wollte ich aus Holz einen etwas grö??eren Rahmen bauen aber das habe ich erst mal vertagt, weil ich diesen Alu-Rahmen geschenkt bekam. Bei 10″ Propellern habe ich 0cm Abstand zur Centerplate und ca. 2cm Abstand zwischen den Propellern.
Regler: HobbyKing 20A UBEC mit SimonK Firmware.
Motoren: CF2822
Flightcontrol: Afroflight Naze32
Gewicht momentan: 466g ohne Akku, 660g mit 3S 2200mAh Akku

pilot’s diary

January 9th, 2013 fly

2012 ist vorbei. Nur 5 Crashes in den letzten 374 Tagen! 🙂
Heute gab es ein paar Stunden Sonne. 6 Flüge bei +6°C: 4 x HK450GT und 2 x mini Protos. Premiere heute: Piroflips rechtsdrehend. Es wird Zeit, dass ich (im Sim) mal wieder eine neue Figur lerne. Im letzten Jahr sind kaum neue Figuren hinzugekommen. Mir war es wichtiger, Piroflips und TicTocs zu verbessern; d.h. vor allem das driften nach oben, nach vorne und zur Seite zu vermeiden.

DX7s

December 30th, 2012 fly

Nach 4 Jahren mit der DX7i habe ich mir einen neuen Sender geleistet: Spektrum DX7s. Die Entscheidung war spontan. Kurz vor Weihnachten war an der DX6i ein Knüppelaggregat defekt (Sender vom Tisch gefallen 🙁 ) Das Ersatzteil würde ich vor meinem Urlaub nicht mehr bekommen. Die 10 Modellspeicher der DX6i haben schon lange nicht mehr ausgereicht.

DX7s
+ bessere Knüppelmechanik (Kugellager, einstellbar)
+ 20 Modellspeicher
+ Export & Import von Modellen via SD-Card – XML-Dateien!
+ Firmwareupdates via SD-Card
+ Timer läuft automatisch wenn der Motor läuft
+ grö??eres Display
+ integriertes Ladegerät für NiMH und 2S-Lipo
+ Warnungen per Ton oder Vibration sind einzeln abschaltbar
+ Telemetrie mit entsprechenden Empfängern

– ca.100??? bzw. 100% teurer als DX6i
– Laden dauert 12(NiMH) bis 30h(Lipo) Stunden
– 30 Gramm schwerer als DX6i
– Display ohne Backlight (kann man mit Turnigy backlight nachrüsten)

Drucken ohne CUPS

December 20th, 2012 android, linux

Auf meinem Schreibtisch liegt seit ein paar Tagen ein kleiner mobiler Drucker: RW 420 von Zebra. Das Ziel: Von einem Android Gerät darauf drucken. Die Zebra Utility App hift momentan nicht, denn die App kann nur Blutooth und WLAN und der Drucker kann nur RS232 und USB.
Also den Drucker erst mal ans Linux Laptop angeschlossen. Linux Mint erkennt ihn nicht automatisch, aber ich konnte ihn mit Cups manuell einrichten (Zebra CPCL Label Printer). Danach konnte ich z.B. von LibreOffice aus drucken, auch Grafik mit 203dpi.
Der nächste Schritt war, es ohne CUPS zu probieren.
Der Drucker versteht “CPCL” – Dazu gibts beim Hersteller das Handbuch als pdf. Ein Hello World sieht z.B. so aus:

! 0 200 200 210 1
TEXT 4 0 30 40 Hello World
PRINT

Das habe ich mit

cat test.cpcl > /dev/usb/lp0 

geschickt, aber nix passierte. Im Handbuch steht CR+LF als Zeilenende wäre wichtig. hmmm….

hexdump -c test.cpcl
unix2dos test.cpcl
unix2dos: Datei test.cpcl wird ins DOS-Format konvertiert ...
hexdump -c test.cpcl
cat test.cpcl > /dev/usb/lp0

Es funktioniert! 🙂

Android als USB Host, Arduino

December 16th, 2012 android, hardware, linux

Seit einiger Zeit entwickle ich Android Software in Python (mit SL4A, PythonAPK). Mein aktuelles Android Tablet ist das Arnova 10d G3 (Android 4.0.3, Linux Kernel 3.0.8). Es hat leider kein Bluetooth aber es hat 2 USB Anschlüsse, einer davon als USB Host. Also habe ich mit dmesg und logcat geschaut, was passiert, wenn man verschiedene USB Geräte anschlie??t.

* USB-Tastatur & -Maus werden automatisch erkannt und können sofort benutzt werden. Tastatur-Layout ist aber immer US ?!

* USB Drucker werden zwar vom Kernel als “full speed USB device” erkannt aber nicht als Drucker.
Zum Vergleich ubuntu Linux:

usblp0: USB Bidirectional printer dev 14 if 0 alt 0 proto 2 vid 0x0482 pid 0x0011
[114688.541019] usbcore: registered new interface driver usblp

* USB-RS232-Konverter
1.) FTDI FT232RL – Das gleiche wie bei den Drucken. Ich habe zwar eine “Treiber-App” dafür gefunden, hatte damit aber bisher keinen Erfolg damit. http://android.serverbox.ch/?p=370

2.) Prolific PL2303
Der Kernel erkennt diesen USB-nach-Seriell Converter und stellt das serielle Device /dev/ttyUSB5 zur Verfügung:

<6>[27051.309145] usb 2-2: new full speed USB device number 3 using uhci_hcd
<6>[27051.478195] pl2303 2-2:1.0: pl2303 converter detected
<6>[27051.501198] usb 2-2: pl2303 converter now attached to ttyUSB5

Also habe ich versucht, von meinem Python Script aus den per pl2303 angeschlossenen Arduino anzusprechen. Es funktioniert! 🙂

python code:

import serial
ser = serial.Serial('/dev/ttyUSB5', 2400, timeout=1)
ser.write("hello")
ser.close()

arduino code:

#include <LiquidCrystal.h>
int inByte = 0;         // incoming serial byte
// initialize the library with the numbers of the interface pins
LiquidCrystal lcd(8, 9, 4, 5, 6, 7);

void setup() {
  // set up the LCD's number of columns and rows:
  lcd.begin(16, 2);
  // Print a message to the LCD.
  lcd.print(".");
  lcd.setCursor(16, 0);
  lcd.autoscroll();
  Serial.begin(2400);
}
void loop() {
  if (Serial.available() > 0) {
    // get incoming byte:
    inByte = Serial.read();
    Serial.write(inByte);
    lcd.write(inByte);
  }
}

Alternativ gibt es für den pl2303 eine Erweiterung(Custom Facade) zu SL4A: https://bitbucket.org/kuri65536/usbhostserialfacade

Die hat bei mir aber nicht funktioniert (“device was not found” ) Möglicherweise werden von der Android API Geräte, die bereits durch einen Kernel Treiber verwaltet werden nicht mehr angeboten.

pilot’s diary

November 25th, 2012 fly

Der Blade nano macht viel Spa??. Leider ist inzwischen das Landegestell und die Taumelscheibe gebrochen. Das Landegestell vom mcpx ist robuster und passt auch einigerma??en an den nano – Problem gelöst. An der unteren Hälfte der Taumelscheibe sind alle 3 Arme angeknackst. Keine Ahnung wie das passiert ist. Habe versucht es mit Sekundenkleber zu kleben. Das hält aber nur bis zum nächsten Crash. Ich kauf’ jetzt eine original Taumelscheibe und wenn die wieder brechen sollte, werde ich wohl eine Alu-Taumelscheibe probieren.

Am Mini Protos habe ich jetzt zur Abwechslung mal wieder 325mm Blätter(Align). Das passt vielleicht ein bisschen besser für die Halle. Schweben geht damit ab ca. 1800 rpm (Indoor/ bei Windstille) , 2000 fühlt sich aber wesentlich besser an.
2000rpm, 14er Ritzel sind ca. 50% Throttle; d.h. er würde vermutlich auch mit 2S fliegen – aber leider ist er schon mit 3S hecklastig.

Erstflug Blade Nano cpx

November 8th, 2012 fly

Neuer (gebrauchter) Heli: Blade Nano cpx.
Ca. 3 Monate und 50 Flüge alt. Vor dem Erstflug war leider eine Reparatur nötig: Eines der Servos hat sich immer erst dann bewegt, wenn man es am Ritzel/Zahnrad anstubst. Bin ziemlich sicher, dass an diesem Servo der Motor defekt ist. Glücklicherweise passen die Servos vom mcpx, nur das Kabel ist etwas länger – das sind 0,2g Gewichtsunterschied. Mein Ersatz Servo war leider auch nicht o.k. Es zeigte ähnliche Symptome, so dass ich schon befürchtete, das Mainboard sei defekt. Dann habe ich gesehen, dass am (Ersatz)Servo ein Motorkabel an der Servoplatine abgebrochen ist. Kabel wieder dran gelötet, eingebaut – fliegt! YES YES YO!!

Abfluggewicht: 29,8g

In den nächsten Tagen möchte ich mir ein paar frische Akkus und neue Blätter dazu besorgen.