PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : RPi3 und RP6 SMBus Schwierigkeiten



Jo Roboterix
02.06.2016, 09:53
Hallo zusammen,

zu mir:
ich bin neu hier und das ist mein erster Post.
Daher eine ganz kurze Vorstellung:
Mein Name ist Jo(hannes), bin nicht mehr ganz taufrisch und dieses Jahr auf den Roboter gekommen.
Ursprünglich wollte ich direkt mit einem Humanoiden anfangen, habe mich aber dank dieser Plattform anders entschieden.
Nun steht ein RP6 V2 und RPi V3 vor mir und ich versuche diese zu verheiraten. Auf dieser Basis sollen dann weitere Projekte starten. Die Beiträge hier im Forum zum Thema sollte ich gelesen haben. Ob ich sie alle (richtig) verstanden habe ist ein anders Thema ;-).

Problem:
ganz kurz - I/O-Fehler zwischen RP6 und RPi. Diese münden oft darin, das der SMBus keine Daten mehr liefert bis der RP6 resetet wurde.

Hintergrund:
RP6 Base V3 (Slave-Programm aus den Beispielen unverändert ("RP6Base_I2CSlave"))
RPi V3 (neuestes Jessie, neueste SMBus Libs für Python 2+3)
Verkabelung über I2C (SCL, SDA sind nicht vertauscht, + und GND). Verwendung eines Pegelwandlers.
Code auf dem RPi:


#!/usr/bin/python

import smbus
import time
import sys
import subprocess

TimeStart = 0
TimeEnd = 0
TimeDt = 0
Count = 0

bus = smbus.SMBus(1) # Or bus = smbus.SMBus(0) for Revision 1 boards
address = 0x05 # This is the address value read via the i2cdetect command RP6

print "Start"
time.sleep(2.0)
subprocess.call(['i2cdetect', '-y', '1'])
time.sleep(0.1)
bus.write_i2c_block_data(address, 0,[3, 0]) #LEDs off
time.sleep(2.0)
bus.write_i2c_block_data(address, 0,[3, 1]) #LED1 on
time.sleep(0.1)

#Messschleife
while (True):
try:
print "Loop"
data = ""
TimeStart = time.time()
data = bus.read_byte_data(address, 0x1D) #LED read
time.sleep(0.1)
print "Data1 LED:", data
data = ""
data = bus.read_word_data(address, 0x00) #Bumper read
time.sleep(0.1)
if (data == 2):
print "Bumper left"
time.sleep(1.0)
if (data == 4):
print "Bumper right"
time.sleep(1.0)
if (data == 6):
print "Bumper both"
time.sleep(1.0)
print "Data2 Bumper:", data
TimeEnd = time.time()
TimeDt = TimeEnd - TimeStart
print TimeDt;
except IOError as e:
print "I/O error({0}): {1}".format(e.errno, e.strerror)
#subprocess.call(['i2cdetect', '-y', '1'])
Count += 1
if (Count % 100 == 0):
print 'Loop: ',Count
time.sleep(2.0) #Pause every 100 times


Grundsätzlich funktioniert die Kommunikation zwischen den Beiden. Mit den I/O-Fehlern könnte ich ja noch leben. Aber wenn irgendwann nicht mehr vom Bus gelesen werden kann, ist das sehr blöd.
Kennt jemand eine Lösung oder einen funktionierenden Workarround? Oder die Möglichkeit den SMBus zu resetten, sodass ich wieder vom RP6 lesen/schreiben kann?

Sollten relevante Informationen fehlen, bitte ich das zu entschuldigen. Gerne reiche ich diese nach. Auch warum ich mich für diese Varianten entschieden habe.

Beste Grüße und vorab ein Dankeschön

Jo

Jo Roboterix
06.06.2016, 12:13
Hallo,

kurzes Update, da die Resonanz hier eher mägerlich ist:

ich habe die IC2-Busgeschwindigkeit des Masters jetzt auf 9600 Baud eingestellt.
Damit habe ich keine I/O-Fehler und keine Abbrüche mehr.

Mal schauen, wie weit ich mit der geringen Rate komme. Zum Auslesen der RP6-Sensoren reicht es auf jeden Fall.

Gruß
Jo