Übersicht

Links: hier werden sie geholfen

Dit & Dat

Entwicklungsumgebung

Windows

Icon-Größen

Temp-Verzeichnisse bereinigen

Tipps zum Windows(-DOS)-Batch-Programm CMD

AVR & avr-gcc

Eagle PCB-Layouter

LED


Bauteile-Recycling in der Pfannen

... mit dem Lötkolben


Verpolungsschutz mit P-MOSFET


C++, Was man weiß, was man wissen sollte

Initialisieren statischer Literal-Typen in einer Klassen-Definition

Zu Arduino-Tipps: s. Arduino - Tipps und Tricks: Gut zu wissen!


Links: hier werden sie geholfen

Electrical School: Ein riesengroßes Glossar zu den elektrischen Begriffen. Jeder Eintrag mit Definition, zughörigen Links und Videos.


Dit & Dat


Entwicklungsumgebung

Die Zahl der selbst geschriebenen Tools zur Unterstützung der Programmentwicklung (und auch solche an die ich anderweitig gelangt bin) nimmt zu. Diese müssen z.T. aus Batch-Dateien aufrufbar sein. Ich habe mir deshalb ein Verzeichnis angelegt, in das ich diese Programme kopiere und die Umgebungsvariable Path so angepasst, das dieses Verzeichnis im Suchpfad für die Programme ist. Pfad-Anpassung (Windows 8):

     Systemsteuerung -> System -> Erweiterte Systemeinstellungen (linke Seite).

Es erscheint der Dialog "Systemeigenschaften".

     Reiter "Erweitert" -> Schaltfläche "Umgebungsvariablen..."

Es erscheint der Dialog "Umgebungsvariablen".

     Liste "Systemvariablen" -> "PATH" -> Schaltfläche "Bearbeiten" -> Pfad auf neues Verzeichnis hinzufügen

Tipp: Inhalt der Variable per Kopieren & Einfügen in den Editor nehmen, dort bearbeiten und wieder zurück kopieren.

Wer die Programme nicht kopieren, sondern an ihrem angestammten Platz belassen möchte, kann im o.g. Verzeichnis auch Verknüpfungen (Links) zu den Programmen ablegen. Solch einen Link kann man in einer Batch-Datei aufrufen, indem man die Endung ".lnk" hinzufügt, also z.B. "MeinProgramm.lnk", wenn die Verknüpfung "MeinProgramm" heißt.


Windows

Icon-Größen

Icons für Windows-Programme sollten folgende Größen enthalten: 16, 32, 48, 256.

Icon 256 x 256 Icon 48 x 48 Icon 32 x 32 Icon 16 x 16
256 x 256 48 x 48 32 x 32 16 x 16

Leider ist nicht gut dokumentiert, welche Icon-Größe für welchen Zweck angemessen ist. Dieses Test-Icon enthält Grafiken in verschiedenen Größen. Jede Größe besitzt ein anderes Farbschema. Bindet man es in ein Projekt ein, kann man anhand des angezeigten Farbschemas erkennen, welche Icon-Größe Windows in den verschiedenen Situationen bevorzugt.

256x256 128x128 96x96 64x64 48x48 32x32 24x24 20x20 16x16 10x10
256 x 256 128x128 96x96 64x64 48x48 32 24 20 16 10

Temp-Verzeichnisse bereinigen

Viele Programme hinterlassen Rückstände, die man nicht verwahren möchte. Windows bietet zwar eine Bereinigungsfunktion, die löscht aber nur für Windows bekannte Verzeichnisse. Das folgende VB-Script löscht Verzeichnisse einschließlich der Unterverzeichnisse. Es fordert Admin-Rechte an, weil sonst kein Zugriff auf das Temp-Verzeichnis möglich ist. Geöffnete Dateien oder Verzeichnisse können nicht gelöscht. Ebenso gibt es Dateien, auf die auch der Administrator keinen direkten Zugriff hat. Auch diese Dateien verbleiben.

Das Script leert das Temp-Verzeichnis und das Build-Reste von Visual Micro.

'**************************************
'*                                    *
'*          DelTemp.vbs               *
'*                                    *
'**************************************


' Die folgenden Anweisungen bewirken, dass das Script mit Admin-Rechten ausgeführt wird.
' Ansonsten ist der Zugriff auf das Temp-Verzeichnis nicht möglich.
'--------------------------------------------------------------------------------------------------
Set WshShell = WScript.CreateObject("WScript.Shell")
If WScript.Arguments.length = 0 Then
  Set ObjShell = CreateObject("Shell.Application")
  ObjShell.ShellExecute "wscript.exe", """" & WScript.ScriptFullName & """" &   " RunAsAdministrator", , "runas", 1
  Wscript.Quit
End if


' Notwendigen Basis-Objekte instanziieren
'-----------------------------------------------------------------
Set fso = CreateObject( "Scripting.FileSystemObject" )
Set objShell = CreateObject( "WScript.Shell" )


'Temp-Verzeichnis löschen
'----------------------------------------------------------------
tempLocation=objShell.ExpandEnvironmentStrings("%TEMP%")
DeleteFolder(tempLocation)

' Visual Micro Build-Verzeichnis
'----------------------------------------------------------------
appDataLocation=objShell.ExpandEnvironmentStrings("%LOCALAPPDATA%")
DeleteFolder(appDataLocation & "\V.Micro\Arduino\Builds\")

MsgBox "Temp-Verzeichnisse gelöscht", ,"DelTemp"
'=================================================================================


' Unterprogramm zum Löschen
'-------------------------------------------------------------------
sub DeleteFolder(FolderName)
  Set folder = fso.GetFolder(FolderName)

  ' Alle Dateien im angegebenen Verzeichnis löschen
  for each f in folder.Files
    On Error Resume Next
      f.Delete True
    On Error GoTo 0
  Next

  ' Alle Unterordner mitsamt der enthaltenen Dateien löschen
  For Each f In folder.SubFolders
    On Error Resume Next
      f.Delete True
    On Error GoTo 0
  Next
end sub

Die Anpassung des Scripts ist sehr einfach. Sollen weitere Verzeichnisse gelöscht werden, muss nur eine zusätzliche Zeile eingefügt werden.

DeleteFolder(<Verzeichnis-Name>)

Die Pfade zu den Spezial-Verzeichnissen können entweder über die Umgebungsvariablen ermittelt werden (s.o.) oder werden von einem WshShell-Objekt über die Eigenschaft SpecialFolders bereit gestellt.


Tipps zum Windows(-DOS)-Batch-Programm CMD

Siehe Windows Batch: How to ...


AVR & avr-gcc


EAGLE PCB-Layouter


LED

Eine LED schließt man so an:

LED Aufbau
aus Wikipedia LED
SMD-LED LED-Anschluss

R1..R8 > (VCC - UF) / IF
VCC: Versorgungsspannung
UF: Flussspannung (forward voltage, 1,5 V falls nicht bekannt)
IF: Betriebsstrom (forward current)
Bespiel: VCC = 5V, Betriebsstrom der LED 20 mA: R > (5 V - 1,5 V) / 0,02 A > 175 Ω. Zu wählen wären 180 Ω, 200 Ω oder 220 Ω.

RB0..RB2: 1..10 kΩ

Anschluss einer Duo-LED

Signal-Anzeige

Mit einer Duo-LED (s.o.) kann man, wenn nur ein µC-Pin zur Verfügung steht, auf einfache Weise drei Zustände signalisieren: Farbe 1, Farbe 2 und aus.

Ist man knapp mit Pins, bestehen weitere Möglichkeiten. Die LED muss nicht die ganze Zeit leuchten. Man kann sie blinken lassen und das auch noch in verschiedenen Rhythmen. Allerderdings sollte man hier nicht übertreiben. Der "gemeine User" ist mit nicht deutlich unterscheidbaren Rhythmen schnell überfordert. Bewährt hat sich folgende Kombination:

Bei einer Duo-LED kann man noch weitere ablesbare Kombinationen finden.

Eine einfache Möglichkeit besteht darin, einen weiteren µC zu nutzen und diesen seriell an den ersten anzubinden. Auch hier wird nur ein Pin benötigt. Hier bestehen dann nahezu unbegrenzte Möglichkeiten.

Hat man mindestens zwei Pins zur Verfügung, kann auch ein Schieberegister verwendet werden. Je ein Pin ist für "Clock" und "Data" notwendig.

Ein simples Programm, dass eine LED passend blinkend lässt (ich hoffe, der Optimizer macht etwas ordentliches daraus):

enum 
{ LedSteady, 
  LedBlink, 
  LedFlash, 
  LedFlashBlink, 
  LedOff} LedState = LedFlashBlink;

int main(void)
{ DDR(PORTB) |= _BV(LED);
  
  while(1) // forever
  {  // LED blinken
    for(uint8_t i=0; i<20; i++)
    { switch(LedState)
      { case LedSteady:
             PORTB |= _BV(LED); // permanent leuchtend
             break;
        case LedBlink:
             if(i < 12)         // blinken
               PORTB |= _BV(LED);
             else
               PORTB &= ~_BV(LED);
             break;
        case LedFlash:
             if(i < 1)          // blitzen
               PORTB |= _BV(LED);
             else
               PORTB &= ~_BV(LED);
             break;
        case LedFlashBlink:     // abwechselnd blitzen und blinken 0: an, 1...5: aus, 6..14: an, 15..19: aus
             if ((i < 1) || (i >= 6 && i <= 14)) // an
                PORTB |= _BV(LED);
              else 
                PORTB &= ~_BV(LED);
           break;
        case LedOff:
             PORTB &= ~_BV(LED);
             break;
      } // switch (State)
    _delay_ms(50);
    } // for
  } // while(1)
}

Bauteile-Recycling in der Pfanne

In einer c't Hardware-Hacks fand ich ein Artikel, bei dem SMD-Platinen mit Hilfe eine Pizza-Pfanne verlötet werden (auch einmal bei Google schauen). Zum Entlöten geht's auch einfacher: Eine alte Pfanne, ein wenig gesiebter Sand und eine geregelte Kochplatte ...

Platine aufheizen Die meisten Bauteile sind entnommen und... ... die entnommenen Teile

Die Herdplatte ist ein geregelte Platte in einem Ceranfeld. Der gibt es Platten mit kleinerem und größerem Durchmesser. Ich habe die größere benutzt. Der Einstellknopf hat eine Skala von 0 bis 12 mit einer Einrastung bei 8. Eine günstige Stellung ist 7. Das halsten die meisten auf der Platine enthaltenen Kunststoffteile aus ohne zu schmelzen. Darunter schmilzt der Zinn.

Etwas feinen Sand einfüllen. Ich habe etwas aus dem Sandkasten gesiebt.

Zum Aufheizen, deckt man die Pfanne am besten ein wenig ab. Das Vorheizen dauert etwa 15 Minuten. Danach die zu entlötende Platine etwas in den Sand drücken und für 3-4 Minuten aufheizen (mit Deckel). SMD-Komponenten kann man dann einfache mit einer Pinzette abheben.

Hinweise:

Bauteile-Recycling mit dem Lötkolben

Bei Ulrich Radig fand ich dem Tipp, wie man mit Hilfe einer einfachen Einmal-Kanüle auf einfache Art und Weise "Vielbeiner" aulöten kann. Ich hab's mit einer Kanüle der Größe 0,90mm x 40mm (gelb) benutzt. Vorher habe ich wie empfohlen die Spitze abgeschliffen. Nach dem vierten Beinchen hat man dann genügend Übung und es geht recht flott. Ein bisschen verbessern kann man das Ganze noch. Ich habe den Kanülen-Kanal vorsichtig mit einem 8 mm Bohrer per Hand "aufgetrichtert". So ist es einfacher, die Kanüle über das Beinchen zu schieben.

Will man "normale" Bauteile, wie Widerstände, Kondensatoren o.ä., ist ein Werkzeug praktisch, mit dem man das Teil aushebeln kann. Ich habe hierzu in die Klinge eines einen alten Schraubendrehers einen Schlitz gefräst (mit einem Mini-Drill). Wie's geht zeigt das Foto:

Angefräster Schraubendreher als Hebelwerkzeug Benutzung des Hebelwerkzeugs

Verpolungsschutz mit P-MOSFET

Bei Arduino & ESP8266 stuff habe ich diesen Tipp für einen effektiven Verpolungsschutz gefunden: Reverse polarity protection with a P-MOSFET.

Der Verpolungsschutz kann mit einer einfachen Diode ausgeführt werden. Das Problem dabei ist jedoch der Spannungsabfall (normalerweise 600-800 mV), der nicht in jeder Schaltung akzeptabel ist und der bei großen Strömen zu einer erheblichen Verlustleistung an der Diode führt. Bei einem Strom von etwa 2 A sind dies 1,6 Watt, die in Wärme umgesetzt werden.

Die Verwendung einer Skottky-Diode mit einem kleineren Spannungsabfall ist riskant, da der Rückstrom durch eine Skottky-Diode nicht vernachlässigbar ist.

Ein besserer Weg besteht darin, einen P-MOSFET zu verwenden, wie in der folgenden Schaltung gezeigt wird. Diese Methode wird in diesem Afroman Youtube-Video sehr gut erklärt.

Verpolungsschutz mit P-MOSFET

Obwohl die Nutzung eines P-FETs ein wenig abwegig erscheinen mag, sollte man sich bewusst sein, dass ein FET, wenn VGS im leitenden Bereich ist, im Prinzip als Schalter arbeitet, d.h. als Widerstand mit sehr niedrigem Widerstandswert, der Strom in beide Richtungen zulässt.

Man muss einen FET mit niedrigem VGS(Threshold) auswählen, so dass das Gerät auch bei niedrigen Batteriespannungen noch eine genügend große Spannung zum Durchschalten des Transistors aufweist. Weiterhin sollte der FET einen niedrigen Durchlasswiderstand RDS(on) besitzen, damit am FET auch beim Spitzenstrom weniger als 100mV Spannungsabfall entstehen. Ebenfalls muss darauf geachtet werden, dass die Versorgungsspannung (Vsource)  die maximale Gate-Source-Spannung (VGSS) und die maximale Drain-Source-Spannung (VDSS) nicht überschreitet.

Mögliche Kandidaten sind:

Symbol Kennwert FQP4706 DMG3415U
VDSS Drain-Source Voltage -60 V -20 V
VGSS Gate-Source Voltage ±25 V ±8 V
VGS(th) Gate Threshold Voltage -4,0 … -2,0 V -0,3 … -0,1V
RDS(on) Static Drain-Source On-Resistance 0,026 Ω 0,071 Ω

Alternativ besteht die Möglichkeit, die Gate-Spannung bei zu niedriger VGSS durch eine Zener-Diode zu begrenzen:

Verpolungsschutz mit Begrenzung der Gate-Spannung

C++, was man weiß, was man wissen sollte!

Initialisieren statischer Literal-Typen in einer Klassen-Definition

Nicht alle als statisch deklarierte Membervariablen einer Klasse kann man mit einem konstanten Wert initialisieren. Seit C++11 gibt es eine Neuerung. Nun kann man fast alle Literal-Typen, die der Kompiler zur Kompilierungszeit auflösen ebenfalls initialisieren. Statt des Schlüsselworts const muss man constexpr verwenden.

C++ constexpr

Nicht-Literal-Typen muss man nach wie vor im Code initialisieren. Für deren Initialisierung muss (ggf. auch implizit) ein Konstruktor aufgerufen werden. Dies kann nicht zur Kompilierungszeit geschehen.