Jo Roboterix
02.06.2016, 10: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
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