>> Artikelansicht

12.09.2016 /He [Druckansicht]

Raspberry Pi 3 Model B mit linux-gpib und Kernel 4.1

Anleitung für National Instruments GPIB-USB-HS und Agilent 82357A/B GPIB USB Adapter

Raspberry Pi 3 Model B und NI GPIB USB-HS Adapter Seit dem Erscheinen des 1. Raspberry Pi, als es noch Mühselig war, einen Kerneltreiber zu Installieren und alles zu Testen, ist es dank dem letzten Modell, dem Raspberry Pi 3(Stand 2016) um einiges leichter geworden, alles direkt auf dem Pi zu erledigen. So auch das Übersetzen des Kernels direkt auf dem Pi. Möchte man einen USB-GPIB Adapter der Marke Agilent oder National Instruments verwenden, benötigt man eine Kernel Treiber Modul, das mit dem USB-GPIB-Adapter kommuniziert. Das Open-source Projekt namens linux-gpib [http://linux-gpib.sourceforge.net/] liefert die notwendige Software und auch die passende Firmware. Auch wird der Kernel 4.1.x unterstützt, was einen großen Vorteil hat, da der Kernel 4.1 Langzeit-Support erhält. Eigentlich sollten alle Versionen des 4.x.x zweiges funktionieren. Getestet wurde hingegen nur die Version 4.1.y


Motivation

Auf dem Gebrauchtgeräte Markt sind mittlerweile hochwertige und trotzdem günstige Messgeräte und Kalibratoren erhältlich, die meist mit einer GPIB (IEEE 488) Schnittstelle ausgestattet sind.Somit kann man sich eine automatisierte Prüfmittelüberwachung oder Laborautomatisierung aufbauen sowie einfach Messgeräte remote bedienen. Das Prinzip wurde im Raspberry Pi in der Messtechnik Artikel dieser Internetseite beschrieben. Doch die Möglichkeiten sind seit bestehen dieses Blogs geradezu explodiert. Auch dank IOT (Internet Of Things). Mittlerweile gehören WebSockets [https://developer.mozilla.org/en-US/docs/WebSockets] zum guten Ton. Eine geschickte Verknüpfung von Hardware und Software kann mittels eines Raspberry Pi als Steuerrechner und einem GPIB-USB Adapter verwirklicht werden.

(1.0) System Aktualisieren

Das Basissystem in diesem Artikel basiert auf Raspbian Jessie Lite.

  1. #System-Aktuallisierung
  2. sudo apt-get update
  3. sudo apt-get upgrade
  4. #notwendige Tools installieren
  5. sudo apt-get install gcc make bc screen ncurses-dev libncurses5-dev
  6. sudo apt-get install flex bison
  7. sudo apt-get install libgmp3-dev
  8. sudo apt-get install libmpfr-dev
  9. sudo apt-get install libmpc-dev
  10. sudo apt-get install autoconf
  11. sudo apt-get install texinfo
  12. sudo apt-get install python2.7-dev
  13. sudo apt-get install python-yaml
  14. sudo apt-get install libexpat1-dev
  15. sudo apt-get install libtool libtool-bin
  16. #https://github.com/Hexxeh/rpi-update
  17. sudo apt-get install rpi-update
  18. sudo rpi-update
  19. #Ausgabe
  20. #This update bumps to rpi-4.1.y linux tree
  21. #...
  22. # *** Updating firmware
  23. # *** Updating kernel modules
  24. # *** depmod 4.1.20+
  25. # *** depmod 4.1.20-v7+
  26. sudo reboot

(1.1) Herunterladen / Übersetzen und Installieren des Linux Kernels

Weitere Informationen und Methoden zur Konfiguration und Übersetzen des Kernels findet man unter:
[https://www.raspberrypi.org/documentation/linux/kernel/building.md]
Hinweis: Der Kernel wird im Heimat- Verzeichnis des Nutzers pi übersetzt.

download and install kernel 4.1.y
  1. #change to home directory
  2. cd
  3. #download kernel from https://github.com/raspberrypi/linux
  4. wget https://github.com/raspberrypi/linux/archive/rpi-4.1.y.zip
  5. #extract kernel
  6. unzip -q rpi-4.1.y.zip
  7. cd ./linux-rpi-4.1.y
  8. #raspberry pi 2/3
  9. KERNEL=kernel7
  10. #configure kernel
  11. make bcm2709_defconfig
  12. #build
  13. make -j4 zImage modules dtbs
  14. #install
  15. sudo make modules_install
  16. sudo cp arch/arm/boot/dts/*.dtb /boot/
  17. sudo cp arch/arm/boot/dts/overlays/*.dtb* /boot/overlays/
  18. sudo cp arch/arm/boot/dts/overlays/README /boot/overlays/
  19. sudo scripts/mkknlimg arch/arm/boot/zImage /boot/$KERNEL.img

Linux-gpib herunterladen und installieren

download and install linux-gpib
  1. sudo apt-get install subversion
  2. sudo apt-get install libusb-dev
  3. #change to home directory
  4. cd
  5. svn checkout svn://svn.code.sf.net/p/linux-gpib/code/trunk/linux-gpib
  6. cd ./linux-gpib
  7. #enable python
  8. sudo apt-get install python2.7-dev python3-dev
  9. #enable TCL
  10. sudo apt-get install tcl-dev tk-dev
  11. #enable Guile binding
  12. sudo apt-get install guile-1.8-dev guile-2.0-dev
  13. #add path of the kenel source to configure
  14. ./configure --with-linux-srcdir=/home/pi/linux-rpi-4.1.y
  15. make
  16. sudo make install
  17. sudo ldconfig
  18. #reboot
  19. sudo reboot

Linux-gpib Firmware von [http://linux-gpib.sourceforge.net/firmware/] herunterladen und extrahieren.

gpib firmware from http://linux-gpib.sourceforge.net/firmware/
  1. #change to home directory
  2. cd
  3. #download
  4. wget http://linux-gpib.sourceforge.net/firmware/gpib_firmware-2008-08-10.tar.gz
  5. tar -xf gpib_firmware-2008-08-10.tar.gz

(1.2) Agilent 82357A/B GPIB USB Adapter

Agilent 82357A GPIB-Adapter In diesem Abschnitte wird der Agilent 82357A/B GPIB USB Adapter behandelt. Wer einen National Instruments Adapter verwendet, kann gleich bei (1.3) weiterlesen.Der Agilent USB-Adapter ist etwas komplizierter zu installieren, da mittels eines extra Tools Namens fxload [https://github.com/wkoszek/fxload], die Firmware in den Adapter geladen wird. Die Firmware befindet sich in den entsprechenden Unterverzeichnissen der gpib_firmware.Für die A-Version des Adapters, findet man die Firmware Dateien unter ./gpib_firmware-2008-08-10/agilent_82357a. Somit wird in nächsten Schritt zuerst der Firmwareloader fxload installiert.

(1.2.1) fxload der Firmwareloader

fxload herunterladen und installieren
  1. #fxload from https://github.com/wkoszek/fxload
  2. git clone https://github.com/wkoszek/fxload.git
  3. cd ./fxload
  4. git checkout multios
  5. LIBUSB_SUPPORT=1 make
  6. sudo make install

Nun kann der Adapter am USB-Stecker des Raspberry Pi eingesteckt werden.Da kein 82357B Adapter zum Testen vorhanden ist und dieser etwas anders Initialisiert wird, kann keine Garantie übernommen werden,dass der Befehl auch so funktioniert wie hier angegeben.Weitere Informationen sind der ~/gpib_firmware-2008-08-10/agilent_82357a/README Datei zu entnehmen.Die A- und B-Version des Adapters verwenden beide das Kernel-Modul agilent_82357a, somit muss man nur noch die passende Firmware für den jeweiligen Adapter per fxload laden. Zuvor muss jedoch auch noch die /etc/gpib.conf der entsprechende Adapter eingetragen werden.

(1.2.2) linux-gpib config (gpib.conf) bearbeiten

Um den korrekten USB-GPIB Adapter verwenden zu können, wird noch die /etc/gpib.conf angepasst.Für board_type tragen wir hier "agilent_82357a" oder je nach Adapter "agilent_82357b" ein.
  1. #setting gpib-usb board type
  2. sudo nano /etc/gpib.conf
  3. /* type of interface board being used */
  4. board_type = "agilent_82357a"

(1.2.3) Kernel Module initialisieren und Firmware per fxload in USB-Adapter laden

  1. #load kernel-modules
  2. sudo modprobe gpib_common
  3. #82357A/B are using the same module agilent_82357a
  4. sudo modprobe agilent_82357a
  5. #change to home directory
  6. cd
  7. #change to firmware path
  8. cd ./gpib_firmware-2008-08-10/agilent_82357a
  9. #82357A (getestet/tested)
  10. lsusb
  11. #Bus 001 Device 004: ID 0957:0007 Agilent Technologies, Inc.
  12. sudo fxload -t fx -D /dev/bus/usb/001/004 -I 82357a_fw.hex
  13. #82357B (nicht getestet, da kein Adapter vorhanden/not tested)
  14. lsusb
  15. #Bus 001 Device 004: ID 0957:0518 Agilent Technologies, Inc.{...}
  16. sudo fxload -t fx2 -D /dev/bus/usb/001/004 -I measat_releaseX1.8.hex

(1.2.4) Optional: Adapter per hotplug initialisieren

Wer den GPIB-Adapter schon beim Booten oder einfach automatisch nach dem Einstecken initialisiert haben möchte,kann dies per hotplug Script /etc/hotplug/usb/agilent_82357a, das mit der Installation von linux-gpib mitinstalliert wurde, erledigen.Hierzu muss zuerst die Firmware an die von Script erwartete Stelle /usr/share/usb/agilent_82357a/ Kopiert werden.Ferner muss noch /etc/udev/rules.d/99-agilent_82357a.rules angepasst werden.

  1. #change to home directory
  2. cd
  3. #change to firmware path
  4. cd ./gpib_firmware-2008-08-10/agilent_82357a
  5. #copy firmware
  6. sudo cp 82357a_fw.hex /usr/share/usb/agilent_82357a/
  7. sudo cp measat_releaseX1.8.hex /usr/share/usb/agilent_82357a/
  8. tail -f /var/log/messages
  9. #...
  10. #raspberrypi kernel: [ 94.340779] usb 1-1.2: New USB device found, idVendor=0957, idProduct=0007
  11. #...
  12. #edit ATTR{idProduct}=="0[57]18" > ATTR{idProduct}=="0007"
  13. sudo nano /etc/udev/rules.d/99-agilent_82357a.rules
  14. #ACTION=="add", SUBSYSTEM=="usb", ENV{DEVTYPE}=="usb_device", ATTR{idVendor}=="0957", ATTR{idProduct}=="0[57]18", ENV{DEVICE}="$devnode", ENV{SERIAL}="$attr{serial}", RUN+="/etc/hotplug/usb/agilent_82357a"
  15. ACTION=="add", SUBSYSTEM=="usb", ENV{DEVTYPE}=="usb_device", ATTR{idVendor}=="0957", ATTR{idProduct}=="0007", ENV{DEVICE}="$devnode", ENV{SERIAL}="$attr{serial}", RUN+="/etc/hotplug/usb/agilent_82357a"

(1.2.5) Original oder Kopie?

Geöffneter Agilent 82357A GPIB-Adapter Noch ein paar Worte zu dem Agilent Adapter. Auf unterschiedlichen Gebrauchtwarenmärkten sind diese günstig zu erstehen (meist die B-Version), wer sich nicht sicher ist, ob es sich um eine Kopie/Clone handelt, kann dies recht schnell prüfen. Nach dem Öffnen sollte die Kunststoffschale beim Original innen eine metallische Beschichtung aufweisen. Auch sollte die Platine sauber(also frei von Lötrückständen sein) ist beides nicht der Fall, so hat man wohl einen Kopie erstanden. Aus Berichten im Internet solle es starke Qualitätsunterschiede bei den Kopien geben. Selbst habe ich keinen Kopie getestet oder sonst irgendwelche Erfahrungswerte. In diesem Artikel wird davon ausgegangen, dass die Originalversion verwendet wird.


(1.3) National Instruments GPIB-USB-HS Adapter

Geöffneter NI GPIB USB-HS Adapter Beim National Instruments GPIB-USB-HS Adapter sind wir eingentlich schon nach dem Anpassen der /etc/gpib.conf und dem Laden der Kernel Module fertig.








Ob der Adapter angeschlossen und betriebsbereit ist, kann mit lsusb festgestellt werden.

  1. lsusb
  2. #Bus 001 Device 004: ID 3923:709b National Instruments Corp. GPIB-USB-HS

(1.3.1) linux-gpib config (gpib.conf) bearbeiten

Um den korrekten USB-GPIB Adapter verwenden zu können, wird noch die /etc/gpib.conf angepasst.Für board_type tragen wir hier "ni_usb_b" ein und nicht wie anzunehmen ni_usb_hs!

  1. #setting gpib-usb board type
  2. sudo nano /etc/gpib.conf
  3. /* type of interface board being used */
  4. board_type = "ni_usb_b"

(1.3.2) Kernel Module laden

Nun wird noch das passende Kernel Modul ni_usb_gpib geladen.

  1. #load kernel-modules
  2. sudo modprobe gpib_common
  3. #National Instruments GPIB Driver
  4. sudo modprobe ni_usb_gpib

Die Ausgabe des Kernle-Logs sollte etwa so aussehen.

  1. tail -f /var/log/messages
  2. #raspberrypi kernel: [ 63.710325] usb 1-1.2: new high-speed USB device number 4 using dwc_otg
  3. #raspberrypi kernel: [ 63.970330] usb 1-1.2: new high-speed USB device number 5 using dwc_otg
  4. #raspberrypi kernel: [ 64.071948] usb 1-1.2: New USB device found, idVendor=3923, idProduct=709b
  5. #raspberrypi kernel: [ 64.071968] usb 1-1.2: New USB device strings: Mfr=1, Product=2, SerialNumber=3
  6. #raspberrypi kernel: [ 64.071981] usb 1-1.2: Product: GPIB-USB-HS
  7. #raspberrypi kernel: [ 64.071994] usb 1-1.2: Manufacturer: National Instruments
  8. #raspberrypi kernel: [ 64.072006] usb 1-1.2: SerialNumber: XXXXXXXX
  9. #raspberrypi kernel: [ 64.089603] Linux-GPIB 4.0.2 Driver
  10. #raspberrypi kernel: [ 64.098303] ni_usb_gpib driver loading
  11. #raspberrypi kernel: [ 64.098431] ni_usb_gpib: probe succeeded for path: usb-3f980000.usb-1.2
  12. #raspberrypi kernel: [ 64.098576] usbcore: registered new interface driver ni_usb_gpib
  13. #raspberrypi kernel: [ 64.098589] gpib: registered ni_usb_b interface

(2.0) GPIB-Adapter Kommunikation mit Messgeräten

Agilent 34401A mit Raspberry Pi und GPIB-Adapter Bevor man den Adapter mit einem Messgerät verwenden kann, wird der Adapter noch über die GPIB-Buchse des Messgerätes verbunden.Hierzu benötigt man kein GPIB-Kabel, sondern nur den GPIB-Adapter, wenn man nur ein Messgerät verwendet.






(2.1) GPIB-Adapter mit gpib_config Initialisieren

Der Befehl sudo gpib_config muss nur einmal nach dem Anschließen des GPIB-Adapters ausgeführt werden. Wer diesen Schritt auch automatisieren möchte, kann noch /usr/local/sbin/gpib_confignach /etc/rc.local kopieren. Dies macht jedoch nur Sinn, wenn an dem Raspberry Pi auch immer ein GPIB-Adapter angeschlossen ist.

  1. #command gpib_config initializes the gpib-adapter
  2. sudo gpib_config

(2.2) GPIB-Adapter Test

Der Befehl ibtest kann zum Testen der Kommunikation mit einem Messgerät, hier ein Agilent 34401A Digital Multimeter eingestellt auf GPIB-Adresse 12 und einem zuvor, wie in diesem Artikel, konfigurierten GPIB-Adapter verwendet werden.

  1. pi@raspberrypi:~ $ sudo ibtest
  2. Do you wish to open a (d)evice or an interface (b)oard?
  3. (you probably want to open a device): d
  4. enter primary gpib address for device you wish to open [0-30]: 12
  5. trying to open pad = 12 on /dev/gpib0 ...
  6. You can:
  7. w(a)it for an event
  8. write (c)ommand bytes to bus (system controller only)
  9. send (d)evice clear (device only)
  10. change remote (e)nable line (system controller only)
  11. (g)o to standby (release ATN line, system controller only)
  12. send (i)nterface clear (system controller only)
  13. ta(k)e control (assert ATN line, system controller only)
  14. get bus (l)ine status (board only)
  15. go to local (m)ode
  16. change end (o)f transmission configuration
  17. (q)uit
  18. (r)ead string
  19. perform (s)erial poll (device only)
  20. change (t)imeout on io operations
  21. request ser(v)ice (board only)
  22. (w)rite data string
  23. : w
  24. enter a string to send to your device: *IDN?
  25. sending string: *IDN?
  26. gpib status is:
  27. ibsta = 0x2100 < END CMPL >
  28. iberr= 0
  29. ibcnt = 6
  30. You can:
  31. {...} // same text see line 7..22
  32. : r
  33. enter maximum number of bytes to read [1024]:
  34. trying to read 1024 bytes from device...
  35. received string: 'HEWLETT-PACKARD,34401A,0,11-5-2'
  36. Number of bytes read: 32
  37. gpib status is:
  38. ibsta = 0x2100 < END CMPL >
  39. iberr= 0
  40. ibcnt = 32

Links für weitere Informationen

Homepage Raspberry Pi

[https://www.raspberrypi.org/]

Raspbian Download

[https://www.raspberrypi.org/downloads/raspbian/]

Kernel konfigurieren und übersetzen

[https://www.raspberrypi.org/documentation/linux/kernel/building.md]

Raspberry Pi Kernel

[https://github.com/raspberrypi/linux]

Linux GPIB Package Homepage

[http://linux-gpib.sourceforge.net/]

nächster Artikel