Jan 19

HowTo: AVR in C programmieren mit Eclipse

Veröffentlicht von Benibr


Eclipse ist eine sehr mächtige IDE fürs Programmieren in allen möglichen Sprachen. Beim Versuch alle meine Projekte in einer Programmierumgebung zusammen zufassen bin ich darauf gekommen, dass das Programmieren von AVRs mit Eclipse sehr einfach ist. Ich habe hier kurz zusammengetragen was fürs AVR-C Programmieren in Eclipse notwendig ist.
Ich nutze hierfür Ubuntu 11.10 und Eclipse Indigo (3.7.1) das hier heruntergeladen werden kann.

Zusätzlich sollten noch folgende Packete installiert werden: avr-gcc avr-libc gcc binutils-avr libc6 libc6-dev libc6-dev-i386 avrdude

sudo apt-get update sudo apt-get install avr-gcc avr-libc gcc binutils-avr libc6 libc6-dev libc6-dev-i386 avrdude
sudo apt-get upgrade 
Select Programmer

Select Programmer

Wenn man Eclipse dann startet, kann man gleich von dem tollen neuen programmeigenen Packetmanager Gebrauch machen.
Unter Help ->  Eclipse Marketplace findet man mit dem simplen Suchbegriff “AVR” sofort, das AVR Eclipse Plugin! Ist dies installiert sollte man Eclipse einmal neustarten.

Nun gilt es noch einige Einstellungen vorzunehmen. Unter Window -> Preferences  -> AVR -> AVRDude wird der Programmer angegeben mit dem der Microcontroller geflasht werden soll. Anschließend sollte unter AVR -> Paths überprüft werden, ob Eclipse den Pfad für “AVR-GCC”, “AVR Header Files” und “AVRDude” richtig erkannt hat. Wenn nicht ist vermutlich etwas bei der Insallation der oben aufgeführten Packete fehlgeschlagen. Ansonsten: Apply und dann OK
Anlegen einer Source File

Anlegen einer Source File

Nun können wir mit File -> New ->  C Project ein neues Project erstellen, Name und Ort sind selbsterklärend und als Projekttyp wird “AVR Cross Target Aplication” ausgewählt. Der nächste Schritt bietet uns nun die Möglichkeit die zwei Standardkonfigurationen “Debug” und “Release” anzuwählen. Wenn ihr euch unsicher seid wählt einfach nur Release. In den meisten Fällen reicht das.
Unter  Advanced settings -> AVRDude sollte noch der vorher angelegte Programmer ausgewählt werden, falls dies nicht schon automatisch der Fall ist.  Achtung! Häufiger Fehler: Apply und dann OK.


Auf der nächsten Seite kann man nun den Prozessortyp und die Arbeitsfrequenz einstellen. Fertig! Das Programmieren kann beginnen. Alle Einstellungen können unter Project -> Properties noch im Nachhinein verändert werden.

Mit File -> New -> Source File bzw. Header File können Dateien zu Projekt hinzugefügt werden. Schreibt euren Code und wählt Project -> Build All aus. Wenn er keine Errors beim Kompilieren gibt, könnt ihr anschließen euer Programm mit
AVR -> Upload Project to Target Device auf euren Microcontroller flashen.

Auch wenn für Anfänger Eclipse auf den ersten Blick ein wenig nach Overkill aussehen mag so bietet es doch alle Möglichkeiten die man sich wünschen kann in einer netten grafischen Oberfläche an.

Viel Spass

Flash µC
Flash µC

Update: Ein häufig auftretendes Problem ist, dass AVRDude root-Rechte benötigt um auf den Controller zu schreiben. Dies ist zum Beispiel der Fall bei dem USB zu ISP Wandler den ich benutze (USBasp).
Zur Lösung des Problems muss man eine neue udev Rule anlegen, mit folgendem Befehl:

sudo gedit /etc/udev/rules.d/45-USBasp.rules

In diese Datei wird folgender Inhalt eingetragen:

SYSFS{idVendor}=="16c0", SYSFS{idProduct}=="05dc", GROUP="plugdev", MODE="0660"

Und anschließend muss udev noch neugestartet und der Programmer aus- und wieder eingesteckt werden.

sudo restart udev

 

Quelle: http://78.46.161.153/wiki/index.php?n=Linux.Udev4User

Dec 23

Hardware setup

Die Idee hinter der Hardware des CarPCs war, das Ganze möglichst kostengünstig mit bereits vorhandenen Teilen zu realisieren. Deshalb sind einige der Komponenten nicht wirklich optimal. Außerdem hatte ich mir zum Motto gemacht im Zweifelsfall die Dinge lieber selbst zusammenzubasteln als etwas fertiges zu kaufen.

Der Rechner selbst ist ein ASUS EeePC 1000H der wegen eines gesprungenen Display ausgemustert wurde. Um im Auto selbst Platz zu sparen wurde lediglich die Hauptplatine mit der Festplatte eingebaut. Die 160GB Festplatte ist mit SATA direkt auf der Platine angeschlossen und mit Heißkleb fixiert. Zur Kühlung des Netbooks wurde entfernt und durch eine Metallplatte, die auf dem Prozessor (Intel Atom) und dem Chipsatz der Motherboards aufliegt, ersetzt.

Das Auto in dem der CarPC verbaut wird ist ein Nissan Primera. Hier gibt es ein kleines, flaches Fach unter dem Lenkrad, in das die Platine hinein passt. Lediglich für die Stecker die rund um die Platine eingesteckt werden benötigen mehr Platz. In dem Plastik oberhalb des Fachs wurde zusätzlich ein kleiner Lüfter angebracht der die Luft über der Kühlungsmetallplatte in Bewegung hält. Die Kühlung ist auch ohne Kühlrippen ausreichend, das die Wärmeentwicklung so gering ist.

Die Stromversorgung gestaltete sich relativ kompliziert, da der EeePC zwar 12 V Eingangsspannung braucht aber die Spannung des Bordnetzes im Auto zu stark schwankt und der Rechner früher oder später ausgeht. Außerdem stellt sich das Problem wie starke Spannungsabfälle, wie etwa beim Anlassen des Motors, abgefangen werden, damit der Rechner weiterläuft. Ein handelsübliches ATX-Netzteil für den Autobetrieb kann an den EeePC nicht angeschlossen werden und der Originalakku ist auch nicht mehr vorhanden. Für einen eventuellen Neu- oder Nachbau des CarPCs ist hier wahrscheinlich das größte Verbesserungspotential vorhanden.
Letztendlich wird der Rechner von einem KFZ-Netzteil für Laptops mit konstanter 12V Spannung versorgt
Zur Überbrückung von Spannungeinbrüchen wurde zusätzlich ein kleiner 12V Bleiakku mit 3.4 Ah verbaut und mit einer Diode der Stromrückfluss ins Bordnetz verhindert.

Der Plan ist mit einem Microcontroller noch ein automatisches Zuschalten des zusätzlichen Akkus sowie das An-/Abschalten der Rechners mit Drehen des Zündschlüsseln zu verwirklichen.

Angeschlossen an der Rechner sind:

  • 1x Line-Out (Klinke) zum Radio
  • 1x USB Hub im vorderen Bereich des Autos
  • 1x USB Hub im Kofferraum
  • 1x USB für Touchscreen
  • 1x VGA für Touchscreen

Der Bildschirm ist ein resistiver 8″ Touchscreen (lsusb -> Bus 003 Device 006: ID 0eef:0001 D-WAV Scientific Co., Ltd eGalax TouchScreen) mit einer nativen Auflösung von 1024×768 Pixeln. Eingelassen ist er in die Mittelconsole etwa auf Lenkrad Höhe. Für der Einbau des Touchscreens wurde das Radio nach unten in die Nähe des Schaltknüppels verschoben und die Lüftungsgitter wurden entfernt.

An den USB-Hub im Kofferaum ist ein GPS-Empfänger angeschlossen, der direkt unter der Heckscheibe befestigt und somit nicht durch die Karosserie behindert wird.

Software setup

Die Softwarebasis des CarPCs stellt eine unveränderte x86-ArchLinux Distribution dar, die nur “Core”-Software bereitstellt, also keine graphische Oberfläche oder unerwünschte, im Hintergrund laufende Daemons die garnicht benötigt werden. Das “Minimal”-Betriebssystem ist besonders praktisch, um eine sehr anpassungsfähige, von der Konfiguration nachvollziehbare und performance-orientierte Architektur unterhalb des eigentlichen XBMC-Frontends zu garantieren. Dieses Tutorial setzt eine mit Standarteinstellungen installierte ArchLinux-Version (linux>3.0,xbmc=10.1,xorg-server>1.11) voraus, auf dessen Installation hier aber nicht wieter eingegangen wird.

Wurde das Betriebssystem erfolgreich installiert, über LAN mit dem Internet verbunden und ist nach dem Root-Login einsatzbereit, kann die Konfiguration des Betriebssystems vorgenommen werden.

Mit einen der folgenden Befehle werden die Netzwerkeinstellungen gesetzt (entweder automatisch oder manuell) und danach extra Paketquellen in der Konfigurationsdatei des Paketmanagers hinzugefügt, indem vor der “[Extra]“- und der darunterstehenden “Include”-Zeile die “#”-Kommentarzeichen entfernt werden:

dhclient eth0
ifconfig eth0 <IP> && route add default gw <IP des Gateways> && sh -c "echo "nameserver 8.8.8.8" > /etc/resolv.conf"
vi /etc/pacman.conf

Darauf hin können alle Software-Pakete heruntergeladen und installiert werden, darunter unter anderem: Video-Treiber und X-Server (Touchtreiber: xf86-input-evdev), GPS-Daemon und dazu passendes Statusprogramm (gpsd, xgps), Netzwerkmanager und Bluetooth-Daemon (wicd, bluez), Audiotools (alsa-utils, libvorbis)und das Xbmc-Mediacenter. Der Pacman-Wrapper Yaourt wird benötigt um zusätzliche Programme aus dem “Arch User Repository” (AUR) herunterzuladen, unter anderem: Das freie Navigationssystem Navit, ein Touchscreen-Kalibrierungsprogramm (xinput_calibrator), ein Automount-Skript (udiskie) und ein Benachrichtigungsprogramm für ein mit Android betriebenes Smartphone (android-notifier-desktop):

pacman -Syu xorg wicd libvorbis sudo rfkill xbmc xorg-server xorg-xinit alsa-utils gpsd xgps base-devel xf86-input-evdev xf86-video-intel xorg-utils xorg-server-utils consolekit udev bluez
wget http://aur.archlinux.org/packages/package-query/package-query.tar.gz
tar zxvf package-query.tar.gz
cd package-query
makepkg -si
cd ..
wget http://aur.archlinux.org/packages/yaourt/yaourt.tar.gz
tar zxvf yaourt.tar.gz
cd yaourt
makepkg -si
cd ..
rm -r yaourt* package-query*
yaourt -S navit xinput_calibrator udiskie android-notifier-desktop

Jetzt wird ein normaler Benutzer ohne administrative Rechte erstellt (der auch Xbmc ausführen soll) und zusätzlich in die sudoers-Datei eingetragen, um bei bedarf wieder “Superuser”-Rechte zu bekommen. Eine Anleitung für ein Autologin findet man hier. Anmerkung: Anstatt vi kann auch z.B. nano als Editor benutzt werden. Vim muss jedoch erst mit dem Paketmanager Pacman installiert werden.

useradd carpc
gpasswd -a carpc audio video storage
vi /etc/sudoers

    In /etc/sudoers nur folgende Zeile hinzufügen: (in diesem Beispiel heißt der Benutzer carpc!!)
carpc ALL=(ALL) ALL
carpc ALL=(ALL) NOPASSWD: /sbin/poweroff,/sbin/shutdown,/usr/bin/killall,/usr/sbin/console-kit-daemon

Mit folgenden Befehlen werden wichtige Addons für XBMC installiert (aber noch nicht aktiviert! see here), wie z.B. ein Wicd-Frontend mit dem man sich innerhalb von XBMC mit WLAN-Netzwerken verbinden kann, sowie das eigentliche Touchscreen-Theme “touched”:

wget http://project-insanity.org/wp-content/uploads/2011/12/Script.linux_.wireless-0.0.5_offline_arch.zip
unzip script.linux.wireless-0.0.5_offline_arch.zip .xbmc/addons/
wget http://project-insanity.org/wp-content/uploads/2011/12/Skin.touched.tar.gz
unzip skin.touched.tar.gz .xbmc/addons/
rm Script.linux.wireless-0.0.5_offline_arch.zip Skin.touched.tar.gz # aufräumen

    Für das Automount-Script udiskie muss folgende Datei angelegt werden (mit SU-Rechten) um allen Benutzern der Gruppe das automatische Einhängen von Wechseldatenträgern zu erlauben:
[Local Users]
Identity=unix-group:storage
Action=org.freedesktop.udisks.*
ResultAny=yes
ResultInactive=no
ResultActive=yes
    Die Datei .Xinitrc dienst dazu, Befehle nach bzw. mit dem X-Server start auszuführen auf dem aktiven Display. Hier sind es z.B. Befehle die console-kit aufgrund eines Bugs neustarten müssen, damit udiskie funktioniert (optional). Vorallem aber, startet hier die Xbmc-Instanz.
export SDL_MOUSE_RELATIVE=0
sudo killall console-kit-daemon &
sudo /usr/sbin/console-kit-daemon &
udiskie &
xbmc
    Folgende Datei startet immer wieder den X-Server neu, falls dieser abstürzt. Dazu wird das Automount-Script udiskie gestartet und für XBMC eine SDL-Einstellung setzt, die fehler in der Touchsteuerung behebt.
if [[ -z $DISPLAY && $(tty) = /dev/tty1 ]]; then
export SDL_MOUSE_RELATIVE=0
udiskie &
exec startx
fi
    Für unseren Touchscreen wurde folgende Konfiguration benötigt. Die Kalibrierungswerte wurden mit dem Programm xinput_calibrator ermittelt, welches leider nach unserer Erfahrung einen Window-Manager benötigt wie Metacity um zuverlässig zu funktionieren (TTY1: export DISPLAY=:0 && xinput_calibrator && metacity –replace).
Section "InputClass"
Identifier "evdev pointer catchall"
MatchIsPointer "on"
MatchDevicePath "/dev/input/event*"
Driver "evdev"
EndSection
Section "InputClass"
Identifier "evdev keyboard catchall"
MatchIsPointer "on"
MatchDevicePath "/dev/input/event*"
Driver "evdev"
EndSection
Section "InputClass"
Identifier "evdev touchpad catchall"
MatchIsPointer "on"
MatchDevicePath "/dev/input/event*"
Driver "evdev"
EndSection
Section "InputClass"
Identifier "evdev tablet catchall"
MatchIsPointer "on"
MatchDevicePath "/dev/input/event*"
Driver "evdev"
EndSection
Section "InputClass"
Identifier "evdev touchscreen catchall"
MatchIsPointer "on"
MatchDevicePath "/dev/input/event*"
Driver "evdev"
Option "InvertX" "on"
Option "InvertY" "on"
Option "Calibration" "103 1890 157 1911"
EndSection
    Nach der Zeile “button/power)” in /etc/acpi/handler.sh folgende Zeile hinzufügen:

sudo /sbin/poweroff

Für ein deutsches Keyboard-Layout innerhalb des X-Servers muss folgende Datei angelegt werden:
Section "InputClass"
Identifier "Keyboard Defaults"
MatchIsKeyboard "yes"
Option "XkbLayout" "de"
EndSection

Zuletzt sollte noch mit einem Befehl die aktuell, mit z.B. alsamixer gesetzte Lautstärke persistent gespeichert werden. In der Datei /etc/rc.conf muss der Daemon-Arry mit weiteren Diensten ergänzt werden, die automatisch mit dem System starten sollen:
(sudo) alsactl store
vi /etc/rc.conf

In der Datei anpassen:
DAEMONS=(syslog-ng dbus !network !dhcdbd !networkmanager !net-profiles wicd gpsd bluetooth acpid crond !asterisk)

Work in progress …

Die nächsten Schritte des Projektes sind:

  • Eine Freisprechanlage, realisiert mit einem Asterisk-Server auf dem CarPC, der über WLAN (/Bluetooth?!) sich mit dem Android-Handy des Fahrers verbindet.
  • Verbesserte Integration des Navigations-Systems in XBMC. (Navit oder iGO-Navigationssoftware mit Wine ausprobieren, wie hier schon erfolgreich getestet wurde.)
  • Sprachausgabe für Navit.
  • Alternative Setups mit Android 4.0 x84 und Win7 (CPOS CarPC-Software / iCT(inCar Terminal))
  • Automount funktioniert leider noch nicht ganz.
  • XBMC-Theme fertigstellen
  • Gpsd.conf fehlt noch
  • Android-Telefon automatisch mti Obexfs mounten und Multimediadateien in XBMC einbinden

Credits:

Original skin: http://forum.xbmc.org/showthread.php?t=105142 (thx Jezz_X!)
Original wicd-plugin: http://forum.xbmc.org/showthread.php?t=90410 (thx vikjon0!)

Anmerkungen:

Ich bitte darum, Kritiken, Verbesserungsvorschläge oder Alternativkonzepte in den Kommentarbereich zu schreiben. Es ist nicht einfach, einen Überblick über vorhandene CarPC-Projekte und dazugehörige Software im Internet zu finden, deswegen würden wir uns über jede Anregung freuen, danke.

Weiterführende Links:

Sep 4

Da immer mehr Leute sich gerne zuhause einen eigenen Homeserver aufsetzen um ihre Filme, Bilder oder andere Dateien gemeinsam zu speichern und zu nutzen, wollte ich dieses Thema auch hier im Blog mal aufgreifen.Ich habe selbst einen eigenen, kleinen Homeserver mit 1,5 TB Speicher und einem µATX Board mit Intel Atom Prozessor. Ich nutze den Server hauptsächlich zum lagern von Filmen, die an allen Rechnern im Haus abgespielt werden können. Dafür nutzte ich XBMC an den Clients.

Auf dem Server selbst läuft ein Ubuntu Server Edition 11.04 mit einem Samba Fileserver. Da die Konfiguration von Samba nicht immer auf Anhieb funktioniert werden ich meine Vorstellungen und (gelöste) Probleme hier mal beschreiben in der Hoffung damit jemanden zu helfen.

Die INSTALLATION gestaltet sich unter Ubuntu Gott sei Dank sehr einfach:

sudo apt-get update
sudo apt-get install samba-common samba

Ist Samba installiert hat man verschidenen Möglichkeiten die Konfiguration vorzunehmen. Zum einen kann sie über das Webinterface SWAT, welches eines der bekanntesten Konfigurationstools ist, vorgenommen werden. Andere GUI Tools gibt es auch hier.

Wer ein wenig tiefer gehen möchte, oder wer auf der Suche nach Bugs ist, wird schnell feststellen, dass man um manuelles konfigurieren nicht herumkommt. Unter Ubuntu findet sich die Configfile von Samba under /etc/samba/smb.conf
Diese Datei ist in verschiedene Sektionen aufgeteilt. Es wird hier hauptsächlich zwischen allgemeinen und Freigabespezifischen Einstellungen unterschieden (siehe unten). Ich will hier nicht alle Konfigurationenmöglichkeiten durchkauen, das würde auch den Rahmen dieser Seite sprengen. Mein Ziel war zu Anfang Freigaben wie Musik und Filme für alle (inkl. Nutzer ohne Account) zugänglich zu machen und bestimmte Freigaben wie private Dateien und Backups nur für ausgewählte Nutzer  freizugeben. Nutzer die Schreibrechte in privaten Ordnern haben, sollen auch Schreibrechte in den öffentlichen Ordnern haben.

Hierzu muss man erst einmal die Benutzer im System anlegen. Jeder Nutzer in Samba muss auch ein echter Linuxuser sein. Das heißt wir legen alle Nutzer zu erst einmal im System an:

sudo useradd nutzerXYZ -N -M

Mit diesem Befehl wird der User nutzerXYZ angelegt, es wird jedoch kein Home-Ordner erstellt (-M) und auch keine extra Gruppe für den Benutzer angelegt (-N). Mit

sudo smbpasswd -a nutzerXYZ
wird der Nutzer als Sambauser angelegt und kann fortan benutzt werdern um sich auf Freigaben einzuloggen. Die Benutzer können mit
sudo smbpasswd -x nutzerXYZ
sudo userdel nutzerXYZ 

wieder gelöscht werden. Nun schauen wir uns mal die smb.conf selbst an. Die Datei beginnt mit der [global] Sektion in der sämtliche allgemeine Einstellungen stehen.

[global]
	workgroup = HEIMNETZ
	server string = SMB-Server01
   	log file = /var/log/samba/log.%m
	security = user
 	map to guest = bad user
	guest account = nobody
  • workgroup – Ist natürlich die Arbeitsgruppe in der der SMB-Server erscheinen soll.
  • server string – Ist der Hostname der, etwa in der Netzwerkumgebung von Windows, angezeigt wird
  • log file – gibt die Datei an in der alle Ereignisse des SMB-Servers festgehalten werden
  • security – ist diese Option auf “user” gesetzt muss sich ein User am Samba Server zuerst anmelden und sieht dann die verschiedenen Freigaben. Ist die Option auf “share” gestellt, werden dem User erst die Freigaben angezeigt und er loggt sich dann bei einer einzelnen ein
  • map to guest - “bad user” bedeutet wenn sich jemand mit einem User versucht einzuloggen der in Samba nicht existiert. In diesem Fall wird der Benutzer als Gast eingeloggt und hat auch nur entsprechende Rechte.
  • guest account – ist der Account der als Gast verwendet wird. Normalerweise ist diese Option auf nobody gesetzt. Es wäre allerdings auch möglich hier einen anderes Benutzer einzutragen.
Öffentliche Freigabe:
[Freigabe1]
	path=/media/Speicher/
	comment=oeffentlicher Ordner
	public=yes
	write list=nutzerXYZ
	force create mode=0777
	force directory mode=0777
  • path –  ist der Pfad zu freizugebenden Ordner
  • comment  - Kommentar
  • public – Die Freigabe kann grundsätzlich von jedem  angesehen werden. Schreibrechte werden in der nächsten Option geklärt.
  • write list – hier werden die Nutzer angegeben die in der Freigabe Schreibrechte haben. Alle anderen haben automatisch nur read-only zugriff.
  • force create mode/ force directory mode – Hier werden die Datei- und Ordnerrechte für neue Objekte gesetzt. Mit 0777 hat auf eine neu erstellte Datei bzw. einen neu erstellten Ordner jeder Zugriff.
Private Freigabe:
[Freigabe 2]
	path=/media/Speicher2/
	comment=privater Ordner
	public=no
	write list=nutzerXYZ
	force create mode=0777
	force directory mode=0777
  • Hier ist nur die Option public = no gesetzt. Das hat zu Folge, dass niemand die Freigabe öffnen kann, es sein denn sein Nutzername steht in der write list
Das sind nur die einfachsten Optionen um solch einen Fileserver aufzusetzen. Es gibt viele weitere Optionen für Schreib- und Leserechte oder Druckerfreigaben. Im Zweifelsfall sucht man sich seine Optionen für die smb.conf am besten in der SMB Manpage.

Lokalisiert von Hashi.Modified by project-insanity.