Forum: PC Hard- und Software RaspberryPi CAN-BUS (python-can)


von René P. (speedy909)


Lesenswert?

Hallo zusammen,

wie ich bereits vor einigen Wochen in einem anderen Beitrag 
(Beitrag "RaspberryPiB+ mit CAN (MCP2515)") berichtet habe, bin ich 
an einer Hausautomatisierung über CAN-BUS beschäftigt.
Letztes mal hatte ich Probleme mit dem Ansprechen eines MCP2515 über den 
RaspberryPi. Diese Problem habe ich dank der Hilfe im Forum lösen 
können. Jetzt (nach einigen Wochen) habe ich wieder etwas Zeit an meinem 
Projekt zu basteln. Bei meinem Versuch den CAN-BUS über Python 
anzusteuern scheitere ich allerdings schon wieder nach kurzer Zeit.

Die Hardware am Raspberry funktioniert jetzt problemlos, ein abfragen 
oder ausgeben von Werten an den CAN über das Terminal funktioniert!

Für die Integration in Python gibt es die Erweiterung "python-can", 
diese ich natürlich mit freudigen Erwartungen installiert habe.

Leider komme ich aber jetzt nicht mehr weiter... Alle meine 
Ansteuerungsversuche scheitern mit dem selben Fehler.
1
WARNING:root:Kvaser canlib is unavailable.
2
WARNING:root:Function was not found in library
3
...
4
...
5
WARNING:root:Function was not found in library
6
WARNING:root:Kvaser canlib is unavailable.
7
ERROR:can.socketcan.native:Note Python 3.3 or later is required to use native socketcan

Ich verwende Python 3.2. und werde das Gefühl nicht los, dass mein 
"can.conf" File ignoriert wird.
1
[default]
2
Interface = socketcan_ctypes
3
channel = can0

Was hat es mit de Kvaser canlib auf sich?
Kennt jemand "python-can" und hat es selbst schonmal verwendet?

Gruß
René

von Frank (Gast)


Lesenswert?

René P. schrieb:
> Kvaser canlib is unavailable.

Wer oder was Kvaser ist weiß google und deren canlib fehlt dir.

Steht das nicht da?

von René P. (speedy909)


Lesenswert?

Hallo,

ja Danke, lesen kann ich auch :D

Nur ist Kvaser eine von den 4 Möglichkeiten, die python-can unterstützt 
um mit dem CAN-BUS zu kommunizieren.

Laut python-can Anleitung "Interfaces":
kvaser,
socketcan,
serial,
oder pcan

da aber socketcan verwendet wird, sollte ich eigentlich kvaser nicht 
benötigen... (steht zumindest nichts davon in der 
Installationsanleitung)

Deswegen ja meine Frage "Was hat es mit Kvaser canlib auf sich?" 
(vielleicht etwas falsch formuliert)

Warum bekomme ich diese Meldung "Kvaser canlib is unavailable"?
Es wird ja laut can.conf das socketcan ausgewählt!

: Bearbeitet durch User
von Florian V. (florianv)


Lesenswert?

René P. schrieb:
> ERROR:can.socketcan.native:Note Python 3.3 or later is required to use
> native socketcan

Das ist alles was Du wissen musst. Es geht mit 3.2 schlicht und 
ergreifend nicht. Zumindest nicht socketcan.

Am besten 3.2 komplett deinstallieren, ansonsten kommst Du sehr leicht 
durcheinander, welches Python Du gerade benutzt

sudo apt-get remove python3 python3-minimal python3.2 python3.2-minimal

Eine neuere Version von Python habe ich nach:
http://www.raspberrypi.org/phpBB3/viewtopic.php?f=32&t=49023
installiert.

Wenn ich meine Aufzeichnungen richtig deute, habe ich dann Python 3.4 
installiert und keine eigenständigen Python-CAN-Packages. Ich glaube 
socketcan für Python war in den neueren Versionen von Python schon drin 
(??)

von René P. (speedy909)


Lesenswert?

Hallo Florian,

Danke für deine hilfreiche Antwort!
Werde es demnächst mit einer neueren Python Version testen..


Florian V. schrieb:
> Das ist alles was Du wissen musst. Es geht mit 3.2 schlicht und
> ergreifend nicht. Zumindest nicht socketcan.

Heißt ich habe die Installationsanleitung von python-can nicht ganz 
richtig verstanden... (so gut ist mein Englisch leider nicht)
1
Reasonably modern Linux Kernels (2.6.25 or newer) have an implementation of socketcan. This version of python-can will directly use socketcan if called with Python 3.3 or greater, otherwise that interface is used via ctypes.


PS:
Habe Heute nochmals direkt mit C ein kleines Programm geschrieben, 
dieses hat zumindest gleich funktioniert. Wobei für die ersten Versuche 
python etwas bequemer wären. Und da ich python bisher nicht kenne, 
wollte ich mich damit etwas beschäftigen...

von Florian V. (florianv)


Lesenswert?

Die Meldung scheint zu sagen, dass python-can bei einem Python <3.3 
anstattt socketcan auf ctypes zur CAN-Kommunikation ausweichen würde.

Da kann ich Dir jedoch nicht weiterhelfen, ich habe ausschließlich 
socket-can zum Leben erweckt.

von René P. (speedy909)


Lesenswert?

Danke Florian! Dein Tipp war goldwert...


Habe auf einem jungfräulichen System Python3.2 deinstalliert und 
anschließend genau wie in dem von dir beschriebenen Link Python3.3.2 
installiert. (Habe irgendwo gelesen dass ab Python3.3 Socketcan ohne 
jede zusätzliche Erweiterung funktioniert) --> hat sich bestätigt

Hier nochmals der Ablauf:
1
###Python3.2 deinstallieren
2
$ sudo apt-get remove python3 python3-minimal python3.2 python3.2-minimal
3
4
###Python3.3 herunterladen, kompilieren und installieren
5
$ wget http://www.python.org/ftp/python/3.3.2/Python-3.3.2.tar.bz2
6
$ tar jxf ./Python-3.3.2.tar.bz2
7
$ cd ./Python-3.3.2
8
$ ./configure --prefix=/opt/python3.3.2
9
$ make && sudo make install
10
11
###Link auf Python3.3 erstellen
12
$ mkdir ~/bin
13
$ ln -s /opt/python3.3/bin/python ~/bin/py
14
15
###neustarten
16
sudo reboot
17
18
###can0 konfigurieren/aktivieren
19
$ sudo /sbin/ip link set can0 up type can bitrate 125000
20
21
###Die Grundsätzliche Funktion des CANBUS testen/sicherstellen (can-utils)
22
$ candump can0
23
24
##CANBUS mit beliebigem Python-Script testen
25
$ py cantest.py

Ich kann also bestätigen, für eine funktionierende Python -> CAN 
Anbindung wird nur Python > 3.3 benötigt.

Nochmals DANKE für die Unterstützung


Gruß
René

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.