Archive for the 'electronics' Category

Spektrum DX7s: LED Backlight

Wednesday, March 20th, 2013

Heute habe ich meine DX7s mit einer LED-Hintergrundbeleuchtung nachgerüstet.
Artikel-Nr. bei Reichelt: EA LED68X51-A (Farbe: amber)
Anschlüsse a1..a3 via 100 Ohm Widerstand an + des Vibrationsmotors und k1 bis k3 an Masse(GND)

Das Backlight hat 9 LEDs.
Der Hersteller gibt an:
max 60mA (pro Anschluß?))
Forward Voltage: 2,1V

Mit 100 Ohm ist es hell genug, und ich denke damit bin ich auf der sicheren Seite falls ich mal einen Lipo verwende, der statt ca. 5 Volt ca. 8 Volt liefert. Ob die maximal 8,4V auch am + des Vibrationsmotors ankommen habe ich nicht gemessen, aber ich vermute ja.

Alle Angaben ohne Gewähr.
Nachbau auf eigene Gefahr.

Bluetooth-Auto (Forts.)

Wednesday, January 30th, 2013

2 Schreck-Momente und 2 Bilder möchte ich noch nachreichen:

Schreck-Moment 1:
Alles ist angeschlossen. Nach wenigen normalen Relais Klack-Geräuschen plötzlich alles tot. Sogar die LED vom BT-Modul ist aus!
Testweise habe ich statt der Relais wieder meinen LED-Strip angeschlossen: von den 3 Farben leuchtet nur noch eine! 🙁
Sch…. sind Transistoren im ULN druchgebrannt? Das wär sehr blöd, denn der ist nicht gesockelt. Noch ein bisschen probiert & gemessen: Die Spannung des NiMH Akkus bricht total ein. Weg damit und einen 2S Lipo besorgt. Damit lief es dann gut weiter bis….

Schreck-Moment 2:
Das Auto war aufgebockt, die Motoren & Räder können frei drehen.
Plötzlich stoppt der Motor sehr abrupt und die Räder lassen sich auch manuell nicht mehr drehen 🙁 was nun? Motor kaputt ? Getriebeschaden ? Um einen Motor zu erreichen musste ich beide Motoren ausbauen und ein Getrieben öffnen – unzählige Schrauben, fettige Finger. Getriebe sieht gut aus. Motor blockiert. Mit “sanfter Gewalt” konnte ich es wieder gängig machen. Ein paar Mal in Beide Richtungen ohne Getriebe laufen lassen – alles ok. Aber ich war skeptisch – wann wird das wieder passieren ? alles wieder zusammen gebaut. Seit dem ist alles ok. Auto fährt & driftet gut auf Parkett oder Terrasse. Durch den Schnee kommt es aber kaum – vermutlich ist der Akku zu schwach.
Demnächst mal auf den Sportplatz um die BT-Reichweite zu testen.

BT car

bt car

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

42cm Quadcopter: im Baum übernachtet

Wednesday, May 9th, 2012

Gestern wollte ich mit meinem Quadcopter einen neuen persönlichen Höhen-Rekord aufstellen. Das gelang mir auch (80m), aber es war keine gute Idee denn der Wind war recht stark und der Quadcopter wurde gerade von Multiwii 1.9 auf 2.0 upgedatet – das fühlte sich noch etwas ungewohnt an und ich hatte es draussen bei Wind noch nicht getestet. Es war wie so oft: Aufsteigen ist ganz einfach… aber der Sinkflug ist sau-schwierig. Zu viel oder zu wenig Gas ? Drift auf Yaw ! Der Wind treibt ihn weg.. Wo ist vorne??? Panik! Er treibt schnell auf den Wald zu und ist immer noch sehr hoch. Mist! schon hinter den Bäumen verschwunden – Jetzt aber Gas auf Null!
Sch…!
Die Suche beginnt. Zunächst nur flüchtige Blicke auf den Waldboden und in die Baumkronen (15m hoch!) , den Weg, die Dächer und die Felder hinter dem Waldstück
kontrolliert. Kinder gefragt, ob sie was gesehen haben. nix.
Dann systematisch mäanderförmig den Waldboden abgesucht und auch immer wieder die Baumkronen betrachtet. Die Baumkronen sind teilweise so dicht – da könnte ein Copter ‘drauf liegen ohne dass man ihn von unten sehen kann. Nach einer Stunde war ich mir ziemlich sicher: auf dem Boden liegt er nicht.
Später kam ein Freund und half bei der Suche. Wir gingen noch mal zum Startplatz und konzentrierten und auf einen ca. 20m breiten Bereich vom Wald mit der höchsten Wahrscheinlichkeit entsprechend meiner Erinnerung. 4 Augen sehen mehr als 2: Mein Kollege hat meinen Kopter entdeckt. Kaum zu erkennen. Man sieht jeweils ein Stück der orangenen Propeller, aus einer anderen Perspektive kann man den Umriss erkennen. Wir schätzen er liegt in 10m Höhe, es waren aber eher 15m. Sender geholt: Vergeblich, denn wenn der Quad auf dem Rücken liegt kann man die Motoren nicht einschalten 🙁

Ein Tag später: Der Landwirt, der dort lebt, bietet sein Hilfe an. Er hat ein ca 9m lange 2-teilige Leiter und eine ca 8m lange Stange aus GFK-Rohr+Holz. Wir legen die Leiter an den Baum. Ich klettere hoch. Soweit o.k. aber wenn ich jetzt noch die Stange halten müsste… …schwierig! Der Landwirt und ich sind der Meinung das sollte jemand machen, der mit sowas etwas geübter ist, z.B. der Sohn des Landwirts, welcher in der Feuerwehr aktiv ist. Und er machte das wirklich sehr professionell: Hat sich einen Gurt angezogen und sich oben an Baum und Leiter fest geseilt. Der Copter wird vorsichtig geschubst, landet 5m tiefer auf den Ästen eines andern Baumes. Von dort war er dann greifbar und wurde dann über die Leiter nach unten getragen. Völlig trocken und unversehrt. Akku noch ‘dran. Cam ist noch dran. Zuhause stelle ich fest: Der Akku ist tiefentladen – also kaputt. Alles andere funktioniert.

Fazit:
* keine Höhenflüge an windigen Tagen
* den schwierigen Sinkflug noch viel viel öfter trainieren, z.B. aus 20m Höhe
* besser schräg gegen den Wind steigen, statt senkrecht nach oben
* Suchpiepser einbauen z.B. mit AUX2 schaltbar, oder mit eigenem Akku: automatisch Alarm nach 10 Minuten
* Stange mit Depron-Dreieck, lichtdicht(Alufolie?) zur besseren Lageerkennung
* wenn möglich die Cam so einstellen, dass alle 10 Minuten eine neue Datei erstellt wird
* 2m Motorsegler sind besser gegeignet wenn man sehr hoch fliegen will.

Nokia 3310 LCD

Sunday, April 22nd, 2012

Vor 3 Jahren habe ich das Display aus einem Nokia 3310 ausgeschlachtet und dort Kabel, Steker und Kondensator angelötet. Dann ruhte das Projekt, weil ich noch keine Erfahrung mit 3,3V Bauteilen, Pegelwandler usw. hatte. Mein erstes Projekt, wo der Micrcontroller mit 3,3V läuft war der SD-Karten-Logger. Für das Nokia Display habe ich im Atmega328P die Fuses für 8Mhz interner Oszillator und Brown-Out-Detection auf 2,6V gesetzt. Die Schaltung habe ich mit einem DC-DC Wandler versorgt. Die Schaltung funktioniert ab 2,7 V aber fürs flashen werden ca. Vcc=3,6V-3,7V benötigt, damit die High-Pegel vom usbasp erkannt werden. Das sind 0,4V zuviel für das Display aber das hat es bisher überlebt. Vielleicht mache ich noch eine Diode in die VDD(+) Leitung des Displays, aber ich habe mal gehört, dass die Pegel an den Eingängen nicht höher sein sollen als Vcc.

Software: Das este Bespielprogramm von http://www.arduino.cc/playground/Code/PCD8544 hat nicht funktioniert, aber das zweite lief sofort. Man kann sich die DA Pins die man verwenden möchte frei aussuchen. Der von mir gebaute Stecker ist so belegt:
#define PIN_SCE 2
#define PIN_RESET 0
#define PIN_DC 3
#define PIN_SDIN 4
#define PIN_SCLK 6

Später probier’ ich mal die lib von Adafruit:
https://github.com/adafruit/Adafruit-PCD8544-Nokia-5110-LCD-library
Oder vielleicht die Borgware von das-labor.org – das könnte der kleinste 2D Borg werden 🙂

nokia LCD

USBaspLoader, Metaboard

Saturday, April 21st, 2012

In 2009 und 2010 habe ich 2 BLIT2008-Boards gebaut: Atmega8, 12MHz Quarz, USB-Bootloader. http://bralug.de/wiki/BLIT2008-Board
Der 12Mhz Quarz war damals üblich, um das USB Timing für V-USB hinzukriegen.
Inzwischen hat sich V-USB weiterentwickelt und es geht auch mit anderen Taktfrequenzen.

We supply assembler modules for clock frequencies of 12 MHz, 12.8 MHz, 15 MHz, 16 MHz, 16.5 MHz 18 MHz and 20 MHz. Other clock rates are not supported.

Und es gibt einen Bootloader, der kompatibel zu USBasp ist. Folglich passt er dann auch zu avrdude und zur arduino-IDE:
http://www.obdev.at/products/vusb/usbasploader.html

Wie beschrieben habe ich USBaspLoader konfiguriert, kompiliert & geflasht…
make
make fuse
make flash

Das hat leider nicht funktioniert. Mein Notebook hat kein USB-Gerät erkannt.

Im Netz fand ich 2 weitere Boards mit Atmega & V-USB:
http://wiki.lochraster.org/wiki/Rumpus und https://metalab.at/wiki/Metaboard

Mein eigenes Board habe ich dem Metaboard angepasst, in dem ich USB D- an PD4 und den “Bootloader enable”-Schalter an PD7 angeschlossen habe.

Für das Metaboard mit Atmega328 @ 16Mhz fand ich sogar den USBaspLoader als fertiges HEX-File: http://sites.google.com/site/a52egv/metaboard

Das habe ich probiert und das hat auch funktioniert. Leider nur ein Mal. Danach war der Bootloader überschrieben. 🙁

Ich glaube im Makefile von USBaspLoader ist ein Fehler:
hfuse: DA -> ergibt 1k Bootloader, aber der Bootloder ist knapp 2k groß.

Mit hfuse: D8 funktioniert es bei mir.
lfuse: f7
Lockbits habe ich nicht benötigt.

Möglicherweise noch ein Fehler im Makefile:
# BOOTLOADER_ADDRESS is 1800 for 8k devices, 3800 for 16k and 7800 for 32k.
Das ist IMHO auch falsch, denn 0x3800 x 2 = 0x7000 und nicht 7800

Jedenfalls bin ich froh, dass es nun endlich funktioniert.
Wenn ich PD7 per Schalter oder Jumper auf GND lege und anschließend reset drücke hält das laufende Programm an und der Bootloader wartet. Wenn der Bootloader das neue Programm empfangen hat, läuft dieses automatisch sofort los.

inspired by metaboard

240 LEDs

Thursday, April 12th, 2012

Vor einiger Zeit habe ich versehentlich eines meiner Conrad/Franzis Pong Spiele mit 12V gebraten. Nun habe ich den defekten Atmega8 von der Platine entfernt und dabei dort die Leiterbahnen etwas beschädigt. LEDs und Schieberegister sind aber noch o.k.
Statt dort irgendwie einen neuen Controller dran zu löten, habe ich die defekte Platine mit einer funktionierenden Platine verbunden: +5V, GND, Zeilen 1 bis 10, Strobe, Clock und Q4 vom zweiten Schieberegisters an Data des dritten Schieberegisters.
Momentan nutze ich es als Laufschrift, der Text ist fest in der Firmware, könnte aber in zukünftigen Software-Varianten auch per i2c , seriell oder Bluetooth empfangen werden.

2 pong platinen von hinten

noch mehr arduinos

Thursday, April 12th, 2012

Neulich brachte der Postbote 5 frische Atmega328 und 16MHz Quarze.
Einen davon habe ich hinter mein LCD keypad shield gesteckt, und ein andere wird mein Mini-Höhenlogger mit BMP085 Sensor.
Die beiden will ich über ein serielles Nullmodemkabel verbinden um nach einem Flug die gesammelten Daten ansehen zu können.

Fuses setzen und Bootloader flashen:
16MHz Quarz:
avrdude -c usbasp -p m328p -U hfuse:w:0xDA:m
avrdude -c usbasp -p m328p -U efuse:w:0x05:m
avrdude -c usbasp -p m328p -U lfuse:w:0xFF:m
avrdude -c usbasp -p m328p -U ATmegaBOOT_168_atmega328.hex

8MHz internal Oszillator*:
avrdude -c usbasp -p m328p -U hfuse:w:0xDA:m
avrdude -c usbasp -p m328p -U efuse:w:0x05:m
avrdude -c usbasp -p m328p -U lfuse:w:0xE2:m # bin mir nicht sicher
avrdude -c usbasp -p m328p -U ATmegaBOOT_168_atmega328_pro_8MHz.hex

*hat einmal funktioniert und einmal nicht. hmm..
Die Original arduinos haben offenbar alle einen externen Quarz oder Resonator,
sogar die Lilipads mit 8MHz

Lochraster arduino

Elektronik basteln

Tuesday, April 10th, 2012

Momentan macht es mir große Freude alten LED- und LC-Displays, die hier schon sehr lange ‘rumliegen, mit Hilfe von Atmega/arduino neues Leben einzuhauchen.

Zu Beginn etwas einfaches: TIL311 Hexadecimal Display With Logic original aus der 80ern.
Da ich nur ein einstelliges Display habe, habe ich “latch strob input”(Pin 5) mit GND verbunden. Mit Pin 8 – blanking input kann man das Display dunkel schalten, blinken lassen oder vielleicht sogar mit PWM dimmen.

Nächstes Versuchsobjekt: ein einzeiliges LCD aus einem Faxgerät. Für das 14-pol Flachbandkabel hatte ich keine Pinbelegung. Also habe ich mir eine Seite aus dem Datenblatt des Controller-Chips “LC7985A” ausgedruckt und die interessanten Anschlüsse durchgepiepst:

1 DB6
2 DB7
3 DB4
4 DB5
5 DB
6 DB
7 DB
8 DB
9 RW -> GND
10 E -> Atmega B3, arduino 11
11 V5 -> GND
12 RS -> Atmega B4, arduino 12
13 GND
14 VDD +5V

V5 ist vermutlich für Kontrast zuständig. Ich musste es mit GND verbinden, damit es funktioniert. Software-seitig kann man die übliche LiquidCrystal Library verwenden: 4 bit Daten + RS + E

Ausblick:
* 2-zeiliges LED Display aus 16 Stück DLO3416
* LCD aus einem Nokia 3310 (3,3V)
* LCD keypad shield

atmega/arduino Basteltag

Sunday, April 1st, 2012

Gestern bin ich bei den Projekten “serieller Datenlogger” und “Höhenlogger” ein bisschen weiter gekommen. BMP085_Example_Code.pde läuft auf einem Atmega8 mit 8MHz, internal Oscillator. Lesen & schreiben auf SD Karte läuft bis jetzt nicht mit Atmega8 oder Atmega32. Für den Atmega8 ist die SD-Library zu groß und beim Atmega32 ist die Pin-Zuordnung anders. Atmega168 oder 328 hatte ich gerade keinen zur Hand.

Funktion    | Atmega8  | Atmega32 | arduino
----------------------------------------------------
SS            PB2        PB4        digital 10
MOSI          PB3        PB5        digital 11
MISO          PB4        PB6        digital 12
SCK           PB5        PB7        digital 13

SCL           PC5        PC0        analog input 5
SDA           PC4        PC1        analog input 4
----------------------------------------------------

Fuses für Atmega8
* mit 16MHz Quarz, 512 words bootloader: lfuse=df hfuse=ca
* 8Mhz internal Oscillator: lfuse=e4 hfuse=d8

siehe auch: arduino-0023/hardware/arduino/boards.txt
http://www.engbedded.com/fusecalc

Festspannungsregler für 3,3V:
LM117DT
78M33
LM3940-3.3
LF33
MCP1700-3302E