PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : RP6v2 als I2C Slave mit Raspi als Master (Python): IOError



redapple
23.08.2014, 17:55
Hallo Roboternetz-Forum,
ich bin noch blutiger Anfänger, was Robotik und Elektronik betrifft, aber durchaus lernfähig :).

Folgendes Problem:
Ich habe den RP6v2 über I2C mit Pegelwandler (meine erste Löterfahrung, daher kanns auch daran liegen) mit dem Raspberry Pi Rev. 2 verbunden.

Der RP6 wird über den Bus als Slave vom Raspi Master mit einem Python-Script angesprochen, das auf dem RP6 ein kleines LED-Lauflicht erzeugt:



#!/usr/bin/python
# -*- coding: utf-8 -*-

import smbus
import time

# bus = smbus.SMBus(0) # Pi Rev. 1
bus = smbus.SMBus(1) # Pi Rev. 2

DEVICE = 0x05 # I2C Address of RP6

# Commands
SET_LEDS = 0x03 # I2C Command to set leds

leds = 0b00000001 # LED Status

c = 0

while(True):
time.sleep(0.5)
# write SET_LEDS Command to RP6
try:
# List of max 32 integers !!!
# myData[0] -> Command "SET_LEDS" (0x03)
# myData[1] -> Parameter 1: LED Bits
myData = [SET_LEDS, leds]

bus.write_i2c_block_data(DEVICE, 0x00, myData)
leds <<= 1
if (leds > 32):
leds = 1
except IOError:
print 'There was an IOError in loop ', c

c += 1
if (c % 100 == 0):
print 'Loop: ',c



Auf dem RP6 selbst läuft das "RP6Base_I2CSlave" Example Programm.

Das Problem:
Hin und wieder kommt es zu einem IOError.
Das Problem ist, diese Fehler führen auf dem RP6 meißt zu unvorhersehbarem Verhalten. Der Roboter startete bei mir beispielsweise manchmal die Motoren bei obigem Script und wär' mir beim ersten mal fast vom Tisch gefallen.

Ich denke, dass man beim I2C Bus immer mit IO Fehlern rechnen muss. Die Frage wäre, wie man das unberechenbare Verhalten des Roboters in den Griff bekommt.

Bin für alle Ideen dankbar.

Best wishes,
Daniel

radbruch
23.08.2014, 19:16
Hallo

Mit welcher Geschwindigkeit initialisiert dein Raspi den I2C-Bus?


Die Frage wäre, wie man das unberechenbare Verhalten des Roboters in den Griff bekommt.Lass den RP6 das Kommando zurückschicken. Wenn der Raspi das Echo geprüft und für richtig befunden hat sendet er ein Start-Kommando zum RP6.

Gruß

mic

Dirk
23.08.2014, 19:41
Hi,

du kannst versuchen, den Watchdog des Slaves auszuschalten (obwohl das wegen eines Bugs im Slave eher unnötig ist)

redapple
23.08.2014, 19:53
Hallo radbruch,
ich hab die baudrate schon von 100kbit auf 32kbit runtergesetzt. Ist zwar etwas besser, aber IOErrors tauchen immer noch auf.

Hab mir überlegt, vielleicht ginge das auch mit einer Checksumme, dann braucht man nicht das ganze Kommando zurückschicken...

Liebe Grüße,
Daniel

**EDIT**
Ist wohl ein I2C Clock Stretching Problem des Raspberry Pi:
http://www.advamation.de/technik/raspberrypi/rpi-i2c-bug.html

Dirk
24.08.2014, 04:21
Nochmal zur Erklärung:

Das Original I2C-Slave Programm ist nicht so ausgelegt, dass man einfach I2C-Befehle nacheinander senden kann.
Stattdessen muss man z.B. auch auf Watchdog-Requests reagieren.

Bei einem geeigneten Master kommt es nicht zu "falschen" Reaktionen des Slaves.

M.E. kann man das auch in deinem Fall NICHT auf die Geschwindigkeit des I2C-Busses zurückführen:
Die Slave-Master-Kombinationen funktionieren z.B. mit der M32 als Master und einem passenden Programm mit 100kHz ohne wesentliche Übertragungsfehler.

redapple
24.08.2014, 16:36
Hallo Dirk,
ich wollte nicht behaupten, dass der Slave fehlerhaft programmiert ist. Um ehrlich zu sein muss ich zugeben, dass ich das auch nicht wirklich beurteilen kann.

Mir war auch nicht klar, dass ich auf dem Master z.B. auf Watchdog-Requests reagieren muss und vor allem, wie ich das realisiere.

Ich muss mir halt noch etwas mehr Dokumentation zusammensuchen und durchackern. Bin halt Anfänger.

Best wishes,
Daniel