Archive for the 'android' Category

meine erste kivy app

Wednesday, January 29th, 2014

meine erste kivy app ist ein control panel (incl. throttle quadrant) für FlightGear:

repo on gitorious.org

wiki page

forum post

www.kivy.org

screenshot

Android .apk verändern und signieren

Wednesday, April 17th, 2013

einmalig: Einen keystore erzeugen:
mkdir keys
keytool -genkey -alias anddev.keystore -keyalg RSA -validity 20000 -keystore keys/anddev.keystore

Wenn man z.B. test.apk verändern möchte:
apk-Datei auspacken (unzip) , verändern und wieder einpacken(zip)
Danach:

jarsigner -verbose -keystore keys/anddev.keystore -signedjar test_singed.apk test.apk anddev.keystore
zipalign 4 test_singed.apk test_signed_and_aligned.apk

Quelle

Bluetooth-Auto

Tuesday, January 29th, 2013

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

Drucken ohne CUPS

Thursday, December 20th, 2012

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

Sunday, December 16th, 2012

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.

Ein Monat android

Friday, February 10th, 2012

Meine momentanen Lieblings-Apps:

Musik – Den eingebauten mp3- (und auch ogg-) Player benutze ich um Podcasts zu hören.

TuneIn Radio – Internet Radio, z.B. 3 x Depeche Mode Radio, SomaFM: Lush, Underground 80s, US- und australischer Polizeifunk! 😉

Nachrichten – RSS Feeds: Tagesschau, heise, …

RockPlayerLite – spielt fast alle Video-Formate, aber auf meinem Gerät nur langsam.

Navit – Offline & Online Navigation mit OpenStreetMap

GMX Mail – zeigt (pop3) mails, ohne sie auf dem Server zu löschen.

DB Navigator – kann Fahrpläne ‘runterladen und dann auch offline anzeigen.

Widget “Energiesteuerung” – um bequem WLAN,Bluetooth,GPS ein & auszuschalten und die Helligkeit des Displays in 3 Stufen einzustellen.

Was ich auch sehr cool finde, ist die Spracheingabe statt Tastatur – funktioniert oft korrekt – und wenn nicht, dann ist es meist sehr lustig.

android: erstes Problem

Tuesday, January 17th, 2012

Gestern konnte ich keine apps mehr über den market installieren. Installieren von HTC Sense Widgets ging auch nicht mehr. Am selben Tag wurde mir ein “Software Update” (Android 2.3.3 -> 2.3.5) angeboten. Das hat funktioniert, aber bei dem Problem nicht geholfen. Zwischendurch kam die Meldung, ich hätte meine SIM Karte gewechselt ?!
Also lese ich eine Weile in den Foren, fand einige ähnliche Fälle, deren Lösungen bei mir aber nicht zutrafen und fand schließlich heraus: Nicht der market ist kaputt, sondern der Download Manager.

Einstellungen->Anwendungen->Anwendungen verwalten->Alle Anwendungen->Download Manager-> Updates deinstallieren.

Das hat geholfen.

android: screenshots ohne root

Thursday, January 12th, 2012

Heute habe ich auf meinem Linux Notebook ddms (Dalvik Debug Monitor Server) ausprobiert. Es wirkt teilweise wie eine GUI für adb (Android Debug Bridge) z.B kann man Dateien vom oder zum Phone kopieren. Dieses Programm aus dem Android SDK Ordner “tools” funktioniert auch wenn ich es als normaler User starte. Im Menu “Device” gibt es “Screen capture (ctrl-S)” und das macht, was es soll, auch bei einem non-rooted Phone.

Android SDK, adb

Wednesday, January 11th, 2012

Weil diverse Programme ohne root nicht funktionieren, z.B. VNC-Server, Screenshot, Droidwall und weil ich es gewohnt bin, auf Geräten die mir gehören uach root zu sein, mochte ich mein HTC Wildfire s gerne rooten. Da gibt es offenbar mehrere Möglichkeiten. Ich habe mir den “offiziellen” Weg über http://www.htcdev.com angesehen. Wenn man es so macht, wird alles geöscht, steht da. Hmmm… Ich hab zwar noch nicht viel ‘drauf, trozdem mal nach einer (Full-)Backup Lösung suchen….
Zwischendurch was über Exploits und Malware gelesen und lookout als Malware-Scanner installiert.

Auf der Suche nach der Backup-Lösung fand ich adb (Android Debug Bridge) aus dem Android SDK welches ich schon auf meinem Notebook entpackt hatte.

adb devices

zeigt zunächst nur “??????????”, nochmal als root gestartet sah’s dann besser aus:

List of devices attached
XY12345678 device

adb pull /system

saugt schonmal eine ganze Menge Zeug(250MB) aus dem Phone auf meine Festplatte. Per

adb shell

und den üblichen Unix/Linux Kommandos finde ich heraus was so alles gemountet ist, und dass ich /data , /config , /sbin … nicht lesen darf, somit bringt adb pull /data auch kein Ergebnis.

So weit so gut. Werde noch ein bisschen lesen und Freunde fragen wie man am besten rootet.

Android

Wednesday, January 4th, 2012

Neues Gerät, neues Hobby. Der Gerät: HTC Wildfire S, das Hobby: OpenStreetMap. Ich laufe oder fahre mit dem Rad durch den Ort, logge mit der Software Open GPS Tracker, ab morgen mit OSMTracker und mappe dann zuhause mit JOSM. Mit G-Mon kann man auch WLANs tracken/mappen – Hab ich noch nicht probiert, nur einmal kurz Wigle Wifi aber das scheint sich nicht mit Open GPS Tracker zu vertragen.