Freitag, 20. Juli 2012

Pegelwandler für den Regler

Microcontroller und Regler mit Pegelwandler

Nach dem ich einen Pegelwandler über dem Breadboard ausprobiert habe, dachte ich "löte doch mal das gleich auf die Platine!". Damit ich auch die richtigen Widerstände verwende, habe ich kurzerhand die Schaltung für meine Bedürfnisse berechnet. Im Grunde reicht die Grundformel R=U/I. Zunächst suchte ich in meinen Kisten nach den passenden Transistoren, und fand schließlich auch die PNP Varianten. Zuvor habe ich nur NPN verwendet, wodurch ich noch ein Inverter benötigt habe, um das richtige Ausgangssignal zu erhalten.

Leider bin ich etwas gestolpert, als ich meinen Kaffee an meinen Tisch brachte.

Was hier allerdings auffallen dürfte ist, dass ich nicht die Werte genommen habe, die ich eigentlich berechnet habe, sondern Widerstände mit einem geringeren Wert. Da ich meistens mit 1 Milliampere rechne, ist es nicht weiter tragisch, wenn die Belastung auf 2mA oder 3mA ansteigt und für meine Anwendungen absolut ausreichend. Abgesehen davon, hätte ich sonst eine Platine voller Widerstände, und das wäre dann schon eine Verschwendung.

Widerstände 8x2,2kOhm und 4x1,5kOhm, 4xPNP BC177A und 4xNPN BC547A Transistoren, 1 Platine und Steckstifte zum anschließen.

Zugegeben passt auf der Platine noch mehr, dennoch sollte es erst einmal reichen. Vielleicht fällt mir später noch etwas ein, dass ich als Schaltung gebrauchen könnte.
Die fertigen 4 Pegelwandler. Von Links kommt das Signal vom Microcontroller und links vom schwarzen Transistor wird der Regler angeschlossen.

Kurz warum ich hier Pegelwandler brauche. Normalerweise würden die Servos, oder zumindest die kleinen, mit einem Spannungsimpuls von 3,3V auskommen. Schließt man hier einen normalen an, so kann es vorkommen, dass der Spannungsabfall zu groß ist und das Signal nicht ausreichend für den Regler zu lesen ist. In meinem Fall sind es die Regler für die Brushless Motoren, die keine ausreichende Entkopplung zum Stromkreis haben.

Defekter Brushless Motor

Brushless Motor, Regler und der Arduino zum programmieren des Reglers

Ärgerlich. Jetzt bin ich mit dem größten Teil der Programmierung durch, ist mir beim justieren ein Motor im wahrsten Sinne abgeraucht. Nach dieser neuesten Erfahrung musste ich feststellen, dass der Regler für Brushless Motor in einem schädlichen Bereich steuern kann. Vielleicht kann ich erst einmal einen Tricopter konfigurieren, um meine Tests fortzuführen und gegebenenfalls auch mal zu fliegen.

Mittwoch, 18. Juli 2012

Provisorischer Pegelwandler von 3,3V auf 5V

PWM Signal über den Pegelwandler und Inverter

Heute morgen habe ich meine Bestellung von ein paar Pegelwandlern abgesendet. Obwohl ich mir sicher bin, dass es dann mit der Ansteuerung der Regler funktioniert, habe ich testweise einen Pegelwandler aus zwei Transistoren, 3 Widerständen und einem Inverter zusammengesteckt.
Es funktioniert! Zuvor ging es mit dem großen Servo nur teilweise und eigentlich wackelte der Arm nur ein wenig hin und her. Das gleiche dürfte auch bei den Reglern der Fall gewesen sein, so dass sich die Motoren nur ungenau und fast nur auf Vollgas drehten.

Der provisorische Pegelwandler wandelt den Impuls von 3,3V auf 5V. Zumindest sollte das so sein. Es kamen hier jedoch nur 3,8V an, reichte allerdings, dass der Servo nun mit dem PWM Signal etwas anfangen konnte. Besser wäre es, wenn ich das vorher ausgerechnet hätte, dann wäre ich näher an der gewünschten Signalstärke.
Wenn meine bestellten Teile ankommen, dann kann ich erst mal einen neuen Netduino Shield löten.

Montag, 16. Juli 2012

Schwierigkeiten mit dem Steuerimpuls

Messen mit dem Oszilloskop

Nachdem ich gestern etwas am Verzweifeln war, stellte ich heute etwas neues fest. Die Spannung, die als Signal Impuls ankommt, hat nur 3,3V und scheint bei Belastung zu weit abzufallen. Das führt nun dazu, dass die Regler nicht richtig durchgesteuert werden und die Motoren nur ein wenig hin und her wackeln.

Dem Fehler auf der Spur. Spannung vom Signal zu gering.

Erst heute fand ich zufällig bei meiner Suche die richtigen Einstellungen für die PWM Klasse im  .NET Micro Framework. Jedoch stellte ich fest, dass meine verwendeten Werte alle richtig sind, und ich nun darauf kam, mal das Signal etwas näher zu betrachten. Ach ja, bei meiner Suche im Internet fand ich einen Blog, der mir den entscheidenden Hinweis gab, und zwar die Spannung.
Also schloss ich mein Oszilloskop an und legte den Messstift an den Microcontroller und siehe da, es stimmt. Die Spannung ist wie beschrieben bei 3,3V, und nicht wie immer angenommen bei 5V. Zwar sollte auch die Spannung von 3,3V reichen, aber bei mehreren Reglern fällt die Spannung zu weit runter, so dass ein vernünftiges Durchsteuern nicht mehr möglich ist

Dienstag, 10. Juli 2012

Fernsteuerung Entwickeln für Windows Phone 7

Windows Phone 7 und in Expression Blend entwickelte Controls.

Fast 2 Wochen habe ich keinen Blogeintrag getätigt, was allerdings nicht bedeutet, dass ich nicht weiter am Quadrocopter arbeite. Es ist vielleicht spannend, wie ich viele Tests durchführe, um die richtigen Einstellungen für die Rotorsteuerung herauszufinden. Jedoch habe ich dies ausgelassen und behalte das solange, bis ich fertig bin. Am Ende werde ich vielleicht auch eine kleine Dokumentation auf meinem Blog veröffentlichen in einer weiteren Kategorie.

Vorläufige Steuercontroller. Schubwerte (die 4 Kreise links), Gleichgewichtsanzeige (sieht aus wie ein Radar), Verzögerungsanzeige (Netzwerkverbindungverzögerung), Batterieanzeige. Zudem Anzeigen welche Bereiche Betriebsbereit sind.

Für die Programmierentwicklung reicht nicht nur die Entwicklung auf dem Microcontroller, sondern auch die Entwicklung für die Fernbedienung. Zudem war es für mich notwendig mich mit Expression Blend 4 auseinander zusetzen, dass ich nun in Zukunft immer verwenden werde, um meine Controls zu gestalten. Zuvor habe ich dies immer per Hand im Designer eingegeben, was ein gewissen Zeitaufwand benötigte.

Erste Version der Controllerseite.

Momentan sind erst mal die Seiten fertig, auf dem später die Steuerung des Quadrocopter vorgenommen werden kann. Zwar habe ich schon vor einen Monat bereits an der App programmiert, jedoch gefiel mir die Optik noch nicht. Jetzt komme ich schon der Sache näher und ich bekomme nun mit der Version wesentlich mehr auf eine Seite als zuvor. In der ersten Variante sah es recht klobig aus.

Einfacher Aufbau für die Netzwerkverbindung.

Nachdem ich meine erste Version für den Controller fertig entwickelt habe in einer Simulierten Programm, kompilierte ich den Code auf den Netduino und schloss es an die Regler für die Rotoren an. Leider war ich mit der Begrenzung der Schubkontrolle etwas zu großzügig, so das ich Schwierigkeiten hatte, die Stromversorgung für die Motoren abzutrennen, ohne das mir mein Quadrocopter aus der Handreißt. Für die nächsten Test ist nun der Rumpf am Tisch festgebunden.

Am Tisch gebunden. Einfach so ist die Gefahr zu groß für Beschädigungen.

Bevor ich also da weiter testen kann, muss die Software für das Windows Phone fertig werden. Und vielleicht ist ein Not aus für die Tests auch nicht verkehrt.

Mittwoch, 27. Juni 2012

Beschleunigungssensor auslesen mit einem Netduino Plus

WP_000262
Arduino Plus, BMA020 und mein Sensor Shield Prototype
Vielleicht hätte ich diesen Post früher veröffentlicht, wenn mich nicht andere Einflüsse behindert hätten. Dennoch habe ich es geschafft: statt mit dem Arduino Nano 3.0 (zum Post) habe ich den selben Sensor diesmal mit dem Netduino ausgelesen. Der Sinn dürfte klar sein, dass C und C# einfach sehr unterschiedlich sind. Das Prinzip ist allerdings das gleiche. Wobei es mit der mitgelieferten Bibliothek beim Arduino wesentlich kürzer erscheint, als beim Netduino und dem .Net Micro Framework. Anscheinend kommt man im C# nicht aus, ohne eine weitere Klasse zu schreiben, um an die Sensordaten heran zukommen. Bestimmt gibt es eine Lösung dafür, aber bei größeren Projekten macht es keinen Sinn.
image
Zusammengesteckt und Verbindungen hergestellt
Etwas lange habe ich nach einem Beispiel gesucht, wie man über den I²C Bus ein Modul erreicht und auch Daten bekommt. Die ersten Versuche zeigten sich mit Abstürzen und Abbruch des Programmcodes. Kein schöner Gedanke, weil der Sensor ein wichtiger Teil für die Kontrolle des Quadrocopters ist. Letzten Endes habe ich es dann verstanden und frage mich mal wieder, warum ich nicht vorher darauf gekommen bin.
Beschreibung zu den Verbindungen:
  • Netduino Analog Pin 5 (SCL) kommt an den BMA020 Sensor Pin SCK
  • Netduino Analog Pin 4 (SCA) kommt an den BMA020 Sensor Pin SDI
  • BMA020 Sensor Pins UIN, UPullup und CSB werden an +5V angelegt
  • BMA020 Sensor Pins GND und SD0 werden an 0V (GND) angelegt
Nun zum Programmcode, den ich aus dem Netduino Forum habe (gekürzte Fassung). Wichtig ist hier zunächst die Funktion zu bekommen.

Die angepasste Klasse

using Microsoft.SPOT.Hardware;
using System;
namespace IIC_ReaderExample
{
    public class I2CExample
    {
        private I2CDevice.Configuration _Config;
        private I2CDevice _Device;
        /// <summary>
        /// Initialisiert die Klasse
        /// Konfiguration wird angelegt und
        /// die entsprechende Klasse I2CDevice wird initialisiert
        /// </summary>
        /// <param name="address">Adresse zur Hardware</param>
        public I2CExample(byte address)
        {
            // Adresse und Taktfrequenz übergeben
            _Config = new I2CDevice.Configuration(address, 400);
            _Device = new I2CDevice(_Config);
        }
        /// <summary>
        /// Sendet den Inhalt des Byte Array zur Hardware
        /// </summary>
        /// <param name="writeBuffer">Byte Array</param>
        public void Write(byte[] writeBuffer)
        {
            // Byte Array übergeben für das ertellen einer Transaction
            I2CDevice.I2CTransaction[] writeTransaction = new I2CDevice.I2CTransaction[]
            { 
                I2CDevice.CreateWriteTransaction(writeBuffer) 
            };
            // Sende die Daten an die Hardware. TimeOut bei 1 Sekunde
            int written = this._Device.Execute(writeTransaction, 1000);
            
            // Prüfe ob alle daten gesendet wurden, ansonsten Exception ausführen      
            if (written != writeBuffer.Length)
            {
                throw new Exception("Es konnten keine Daten an das Modul gesendet werden.");
            }
        }
        /// <summary>
        /// Ruft mit den Adressen im Buffer die Werte ab
        /// </summary>
        /// <param name="readBuffer">Byte Array mit Adressen für den Abruf entsprechender Daten</param>
        public void Read(byte[] readBuffer)
        {
            // Erstelle ein Transaction zum Lesen mit übergabe des Byte Array        
            I2CDevice.I2CTransaction[] readTransaction = new I2CDevice.I2CTransaction[]
            {            
                I2CDevice.CreateReadTransaction(readBuffer)        
            };
            // Lese die Daten von der Hardware. TimeOut von einer Sekunde     
            int read = this._Device.Execute(readTransaction, 1000);
            // Prüfe, ob die Daten gesendt wurden      
            if (read != readBuffer.Length)
            {
                throw new Exception("Es konnte nicht vom Modul gelesen werden.");
            }
        }
    }
}
Das wesentliche habe ich in die Kommentare geschrieben, und dürfte fürs erste reichen. Nun kommen wir zum Auslesen der Daten aus dem Sensor:
Die Program-Klasse in dem die static Main() ausgeführt wird

using System.Threading;
using Microsoft.SPOT;
using Microsoft.SPOT.Hardware;
using SecretLabs.NETMF.Hardware.NetduinoPlus;
namespace IIC_ReaderExample
{
    public class Program
    {
        public static void Main()
        {
            // write your code here
            Debug.Print("Starte Thread");
            new Thread(LedState).Start();
            // 5 Sekunden warten
            Thread.Sleep(5000);
            I2CExample i2cExample = new I2CExample(0x38);
            
            Debug.Print("Starte Schleife");
            while (true)
            {
                // X
                byte[] buffer = new byte[2];
                buffer[0] = 0x02;
                buffer[1] = 0x03;
                i2cExample.Write(buffer);
                i2cExample.Read(buffer);
                int xdValue = buffer[1];
                // Y
                buffer = new byte[2];
                buffer[0] = 0x04;
                buffer[1] = 0x05;
                i2cExample.Write(buffer);
                i2cExample.Read(buffer);
                int ydValue = buffer[1];
                // Z
                buffer = new byte[2];
                buffer[0] = 0x06;
                buffer[1] = 0x07;
                i2cExample.Write(buffer);
                i2cExample.Read(buffer);
                int zdValue = buffer[1];
                Debug.Print("X:" + xdValue.ToString() + " " +
                    "Y:" + ydValue.ToString() + " " +
                    "Z:" + zdValue.ToString());
                Thread.Sleep(20);
            }
        }
        /// <summary>
        /// Dient nur zur Aktivität des Micro Controllers.
        /// </summary>
        public static void LedState()
        {
            OutputPort port = new OutputPort(Pins.ONBOARD_LED, false);
            while (true)
            {
                port.Write(true);
                Thread.Sleep(500);
                port.Write(false);
                Thread.Sleep(500);
            }
        }
    }
}
Am Anfang ist zu sehen, dass ich ein “Thread.Sleep(5000)” eingesetzt habe. Wenn der Zugriff auf den I²C Bus beim Senden steht, dann bleibt das Programm stehen. Schwierigkeiten treten dann auf, beim erneuten Debuggen. In meinen ersten Anläufen blieb mir sogar nichts anderes übrig, als den Netduino Plus vollständig zurück zu setzen. Das bedeutet, dass auch die Firmware weg ist und erst mit einem Tool von Atmel und einer Firmware Datei der Netduino wieder auf Werkseinstellung gesetzt wird. Also wenn etwas sein sollte und der Controller steht, dann ist es möglich, innerhalb von 5 Sekunden den Controller nach einem Reset neu zu beschreiben.
Ich hoffe ich kann mit diesem Post dem einen oder anderen Hobbybastler weiterhelfen und wünsche viel Spaß.

Sonntag, 24. Juni 2012

Neu Verkabeln

Kabel und Stecker

Zugegeben war ich unzufrieden, wie die Verkabelung auf meinem Quadrocopter aussah. Der Missbrauch  Steckersysteme zu verwenden, die Normalerweise im PC selbst zu finden sind, sah nicht schön aus. Daher besorgte ich im Conrad Shop entsprechendes Kabel und passende Stecker, die für den Modellbau geeignet sind.

 Stecker anlöten

Mit meinem anschlagenden Lötstation war das kein leichtes, alle Kabel so vernünftig wie möglich anzulöten. Schwierig waren die Stellen, wo zwei Kabel aneinander gelötet werden.

Schrumpfschlauch herum, nur nicht zu lange mit dem Feuerzeug behandeln

Ich hatte fast immer die passenden Schrumpfschläuche da. Ein wenig bunt wirkt es jedoch schon, da ich nicht immer die entsprechende Farbe wählen konnte.

Fertig ist der Verteiler

Das löten erwies sich als sehr langwierig, dafür ist es nun ordentlicher geworden. Jedoch stellte ich fest, dass mir meine Kabelbinder ausgegangen sind. Dies ist zwar nicht kritisch, da es gerade noch reichte die Regler festzuspannen, dennoch könnten es doch ein paar mehr sein. Wie dem auch sei...

Stat mit dem "wie das andere hieß", sind die Regler mit Kabelbinder festgezogen

Wo schon bereits der Rumpf, die Verkabelung und Elektronik bereits platz gefunden haben, fehlt es immer noch am Programmcode. Es zieht sich hin, das auf Grund verschiedener Einwirkungen mich daran hindern damit zügig fertig zu werden.
Bei einigen Sachen wie zum Beispiel mit dem Stabilisieren könnte ich sicherlich etwas fertiges im Internet finden, aber dann wäre dies nur halb so herausfordernd.

Gehäuseentwurf für Signalleuchten (Part 2)

Heute morgen sah ich mir mein Druckergebnis an und dachte: Nein, das sieht nicht nach einem Kristall aus. Also im Internet gesucht und ein T...