Go Down

Topic: I2C mit Raspberry Pi als Master (Read 1 time) previous topic - next topic

Jan 24, 2013, 08:32 pm Last Edit: Jan 24, 2013, 09:20 pm by fuesschen Reason: 1
Hallo Gemeinde.
Mit Arduino beschäftige ich mich erst seit sehr kurzer Zeit und habe jetzt beschlossen eine einfache Tastereingabe baue, welche die Tastendrücke per I2C an mein Raspberry Pi übertragen soll um dort per Python Script einen MPD zu steuern. Jetzt habe ich das Problem, dass mit der I2C Slave per "i2cdetect" angezeigt wird, sobald ich jedoch versuche davon zu lesen oder darauf zu schreiben stellt der Atmega seinen dienst ein. Es wäre ziemlich Toll, wenn sich jemand meinen Code anschauen könnte.
Code: [Select]

#include <Wire.h>
#define SLAVE_ADDRESS 0x2A //0x2A = 42

int playPausePin = 12;
int previousPin = 11;
int nextPin =  10;
int softerPin = 9;
int louderPin = 8;

int outputPin = 7;


byte registerMap[] = {00000000};


void setup()
{
pinMode(playPausePin, INPUT);
digitalWrite(playPausePin, HIGH); //activates the internal pullup resistors
pinMode(previousPin, INPUT);
digitalWrite(previousPin, HIGH);
pinMode(nextPin, INPUT);
digitalWrite(nextPin, HIGH);
pinMode(softerPin, INPUT);
digitalWrite(softerPin, HIGH);
pinMode(louderPin, INPUT);
digitalWrite(louderPin, HIGH);

pinMode(outputPin, OUTPUT);
       digitalWrite(outputPin, LOW);

       // initialize i2c as slave
       Wire.begin(SLAVE_ADDRESS);
 
       // define callbacks for i2c communication
       Wire.onReceive(receiveData);
       Wire.onRequest(sendData);

Serial.begin(9600);
}

void loop()
{
       if(digitalRead(playPausePin) == LOW ) {
registerMap[0] =  registerMap[0] | 1;//00000001;
               delay(10);
}
       if (digitalRead(previousPin) == LOW) {
registerMap[0] = registerMap[0] | 2;//00000010;
               delay(10);
}
       if(digitalRead(nextPin) == LOW) {
registerMap[0] = registerMap[0] | 4;//00000100;
               delay(10);
}
       if(digitalRead(softerPin) == LOW ) {
registerMap[0] = registerMap[0] | 8;//00001000;
               delay(10);
}
       if(digitalRead(louderPin) == LOW) {
registerMap[0] = registerMap[0] | 16;//00010000;
               delay(10);
}
Serial.println(registerMap[0]);
}

// callback for received data
void receiveData(int byteCount)
{
 byte temp = Wire.read();
 delay(10);
 Serial.println(temp);
 if(temp == 00000001) {
   digitalWrite(outputPin, HIGH);
   } else {
     digitalWrite(outputPin, LOW);
     }
}

// callback for sending data
void sendData()
{
Wire.write(registerMap,1);
       Serial.print("Sending Data: ");
       Serial.println(registerMap[0]);
registerMap[0] = 00000000;
}


uwefed

Hast Du einen Pegelwandler dazwischengeschaltet? Hast Du die Masse von Arduino und Raspberry PI verbunden?
Grüße Uwe

#2
Jan 24, 2013, 09:07 pm Last Edit: Jan 24, 2013, 09:13 pm by fuesschen Reason: 1
Einen Pegelwandler hab ich dazwischen geschaltet und beide Geräte sind am selben USB Hub angeschlossen von daher ging ich aus, es sei nicht notwendig die Masse zu verbinden aber werde es mal Testen

Edit: Massen verbunden, ändert nichts am Fehler.

markbee

Wie sieht denn der Python Code aus?
XBee blog: http://lookmanowire.blogspot.com/

Der Python Code sieht aktuell noch Testweise so aus, allerdings führe ich den noch garnicht aus sondern versuche per i2cget und i2cset auf den Arduino zuzugreifen.
Code: [Select]

#!/usr/bin/env python3
import sys
import time
import os
from mpd import (MPDClient, CommandError)
import smbus

#MPD SETTINGS
HOST = 'localhost'
PORT = '6600'
PASSWORD = False

#I2C SLAVE SETTINGS
ADDRESS = 0x2A

client = MPDClient()

try:
    client.connect(host=HOST, port=PORT)
except SocketError:
    exit(1)


b = smbus.SMBus(0)
while True:
if((str(client.status()).find("pause") >-1) | (str(client.status()).find("stop") > -1)):
b.write_byte(ADDRESS,0)
else:
b.write_byte(ADDRESS,1)
read_result =int(b.read_byte(ADDRESS))
print( read_result)
play_pause = read_result & 1
previous = read_result & 2
next = read_result & 4
softer = read_result & 8
louder = read_result & 16
print("play_pause" ,play_pause)
if (play_pause == 1):
client.pause()
print("pause")
time.sleep(0.1)
if (previous == 2):
client.previous()
time.sleep(0.1)
if (next == 4):
client.next()
time.sleep(0.1)
if (softer == 8):
os.popen("mpc volume -5")
time.sleep(0.1)
if (louder == 16):
print("louder")
os.popen("mpc volume +5")
time.sleep(0.1)
time.sleep(0.5)

client.disconnect()



Das Problem tritt ebenfalls auf, wenn ich einen Arduino als I2C Master damit verbinde und versuche den Slave anzusteuern.

Go Up