Übersicht
Links: hier werden sie geholfen
Tipps zum Windows(-DOS)-Batch-Programm CMD
Bauteile-Recycling in der Pfannen
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!
Electrical School: Ein riesengroßes Glossar zu den elektrischen Begriffen. Jeder Eintrag mit Definition, zughörigen Links und Videos.
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.
Icons für Windows-Programme sollten folgende Größen enthalten: 16, 32, 48, 256.
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.
256 x 256 | 128x128 | 96x96 | 64x64 | 48x48 | 32 | 24 | 20 | 16 | 10 |
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.
Siehe Windows Batch: How to ...
volatile uint8_t * Port = &PORTB;
...
*Port = 0xFF; // Alle Pins von PORTB auf 1
aus Wikipedia LED |
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Ω
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) }
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 ...
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:
Je nach dem, was auf der Platine verbaut wurde, können sich beim erhitzen stickenden oder gar giftige Gase entwickeln. Deshalb unbedingt auf gute Lüftung achten!
Bauteile auf der Unterseite, bei manchen Platinen auch die auf der Oberseite sind angeklebt. Das muss man etwas Gewalt anwenden. Dazu die Platine mit einem hitzefesten Gegenstand nach unten drücken.
Wenn Bauteile in den Sand fallen, bleibt immer etwas Sand daran hängen, der mühselig entfernt werden muss. Bei manchen Bauten, die durch die Hitze etwas aufweichen geht er gar nicht mehr ab. Also achtsam arbeiten.
An den Bauteilen der Seite der Platine, die in den Sand gedrückt wird, und auch auf der Platine selbst, bleibt Sand hängen. Manche der Bauteile kann man dann nicht benutzen. Also vorher schauen und die Seite mit den wertvolleren Teilen zuerst abpicken.
Sand auf dem Ceranfeld ist nicht gut! Sand ist hart und gibt Kratzer, wenn er unter die Pfanne kommt. Sand immer sofort entfernen!
Auch Standard-Bauteile lassen sich häufig gut heraus ziehen. Ggf. statt der Pinzette ein Zange nehmen. Sind die Drähte jedoch unter der Platine abgebogen ist man ziemlich chancenlos.
Empfindliche Bauteile zuerst entnehmen.
... und zu guter Letzt: ALLES IST HEISS!
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:
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.
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:
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.
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.
Die folgenden Farbwerte eignen sich für die Farben der NEO-Pixel (WS2812):
RED = (255, 0, 0)
ORANGE = (255, 34, 0)
YELLOW = (255, 170, 0)
GREEN = (0, 255, 0)
CYAN = (0, 255, 255)
BLUE = (0, 0, 255)
VIOLET = (153, 0, 255)
MAGENTA = (255, 0, 51)
PINK = (255, 51, 119)
AQUA = (85, 125, 255)
WHITE = (255, 255, 255)
OFF = (0, 0, 0)