Go Down

Topic: Wire - Erkärung bitte (Read 2647 times) previous topic - next topic

lord-maricek

Moin,

ich habe in letzter Zeit viel über wireing gelesen. Nun möchte ich, dass 3 Arduino Duemilanove miteinander kommunizieren können. Es soll einen Master geben, der erstmal nur Daten empfängt und speichert. (Später kommt noch ein LCD, auf dem die Daten ausgegeben werden). Ich habe aber vorher noch ein paar fragen:
1. Die Kabel zwischen, den Aduinos werden ca. 70cm lang sein. Geht das überhaupt noch und wie dick müssen die kabel sein?
2. Welche baudrate ist sinnvoll, für eine schnelle Verbindung?
3. Ich habe das mit dem Senden und Empfangen der Bytes noch nicht so verstanden. Die beiden Slaves, werden mehrere Sensoren auswerten, und die Werte werden in Integers gespeichert. Für dieÜbertragung, wollte ich alle Ints in ein Char[] speichern.
Wie wandel ich die am besten um?
4. Wenn ein Sonsor, einen Wert von bsw. 1-20 zurück gegibt, wie kann ich dann in das char[] vor die z.B. 5 eine null setzten?
Also:
Code: [Select]

int sensor1 = 5;    //Werte bereich ist aber 1-20
int sensor2 = 18;  //Were bereich von 1-20
                          //Dann in das Array speichern
char sensoren[] = {0,5,1,8};   //Hier auf die null vor der 5 achten


5. Die beiden Slaves senden immer die Daten, wie kann ich die dann ambesten wieder in Ints verwandeln?
Also:
Code: [Select]

                   //Empfangen
char empfangen[] = {0,5,1,8};
char sensor1_array[] = {empfangen[0],empfangen[1]};
char sensor2_array[] = {empfangen[3],empfangen[4]};
                 // Dann das ganze wider in Integers


6.Wie mach ich das ambesten mit dem Empfangen der Daten, auf dem Master, dass er dann auch erkennt, von welchem Slave die Daten gekommen sind?
7.Wie mach ich das mit dem Empfangen, welche Schleifen benutzte ich denn am besten? Bzw. Bei welcher baudrate, ist es sinnvoll welche Schleifen zubenutzten?
8.Man muss doch dann die Bytes auch noch irgentwie wieder in die Zahlen verwandeln, wie sie waren.
Also: das Array 0,5,1,8 kommt ja nicht in der Form an.

Ich hoffe ihr könnt mir helfen.

Philipp

lord-maricek

da bisher niemand geantwortet hatte. Kann mir vielleicht mal jemand ein Beispielprogramm geben, mit dem ich Datenübertragen kann, weil ich irgentwie noch meine Probleme habe.

Philipp


lord-maricek

Ok danke erstmal für die Antworten.
Ich habe jetzt mal was Programmiert, aber es geht nicht. Vielleicht könnt ihr mir helfen?
Der Master soll an dem Slave eine 1 schicken, daraufhin soll der Slave ein Char Array zurück schicken, dass der Master dann über Seriall ausgibt.
Maseter:
Code: [Select]
#include <Wire.h>

char inByte[32];
boolean wait = true;
int wait_time = 5000;

void setup(){
 Wire.begin();
 Serial.begin(9600);
 Serial.println("Ready...");
 Wire.onReceive(receiveEvent);
}



void loop(){
 while(wait){
   delay(wait_time);//Da ist mir grade  nichts besseres eingefallen
   wait = false;
   Wire.beginTransmission(4);
   Wire.send(1);
   Wire.endTransmission();
 }
}

void receiveEvent(int howMany){
 int i=0;
 while(Wire.available()>0){
   inByte[i] = Wire.receive();
   inByte[i+1] = '\0';
   i++;
 }
 Serial.println(inByte);
 wait = true;
}

Slave:
Code: [Select]
#include <Wire.h>

int x;
char send_data[] = {'H','e','l','l','o','!'};

void setup(){
 Wire.begin();
 Wire.onReceive(receiveEvent);
}

void loop(){
}

void receiveEvent(int howmany){
 x = Wire.receive();
 if(x==1){
   Wire.send(send_data);
 }
}


Liegt es vielleicht an der while schleife? Aber normalerweise müsste das Programm doch automitisch in das onReceiveEvent springen.#

Philipp

lord-maricek

habe dem slave eine 4 eigebaut. hatte ich vergessen und für die zeit millis eingesetzt.
geht abr leider immer noch nicht
Code: [Select]
#include <Wire.h>

char inByte[32];
int wait_time = 5000;
int time;

void setup(){
 Wire.begin();
 Serial.begin(9600);
 Serial.println("Ready...");
 Wire.onReceive(receiveEvent);
}



void loop(){
 time = time + millis();
 if(millis() >= (time + 5000)){
   Wire.beginTransmission(4);
   Wire.send(1);
   Wire.endTransmission();
 }
}

void receiveEvent(int howMany){
 int i=0;
 while(Wire.available()>0){
   inByte[i] = Wire.receive();
   inByte[i+1] = '\0';
   i++;
 }
 Serial.println(inByte);
}


philipp

volvodani

In deinem Slave fehlt bei
Wire.begin(1) die 1 zwischen den Klammern damit du den Arduino als Sklave mit der Adresse ein deklarierst hast du keine 1 drin ist das auch ein master und es geht nur ein Master am Bus.
Auszug aus dem playground

Quote
Wire.begin() initializes the Wire library as an I2C master and reconfigures analog pins 4 and 5 as I2C pins. Wire.begin(address) initializes the Wire library with the Arduino functioning as a slave at address address.

"Komm wir essen Opa!" - Satzzeichen retten Leben!

lord-maricek

danke für die Antwort, aber ich habe in meinem letzten Post schon geschrieben, dass ich den Slave auf 4 gesetzt habe.

Go Up