Pages: [1]   Go Down
Author Topic: I2C mit Raspberry Pi als Master  (Read 1330 times)
0 Members and 1 Guest are viewing this topic.
Offline Offline
Newbie
*
Karma: 0
Posts: 5
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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:
#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;
}

« Last Edit: January 24, 2013, 03:20:28 pm by fuesschen » Logged

Forum Moderator
BZ (I)
Offline Offline
Brattain Member
*****
Karma: 236
Posts: 20298
+39 349 2158303
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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

Offline Offline
Newbie
*
Karma: 0
Posts: 5
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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.
« Last Edit: January 24, 2013, 03:13:50 pm by fuesschen » Logged

Hamburg, Germany
Offline Offline
Sr. Member
****
Karma: 5
Posts: 291
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Wie sieht denn der Python Code aus?
Logged


Offline Offline
Newbie
*
Karma: 0
Posts: 5
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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:
#!/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()

Logged

Offline Offline
Newbie
*
Karma: 0
Posts: 5
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Also fällt niemandem etwas auf?
Logged

Offline Offline
Newbie
*
Karma: 0
Posts: 5
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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

Pages: [1]   Go Up
Jump to: