Programmierkabel

Zur Programmierung unserer Roboter wird ein Serielle Schnittstelle, auch als RS232 bezeichnet, verwendet. Früher waren diese praktisch an jedem Computer vorhanden, aber inzwischen wurden sie von USB-Schnittstellen verdrängt. Es gibt aber preiswerte Adapter von USB auf RS232. Einen solchen verwenden wir auch in der AG. Allerdings benötigt man unter Windows immer auch einen geeigneten Treiber.

Hier soll eine Liste entstehen von geeigneten, preiswerten Adaptern, jeweils mit den passenden Treibern. Bitte sagt Bescheid, wenn Ihr weitere Informationen dazu habt, dann erweitere ich die Liste.

NameChipsatzQuelle, NrTreiberBemerkung
Prolific USB-to-Serial COM PortProlific 2303 KlonPollin
EAN: 4049702000549
Treiber_PL2303.zipHaben wir in den letzten Jahren erfolgreich in der AG verwendet. Allerdings muss ein alter Treiber installiert werden, da der neue sich weigert, mit dem Klon zusammenzuarbeiten
USB-Adapterkabel auf SeriellProlific 2303 KlonPollin,
Bestellnr.: 721034
EAN: 4049702016779
siehe "Prolific USB-to-Serial COM Port"kompatibel zu "Prolific USB-to-Serial COM Port"
USB2.0 TO RS232 CONVERTORCH340/CH341Pollin,
Bestellnr.: 721034
EAN: 4017538025821
https://www.pollin.de/productdownloads/D721034S.ZIPNICHT ZU EMPFEHLEN!
Ließ sich mit keinem Treiber zum Laufen bringen.
Achtung: hat dieselbe Bestellnummer wie der obige Adapter, der problemlos funktioniert!
TODO: unter Linux ausprobieren

 

 

Maximale Programmgröße

Aufgrund einer Fehlfunktions eines Roboters ergab sich neulich die Frage, wie groß das Programm unserer Roboter eigentlich maximal sein darf, damit es noch fehlerfrei arbeitet.

Das hängt natürlich zuerst vom verwendeten Mikrocontroller ab. Bei uns ist das ein ATtiny44A von Microchip (früher Atmel). Dieser hat eine Flash-Speichergröße von 4 Kilobytes, also 4096 Bytes; in Hexadezimaldarstellung 0x1000.

Allerdings verwenden wir einen Bootloader, über den sich das Programm einfach über die Serielle Schnittstelle, also unser Programmierkabel, aufspielen lässt. Dieser Bootloader muss dauerhaft im Flash-Speicher bleiben und benötigt schon alleine ein Kilobyte für sich, also bleiben für unser Programm nur 3 Kilobyte übrig, also hex 0x0C00.

Das reicht für unsere Zwecke im allgemeinen aus. Es könnte jedoch dann knapp werden, wenn wir viele alte „Programme“ als eigene Befehle speichern. Auch wenn wir diese nicht mehr wirklich aufrufen, verbrauchen sie doch den kostbaren Speicher.

Sollte es also eng werden, können wir nicht mehr benötigte Befehle mit:

#if 0

und

#endif

umschließen, dann werden sie vom Compiler wie Kommentare behandelt, also nicht übersetzt.

Aber woran kann man erkennen, dass das Programm zu groß wird? Leider warnt uns der Compiler beim Aufruf von „Tools->Make All“ nicht, denn unverständlicherweise geht er von einem maximalen Speicher von 8 Kilobytes aus. Aber spätestens beim Flashen („Tool->Program“) bekommen wir folgende Fehlermeldung, wenn außerhalb des erlaubten Bereichs geschrieben werden soll:

Bitte Zielsystem einschalten!
loeschen:
File einlesen:
First = 0x0000, Last = 0x0C0B
flashen:
Exception: Fehler-Antwort auf WRITEFLASH: 3

Wenn man näher hinsieht, kann man auch an der Ausgabe mit „Last =“ sehen, wie groß das Programm tatsächlich ist, und zwar in Hexadezimaldarstellung. Im Beispiel sieht man also, dass das Programm um 0x000B, also 11, Bytes zu groß ist.

Wir können also sicher sein: wenn das Programm ohne Fehlermeldung geflasht wurde, dann funktioniert es auch so, wie wir es programmiert haben.

8-facher USB-Lader

Idee

Seit wir in der Robotik-AG Power-Banks als Stromversorgung verwenden, brauchen wir auch eine Möglichkeit, diese aufzuladen. Dafür haben sie eine Micro-USB-Buchse wie auch bei Handys üblich. Natürlich kann man mehrere preiswerte Handy-Ladegeräte anschaffen und in eine lange Steckerleiste einstecken, aber je nach Steckerleiste blockieren sie sich eventuell gegenseitig und irgendwie fehlt es dabei am Coolness-Faktor. Die Idee ist daher, einen 8-fach-Lader zu bauen, also ein Ladegerät, mit dem man bis zu 8 Roboter gleichzeitig laden kann:

Dabei können auch gleich die Reste der Mini-USB-Verlängerungskabel verarbeitet werden, die beim Bau der Roboter-Stromversorgungen durch die Power-Banks anfielen.

Natürlich soll das Gerät nicht nur 8 Mini-USB-Kabel zum Laden der Roboter bieten, sondern auch jeweils eine Duo-LED zum Anzeigen des Ladezustands, damit man sehen kann, ob der Akku leer (rot), fast voll (orange) oder voll ist (grün). Dabei wird diese Anzeige einfach von der Höhe des Ladestroms abhängig gemacht, der bei jedem Anschluss über einen Shunt gemessen wird. Nun könnte man natürlich eine Menge von Operationsverstärkern oder Komparatoren verbauen, mit sorgfältig eingestellten Schaltschwellen und – viel Lötarbeit.

Stattdessen verwenden wir hier einfach preiswerte Mikrocontroller-Module, die gerade bei Pollin sehr preiswert erhältlich sind, und die sowieso einmal ausprobiert werden wollten. Da ein Modul nicht genug Pins für alle 8 Ladestrom-Messungen und 8 Duo-LEDs hat, verwenden wir eben zwei Module, wobei jedes für 4 Ladestrom-Messungen und 4 LEDs zuständig ist. Die Firmware der beiden Module ist exakt gleich.

Bauteile

Nein, es hat keinen Sinn, es zu leugnen: ich bin Pollin-Fan! Nein, ich werde für diese Aussage leider nicht bezahlt, sondern sage das ganz freiwillig. Man kann immer wieder recht nützliche und preiswerte Bauteile finden, die auch einen gelegentlichen Fehlkauf wettmachen. Leider sind sie meist nur kurzzeitig verfügbar, wodurch folgende Liste der verwendeten Bauteile vermutlich nicht lange gültig sein wird:

StückBezeichnungQuelleBestell-Nr.Schaltplan
1Schaltnetzteil ASTEC LPS42, 5 V-/11 APollin351986
2Entwicklungsboard ATMEL ATmega168PAPollin810366MOD1, MOD2
8USB 2.0 Verlängerungskabel HAMA 54557, Micro-USB, 0,75 m, schwarzPollin712878
1Euro-Netzkabel mit ZugentlastungPollin562065
10Widerstand 0,1 Ohm, Belastbarkeit mind. 1AR17 .. R24
16Widerstand 150 OhmR1 .. R16
8Duo-LED, rot/grün, gemeinsame KathodeLD1 .. LD8
3Widerstand 1,2 kOhmR25, R27, R29
2Widerstand 2,2 kOhmR26, R30
1Wannenstecker, gerade, 6-poligPollin451166JP17
4Buchsenleiste 1x12
4Stiftleiste 1x12
2Stiftleiste 1x3JP18 .. JP19
2JumperUmschaltung SCK und RST
Flachbandkabel 34pol.
1Wannenstecker, gerade, 34-poligSV1
1Pfostenbuchse für Flachbandkabel, 34-poligSV2
16LötnägelJP1 .. JP16
1PunktrasterplatinePollin440260
1Universal-Gehäuse 180 x 205 x 70 Polystyrol (EPS) SchwarzConrad523380
1Polystyrolplatte, glatt, klar, 2mmtoom
versch. Schrauben, Unterlagscheiben, Distanzbolzen

Schaltung

Die Schaltung ist recht einfach und verzichtet sogar auf eine Glättung der über die Shunts gemessenen Spannungen. Im oberen Teil des Schaltplans ist das Verbindungskabel zu den Duo-LEDs zu sehen. Dafür wurde ein altes 34-poliges Festplattenkabel verwendet. So lässt sich die Platine einfach von den Duo-LEDs trennen. Ganz unten sind mit JP1 bis JP16 die Lötstifte bezeichnet, an welche die USB-Kabel zum Laden der Power-Banks gelötet wurden. Darüber liegen die 8 Shunt-Widerstände R17 bis R24. Bei ihrem Wert von 0,1 Ohm fallen bei einem erwarteten maximalen Ladestrom von 1 A also 0,1 Volt ab, was von den Power-Banks sicher toleriert wird. Diese Spannung wird direkt von den Mikrocontrollern gemessen, ohne Signalverstärkung oder Glättung. Die Widerstände R1 bis R16 sind die Vorwiderstände für die Duo-LEDs. Sie wurden so bemessen, dass nur ca. 10 mA durch die LEDs fließen, um den Mikrocontroller nicht zu sehr zu stressen. Zwar kann jeder Port-Pin durchaus 20 mA treiben, aber insgesamt dürfen pro Port gewisse Grenzen nicht überschritten werden.

MOD1 und MOD2 sind die beiden Mikrocontroller-Module, die mit einpoligen Stiftleisten versehen und in entsprechende Buchsenleisten auf der Platine eingesteckt wurden. Solche Module sollte man besser nie direkt einlöten. JP17 bildet einen 6-poligen Standard ISP-Stecker zur Programmierung von Atmel AVR-Controllern. Dabei ist allerdings zu beachten, dass diese Schnittstelle normalerweise mit 5V-Pegeln arbeitet (zumindest meine selbstgebauten Programmer), daher werden die Pegel mit den Widerständen R25/R28 und R29/R30 auf 3,3 Volt-Niveau abgesenkt. Bei RST war das so nicht möglich, da der auf Masseseite liegende Widerstand einen Dauer-Reset verursacht hätte, wenn kein Programmer angeschlossen ist oder dieser kein aktives High-Signal liefert. Daher ist nur R27 vorhanden, der zumindest einen eventuell zu hohen Pegel im Strom begrenzt. Über JP18 und JP19 wird selektiert, welcher der beiden Mikrocontroller an der ISP-Schnittstelle hängt. Da die Signale MOSI und MISO vom Programm nicht verwendet werden, also hochohmig sind, können sie jeweils direkt miteinander verbunden werden. Nicht so SCK, das auch für die auf dem Modul liegende rote LED verwendet wird und dadurch jeweils vom anderen Mikrocontroller gestört würde. Zum Umschalten der ISP-Schnittstelle zwischen den beiden Mikrocontrollern müssen immer beide Jumper auf 1-2 (linker Controller) oder 2-3 (rechter Controller) gesetzt werden.Die 5V-Versorgung stammt vom eingebauten Schaltnetzteil und muss zu den USB-Leitungen hin möglichst dick ausgeführt werden.

Aufbau

Da die Befestigungslöcher von Gehäusen meist nicht für die beabsichtigten Module und Platinen passen, wurde eine durchsichtige Plastikplatte aus Polystyrol vom Baumarkt als Trägerplatte zurechtgesägt und mit Befestigungslöchern versehen, so dass darauf das Netzteil und die Elektronikplatine montiert werden konnte. Zur Sicherheit wurde als Berührungsschutz über dem Netzteil noch eine etwas kleinere Platte angebracht.

Die elektronischen Bauteile wurden ungefähr so platziert, wie sie auch im Schaltplan dargestellt sind:

Software

Das Programm (main.c) wurde auf Eclipse mit dem „AVR Eclipse Plugin“ erstellt und kompiliert. Es sollte durch die Kommentare im Sourcecode selbsterklärend sein. Die Fuses wurden folgendermaßen gesetzt:

Fuse = 0xFF
Fuse High = 0xDD
Fuse Ext = 0xF9   (kein Bootloader, entspricht Atmel Hersteller-Einstellung)
Lock = 0xFF

 

Die Fuses der CPU-Module waren schon von Anfang an passend für die Hardware gesetzt (3,3Volt Versorgung, externer 16MHz-Quarz) und es war ein Bootloader konfiguriert (Fuse Ext = 0xF8). Da wir keinen solchen verwenden, setzen wir Fuse Ext auf 0xF9.

neues Flasher-Programm

Eine Schwachstelle beim bisher verwendeten Flasher-Programm, also dem Programm, mit dem unser selbst erstelltes Programm auf den Roboter aufgespielt wird, besteht darin, dass das Programmierkabel in einer ganz bestimmten USB-Buchse stecken muss, sonst wird es nicht erkannt. Das ist zwar bei den Schul-PCs kein Problem, denn da alle gleich sind und wir das Kabel immer in dieselbe Buchse stecken, passt es zusammen. Aber was ist, wenn die USB-Buche defekt ist und Ihr eine andere verwenden müsst? Oder wenn im PC die Buchsen unterschiedlich verdrahtet sind, was anscheinend auch schon vorgekommen ist.
Das gleiche Problem werdet Ihr haben, wenn Ihr Euren eigenen PC zuhause verwenden wollt, denn da sind die USB-Buchsen sicher wieder anders nummeriert.

Bisher musste man dem Programm die Nummer des Anschlusses mitteilen, in dem das Kabel steckt. Das passiert durch Angabe eines entsprechenden Parameters beim Aufruf des Programms, und zwar in der Datei „Makefile“. Hier wird „–serial=COM3“ angegeben, also sozusagen die dritte USB-Buchse (so ungefähr). Ich habe nun das Programm so geändert, dass es sich die richtige Buchse einfach selbst suchen kann. Dazu probiert es ab COM3 aufsteigend bis COM32, ob an einer der Buchsen das Programmierkabel steckt. Das erste gefundene wird dann verwendet.
Dabei gibt’s aber einen kleinen Haken: das Suchen dauert eine kurze Zeit und zwar ca. eine viertel Sekunde. Steckt das Kabel also in einer „niedrigen“ Buchse, ist praktisch keine Verzögerung erkennbar. Steckt es aber in einer höheren Buchse, z.B. COM9, kann es ein paar Sekunden dauern, bis es gefunden wird und die Übertragung gestartet wird. Es kann also nicht schaden, nach dem Starten der Übertragung ca. 5 Sekunden zu warten bevor der Roboter eingeschaltet wird, so dass das Programm auf jeden Fall schon die Übertragung gestartet hat bevor der Mikrocontroller im Roboter hochfährt.
Das neue Flash-Programm kann hier heruntergeladen werden. Es muss ins Projektverzeichnis abgelegt werden und dabei das dort schon vorhandene „flasher.exe“ überschreiben.
Außerdem muss in der Datei „Makefile“ der Aufrufparameter „–serial=COM3“ entfernt werden, sonst wird doch wieder der dort angegebene Anschluss verwendet anstatt dass er automatisch gesucht wird.

Eagle 8.5 unter Linux installieren

Im Gegensatz zu Version 7.1 lässt sich die 8.5 ganz einfach installieren, wobei wahrscheinlich auch die inzwischen upgedatete Ubuntu-Version 16.04 hilfreich ist. Allerdings ist neuerdings die Registrierung bei Autodesk notwendig.

  1. TAR-Paket von Eagle-Website herunterladen
  2. an beliebige Stelle entpacken
  3. Datei „eagle“ im entpackten Verzeichnis starten
  4. Rechtsklick auf eines der in der Startleiste erscheinenden Programm-Icons und „im Starter behalten“ (oder so) auswählen

neue Datei Makefile

Leider hat sich herausgestellt, dass es bei Verwendung des Server-Laufwerks ein Problem beim Programmieren des Mikrocontrollers gibt. Das fürs Programmieren aufgerufene Batch-File kommt mit dem Serverlaufwerk nicht zurecht. Daher probieren wir mal, das Flash-Programm direkt aufzurufen, ohne Umweg über das Batch-File.
Dazu müsst Ihr diese Datei Makefile herunterladen und die im Projekt-Verzeichnis schon vorhandene Datei überschreiben.

Programmer’s Notepad (WinAVR) verliert Fenster

Manchmal bekommt man es hin, dass Fenster des Programmer’s Notepad verschwinden, z.B. das „Output“-Fenster, in dem die Ausgaben des Compilers stehen. Das liegt daran, dass sich die einzelnen Teilfenster aus dem Fensterverbund lösen und als Einzelfensterchen an beliebige Positionen verschieben lassen. Wenn man sie dabei nach ganz unten schiebt, kann es passieren, dass sie nur noch so schmal sind, dass man sie fast nicht mehr sieht oder dass sie sogar von der Taskleiste verdeckt werden.
Leider werden die Einstellungen beim Beenden des Programms gespeichert, so dass auch ein Neustart nichts bringt.
Findet man solch ein Fenster absolut nicht mehr, kann man alle diese Fenstereinstellungen löschen. Man muss dann zwar die Fenster wieder öffnen und platzieren, aber sie sind wenigstens wieder zugreifbar.
Dazu muss die Datei „WinAVR-20100110\pn\settings\UserSettings.ini“ in einen Editor geladen werden. Sie fängt ungefähr so an:

[Schemes]
NewestScheme=129074025520000000
[Interface Settings\default\General]
SM_CXSCREEN=00 04 00 00                                                               
SM_CYSCREEN=00 03 00 00                                                               
[Interface Settings\default\MainWindow]
placement=2c 00 00 00 02 00 00 00 03 00 00 00 ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff 84 00 00 00 84 00 00 00 84 03 00 00 b2 02 00 00                                                               
[Interface Settings\default\MainWindow\Wnd-0xfffffffe]
Wnd-0xfffffffa=a8 01 07 00 a6 01 07 00 04 00 00 00 05 00 00 00 00 00 00 00 00 00 00 00 b4 00 00 00 0c 02 00 00 00 00 00 00 00 00 00 00 00 00 00 00 b4 00 00 00 90 01 00 00 00 00 00 00 00 00 00 00 
Wnd-0xfffffffb=ca 01 07 00 c8 01 07 00 04 00 00 00 04 00 00 00 00 00 00 00 00 00 00 00 96 00 00 00 00 04 00 00 00 00 00 00 00 00 00 00 00 00 00 00 96 00 00 00 64 00 00 00 01 00 00 00 01 00 00 00 
Wnd-0xfffffffc=ea 01 0b 00 62 01 0a 00 04 00 00 00 07 00 00 00 00 00 00 00 00 00 00 00 b4 00 00 00 0c 02 00 00 01 00 00 00 00 00 00 00 00 00 00 00 b4 00 00 00 90 01 00 00 00 00 00 00 00 00 00 00 
Wnd-0xfffffffd=d2 01 07 00 dc 01 05 00 04 00 00 00 17 00 00 00 00 00 00 00 00 00 00 00 b4 00 00 00 0c 02 00 00 00 00 00 00 00 00 00 00 00 00 00 00 b4 00 00 00 90 01 00 00 00 00 00 00 00 00 00 00 
Wnd-0xfffffffe=dc 01 05 00 90 01 09 00 04 00 00 00 07 00 00 00 00 00 00 00 00 00 00 00 b4 00 00 00 0c 02 00 00 00 00 00 00 00 00 00 00 00 00 00 00 b4 00 00 00 90 01 00 00 01 00 00 00 01 00 00 00 
Wnd-0xffffffff=c8 01 07 00 ca 01 07 00 04 00 00 00 14 00 00 00 00 00 00 00 00 00 00 00 96 00 00 00 00 04 00 00 01 00 00 00 00 00 00 00 00 00 00 00 96 00 00 00 64 00 00 00 01 00 00 00 01 00 00 00 
[Interface Settings\default\MainWindow\Wnd-0xffffffff]
band0=50 00 00 00 63 03 00 00 04 02 00 00 00 00 00 00 d4 d0 c8 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 20 00 00 00 13 00 00 00 a1 00 00 00 00 00 00 00 00 eb 00 00 00 00 00 00 00 00 00 00 00 00 00 00 94 00 00 00 00 00 00 00 00 00 00 00                                                               
band1=50 00 00 00 63 03 00 00 05 02 00 00 00 00 00 00 d4 d0 c8 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 17 00 00 00 17 00 00 00 90 00 00 00 00 00 00 00 01 eb 00 00 00 00 00 00 00 00 00 00 00 00 00 00 83 00 00 00 00 00 00 00 00 00 00 00                                                               
band2=50 00 00 00 63 03 00 00 04 02 00 00 00 00 00 00 d4 d0 c8 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 17 00 00 00 17 00 00 00 88 00 00 00 00 00 00 00 02 eb 00 00 00 00 00 00 00 00 00 00 00 00 00 00 7b 00 00 00 00 00 00 00 00 00 00 00                                                              

Jede der hier hervorgehobenen Zeilen beschreibt die Position eines der Fenster. Wenn man nicht weiß, welche Zeile für das eine fehlende Fenster zuständig ist, kann man sie einfach alle löschen. Vorher muss man natürlich Programmer’s Notepad beenden. Nach erneutem Start müssen die interessierenden Fenster über das Menü „View->Window“ eingeschaltet und durch Verschieben an den gewünschten Rand eingepasst werden. Das Output-Fenster wird durch <F8> ein- und wieder ausgeschaltet.

« Older Entries Recent Entries »